diff --git a/.gitignore b/.gitignore
index ed086d9..8719095 100644
--- a/.gitignore
+++ b/.gitignore
@@ -67,6 +67,8 @@
 /examples/**/pubspec.lock
 /mojo/common/dart/packages
 /mojo/dart/apptest/packages
+/mojo/dart/http_load_test/bin/packages
+/mojo/dart/http_load_test/packages/
 /mojo/dart/mojo_services/packages
 /mojo/dart/mojo_services/pubspec.lock
 /mojo/dart/mojom/bin/packages
diff --git a/DEPS b/DEPS
index b7e418a..c67163d 100644
--- a/DEPS
+++ b/DEPS
@@ -19,7 +19,7 @@
 
 vars = {
   'chromium_git': 'https://chromium.googlesource.com',
-  'mojo_sdk_revision': '9a5f81a3d2a6d027677366edb5de3ae85f6dbf16',
+  'mojo_sdk_revision': '76ff57433b48527dc491dac4c52c9d71a7c3a0e3',
   'skia_revision': '29ccdf86ab0a1649fd775c9431891bacb1391e99',
   'dart_revision': '95c951ad190f156eb61b99203c2e4948211c44a7',
   'dart_observatory_packages_revision': 'cdc4b3d4c15b9c0c8e7702dff127b440afbb7485',
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index 9887d8f..6c1f622 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -32,6 +32,17 @@
 
 """
 
+_MOJO_EXPOSED_EXTENSIONS = ["CHROMIUM_bind_uniform_location",
+                            "CHROMIUM_map_sub",
+                            "CHROMIUM_miscellaneous",
+                            "CHROMIUM_resize",
+                            "CHROMIUM_sync_point",
+                            "CHROMIUM_texture_mailbox",
+                            "EXT_debug_marker",
+                            "OES_vertex_array_object",
+                            "occlusion_query_EXT"]
+
+
 # This string is copied directly out of the gl2.h file from GLES2.0
 #
 # Edits:
@@ -2803,14 +2814,14 @@
   },
   'MapBufferSubDataCHROMIUM': {
     'gen_cmd': False,
-    'extension': True,
+    'extension': "CHROMIUM_map_sub",
     'chromium': True,
     'client_test': False,
     'pepper_interface': 'ChromiumMapSub',
   },
   'MapTexSubImage2DCHROMIUM': {
     'gen_cmd': False,
-    'extension': "CHROMIUM_sub_image",
+    'extension': "CHROMIUM_map_sub",
     'chromium': True,
     'client_test': False,
     'pepper_interface': 'ChromiumMapSub',
@@ -3205,7 +3216,7 @@
   },
   'UnmapBufferSubDataCHROMIUM': {
     'gen_cmd': False,
-    'extension': True,
+    'extension': "CHROMIUM_map_sub",
     'chromium': True,
     'client_test': False,
     'pepper_interface': 'ChromiumMapSub',
@@ -3216,7 +3227,7 @@
   },
   'UnmapTexSubImage2DCHROMIUM': {
     'gen_cmd': False,
-    'extension': "CHROMIUM_sub_image",
+    'extension': "CHROMIUM_map_sub",
     'chromium': True,
     'client_test': False,
     'pepper_interface': 'ChromiumMapSub',
@@ -3454,7 +3465,7 @@
   },
   'BindUniformLocationCHROMIUM': {
     'type': 'GLchar',
-    'extension': True,
+    'extension': "CHROMIUM_bind_uniform_location",
     'data_transfer_methods': ['bucket'],
     'needs_size': True,
     'gl_test_func': 'DoBindUniformLocationCHROMIUM',
@@ -4350,25 +4361,15 @@
     file.Write("%s MojoGLES2Impl::%s(%s) {\n" %
                (func.return_type, func.original_name,
                 func.MakeTypedOriginalArgString("")))
-    # TODO(alhaad): Add Mojo C thunk for each of the following methods and
-    # remove this.
-    func_list = ["GenQueriesEXT", "BeginQueryEXT", "MapTexSubImage2DCHROMIUM",
-                 "UnmapTexSubImage2DCHROMIUM", "DeleteQueriesEXT",
-                 "EndQueryEXT", "GetQueryObjectuivEXT", "ShallowFlushCHROMIUM"]
-    if func.original_name in func_list:
-      file.Write("return static_cast<gpu::gles2::GLES2Interface*>"
-                 "(MojoGLES2GetGLES2Interface(context_))->" +
-                 func.original_name + "(" + func.MakeOriginalArgString("") +
-                 ");")
-      file.Write("}")
-      return
 
-    extensions = ["CHROMIUM_sync_point", "CHROMIUM_texture_mailbox"]
-    if func.IsCoreGLFunction() or func.GetInfo("extension") in extensions:
+    is_mojo_extension = func.GetInfo("extension") in _MOJO_EXPOSED_EXTENSIONS
+    if func.IsCoreGLFunction() or is_mojo_extension:
       file.Write("MojoGLES2MakeCurrent(context_);");
       func_return = "gl" + func.original_name + "(" + \
           func.MakeOriginalArgString("") + ");"
-      if func.return_type == "void":
+      if func.original_name == "ResizeCHROMIUM":
+          file.Write("MGLResizeSurface(width, height);");
+      elif func.return_type == "void":
         file.Write(func_return);
       else:
         file.Write("return " + func_return);
@@ -10186,9 +10187,16 @@
 #include "mojo/gpu/mojo_gles2_impl_autogen.h"
 
 #include "base/logging.h"
+#include "mojo/public/c/gles2/chromium_bind_uniform_location.h"
+#include "mojo/public/c/gles2/chromium_map_sub.h"
+#include "mojo/public/c/gles2/chromium_miscellaneous.h"
 #include "mojo/public/c/gles2/chromium_sync_point.h"
 #include "mojo/public/c/gles2/chromium_texture_mailbox.h"
+#include "mojo/public/c/gles2/ext_debug_marker.h"
 #include "mojo/public/c/gles2/gles2.h"
+#include "mojo/public/c/gles2/occlusion_query_ext.h"
+#include "mojo/public/c/gles2/oes_vertex_array_object.h"
+#include "mojo/public/c/gpu/MGL/mgl_onscreen.h"
 
 namespace mojo {
 
@@ -10585,10 +10593,6 @@
     "gpu/command_buffer/common/gles2_cmd_format_test_autogen.h")
   gen.WriteGLES2InterfaceHeader(
     "gpu/command_buffer/client/gles2_interface_autogen.h")
-  gen.WriteMojoGLES2ImplHeader(
-    "mojo/gpu/mojo_gles2_impl_autogen.h")
-  gen.WriteMojoGLES2Impl(
-    "mojo/gpu/mojo_gles2_impl_autogen.cc")
   gen.WriteGLES2InterfaceStub(
     "gpu/command_buffer/client/gles2_interface_stub_autogen.h")
   gen.WriteGLES2InterfaceStubImpl(
@@ -10632,16 +10636,18 @@
   gen.WriteCommonUtilsImpl(
     "gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h")
   gen.WriteGLES2Header("gpu/GLES2/gl2chromium_autogen.h")
+
   mojo_gles2_prefix = ("mojo/public/c/gles2/gles2_call_visitor")
   gen.WriteMojoGLCallVisitor(mojo_gles2_prefix + "_autogen.h")
-  mojo_extensions = ["CHROMIUM_texture_mailbox", "CHROMIUM_sync_point",
-                     "CHROMIUM_sub_image", "CHROMIUM_miscellaneous",
-                     "CHROMIUM_resize", "EXT_debug_marker",
-                     "OES_vertex_array_object", "occlusion_query_EXT"]
-  for extension in mojo_extensions:
+  for extension in _MOJO_EXPOSED_EXTENSIONS:
     gen.WriteMojoGLCallVisitorForExtension(
         mojo_gles2_prefix + "_" + extension.lower() + "_autogen.h", extension)
 
+  gen.WriteMojoGLES2ImplHeader(
+    "mojo/gpu/mojo_gles2_impl_autogen.h")
+  gen.WriteMojoGLES2Impl(
+    "mojo/gpu/mojo_gles2_impl_autogen.cc")
+
   Format(gen.generated_cpp_filenames)
 
   if gen.errors > 0:
diff --git a/gpu/command_buffer/service/gl_surface_mock.h b/gpu/command_buffer/service/gl_surface_mock.h
index 0652be6..97c8a09 100644
--- a/gpu/command_buffer/service/gl_surface_mock.h
+++ b/gpu/command_buffer/service/gl_surface_mock.h
@@ -5,8 +5,9 @@
 #ifndef GPU_COMMAND_BUFFER_SERVICE_GL_SURFACE_MOCK_H_
 #define GPU_COMMAND_BUFFER_SERVICE_GL_SURFACE_MOCK_H_
 
-#include "ui/gl/gl_surface.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "ui/gfx/swap_result.h"
+#include "ui/gl/gl_surface.h"
 
 namespace gpu {
 
@@ -18,8 +19,8 @@
   MOCK_METHOD0(Destroy, void());
   MOCK_METHOD1(Resize, bool(const gfx::Size& size));
   MOCK_METHOD0(IsOffscreen, bool());
-  MOCK_METHOD0(SwapBuffers, bool());
-  MOCK_METHOD4(PostSubBuffer, bool(int x, int y, int width, int height));
+  MOCK_METHOD0(SwapBuffers, gfx::SwapResult());
+  MOCK_METHOD4(PostSubBuffer, gfx::SwapResult(int x, int y, int width, int height));
   MOCK_METHOD0(SupportsPostSubBuffer, bool());
   MOCK_METHOD0(GetSize, gfx::Size());
   MOCK_METHOD0(GetHandle, void*());
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index f782d52..61ad037 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -8222,7 +8222,8 @@
     gpu_state_tracer_->TakeSnapshotWithCurrentFramebuffer(
         is_offscreen ? offscreen_size_ : surface_->GetSize());
   }
-  if (surface_->PostSubBuffer(c.x, c.y, c.width, c.height)) {
+  if (surface_->PostSubBuffer(c.x, c.y, c.width, c.height) !=
+      gfx::SwapResult::SWAP_FAILED) {
     return error::kNoError;
   } else {
     LOG(ERROR) << "Context lost because PostSubBuffer failed.";
@@ -10347,7 +10348,7 @@
         glFlush();
     }
   } else {
-    if (!surface_->SwapBuffers()) {
+    if (surface_->SwapBuffers() == gfx::SwapResult::SWAP_FAILED) {
       LOG(ERROR) << "Context lost because SwapBuffers failed.";
       if (!CheckResetStatus()) {
         MarkContextLost(error::kUnknown);
diff --git a/mojo/BUILD.gn b/mojo/BUILD.gn
deleted file mode 100644
index 7f55975..0000000
--- a/mojo/BUILD.gn
+++ /dev/null
@@ -1,111 +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.
-
-import("//build/config/ui.gni")
-import("//build/module_args/mojo.gni")
-import("//mojo/public/mojo.gni")
-
-# TODO(beng): this meta target should probably move to the root dir's BUILD.gn.
-group("mojo") {
-  # Meta-target, don't link into production code.
-  testonly = true
-  declare_args() {
-    mojo_use_go = false
-
-    # TODO(ncbray): support ASAN once NaCl's GN build is unforked.
-    mojo_use_nacl = is_linux && !is_asan
-  }
-  deps = [
-    ":tests",
-    "//benchmarks",
-    "//examples",
-    "//mojo/common",
-    "//mojo/dart/apptest",
-    "//mojo/dart/apptest:apptest_pkg",
-    "//mojo/dart/mojom",
-    "//mojo/dart/mojo_services",
-    "//mojo/dart/observatory_test",
-    "//mojo/public",
-    "//mojo/services",
-    "//services",
-  ]
-
-  if (is_android) {
-    deps += [
-      "//mojo/android",
-      "//mojo/java",
-      "//mojo/tools/android_shortcuts",
-      "//mojo/tools:remote_file_reader",
-    ]
-  }
-
-  if (is_linux && mojo_use_go) {
-    deps += [ "//mojo/go" ]
-  }
-
-  if (is_linux) {
-    deps += [ "//mojo/python" ]
-  }
-
-  if (mojo_use_nacl) {
-    deps += [
-      "//mojo/nacl:mojo_nacl",
-      "//mojo/nacl:mojo_nacl_tests",
-    ]
-  }
-}
-
-group("tests") {
-  testonly = true
-  deps = [
-    "//mojo/common:mojo_common_unittests",
-    "//mojo/converters/surfaces/tests:mojo_surfaces_lib_unittests",
-    "//mojo/edk/system:tests",
-    "//mojo/edk/test:public_tests",
-    "//mojo/dart/embedder/test:dart_unittests",
-    "//mojo/public/cpp/bindings/tests:versioning_apptests",
-    "//mojo/services/view_manager/public/cpp/tests:mojo_view_manager_lib_unittests",
-    "//mojo/tests:mojo_task_tracker_perftests",
-    "//mojo/tools:message_generator",
-    "//services/asset_bundle:apptests",
-    "//services/clipboard:apptests",
-    "//services/dart/dart_apptests",
-    "//services/files:apptests",
-    "//mojo/gpu:apptests",
-    "//mojo/services/files/public/c:apptests",
-    "//services/authenticating_url_loader_interceptor:apptests",
-    "//services/http_server:apptests",
-    "//services/prediction:apptests",
-    "//services/reaper:tests",
-    "//services/url_response_disk_cache:tests",
-    "//services/view_manager:mojo_view_manager_client_apptests",
-    "//services/view_manager:view_manager_service_apptests",
-    "//services/view_manager:view_manager_service_unittests",
-    "//services/window_manager:window_manager_apptests",
-    "//services/window_manager:window_manager_unittests",
-    "//shell:apptests",
-  ]
-
-  if (is_linux) {
-    deps += [ "//services/python:python_apptests" ]
-  }
-
-  if (is_android) {
-    deps += [ "//services/notifications:apptests" ]
-  }
-
-  # TODO(jamesr): We only support building V8 snapshot data on a linux host since it
-  # needs a 32 bit toolchain and we don't have one configured for mac hosts.
-  if (host_os == "linux") {
-    deps += [
-      "//mojo/edk/js:tests",
-      "//services/js:js_apptests",
-      "//services/js:js_services_unittests",
-    ]
-  }
-
-  if (mojo_use_prebuilt_network_service) {
-    deps += [ "//mojo/public/tools:copy_network_service_apptests" ]
-  }
-}
diff --git a/mojo/OWNERS b/mojo/OWNERS
deleted file mode 100644
index b864087..0000000
--- a/mojo/OWNERS
+++ /dev/null
@@ -1,11 +0,0 @@
-aa@chromium.org
-abarth@chromium.org
-ben@chromium.org
-darin@chromium.org
-davemoore@chromium.org
-jamesr@chromium.org
-mpcomplete@chromium.org
-qsr@chromium.org
-sky@chromium.org
-viettrungluu@chromium.org
-yzshen@chromium.org
diff --git a/mojo/PRESUBMIT.py b/mojo/PRESUBMIT.py
deleted file mode 100644
index 444a372..0000000
--- a/mojo/PRESUBMIT.py
+++ /dev/null
@@ -1,288 +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.
-
-"""Presubmit script for mojo
-
-See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
-for more details about the presubmit API built into depot_tools.
-"""
-
-import os.path
-import re
-
-# NOTE: The EDK allows all external paths, so doesn't need a whitelist.
-_PACKAGE_WHITELISTED_EXTERNAL_PATHS = {
-    "SDK": ["//build/module_args/mojo.gni",
-            "//build/module_args/dart.gni",
-            "//testing/gtest",
-            "//third_party/cython",
-            "//third_party/khronos"],
-    "services": ["//build/module_args/mojo.gni",
-                 "//testing/gtest"],
-}
-
-# These files are not part of the exported package.
-_PACKAGE_IGNORED_BUILD_FILES = {
-    "SDK": {},
-    "EDK": {},
-    "services": {"mojo/services/BUILD.gn"},
-}
-
-
-_PACKAGE_PATH_PREFIXES = {"SDK": "mojo/public/",
-                          "EDK": "mojo/edk/",
-                          "services": "mojo/services"}
-
-# TODO(etiennej): python_binary_source_set added due to crbug.com/443147
-_PACKAGE_SOURCE_SET_TYPES = {"SDK": ["mojo_sdk_source_set",
-                                     "python_binary_source_set"],
-                             "EDK": ["mojo_edk_source_set"],
-                             "services": ["mojo_sdk_source_set"]}
-
-_ILLEGAL_EXTERNAL_PATH_WARNING_MESSAGE = \
-    "Found disallowed external paths within SDK buildfiles."
-
-_ILLEGAL_SERVICES_ABSOLUTE_PATH_WARNING_MESSAGE = \
-    "Found references to services' public buildfiles via absolute paths " \
-    "within services' public buildfiles."
-
-_ILLEGAL_EDK_ABSOLUTE_PATH_WARNING_MESSAGE = \
-    "Found references to the EDK via absolute paths within EDK buildfiles."
-
-_ILLEGAL_SDK_ABSOLUTE_PATH_WARNING_MESSAGE_TEMPLATE = \
-    "Found references to the SDK via absolute paths within %s buildfiles."
-
-_ILLEGAL_SDK_ABSOLUTE_PATH_WARNING_MESSAGES = {
-  "SDK": _ILLEGAL_SDK_ABSOLUTE_PATH_WARNING_MESSAGE_TEMPLATE % "SDK",
-  "EDK": _ILLEGAL_SDK_ABSOLUTE_PATH_WARNING_MESSAGE_TEMPLATE % "EDK",
-  "services": _ILLEGAL_SDK_ABSOLUTE_PATH_WARNING_MESSAGE_TEMPLATE
-      % "services' public",
-}
-
-_INCORRECT_SOURCE_SET_TYPE_WARNING_MESSAGE_TEMPLATE = \
-    "All source sets in %s must be constructed via %s."
-
-_INCORRECT_SOURCE_SET_TYPE_WARNING_MESSAGES = {
-  "SDK": _INCORRECT_SOURCE_SET_TYPE_WARNING_MESSAGE_TEMPLATE
-      % ("the SDK", _PACKAGE_SOURCE_SET_TYPES["SDK"]),
-  "EDK": _INCORRECT_SOURCE_SET_TYPE_WARNING_MESSAGE_TEMPLATE
-      % ("the EDK", _PACKAGE_SOURCE_SET_TYPES["EDK"]),
-  "services": _INCORRECT_SOURCE_SET_TYPE_WARNING_MESSAGE_TEMPLATE
-      % ("services' client libs", _PACKAGE_SOURCE_SET_TYPES["services"]),
-}
-
-def _IsBuildFileWithinPackage(f, package):
-  """Returns whether |f| specifies a GN build file within |package|."""
-  assert package in _PACKAGE_PATH_PREFIXES
-  package_path_prefix = _PACKAGE_PATH_PREFIXES[package]
-
-  if not f.LocalPath().startswith(package_path_prefix):
-    return False
-  if (not f.LocalPath().endswith("/BUILD.gn") and
-      not f.LocalPath().endswith(".gni")):
-    return False
-  if f.LocalPath() in _PACKAGE_IGNORED_BUILD_FILES[package]:
-    return False
-  return True
-
-def _AffectedBuildFilesWithinPackage(input_api, package):
-  """Returns all the affected build files within |package|."""
-  return [f for f in input_api.AffectedFiles()
-      if _IsBuildFileWithinPackage(f, package)]
-
-def _FindIllegalAbsolutePathsInBuildFiles(input_api, package):
-  """Finds illegal absolute paths within the build files in
-  |input_api.AffectedFiles()| that are within |package|.
-  An illegal absolute path within the SDK or a service's SDK is one that is to
-  the SDK itself or a non-whitelisted external path. An illegal absolute path
-  within the EDK is one that is to the SDK or the EDK.
-  Returns any such references in a list of (file_path, line_number,
-  referenced_path) tuples."""
-  illegal_references = []
-  for f in _AffectedBuildFilesWithinPackage(input_api, package):
-    for line_num, line in f.ChangedContents():
-      # Determine if this is a reference to an absolute path.
-      m = re.search(r'"(//[^"]*)"', line)
-      if not m:
-        continue
-      referenced_path = m.group(1)
-
-      if not referenced_path.startswith("//mojo"):
-        # In the EDK, all external absolute paths are allowed.
-        if package == "EDK":
-          continue
-
-        # Determine if this is a whitelisted external path.
-        if referenced_path in _PACKAGE_WHITELISTED_EXTERNAL_PATHS[package]:
-          continue
-
-      illegal_references.append((f.LocalPath(), line_num, referenced_path))
-
-  return illegal_references
-
-def _PathReferenceInBuildFileWarningItem(build_file, line_num, referenced_path):
-  """Returns a string expressing a warning item that |referenced_path| is
-  referenced at |line_num| in |build_file|."""
-  return "%s, line %d (%s)" % (build_file, line_num, referenced_path)
-
-def _IncorrectSourceSetTypeWarningItem(build_file, line_num):
-  """Returns a string expressing that the error occurs at |line_num| in
-  |build_file|."""
-  return "%s, line %d" % (build_file, line_num)
-
-def _CheckNoIllegalAbsolutePathsInBuildFiles(input_api, output_api, package):
-  """Makes sure that the BUILD.gn files within |package| do not reference the
-  SDK/EDK via absolute paths, and do not reference disallowed external
-  dependencies."""
-  sdk_references = []
-  edk_references = []
-  external_deps_references = []
-  services_references = []
-
-  # Categorize any illegal references.
-  illegal_references = _FindIllegalAbsolutePathsInBuildFiles(input_api, package)
-  for build_file, line_num, referenced_path in illegal_references:
-    reference_string = _PathReferenceInBuildFileWarningItem(build_file,
-                                                            line_num,
-                                                            referenced_path)
-    if referenced_path.startswith("//mojo/public"):
-      sdk_references.append(reference_string)
-    elif package == "SDK":
-      external_deps_references.append(reference_string)
-    elif package == "services":
-      if referenced_path.startswith("//mojo/services"):
-        services_references.append(reference_string)
-      else:
-        external_deps_references.append(reference_string)
-    elif referenced_path.startswith("//mojo/edk"):
-      edk_references.append(reference_string)
-
-  # Package up categorized illegal references into results.
-  results = []
-  if sdk_references:
-    results.extend([output_api.PresubmitError(
-        _ILLEGAL_SDK_ABSOLUTE_PATH_WARNING_MESSAGES[package],
-        items=sdk_references)])
-
-  if external_deps_references:
-    assert package == "SDK" or package == "services"
-    results.extend([output_api.PresubmitError(
-        _ILLEGAL_EXTERNAL_PATH_WARNING_MESSAGE,
-        items=external_deps_references)])
-
-  if services_references:
-    assert package == "services"
-    results.extend([output_api.PresubmitError(
-        _ILLEGAL_SERVICES_ABSOLUTE_PATH_WARNING_MESSAGE,
-        items=services_references)])
-
-  if edk_references:
-    assert package == "EDK"
-    results.extend([output_api.PresubmitError(
-        _ILLEGAL_EDK_ABSOLUTE_PATH_WARNING_MESSAGE,
-        items=edk_references)])
-
-  return results
-
-def _CheckSourceSetsAreOfCorrectType(input_api, output_api, package):
-  """Makes sure that the BUILD.gn files always use the correct wrapper type for
-  |package|, which can be one of ["SDK", "EDK"], to construct source_set
-  targets."""
-  assert package in _PACKAGE_SOURCE_SET_TYPES
-  required_source_set_type = _PACKAGE_SOURCE_SET_TYPES[package]
-
-  problems = []
-  for f in _AffectedBuildFilesWithinPackage(input_api, package):
-    for line_num, line in f.ChangedContents():
-      m = re.search(r"[a-z_]*source_set\(", line)
-      if not m:
-        continue
-      source_set_type = m.group(0)[:-1]
-      if source_set_type in required_source_set_type:
-        continue
-      problems.append(_IncorrectSourceSetTypeWarningItem(f.LocalPath(),
-                                                         line_num))
-
-  if not problems:
-    return []
-  return [output_api.PresubmitError(
-      _INCORRECT_SOURCE_SET_TYPE_WARNING_MESSAGES[package],
-      items=problems)]
-
-def _CheckChangePylintsClean(input_api, output_api):
-  # Additional python module paths (we're in src/mojo/); not everyone needs
-  # them, but it's easiest to add them to everyone's path.
-  # For ply and jinja2:
-  third_party_path = os.path.join(
-      input_api.PresubmitLocalPath(), "..", "third_party")
-  # For the bindings generator:
-  mojo_public_bindings_pylib_path = os.path.join(
-      input_api.PresubmitLocalPath(), "public", "tools", "bindings", "pylib")
-  # For the python bindings:
-  mojo_python_bindings_path = os.path.join(
-      input_api.PresubmitLocalPath(), "public", "python")
-  # For the python bindings tests:
-  mojo_python_bindings_tests_path = os.path.join(
-      input_api.PresubmitLocalPath(), "python", "tests")
-  # For the roll tools scripts:
-  mojo_roll_tools_path = os.path.join(
-      input_api.PresubmitLocalPath(), "tools", "roll")
-  # For all mojo/tools scripts:
-  mopy_path = os.path.join(input_api.PresubmitLocalPath(), "tools")
-  # For all mojo/devtools scripts:
-  devtools_path = os.path.join(input_api.PresubmitLocalPath(), "devtools")
-  # TODO(vtl): Don't lint these files until the (many) problems are fixed
-  # (possibly by deleting/rewriting some files).
-  temporary_black_list = (
-      r".*\bpublic[\\\/]tools[\\\/]bindings[\\\/]pylib[\\\/]mojom[\\\/]"
-          r"generate[\\\/].+\.py$",
-      r".*\bpublic[\\\/]tools[\\\/]bindings[\\\/]generators[\\\/].+\.py$")
-  black_list = input_api.DEFAULT_BLACK_LIST + temporary_black_list + (
-      # Imported from Android tools, we might want not to fix the warnings
-      # raised for it to make it easier to compare the code with the original.
-      r".*\bdevtools[\\\/]common[\\\/]android_stack_parser[\\\/].+\.py$",)
-
-  results = []
-  pylint_extra_paths = [
-      third_party_path,
-      mojo_public_bindings_pylib_path,
-      mojo_python_bindings_path,
-      mojo_python_bindings_tests_path,
-      mojo_roll_tools_path,
-      mopy_path,
-      devtools_path
-  ]
-  results.extend(input_api.canned_checks.RunPylint(
-      input_api, output_api, extra_paths_list=pylint_extra_paths,
-      black_list=black_list))
-  return results
-
-def _BuildFileChecks(input_api, output_api):
-  """Performs checks on SDK, EDK, and services' public buildfiles."""
-  results = []
-  for package in ["SDK", "EDK", "services"]:
-    results.extend(_CheckNoIllegalAbsolutePathsInBuildFiles(input_api,
-                                                            output_api,
-                                                            package))
-    results.extend(_CheckSourceSetsAreOfCorrectType(input_api,
-                                                    output_api,
-                                                    package))
-  return results
-
-def _CommonChecks(input_api, output_api):
-  """Checks common to both upload and commit."""
-  results = []
-  results.extend(_BuildFileChecks(input_api, output_api))
-  return results
-
-def CheckChangeOnUpload(input_api, output_api):
-  results = []
-  results.extend(_CommonChecks(input_api, output_api))
-  results.extend(_CheckChangePylintsClean(input_api, output_api))
-  return results
-
-def CheckChangeOnCommit(input_api, output_api):
-  results = []
-  results.extend(_CommonChecks(input_api, output_api))
-  return results
diff --git a/mojo/PRESUBMIT_test.py b/mojo/PRESUBMIT_test.py
deleted file mode 100755
index 3e2443c..0000000
--- a/mojo/PRESUBMIT_test.py
+++ /dev/null
@@ -1,310 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import os
-import sys
-import unittest
-
-import PRESUBMIT
-
-sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from PRESUBMIT_test_mocks import MockFile
-from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi
-
-_SDK_BUILD_FILE = 'mojo/public/some/path/BUILD.gn'
-_EDK_BUILD_FILE = 'mojo/edk/some/path/BUILD.gn'
-_SERVICE_BUILD_FILE = 'mojo/services/some_service/public/BUILD.gn'
-_IRRELEVANT_BUILD_FILE = 'mojo/foo/some/path/BUILD.gn'
-
-_PACKAGE_BUILDFILES = {
-    'SDK' : _SDK_BUILD_FILE,
-    'EDK' : _EDK_BUILD_FILE,
-    'services' : _SERVICE_BUILD_FILE
-}
-
-class AbsoluteReferencesInBuildFilesTest(unittest.TestCase):
-  """Tests the checking for illegal absolute paths within SDK/EDK buildfiles.
-  """
-  def setUp(self):
-    self.sdk_absolute_path = '//mojo/public/some/absolute/path'
-    self.sdk_relative_path = 'mojo/public/some/relative/path'
-    self.edk_absolute_path = '//mojo/edk/some/absolute/path'
-    self.edk_relative_path = 'mojo/edk/some/relative/path'
-    self.service_absolute_path = '//mojo/services/some/service'
-    self.service_relative_path = '../../../some/service'
-    self.whitelisted_external_path = '//testing/gtest'
-    self.non_whitelisted_external_path = '//base'
-
-  def inputApiContainingFileWithPaths(self, filename, paths):
-    """Returns a MockInputApi object with a single file having |filename| as
-    its name and |paths| as its contents, with each path being wrapped in a
-    pair of double-quotes to match the syntax for strings within BUILD.gn
-    files."""
-    contents = [ '"%s"' % path for path in paths ]
-    mock_file = MockFile(filename, contents)
-    mock_input_api = MockInputApi()
-    mock_input_api.files.append(mock_file)
-    return mock_input_api
-
-  def checkWarningWithSingleItem(self,
-                                 warning,
-                                 expected_message,
-                                 build_file,
-                                 line_num,
-                                 referenced_path):
-    """Checks that |warning| has a message of |expected_message| and a single
-    item whose contents are the absolute path warning item for
-    (build_file, line_num, referenced_path)."""
-    self.assertEqual(expected_message, warning.message)
-    self.assertEqual(1, len(warning.items))
-    expected_item = PRESUBMIT._PathReferenceInBuildFileWarningItem(
-        build_file, line_num, referenced_path)
-    self.assertEqual(expected_item, warning.items[0])
-
-  def checkSDKAbsolutePathWarningWithSingleItem(self,
-                                                warning,
-                                                package,
-                                                build_file,
-                                                line_num,
-                                                referenced_path):
-    """Checks that |warning| has the message for an absolute SDK path within
-    |package| and a single item whose contents are the absolute path warning
-    item for (build_file, line_num, referenced_path)."""
-    expected_message = \
-        PRESUBMIT._ILLEGAL_SDK_ABSOLUTE_PATH_WARNING_MESSAGES[package]
-    self.checkWarningWithSingleItem(warning,
-                                    expected_message,
-                                    build_file,
-                                    line_num,
-                                    referenced_path)
-
-  def _testAbsoluteSDKReferenceInPackage(self, package):
-    """Tests that an absolute SDK path within |package| is flagged."""
-    buildfile = _PACKAGE_BUILDFILES[package]
-    mock_input_api = self.inputApiContainingFileWithPaths(
-        buildfile,
-        [ self.sdk_relative_path, self.sdk_absolute_path ])
-    warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
-
-    self.assertEqual(1, len(warnings))
-    self.checkSDKAbsolutePathWarningWithSingleItem(warnings[0],
-                                                   package,
-                                                   buildfile,
-                                                   2,
-                                                   self.sdk_absolute_path)
-
-  def _testExternalReferenceInPackage(self, package):
-    """Tests that an illegal external path within |package| is flagged."""
-    buildfile = _PACKAGE_BUILDFILES[package]
-    mock_input_api = self.inputApiContainingFileWithPaths(
-        buildfile,
-        [ self.non_whitelisted_external_path, self.whitelisted_external_path ])
-    warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
-
-    if package == 'EDK':
-      # All external paths are allowed in the EDK.
-      self.assertEqual(0, len(warnings))
-      return
-
-    self.assertEqual(1, len(warnings))
-    expected_message = PRESUBMIT._ILLEGAL_EXTERNAL_PATH_WARNING_MESSAGE
-    self.checkWarningWithSingleItem(warnings[0],
-                                    expected_message,
-                                    buildfile,
-                                    1,
-                                    self.non_whitelisted_external_path)
-
-  def testAbsoluteSDKReferenceInSDKBuildFile(self):
-    """Tests that an absolute SDK path within an SDK buildfile is flagged."""
-    self._testAbsoluteSDKReferenceInPackage('SDK')
-
-  def testExternalReferenceInSDKBuildFile(self):
-    """Tests that an illegal external path in an SDK buildfile is flagged."""
-    self._testExternalReferenceInPackage('SDK')
-
-  def testAbsoluteEDKReferenceInSDKBuildFile(self):
-    """Tests that an absolute EDK path in an SDK buildfile is flagged."""
-    mock_input_api = self.inputApiContainingFileWithPaths(
-        _SDK_BUILD_FILE,
-        [ self.edk_absolute_path ])
-    warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
-
-    self.assertEqual(1, len(warnings))
-    expected_message = PRESUBMIT._ILLEGAL_EXTERNAL_PATH_WARNING_MESSAGE
-    self.checkWarningWithSingleItem(warnings[0],
-                                    expected_message,
-                                    _SDK_BUILD_FILE,
-                                    1,
-                                    self.edk_absolute_path)
-
-  def testAbsoluteSDKReferenceInEDKBuildFile(self):
-    """Tests that an absolute SDK path within an EDK buildfile is flagged."""
-    self._testAbsoluteSDKReferenceInPackage('EDK')
-
-  def testAbsoluteEDKReferenceInEDKBuildFile(self):
-    """Tests that an absolute EDK path in an EDK buildfile is flagged."""
-    mock_input_api = self.inputApiContainingFileWithPaths(
-        _EDK_BUILD_FILE,
-        [ self.edk_absolute_path, self.edk_relative_path ])
-    warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
-
-    self.assertEqual(1, len(warnings))
-    expected_message = PRESUBMIT._ILLEGAL_EDK_ABSOLUTE_PATH_WARNING_MESSAGE
-    self.checkWarningWithSingleItem(warnings[0],
-                                    expected_message,
-                                    _EDK_BUILD_FILE,
-                                    1,
-                                    self.edk_absolute_path)
-
-  def testExternalReferenceInEDKBuildFile(self):
-    """Tests that an external path in an EDK buildfile is not flagged."""
-    self._testExternalReferenceInPackage('EDK')
-
-  def testAbsoluteSDKReferenceInServiceBuildFile(self):
-    """Tests that an absolute SDK path within a service's public buildfile is
-    flagged."""
-    self._testAbsoluteSDKReferenceInPackage("services")
-
-  def testAbsoluteServiceReferenceInServiceBuildFile(self):
-    """Tests that an absolute path to a service within a service's public
-    buildfile is flagged."""
-    mock_input_api = self.inputApiContainingFileWithPaths(
-        _SERVICE_BUILD_FILE,
-        [ self.service_relative_path, self.service_absolute_path ])
-    warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
-
-    self.assertEqual(1, len(warnings))
-    expected_message = \
-        PRESUBMIT._ILLEGAL_SERVICES_ABSOLUTE_PATH_WARNING_MESSAGE
-    self.checkWarningWithSingleItem(warnings[0],
-                                    expected_message,
-                                    _SERVICE_BUILD_FILE,
-                                    2,
-                                    self.service_absolute_path)
-
-  def testExternalReferenceInServiceBuildFile(self):
-    """Tests that an illegal external path in a service's buildfile is flagged
-    ."""
-    self._testExternalReferenceInPackage("services")
-
-  def testIrrelevantBuildFile(self):
-    """Tests that nothing is flagged in a non SDK/EDK buildfile."""
-    mock_input_api = self.inputApiContainingFileWithPaths(
-        _IRRELEVANT_BUILD_FILE,
-        [ self.sdk_absolute_path,
-          self.sdk_relative_path,
-          self.edk_absolute_path,
-          self.edk_relative_path,
-          self.non_whitelisted_external_path,
-          self.whitelisted_external_path ])
-    warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
-    self.assertEqual(0, len(warnings))
-
-class SourceSetTypesInBuildFilesTest(unittest.TestCase):
-  """Tests checking of correct source set types within SDK/EDK buildfiles."""
-
-  def inputApiContainingFileWithSourceSets(self, filename, source_sets):
-    """Returns a MockInputApi object containing a single file having |filename|
-    as its name and |source_sets| as its contents."""
-    mock_file = MockFile(filename, source_sets)
-    mock_input_api = MockInputApi()
-    mock_input_api.files.append(mock_file)
-    return mock_input_api
-
-  def checkWarningWithSingleItem(self,
-                                 warning,
-                                 package,
-                                 build_file,
-                                 line_num):
-    """Checks that warning has the expected incorrect source set type message
-    for |package| and a single item whose contents are the incorrect source
-    set type item for (build_file, line_num)."""
-    expected_message = \
-        PRESUBMIT._INCORRECT_SOURCE_SET_TYPE_WARNING_MESSAGES[package]
-    self.assertEqual(expected_message, warning.message)
-    self.assertEqual(1, len(warning.items))
-    expected_item = PRESUBMIT._IncorrectSourceSetTypeWarningItem(
-        build_file, line_num)
-    self.assertEqual(expected_item, warning.items[0])
-
-  def _testNakedSourceSetInPackage(self, package):
-    """Tests that a source_set within |package| is flagged."""
-    buildfile = _PACKAGE_BUILDFILES[package]
-    naked_source_set = 'source_set('
-    correct_source_set = 'mojo_sdk_source_set('
-    if package == 'EDK':
-      correct_source_set = 'mojo_edk_source_set('
-    mock_input_api = self.inputApiContainingFileWithSourceSets(
-        buildfile,
-        [ correct_source_set, naked_source_set ])
-    warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
-
-    self.assertEqual(1, len(warnings))
-    self.checkWarningWithSingleItem(warnings[0], package, buildfile, 2)
-
-  def _testWrongTypeOfWrapperSourceSetInPackage(self, package):
-    """Tests that the wrong type of wrapper source_set in |package| is flagged
-    (e.g., mojo_edk_source_set within the SDK)."""
-    buildfile = _PACKAGE_BUILDFILES[package]
-    mock_input_api = self.inputApiContainingFileWithSourceSets(
-        buildfile,
-        [ 'mojo_sdk_source_set(', 'mojo_edk_source_set(' ])
-    warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
-
-    self.assertEqual(1, len(warnings))
-    warning_line = 2
-    if package == 'EDK':
-      warning_line = 1
-    self.checkWarningWithSingleItem(warnings[0],
-                                    package,
-                                    buildfile,
-                                    warning_line)
-
-  def testNakedSourceSetInSDKBuildFile(self):
-    """Tests that a source_set within the SDK is flagged."""
-    self._testNakedSourceSetInPackage('SDK')
-
-  def testPythonSourceSetInSDKBuildFile(self):
-    """Tests that a python_binary_source_set within an SDK buildfile is
-    accepted."""
-    mock_input_api = self.inputApiContainingFileWithSourceSets(
-        _SDK_BUILD_FILE,
-        [ 'mojo_sdk_source_set(', 'python_binary_source_set(' ])
-    warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
-
-    self.assertEqual(0, len(warnings))
-
-  def testEDKSourceSetInSDKBuildFile(self):
-    """Tests that a mojo_edk_source_set within an SDK buildfile is flagged."""
-    self._testWrongTypeOfWrapperSourceSetInPackage('SDK')
-
-  def testNakedSourceSetInEDKBuildFile(self):
-    """Tests that a source_set within the EDK is flagged."""
-    self._testNakedSourceSetInPackage('EDK')
-
-  def testSDKSourceSetInEDKBuildFile(self):
-    """Tests that a mojo_sdk_source_set within an EDK buildfile is flagged."""
-    self._testWrongTypeOfWrapperSourceSetInPackage('EDK')
-
-  def testNakedSourceSetInServiceBuildFile(self):
-    """Tests that a source_set within a service's public buildfile is flagged.
-    """
-    self._testNakedSourceSetInPackage("services")
-
-  def testEDKSourceSetInServiceBuildFile(self):
-    """Tests that a mojo_edk_source_set within a service's public buildfile is
-    flagged."""
-    self._testWrongTypeOfWrapperSourceSetInPackage("services")
-
-  def testIrrelevantBuildFile(self):
-    """Tests that a source_set in a non-SDK/EDK buildfile isn't flagged."""
-    mock_input_api = self.inputApiContainingFileWithSourceSets(
-        _IRRELEVANT_BUILD_FILE,
-        [ 'source_set(' ])
-    warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi())
-    self.assertEqual(0, len(warnings))
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/mojo/README.md b/mojo/README.md
deleted file mode 100644
index 5af1dcb..0000000
--- a/mojo/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Mojo
-====
-
-Mojo is an effort to extract a common platform out of Chrome's renderer and
-plugin processes that can support multiple types of sandboxed content, such as
-HTML, Pepper, or NaCl.
diff --git a/mojo/android/BUILD.gn b/mojo/android/BUILD.gn
index 8e0aacd..746a156 100644
--- a/mojo/android/BUILD.gn
+++ b/mojo/android/BUILD.gn
@@ -45,10 +45,10 @@
   deps = [
     ":system_java_jni_headers",
     "//base",
-    "//mojo/public/cpp/environment",
-    "//mojo/common:common",
+    "//mojo/message_pump",
     "//mojo/public/c/system:system",
     "//mojo/public/cpp/bindings:callback",
+    "//mojo/public/cpp/environment",
   ]
 }
 
@@ -125,13 +125,12 @@
     ":system_java_jni_headers",
     "//base",
     "//base/test/:test_support",
-    "//mojo/common",
-    "//mojo/edk/system",
-    "//mojo/public/cpp/bindings/tests:mojo_public_bindings_test_utils",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//mojo/public/cpp/environment",
     "//mojo/edk/system",
     "//mojo/environment:chromium",
+    "//mojo/message_pump",
+    "//mojo/public/cpp/bindings/tests:mojo_public_bindings_test_utils",
+    "//mojo/public/cpp/environment",
+    "//mojo/public/cpp/test_support:test_utils",
   ]
   defines = [ "UNIT_TEST" ]
 }
diff --git a/mojo/android/javatests/mojo_test_case.cc b/mojo/android/javatests/mojo_test_case.cc
index 419d14d..2df0bc7 100644
--- a/mojo/android/javatests/mojo_test_case.cc
+++ b/mojo/android/javatests/mojo_test_case.cc
@@ -13,7 +13,7 @@
 #include "base/run_loop.h"
 #include "base/test/test_support_android.h"
 #include "jni/MojoTestCase_jni.h"
-#include "mojo/common/message_pump_mojo.h"
+#include "mojo/message_pump/message_pump_mojo.h"
 
 #include "mojo/public/cpp/environment/environment.h"
 
diff --git a/mojo/android/system/base_run_loop.cc b/mojo/android/system/base_run_loop.cc
index 3d05e30..f361a94 100644
--- a/mojo/android/system/base_run_loop.cc
+++ b/mojo/android/system/base_run_loop.cc
@@ -12,7 +12,7 @@
 #include "base/bind.h"
 #include "base/message_loop/message_loop.h"
 #include "jni/BaseRunLoop_jni.h"
-#include "mojo/common/message_pump_mojo.h"
+#include "mojo/message_pump/message_pump_mojo.h"
 
 namespace mojo {
 namespace android {
diff --git a/mojo/application/BUILD.gn b/mojo/application/BUILD.gn
index f28c13b..35cb345 100644
--- a/mojo/application/BUILD.gn
+++ b/mojo/application/BUILD.gn
@@ -13,7 +13,7 @@
   ]
   deps = [
     "//base",
-    "//mojo/common",
+    "//mojo/message_pump",
     "//mojo/public/cpp/system",
     "//mojo/environment:chromium",
   ]
@@ -27,8 +27,8 @@
   deps = [
     ":application",
     "//base",
-    "//mojo/common",
     "//mojo/environment:chromium",
+    "//mojo/message_pump",
     "//mojo/public/interfaces/application",
     "//mojo/services/content_handler/public/interfaces",
     "//mojo/services/network/public/interfaces",
diff --git a/mojo/application/application_runner_chromium.cc b/mojo/application/application_runner_chromium.cc
index 451d448..d54f4b2 100644
--- a/mojo/application/application_runner_chromium.cc
+++ b/mojo/application/application_runner_chromium.cc
@@ -9,7 +9,7 @@
 #include "base/debug/stack_trace.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/message_loop/message_loop.h"
-#include "mojo/common/message_pump_mojo.h"
+#include "mojo/message_pump/message_pump_mojo.h"
 #include "mojo/public/cpp/application/application_delegate.h"
 #include "mojo/public/cpp/application/application_impl.h"
 
diff --git a/mojo/application/content_handler_factory.cc b/mojo/application/content_handler_factory.cc
index 1231001..9594fdb 100644
--- a/mojo/application/content_handler_factory.cc
+++ b/mojo/application/content_handler_factory.cc
@@ -13,7 +13,7 @@
 #include "base/threading/platform_thread.h"
 #include "base/trace_event/trace_event.h"
 #include "mojo/application/application_runner_chromium.h"
-#include "mojo/common/message_pump_mojo.h"
+#include "mojo/message_pump/message_pump_mojo.h"
 #include "mojo/public/cpp/application/application_connection.h"
 #include "mojo/public/cpp/application/application_delegate.h"
 #include "mojo/public/cpp/application/application_impl.h"
diff --git a/mojo/common/BUILD.gn b/mojo/common/BUILD.gn
index 460471b..2420060 100644
--- a/mojo/common/BUILD.gn
+++ b/mojo/common/BUILD.gn
@@ -5,54 +5,25 @@
 import("//mojo/public/tools/bindings/mojom.gni")
 import("//testing/test.gni")
 
-component("common") {
-  output_name = "mojo_common_lib"
-
+source_set("common") {
   sources = [
     "binding_set.h",
-    "common_type_converters.cc",
-    "common_type_converters.h",
-    "data_pipe_drainer.cc",
-    "data_pipe_drainer.h",
-    "data_pipe_file_utils.cc",
-    "data_pipe_utils.cc",
-    "data_pipe_utils.h",
-    "data_pipe_utils_internal.h",
-    "handle_watcher.cc",
-    "handle_watcher.h",
     "interface_ptr_set.h",
-    "message_pump_mojo.cc",
-    "message_pump_mojo.h",
-    "message_pump_mojo_handler.h",
     "task_tracker.cc",
     "task_tracker.h",
-    "time_helper.cc",
-    "time_helper.h",
   ]
 
-  if (is_nacl) {
-    sources -= [ "data_pipe_file_utils.cc" ]
-  }
-
   deps = [
     "//base",
-    "//base/third_party/dynamic_annotations",
-    "//mojo/public/c/system",
     "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/environment:environment",
-    "//mojo/public/cpp/system",
-    "//url",
   ]
 }
 
 test("mojo_common_unittests") {
   sources = [
     "binding_set_unittest.cc",
-    "common_type_converters_unittest.cc",
-    "data_pipe_utils_unittest.cc",
-    "handle_watcher_unittest.cc",
+    "callback_binding_unittest.cc",
     "interface_ptr_set_unittest.cc",
-    "message_pump_mojo_unittest.cc",
     "task_tracker_unittest.cc",
   ]
 
@@ -61,10 +32,15 @@
     ":test_interfaces",
     "//base",
     "//base/test:test_support",
-    "//base:message_loop_tests",
+    "//mojo/converters/array_string:tests",
+    "//mojo/converters/base:tests",
+    "//mojo/converters/url:tests",
+    "//mojo/data_pipe_utils:tests",
     "//mojo/edk/test:run_all_unittests",
     "//mojo/edk/test:test_support",
     "//mojo/environment:chromium",
+    "//mojo/message_pump",
+    "//mojo/message_pump:tests",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/bindings:callback",
     "//mojo/public/cpp/system",
@@ -83,8 +59,8 @@
 
 source_set("tracing_impl") {
   sources = [
-    "trace_controller_impl.cc",
-    "trace_controller_impl.h",
+    "trace_provider_impl.cc",
+    "trace_provider_impl.h",
     "tracing_impl.cc",
     "tracing_impl.h",
   ]
diff --git a/mojo/common/binding_set_unittest.cc b/mojo/common/binding_set_unittest.cc
index 421a405..c37053e 100644
--- a/mojo/common/binding_set_unittest.cc
+++ b/mojo/common/binding_set_unittest.cc
@@ -5,8 +5,8 @@
 #include "mojo/common/binding_set.h"
 
 #include "base/message_loop/message_loop.h"
-#include "mojo/common/message_pump_mojo.h"
 #include "mojo/common/test_interfaces.mojom.h"
+#include "mojo/message_pump/message_pump_mojo.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/mojo/common/callback_binding_unittest.cc b/mojo/common/callback_binding_unittest.cc
new file mode 100644
index 0000000..aa59856
--- /dev/null
+++ b/mojo/common/callback_binding_unittest.cc
@@ -0,0 +1,104 @@
+// 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.
+
+#include "base/bind.h"
+#include "mojo/public/cpp/bindings/callback.h"
+#include "mojo/public/cpp/bindings/map.h"
+#include "mojo/public/cpp/bindings/string.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+struct RunnableNoArgs {
+  RunnableNoArgs(int* calls) : calls(calls) {}
+  void Run() const { (*calls)++; }
+
+  int* calls;
+};
+
+TEST(CallbackBindingTest, BaseBindToMojoCallbackNoParams) {
+  mojo::Callback<void()> cb;
+  int calls = 0;
+  RunnableNoArgs r(&calls);
+  cb = r;
+  cb.Run();
+  EXPECT_EQ(1, calls);
+
+  cb = base::Bind(&RunnableNoArgs::Run, base::Unretained(&r));
+  cb.Run();
+  EXPECT_EQ(2, calls);
+}
+
+struct RunnableOnePrimitiveArg {
+  explicit RunnableOnePrimitiveArg(int* calls) : calls(calls) {}
+  void Run(int a) const { (*calls)++; }
+
+  int* calls;
+};
+
+TEST(CallbackBindingTest, BaseBindToMojoCallbackPrimitiveParam) {
+  mojo::Callback<void(int)> mojo_callback;
+  int calls = 0;
+  RunnableOnePrimitiveArg r(&calls);
+  mojo_callback = r;
+  mojo_callback.Run(0);
+  EXPECT_EQ(1, calls);
+
+  base::Callback<void(int)> base_callback =
+      base::Bind(&RunnableOnePrimitiveArg::Run, base::Unretained(&r));
+  mojo_callback = base_callback;
+  mojo_callback.Run(0);
+  EXPECT_EQ(2, calls);
+}
+
+struct RunnableOneMojoStringParam {
+  explicit RunnableOneMojoStringParam(int* calls) : calls(calls) {}
+  void Run(const mojo::String& s) const { (*calls)++; }
+
+  int* calls;
+};
+
+TEST(CallbackBindingTest, BaseBindToMojoCallbackMojoStringParam) {
+  // The mojo type is a callback on mojo::String, but it'll expect to invoke
+  // callbacks with a parameter of type 'const Mojo::String&'.
+  mojo::Callback<void(mojo::String)> mojo_callback;
+  int calls = 0;
+  RunnableOneMojoStringParam r(&calls);
+  mojo_callback = r;
+  mojo_callback.Run(0);
+  EXPECT_EQ(1, calls);
+
+  base::Callback<void(const mojo::String&)> base_callback =
+      base::Bind(&RunnableOneMojoStringParam::Run, base::Unretained(&r));
+  mojo_callback = base_callback;
+  mojo_callback.Run(0);
+  EXPECT_EQ(2, calls);
+}
+
+using ExampleMoveOnlyType = mojo::Map<int, int>;
+
+struct RunnableOneMoveOnlyParam {
+  explicit RunnableOneMoveOnlyParam(int* calls) : calls(calls) {}
+
+  void Run(ExampleMoveOnlyType m) const { (*calls)++; }
+  int* calls;
+};
+
+TEST(CallbackBindingTest, BaseBindToMoveOnlyParam) {
+  mojo::Callback<void(ExampleMoveOnlyType)> mojo_callback;
+  int calls = 0;
+  RunnableOneMoveOnlyParam r(&calls);
+  mojo_callback = r;
+  ExampleMoveOnlyType m;
+  mojo_callback.Run(m.Clone());
+  EXPECT_EQ(1, calls);
+
+  base::Callback<void(ExampleMoveOnlyType)> base_callback =
+      base::Bind(&RunnableOneMoveOnlyParam::Run, base::Unretained(&r));
+  mojo_callback = base_callback;
+  mojo_callback.Run(m.Clone());
+  EXPECT_EQ(2, calls);
+}
+
+}  // namespace
diff --git a/mojo/common/common_type_converters.cc b/mojo/common/common_type_converters.cc
deleted file mode 100644
index 114b409..0000000
--- a/mojo/common/common_type_converters.cc
+++ /dev/null
@@ -1,65 +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.
-
-#include "mojo/common/common_type_converters.h"
-
-#include <string>
-
-#include "base/strings/utf_string_conversions.h"
-#include "url/gurl.h"
-
-namespace mojo {
-
-// static
-String TypeConverter<String, base::StringPiece>::Convert(
-    const base::StringPiece& input) {
-  if (input.empty()) {
-    char c = 0;
-    return String(&c, 0);
-  }
-  return String(input.data(), input.size());
-}
-// static
-base::StringPiece TypeConverter<base::StringPiece, String>::Convert(
-    const String& input) {
-  return input.get();
-}
-
-// static
-String TypeConverter<String, base::string16>::Convert(
-    const base::string16& input) {
-  return TypeConverter<String, base::StringPiece>::Convert(
-      base::UTF16ToUTF8(input));
-}
-// static
-base::string16 TypeConverter<base::string16, String>::Convert(
-    const String& input) {
-  return base::UTF8ToUTF16(input.To<base::StringPiece>());
-}
-
-String TypeConverter<String, GURL>::Convert(const GURL& input) {
-  return String(input.spec());
-}
-
-GURL TypeConverter<GURL, String>::Convert(const String& input) {
-  return GURL(input.get());
-}
-
-std::string TypeConverter<std::string, Array<uint8_t> >::Convert(
-    const Array<uint8_t>& input) {
-  if (input.is_null())
-    return std::string();
-
-  return std::string(reinterpret_cast<const char*>(&input.front()),
-                     input.size());
-}
-
-Array<uint8_t> TypeConverter<Array<uint8_t>, std::string>::Convert(
-    const std::string& input) {
-  Array<uint8_t> result(input.size());
-  memcpy(&result.front(), input.c_str(), input.size());
-  return result.Pass();
-}
-
-}  // namespace mojo
diff --git a/mojo/common/common_type_converters.h b/mojo/common/common_type_converters.h
deleted file mode 100644
index 9bd21e8..0000000
--- a/mojo/common/common_type_converters.h
+++ /dev/null
@@ -1,64 +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.
-
-#ifndef MOJO_COMMON_COMMON_TYPE_CONVERTERS_H_
-#define MOJO_COMMON_COMMON_TYPE_CONVERTERS_H_
-
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
-#include "mojo/public/cpp/bindings/array.h"
-#include "mojo/public/cpp/bindings/string.h"
-#include "mojo/public/cpp/bindings/type_converter.h"
-
-class GURL;
-
-namespace mojo {
-
-template <>
-struct TypeConverter<String, base::StringPiece> {
-  static String Convert(const base::StringPiece& input);
-};
-
-template <>
-struct TypeConverter<base::StringPiece, String> {
-  static base::StringPiece Convert(const String& input);
-};
-
-template <>
-struct TypeConverter<String, base::string16> {
-  static String Convert(const base::string16& input);
-};
-
-template <>
-struct TypeConverter<base::string16, String> {
-  static base::string16 Convert(const String& input);
-};
-
-template <>
-struct TypeConverter<String, GURL> {
-  static String Convert(const GURL& input);
-};
-
-template <>
-struct TypeConverter<GURL, String> {
-  static GURL Convert(const String& input);
-};
-
-// TODO(erg): In the very long term, we will want to remove conversion between
-// std::strings and arrays of unsigned bytes. However, there is too much code
-// across chrome which uses std::string as a bag of bytes that we probably
-// don't want to roll this function at each callsite.
-template <>
-struct TypeConverter<std::string, Array<uint8_t>> {
-  static std::string Convert(const Array<uint8_t>& input);
-};
-
-template <>
-struct TypeConverter<Array<uint8_t>, std::string> {
-  static Array<uint8_t> Convert(const std::string& input);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_COMMON_COMMON_TYPE_CONVERTERS_H_
diff --git a/mojo/common/common_type_converters_unittest.cc b/mojo/common/common_type_converters_unittest.cc
deleted file mode 100644
index 4a360bd..0000000
--- a/mojo/common/common_type_converters_unittest.cc
+++ /dev/null
@@ -1,203 +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.
-
-#include "mojo/common/common_type_converters.h"
-
-#include "base/bind.h"
-#include "base/strings/utf_string_conversions.h"
-#include "mojo/public/cpp/bindings/callback.h"
-#include "mojo/public/cpp/bindings/map.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "url/gurl.h"
-
-namespace mojo {
-namespace common {
-namespace test {
-namespace {
-
-void ExpectEqualsStringPiece(const std::string& expected,
-                             const base::StringPiece& str) {
-  EXPECT_EQ(expected, str.as_string());
-}
-
-void ExpectEqualsMojoString(const std::string& expected,
-                            const String& str) {
-  EXPECT_EQ(expected, str.get());
-}
-
-void ExpectEqualsString16(const base::string16& expected,
-                          const base::string16& actual) {
-  EXPECT_EQ(expected, actual);
-}
-
-void ExpectEqualsMojoString(const base::string16& expected,
-                            const String& str) {
-  EXPECT_EQ(expected, str.To<base::string16>());
-}
-
-TEST(CommonTypeConvertersTest, StringPiece) {
-  std::string kText("hello world");
-
-  base::StringPiece string_piece(kText);
-  String mojo_string(String::From(string_piece));
-
-  ExpectEqualsMojoString(kText, mojo_string);
-  ExpectEqualsStringPiece(kText, mojo_string.To<base::StringPiece>());
-
-  // Test implicit construction and conversion:
-  ExpectEqualsMojoString(kText, String::From(string_piece));
-  ExpectEqualsStringPiece(kText, mojo_string.To<base::StringPiece>());
-
-  // Test null String:
-  base::StringPiece empty_string_piece = String().To<base::StringPiece>();
-  EXPECT_TRUE(empty_string_piece.empty());
-}
-
-TEST(CommonTypeConvertersTest, String16) {
-  const base::string16 string16(base::ASCIIToUTF16("hello world"));
-  const String mojo_string(String::From(string16));
-
-  ExpectEqualsMojoString(string16, mojo_string);
-  EXPECT_EQ(string16, mojo_string.To<base::string16>());
-
-  // Test implicit construction and conversion:
-  ExpectEqualsMojoString(string16, String::From(string16));
-  ExpectEqualsString16(string16, mojo_string.To<base::string16>());
-
-  // Test empty string conversion.
-  ExpectEqualsMojoString(base::string16(), String::From(base::string16()));
-}
-
-TEST(CommonTypeConvertersTest, URL) {
-  GURL url("mojo:foo");
-  String mojo_string(String::From(url));
-
-  ASSERT_EQ(url.spec(), mojo_string);
-  EXPECT_EQ(url.spec(), mojo_string.To<GURL>().spec());
-  EXPECT_EQ(url.spec(), String::From(url));
-
-  GURL invalid = String().To<GURL>();
-  ASSERT_TRUE(invalid.spec().empty());
-
-  String string_from_invalid = String::From(invalid);
-  EXPECT_FALSE(string_from_invalid.is_null());
-  ASSERT_EQ(0U, string_from_invalid.size());
-}
-
-TEST(CommonTypeConvertersTest, ArrayUint8ToStdString) {
-  Array<uint8_t> data(4);
-  data[0] = 'd';
-  data[1] = 'a';
-  data[2] = 't';
-  data[3] = 'a';
-
-  EXPECT_EQ("data", data.To<std::string>());
-}
-
-TEST(CommonTypeConvertersTest, StdStringToArrayUint8) {
-  std::string input("data");
-  Array<uint8_t> data = Array<uint8_t>::From(input);
-
-  ASSERT_EQ(4ul, data.size());
-  EXPECT_EQ('d', data[0]);
-  EXPECT_EQ('a', data[1]);
-  EXPECT_EQ('t', data[2]);
-  EXPECT_EQ('a', data[3]);
-}
-
-struct RunnableNoArgs {
-  RunnableNoArgs(int* calls) : calls(calls) {}
-  void Run() const { (*calls)++; }
-
-  int* calls;
-};
-
-TEST(CommonTypeConvertersTest, BaseBindToMojoCallbackNoParams) {
-  mojo::Callback<void()> cb;
-  int calls = 0;
-  RunnableNoArgs r(&calls);
-  cb = r;
-  cb.Run();
-  EXPECT_EQ(1, calls);
-
-  cb = base::Bind(&RunnableNoArgs::Run, base::Unretained(&r));
-  cb.Run();
-  EXPECT_EQ(2, calls);
-}
-
-struct RunnableOnePrimitiveArg {
-  explicit RunnableOnePrimitiveArg(int* calls) : calls(calls) {}
-  void Run(int a) const { (*calls)++; }
-
-  int* calls;
-};
-
-TEST(CommonTypeConvertersTest, BaseBindToMojoCallbackPrimitiveParam) {
-  mojo::Callback<void(int)> mojo_callback;
-  int calls = 0;
-  RunnableOnePrimitiveArg r(&calls);
-  mojo_callback = r;
-  mojo_callback.Run(0);
-  EXPECT_EQ(1, calls);
-
-  base::Callback<void(int)> base_callback =
-      base::Bind(&RunnableOnePrimitiveArg::Run, base::Unretained(&r));
-  mojo_callback = base_callback;
-  mojo_callback.Run(0);
-  EXPECT_EQ(2, calls);
-}
-
-struct RunnableOneMojoStringParam {
-  explicit RunnableOneMojoStringParam(int* calls) : calls(calls) {}
-  void Run(const String& s) const { (*calls)++; }
-
-  int* calls;
-};
-
-TEST(CommonTypeConvertersTest, BaseBindToMojoCallbackMojoStringParam) {
-  // The mojo type is a callback on mojo::String, but it'll expect to invoke
-  // callbacks with a parameter of type 'const Mojo::String&'.
-  mojo::Callback<void(mojo::String)> mojo_callback;
-  int calls = 0;
-  RunnableOneMojoStringParam r(&calls);
-  mojo_callback = r;
-  mojo_callback.Run(0);
-  EXPECT_EQ(1, calls);
-
-  base::Callback<void(const mojo::String&)> base_callback =
-      base::Bind(&RunnableOneMojoStringParam::Run, base::Unretained(&r));
-  mojo_callback = base_callback;
-  mojo_callback.Run(0);
-  EXPECT_EQ(2, calls);
-}
-
-using ExampleMoveOnlyType = Map<int, int>;
-
-struct RunnableOneMoveOnlyParam {
-  explicit RunnableOneMoveOnlyParam(int* calls) : calls(calls) {}
-
-  void Run(ExampleMoveOnlyType m) const { (*calls)++; }
-  int* calls;
-};
-
-TEST(CommonTypeConvertersTest, BaseBindToMoveOnlyParam) {
-  mojo::Callback<void(ExampleMoveOnlyType)> mojo_callback;
-  int calls = 0;
-  RunnableOneMoveOnlyParam r(&calls);
-  mojo_callback = r;
-  ExampleMoveOnlyType m;
-  mojo_callback.Run(m.Clone());
-  EXPECT_EQ(1, calls);
-
-  base::Callback<void(ExampleMoveOnlyType)> base_callback =
-      base::Bind(&RunnableOneMoveOnlyParam::Run, base::Unretained(&r));
-  mojo_callback = base_callback;
-  mojo_callback.Run(m.Clone());
-  EXPECT_EQ(2, calls);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace common
-}  // namespace mojo
diff --git a/mojo/common/dart/BUILD.gn b/mojo/common/dart/BUILD.gn
index 296e3c9..e296077 100644
--- a/mojo/common/dart/BUILD.gn
+++ b/mojo/common/dart/BUILD.gn
@@ -4,14 +4,14 @@
 
 import("//mojo/public/dart/rules.gni")
 
-dartzip_package("dart") {
+dart_pkg("dart") {
+  libs = [ "lib/tracing_helper.dart" ]
   sources = [
-    "lib/trace_controller_impl.dart",
-    "lib/tracing_helper.dart",
+    "lib/trace_provider_impl.dart",
     "pubspec.yaml",
   ]
   deps = [
     "//mojo/public/dart",
-    "//mojo/services/tracing/public/interfaces",
+    "//mojo/dart/mojo_services",
   ]
 }
diff --git a/mojo/common/dart/lib/trace_controller_impl.dart b/mojo/common/dart/lib/trace_controller_impl.dart
deleted file mode 100644
index 6cbc634..0000000
--- a/mojo/common/dart/lib/trace_controller_impl.dart
+++ /dev/null
@@ -1,46 +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.
-
-import 'dart:async';
-
-import 'package:mojo/application.dart';
-import 'package:mojo/bindings.dart';
-import 'package:mojo/core.dart';
-import 'package:mojom/tracing/tracing.mojom.dart';
-
-class TraceControllerImpl implements TraceController {
-  TraceControllerStub _stub;
-  TraceDataCollectorProxy _collector;
-  // TODO(rudominer) We currently ignore _categories.
-  String _categories;
-
-  TraceControllerImpl.fromEndpoint(MojoMessagePipeEndpoint e) {
-    _stub = TraceControllerStub.newFromEndpoint(e);
-    _stub.impl = this;
-  }
-
-  @override
-  void startTracing(String categories, TraceDataCollectorProxy collector) {
-    assert(_collector == null);
-    _collector = collector;
-    _categories = categories;
-  }
-
-  @override
-  void stopTracing() {
-    assert(_collector != null);
-    _collector.close();
-    _collector = null;
-  }
-
-  bool isActive() {
-    return _collector != null;
-  }
-
-  void sendTraceMessage(String message) {
-    if (_collector != null) {
-      _collector.ptr.dataCollected(message);
-    }
-  }
-}
diff --git a/mojo/common/dart/lib/trace_provider_impl.dart b/mojo/common/dart/lib/trace_provider_impl.dart
new file mode 100644
index 0000000..13901e0
--- /dev/null
+++ b/mojo/common/dart/lib/trace_provider_impl.dart
@@ -0,0 +1,46 @@
+// 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.
+
+import 'dart:async';
+
+import 'package:mojo/application.dart';
+import 'package:mojo/bindings.dart';
+import 'package:mojo/core.dart';
+import 'package:mojo_services/tracing/tracing.mojom.dart';
+
+class TraceProviderImpl implements TraceProvider {
+  TraceProviderStub _stub;
+  TraceRecorderProxy _recorder;
+  // TODO(rudominer) We currently ignore _categories.
+  String _categories;
+
+  TraceProviderImpl.fromEndpoint(MojoMessagePipeEndpoint e) {
+    _stub = TraceProviderStub.newFromEndpoint(e);
+    _stub.impl = this;
+  }
+
+  @override
+  void startTracing(String categories, TraceRecorderProxy recorder) {
+    assert(_recorder == null);
+    _recorder = recorder;
+    _categories = categories;
+  }
+
+  @override
+  void stopTracing() {
+    assert(_recorder != null);
+    _recorder.close();
+    _recorder = null;
+  }
+
+  bool isActive() {
+    return _recorder != null;
+  }
+
+  void sendTraceMessage(String message) {
+    if (_recorder != null) {
+      _recorder.ptr.record(message);
+    }
+  }
+}
diff --git a/mojo/common/dart/lib/tracing_helper.dart b/mojo/common/dart/lib/tracing_helper.dart
index f776d9a..23c121b 100644
--- a/mojo/common/dart/lib/tracing_helper.dart
+++ b/mojo/common/dart/lib/tracing_helper.dart
@@ -4,7 +4,7 @@
 
 library tracing;
 
-import 'trace_controller_impl.dart';
+import 'trace_provider_impl.dart';
 
 import 'dart:async';
 import 'dart:convert';
@@ -15,12 +15,12 @@
 import 'package:mojo/application.dart';
 import 'package:mojo/bindings.dart';
 import 'package:mojo/core.dart';
-import 'package:mojom/tracing/tracing.mojom.dart';
+import 'package:mojo_services/tracing/tracing.mojom.dart';
 
 // TracingHelper is used by Dart code running in the Mojo shell in order
 // to perform tracing.
 class TracingHelper {
-  TraceControllerImpl _impl;
+  TraceProviderImpl _impl;
   String _tid;
 
   // Construct an instance of TracingHelper from within your application's
@@ -36,9 +36,9 @@
     }
     _tid = "${appName}/${Isolate.current.hashCode.toString()}";
     ApplicationConnection connection = app.connectToApplication("mojo:tracing");
-    connection.provideService(TraceControllerName, (e) {
+    connection.provideService(TraceProviderName, (e) {
       assert(_impl == null);
-      _impl = new TraceControllerImpl.fromEndpoint(e);
+      _impl = new TraceProviderImpl.fromEndpoint(e);
     });
   }
 
diff --git a/mojo/common/interface_ptr_set_unittest.cc b/mojo/common/interface_ptr_set_unittest.cc
index 8edd4ca..848b268 100644
--- a/mojo/common/interface_ptr_set_unittest.cc
+++ b/mojo/common/interface_ptr_set_unittest.cc
@@ -5,8 +5,8 @@
 #include "mojo/common/interface_ptr_set.h"
 
 #include "base/message_loop/message_loop.h"
-#include "mojo/common/message_pump_mojo.h"
 #include "mojo/common/test_interfaces.mojom.h"
+#include "mojo/message_pump/message_pump_mojo.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/mojo/common/trace_controller_impl.cc b/mojo/common/trace_provider_impl.cc
similarity index 62%
rename from mojo/common/trace_controller_impl.cc
rename to mojo/common/trace_provider_impl.cc
index e08f88c..cc4fd77 100644
--- a/mojo/common/trace_controller_impl.cc
+++ b/mojo/common/trace_provider_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/common/trace_controller_impl.h"
+#include "mojo/common/trace_provider_impl.h"
 
 #include "base/logging.h"
 #include "base/trace_event/trace_config.h"
@@ -12,19 +12,18 @@
 
 namespace mojo {
 
-TraceControllerImpl::TraceControllerImpl(
-    InterfaceRequest<tracing::TraceController> request)
+TraceProviderImpl::TraceProviderImpl(
+    InterfaceRequest<tracing::TraceProvider> request)
     : tracing_already_started_(false), binding_(this, request.Pass()) {
 }
 
-TraceControllerImpl::~TraceControllerImpl() {
+TraceProviderImpl::~TraceProviderImpl() {
 }
 
-void TraceControllerImpl::StartTracing(
-    const String& categories,
-    tracing::TraceDataCollectorPtr collector) {
-  DCHECK(!collector_.get());
-  collector_ = collector.Pass();
+void TraceProviderImpl::StartTracing(const String& categories,
+                                     tracing::TraceRecorderPtr collector) {
+  DCHECK(!recorder_.get());
+  recorder_ = collector.Pass();
   if (!tracing_already_started_) {
     std::string categories_str = categories.To<std::string>();
     base::trace_event::TraceLog::GetInstance()->SetEnabled(
@@ -34,21 +33,21 @@
   }
 }
 
-void TraceControllerImpl::StopTracing() {
-  DCHECK(collector_);
+void TraceProviderImpl::StopTracing() {
+  DCHECK(recorder_);
   base::trace_event::TraceLog::GetInstance()->SetDisabled();
 
   base::trace_event::TraceLog::GetInstance()->Flush(
-      base::Bind(&TraceControllerImpl::SendChunk, base::Unretained(this)));
+      base::Bind(&TraceProviderImpl::SendChunk, base::Unretained(this)));
 }
 
-void TraceControllerImpl::SendChunk(
+void TraceProviderImpl::SendChunk(
     const scoped_refptr<base::RefCountedString>& events_str,
     bool has_more_events) {
-  DCHECK(collector_);
-  collector_->DataCollected(mojo::String(events_str->data()));
+  DCHECK(recorder_);
+  recorder_->Record(mojo::String(events_str->data()));
   if (!has_more_events) {
-    collector_.reset();
+    recorder_.reset();
   }
 }
 
diff --git a/mojo/common/trace_controller_impl.h b/mojo/common/trace_provider_impl.h
similarity index 63%
rename from mojo/common/trace_controller_impl.h
rename to mojo/common/trace_provider_impl.h
index 482f709..82735a5 100644
--- a/mojo/common/trace_controller_impl.h
+++ b/mojo/common/trace_provider_impl.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 MOJO_COMMON_TRACING_CONTROLLER_IMPL_H_
-#define MOJO_COMMON_TRACING_CONTROLLER_IMPL_H_
+#ifndef MOJO_COMMON_TRACE_PROVIDER_IMPL_H_
+#define MOJO_COMMON_TRACE_PROVIDER_IMPL_H_
 
 #include "base/memory/ref_counted_memory.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
@@ -12,11 +12,10 @@
 
 namespace mojo {
 
-class TraceControllerImpl : public tracing::TraceController {
+class TraceProviderImpl : public tracing::TraceProvider {
  public:
-  explicit TraceControllerImpl(
-      InterfaceRequest<tracing::TraceController> request);
-  ~TraceControllerImpl() override;
+  explicit TraceProviderImpl(InterfaceRequest<tracing::TraceProvider> request);
+  ~TraceProviderImpl() override;
 
   // Set to true if base::trace_event::TraceLog is enabled externally to this
   // class. If this is set to true this class will save the collector but not
@@ -27,21 +26,21 @@
   }
 
  private:
-  // tracing::TraceController implementation:
+  // tracing::TraceProvider implementation:
   void StartTracing(const String& categories,
-                    tracing::TraceDataCollectorPtr collector) override;
+                    tracing::TraceRecorderPtr collector) override;
   void StopTracing() override;
 
   void SendChunk(const scoped_refptr<base::RefCountedString>& events_str,
                  bool has_more_events);
 
   bool tracing_already_started_;
-  tracing::TraceDataCollectorPtr collector_;
-  StrongBinding<tracing::TraceController> binding_;
+  tracing::TraceRecorderPtr recorder_;
+  StrongBinding<tracing::TraceProvider> binding_;
 
-  DISALLOW_COPY_AND_ASSIGN(TraceControllerImpl);
+  DISALLOW_COPY_AND_ASSIGN(TraceProviderImpl);
 };
 
 }  // namespace mojo
 
-#endif  // MOJO_COMMON_TRACING_CONTROLLER_IMPL_H_
+#endif  // MOJO_COMMON_TRACE_PROVIDER_IMPL_H_
diff --git a/mojo/common/tracing_impl.cc b/mojo/common/tracing_impl.cc
index ec5dfa3..2a6eac1 100644
--- a/mojo/common/tracing_impl.cc
+++ b/mojo/common/tracing_impl.cc
@@ -5,7 +5,7 @@
 #include "mojo/common/tracing_impl.h"
 
 #include "base/trace_event/trace_event_impl.h"
-#include "mojo/common/trace_controller_impl.h"
+#include "mojo/common/trace_provider_impl.h"
 #include "mojo/public/cpp/application/application_connection.h"
 #include "mojo/public/cpp/application/application_impl.h"
 
@@ -23,8 +23,8 @@
 }
 
 void TracingImpl::Create(ApplicationConnection* connection,
-                         InterfaceRequest<tracing::TraceController> request) {
-  new TraceControllerImpl(request.Pass());
+                         InterfaceRequest<tracing::TraceProvider> request) {
+  new TraceProviderImpl(request.Pass());
 }
 
 }  // namespace mojo
diff --git a/mojo/common/tracing_impl.h b/mojo/common/tracing_impl.h
index e245bd6..a996d5c 100644
--- a/mojo/common/tracing_impl.h
+++ b/mojo/common/tracing_impl.h
@@ -13,7 +13,7 @@
 
 class ApplicationImpl;
 
-class TracingImpl : public InterfaceFactory<tracing::TraceController> {
+class TracingImpl : public InterfaceFactory<tracing::TraceProvider> {
  public:
   TracingImpl();
   ~TracingImpl() override;
@@ -23,9 +23,9 @@
   void Initialize(ApplicationImpl* app);
 
  private:
-  // InterfaceFactory<tracing::TraceController> implementation.
+  // InterfaceFactory<tracing::TraceProvider> implementation.
   void Create(ApplicationConnection* connection,
-              InterfaceRequest<tracing::TraceController> request) override;
+              InterfaceRequest<tracing::TraceProvider> request) override;
 
   DISALLOW_COPY_AND_ASSIGN(TracingImpl);
 };
diff --git a/mojo/converters/array_string/BUILD.gn b/mojo/converters/array_string/BUILD.gn
new file mode 100644
index 0000000..8a36103
--- /dev/null
+++ b/mojo/converters/array_string/BUILD.gn
@@ -0,0 +1,28 @@
+# 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.
+
+source_set("array_string") {
+  sources = [
+    "array_string_type_converters.cc",
+    "array_string_type_converters.h",
+  ]
+
+  deps = [
+    "//base",
+    "//mojo/public/cpp/bindings",
+  ]
+}
+
+source_set("tests") {
+  testonly = true
+  sources = [
+    "array_string_type_converters_unittest.cc",
+  ]
+
+  deps = [
+    ":array_string",
+    "//base",
+    "//testing/gtest",
+  ]
+}
diff --git a/mojo/converters/array_string/array_string_type_converters.cc b/mojo/converters/array_string/array_string_type_converters.cc
new file mode 100644
index 0000000..02019f0
--- /dev/null
+++ b/mojo/converters/array_string/array_string_type_converters.cc
@@ -0,0 +1,29 @@
+// 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.
+
+#include "mojo/converters/array_string/array_string_type_converters.h"
+
+#include <string>
+
+#include "base/strings/utf_string_conversions.h"
+
+namespace mojo {
+
+std::string TypeConverter<std::string, Array<uint8_t>>::Convert(
+    const Array<uint8_t>& input) {
+  if (input.is_null())
+    return std::string();
+
+  return std::string(reinterpret_cast<const char*>(&input.front()),
+                     input.size());
+}
+
+Array<uint8_t> TypeConverter<Array<uint8_t>, std::string>::Convert(
+    const std::string& input) {
+  Array<uint8_t> result(input.size());
+  memcpy(&result.front(), input.c_str(), input.size());
+  return result.Pass();
+}
+
+}  // namespace mojo
diff --git a/mojo/converters/array_string/array_string_type_converters.h b/mojo/converters/array_string/array_string_type_converters.h
new file mode 100644
index 0000000..f5e1996
--- /dev/null
+++ b/mojo/converters/array_string/array_string_type_converters.h
@@ -0,0 +1,32 @@
+// 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.
+
+#ifndef MOJO_CONVERTERS_ARRAY_STRING_ARRAY_STRING_TYPE_CONVERTERS_H_
+#define MOJO_CONVERTERS_ARRAY_STRING_ARRAY_STRING_TYPE_CONVERTERS_H_
+
+#include "base/strings/string16.h"
+#include "base/strings/string_piece.h"
+#include "mojo/public/cpp/bindings/array.h"
+#include "mojo/public/cpp/bindings/string.h"
+#include "mojo/public/cpp/bindings/type_converter.h"
+
+namespace mojo {
+
+// TODO(erg): In the very long term, we will want to remove conversion between
+// std::strings and arrays of unsigned bytes. However, there is too much code
+// across chrome which uses std::string as a bag of bytes that we probably
+// don't want to roll this function at each callsite.
+template <>
+struct TypeConverter<std::string, Array<uint8_t>> {
+  static std::string Convert(const Array<uint8_t>& input);
+};
+
+template <>
+struct TypeConverter<Array<uint8_t>, std::string> {
+  static Array<uint8_t> Convert(const std::string& input);
+};
+
+}  // namespace mojo
+
+#endif  // MOJO_CONVERTERS_ARRAY_STRING_ARRAY_STRING_TYPE_CONVERTERS_H_
diff --git a/mojo/converters/array_string/array_string_type_converters_unittest.cc b/mojo/converters/array_string/array_string_type_converters_unittest.cc
new file mode 100644
index 0000000..a28f571
--- /dev/null
+++ b/mojo/converters/array_string/array_string_type_converters_unittest.cc
@@ -0,0 +1,38 @@
+// 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.
+
+#include "mojo/converters/array_string/array_string_type_converters.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace mojo {
+namespace common {
+namespace test {
+namespace {
+
+TEST(CommonTypeConvertersTest, ArrayUint8ToStdString) {
+  Array<uint8_t> data(4);
+  data[0] = 'd';
+  data[1] = 'a';
+  data[2] = 't';
+  data[3] = 'a';
+
+  EXPECT_EQ("data", data.To<std::string>());
+}
+
+TEST(CommonTypeConvertersTest, StdStringToArrayUint8) {
+  std::string input("data");
+  Array<uint8_t> data = Array<uint8_t>::From(input);
+
+  ASSERT_EQ(4ul, data.size());
+  EXPECT_EQ('d', data[0]);
+  EXPECT_EQ('a', data[1]);
+  EXPECT_EQ('t', data[2]);
+  EXPECT_EQ('a', data[3]);
+}
+
+}  // namespace
+}  // namespace test
+}  // namespace common
+}  // namespace mojo
diff --git a/mojo/converters/base/BUILD.gn b/mojo/converters/base/BUILD.gn
new file mode 100644
index 0000000..3779edf
--- /dev/null
+++ b/mojo/converters/base/BUILD.gn
@@ -0,0 +1,30 @@
+# 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.
+
+source_set("base") {
+  sources = [
+    "base_type_converters.cc",
+    "base_type_converters.h",
+  ]
+
+  deps = [
+    "//base",
+    "//mojo/public/cpp/bindings",
+  ]
+}
+
+source_set("tests") {
+  testonly = true
+
+  sources = [
+    "base_type_converters_unittest.cc",
+  ]
+
+  deps = [
+    ":base",
+    "//base",
+    "//mojo/public/cpp/bindings",
+    "//testing/gtest",
+  ]
+}
diff --git a/mojo/converters/base/base_type_converters.cc b/mojo/converters/base/base_type_converters.cc
new file mode 100644
index 0000000..d4649ce
--- /dev/null
+++ b/mojo/converters/base/base_type_converters.cc
@@ -0,0 +1,40 @@
+// 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.
+
+#include "mojo/converters/base/base_type_converters.h"
+
+#include <string>
+
+#include "base/strings/utf_string_conversions.h"
+
+namespace mojo {
+
+// static
+String TypeConverter<String, base::StringPiece>::Convert(
+    const base::StringPiece& input) {
+  if (input.empty()) {
+    char c = 0;
+    return String(&c, 0);
+  }
+  return String(input.data(), input.size());
+}
+// static
+base::StringPiece TypeConverter<base::StringPiece, String>::Convert(
+    const String& input) {
+  return input.get();
+}
+
+// static
+String TypeConverter<String, base::string16>::Convert(
+    const base::string16& input) {
+  return TypeConverter<String, base::StringPiece>::Convert(
+      base::UTF16ToUTF8(input));
+}
+// static
+base::string16 TypeConverter<base::string16, String>::Convert(
+    const String& input) {
+  return base::UTF8ToUTF16(input.To<base::StringPiece>());
+}
+
+}  // namespace mojo
diff --git a/mojo/converters/base/base_type_converters.h b/mojo/converters/base/base_type_converters.h
new file mode 100644
index 0000000..c83bc90
--- /dev/null
+++ b/mojo/converters/base/base_type_converters.h
@@ -0,0 +1,38 @@
+// 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.
+
+#ifndef MOJO_CONVERTERS_BASE_BASE_TYPE_CONVERTERS_H_
+#define MOJO_CONVERTERS_BASE_BASE_TYPE_CONVERTERS_H_
+
+#include "base/strings/string16.h"
+#include "base/strings/string_piece.h"
+#include "mojo/public/cpp/bindings/array.h"
+#include "mojo/public/cpp/bindings/string.h"
+#include "mojo/public/cpp/bindings/type_converter.h"
+
+namespace mojo {
+
+template <>
+struct TypeConverter<String, base::StringPiece> {
+  static String Convert(const base::StringPiece& input);
+};
+
+template <>
+struct TypeConverter<base::StringPiece, String> {
+  static base::StringPiece Convert(const String& input);
+};
+
+template <>
+struct TypeConverter<String, base::string16> {
+  static String Convert(const base::string16& input);
+};
+
+template <>
+struct TypeConverter<base::string16, String> {
+  static base::string16 Convert(const String& input);
+};
+
+}  // namespace mojo
+
+#endif  // MOJO_CONVERTERS_BASE_BASE_TYPE_CONVERTERS_H_
diff --git a/mojo/converters/base/base_type_converters_unittest.cc b/mojo/converters/base/base_type_converters_unittest.cc
new file mode 100644
index 0000000..351eebc
--- /dev/null
+++ b/mojo/converters/base/base_type_converters_unittest.cc
@@ -0,0 +1,66 @@
+// 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.
+
+#include "mojo/converters/base/base_type_converters.h"
+
+#include "base/bind.h"
+#include "base/strings/utf_string_conversions.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace mojo {
+namespace {
+
+void ExpectEqualsStringPiece(const std::string& expected,
+                             const base::StringPiece& str) {
+  EXPECT_EQ(expected, str.as_string());
+}
+
+void ExpectEqualsMojoString(const std::string& expected, const String& str) {
+  EXPECT_EQ(expected, str.get());
+}
+
+void ExpectEqualsString16(const base::string16& expected,
+                          const base::string16& actual) {
+  EXPECT_EQ(expected, actual);
+}
+
+void ExpectEqualsMojoString(const base::string16& expected, const String& str) {
+  EXPECT_EQ(expected, str.To<base::string16>());
+}
+
+TEST(BaseTypeConvertersTest, StringPiece) {
+  std::string kText("hello world");
+
+  base::StringPiece string_piece(kText);
+  String mojo_string(String::From(string_piece));
+
+  ExpectEqualsMojoString(kText, mojo_string);
+  ExpectEqualsStringPiece(kText, mojo_string.To<base::StringPiece>());
+
+  // Test implicit construction and conversion:
+  ExpectEqualsMojoString(kText, String::From(string_piece));
+  ExpectEqualsStringPiece(kText, mojo_string.To<base::StringPiece>());
+
+  // Test null String:
+  base::StringPiece empty_string_piece = String().To<base::StringPiece>();
+  EXPECT_TRUE(empty_string_piece.empty());
+}
+
+TEST(BaseTypeConvertersTest, String16) {
+  const base::string16 string16(base::ASCIIToUTF16("hello world"));
+  const String mojo_string(String::From(string16));
+
+  ExpectEqualsMojoString(string16, mojo_string);
+  EXPECT_EQ(string16, mojo_string.To<base::string16>());
+
+  // Test implicit construction and conversion:
+  ExpectEqualsMojoString(string16, String::From(string16));
+  ExpectEqualsString16(string16, mojo_string.To<base::string16>());
+
+  // Test empty string conversion.
+  ExpectEqualsMojoString(base::string16(), String::From(base::string16()));
+}
+
+}  // namespace
+}  // namespace mojo
diff --git a/mojo/converters/url/BUILD.gn b/mojo/converters/url/BUILD.gn
new file mode 100644
index 0000000..4082c67
--- /dev/null
+++ b/mojo/converters/url/BUILD.gn
@@ -0,0 +1,30 @@
+# 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.
+
+source_set("url") {
+  sources = [
+    "url_type_converters.cc",
+    "url_type_converters.h",
+  ]
+
+  deps = [
+    "//mojo/public/cpp/bindings",
+    "//url",
+  ]
+}
+
+source_set("tests") {
+  testonly = true
+
+  sources = [
+    "url_type_converters_unittest.cc",
+  ]
+
+  deps = [
+    ":url",
+    "//mojo/public/cpp/bindings",
+    "//testing/gtest",
+    "//url",
+  ]
+}
diff --git a/mojo/converters/url/url_type_converters.cc b/mojo/converters/url/url_type_converters.cc
new file mode 100644
index 0000000..8b504ff
--- /dev/null
+++ b/mojo/converters/url/url_type_converters.cc
@@ -0,0 +1,19 @@
+// 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.
+
+#include "mojo/converters/url/url_type_converters.h"
+
+#include "url/gurl.h"
+
+namespace mojo {
+
+String TypeConverter<String, GURL>::Convert(const GURL& input) {
+  return String(input.spec());
+}
+
+GURL TypeConverter<GURL, String>::Convert(const String& input) {
+  return GURL(input.get());
+}
+
+}  // namespace mojo
diff --git a/mojo/converters/url/url_type_converters.h b/mojo/converters/url/url_type_converters.h
new file mode 100644
index 0000000..7842d54
--- /dev/null
+++ b/mojo/converters/url/url_type_converters.h
@@ -0,0 +1,26 @@
+// 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.
+
+#ifndef MOJO_CONVERTERS_URL_URL_TYPE_CONVERTERS_H_
+#define MOJO_CONVERTERS_URL_URL_TYPE_CONVERTERS_H_
+
+#include "mojo/public/cpp/bindings/type_converter.h"
+#include "mojo/public/cpp/bindings/string.h"
+
+class GURL;
+
+namespace mojo {
+template <>
+struct TypeConverter<String, GURL> {
+  static String Convert(const GURL& input);
+};
+
+template <>
+struct TypeConverter<GURL, String> {
+  static GURL Convert(const String& input);
+};
+
+}  // namespace mojo
+
+#endif  // MOJO_CONVERTERS_URL_URL_TYPE_CONVERTERS_H_
diff --git a/mojo/converters/url/url_type_converters_unittest.cc b/mojo/converters/url/url_type_converters_unittest.cc
new file mode 100644
index 0000000..bc94074
--- /dev/null
+++ b/mojo/converters/url/url_type_converters_unittest.cc
@@ -0,0 +1,31 @@
+// 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.
+
+#include "mojo/converters/url/url_type_converters.h"
+
+#include "mojo/public/cpp/bindings/string.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace mojo {
+namespace {
+
+TEST(UrlTypeConvertersTest, URL) {
+  GURL url("mojo:foo");
+  String mojo_string(String::From(url));
+
+  ASSERT_EQ(url.spec(), mojo_string);
+  EXPECT_EQ(url.spec(), mojo_string.To<GURL>().spec());
+  EXPECT_EQ(url.spec(), String::From(url));
+
+  GURL invalid = String().To<GURL>();
+  ASSERT_TRUE(invalid.spec().empty());
+
+  String string_from_invalid = String::From(invalid);
+  EXPECT_FALSE(string_from_invalid.is_null());
+  ASSERT_EQ(0U, string_from_invalid.size());
+}
+
+}  // namespace
+}  // namespace mojo
diff --git a/mojo/dart/BUILD.gn b/mojo/dart/BUILD.gn
new file mode 100644
index 0000000..88cc7fe
--- /dev/null
+++ b/mojo/dart/BUILD.gn
@@ -0,0 +1,14 @@
+# 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.
+
+group("dart") {
+  deps = [
+    "//mojo/dart/apptest",
+    "//mojo/dart/dart_snapshotter($host_toolchain)",
+    "//mojo/dart/http_load_test",
+    "//mojo/dart/mojom",
+    "//mojo/dart/mojo_services",
+    "//mojo/dart/observatory_test",
+  ]
+}
diff --git a/mojo/dart/apptest/BUILD.gn b/mojo/dart/apptest/BUILD.gn
index 8d4092f..36e25c4 100644
--- a/mojo/dart/apptest/BUILD.gn
+++ b/mojo/dart/apptest/BUILD.gn
@@ -4,24 +4,13 @@
 
 import("//mojo/public/dart/rules.gni")
 
-dartzip_package("apptest") {
-  uses_pub = true
+dart_pkg("apptest") {
+  libs = [ "lib/apptest.dart" ]
   sources = [
-    "lib/apptest.dart",
     "pubspec.yaml",
   ]
   deps = [
     "//mojo/public/dart",
-  ]
-}
-
-dart_pkg("apptest_pkg") {
-  entrypoints = [ "lib/apptest.dart" ]
-  sources = [
-    "pubspec.yaml",
-  ]
-  deps = [
-    "//mojo/public/dart:mojo",
     "//third_party/dart-pkg",
   ]
 }
diff --git a/mojo/dart/apptest/lib/apptest.dart b/mojo/dart/apptest/lib/apptest.dart
index 9d02309..96c76f0 100644
--- a/mojo/dart/apptest/lib/apptest.dart
+++ b/mojo/dart/apptest/lib/apptest.dart
@@ -10,8 +10,7 @@
 import 'package:mojo/bindings.dart';
 import 'package:mojo/core.dart';
 
-// Import and reexport the test package. We are a *.dartzip file designed to
-// be linked into your_apptest.mojo file and are your main entrypoint.
+// Import and reexport the test package.
 import 'package:test/test.dart';
 export 'package:test/test.dart';
 
diff --git a/mojo/dart/dart_snapshotter/BUILD.gn b/mojo/dart/dart_snapshotter/BUILD.gn
new file mode 100644
index 0000000..4174569
--- /dev/null
+++ b/mojo/dart/dart_snapshotter/BUILD.gn
@@ -0,0 +1,27 @@
+# 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.
+
+executable("dart_snapshotter") {
+  sources = [
+    "main.cc",
+    "vm.cc",
+    "vm.h",
+  ]
+
+  deps = [
+    "//base",
+    "//build/config/sanitizers:deps",
+    "//dart/runtime/vm:libdart_platform",
+    "//dart/runtime:libdart",
+    "//mojo/common",
+    "//mojo/dart/embedder:dart_snapshot_cc",
+    "//mojo/edk/system",
+    "//mojo/environment:chromium",
+    "//mojo/public/cpp/system",
+    "//mojo/public/cpp/utility",
+    "//mojo/public/interfaces/application",
+    "//third_party/zlib",
+    "//tonic",
+  ]
+}
diff --git a/mojo/dart/dart_snapshotter/main.cc b/mojo/dart/dart_snapshotter/main.cc
new file mode 100644
index 0000000..48e5341
--- /dev/null
+++ b/mojo/dart/dart_snapshotter/main.cc
@@ -0,0 +1,100 @@
+// 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.
+
+#include <iostream>
+
+#include "base/at_exit.h"
+#include "base/basictypes.h"
+#include "base/command_line.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/logging.h"
+#include "base/process/memory.h"
+#include "dart/runtime/include/dart_api.h"
+#include "mojo/dart/dart_snapshotter/vm.h"
+#include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/simple_platform_support.h"
+#include "tonic/dart_error.h"
+#include "tonic/dart_isolate_scope.h"
+#include "tonic/dart_library_loader.h"
+#include "tonic/dart_library_provider_files.h"
+#include "tonic/dart_script_loader_sync.h"
+#include "tonic/dart_state.h"
+
+const char kHelp[] = "help";
+const char kPackageRoot[] = "package-root";
+const char kSnapshot[] = "snapshot";
+
+const uint8_t magic_number[] = { 0xf5, 0xf5, 0xdc, 0xdc };
+
+void Usage() {
+  std::cerr << "Usage: dart_snapshotter"
+            << " --" << kPackageRoot << " --" << kSnapshot
+            << " <dart-app>" << std::endl;
+}
+
+void WriteSnapshot(base::FilePath path) {
+  uint8_t* buffer;
+  intptr_t size;
+  CHECK(!tonic::LogIfError(Dart_CreateScriptSnapshot(&buffer, &size)));
+
+  intptr_t magic_number_len = sizeof(magic_number);
+  CHECK_EQ(base::WriteFile(
+      path, reinterpret_cast<const char*>(magic_number), sizeof(magic_number)),
+      magic_number_len);
+  CHECK(base::AppendToFile(
+      path, reinterpret_cast<const char*>(buffer), size));
+}
+
+int main(int argc, const char* argv[]) {
+  base::AtExitManager exit_manager;
+  base::EnableTerminationOnHeapCorruption();
+  base::CommandLine::Init(argc, argv);
+
+  const base::CommandLine& command_line =
+      *base::CommandLine::ForCurrentProcess();
+
+  if (command_line.HasSwitch(kHelp) || command_line.GetArgs().empty()) {
+    Usage();
+    return 0;
+  }
+
+  // Initialize mojo.
+  mojo::embedder::Init(
+      make_scoped_ptr(new mojo::embedder::SimplePlatformSupport()));
+
+  InitDartVM();
+
+  CHECK(command_line.HasSwitch(kPackageRoot)) << "Need --package-root";
+  CHECK(command_line.HasSwitch(kSnapshot)) << "Need --snapshot";
+  auto args = command_line.GetArgs();
+  CHECK(args.size() == 1);
+
+  Dart_Isolate isolate = CreateDartIsolate();
+  CHECK(isolate);
+
+  tonic::DartIsolateScope scope(isolate);
+  tonic::DartApiScope api_scope;
+
+  auto isolate_data = SnapshotterDartState::Current();
+  CHECK(isolate_data != nullptr);
+
+  // Use tonic's library tag handler.
+  CHECK(!tonic::LogIfError(Dart_SetLibraryTagHandler(
+            tonic::DartLibraryLoader::HandleLibraryTag)));
+
+  // Use tonic's file system library provider.
+  isolate_data->set_library_provider(
+      new tonic::DartLibraryProviderFiles(
+          command_line.GetSwitchValuePath(kPackageRoot)));
+
+  // Load script.
+  tonic::DartScriptLoaderSync::LoadScript(args[0],
+                                          isolate_data->library_provider());
+
+  // Write snapshot.
+  WriteSnapshot(command_line.GetSwitchValuePath(kSnapshot));
+
+  return 0;
+}
diff --git a/mojo/dart/dart_snapshotter/test/dart_snapshotter_test.py b/mojo/dart/dart_snapshotter/test/dart_snapshotter_test.py
new file mode 100755
index 0000000..60fb145
--- /dev/null
+++ b/mojo/dart/dart_snapshotter/test/dart_snapshotter_test.py
@@ -0,0 +1,83 @@
+#!/usr/bin/env python
+# 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.
+
+import argparse
+import hashlib
+import os
+import subprocess
+import sys
+import tempfile
+
+SNAPSHOT_TEST_DIR = os.path.dirname(os.path.abspath(__file__))
+SRC_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(
+    SNAPSHOT_TEST_DIR))))
+DART_DIR = os.path.join(SRC_ROOT, 'dart')
+
+VM_SNAPSHOT_FILES=[
+  # Header files.
+  'datastream.h',
+  'object.h',
+  'raw_object.h',
+  'snapshot.h',
+  'snapshot_ids.h',
+  'symbols.h',
+  # Source files.
+  'dart.cc',
+  'dart_api_impl.cc',
+  'object.cc',
+  'raw_object.cc',
+  'raw_object_snapshot.cc',
+  'snapshot.cc',
+  'symbols.cc',
+]
+
+def makeSnapshotHashString():
+  vmhash = hashlib.md5()
+  for vmfilename in VM_SNAPSHOT_FILES:
+    vmfilepath = os.path.join(DART_DIR, 'runtime', 'vm', vmfilename)
+    with open(vmfilepath) as vmfile:
+      vmhash.update(vmfile.read())
+  return vmhash.hexdigest()
+
+def main():
+  parser = argparse.ArgumentParser(description='Tests Dart snapshotting')
+  parser.add_argument("--build-dir",
+                      dest="build_dir",
+                      metavar="<build-directory>",
+                      type=str,
+                      required=True,
+                      help="The directory containing the Mojo build.")
+  args = parser.parse_args()
+  dart_snapshotter = os.path.join(args.build_dir, 'dart_snapshotter')
+  package_root = os.path.join(args.build_dir, 'gen', 'dart-pkg', 'packages')
+  main_dart = os.path.join(
+      args.build_dir, 'gen', 'dart-pkg', 'mojo_dart_hello', 'lib', 'main.dart')
+  snapshot = tempfile.mktemp()
+
+  if not os.path.isfile(dart_snapshotter):
+    print "file not found: " + dart_snapshotter
+    return 1
+  subprocess.check_call([
+    dart_snapshotter,
+    main_dart,
+    '--package-root=%s' % package_root,
+    '--snapshot=%s' % snapshot,
+  ])
+  if not os.path.isfile(snapshot):
+    return 1
+
+  expected_hash = makeSnapshotHashString()
+  actual_hash = ""
+  with open(snapshot) as snapshot_file:
+    snapshot_file.seek(20)
+    actual_hash = snapshot_file.read(32)
+  if not actual_hash == expected_hash:
+    print ('wrong hash: actual = %s, expected = %s'
+           % (actual_hash, expected_hash))
+    return 1
+  return 0
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/mojo/dart/dart_snapshotter/vm.cc b/mojo/dart/dart_snapshotter/vm.cc
new file mode 100644
index 0000000..f95cf5a
--- /dev/null
+++ b/mojo/dart/dart_snapshotter/vm.cc
@@ -0,0 +1,44 @@
+// 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.
+
+#include "mojo/dart/dart_snapshotter/vm.h"
+
+#include "base/logging.h"
+#include "tonic/dart_error.h"
+#include "tonic/dart_state.h"
+
+namespace mojo {
+namespace dart {
+extern const uint8_t* vm_isolate_snapshot_buffer;
+extern const uint8_t* isolate_snapshot_buffer;
+}
+}
+
+static const char* kDartArgs[] = {
+    "--enable_mirrors=false",
+};
+
+void InitDartVM() {
+  CHECK(Dart_SetVMFlags(arraysize(kDartArgs), kDartArgs));
+  CHECK(Dart_Initialize(mojo::dart::vm_isolate_snapshot_buffer, nullptr,
+                        nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+                        nullptr, nullptr));
+}
+
+Dart_Isolate CreateDartIsolate() {
+  CHECK(mojo::dart::isolate_snapshot_buffer);
+  char* error = nullptr;
+  auto isolate_data = new SnapshotterDartState();
+  CHECK(isolate_data != nullptr);
+  Dart_Isolate isolate = Dart_CreateIsolate("dart:snapshot",
+                                            "main",
+                                            mojo::dart::isolate_snapshot_buffer,
+                                            nullptr,
+                                            isolate_data,
+                                            &error);
+  CHECK(isolate) << error;
+  Dart_ExitIsolate();
+  isolate_data->SetIsolate(isolate);
+  return isolate;
+}
diff --git a/mojo/dart/dart_snapshotter/vm.h b/mojo/dart/dart_snapshotter/vm.h
new file mode 100644
index 0000000..f6330dc
--- /dev/null
+++ b/mojo/dart/dart_snapshotter/vm.h
@@ -0,0 +1,45 @@
+// 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.
+
+#ifndef MOJO_DART_DART_SNAPSHOTTER_VM_H_
+#define MOJO_DART_DART_SNAPSHOTTER_VM_H_
+
+#include "dart/runtime/include/dart_api.h"
+#include "tonic/dart_library_provider.h"
+#include "tonic/dart_state.h"
+
+class SnapshotterDartState : public tonic::DartState {
+ public:
+  SnapshotterDartState() : library_provider_(nullptr) {
+  };
+
+  tonic::DartLibraryProvider* library_provider() const {
+    return library_provider_.get();
+  }
+
+  void set_library_provider(tonic::DartLibraryProvider* library_provider) {
+    library_provider_.reset(library_provider);
+    DCHECK(library_provider_.get() == library_provider);
+  }
+
+  static SnapshotterDartState* From(Dart_Isolate isolate) {
+    return reinterpret_cast<SnapshotterDartState*>(DartState::From(isolate));
+  }
+
+  static SnapshotterDartState* Current() {
+    return reinterpret_cast<SnapshotterDartState*>(DartState::Current());
+  }
+
+  static SnapshotterDartState* Cast(void* data) {
+    return reinterpret_cast<SnapshotterDartState*>(data);
+  }
+
+ private:
+  std::unique_ptr<tonic::DartLibraryProvider> library_provider_;
+};
+
+void InitDartVM();
+Dart_Isolate CreateDartIsolate();
+
+#endif  // MOJO_DART_DART_SNAPSHOTTER_VM_H_
diff --git a/mojo/dart/embedder/BUILD.gn b/mojo/dart/embedder/BUILD.gn
index ba1e858..d21d1ae 100644
--- a/mojo/dart/embedder/BUILD.gn
+++ b/mojo/dart/embedder/BUILD.gn
@@ -43,7 +43,7 @@
     "//dart/runtime:libdart",
     "//dart/runtime/bin:libdart_embedder_noio",
     "//third_party/dart-pkg",
-    "//mojo/common",
+    "//mojo/message_pump",
     "//mojo/public/c/system",
     "//mojo/public/cpp/system",
     "//mojo/services/network/public/interfaces",
@@ -410,3 +410,13 @@
     rebase_path(output),
   ]
 }
+
+source_set("dart_snapshot_cc") {
+  sources = [
+    "$root_gen_dir/dart_snapshot.cc",
+  ]
+
+  deps = [
+    ":generate_snapshot_file",
+  ]
+}
diff --git a/mojo/dart/embedder/dart_controller.cc b/mojo/dart/embedder/dart_controller.cc
index ff64c9c..ad86db9 100644
--- a/mojo/dart/embedder/dart_controller.cc
+++ b/mojo/dart/embedder/dart_controller.cc
@@ -13,11 +13,11 @@
 #include "base/sys_info.h"
 #include "dart/runtime/include/dart_api.h"
 #include "dart/runtime/include/dart_native_api.h"
-#include "mojo/common/message_pump_mojo.h"
 #include "mojo/dart/embedder/builtin.h"
 #include "mojo/dart/embedder/dart_controller.h"
 #include "mojo/dart/embedder/mojo_dart_state.h"
 #include "mojo/dart/embedder/vmservice.h"
+#include "mojo/message_pump/message_pump_mojo.h"
 #include "mojo/public/c/system/core.h"
 #include "tonic/dart_converter.h"
 #include "tonic/dart_debugger.h"
@@ -27,6 +27,7 @@
 #include "tonic/dart_library_provider.h"
 #include "tonic/dart_library_provider_files.h"
 #include "tonic/dart_library_provider_network.h"
+#include "tonic/dart_script_loader_sync.h"
 
 namespace mojo {
 namespace dart {
@@ -39,6 +40,8 @@
 static const char* kIsolateLibURL = "dart:isolate";
 static const char* kCoreLibURL = "dart:core";
 
+static uint8_t snapshot_magic_number[] = { 0xf5, 0xf5, 0xdc, 0xdc };
+
 static Dart_Handle SetWorkingDirectory(Dart_Handle builtin_lib) {
   base::FilePath current_dir;
   PathService::Get(base::DIR_CURRENT, &current_dir);
@@ -299,6 +302,8 @@
     } else {
       package_root_str = package_root.c_str();
     }
+    isolate_data->library_loader().set_magic_number(
+        snapshot_magic_number, sizeof(snapshot_magic_number));
     if (use_network_loader) {
       mojo::NetworkService* network_service = isolate_data->network_service();
       isolate_data->set_library_provider(
@@ -349,12 +354,21 @@
       // Special case for starting and stopping the the handle watcher isolate.
       LoadEmptyScript(script_uri);
     } else {
-      LoadScript(script_uri, isolate_data->library_provider());
+      tonic::DartScriptLoaderSync::LoadScript(
+          script_uri,
+          isolate_data->library_provider());
     }
 
     InitializeDartMojoIo();
   }
 
+  if (isolate_data->library_loader().error_during_loading()) {
+    *error = strdup("Library loader reported error during loading. See log.");
+    Dart_EnterIsolate(isolate);
+    Dart_ShutdownIsolate();
+    return nullptr;
+  }
+
   // Make the isolate runnable so that it is ready to handle messages.
   bool retval = Dart_IsolateMakeRunnable(isolate);
   if (!retval) {
@@ -606,34 +620,24 @@
                            nullptr, nullptr, nullptr, nullptr,
                            entropy);
   CHECK(result);
+  initialized_ = true;
+}
+
+void DartController::BlockForServiceIsolate() {
+  base::AutoLock al(lock_);
+  BlockForServiceIsolateLocked();
+}
+
+void DartController::BlockForServiceIsolateLocked() {
+  if (service_isolate_running_) {
+    return;
+  }
   // By waiting for the load port, we ensure that the service isolate is fully
   // running before returning.
   Dart_ServiceWaitForLoadPort();
-  initialized_ = true;
   service_isolate_running_ = true;
 }
 
-void DartController::BlockWaitingForDependencies(
-      tonic::DartLibraryLoader* loader,
-      const std::unordered_set<tonic::DartDependency*>& dependencies) {
-  {
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner =
-        base::MessageLoop::current()->task_runner();
-    base::RunLoop run_loop;
-    task_runner->PostTask(
-        FROM_HERE,
-        base::Bind(
-            &tonic::DartLibraryLoader::WaitForDependencies,
-            base::Unretained(loader),
-            dependencies,
-            base::Bind(
-               base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
-               task_runner.get(), FROM_HERE,
-               run_loop.QuitClosure())));
-    run_loop.Run();
-  }
-}
-
 void DartController::LoadEmptyScript(const std::string& script_uri) {
   Dart_Handle uri = Dart_NewStringFromUTF8(
       reinterpret_cast<const uint8_t*>(script_uri.c_str()),
@@ -646,60 +650,11 @@
   tonic::LogIfError(Dart_FinalizeLoading(true));
 }
 
-void DartController::InnerLoadScript(
-    const std::string& script_uri,
-    tonic::DartLibraryProvider* library_provider) {
-  // When spawning isolates, Dart expects the script loading to be completed
-  // before returning from the isolate creation callback. The mojo dart
-  // controller also expects the isolate to be finished loading a script
-  // before the isolate creation callback returns.
-
-  // We block here by creating a nested message pump and waiting for the load
-  // to complete.
-
-  DCHECK(base::MessageLoop::current() != nullptr);
-  base::MessageLoop::ScopedNestableTaskAllower allow(
-      base::MessageLoop::current());
-
-  // Initiate the load.
-  auto dart_state = tonic::DartState::Current();
-  DCHECK(library_provider != nullptr);
-  tonic::DartLibraryLoader& loader = dart_state->library_loader();
-  loader.set_library_provider(library_provider);
-  std::unordered_set<tonic::DartDependency*> dependencies;
-  {
-    tonic::DartDependencyCatcher dependency_catcher(loader);
-    loader.LoadScript(script_uri);
-    // Copy dependencies before dependency_catcher goes out of scope.
-    dependencies = std::unordered_set<tonic::DartDependency*>(
-        dependency_catcher.dependencies());
-  }
-
-  // Run inner message loop.
-  BlockWaitingForDependencies(&loader, dependencies);
-
-  // Finalize loading.
-  tonic::LogIfError(Dart_FinalizeLoading(true));
-}
-
-void DartController::LoadScript(const std::string& script_uri,
-                                tonic::DartLibraryProvider* library_provider) {
-  if (base::MessageLoop::current() == nullptr) {
-    // Threads running on the Dart thread pool may not have a message loop,
-    // we rely on a message loop during loading. Create a temporary one
-    // here.
-    base::MessageLoop message_loop(common::MessagePumpMojo::Create());
-    InnerLoadScript(script_uri, library_provider);
-  } else {
-    // Thread has a message loop, use it.
-    InnerLoadScript(script_uri, library_provider);
-  }
-}
-
 bool DartController::RunSingleDartScript(const DartControllerConfig& config) {
   InitVmIfNeeded(config.entropy,
                  config.vm_flags,
                  config.vm_flags_count);
+  BlockForServiceIsolate();
   Dart_Isolate isolate = CreateIsolateHelper(config.application_data,
                                              config.strict_compilation,
                                              config.callbacks,
@@ -735,6 +690,7 @@
 }
 
 bool DartController::RunDartScript(const DartControllerConfig& config) {
+  BlockForServiceIsolate();
   CHECK(service_isolate_running_);
   const bool strict = strict_compilation_ || config.strict_compilation;
   Dart_Isolate isolate = CreateIsolateHelper(config.application_data,
@@ -762,6 +718,7 @@
   if (!initialized_) {
     return;
   }
+  BlockForServiceIsolateLocked();
   StopHandleWatcherIsolate();
   Dart_Cleanup();
   service_isolate_running_ = false;
diff --git a/mojo/dart/embedder/dart_controller.h b/mojo/dart/embedder/dart_controller.h
index b0b53a9..4664680 100644
--- a/mojo/dart/embedder/dart_controller.h
+++ b/mojo/dart/embedder/dart_controller.h
@@ -156,14 +156,10 @@
                              const char** arguments,
                              int arguments_count);
 
-  static void BlockWaitingForDependencies(
-      tonic::DartLibraryLoader* loader,
-      const std::unordered_set<tonic::DartDependency*>& dependencies);
+  static void BlockForServiceIsolate();
+  static void BlockForServiceIsolateLocked();
+
   static void LoadEmptyScript(const std::string& script_uri);
-  static void InnerLoadScript(const std::string& script_uri,
-                              tonic::DartLibraryProvider* library_provider);
-  static void LoadScript(const std::string& script_uri,
-                         tonic::DartLibraryProvider* library_provider);
 
   static tonic::DartLibraryProvider* library_provider_;
   static base::Lock lock_;
diff --git a/mojo/dart/embedder/io/mojo_patch.dart b/mojo/dart/embedder/io/mojo_patch.dart
index c31c5fb..d49c6c4 100644
--- a/mojo/dart/embedder/io/mojo_patch.dart
+++ b/mojo/dart/embedder/io/mojo_patch.dart
@@ -91,9 +91,14 @@
         r += '${digit}${divider}';
       }
     } else {
-      for (var i = 0; i < 16; i++) {
-        var digit = address[i].toRadixString(16);
-        var divider = (i != 15) ? ':' : '';
+      for (var i = 0; i < 16; i += 2) {
+        var first = '';
+        if (address[i] != 0) {
+          first = address[i].toRadixString(16).padLeft(2, '0');
+        }
+        var second = address[i + 1].toRadixString(16).padLeft(2, '0');
+        var digit = '$first$second';
+        var divider = (i != 14) ? ':' : '';
         r += '${digit}${divider}';
       }
     }
diff --git a/mojo/dart/embedder/mojo_dart_state.h b/mojo/dart/embedder/mojo_dart_state.h
index 6ebd27c..a0792ee 100644
--- a/mojo/dart/embedder/mojo_dart_state.h
+++ b/mojo/dart/embedder/mojo_dart_state.h
@@ -111,4 +111,4 @@
 }  // namespace dart
 }  // namespace mojo
 
-#endif  // MOJO_DART_EMBEDDER_DART_STATE_H_
\ No newline at end of file
+#endif  // MOJO_DART_EMBEDDER_DART_STATE_H_
diff --git a/mojo/dart/embedder/test/BUILD.gn b/mojo/dart/embedder/test/BUILD.gn
index 87395a3..2b2d429 100644
--- a/mojo/dart/embedder/test/BUILD.gn
+++ b/mojo/dart/embedder/test/BUILD.gn
@@ -22,7 +22,7 @@
     "validation_unittest.cc",
   ]
   deps = [
-    "//mojo/public/dart:mojo",
+    "//mojo/public/dart",
     "//mojo/dart/testing",
     ":dart_controller_for_test",
     ":dart_to_cpp_unittests",
diff --git a/mojo/dart/http_load_test/BUILD.gn b/mojo/dart/http_load_test/BUILD.gn
new file mode 100644
index 0000000..67b1688
--- /dev/null
+++ b/mojo/dart/http_load_test/BUILD.gn
@@ -0,0 +1,20 @@
+# 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.
+
+import("//mojo/public/dart/rules.gni")
+
+dart_pkg("http_load_test") {
+  apps = [ [
+        "dart_http_load_test",
+        "lib/main.dart",
+      ] ]
+  sources = [
+    "lib/src/part0.dart",
+    "pubspec.yaml",
+  ]
+  deps = [
+    "//mojo/public/dart",
+    "//mojo/dart/mojo_services",
+  ]
+}
diff --git a/mojo/dart/http_load_test/tester.dart b/mojo/dart/http_load_test/bin/tester.dart
similarity index 79%
rename from mojo/dart/http_load_test/tester.dart
rename to mojo/dart/http_load_test/bin/tester.dart
index 70eb61b..e269272 100644
--- a/mojo/dart/http_load_test/tester.dart
+++ b/mojo/dart/http_load_test/bin/tester.dart
@@ -17,19 +17,20 @@
 
     // Completer completes once the child process exits.
     var completer = new Completer();
-    String stdout = '';
+    String output = '';
     process.stdout.transform(UTF8.decoder)
                   .transform(new LineSplitter()).listen((line) {
-      stdout = '$stdout\n$line';
+      output = '$output\n$line';
       print(line);
     });
     process.stderr.transform(UTF8.decoder)
                   .transform(new LineSplitter()).listen((line) {
+      output = '$output\n$line';
       print(line);
     });
     process.exitCode.then((ec) {
-      stdout = '$stdout\nEXIT_CODE=$ec\n';
-      completer.complete(stdout);
+      output = '$output\nEXIT_CODE=$ec\n';
+      completer.complete(output);
     });
     return completer.future;
   }
@@ -56,15 +57,18 @@
     }
   });
 
-  var launchUrl = 'http://127.0.0.1:${server.port}/main.dart';
-  var stdout = await Launcher.launch(mojo_shell_executable, [launchUrl]);
+  var launchUrl = 'http://127.0.0.1:${server.port}/lib/main.dart';
+  var output = await Launcher.launch(mojo_shell_executable, [launchUrl]);
 
   server.close();
 
-  if (!stdout.contains("\nPASS")) {
+  if (output.contains("ERROR")) {
+    throw "test failed.";
+  }
+  if (!output.contains("\nEXIT_CODE=0\n")) {
     throw "Test failed.";
   }
-  if (!stdout.contains("\nEXIT_CODE=0\n")) {
+  if (!output.contains("\nPASS")) {
     throw "Test failed.";
   }
 }
diff --git a/mojo/dart/http_load_test/main.dart b/mojo/dart/http_load_test/lib/main.dart
similarity index 75%
rename from mojo/dart/http_load_test/main.dart
rename to mojo/dart/http_load_test/lib/main.dart
index 6e35e69..7e779d7 100644
--- a/mojo/dart/http_load_test/main.dart
+++ b/mojo/dart/http_load_test/lib/main.dart
@@ -5,7 +5,9 @@
 import 'dart:async';
 import 'dart:mojo.internal';
 
-part 'part0.dart';
+import 'package:mojo_services/tracing/tracing.mojom.dart' as tracing;
+
+part 'src/part0.dart';
 
 main(List args) {
   // Hang around for a sec and then close the shell handle.
diff --git a/mojo/dart/http_load_test/part0.dart b/mojo/dart/http_load_test/lib/src/part0.dart
similarity index 100%
rename from mojo/dart/http_load_test/part0.dart
rename to mojo/dart/http_load_test/lib/src/part0.dart
diff --git a/mojo/dart/http_load_test/pubspec.lock b/mojo/dart/http_load_test/pubspec.lock
new file mode 100644
index 0000000..e7b03b5
--- /dev/null
+++ b/mojo/dart/http_load_test/pubspec.lock
@@ -0,0 +1,3 @@
+# Generated by pub
+# See http://pub.dartlang.org/doc/glossary.html#lockfile
+packages: {}
diff --git a/mojo/dart/http_load_test/pubspec.yaml b/mojo/dart/http_load_test/pubspec.yaml
new file mode 100644
index 0000000..335f54a
--- /dev/null
+++ b/mojo/dart/http_load_test/pubspec.yaml
@@ -0,0 +1 @@
+name: mojo_dart_http_load_test
diff --git a/mojo/dart/http_load_test/runner.py b/mojo/dart/http_load_test/runner.py
index 3f72f39..b3c4785 100755
--- a/mojo/dart/http_load_test/runner.py
+++ b/mojo/dart/http_load_test/runner.py
@@ -40,6 +40,8 @@
                       help="Path to dart executable.")
   args = parser.parse_args()
   tester_directory = os.path.dirname(os.path.realpath(__file__))
-  tester_dart_script = os.path.join(tester_directory, 'tester.dart')
+  tester_dart_script = os.path.join(tester_directory, 'bin', 'tester.dart')
+  package_directory = os.path.join(
+      args.build_dir, 'gen', 'dart-pkg', 'mojo_dart_http_load_test')
   sys.exit(main(args.build_dir, args.dart_exe, tester_dart_script,
-                tester_directory))
+                package_directory))
diff --git a/mojo/dart/mojo_services/BUILD.gn b/mojo/dart/mojo_services/BUILD.gn
index abf2437..bda57f8 100644
--- a/mojo/dart/mojo_services/BUILD.gn
+++ b/mojo/dart/mojo_services/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//mojo/public/dart/rules.gni")
+import("//mojo/services/mojo_services.gni")
 
 dart_pkg("mojo_services") {
   sources = [
diff --git a/mojo/dart/mojo_services/CHANGELOG.md b/mojo/dart/mojo_services/CHANGELOG.md
index ef62915..899759c 100644
--- a/mojo/dart/mojo_services/CHANGELOG.md
+++ b/mojo/dart/mojo_services/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.0.22
+
+  - 58 changes: https://github.com/domokit/mojo/compare/e172885...35de44e
+
 ## 0.0.16
 
   - 89 changes: https://github.com/domokit/mojo/compare/0fd4d06...c3119f6
diff --git a/mojo/dart/mojo_services/pubspec.yaml b/mojo/dart/mojo_services/pubspec.yaml
index 271ae40..0015636 100644
--- a/mojo/dart/mojo_services/pubspec.yaml
+++ b/mojo/dart/mojo_services/pubspec.yaml
@@ -4,4 +4,4 @@
 description: Generated bindings for mojo services
 homepage: https://github.com/domokit/mojo
 name: mojo_services
-version: 0.0.21
+version: 0.0.22
diff --git a/mojo/dart/mojom/BUILD.gn b/mojo/dart/mojom/BUILD.gn
index c29b19a..70ff7da 100644
--- a/mojo/dart/mojom/BUILD.gn
+++ b/mojo/dart/mojom/BUILD.gn
@@ -5,7 +5,7 @@
 import("//mojo/public/dart/rules.gni")
 
 dart_pkg("mojom") {
-  entrypoints = [ "lib/generate.dart" ]
+  libs = [ "lib/generate.dart" ]
   sources = [
     "CHANGELOG.md",
     "README.md",
diff --git a/mojo/dart/mojom/CHANGELOG.md b/mojo/dart/mojom/CHANGELOG.md
index fe7b30f..3188f5b 100644
--- a/mojo/dart/mojom/CHANGELOG.md
+++ b/mojo/dart/mojom/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.0.22
+
+  - 59 changes: https://github.com/domokit/mojo/compare/c73419d...35de44e
+
 ## 0.0.18
 
   - 89 changes: https://github.com/domokit/mojo/compare/0fd4d06...c3119f6
diff --git a/mojo/dart/mojom/pubspec.yaml b/mojo/dart/mojom/pubspec.yaml
index 6e53e1f..bf53665 100644
--- a/mojo/dart/mojom/pubspec.yaml
+++ b/mojo/dart/mojom/pubspec.yaml
@@ -9,4 +9,4 @@
   sdk: '>=1.9.0 <2.0.0'
 homepage: https://github.com/domokit/mojo
 name: mojom
-version: 0.0.21
+version: 0.0.22
diff --git a/mojo/dart/observatory_test/BUILD.gn b/mojo/dart/observatory_test/BUILD.gn
index 4401b35..b845c9f 100644
--- a/mojo/dart/observatory_test/BUILD.gn
+++ b/mojo/dart/observatory_test/BUILD.gn
@@ -4,9 +4,13 @@
 
 import("//mojo/public/dart/rules.gni")
 
-dartzip_packaged_application("observatory_test") {
+dart_pkg("observatory_test") {
+  apps = [ [
+        "dart_observatory_test",
+        "lib/main.dart",
+      ] ]
   sources = [
-    "main.dart",
+    "pubspec.yaml",
   ]
   deps = [
     "//mojo/public/dart",
diff --git a/mojo/dart/observatory_test/main.dart b/mojo/dart/observatory_test/lib/main.dart
similarity index 100%
rename from mojo/dart/observatory_test/main.dart
rename to mojo/dart/observatory_test/lib/main.dart
diff --git a/mojo/dart/observatory_tester/runner.py b/mojo/dart/observatory_tester/runner.py
index d78ec7d..4cd1b4b 100755
--- a/mojo/dart/observatory_tester/runner.py
+++ b/mojo/dart/observatory_tester/runner.py
@@ -11,7 +11,7 @@
 import sys
 
 MOJO_SHELL = 'mojo_shell'
-TESTEE = 'mojo:observatory_test'
+TESTEE = 'mojo:dart_observatory_test'
 
 def main(build_dir, dart_exe, tester_script):
   shell_exe = os.path.join(build_dir, MOJO_SHELL)
diff --git a/mojo/dart/testing/BUILD.gn b/mojo/dart/testing/BUILD.gn
index 5bf79a5..e4cbe05 100644
--- a/mojo/dart/testing/BUILD.gn
+++ b/mojo/dart/testing/BUILD.gn
@@ -5,7 +5,7 @@
 import("//mojo/public/dart/rules.gni")
 
 dart_pkg("testing") {
-  entrypoints = [
+  libs = [
     "lib/async_helper.dart",
     "lib/expect.dart",
     "lib/validation_test_input_parser.dart",
diff --git a/mojo/data_pipe_utils/BUILD.gn b/mojo/data_pipe_utils/BUILD.gn
new file mode 100644
index 0000000..d9b5dea
--- /dev/null
+++ b/mojo/data_pipe_utils/BUILD.gn
@@ -0,0 +1,39 @@
+# 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.
+
+source_set("data_pipe_utils") {
+  sources = [
+    "data_pipe_drainer.cc",
+    "data_pipe_drainer.h",
+    "data_pipe_file_utils.cc",
+    "data_pipe_utils.cc",
+    "data_pipe_utils.h",
+    "data_pipe_utils_internal.h",
+  ]
+
+  if (is_nacl) {
+    sources -= [ "data_pipe_file_utils.cc" ]
+  }
+
+  deps = [
+    "//base",
+    "//mojo/message_pump",
+    "//mojo/public/cpp/environment:environment",
+    "//mojo/public/cpp/system",
+  ]
+}
+
+source_set("tests") {
+  testonly = true
+
+  sources = [
+    "data_pipe_utils_unittest.cc",
+  ]
+
+  deps = [
+    ":data_pipe_utils",
+    "//base",
+    "//testing/gtest",
+  ]
+}
diff --git a/mojo/common/data_pipe_drainer.cc b/mojo/data_pipe_utils/data_pipe_drainer.cc
similarity index 73%
rename from mojo/common/data_pipe_drainer.cc
rename to mojo/data_pipe_utils/data_pipe_drainer.cc
index 5477109..8ed8b2d 100644
--- a/mojo/common/data_pipe_drainer.cc
+++ b/mojo/data_pipe_utils/data_pipe_drainer.cc
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/common/data_pipe_drainer.h"
+#include "mojo/data_pipe_utils/data_pipe_drainer.h"
+
 #include "base/bind.h"
 
 namespace mojo {
@@ -10,21 +11,18 @@
 
 DataPipeDrainer::DataPipeDrainer(Client* client,
                                  mojo::ScopedDataPipeConsumerHandle source)
-    : client_(client),
-      source_(source.Pass()),
-      weak_factory_(this) {
+    : client_(client), source_(source.Pass()), weak_factory_(this) {
   DCHECK(client_);
   ReadData();
 }
 
-DataPipeDrainer::~DataPipeDrainer() {
-}
+DataPipeDrainer::~DataPipeDrainer() {}
 
 void DataPipeDrainer::ReadData() {
   const void* buffer = nullptr;
   uint32_t num_bytes = 0;
-  MojoResult rv = BeginReadDataRaw(source_.get(),
-      &buffer, &num_bytes, MOJO_READ_DATA_FLAG_NONE);
+  MojoResult rv = BeginReadDataRaw(source_.get(), &buffer, &num_bytes,
+                                   MOJO_READ_DATA_FLAG_NONE);
   if (rv == MOJO_RESULT_OK) {
     client_->OnDataAvailable(buffer, num_bytes);
     EndReadDataRaw(source_.get(), num_bytes);
@@ -39,8 +37,8 @@
 }
 
 void DataPipeDrainer::WaitForData() {
-  handle_watcher_.Start(source_.get(),
-      MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE,
+  handle_watcher_.Start(
+      source_.get(), MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE,
       base::Bind(&DataPipeDrainer::WaitComplete, weak_factory_.GetWeakPtr()));
 }
 
diff --git a/mojo/common/data_pipe_drainer.h b/mojo/data_pipe_utils/data_pipe_drainer.h
similarity index 80%
rename from mojo/common/data_pipe_drainer.h
rename to mojo/data_pipe_utils/data_pipe_drainer.h
index c9669be..80cb933 100644
--- a/mojo/common/data_pipe_drainer.h
+++ b/mojo/data_pipe_utils/data_pipe_drainer.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 MOJO_COMMON_DATA_PIPE_DRAINER_H_
-#define MOJO_COMMON_DATA_PIPE_DRAINER_H_
+#ifndef MOJO_DATA_PIPE_UTILS_DATA_PIPE_DRAINER_H_
+#define MOJO_DATA_PIPE_UTILS_DATA_PIPE_DRAINER_H_
 
 #include "base/memory/weak_ptr.h"
-#include "mojo/common/handle_watcher.h"
+#include "mojo/message_pump/handle_watcher.h"
 #include "mojo/public/cpp/system/core.h"
 
 namespace mojo {
@@ -20,7 +20,7 @@
     virtual void OnDataComplete() = 0;
 
    protected:
-    virtual ~Client() { }
+    virtual ~Client() {}
   };
 
   DataPipeDrainer(Client*, mojo::ScopedDataPipeConsumerHandle source);
@@ -43,4 +43,4 @@
 }  // namespace common
 }  // namespace mojo
 
-#endif  // MOJO_COMMON_DATA_PIPE_DRAINER_H_
+#endif  // MOJO_DATA_PIPE_UTILS_DATA_PIPE_DRAINER_H_
diff --git a/mojo/common/data_pipe_file_utils.cc b/mojo/data_pipe_utils/data_pipe_file_utils.cc
similarity index 98%
rename from mojo/common/data_pipe_file_utils.cc
rename to mojo/data_pipe_utils/data_pipe_file_utils.cc
index aa14225..e37c8df 100644
--- a/mojo/common/data_pipe_file_utils.cc
+++ b/mojo/data_pipe_utils/data_pipe_file_utils.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/common/data_pipe_utils.h"
+#include "mojo/data_pipe_utils/data_pipe_utils.h"
 
 #include <stdio.h>
 
@@ -14,7 +14,7 @@
 #include "base/files/scoped_file.h"
 #include "base/location.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/common/data_pipe_utils_internal.h"
+#include "mojo/data_pipe_utils/data_pipe_utils_internal.h"
 #include "mojo/public/cpp/environment/async_waiter.h"
 
 namespace mojo {
diff --git a/mojo/common/data_pipe_utils.cc b/mojo/data_pipe_utils/data_pipe_utils.cc
similarity index 82%
rename from mojo/common/data_pipe_utils.cc
rename to mojo/data_pipe_utils/data_pipe_utils.cc
index daaef2c..af9f206 100644
--- a/mojo/common/data_pipe_utils.cc
+++ b/mojo/data_pipe_utils/data_pipe_utils.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/common/data_pipe_utils.h"
+#include "mojo/data_pipe_utils/data_pipe_utils.h"
 
 #include <stdio.h>
 
@@ -10,18 +10,19 @@
 #include "base/task_runner_util.h"
 #include "base/threading/platform_thread.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/common/data_pipe_utils_internal.h"
+#include "mojo/data_pipe_utils/data_pipe_utils_internal.h"
 
 namespace mojo {
 namespace common {
 
-bool BlockingCopyHelper(ScopedDataPipeConsumerHandle source,
+bool BlockingCopyHelper(
+    ScopedDataPipeConsumerHandle source,
     const base::Callback<size_t(const void*, uint32_t)>& write_bytes) {
   for (;;) {
     const void* buffer = nullptr;
     uint32_t num_bytes = 0;
-    MojoResult result = BeginReadDataRaw(
-        source.get(), &buffer, &num_bytes, MOJO_READ_DATA_FLAG_NONE);
+    MojoResult result = BeginReadDataRaw(source.get(), &buffer, &num_bytes,
+                                         MOJO_READ_DATA_FLAG_NONE);
     if (result == MOJO_RESULT_OK) {
       size_t bytes_written = write_bytes.Run(buffer, num_bytes);
       if (bytes_written < num_bytes) {
@@ -39,10 +40,8 @@
         return false;
       }
     } else if (result == MOJO_RESULT_SHOULD_WAIT) {
-      result = Wait(source.get(),
-                    MOJO_HANDLE_SIGNAL_READABLE,
-                    MOJO_DEADLINE_INDEFINITE,
-                    nullptr);
+      result = Wait(source.get(), MOJO_HANDLE_SIGNAL_READABLE,
+                    MOJO_DEADLINE_INDEFINITE, nullptr);
       if (result != MOJO_RESULT_OK) {
         // If the producer handle was closed, then treat as EOF.
         return result == MOJO_RESULT_FAILED_PRECONDITION;
@@ -60,13 +59,14 @@
 
 namespace {
 
-size_t CopyToStringHelper(
-    std::string* result, const void* buffer, uint32_t num_bytes) {
+size_t CopyToStringHelper(std::string* result,
+                          const void* buffer,
+                          uint32_t num_bytes) {
   result->append(static_cast<const char*>(buffer), num_bytes);
   return num_bytes;
 }
 
-} // namespace
+}  // namespace
 
 // TODO(hansmuller): Add a max_size parameter.
 bool BlockingCopyToString(ScopedDataPipeConsumerHandle source,
@@ -74,8 +74,8 @@
   TRACE_EVENT0("data_pipe_utils", "BlockingCopyToString");
   CHECK(result);
   result->clear();
-  return BlockingCopyHelper(
-      source.Pass(), base::Bind(&CopyToStringHelper, result));
+  return BlockingCopyHelper(source.Pass(),
+                            base::Bind(&CopyToStringHelper, result));
 }
 
 bool BlockingCopyFromString(const std::string& source,
diff --git a/mojo/common/data_pipe_utils.h b/mojo/data_pipe_utils/data_pipe_utils.h
similarity index 92%
rename from mojo/common/data_pipe_utils.h
rename to mojo/data_pipe_utils/data_pipe_utils.h
index 08e6fa0..289fe12 100644
--- a/mojo/common/data_pipe_utils.h
+++ b/mojo/data_pipe_utils/data_pipe_utils.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 MOJO_SHELL_DATA_PIPE_UTILS_H_
-#define MOJO_SHELL_DATA_PIPE_UTILS_H_
+#ifndef MOJO_DATA_PIPE_UTILS_DATA_PIPE_UTILS_H_
+#define MOJO_DATA_PIPE_UTILS_DATA_PIPE_UTILS_H_
 
 #include <string>
 
@@ -51,4 +51,4 @@
 }  // namespace common
 }  // namespace mojo
 
-#endif  // MOJO_SHELL_DATA_PIPE_UTILS_H_
+#endif  // MOJO_DATA_PIPE_UTILS_DATA_PIPE_UTILS_H_
diff --git a/mojo/common/data_pipe_utils_internal.h b/mojo/data_pipe_utils/data_pipe_utils_internal.h
similarity index 75%
rename from mojo/common/data_pipe_utils_internal.h
rename to mojo/data_pipe_utils/data_pipe_utils_internal.h
index 26164ec..40086fb 100644
--- a/mojo/common/data_pipe_utils_internal.h
+++ b/mojo/data_pipe_utils/data_pipe_utils_internal.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 MOJO_COMMON_DATA_PIPE_UTILS_INTERNAL_H_
-#define MOJO_COMMON_DATA_PIPE_UTILS_INTERNAL_H_
+#ifndef MOJO_DATA_PIPE_UTILS_DATA_PIPE_UTILS_INTERNAL_H_
+#define MOJO_DATA_PIPE_UTILS_DATA_PIPE_UTILS_INTERNAL_H_
 
 #include "base/callback_forward.h"
 #include "mojo/public/cpp/system/core.h"
@@ -19,4 +19,4 @@
 }  // namespace common
 }  // namespace mojo
 
-#endif  // MOJO_COMMON_DATA_PIPE_UTILS_INTERNAL_H_
+#endif  // MOJO_DATA_PIPE_UTILS_DATA_PIPE_UTILS_INTERNAL_H_
diff --git a/mojo/common/data_pipe_utils_unittest.cc b/mojo/data_pipe_utils/data_pipe_utils_unittest.cc
similarity index 97%
rename from mojo/common/data_pipe_utils_unittest.cc
rename to mojo/data_pipe_utils/data_pipe_utils_unittest.cc
index edfc2c4..6c0f600 100644
--- a/mojo/common/data_pipe_utils_unittest.cc
+++ b/mojo/data_pipe_utils/data_pipe_utils_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/common/data_pipe_utils.h"
+#include "mojo/data_pipe_utils/data_pipe_utils.h"
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
diff --git a/mojo/devtools/README.md b/mojo/devtools/README.md
deleted file mode 100644
index ff70d86..0000000
--- a/mojo/devtools/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Devtools packages
-
-The `common` subdirectory contains what we currently expose as "devtools",
-mirroring it as a [separate repository](https://github.com/domokit/devtools) for
-consumption without a Mojo checkout.
-
-Further subdirectories TBD might be added in the future, to contain heavy
-language-specific tooling which we will mirror / expose separately.
-
-The toolsets are intended for consumption by Mojo consumers as **separate
-checkouts**. No dependencies on files outside of devtools are allowed.
diff --git a/mojo/devtools/common/README.md b/mojo/devtools/common/README.md
deleted file mode 100644
index eb7d5c6..0000000
--- a/mojo/devtools/common/README.md
+++ /dev/null
@@ -1,136 +0,0 @@
-# Devtools
-
-Unopinionated tools for **running**, **debugging** and **testing** Mojo apps.
-
-## Install
-
-```
-git clone https://github.com/domokit/devtools.git
-```
-
-## Contents
-
-Devtools offers the following tools:
-
- - `mojo_run` - shell runner
- - `mojo_test` - apptest runner
- - `mojo_debug` - debugger supporting interactive tracing and debugging of a
-   running mojo shell
-
-Additionally, `remote_adb_setup` script helps to configure adb on a remote
-machine to communicate with a device attached to a local machine, forwarding the
-ports used by `mojo_run`.
-
-### Runner
-
-`mojo_run` allows you to run a Mojo shell either on the host, or on an attached
-Android device.
-
-```sh
-mojo_run APP_URL  # Run on the host.
-mojo_run APP_URL --android  # Run on Android device.
-mojo_run "APP_URL APP_ARGUMENTS"  # Run an app with startup arguments
-```
-
-Unless running within a Mojo checkout, we need to indicate the path to the shell
-binary:
-
-```sh
-mojo_run --shell-path path/to/shell/binary APP_URL
-```
-
-Some applications are running embedded inside a window manager. To start such an
-app, you have to first start the window manager app, then have it embed the app
-you are interested in. It is done as follows using the default window manager:
-
-```sh
-mojo_run "mojo:window_manager APP_URL"
-```
-
-By default, `mojo_run` uses `mojo:kiosk_wm` as the default window manager. It
-can be changed using the `--window-manager` flag.
-
-#### Sky apps
-
-To run a [Sky](https://github.com/domokit/sky_engine) app, you need to build
-`sky_viewer.mojo` in a Sky checkout, and indicate the path to the binary using
-the `--map-url` parameter:
-
-```sh
-mojo_run --map-url mojo:sky_viewer=/path/to/sky/viewer "mojo:window_manager APP_URL"
-```
-
-If the app does not declare a shebang indicating that it needs to be run in
-`sky_viewer`, pass `--sky` to map `sky_viewer` as a default content handler for
-dart apps:
-
-```sh
-mojo_run --map-url mojo:sky_viewer=/path/to/sky/viewer "mojo:window_manager APP_URL" --sky
-```
-
-Note that Sky apps will need the --use-osmesa flag to run
-over [chromoting](https://support.google.com/chrome/answer/1649523?hl=en):
-
-### Debugger
-
-`mojo_debug` allows you to interactively inspect a running shell, collect
-performance traces and attach a gdb debugger.
-
-#### Tracing
-To collect [performance
-traces](https://www.chromium.org/developers/how-tos/trace-event-profiling-tool)
-and retrieve the result:
-
-```sh
-mojo_debug tracing start
-mojo_debug tracing stop [result.json]
-```
-
-The trace file can be then loaded using the trace viewer in Chrome available at
-`about://tracing`.
-
-#### GDB
-It is possible to inspect a Mojo Shell process using GDB. The `mojo_debug`
-script can be used to launch GDB and attach it to a running shell process
-(android only):
-
-```sh
-mojo_debug gdb attach
-```
-
-Once started, GDB will first stop the Mojo Shell execution, then load symbols
-from loaded Mojo applications. Please note that this initial step can take some
-time (up to several minutes in the worst case).
-
-After each execution pause, GDB will update the set of loaded symbols based on
-the selected thread only. If you need symbols for all threads, use the
-`update-symbols` GDB command:
-```sh
-(gdb) update-symbols
-```
-
-If you only want to update symbols for the current selected thread (for example,
-after changing threads), use the `current` option:
-```sh
-(gdb) update-symbols current
-```
-
-If you want to debug the startup of your application, you can pass
-`--wait-for-debugger` to `mojo_run` to have the Mojo Shell stop and wait to be
-attached by `gdb` before continuing.
-
-#### Android crash stacks
-When Mojo shell crashes on Android ("Unfortunately, Mojo shell has stopped.")
-due to a crash in native code, `mojo_debug` can be used to find and symbolize
-the stack trace present in the device log:
-
-```sh
-mojo_debug device stack
-```
-
-## Development
-
-The library is canonically developed [in the mojo
-repository](https://github.com/domokit/mojo/tree/master/mojo/devtools/common),
-https://github.com/domokit/devtools is a mirror allowing to consume it
-separately.
diff --git a/mojo/devtools/common/android_gdb/__init__.py b/mojo/devtools/common/android_gdb/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/devtools/common/android_gdb/__init__.py
+++ /dev/null
diff --git a/mojo/devtools/common/android_gdb/config.py b/mojo/devtools/common/android_gdb/config.py
deleted file mode 100644
index 4ddaeae..0000000
--- a/mojo/devtools/common/android_gdb/config.py
+++ /dev/null
@@ -1,9 +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.
-
-# Path where remote_file_reader should be installed on the device.
-REMOTE_FILE_READER_DEVICE_PATH = '/data/local/tmp/remote_file_reader'
-
-# Path where remote_file_reader is available on Cloud Storage.
-REMOTE_FILE_READER_CLOUD_PATH = 'gs://mojo/devtools/remote_file_reader'
diff --git a/mojo/devtools/common/android_gdb/install_remote_file_reader.py b/mojo/devtools/common/android_gdb/install_remote_file_reader.py
deleted file mode 100644
index 07ba7f7..0000000
--- a/mojo/devtools/common/android_gdb/install_remote_file_reader.py
+++ /dev/null
@@ -1,20 +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.
-
-import android_gdb.config as config
-import subprocess
-import tempfile
-
-
-def install(gsutil, adb='adb'):
-  verification_call_output = subprocess.check_output(
-      [adb, 'shell', 'ls', config.REMOTE_FILE_READER_DEVICE_PATH])
-  if config.REMOTE_FILE_READER_DEVICE_PATH != verification_call_output.strip():
-    with tempfile.NamedTemporaryFile() as temp_file:
-      subprocess.check_call([gsutil, 'cp', config.REMOTE_FILE_READER_CLOUD_PATH,
-                             temp_file.name])
-      subprocess.check_call([adb, 'push', temp_file.name,
-                             config.REMOTE_FILE_READER_DEVICE_PATH])
-      subprocess.check_call([adb, 'shell', 'chmod', '777',
-                             config.REMOTE_FILE_READER_DEVICE_PATH])
diff --git a/mojo/devtools/common/android_gdb/remote_file_connection.py b/mojo/devtools/common/android_gdb/remote_file_connection.py
deleted file mode 100644
index 9759cdb..0000000
--- a/mojo/devtools/common/android_gdb/remote_file_connection.py
+++ /dev/null
@@ -1,69 +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.
-
-import socket
-import struct
-
-
-class RemoteFileConnectionException(Exception):
-  def __init__(self, *args, **kwargs):
-    Exception.__init__(self, *args, **kwargs)
-
-
-class RemoteFileConnection(object):
-  """Client for remote_file_reader server, allowing to read files on an
-  remote device.
-  """
-  def __init__(self, host, port):
-    self._host = host
-    self._port = port
-    self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-    self._size_struct = struct.Struct("!i")
-
-  def __del__(self):
-    self.disconnect()
-
-  def connect(self):
-    self._socket.connect((self._host, self._port))
-
-  def disconnect(self):
-    self._socket.close()
-
-  def open(self, filename):
-    self._send("O %s\n" % filename)
-    result = self._receive(1)
-    if result != 'O':
-      raise RemoteFileConnectionException("Unable to open file " + filename)
-
-  def seek(self, pos, mode=0):
-    self._send("S %d %d\n" % (pos, mode))
-    result = self._receive(1)
-    if result != 'O':
-      raise RemoteFileConnectionException("Unable to seek in file.")
-
-  def read(self, size=0):
-    assert size > 0
-    self._send("R %d\n" % size)
-    result = self._receive(1)
-    if result != 'O':
-      raise RemoteFileConnectionException("Unable to read file.")
-    read_size = self._size_struct.unpack(self._receive(4))[0]
-    return self._receive(read_size)
-
-  def _send(self, data):
-    while len(data) > 0:
-      sent = self._socket.send(data)
-      if sent == 0:
-        raise RemoteFileConnectionException("Socket connection broken.")
-      data = data[sent:]
-
-  def _receive(self, length):
-    result = []
-    while length > 0:
-      chunk = self._socket.recv(length)
-      if chunk == '':
-        raise RemoteFileConnectionException("Socket connection broken.")
-      result.append(chunk)
-      length -= len(chunk)
-    return ''.join(result)
diff --git a/mojo/devtools/common/android_gdb/session.py b/mojo/devtools/common/android_gdb/session.py
deleted file mode 100644
index e425c40..0000000
--- a/mojo/devtools/common/android_gdb/session.py
+++ /dev/null
@@ -1,317 +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.
-
-"""
-Manages a debugging session with GDB.
-
-This module is meant to be imported from inside GDB. Once loaded, the
-|DebugSession| attaches GDB to a running Mojo Shell process on an Android
-device using a remote gdbserver.
-
-At startup and each time the execution stops, |DebugSession| associates
-debugging symbols for every frame. For more information, see |DebugSession|
-documentation.
-"""
-
-import gdb
-import glob
-import itertools
-import logging
-import os
-import os.path
-import shutil
-import subprocess
-import sys
-import tempfile
-import traceback
-import urllib2
-
-sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-import android_gdb.config as config
-from android_gdb.remote_file_connection import RemoteFileConnection
-from android_gdb.signatures import get_signature
-
-
-logging.getLogger().setLevel(logging.INFO)
-
-
-def _gdb_execute(command):
-  """Executes a GDB command."""
-  return gdb.execute(command, to_string=True)
-
-
-class Mapping(object):
-  """Represents a mapped memory region."""
-  def __init__(self, line):
-    self.start = int(line[0], 16)
-    self.end = int(line[1], 16)
-    self.size = int(line[2], 16)
-    self.offset = int(line[3], 16)
-    self.filename = line[4]
-
-
-def _get_mapped_files():
-  """Retrieves all the files mapped into the debugged process memory.
-
-  Returns:
-    List of mapped memory regions grouped by files.
-  """
-  # info proc map returns a space-separated table with the following fields:
-  # start address, end address, size, offset, file path.
-  mappings = [Mapping(x) for x in
-              [x.split() for x in
-               _gdb_execute("info proc map").split('\n')]
-              if len(x) == 5 and x[4][0] == '/']
-  res = {}
-  for m in mappings:
-    libname = m.filename[m.filename.rfind('/') + 1:]
-    res[libname] = res.get(libname, []) + [m]
-  return res.values()
-
-
-class DebugSession(object):
-  def __init__(self, build_directory, package_name, pyelftools_dir, adb):
-    self._build_directory = build_directory
-    if not os.path.exists(self._build_directory):
-      logging.fatal("Please pass a valid build directory")
-      sys.exit(1)
-    self._package_name = package_name
-    self._adb = adb
-    self._remote_file_cache = os.path.join(os.getenv('HOME'), '.mojosymbols')
-
-    if pyelftools_dir != None:
-      sys.path.append(pyelftools_dir)
-    try:
-      import elftools.elf.elffile as elffile
-    except ImportError:
-      logging.fatal("Unable to find elftools module; please install pyelftools "
-                    "and specify its path on the command line using "
-                    "--pyelftools-dir.")
-      sys.exit(1)
-
-    self._elffile_module = elffile
-
-    self._libraries = self._find_libraries(build_directory)
-    self._rfc = RemoteFileConnection('localhost', 10000)
-    self._remote_file_reader_process = None
-    if not os.path.exists(self._remote_file_cache):
-      os.makedirs(self._remote_file_cache)
-    self._done_mapping = set()
-    self._downloaded_files = []
-
-  def __del__(self):
-    # Note that, per python interpreter documentation, __del__ is not
-    # guaranteed to be called when the interpreter (GDB, in our case) quits.
-    # Also, most (all?) globals are no longer available at this time (launching
-    # a subprocess does not work).
-    self.stop()
-
-  def stop(self, _unused_return_value=None):
-    if self._remote_file_reader_process != None:
-      self._remote_file_reader_process.kill()
-
-  def _find_libraries(self, lib_dir):
-    """Finds all libraries in |lib_dir| and key them by their signatures.
-    """
-    res = {}
-    for fn in glob.glob('%s/*.so' % lib_dir):
-      with open(fn, 'r') as f:
-        s = get_signature(f, self._elffile_module)
-        if s is not None:
-          res[s] = fn
-    return res
-
-  def _associate_symbols(self, mapping, local_file):
-    with open(local_file, "r") as f:
-      elf = self._elffile_module.ELFFile(f)
-      s = elf.get_section_by_name(".text")
-      text_address = mapping[0].start + s['sh_offset']
-      _gdb_execute("add-symbol-file %s 0x%x" % (local_file, text_address))
-
-  def _download_file(self, signature, remote):
-    """Downloads a remote file either from the cloud or through GDB connection.
-
-    Returns:
-      The filename of the downloaded file
-    """
-    temp_file = tempfile.NamedTemporaryFile()
-    logging.info("Trying to download symbols from the cloud.")
-    symbols_url = "http://storage.googleapis.com/mojo/symbols/%s" % signature
-    try:
-      symbol_file = urllib2.urlopen(symbols_url)
-      try:
-        with open(temp_file.name, "w") as dst:
-          shutil.copyfileobj(symbol_file, dst)
-          logging.info("Getting symbols for %s at %s." % (remote, symbols_url))
-          # This allows the deletion of temporary files on disk when the
-          # debugging session terminates.
-          self._downloaded_files.append(temp_file)
-          return temp_file.name
-      finally:
-        symbol_file.close()
-    except urllib2.HTTPError:
-      pass
-    logging.info("Downloading file %s" % remote)
-    _gdb_execute("remote get %s %s" % (remote, temp_file.name))
-    # This allows the deletion of temporary files on disk when the debugging
-    # session terminates.
-    self._downloaded_files.append(temp_file)
-    return temp_file.name
-
-  def _find_mapping_for_address(self, mappings, address):
-    """Returns the list of all mappings of the file occupying the |address|
-    memory address.
-    """
-    for file_mappings in mappings:
-      for mapping in file_mappings:
-        if address >= mapping.start and address <= mapping.end:
-          return file_mappings
-    return None
-
-  def _try_to_map(self, mapping):
-    remote_file = mapping[0].filename
-    if remote_file in self._done_mapping:
-      return False
-    self._done_mapping.add(remote_file)
-    self._rfc.open(remote_file)
-    signature = get_signature(self._rfc, self._elffile_module)
-    if signature is not None:
-      if signature in self._libraries:
-        self._associate_symbols(mapping, self._libraries[signature])
-      else:
-        # This library file is not known locally. Download it from the device or
-        # the cloud and put it in cache so, if it got symbols, we can see them.
-        local_file = os.path.join(self._remote_file_cache, signature)
-        if not os.path.exists(local_file):
-          tmp_output = self._download_file(signature, remote_file)
-          shutil.move(tmp_output, local_file)
-        self._associate_symbols(mapping, local_file)
-      return True
-    return False
-
-  def _map_symbols_on_current_thread(self, mapped_files):
-    """Updates the symbols for the current thread using files from mapped_files.
-    """
-    frame = gdb.newest_frame()
-    while frame and frame.is_valid():
-      if frame.name() is None:
-        m = self._find_mapping_for_address(mapped_files, frame.pc())
-        if m is not None and self._try_to_map(m):
-          # Force gdb to recompute its frames.
-          _gdb_execute("info threads")
-          frame = gdb.newest_frame()
-          assert frame.is_valid()
-      if (frame.older() is not None and
-          frame.older().is_valid() and
-          frame.older().pc() != frame.pc()):
-        frame = frame.older()
-      else:
-        frame = None
-
-  def update_symbols(self, current_thread_only):
-    """Updates the mapping between symbols as seen from GDB and local library
-    files.
-
-    If current_thread_only is True, only update symbols for the current thread.
-    """
-    logging.info("Updating symbols")
-    mapped_files = _get_mapped_files()
-    # Map all symbols from native libraries packages with the APK.
-    for file_mappings in mapped_files:
-      filename = file_mappings[0].filename
-      if ((filename.startswith('/data/data/') or
-           filename.startswith('/data/app')) and
-          not filename.endswith('.apk') and
-          not filename.endswith('.dex')):
-        logging.info('Pre-mapping: %s' % file_mappings[0].filename)
-        self._try_to_map(file_mappings)
-
-    if current_thread_only:
-      self._map_symbols_on_current_thread(mapped_files)
-    else:
-      logging.info('Updating all threads\' symbols')
-      current_thread = gdb.selected_thread()
-      nb_threads = len(_gdb_execute("info threads").split("\n")) - 2
-      for i in xrange(nb_threads):
-        try:
-          _gdb_execute("thread %d" % (i + 1))
-          self._map_symbols_on_current_thread(mapped_files)
-        except gdb.error:
-          traceback.print_exc()
-      current_thread.switch()
-
-  def _get_device_application_pid(self, application):
-    """Gets the PID of an application running on a device."""
-    output = subprocess.check_output([self._adb, 'shell', 'ps'])
-    for line in output.split('\n'):
-      elements = line.split()
-      if len(elements) > 0 and elements[-1] == application:
-        return elements[1]
-    return None
-
-  def start(self):
-    """Starts a debugging session."""
-    gdbserver_pid = self._get_device_application_pid('gdbserver')
-    if gdbserver_pid is not None:
-      subprocess.check_call([self._adb, 'shell', 'kill', gdbserver_pid])
-    shell_pid = self._get_device_application_pid(self._package_name)
-    if shell_pid is None:
-      raise Exception('Unable to find a running mojo shell.')
-    subprocess.check_call([self._adb, 'forward', 'tcp:9999', 'tcp:9999'])
-    subprocess.Popen(
-        [self._adb, 'shell', 'gdbserver', '--attach', ':9999', shell_pid],
-        # os.setpgrp ensures signals passed to this file (such as SIGINT) are
-        # not propagated to child processes.
-        preexec_fn = os.setpgrp)
-
-    # Kill stray remote reader processes. See __del__ comment for more info.
-    remote_file_reader_pid = self._get_device_application_pid(
-        config.REMOTE_FILE_READER_DEVICE_PATH)
-    if remote_file_reader_pid is not None:
-      subprocess.check_call([self._adb, 'shell', 'kill',
-                             remote_file_reader_pid])
-    self._remote_file_reader_process = subprocess.Popen(
-        [self._adb, 'shell', config.REMOTE_FILE_READER_DEVICE_PATH],
-        stdout=subprocess.PIPE, preexec_fn = os.setpgrp)
-    port = int(self._remote_file_reader_process.stdout.readline())
-    subprocess.check_call([self._adb, 'forward', 'tcp:10000', 'tcp:%d' % port])
-    self._rfc.connect()
-
-    _gdb_execute('target remote localhost:9999')
-
-    self.update_symbols(current_thread_only=False)
-    def on_stop(_):
-      self.update_symbols(current_thread_only=True)
-    gdb.events.stop.connect(on_stop)
-    gdb.events.exited.connect(self.stop)
-
-    # Register the update-symbols command.
-    UpdateSymbols(self)
-
-class UpdateSymbols(gdb.Command):
-  """Command to update symbols loaded into GDB.
-
-  GDB usage: update-symbols [all|current]
-  """
-  _UPDATE_COMMAND = "update-symbols"
-
-  def __init__(self, session):
-    super(UpdateSymbols, self).__init__(self._UPDATE_COMMAND, gdb.COMMAND_STACK)
-    self._session = session
-
-  def invoke(self, arg, _unused_from_tty):
-    if arg == 'current':
-      self._session.update_symbols(current_thread_only=True)
-    else:
-      self._session.update_symbols(current_thread_only=False)
-
-  def complete(self, text, _unused_word):
-    if text == self._UPDATE_COMMAND:
-      return ('all', 'current')
-    elif text in self._UPDATE_COMMAND + ' all':
-      return ['all']
-    elif text in self._UPDATE_COMMAND + ' current':
-      return ['current']
-    else:
-      return []
diff --git a/mojo/devtools/common/android_gdb/signatures.py b/mojo/devtools/common/android_gdb/signatures.py
deleted file mode 100644
index d1cc593..0000000
--- a/mojo/devtools/common/android_gdb/signatures.py
+++ /dev/null
@@ -1,30 +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.
-
-import itertools
-
-
-def get_signature(file_object, elffile_module):
-  """Computes a unique signature of a library file.
-
-  We only hash the .text section of the library in order to make the hash
-  resistant to stripping (we want the same hash for the same library with debug
-  symbols kept or stripped).
-  """
-  try:
-      elf = elffile_module.ELFFile(file_object)
-      text_section = elf.get_section_by_name('.text')
-  except elffile_module.common.ELFError:
-      return None
-  file_object.seek(text_section['sh_offset'])
-  data = file_object.read(min(4096, text_section['sh_size']))
-  def combine((i, c)):
-    return i ^ ord(c)
-  result = 16 * [0]
-  for i in xrange(0, len(data), len(result)):
-    result = map(combine,
-                 itertools.izip_longest(result,
-                                        data[i:i + len(result)],
-                                        fillvalue='\0'))
-  return ''.join(["%02x" % x for x in result])
diff --git a/mojo/devtools/common/android_stack_parser/LICENSE b/mojo/devtools/common/android_stack_parser/LICENSE
deleted file mode 100644
index d645695..0000000
--- a/mojo/devtools/common/android_stack_parser/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor 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, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/mojo/devtools/common/android_stack_parser/README.chromium b/mojo/devtools/common/android_stack_parser/README.chromium
deleted file mode 100644
index 58f7c9b..0000000
--- a/mojo/devtools/common/android_stack_parser/README.chromium
+++ /dev/null
@@ -1,30 +0,0 @@
-Name: Android Platform engineering tools
-Short Name: android platform development
-URL: https://android.googlesource.com/platform/development
-Version: 0
-Date: 2014/05/02
-Revision: 1b10ec4
-License: Apache 2.0
-License File: NOT_SHIPPED
-Security Critical: no
-
-Description:
-Android Platform engineering tools, specifically stack symbolization scripts
-and a jar containing the AOSP framework to compile the Android WebView
-glue layer against. The sources used to build the AOSP framework jar can be
-checked out using repo on the corresponding manifest file. The AOSP framework
-jar is built by invoking make on the android_system_stubs target.
-
-Local Modifications:
-Only picked the few scripts needed by chrome.
-Updated output directories to use environment variable.
-When calling addr2line, check the symbol is a file (and not a directory).
-Added support for parsing LOG(FATAL) and DCHECK errors and their
-    stack traces, as emitted by src/base/debug/stack_trace_android.cc
-Added support for finding symbols when library is loaded directly from the APK.
-Changed the toolchain to remove references to 4.6 toolchains.
-Added support for arch=x64 as an alias to arch=x86_64
-Added support for mojo. Specifically detection of mojo apps downloaded
-    to temporary files which are in crash stacks.
-Taught `stack` to find the output directory and android_tools regardless of
-    where under the checkout root it is placed.
diff --git a/mojo/devtools/common/android_stack_parser/stack b/mojo/devtools/common/android_stack_parser/stack
deleted file mode 100755
index 97913ab..0000000
--- a/mojo/devtools/common/android_stack_parser/stack
+++ /dev/null
@@ -1,255 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (C) 2013 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""stack symbolizes native crash dumps."""
-
-import getopt
-import glob
-import os
-import re
-import sys
-
-import stack_core
-import subprocess
-import symbol
-
-_DEFAULT_SYMROOT = '/tmp/symbols'
-_DEFAULT_BUILD_DIR = 'out/android_Debug'
-_DEFAULT_NDK_DIR = 'third_party/android_tools/ndk'
-
-
-def PrintUsage():
-  """Print usage and exit with error."""
-  # pylint: disable-msg=C6310
-  print
-  print "  usage: " + sys.argv[0] + " [options] [FILE]"
-  print
-  print "  --symbols-dir=path"
-  print "       the path to a symbols dir, this is generally for system level"
-  print "       symbols"
-  print
-  print "  --build-dir=path"
-  print "       the path to a directory containing Mojo symbols (can be"
-  print "       absolute or relative to src), such as =out/android_Debug"
-
-  print "  --ndk-dir=path"
-  print "       the path to a directory containing Android NDK"
-  print
-  print "  --symbols-zip=path"
-  print "       the path to a symbols zip file, such as =dream-symbols-12345.zip"
-  print
-  print "  --more-info"
-  print "  --less-info"
-  print "       Change the level of detail in the output."
-  print "       --more-info is slower and more verbose, but more functions will"
-  print "       be fully qualified with namespace/classname and have full"
-  print "       argument information. Also, the 'stack data' section will be"
-  print "       printed."
-  print
-  print "  --arch=arm|arm64|x64|x86|mips"
-  print "       the target architecture"
-  print
-  print "  FILE should contain a stack trace in it somewhere"
-  print "       the tool will find that and re-print it with"
-  print "       source files and line numbers.  If you don't"
-  print "       pass FILE, or if file is -, it reads from"
-  print "       stdin."
-  print
-  # pylint: enable-msg=C6310
-  sys.exit(1)
-
-def UnzipSymbols(symbolfile, symdir=None):
-  """Unzips a file to _DEFAULT_SYMROOT and returns the unzipped location.
-
-  Args:
-    symbolfile: The .zip file to unzip
-    symdir: Optional temporary directory to use for extraction
-
-  Returns:
-    A tuple containing (the directory into which the zip file was unzipped,
-    the path to the "symbols" directory in the unzipped file).  To clean
-    up, the caller can delete the first element of the tuple.
-
-  Raises:
-    SymbolDownloadException: When the unzip fails.
-  """
-  if not symdir:
-    symdir = "%s/%s" % (_DEFAULT_SYMROOT, hash(symbolfile))
-  if not os.path.exists(symdir):
-    os.makedirs(symdir)
-
-  print "extracting %s..." % symbolfile
-  saveddir = os.getcwd()
-  os.chdir(symdir)
-  try:
-    unzipcode = subprocess.call(["unzip", "-qq", "-o", symbolfile])
-    if unzipcode > 0:
-      os.remove(symbolfile)
-      raise SymbolDownloadException("failed to extract symbol files (%s)."
-                                    % symbolfile)
-  finally:
-    os.chdir(saveddir)
-
-  android_symbols = glob.glob("%s/out/target/product/*/symbols" % symdir)
-  if android_symbols:
-    return (symdir, android_symbols[0])
-  else:
-    # This is a zip of Chrome symbols, so symbol.CHROME_SYMBOLS_DIR needs to be
-    # updated to point here.
-    symbol.CHROME_SYMBOLS_DIR = symdir
-    return (symdir, symdir)
-
-
-def GetBasenameFromMojoApp(url):
-  """Used by GetSymbolMapping() to extract the basename from the location the
-  mojo app was downloaded from. The location is a URL, e.g.
-  http://foo/bar/x.so."""
-  index = url.rfind('/')
-  return url[(index + 1):] if index != -1 else url
-
-
-def GetSymboledNameForMojoApp(path):
-  """Used by GetSymbolMapping to get the non-stripped library name for an
-  installed mojo app."""
-  # e.g. tracing.mojo -> libtracing_library.so
-  name, ext = os.path.splitext(path)
-  if ext != '.mojo':
-    return path
-  return 'lib%s_library.so' % name
-
-
-def GetSymbolMapping(lines):
-  """Returns a mapping (dictionary) from download file to .so."""
-  regex = re.compile('Caching mojo app (\S+) at (\S+)')
-  mappings = {}
-  for line in lines:
-    result = regex.search(line)
-    if result:
-      url = GetBasenameFromMojoApp(result.group(1))
-      mappings[result.group(2)] = GetSymboledNameForMojoApp(url)
-  return mappings
-
-
-def _LowestAncestorContainingRelpath(dir_path, relpath):
-  """Returns the lowest ancestor dir of |dir_path| that contains |relpath|.
-  """
-  cur_dir_path = os.path.abspath(dir_path)
-  while True:
-    if os.path.exists(os.path.join(cur_dir_path, relpath)):
-      return cur_dir_path
-
-    next_dir_path = os.path.dirname(cur_dir_path)
-    if next_dir_path != cur_dir_path:
-      cur_dir_path = next_dir_path
-    else:
-      return None
-
-
-def _GuessDir(relpath):
-  """Returns absolute path to location |relpath| in the lowest ancestor of this
-  file that contains it."""
-  lowest_ancestor = _LowestAncestorContainingRelpath(
-      os.path.dirname(__file__), relpath)
-  if not lowest_ancestor:
-    return None
-  return os.path.join(lowest_ancestor, relpath)
-
-
-
-def main():
-  try:
-    options, arguments = getopt.getopt(sys.argv[1:], "",
-                                       ["more-info",
-                                        "less-info",
-                                        "build-dir=",
-                                        "ndk-dir=",
-                                        "symbols-dir=",
-                                        "symbols-zip=",
-                                        "arch=",
-                                        "help"])
-  except getopt.GetoptError, unused_error:
-    PrintUsage()
-
-  zip_arg = None
-  more_info = False
-  for option, value in options:
-    if option == "--help":
-      PrintUsage()
-    elif option == "--symbols-dir":
-      symbol.SYMBOLS_DIR = os.path.expanduser(value)
-    elif option == "--symbols-zip":
-      zip_arg = os.path.expanduser(value)
-    elif option == "--arch":
-      symbol.ARCH = value
-    elif option == "--build-dir":
-      symbol.BUILD_DIR = value
-    elif option == "--ndk-dir":
-      symbol.NDK_DIR = value
-    elif option == "--more-info":
-      more_info = True
-    elif option == "--less-info":
-      more_info = False
-
-  if not symbol.BUILD_DIR:
-    guess = _GuessDir(_DEFAULT_BUILD_DIR)
-    if not guess:
-      print "Couldn't find the build directory, please pass --build-dir."
-      return 1
-    print "Inferring the build directory path as " + guess
-    symbol.BUILD_DIR = guess
-
-  if not symbol.NDK_DIR:
-    guess = _GuessDir(_DEFAULT_NDK_DIR)
-    if not guess:
-      print "Couldn't find the Android NDK, please pass --ndk-dir."
-      return 1
-    print "Inferring the Android NDK path as " + guess
-    symbol.NDK_DIR = guess
-
-
-  if len(arguments) > 1:
-    PrintUsage()
-
-  if not arguments or arguments[0] == "-":
-    print "Reading native crash info from stdin"
-    f = sys.stdin
-  else:
-    print "Searching for native crashes in %s" % arguments[0]
-    f = open(arguments[0], "r")
-
-  lines = f.readlines()
-  f.close()
-
-  rootdir = None
-  if zip_arg:
-    rootdir, symbol.SYMBOLS_DIR = UnzipSymbols(zip_arg)
-
-  if symbol.SYMBOLS_DIR:
-    print "Reading Android symbols from", symbol.SYMBOLS_DIR
-
-  print "Reading Mojo symbols from", symbol.BUILD_DIR
-  stack_core.ConvertTrace(lines, more_info, GetSymbolMapping(lines))
-
-  if rootdir:
-    # be a good citizen and clean up...os.rmdir and os.removedirs() don't work
-    cmd = "rm -rf \"%s\"" % rootdir
-    print "\ncleaning up (%s)" % cmd
-    os.system(cmd)
-
-if __name__ == "__main__":
-  main()
-
-# vi: ts=2 sw=2
diff --git a/mojo/devtools/common/android_stack_parser/stack_core.py b/mojo/devtools/common/android_stack_parser/stack_core.py
deleted file mode 100644
index 2148e9d..0000000
--- a/mojo/devtools/common/android_stack_parser/stack_core.py
+++ /dev/null
@@ -1,262 +0,0 @@
-# Copyright (C) 2013 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""stack symbolizes native crash dumps."""
-
-import re
-
-import symbol
-
-def PrintTraceLines(trace_lines):
-  """Print back trace."""
-  maxlen = max(map(lambda tl: len(tl[1]), trace_lines))
-  print
-  print "Stack Trace:"
-  print "  RELADDR   " + "FUNCTION".ljust(maxlen) + "  FILE:LINE"
-  for tl in trace_lines:
-    (addr, symbol_with_offset, location) = tl
-    print "  %8s  %s  %s" % (addr, symbol_with_offset.ljust(maxlen), location)
-  return
-
-
-def PrintValueLines(value_lines):
-  """Print stack data values."""
-  maxlen = max(map(lambda tl: len(tl[2]), value_lines))
-  print
-  print "Stack Data:"
-  print "  ADDR      VALUE     " + "FUNCTION".ljust(maxlen) + "  FILE:LINE"
-  for vl in value_lines:
-    (addr, value, symbol_with_offset, location) = vl
-    print "  %8s  %8s  %s  %s" % (addr, value, symbol_with_offset.ljust(maxlen), location)
-  return
-
-UNKNOWN = "<unknown>"
-HEAP = "[heap]"
-STACK = "[stack]"
-
-
-def PrintOutput(trace_lines, value_lines, more_info):
-  if trace_lines:
-    PrintTraceLines(trace_lines)
-  if value_lines:
-    # TODO(cjhopman): it seems that symbol.SymbolInformation always fails to
-    # find information for addresses in value_lines in chrome libraries, and so
-    # value_lines have little value to us and merely clutter the output.
-    # Since information is sometimes contained in these lines (from system
-    # libraries), don't completely disable them.
-    if more_info:
-      PrintValueLines(value_lines)
-
-def PrintDivider():
-  print
-  print "-----------------------------------------------------\n"
-
-def ConvertTrace(lines, more_info, symbol_file_mappings):
-  """Convert strings containing native crash to a stack.
-
-  Args:
-    symbol_file_mappings: maps from library pathname to base name of file
-      containing symbols. If |symbol_file_mappings| doesn't contain a path than
-      the library pathname is used. See TranslatePathFromDeviceToLocal() for
-      more information.
-  """
-  process_info_line = re.compile("(pid: [0-9]+, tid: [0-9]+.*)")
-  signal_line = re.compile("(signal [0-9]+ \(.*\).*)")
-  register_line = re.compile("(([ ]*[0-9a-z]{2} [0-9a-f]{8}){4})")
-  thread_line = re.compile("(.*)(\-\-\- ){15}\-\-\-")
-  dalvik_jni_thread_line = re.compile("(\".*\" prio=[0-9]+ tid=[0-9]+ NATIVE.*)")
-  dalvik_native_thread_line = re.compile("(\".*\" sysTid=[0-9]+ nice=[0-9]+.*)")
-
-  width = "{8}"
-  if symbol.ARCH == "arm64" or symbol.ARCH == "x86_64" or symbol.ARCH == "x64":
-    width = "{16}"
-
-  # Matches LOG(FATAL) lines, like the following example:
-  #   [FATAL:source_file.cc(33)] Check failed: !instances_.empty()
-  log_fatal_line = re.compile("(\[FATAL\:.*\].*)$")
-
-  # Note that both trace and value line matching allow for variable amounts of
-  # whitespace (e.g. \t). This is because the we want to allow for the stack
-  # tool to operate on AndroidFeedback provided system logs. AndroidFeedback
-  # strips out double spaces that are found in tombsone files and logcat output.
-  #
-  # Examples of matched trace lines include lines from tombstone files like:
-  #   #00  pc 001cf42e  /data/data/com.my.project/lib/libmyproject.so
-  #   #00  pc 001cf42e  /data/data/com.my.project/lib/libmyproject.so (symbol)
-  # Or lines from AndroidFeedback crash report system logs like:
-  #   03-25 00:51:05.520 I/DEBUG ( 65): #00 pc 001cf42e /data/data/com.my.project/lib/libmyproject.so
-  # Please note the spacing differences.
-  trace_line = re.compile("(.*)\#(?P<frame>[0-9]+)[ \t]+(..)[ \t]+(0x)?(?P<address>[0-9a-f]{0,16})[ \t]+(?P<lib>[^\r\n \t]*)(?P<symbol_present> \((?P<symbol_name>.*)\))?")  # pylint: disable-msg=C6310
-
-  # Matches lines emitted by src/base/debug/stack_trace_android.cc, like:
-  #   #00 0x7324d92d /data/app-lib/org.chromium.native_test-1/libbase.cr.so+0x0006992d
-  # This pattern includes the unused named capture groups <symbol_present> and
-  # <symbol_name> so that it can interoperate with the |trace_line| regex.
-  debug_trace_line = re.compile(
-      '(.*)(?P<frame>\#[0-9]+ 0x[0-9a-f]' + width + ') '
-      '(?P<lib>[^+]+)( \(deleted\))+\+0x(?P<address>[0-9a-f]' + width + ')'
-      '(?P<symbol_present>)(?P<symbol_name>)')
-
-  # Examples of matched value lines include:
-  #   bea4170c  8018e4e9  /data/data/com.my.project/lib/libmyproject.so
-  #   bea4170c  8018e4e9  /data/data/com.my.project/lib/libmyproject.so (symbol)
-  #   03-25 00:51:05.530 I/DEBUG ( 65): bea4170c 8018e4e9 /data/data/com.my.project/lib/libmyproject.so
-  # Again, note the spacing differences.
-  value_line = re.compile("(.*)([0-9a-f]" + width + ")[ \t]+([0-9a-f]" + width + ")[ \t]+([^\r\n \t]*)( \((.*)\))?")
-  # Lines from 'code around' sections of the output will be matched before
-  # value lines because otheriwse the 'code around' sections will be confused as
-  # value lines.
-  #
-  # Examples include:
-  #   801cf40c ffffc4cc 00b2f2c5 00b2f1c7 00c1e1a8
-  #   03-25 00:51:05.530 I/DEBUG ( 65): 801cf40c ffffc4cc 00b2f2c5 00b2f1c7 00c1e1a8
-  code_line = re.compile("(.*)[ \t]*[a-f0-9]" + width +
-                         "[ \t]*[a-f0-9]" + width +
-                         "[ \t]*[a-f0-9]" + width +
-                         "[ \t]*[a-f0-9]" + width +
-                         "[ \t]*[a-f0-9]" + width +
-                         "[ \t]*[ \r\n]")  # pylint: disable-msg=C6310
-
-  trace_lines = []
-  value_lines = []
-  last_frame = -1
-
-  # It is faster to get symbol information with a single call rather than with
-  # separate calls for each line. Since symbol.SymbolInformation caches results,
-  # we can extract all the addresses that we will want symbol information for
-  # from the log and call symbol.SymbolInformation so that the results are
-  # cached in the following lookups.
-  code_addresses = {}
-  for ln in lines:
-    line = unicode(ln, errors='ignore')
-    lib, address = None, None
-
-    match = trace_line.match(line) or debug_trace_line.match(line)
-    if match:
-      address, lib = match.group('address', 'lib')
-
-    match = value_line.match(line)
-    if match and not code_line.match(line):
-      (_0, _1, address, lib, _2, _3) = match.groups()
-
-    if lib:
-      code_addresses.setdefault(lib, set()).add(address)
-
-  for lib in code_addresses:
-    symbol.SymbolInformationForSet(
-        symbol.TranslatePathFromDeviceToLocal(
-            symbol_file_mappings.get(lib, lib)),
-        code_addresses[lib], more_info)
-
-  for ln in lines:
-    # AndroidFeedback adds zero width spaces into its crash reports. These
-    # should be removed or the regular expresssions will fail to match.
-    line = unicode(ln, errors='ignore')
-    process_header = process_info_line.search(line)
-    signal_header = signal_line.search(line)
-    register_header = register_line.search(line)
-    thread_header = thread_line.search(line)
-    dalvik_jni_thread_header = dalvik_jni_thread_line.search(line)
-    dalvik_native_thread_header = dalvik_native_thread_line.search(line)
-    log_fatal_header = log_fatal_line.search(line)
-    if (process_header or signal_header or register_header or thread_header or
-        dalvik_jni_thread_header or dalvik_native_thread_header or
-        log_fatal_header) :
-      if trace_lines or value_lines:
-        PrintOutput(trace_lines, value_lines, more_info)
-        PrintDivider()
-        trace_lines = []
-        value_lines = []
-        last_frame = -1
-      if process_header:
-        print process_header.group(1)
-      if signal_header:
-        print signal_header.group(1)
-      if register_header:
-        print register_header.group(1)
-      if thread_header:
-        print thread_header.group(1)
-      if dalvik_jni_thread_header:
-        print dalvik_jni_thread_header.group(1)
-      if dalvik_native_thread_header:
-        print dalvik_native_thread_header.group(1)
-      if log_fatal_header:
-        print log_fatal_header.group(1)
-      continue
-
-    match = trace_line.match(line) or debug_trace_line.match(line)
-    if match:
-      frame, code_addr, area, symbol_present, symbol_name = match.group(
-          'frame', 'address', 'lib', 'symbol_present', 'symbol_name')
-
-      if frame <= last_frame and (trace_lines or value_lines):
-        PrintOutput(trace_lines, value_lines, more_info)
-        PrintDivider()
-        trace_lines = []
-        value_lines = []
-      last_frame = frame
-
-      if area == UNKNOWN or area == HEAP or area == STACK:
-        trace_lines.append((code_addr, "", area))
-      else:
-        # If a calls b which further calls c and c is inlined to b, we want to
-        # display "a -> b -> c" in the stack trace instead of just "a -> c"
-        info = symbol.SymbolInformation(symbol_file_mappings.get(area, area),
-                                        code_addr, more_info)
-        nest_count = len(info) - 1
-        for (source_symbol, source_location, object_symbol_with_offset) in info:
-          if not source_symbol:
-            if symbol_present:
-              source_symbol = symbol.CallCppFilt(symbol_name)
-            else:
-              source_symbol = UNKNOWN
-          if not source_location:
-            source_location = area
-          if nest_count > 0:
-            nest_count = nest_count - 1
-            trace_lines.append(("v------>", source_symbol, source_location))
-          else:
-            if not object_symbol_with_offset:
-              object_symbol_with_offset = source_symbol
-            trace_lines.append((code_addr,
-                                object_symbol_with_offset,
-                                source_location))
-    if code_line.match(line):
-      # Code lines should be ignored. If this were exluded the 'code around'
-      # sections would trigger value_line matches.
-      continue;
-    match = value_line.match(line)
-    if match:
-      (unused_, addr, value, area, symbol_present, symbol_name) = match.groups()
-      if area == UNKNOWN or area == HEAP or area == STACK or not area:
-        value_lines.append((addr, value, "", area))
-      else:
-        info = symbol.SymbolInformation(symbol_file_mappings.get(area, area),
-                                        value, more_info)
-        (source_symbol, source_location, object_symbol_with_offset) = info.pop()
-        if not source_symbol:
-          if symbol_present:
-            source_symbol = symbol.CallCppFilt(symbol_name)
-          else:
-            source_symbol = UNKNOWN
-        if not source_location:
-          source_location = area
-        if not object_symbol_with_offset:
-          object_symbol_with_offset = source_symbol
-        value_lines.append((addr,
-                            value,
-                            object_symbol_with_offset,
-                            source_location))
-
-  PrintOutput(trace_lines, value_lines, more_info)
diff --git a/mojo/devtools/common/android_stack_parser/symbol.py b/mojo/devtools/common/android_stack_parser/symbol.py
deleted file mode 100644
index 797326c..0000000
--- a/mojo/devtools/common/android_stack_parser/symbol.py
+++ /dev/null
@@ -1,563 +0,0 @@
-# Copyright (C) 2013 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Module for looking up symbolic debugging information.
-
-The information can include symbol names, offsets, and source locations.
-"""
-
-import glob
-import itertools
-import os
-import re
-import subprocess
-import zipfile
-
-NDK_DIR = ""
-BUILD_DIR = ""
-SYMBOLS_DIR = ""
-
-ARCH = "arm"
-
-TOOLCHAIN_INFO = None
-
-def Uname():
-  """'uname' for constructing prebuilt/<...> and out/host/<...> paths."""
-  uname = os.uname()[0]
-  proc = os.uname()[-1]
-  if uname == "Darwin":
-    if proc == "i386":
-      return "darwin-x86"
-    elif proc == "x86_64":
-      return "darwin-x86_64"
-    return "darwin-ppc"
-  if uname == "Linux":
-    if proc == "i386":
-      return "linux-x86"
-    else:
-      return "linux-x86_64"
-  return uname
-
-def ToolPath(tool, toolchain_info=None):
-  """Return a full qualified path to the specified tool"""
-  # ToolPath looks for the tools in the completely incorrect directory.
-  # This looks in the checked in android_tools.
-  if ARCH == "arm":
-    toolchain_source = "arm-linux-androideabi-4.9"
-    toolchain_prefix = "arm-linux-androideabi"
-  elif ARCH == "arm64":
-    toolchain_source = "aarch64-linux-android-4.9"
-    toolchain_prefix = "aarch64-linux-android"
-  elif ARCH == "x86":
-    toolchain_source = "x86-4.9"
-    toolchain_prefix = "i686-linux-android"
-  elif ARCH == "x86_64" or ARCH == "x64":
-    toolchain_source = "x86_64-4.9"
-    toolchain_prefix = "x86_64-linux-android"
-  elif ARCH == "mips":
-    toolchain_source = "mipsel-linux-android-4.9"
-    toolchain_prefix = "mipsel-linux-android"
-  else:
-    raise Exception("Could not find tool chain")
-
-  toolchain_subdir = ("toolchains/%s/prebuilt/%s/bin" % (
-                      toolchain_source, Uname()))
-
-  return os.path.join(NDK_DIR,
-                      toolchain_subdir,
-                      toolchain_prefix + "-" + tool)
-
-def FindToolchain():
-  """Look for the latest available toolchain
-
-  Args:
-    None
-
-  Returns:
-    A pair of strings containing toolchain label and target prefix.
-  """
-  global TOOLCHAIN_INFO
-  if TOOLCHAIN_INFO is not None:
-    return TOOLCHAIN_INFO
-
-  ## Known toolchains, newer ones in the front.
-  gcc_version = "4.9"
-  if ARCH == "arm64":
-    known_toolchains = [
-      ("aarch64-linux-android-" + gcc_version, "aarch64", "aarch64-linux-android")
-    ]
-  elif ARCH == "arm":
-    known_toolchains = [
-      ("arm-linux-androideabi-" + gcc_version, "arm", "arm-linux-androideabi")
-    ]
-  elif ARCH =="x86":
-    known_toolchains = [
-      ("x86-" + gcc_version, "x86", "i686-linux-android")
-    ]
-  elif ARCH =="x86_64" or ARCH =="x64":
-    known_toolchains = [
-      ("x86_64-" + gcc_version, "x86_64", "x86_64-linux-android")
-    ]
-  elif ARCH == "mips":
-    known_toolchains = [
-      ("mipsel-linux-android-" + gcc_version, "mips", "mipsel-linux-android")
-    ]
-  else:
-    known_toolchains = []
-
-  # Look for addr2line to check for valid toolchain path.
-  for (label, platform, target) in known_toolchains:
-    toolchain_info = (label, platform, target);
-    if os.path.exists(ToolPath("addr2line", toolchain_info)):
-      TOOLCHAIN_INFO = toolchain_info
-      print "Using toolchain from :" + ToolPath("", TOOLCHAIN_INFO)
-      return toolchain_info
-
-  raise Exception("Could not find tool chain")
-
-def GetAapt():
-  """Returns the path to aapt.
-
-  Args:
-    None
-
-  Returns:
-    the pathname of the 'aapt' executable.
-  """
-  sdk_home = os.path.join('third_party', 'android_tools', 'sdk')
-  sdk_home = os.environ.get('SDK_HOME', sdk_home)
-  aapt_exe = glob.glob(os.path.join(sdk_home, 'build-tools', '*', 'aapt'))
-  if not aapt_exe:
-    return None
-  return sorted(aapt_exe, key=os.path.getmtime, reverse=True)[0]
-
-def ApkMatchPackageName(aapt, apk_path, package_name):
-  """Returns true the APK's package name matches package_name.
-
-  Args:
-    aapt: pathname for the 'aapt' executable.
-    apk_path: pathname of the APK file.
-    package_name: package name to match.
-
-  Returns:
-    True if the package name matches or aapt is None, False otherwise.
-  """
-  if not aapt:
-    # Allow false positives
-    return True
-  aapt_output = subprocess.check_output(
-      [aapt, 'dump', 'badging', apk_path]).split('\n')
-  package_name_re = re.compile(r'package: .*name=\'(\S*)\'')
-  for line in aapt_output:
-    match = package_name_re.match(line)
-    if match:
-      return package_name == match.group(1)
-  return False
-
-def PathListJoin(prefix_list, suffix_list):
-   """Returns each prefix in prefix_list joined with each suffix in suffix list.
-
-   Args:
-     prefix_list: list of path prefixes.
-     suffix_list: list of path suffixes.
-
-   Returns:
-     List of paths each of which joins a prefix with a suffix.
-   """
-   return [
-       os.path.join(prefix, suffix)
-       for prefix in prefix_list for suffix in suffix_list ]
-
-def GetCandidates(filepart, candidate_fun, relative_dirs=None):
-  """Returns a list of candidate filenames.
-
-  Args:
-    filepart: the file part of the pathname.
-    candidate_fun: a function to apply to each candidate, returns a list.
-    relative_dirs: a list of relative directory names to search from.
-
-  Returns:
-    A list of candidate files ordered by modification time, newest first.
-  """
-  candidates = [BUILD_DIR]
-
-  if relative_dirs:
-    candidates = PathListJoin(candidates, relative_dirs)
-
-  candidates = PathListJoin(candidates, [filepart])
-  candidates = list(
-      itertools.chain.from_iterable(map(candidate_fun, candidates)))
-  candidates = sorted(candidates, key=os.path.getmtime, reverse=True)
-  return candidates
-
-def GetCandidateApks():
-  """Returns a list of APKs which could contain the library.
-
-  Args:
-    None
-
-  Returns:
-    list of APK filename which could contain the library.
-  """
-  return GetCandidates('*.apk', glob.glob, relative_dirs=['apks'])
-
-def GetCrazyLib(apk_filename):
-  """Returns the name of the first crazy library from this APK.
-
-  Args:
-    apk_filename: name of an APK file.
-
-  Returns:
-    Name of the first library which would be crazy loaded from this APK.
-  """
-  zip_file = zipfile.ZipFile(apk_filename, 'r')
-  for filename in zip_file.namelist():
-    match = re.match('lib/[^/]*/crazy.(lib.*[.]so)', filename)
-    if match:
-      return match.group(1)
-
-def GetMatchingApks(device_apk_name):
-  """Find any APKs which match the package indicated by the device_apk_name.
-
-  Args:
-     device_apk_name: name of the APK on the device.
-
-  Returns:
-     A list of APK filenames which could contain the desired library.
-  """
-  match = re.match('(.*)-[0-9]+[.]apk$', device_apk_name)
-  if not match:
-    return None
-  package_name = match.group(1)
-  return filter(
-      lambda candidate_apk:
-          ApkMatchPackageName(GetAapt(), candidate_apk, package_name),
-      GetCandidateApks())
-
-def MapDeviceApkToLibrary(device_apk_name):
-  """Provide a library name which corresponds with device_apk_name.
-
-  Args:
-    device_apk_name: name of the APK on the device.
-
-  Returns:
-    Name of the library which corresponds to that APK.
-  """
-  matching_apks = GetMatchingApks(device_apk_name)
-  for matching_apk in matching_apks:
-    crazy_lib = GetCrazyLib(matching_apk)
-    if crazy_lib:
-      return crazy_lib
-
-def GetCandidateLibraries(library_name):
-  """Returns a list of candidate library filenames.
-
-  Args:
-    library_name: basename of the library to match.
-
-  Returns:
-    A list of matching library filenames for library_name.
-  """
-  return GetCandidates(
-      library_name,
-      lambda filename: filter(os.path.exists, [filename]))
-
-def TranslatePathFromDeviceToLocal(lib):
-  """Maps a path as seen on the device to a path on the local file system
-  containing symbols.
-
-  Args:
-    lib: library (or executable) pathname from device.
-  """
-
-  # SymbolInformation(lib, addr) receives lib that is either a basename or
-  # the path from symbols root to the symbols file. This needs to be translated
-  # to point to the correct .so path. If the user doesn't explicitly specify
-  # which directory to use, then use the most recently updated one in one of
-  # the known directories.
-  library_name = os.path.basename(lib)
-
-  # The filename in the stack trace maybe an APK name rather than a library
-  # name. This happens when the library was loaded directly from inside the
-  # APK. If this is the case we try to figure out the library name by looking
-  # for a matching APK file and finding the name of the library in contains.
-  # The name of the APK file on the device is of the form
-  # <package_name>-<number>.apk. The APK file on the host may have any name
-  # so we look at the APK badging to see if the package name matches.
-  if re.search('-[0-9]+[.]apk$', library_name):
-    mapping = MapDeviceApkToLibrary(library_name)
-    if mapping:
-      library_name = mapping
-
-  candidate_libraries = GetCandidateLibraries(library_name)
-  return (candidate_libraries[0] if candidate_libraries else
-      os.path.join(SYMBOLS_DIR, lib))
-
-def SymbolInformation(lib, addr, get_detailed_info):
-  """Look up symbol information about an address.
-
-  Args:
-    lib: library (or executable) pathname containing symbols
-    addr: string hexidecimal address
-
-  Returns:
-    A list of the form [(source_symbol, source_location,
-    object_symbol_with_offset)].
-
-    If the function has been inlined then the list may contain
-    more than one element with the symbols for the most deeply
-    nested inlined location appearing first.  The list is
-    always non-empty, even if no information is available.
-
-    Usually you want to display the source_location and
-    object_symbol_with_offset from the last element in the list.
-  """
-  lib = TranslatePathFromDeviceToLocal(lib)
-  info = SymbolInformationForSet(lib, set([addr]), get_detailed_info)
-  return (info and info.get(addr)) or [(None, None, None)]
-
-
-def SymbolInformationForSet(lib, unique_addrs, get_detailed_info):
-  """Look up symbol information for a set of addresses from the given library.
-
-  Args:
-    lib: library (or executable) pathname containing symbols
-    unique_addrs: set of hexidecimal addresses
-
-  Returns:
-    A dictionary of the form {addr: [(source_symbol, source_location,
-    object_symbol_with_offset)]} where each address has a list of
-    associated symbols and locations.  The list is always non-empty.
-
-    If the function has been inlined then the list may contain
-    more than one element with the symbols for the most deeply
-    nested inlined location appearing first.  The list is
-    always non-empty, even if no information is available.
-
-    Usually you want to display the source_location and
-    object_symbol_with_offset from the last element in the list.
-  """
-  if not lib:
-    return None
-
-  addr_to_line = CallAddr2LineForSet(lib, unique_addrs)
-  if not addr_to_line:
-    return None
-
-  if get_detailed_info:
-    addr_to_objdump = CallObjdumpForSet(lib, unique_addrs)
-    if not addr_to_objdump:
-      return None
-  else:
-    addr_to_objdump = dict((addr, ("", 0)) for addr in unique_addrs)
-
-  result = {}
-  for addr in unique_addrs:
-    source_info = addr_to_line.get(addr)
-    if not source_info:
-      source_info = [(None, None)]
-    if addr in addr_to_objdump:
-      (object_symbol, object_offset) = addr_to_objdump.get(addr)
-      object_symbol_with_offset = FormatSymbolWithOffset(object_symbol,
-                                                         object_offset)
-    else:
-      object_symbol_with_offset = None
-    result[addr] = [(source_symbol, source_location, object_symbol_with_offset)
-        for (source_symbol, source_location) in source_info]
-
-  return result
-
-
-class MemoizedForSet(object):
-  def __init__(self, fn):
-    self.fn = fn
-    self.cache = {}
-
-  def __call__(self, lib, unique_addrs):
-    lib_cache = self.cache.setdefault(lib, {})
-
-    no_cache = filter(lambda x: x not in lib_cache, unique_addrs)
-    if no_cache:
-      lib_cache.update((k, None) for k in no_cache)
-      result = self.fn(lib, no_cache)
-      if result:
-        lib_cache.update(result)
-
-    return dict((k, lib_cache[k]) for k in unique_addrs if lib_cache[k])
-
-
-@MemoizedForSet
-def CallAddr2LineForSet(lib, unique_addrs):
-  """Look up line and symbol information for a set of addresses.
-
-  Args:
-    lib: library (or executable) pathname containing symbols
-    unique_addrs: set of string hexidecimal addresses look up.
-
-  Returns:
-    A dictionary of the form {addr: [(symbol, file:line)]} where
-    each address has a list of associated symbols and locations
-    or an empty list if no symbol information was found.
-
-    If the function has been inlined then the list may contain
-    more than one element with the symbols for the most deeply
-    nested inlined location appearing first.
-  """
-  if not lib or not os.path.isfile(lib):
-    return None
-
-  (label, platform, target) = FindToolchain()
-  cmd = [ToolPath("addr2line"), "--functions", "--inlines",
-         "--demangle", "--exe=" + lib]
-  child = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
-
-  result = {}
-  addrs = sorted(unique_addrs)
-  for addr in addrs:
-    child.stdin.write("0x%s\n" % addr)
-    child.stdin.flush()
-    records = []
-    first = True
-    while True:
-      symbol = child.stdout.readline().strip()
-      if symbol == "??":
-        symbol = None
-      location = child.stdout.readline().strip()
-      if location == "??:0":
-        location = None
-      if symbol is None and location is None:
-        break
-      records.append((symbol, location))
-      if first:
-        # Write a blank line as a sentinel so we know when to stop
-        # reading inlines from the output.
-        # The blank line will cause addr2line to emit "??\n??:0\n".
-        child.stdin.write("\n")
-        first = False
-    result[addr] = records
-  child.stdin.close()
-  child.stdout.close()
-  return result
-
-
-def StripPC(addr):
-  """Strips the Thumb bit a program counter address when appropriate.
-
-  Args:
-    addr: the program counter address
-
-  Returns:
-    The stripped program counter address.
-  """
-  global ARCH
-
-  if ARCH == "arm":
-    return addr & ~1
-  return addr
-
-@MemoizedForSet
-def CallObjdumpForSet(lib, unique_addrs):
-  """Use objdump to find out the names of the containing functions.
-
-  Args:
-    lib: library (or executable) pathname containing symbols
-    unique_addrs: set of string hexidecimal addresses to find the functions for.
-
-  Returns:
-    A dictionary of the form {addr: (string symbol, offset)}.
-  """
-  if not lib:
-    return None
-
-  symbols = SYMBOLS_DIR + lib
-  if not os.path.exists(symbols):
-    return None
-
-  symbols = SYMBOLS_DIR + lib
-  if not os.path.exists(symbols):
-    return None
-
-  result = {}
-
-  # Function lines look like:
-  #   000177b0 <android::IBinder::~IBinder()+0x2c>:
-  # We pull out the address and function first. Then we check for an optional
-  # offset. This is tricky due to functions that look like "operator+(..)+0x2c"
-  func_regexp = re.compile("(^[a-f0-9]*) \<(.*)\>:$")
-  offset_regexp = re.compile("(.*)\+0x([a-f0-9]*)")
-
-  # A disassembly line looks like:
-  #   177b2:  b510        push  {r4, lr}
-  asm_regexp = re.compile("(^[ a-f0-9]*):[ a-f0-0]*.*$")
-
-  for target_addr in unique_addrs:
-    start_addr_dec = str(StripPC(int(target_addr, 16)))
-    stop_addr_dec = str(StripPC(int(target_addr, 16)) + 8)
-    cmd = [ToolPath("objdump"),
-           "--section=.text",
-           "--demangle",
-           "--disassemble",
-           "--start-address=" + start_addr_dec,
-           "--stop-address=" + stop_addr_dec,
-           symbols]
-
-    current_symbol = None    # The current function symbol in the disassembly.
-    current_symbol_addr = 0  # The address of the current function.
-
-    stream = subprocess.Popen(cmd, stdout=subprocess.PIPE).stdout
-    for line in stream:
-      # Is it a function line like:
-      #   000177b0 <android::IBinder::~IBinder()>:
-      components = func_regexp.match(line)
-      if components:
-        # This is a new function, so record the current function and its address.
-        current_symbol_addr = int(components.group(1), 16)
-        current_symbol = components.group(2)
-
-        # Does it have an optional offset like: "foo(..)+0x2c"?
-        components = offset_regexp.match(current_symbol)
-        if components:
-          current_symbol = components.group(1)
-          offset = components.group(2)
-          if offset:
-            current_symbol_addr -= int(offset, 16)
-
-      # Is it an disassembly line like:
-      #   177b2:  b510        push  {r4, lr}
-      components = asm_regexp.match(line)
-      if components:
-        addr = components.group(1)
-        i_addr = int(addr, 16)
-        i_target = StripPC(int(target_addr, 16))
-        if i_addr == i_target:
-          result[target_addr] = (current_symbol, i_target - current_symbol_addr)
-    stream.close()
-
-  return result
-
-
-def CallCppFilt(mangled_symbol):
-  cmd = [ToolPath("c++filt")]
-  process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
-  process.stdin.write(mangled_symbol)
-  process.stdin.write("\n")
-  process.stdin.close()
-  demangled_symbol = process.stdout.readline().strip()
-  process.stdout.close()
-  return demangled_symbol
-
-def FormatSymbolWithOffset(symbol, offset):
-  if offset == 0:
-    return symbol
-  return "%s+%d" % (symbol, offset)
diff --git a/mojo/devtools/common/devtoolslib/__init__.py b/mojo/devtools/common/devtoolslib/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/devtools/common/devtoolslib/__init__.py
+++ /dev/null
diff --git a/mojo/devtools/common/devtoolslib/android_shell.py b/mojo/devtools/common/devtoolslib/android_shell.py
deleted file mode 100644
index e07ce77..0000000
--- a/mojo/devtools/common/devtoolslib/android_shell.py
+++ /dev/null
@@ -1,430 +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.
-
-import atexit
-import hashlib
-import json
-import logging
-import os
-import os.path
-import random
-import re
-import subprocess
-import sys
-import tempfile
-import threading
-import time
-
-from devtoolslib.http_server import start_http_server
-from devtoolslib.shell import Shell
-from devtoolslib.utils import overrides
-
-
-# Tags used by mojo shell Java logging.
-_LOGCAT_JAVA_TAGS = [
-    'AndroidHandler',
-    'MojoFileHelper',
-    'MojoMain',
-    'MojoShellActivity',
-    'MojoShellApplication',
-]
-
-# Tags used by native logging reflected in the logcat.
-_LOGCAT_NATIVE_TAGS = [
-    'chromium',
-    'sky',
-]
-
-_MOJO_SHELL_PACKAGE_NAME = 'org.chromium.mojo.shell'
-
-
-_logger = logging.getLogger()
-
-
-def _exit_if_needed(process):
-  """Exits |process| if it is still alive."""
-  if process.poll() is None:
-    process.kill()
-
-
-def _find_available_port(netstat_output, max_attempts=10000):
-  opened = [int(x.strip().split()[3].split(':')[1])
-            for x in netstat_output if x.startswith(' tcp')]
-  for _ in xrange(max_attempts):
-    port = random.randint(4096, 16384)
-    if port not in opened:
-      return port
-  else:
-    raise Exception('Failed to identify an available port.')
-
-
-def _find_available_host_port():
-  netstat_output = subprocess.check_output(['netstat'])
-  return _find_available_port(netstat_output)
-
-
-class AndroidShell(Shell):
-  """Wrapper around Mojo shell running on an Android device.
-
-  Args:
-    adb_path: Path to adb, optional if adb is in PATH.
-    target_device: Device to run on, if multiple devices are connected.
-    logcat_tags: Comma-separated list of additional logcat tags to use.
-  """
-
-  def __init__(self, adb_path="adb", target_device=None, logcat_tags=None,
-               verbose_pipe=None):
-    self.adb_path = adb_path
-    self.target_device = target_device
-    self.stop_shell_registered = False
-    self.adb_running_as_root = None
-    self.additional_logcat_tags = logcat_tags
-    self.verbose_pipe = verbose_pipe if verbose_pipe else open(os.devnull, 'w')
-
-  def _adb_command(self, args):
-    """Forms an adb command from the given arguments, prepending the adb path
-    and adding a target device specifier, if needed.
-    """
-    adb_command = [self.adb_path]
-    if self.target_device:
-      adb_command.extend(['-s', self.target_device])
-    adb_command.extend(args)
-    return adb_command
-
-  def _read_fifo(self, fifo_path, pipe, on_fifo_closed, max_attempts=5):
-    """Reads |fifo_path| on the device and write the contents to |pipe|.
-
-    Calls |on_fifo_closed| when the fifo is closed. This method will try to find
-    the path up to |max_attempts|, waiting 1 second between each attempt. If it
-    cannot find |fifo_path|, a exception will be raised.
-    """
-    fifo_command = self._adb_command(
-        ['shell', 'test -e "%s"; echo $?' % fifo_path])
-
-    def _run():
-      def _wait_for_fifo():
-        for _ in xrange(max_attempts):
-          if subprocess.check_output(fifo_command)[0] == '0':
-            return
-          time.sleep(1)
-        if on_fifo_closed:
-          on_fifo_closed()
-        raise Exception("Unable to find fifo.")
-      _wait_for_fifo()
-      stdout_cat = subprocess.Popen(
-          self._adb_command(['shell', 'cat', fifo_path]), stdout=pipe)
-      atexit.register(_exit_if_needed, stdout_cat)
-      stdout_cat.wait()
-      if on_fifo_closed:
-        on_fifo_closed()
-
-    thread = threading.Thread(target=_run, name="StdoutRedirector")
-    thread.start()
-
-  def _find_available_device_port(self):
-    netstat_output = subprocess.check_output(
-        self._adb_command(['shell', 'netstat']))
-    return _find_available_port(netstat_output)
-
-  def _forward_device_port_to_host(self, device_port, host_port):
-    """Maps the device port to the host port. If |device_port| is 0, a random
-    available port is chosen.
-
-    Returns:
-      The device port.
-    """
-    assert host_port
-    # Root is not required for `adb forward` (hence we don't check the return
-    # value), but if we can run adb as root, we have to do it now, because
-    # restarting adbd as root clears any port mappings. See
-    # https://github.com/domokit/devtools/issues/20.
-    self._run_adb_as_root()
-
-    if device_port == 0:
-      # TODO(ppi): Should we have a retry loop to handle the unlikely races?
-      device_port = self._find_available_device_port()
-    subprocess.check_call(self._adb_command([
-        "reverse", "tcp:%d" % device_port, "tcp:%d" % host_port]))
-
-    def _unmap_port():
-      unmap_command = self._adb_command([
-          "reverse", "--remove", "tcp:%d" % device_port])
-      subprocess.Popen(unmap_command)
-    atexit.register(_unmap_port)
-    return device_port
-
-  def _forward_host_port_to_device(self, host_port, device_port):
-    """Maps the host port to the device port. If |host_port| is 0, a random
-    available port is chosen.
-
-    Returns:
-      The host port.
-    """
-    assert device_port
-    self._run_adb_as_root()
-
-    if host_port == 0:
-      # TODO(ppi): Should we have a retry loop to handle the unlikely races?
-      host_port = _find_available_host_port()
-    subprocess.check_call(self._adb_command([
-        "forward", 'tcp:%d' % host_port, 'tcp:%d' % device_port]))
-
-    def _unmap_port():
-      unmap_command = self._adb_command([
-          "forward", "--remove", "tcp:%d" % device_port])
-      subprocess.Popen(unmap_command)
-    atexit.register(_unmap_port)
-    return host_port
-
-  def _run_adb_as_root(self):
-    if self.adb_running_as_root is not None:
-      return self.adb_running_as_root
-
-    if ('cannot run as root' not in subprocess.check_output(
-        self._adb_command(['root']))):
-      # Wait for adbd to restart.
-      subprocess.check_call(
-          self._adb_command(['wait-for-device']),
-          stdout=self.verbose_pipe)
-      self.adb_running_as_root = True
-    else:
-      self.adb_running_as_root = False
-
-    return self.adb_running_as_root
-
-  def _is_shell_package_installed(self):
-    # Adb should print one line if the package is installed and return empty
-    # string otherwise.
-    return len(subprocess.check_output(self._adb_command([
-        'shell', 'pm', 'list', 'packages', _MOJO_SHELL_PACKAGE_NAME]))) > 0
-
-  def check_device(self):
-    """Verifies if the device configuration allows adb to run.
-
-    If a target device was indicated in the constructor, it checks that the
-    device is available. Otherwise, it checks that there is exactly one
-    available device.
-
-    Returns:
-      A tuple of (result, msg). |result| is True iff if the device is correctly
-      configured and False otherwise. |msg| is the reason for failure if
-      |result| is False and None otherwise.
-    """
-    adb_devices_output = subprocess.check_output(
-        self._adb_command(['devices']))
-    # Skip the header line, strip empty lines at the end.
-    device_list = [line.strip() for line in adb_devices_output.split('\n')[1:]
-                   if line.strip()]
-
-    if self.target_device:
-      if any([line.startswith(self.target_device) and
-              line.endswith('device') for line in device_list]):
-        return True, None
-      else:
-        return False, 'Cannot connect to the selected device.'
-
-    if len(device_list) > 1:
-      return False, ('More than one device connected and target device not '
-                     'specified.')
-
-    if not len(device_list):
-      return False, 'No devices connected.'
-
-    if not device_list[0].endswith('device'):
-      return False, 'Connected device is not available.'
-
-    return True, None
-
-  def install_apk(self, shell_apk_path):
-    """Installs the apk on the device.
-
-    This method computes checksum of the APK and skips the installation if the
-    fingerprint matches the one saved on the device upon the previous
-    installation.
-
-    Args:
-      shell_apk_path: Path to the shell Android binary.
-    """
-    device_sha1_path = '/sdcard/%s/%s.sha1' % (_MOJO_SHELL_PACKAGE_NAME,
-                                               'MojoShell')
-    apk_sha1 = hashlib.sha1(open(shell_apk_path, 'rb').read()).hexdigest()
-    device_apk_sha1 = subprocess.check_output(self._adb_command([
-        'shell', 'cat', device_sha1_path]))
-    do_install = (apk_sha1 != device_apk_sha1 or
-                  not self._is_shell_package_installed())
-
-    if do_install:
-      subprocess.check_call(
-          self._adb_command(['install', '-r', shell_apk_path, '-i',
-                            _MOJO_SHELL_PACKAGE_NAME]),
-          stdout=self.verbose_pipe)
-
-      # Update the stamp on the device.
-      with tempfile.NamedTemporaryFile() as fp:
-        fp.write(apk_sha1)
-        fp.flush()
-        subprocess.check_call(self._adb_command(['push', fp.name,
-                                                device_sha1_path]),
-                              stdout=self.verbose_pipe)
-    else:
-      # To ensure predictable state after running install_apk(), we need to stop
-      # the shell here, as this is what "adb install" implicitly does.
-      self.stop_shell()
-
-  def start_shell(self,
-                 arguments,
-                 stdout=None,
-                 on_application_stop=None):
-    """Starts the mojo shell, passing it the given arguments.
-
-    Args:
-      arguments: List of arguments for the shell. It must contain the
-          "--origin=" arg. shell_arguments.configure_local_origin() can be used
-          to set up a local directory on the host machine as origin.
-      stdout: Valid argument for subprocess.Popen() or None.
-    """
-    if not self.stop_shell_registered:
-      atexit.register(self.stop_shell)
-      self.stop_shell_registered = True
-
-    STDOUT_PIPE = "/data/data/%s/stdout.fifo" % _MOJO_SHELL_PACKAGE_NAME
-
-    cmd = self._adb_command(['shell', 'am', 'start',
-                            '-S',
-                            '-a', 'android.intent.action.VIEW',
-                            '-n', '%s/.MojoShellActivity' %
-                            _MOJO_SHELL_PACKAGE_NAME])
-
-    parameters = []
-    if stdout or on_application_stop:
-      # We need to run as root to access the fifo file we use for stdout
-      # redirection.
-      if self._run_adb_as_root():
-        # Remove any leftover fifo file after the previous run.
-        subprocess.check_call(self._adb_command(
-            ['shell', 'rm', '-f', STDOUT_PIPE]))
-
-        parameters.append('--fifo-path=%s' % STDOUT_PIPE)
-        self._read_fifo(STDOUT_PIPE, stdout, on_application_stop)
-      else:
-        _logger.warning("Running without root access, full stdout of the "
-                        "shell won't be available.")
-    # The origin has to be specified whether it's local or external.
-    assert any("--origin=" in arg for arg in arguments)
-    parameters.extend(arguments)
-
-    if parameters:
-      encodedParameters = json.dumps(parameters)
-      cmd += ['--es', 'encodedParameters', encodedParameters]
-
-    subprocess.check_call(cmd, stdout=self.verbose_pipe)
-
-  def stop_shell(self):
-    """Stops the mojo shell."""
-    subprocess.check_call(self._adb_command(['shell',
-                                            'am',
-                                            'force-stop',
-                                            _MOJO_SHELL_PACKAGE_NAME]))
-
-  def clean_logs(self):
-    """Cleans the logs on the device."""
-    subprocess.check_call(self._adb_command(['logcat', '-c']))
-
-  def show_logs(self, include_native_logs=True):
-    """Displays the log for the mojo shell.
-
-    Returns:
-      The process responsible for reading the logs.
-    """
-    tags = _LOGCAT_JAVA_TAGS
-    if include_native_logs:
-      tags.extend(_LOGCAT_NATIVE_TAGS)
-    if self.additional_logcat_tags is not None:
-      tags.extend(self.additional_logcat_tags.split(","))
-    logcat = subprocess.Popen(
-        self._adb_command(['logcat', '-s', ' '.join(tags)]),
-        stdout=sys.stdout)
-    atexit.register(_exit_if_needed, logcat)
-    return logcat
-
-  def forward_observatory_ports(self):
-    """Forwards the ports used by the dart observatories to the host machine.
-    """
-    logcat = subprocess.Popen(self._adb_command(['logcat']),
-                              stdout=subprocess.PIPE)
-    atexit.register(_exit_if_needed, logcat)
-
-    def _forward_observatories_as_needed():
-      while True:
-        line = logcat.stdout.readline()
-        if not line:
-          break
-        match = re.search(r'Observatory listening on http://127.0.0.1:(\d+)',
-                          line)
-        if match:
-          device_port = int(match.group(1))
-          host_port = self._forward_host_port_to_device(0, device_port)
-          print ("Dart observatory available at the host at http://127.0.0.1:%d"
-                 % host_port)
-
-    logcat_watch_thread = threading.Thread(
-        target=_forward_observatories_as_needed)
-    logcat_watch_thread.start()
-
-  @overrides(Shell)
-  def serve_local_directory(self, local_dir_path, port=0):
-    assert local_dir_path
-    mappings = [('', [local_dir_path])]
-    server_address = start_http_server(mappings, host_port=port)
-
-    return 'http://127.0.0.1:%d/' % self._forward_device_port_to_host(
-        port, server_address[1])
-
-  @overrides(Shell)
-  def serve_local_directories(self, mappings, port=0):
-    assert mappings
-    server_address = start_http_server(mappings, host_port=port)
-
-    return 'http://127.0.0.1:%d/' % self._forward_device_port_to_host(
-        port, server_address[1])
-
-  @overrides(Shell)
-  def forward_host_port_to_shell(self, host_port):
-    self._forward_host_port_to_device(host_port, host_port)
-
-  @overrides(Shell)
-  def run(self, arguments):
-    self.clean_logs()
-    self.forward_observatory_ports()
-
-    # If we are running as root, don't carry over the native logs from logcat -
-    # we will have these in the stdout.
-    p = self.show_logs(include_native_logs=(not self._run_adb_as_root()))
-    self.start_shell(arguments, sys.stdout, p.terminate)
-    p.wait()
-    return None
-
-  @overrides(Shell)
-  def run_and_get_output(self, arguments, timeout=None):
-    class Results:
-      """Workaround for Python scoping rules that prevent assigning to variables
-      from the outer scope.
-      """
-      output = None
-
-    def do_run():
-      (r, w) = os.pipe()
-      with os.fdopen(r, "r") as rf:
-        with os.fdopen(w, "w") as wf:
-          self.start_shell(arguments, wf, wf.close)
-          Results.output = rf.read()
-
-    run_thread = threading.Thread(target=do_run)
-    run_thread.start()
-    run_thread.join(timeout)
-
-    if run_thread.is_alive():
-      self.stop_shell()
-      return None, Results.output, True
-    return None, Results.output, False
diff --git a/mojo/devtools/common/devtoolslib/apptest.py b/mojo/devtools/common/devtoolslib/apptest.py
deleted file mode 100644
index 59e23e2..0000000
--- a/mojo/devtools/common/devtoolslib/apptest.py
+++ /dev/null
@@ -1,77 +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.
-
-"""Apptest is a Mojo application that interacts with another Mojo application
-and verifies assumptions about behavior of the app being tested.
-"""
-
-import logging
-import time
-
-
-_logger = logging.getLogger()
-
-
-def _build_shell_arguments(shell_args, apptest_url, apptest_args):
-  """Builds the list of arguments for the shell.
-
-  Args:
-    shell_args: List of arguments for the shell run.
-    apptest_url: Url of the apptest app to run.
-    apptest_args: Parameters to be passed to the apptest app.
-
-  Returns:
-    Single list of shell arguments.
-  """
-  result = list(shell_args)
-  if apptest_args:
-    result.append("--args-for=%s %s" % (apptest_url, " ".join(apptest_args)))
-  result.append(apptest_url)
-  return result
-
-
-def run_apptest(shell, shell_args, apptest_url, apptest_args, timeout,
-                output_test):
-  """Runs shell with the given arguments, retrieves the output and applies
-  |output_test| to determine if the run was successful.
-
-  Args:
-    shell: Wrapper around concrete Mojo shell, implementing devtools Shell
-        interface.
-    shell_args: List of arguments for the shell run.
-    apptest_url: Url of the apptest app to run.
-    apptest_args: Parameters to be passed to the apptest app.
-    output_test: Function accepting the shell output and returning True iff
-        the output indicates a successful run.
-
-  Returns:
-    True iff the test succeeded, False otherwise.
-  """
-  arguments = _build_shell_arguments(shell_args, apptest_url, apptest_args)
-  command_line = "mojo_shell " + " ".join(["%r" % x for x in arguments])
-
-  _logger.debug("Starting: " + command_line)
-  start_time = time.time()
-  (exit_code, output, did_time_out) = shell.run_and_get_output(arguments,
-                                                               timeout)
-  run_time = time.time() - start_time
-  _logger.debug("Completed: " + command_line)
-
-  # Only log if it took more than 3 second.
-  if run_time >= 3:
-    _logger.info("Test took %.3f seconds: %s" % (run_time, command_line))
-
-  if exit_code or did_time_out or not output_test(output):
-    print 'Failed test: %r' % command_line
-    if exit_code:
-      print '  due to shell exit code %d' % exit_code
-    elif did_time_out:
-      print '  due to exceeded timeout of %fs' % timeout
-    else:
-      print '  due to test results'
-    print 72 * '-'
-    print output
-    print 72 * '-'
-    return False
-  return True
diff --git a/mojo/devtools/common/devtoolslib/apptest_dart.py b/mojo/devtools/common/devtoolslib/apptest_dart.py
deleted file mode 100644
index fe6131f..0000000
--- a/mojo/devtools/common/devtoolslib/apptest_dart.py
+++ /dev/null
@@ -1,35 +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.
-
-"""Apptest runner specific to the particular Dart apptest framework in
-/mojo/dart/apptests, built on top of the general apptest runner."""
-
-import logging
-import re
-
-_logging = logging.getLogger()
-
-from devtoolslib.apptest import run_apptest
-
-SUCCESS_PATTERN = re.compile('^.+ .+: All tests passed!', re.MULTILINE)
-
-
-def _dart_apptest_output_test(output):
-  return SUCCESS_PATTERN.search(output) is not None
-
-
-# TODO(erg): Support android, launched services and fixture isolation.
-def run_dart_apptest(shell, shell_args, apptest_url, apptest_args, timeout):
-  """Runs a dart apptest.
-
-  Args:
-    shell_args: The arguments for mojo_shell.
-    apptest_url: Url of the apptest app to run.
-    apptest_args: Parameters to be passed to the apptest app.
-
-  Returns:
-    True iff the test succeeded, False otherwise.
-  """
-  return run_apptest(shell, shell_args, apptest_url, apptest_args, timeout,
-                     _dart_apptest_output_test)
diff --git a/mojo/devtools/common/devtoolslib/apptest_gtest.py b/mojo/devtools/common/devtoolslib/apptest_gtest.py
deleted file mode 100644
index fefeab7..0000000
--- a/mojo/devtools/common/devtoolslib/apptest_gtest.py
+++ /dev/null
@@ -1,120 +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.
-
-"""Apptest runner specific to the particular gtest-based apptest framework in
-/mojo/public/cpp/application/tests/, built on top of the general apptest
-runner."""
-
-import logging
-import re
-
-from devtoolslib.apptest import run_apptest
-
-
-_logger = logging.getLogger()
-
-
-def _gtest_apptest_output_test(output):
-  # Fail on output with gtest's "[  FAILED  ]" or a lack of "[  PASSED  ]".
-  # The latter condition ensures failure on broken command lines or output.
-  # Check output instead of exit codes because mojo_shell always exits with 0.
-  if (output is None or
-      (output.find("[  FAILED  ]") != -1 or output.find("[  PASSED  ]") == -1)):
-    return False
-  return True
-
-
-def run_gtest_apptest(shell, shell_args, apptest_url, apptest_args, timeout,
-                      isolate):
-  """Runs a gtest apptest.
-
-  Args:
-    shell: Wrapper around concrete Mojo shell, implementing devtools Shell
-        interface.
-    shell_args: The arguments for mojo_shell.
-    apptest_url: Url of the apptest app to run.
-    apptest_args: Parameters to be passed to the apptest app.
-    isolate: Iff True, each test in the app will be run in a separate shell run.
-
-  Returns:
-    True iff the test succeeded, False otherwise.
-  """
-
-  if not isolate:
-    return run_apptest(shell, shell_args, apptest_url, apptest_args, timeout,
-                       _gtest_apptest_output_test)
-
-  # List the apptest fixtures so they can be run independently for isolation.
-  fixtures = get_fixtures(shell, shell_args, apptest_url)
-  if not fixtures:
-    print "No tests to run found in %s." % apptest_url
-    return False
-
-  apptest_result = True
-  for fixture in fixtures:
-    isolated_apptest_args = apptest_args + ["--gtest_filter=%s" % fixture]
-    success = run_apptest(shell, shell_args, apptest_url, isolated_apptest_args,
-                          timeout, _gtest_apptest_output_test)
-
-    if not success:
-      apptest_result = False
-
-  return apptest_result
-
-
-def get_fixtures(shell, shell_args, apptest):
-  """Returns the "Test.Fixture" list from an apptest using mojo_shell.
-
-  Tests are listed by running the given apptest in mojo_shell and passing
-  --gtest_list_tests. The output is parsed and reformatted into a list like
-  [TestSuite.TestFixture, ... ]
-  An empty list is returned on failure, with errors logged.
-
-  Args:
-    apptest: The URL of the test application to run.
-  """
-  arguments = []
-  arguments.extend(shell_args)
-  arguments.append("--args-for=%s %s" % (apptest, "--gtest_list_tests"))
-  arguments.append(apptest)
-
-  (exit_code, output, did_time_out) = shell.run_and_get_output(arguments)
-  if exit_code or did_time_out:
-    command_line = "mojo_shell " + " ".join(["%r" % x for x in arguments])
-    print "Failed to get test fixtures: %r" % command_line
-    print 72 * '-'
-    print output
-    print 72 * '-'
-    return []
-
-  _logger.debug("Tests listed:\n%s" % output)
-  return _gtest_list_tests(output)
-
-
-def _gtest_list_tests(gtest_list_tests_output):
-  """Returns a list of strings formatted as TestSuite.TestFixture from the
-  output of running --gtest_list_tests on a GTEST application."""
-
-  # Remove log lines.
-  gtest_list_tests_output = re.sub("^(\[|WARNING: linker:).*\n",
-                                   "",
-                                   gtest_list_tests_output,
-                                   flags=re.MULTILINE)
-
-  if not re.match("^(\w*\.\r?\n(  \w*\r?\n)+)+", gtest_list_tests_output):
-    raise Exception("Unrecognized --gtest_list_tests output:\n%s" %
-                    gtest_list_tests_output)
-
-  output_lines = gtest_list_tests_output.split("\n")
-
-  test_list = []
-  for line in output_lines:
-    if not line:
-      continue
-    if line[0] != " ":
-      suite = line.strip()
-      continue
-    test_list.append(suite + line.strip())
-
-  return test_list
diff --git a/mojo/devtools/common/devtoolslib/apptest_gtest_unittest.py b/mojo/devtools/common/devtoolslib/apptest_gtest_unittest.py
deleted file mode 100644
index db55a30..0000000
--- a/mojo/devtools/common/devtoolslib/apptest_gtest_unittest.py
+++ /dev/null
@@ -1,57 +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.
-
-import imp
-import os.path
-import sys
-import unittest
-
-try:
-  imp.find_module("devtoolslib")
-except ImportError:
-  sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from devtoolslib.apptest_gtest import _gtest_list_tests
-
-
-class GTestListTestsTest(unittest.TestCase):
-  """Tests |_gtest_list_tests()| handling of --gtest_list_tests output."""
-
-  def testSingleSuiteAndFixture(self):
-    """Tests a single suite with a single fixture."""
-    gtest_output = "TestSuite.\n  TestFixture\n"
-    expected_test_list = ["TestSuite.TestFixture"]
-    self.assertEquals(_gtest_list_tests(gtest_output), expected_test_list)
-
-  def testWindowsNewlines(self):
-    """Tests handling of \r\n newlines."""
-    gtest_output = "TestSuite.\r\n  TestFixture1\r\n"
-    expected_test_list = ["TestSuite.TestFixture1"]
-    self.assertEquals(_gtest_list_tests(gtest_output), expected_test_list)
-
-  def testSingleSuiteAndMultipleFixtures(self):
-    """Tests a single suite with multiple fixtures."""
-    gtest_output = "TestSuite.\n  TestFixture1\n  TestFixture2\n"
-    expected_test_list = ["TestSuite.TestFixture1", "TestSuite.TestFixture2"]
-    self.assertEquals(_gtest_list_tests(gtest_output), expected_test_list)
-
-  def testMultipleSuitesAndFixtures(self):
-    """Tests multiple suites each with multiple fixtures."""
-    gtest_output = ("TestSuite1.\n  TestFixture1\n  TestFixture2\n"
-                    "TestSuite2.\n  TestFixtureA\n  TestFixtureB\n")
-    expected_test_list = ["TestSuite1.TestFixture1", "TestSuite1.TestFixture2",
-                          "TestSuite2.TestFixtureA", "TestSuite2.TestFixtureB"]
-    self.assertEquals(_gtest_list_tests(gtest_output), expected_test_list)
-
-  def testUnrecognizedFormats(self):
-    """Tests examples of unrecognized --gtest_list_tests output."""
-    self.assertRaises(Exception, _gtest_list_tests, "Foo")
-    self.assertRaises(Exception, _gtest_list_tests, "Foo\n")
-    self.assertRaises(Exception, _gtest_list_tests, "Foo.Bar\n")
-    self.assertRaises(Exception, _gtest_list_tests, "Foo.\nBar\n")
-    self.assertRaises(Exception, _gtest_list_tests, "Foo.\r\nBar\r\nGaz\r\n")
-    self.assertRaises(Exception, _gtest_list_tests, "Foo.\nBar.\n  Gaz\n")
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/devtools/common/devtoolslib/http_server.py b/mojo/devtools/common/devtoolslib/http_server.py
deleted file mode 100644
index 482e2db..0000000
--- a/mojo/devtools/common/devtoolslib/http_server.py
+++ /dev/null
@@ -1,223 +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.
-
-import atexit
-import datetime
-import email.utils
-import errno
-import gzip
-import hashlib
-import logging
-import math
-import os.path
-import shutil
-import socket
-import threading
-import tempfile
-
-import SimpleHTTPServer
-import SocketServer
-
-_ZERO = datetime.timedelta(0)
-
-
-class UTC_TZINFO(datetime.tzinfo):
-  """UTC time zone representation."""
-
-  def utcoffset(self, _):
-    return _ZERO
-
-  def tzname(self, _):
-    return "UTC"
-
-  def dst(self, _):
-     return _ZERO
-
-_UTC = UTC_TZINFO()
-
-
-class _SilentTCPServer(SocketServer.TCPServer):
-  """A TCPServer that won't display any error, unless debugging is enabled. This
-  is useful because the client might stop while it is fetching an URL, which
-  causes spurious error messages.
-  """
-  allow_reuse_address = True
-
-  def handle_error(self, request, client_address):
-    """Override the base class method to have conditional logging."""
-    if logging.getLogger().isEnabledFor(logging.DEBUG):
-      SocketServer.TCPServer.handle_error(self, request, client_address)
-
-
-def _get_handler_class_for_path(mappings):
-  """Creates a handler override for SimpleHTTPServer.
-
-  Args:
-    mappings: List of tuples (prefix, local_base_path_list) mapping URLs that
-        start with |prefix| to one or more local directories enumerated in
-        |local_base_path_list|. The prefixes should skip the leading slash.
-        The first matching prefix and the first location that contains the
-        requested file will be used each time.
-  """
-  for prefix, _ in mappings:
-    assert not prefix.startswith('/'), ('Prefixes for the http server mappings '
-                                        'should skip the leading slash.')
-
-  class RequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
-    """Handler for SocketServer.TCPServer that will serve the files from
-    local directiories over http.
-
-    A new instance is created for each request.
-    """
-
-    def __init__(self, *args, **kwargs):
-      self.etag = None
-      self.gzipped_file = None
-      SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self, *args, **kwargs)
-
-    def get_etag(self):
-      if self.etag:
-        return self.etag
-
-      path = self.translate_path(self.path, False)
-      if not os.path.isfile(path):
-        return None
-
-      sha256 = hashlib.sha256()
-      BLOCKSIZE = 65536
-      with open(path, 'rb') as hashed:
-        buf = hashed.read(BLOCKSIZE)
-        while len(buf) > 0:
-          sha256.update(buf)
-          buf = hashed.read(BLOCKSIZE)
-      self.etag = '"%s"' % sha256.hexdigest()
-      return self.etag
-
-    def send_head(self):
-      # Always close the connection after each request, as the keep alive
-      # support from SimpleHTTPServer doesn't like when the client requests to
-      # close the connection before downloading the full response content.
-      # pylint: disable=W0201
-      self.close_connection = 1
-
-      path = self.translate_path(self.path)
-      if os.path.isfile(path):
-        # Handle If-None-Match
-        etag = self.get_etag()
-        if ('If-None-Match' in self.headers and
-            etag == self.headers['If-None-Match']):
-          self.send_response(304)
-          return None
-
-        # Handle If-Modified-Since
-        if ('If-None-Match' not in self.headers and
-            'If-Modified-Since' in self.headers):
-          last_modified = datetime.datetime.fromtimestamp(
-              math.floor(os.stat(path).st_mtime), tz=_UTC)
-          ims = datetime.datetime(
-              *email.utils.parsedate(self.headers['If-Modified-Since'])[:6],
-              tzinfo=_UTC)
-          if last_modified <= ims:
-            self.send_response(304)
-            return None
-
-      return SimpleHTTPServer.SimpleHTTPRequestHandler.send_head(self)
-
-    def end_headers(self):
-      path = self.translate_path(self.path)
-
-      if os.path.isfile(path):
-        self.send_header('Content-Encoding', 'gzip')
-        etag = self.get_etag()
-        if etag:
-          self.send_header('ETag', etag)
-          self.send_header('Cache-Control', 'must-revalidate')
-
-      return SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self)
-
-    # pylint: disable=W0221
-    def translate_path(self, path, gzipped=True):
-      # Parent translate_path() will strip away the query string and fragment
-      # identifier, but also will prepend the cwd to the path. relpath() gives
-      # us the relative path back.
-      normalized_path = os.path.relpath(
-          SimpleHTTPServer.SimpleHTTPRequestHandler.translate_path(self, path))
-
-      for prefix, local_base_path_list in mappings:
-        if normalized_path.startswith(prefix):
-          for local_base_path in local_base_path_list:
-            candidate = os.path.join(local_base_path,
-                                     normalized_path[len(prefix):])
-            if os.path.isfile(candidate):
-              if gzipped:
-                if not self.gzipped_file:
-                  self.gzipped_file = tempfile.NamedTemporaryFile(delete=False)
-                  with open(candidate, 'rb') as source:
-                    with gzip.GzipFile(fileobj=self.gzipped_file) as target:
-                      shutil.copyfileobj(source, target)
-                  self.gzipped_file.close()
-                return self.gzipped_file.name
-              return candidate
-          else:
-            self.send_response(404)
-            return None
-      self.send_response(404)
-      return None
-
-    def guess_type(self, path):
-      # This is needed so that exploded Sky apps without shebang can still run
-      # thanks to content-type mappings.
-      # TODO(ppi): drop this part once we can rely on the Sky files declaring
-      # correct shebang.
-      if path.endswith('.dart') or path.endswith('.dart.gz'):
-        return 'application/dart'
-      return SimpleHTTPServer.SimpleHTTPRequestHandler.guess_type(self, path)
-
-    def log_message(self, *_):
-      """Override the base class method to disable logging."""
-      pass
-
-    def __del__(self):
-      if self.gzipped_file:
-        os.remove(self.gzipped_file.name)
-
-  RequestHandler.protocol_version = 'HTTP/1.1'
-  return RequestHandler
-
-
-def start_http_server(mappings, host_port=0):
-  """Starts an http server serving files from |local_dir_path| on |host_port|.
-
-  Args:
-    mappings: List of tuples (prefix, local_base_path_list) mapping URLs that
-        start with |prefix| to one or more local directories enumerated in
-        |local_base_path_list|. The prefixes should skip the leading slash.
-        The first matching prefix and the first location that contains the
-        requested file will be used each time.
-    host_port: Port on the host machine to run the server on. Pass 0 to use a
-        system-assigned port.
-
-  Returns:
-    Tuple of the server address and the port on which it runs.
-  """
-  assert mappings
-  handler_class = _get_handler_class_for_path(mappings)
-
-  try:
-    httpd = _SilentTCPServer(('127.0.0.1', host_port), handler_class)
-    atexit.register(httpd.shutdown)
-
-    http_thread = threading.Thread(target=httpd.serve_forever)
-    http_thread.daemon = True
-    http_thread.start()
-    return httpd.server_address
-  except socket.error as v:
-    error_code = v[0]
-    print 'Failed to start http server for %s on port %d: %s.' % (
-        str(mappings), host_port, os.strerror(error_code))
-    if error_code == errno.EADDRINUSE:
-      print ('  Run `fuser %d/tcp` to find out which process is using the port.'
-             % host_port)
-    print '---'
-    raise
diff --git a/mojo/devtools/common/devtoolslib/http_server_unittest.py b/mojo/devtools/common/devtoolslib/http_server_unittest.py
deleted file mode 100644
index f279712..0000000
--- a/mojo/devtools/common/devtoolslib/http_server_unittest.py
+++ /dev/null
@@ -1,140 +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.
-
-import StringIO
-import gzip
-import imp
-import os.path
-import shutil
-import sys
-import tempfile
-import unittest
-import urllib2
-
-try:
-  imp.find_module('devtoolslib')
-except ImportError:
-  sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-
-from devtoolslib import http_server
-
-
-class HttpServerTest(unittest.TestCase):
-  """Tests for the http_server module."""
-
-  def setUp(self):
-    """Creates a tree of temporary directories and files of the form described
-    below.
-
-      parent_dir
-        hello_dir
-          hello_subdir
-            hello_file
-        other_dir
-          other_file
-    """
-    self.parent_dir = tempfile.mkdtemp()
-    self.parent_file = tempfile.NamedTemporaryFile(delete=False,
-                                                   dir=self.parent_dir)
-    self.hello_dir = tempfile.mkdtemp(dir=self.parent_dir)
-    self.hello_subdir = tempfile.mkdtemp(dir=self.hello_dir)
-    self.hello_file = tempfile.NamedTemporaryFile(delete=False,
-                                                  dir=self.hello_subdir)
-    self.hello_file.write('hello')
-    self.hello_file.close()
-
-    self.other_dir = tempfile.mkdtemp(dir=self.parent_dir)
-    self.other_file = tempfile.NamedTemporaryFile(delete=False,
-                                                  dir=self.other_dir)
-
-  def tearDown(self):
-    shutil.rmtree(self.parent_dir)
-
-  def test_mappings(self):
-    """Maps two directories and verifies that the server serves files placed
-    there.
-    """
-    mappings = [
-        ('hello/', [self.hello_dir]),
-        ('other/', [self.other_dir]),
-    ]
-    server_address = ('http://%s:%u/' %
-                      http_server.start_http_server(mappings))
-
-    hello_relpath = os.path.relpath(self.hello_file.name, self.hello_dir)
-    hello_response = urllib2.urlopen(server_address + 'hello/' +
-                                     hello_relpath)
-    self.assertEquals(200, hello_response.getcode())
-
-    other_relpath = os.path.relpath(self.other_file.name, self.other_dir)
-    other_response = urllib2.urlopen(server_address + 'other/' +
-                                     other_relpath)
-    self.assertEquals(200, other_response.getcode())
-
-  def test_unmapped_path(self):
-    """Verifies that the server returns 404 when a request for unmapped url
-    prefix is made.
-    """
-    mappings = [
-        ('hello/', [self.hello_dir]),
-    ]
-    server_address = ('http://%s:%u/' %
-                      http_server.start_http_server(mappings))
-
-    error_code = None
-    try:
-      urllib2.urlopen(server_address + 'unmapped/abc')
-    except urllib2.HTTPError as error:
-      error_code = error.code
-    self.assertEquals(404, error_code)
-
-  def test_multiple_paths(self):
-    """Verfies mapping multiple local paths under the same url prefix."""
-    mappings = [
-        ('singularity/', [self.hello_dir, self.other_dir]),
-    ]
-    server_address = ('http://%s:%u/' %
-                      http_server.start_http_server(mappings))
-
-    hello_relpath = os.path.relpath(self.hello_file.name, self.hello_dir)
-    hello_response = urllib2.urlopen(server_address + 'singularity/' +
-                                     hello_relpath)
-    self.assertEquals(200, hello_response.getcode())
-
-    other_relpath = os.path.relpath(self.other_file.name, self.other_dir)
-    other_response = urllib2.urlopen(server_address + 'singularity/' +
-                                     other_relpath)
-    self.assertEquals(200, other_response.getcode())
-
-    # Verify that a request for a file not present under any of the mapped
-    # directories results in 404.
-    error_code = None
-    try:
-      urllib2.urlopen(server_address + 'singularity/unavailable')
-    except urllib2.HTTPError as error:
-      error_code = error.code
-    self.assertEquals(404, error_code)
-
-  def test_gzip(self):
-    """Verifies the gzip content encoding of the files being served."""
-    mappings = [
-        ('hello/', [self.hello_dir]),
-    ]
-    server_address = ('http://%s:%u/' %
-                      http_server.start_http_server(mappings))
-
-    hello_relpath = os.path.relpath(self.hello_file.name, self.hello_dir)
-    hello_response = urllib2.urlopen(server_address + 'hello/' +
-                                     hello_relpath)
-    self.assertEquals(200, hello_response.getcode())
-    self.assertTrue('Content-Encoding' in hello_response.info())
-    self.assertEquals('gzip', hello_response.info().get('Content-Encoding'))
-
-    content = gzip.GzipFile(
-        fileobj=StringIO.StringIO(hello_response.read())).read()
-    self.assertEquals('hello', content)
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/devtools/common/devtoolslib/linux_shell.py b/mojo/devtools/common/devtoolslib/linux_shell.py
deleted file mode 100644
index dedee5b..0000000
--- a/mojo/devtools/common/devtoolslib/linux_shell.py
+++ /dev/null
@@ -1,66 +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.
-
-import subprocess
-import threading
-
-from devtoolslib import http_server
-from devtoolslib.shell import Shell
-from devtoolslib.utils import overrides
-
-
-class LinuxShell(Shell):
-  """Wrapper around Mojo shell running on Linux.
-
-  Args:
-    executable_path: path to the shell binary
-    command_prefix: optional list of arguments to prepend to the shell command,
-        allowing e.g. to run the shell under debugger.
-  """
-
-  def __init__(self, executable_path, command_prefix=None):
-    self.executable_path = executable_path
-    self.command_prefix = command_prefix if command_prefix else []
-
-  @overrides(Shell)
-  def serve_local_directory(self, local_dir_path, port=0):
-    mappings = [('', [local_dir_path])]
-    return 'http://%s:%d/' % http_server.start_http_server(mappings, port)
-
-  @overrides(Shell)
-  def serve_local_directories(self, mappings, port=0):
-    return 'http://%s:%d/' % http_server.start_http_server(mappings, port)
-
-  @overrides(Shell)
-  def forward_host_port_to_shell(self, host_port):
-    pass
-
-  @overrides(Shell)
-  def run(self, arguments):
-    command = self.command_prefix + [self.executable_path] + arguments
-    return subprocess.call(command, stderr=subprocess.STDOUT)
-
-  @overrides(Shell)
-  def run_and_get_output(self, arguments, timeout=None):
-    command = self.command_prefix + [self.executable_path] + arguments
-    p = subprocess.Popen(command, stdout=subprocess.PIPE,
-                         stderr=subprocess.STDOUT)
-
-    class Results:
-      """Workaround for Python scoping rules that prevent assigning to variables
-      from the outer scope.
-      """
-      output = None
-
-    def do_run():
-      (Results.output, _) = p.communicate()
-
-    run_thread = threading.Thread(target=do_run)
-    run_thread.start()
-    run_thread.join(timeout)
-
-    if run_thread.is_alive():
-      p.terminate()
-      return p.returncode, Results.output, True
-    return p.returncode, Results.output, False
diff --git a/mojo/devtools/common/devtoolslib/paths.py b/mojo/devtools/common/devtoolslib/paths.py
deleted file mode 100644
index 502636a..0000000
--- a/mojo/devtools/common/devtoolslib/paths.py
+++ /dev/null
@@ -1,96 +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.
-
-"""Supports inferring locations of files in default checkout layouts.
-
-These functions allow devtools scripts to work out-of-the-box with regular Mojo
-checkouts.
-"""
-
-import collections
-import os.path
-import sys
-
-
-def find_ancestor_with(relpath, start_path=None):
-  """Returns the lowest ancestor of this file that contains |relpath|."""
-  cur_dir_path = start_path or os.path.abspath(os.path.dirname(__file__))
-  while True:
-    if os.path.exists(os.path.join(cur_dir_path, relpath)):
-      return cur_dir_path
-
-    next_dir_path = os.path.dirname(cur_dir_path)
-    if next_dir_path != cur_dir_path:
-      cur_dir_path = next_dir_path
-    else:
-      return None
-
-
-def find_within_ancestors(target_relpath, start_path=None):
-  """Returns the absolute path to |target_relpath| in the lowest ancestor of
-  |start_path| that contains it.
-  """
-  ancestor = find_ancestor_with(target_relpath, start_path)
-  if not ancestor:
-    return None
-  return os.path.join(ancestor, target_relpath)
-
-
-def infer_paths(is_android, is_debug, target_cpu):
-  """Infers the locations of select build output artifacts in a regular
-  Chromium-like checkout. This should grow thinner or disappear as we introduce
-  per-repo config files, see https://github.com/domokit/devtools/issues/28.
-
-  Returns:
-    Defaultdict with the inferred paths.
-  """
-  build_dir = (('android_' if is_android else '') +
-               (target_cpu + '_' if target_cpu else '') +
-               ('Debug' if is_debug else 'Release'))
-  out_build_dir = os.path.join('out', build_dir)
-
-  root_path = find_ancestor_with(out_build_dir)
-  paths = collections.defaultdict(lambda: None)
-  if not root_path:
-    return paths
-
-  build_dir_path = os.path.join(root_path, out_build_dir)
-  paths['build_dir_path'] = build_dir_path
-  if is_android:
-    paths['shell_path'] = os.path.join(build_dir_path, 'apks', 'MojoShell.apk')
-    paths['adb_path'] = os.path.join(root_path, 'third_party', 'android_tools',
-                                'sdk', 'platform-tools', 'adb')
-  else:
-    paths['shell_path'] = os.path.join(build_dir_path, 'mojo_shell')
-  return paths
-
-
-# Based on Chromium //tools/find_depot_tools.py.
-def find_depot_tools():
-  """Searches for depot_tools.
-
-  Returns:
-    Path to the depot_tools checkout present on the machine, None if not found.
-  """
-  def _is_real_depot_tools(path):
-    return os.path.isfile(os.path.join(path, 'gclient.py'))
-
-  # First look if depot_tools is already in PYTHONPATH.
-  for i in sys.path:
-    if i.rstrip(os.sep).endswith('depot_tools') and _is_real_depot_tools(i):
-      return i
-  # Then look if depot_tools is in PATH, common case.
-  for i in os.environ['PATH'].split(os.pathsep):
-    if _is_real_depot_tools(i):
-      return i
-  # Rare case, it's not even in PATH, look upward up to root.
-  root_dir = os.path.dirname(os.path.abspath(__file__))
-  previous_dir = os.path.abspath(__file__)
-  while root_dir and root_dir != previous_dir:
-    i = os.path.join(root_dir, 'depot_tools')
-    if _is_real_depot_tools(i):
-      return i
-    previous_dir = root_dir
-    root_dir = os.path.dirname(root_dir)
-  return None
diff --git a/mojo/devtools/common/devtoolslib/shell.py b/mojo/devtools/common/devtoolslib/shell.py
deleted file mode 100644
index c142611..0000000
--- a/mojo/devtools/common/devtoolslib/shell.py
+++ /dev/null
@@ -1,79 +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.
-
-
-class Shell(object):
-  """Represents an abstract Mojo shell."""
-
-  def serve_local_directory(self, local_dir_path, port=0):
-    """Serves the content of the local (host) directory, making it available to
-    the shell under the url returned by the function.
-
-    The server will run on a separate thread until the program terminates. The
-    call returns immediately.
-
-    Args:
-      local_dir_path: path to the directory to be served
-      port: port at which the server will be available to the shell
-
-    Returns:
-      The url that the shell can use to access the content of |local_dir_path|.
-    """
-    raise NotImplementedError()
-
-  def serve_local_directories(self, mappings, port=0):
-    """Serves the content of the local (host) directories, making it available
-    to the shell under the url returned by the function.
-
-    The server will run on a separate thread until the program terminates. The
-    call returns immediately.
-
-    Args:
-      mappings: List of tuples (prefix, local_base_path_list) mapping URLs that
-          start with |prefix| to one or more local directories enumerated in
-          |local_base_path_list|. The prefixes should skip the leading slash.
-          The first matching prefix and the first location that contains the
-          requested file will be used each time.
-      port: port at which the server will be available to the shell
-
-    Returns:
-      The url that the shell can use to access the server.
-    """
-    raise NotImplementedError()
-
-  def forward_host_port_to_shell(self, host_port):
-    """Forwards a port on the host machine to the same port wherever the shell
-    is running.
-
-    This is a no-op if the shell is running locally.
-    """
-    raise NotImplementedError()
-
-  def run(self, arguments):
-    """Runs the shell with given arguments until shell exits, passing the stdout
-    mingled with stderr produced by the shell onto the stdout.
-
-    Returns:
-      Exit code retured by the shell or None if the exit code cannot be
-      retrieved.
-    """
-    raise NotImplementedError()
-
-  def run_and_get_output(self, arguments, timeout=None):
-    """Runs the shell with given arguments until shell exits and returns the
-    output.
-
-    Args:
-      arguments: list of arguments for the shell
-      timeout: maximum running time in seconds, after which the shell will be
-          terminated
-
-    Returns:
-      A tuple of (return_code, output, did_time_out). |return_code| is the exit
-      code returned by the shell or None if the exit code cannot be retrieved.
-      |output| is the stdout mingled with the stderr produced by the shell.
-      |did_time_out| is True iff the shell was terminated because it exceeded
-      the |timeout| and False otherwise.
-    """
-    raise NotImplementedError()
diff --git a/mojo/devtools/common/devtoolslib/shell_arguments.py b/mojo/devtools/common/devtoolslib/shell_arguments.py
deleted file mode 100644
index 3863935..0000000
--- a/mojo/devtools/common/devtoolslib/shell_arguments.py
+++ /dev/null
@@ -1,243 +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.
-
-"""Produces configured shell abstractions.
-
-This module knows how to produce a configured shell abstraction based on
-shell_config.ShellConfig.
-"""
-
-import os.path
-import sys
-import urlparse
-
-from devtoolslib.android_shell import AndroidShell
-from devtoolslib.linux_shell import LinuxShell
-from devtoolslib.shell_config import ShellConfigurationException
-
-# When spinning up servers for local origins, we want to use predictable ports
-# so that caching works between subsequent runs with the same command line.
-_LOCAL_ORIGIN_PORT = 31840
-_MAPPINGS_BASE_PORT = 31841
-
-
-def _is_web_url(dest):
-  return True if urlparse.urlparse(dest).scheme else False
-
-
-def _host_local_url_destination(shell, dest_file, port):
-  """Starts a local server to host |dest_file|.
-
-  Returns:
-    Url of the hosted file.
-  """
-  directory = os.path.dirname(dest_file)
-  if not os.path.exists(directory):
-    raise ValueError('local path passed as --map-url destination '
-                     'does not exist')
-  server_url = shell.serve_local_directory(directory, port)
-  return server_url + os.path.relpath(dest_file, directory)
-
-
-def _host_local_origin_destination(shell, dest_dir, port):
-  """Starts a local server to host |dest_dir|.
-
-  Returns:
-    Url of the hosted directory.
-  """
-  return shell.serve_local_directory(dest_dir, port)
-
-
-def _rewrite(mapping, host_destination_functon, shell, port):
-  """Takes a mapping given as <src>=<dest> and rewrites the <dest> part to be
-  hosted locally using the given function if <dest> is not a web url.
-  """
-  parts = mapping.split('=')
-  if len(parts) != 2:
-    raise ValueError('each mapping value should be in format '
-                     '"<url>=<url-or-local-path>"')
-  if _is_web_url(parts[1]):
-    # The destination is a web url, do nothing.
-    return mapping
-
-  src = parts[0]
-  dest = host_destination_functon(shell, parts[1], port)
-  return src + '=' + dest
-
-
-def _apply_mappings(shell, original_arguments, map_urls, map_origins):
-  """Applies mappings for specified urls and origins. For each local path
-  specified as destination a local server will be spawned and the mapping will
-  be rewritten accordingly.
-
-  Args:
-    shell: The shell that is being configured.
-    original_arguments: Current list of shell arguments.
-    map_urls: List of url mappings, each in the form of
-      <url>=<url-or-local-path>.
-    map_origins: List of origin mappings, each in the form of
-        <origin>=<url-or-local-path>.
-
-  Returns:
-    The updated argument list.
-  """
-  next_port = _MAPPINGS_BASE_PORT
-  args = original_arguments
-  if map_urls:
-    # Sort the mappings to preserve caching regardless of argument order.
-    for map_url in sorted(map_urls):
-      mapping = _rewrite(map_url, _host_local_url_destination, shell, next_port)
-      next_port += 1
-      # All url mappings need to be coalesced into one shell argument.
-      args = append_to_argument(args, '--url-mappings=', mapping)
-
-  if map_origins:
-    for map_origin in sorted(map_origins):
-      mapping = _rewrite(map_origin, _host_local_origin_destination, shell,
-                         next_port)
-      next_port += 1
-      # Origin mappings are specified as separate, repeated shell arguments.
-      args.append('--map-origin=' + mapping)
-  return args
-
-
-def _configure_sky(shell_args):
-  """Maps mojo:sky_viewer as a content handler for dart applications.
-  app.
-
-  Args:
-    shell_args: Current list of shell arguments.
-
-  Returns:
-    Updated list of shell arguments.
-  """
-  # Configure the content type mappings for the sky_viewer. This is needed
-  # only for the Sky apps that do not declare mojo:sky_viewer in a shebang.
-  # TODO(ppi): drop this part once we can rely on the Sky files declaring
-  # correct shebang.
-  shell_args = append_to_argument(shell_args, '--content-handlers=',
-                                            'text/sky,mojo:sky_viewer')
-  shell_args = append_to_argument(shell_args, '--content-handlers=',
-                                            'application/dart,mojo:sky_viewer')
-  return shell_args
-
-
-def configure_local_origin(shell, local_dir, fixed_port=True):
-  """Sets up a local http server to serve files in |local_dir| along with
-  device port forwarding if needed.
-
-  Returns:
-    The list of arguments to be appended to the shell argument list.
-  """
-
-  origin_url = shell.serve_local_directory(
-      local_dir, _LOCAL_ORIGIN_PORT if fixed_port else 0)
-  return ["--origin=" + origin_url]
-
-
-def append_to_argument(arguments, key, value, delimiter=","):
-  """Looks for an argument of the form "key=val1,val2" within |arguments| and
-  appends |value| to it.
-
-  If the argument is not present in |arguments| it is added.
-
-  Args:
-    arguments: List of arguments for the shell.
-    key: Identifier of the argument, including the equal sign, eg.
-        "--content-handlers=".
-    value: The value to be appended, after |delimeter|, to the argument.
-    delimiter: The string used to separate values within the argument.
-
-  Returns:
-    The updated argument list.
-  """
-  assert key and key.endswith('=')
-  assert value
-
-  for i, argument in enumerate(arguments):
-    if not argument.startswith(key):
-      continue
-    arguments[i] = argument + delimiter + value
-    break
-  else:
-    arguments.append(key + value)
-
-  return arguments
-
-
-def _configure_dev_server(shell, shell_args, dev_server_config):
-  """Sets up a dev server on the host according to |dev_server_config|.
-
-  Args:
-    shell: The shell that is being configured.
-    shell_arguments: Current list of shell arguments.
-    dev_server_config: Instance of shell_config.DevServerConfig describing the
-        dev server to be set up.
-
-  Returns:
-    The updated argument list.
-  """
-  server_url = shell.serve_local_directories(dev_server_config.mappings)
-  shell_args.append('--map-origin=%s=%s' % (dev_server_config.host, server_url))
-  print "Configured %s locally to serve:" % (dev_server_config.host)
-  for mapping_prefix, mapping_path in dev_server_config.mappings:
-    print "  /%s -> %s" % (mapping_prefix, mapping_path)
-  return shell_args
-
-
-def get_shell(shell_config, shell_args):
-  """
-  Produces a shell abstraction configured according to |shell_config|.
-
-  Args:
-    shell_config: Instance of shell_config.ShellConfig.
-    shell_args: Additional raw shell arguments to be passed to the shell. We
-        need to take these into account as some parameters need to appear only
-        once on the argument list (e.g. url-mappings) so we need to coalesce any
-        overrides and the existing value into just one argument.
-
-  Returns:
-    A tuple of (shell, shell_args). |shell| is the configured shell abstraction,
-    |shell_args| is updated list of shell arguments.
-
-  Throws:
-    ShellConfigurationException if shell abstraction could not be configured.
-  """
-  if shell_config.android:
-    verbose_pipe = sys.stdout if shell_config.verbose else None
-
-    shell = AndroidShell(shell_config.adb_path, shell_config.target_device,
-                         logcat_tags=shell_config.logcat_tags,
-                         verbose_pipe=verbose_pipe)
-
-    device_status, error = shell.check_device()
-    if not device_status:
-      raise ShellConfigurationException('Device check failed: ' + error)
-    if shell_config.shell_path:
-      shell.install_apk(shell_config.shell_path)
-  else:
-    if not shell_config.shell_path:
-      raise ShellConfigurationException('Can not run without a shell binary. '
-                                        'Please pass --shell-path.')
-    shell = LinuxShell(shell_config.shell_path)
-    if shell_config.use_osmesa:
-      shell_args.append('--args-for=mojo:native_viewport_service --use-osmesa')
-
-  shell_args = _apply_mappings(shell, shell_args, shell_config.map_url_list,
-                               shell_config.map_origin_list)
-
-  if shell_config.origin:
-    if _is_web_url(shell_config.origin):
-      shell_args.append('--origin=' + shell_config.origin)
-    else:
-      shell_args.extend(configure_local_origin(shell, shell_config.origin,
-                                               fixed_port=True))
-
-  if shell_config.sky:
-    shell_args = _configure_sky(shell_args)
-
-  for dev_server_config in shell_config.dev_servers:
-    shell_args = _configure_dev_server(shell, shell_args, dev_server_config)
-
-  return shell, shell_args
diff --git a/mojo/devtools/common/devtoolslib/shell_arguments_unittest.py b/mojo/devtools/common/devtoolslib/shell_arguments_unittest.py
deleted file mode 100644
index f86b163..0000000
--- a/mojo/devtools/common/devtoolslib/shell_arguments_unittest.py
+++ /dev/null
@@ -1,46 +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.
-
-import imp
-import os.path
-import sys
-import unittest
-
-try:
-  imp.find_module("devtoolslib")
-except ImportError:
-  sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-from devtoolslib import shell_arguments
-
-
-class AppendToArgumentTest(unittest.TestCase):
-  """Tests AppendToArgument()."""
-
-  def test_append_to_empty(self):
-    arguments = []
-    key = '--something='
-    value = 'val'
-    expected_result = ['--something=val']
-    self.assertEquals(expected_result, shell_arguments.append_to_argument(
-        arguments, key, value))
-
-  def test_append_to_non_empty(self):
-    arguments = ['--other']
-    key = '--something='
-    value = 'val'
-    expected_result = ['--other', '--something=val']
-    self.assertEquals(expected_result, shell_arguments.append_to_argument(
-        arguments, key, value))
-
-  def test_append_to_existing(self):
-    arguments = ['--something=old_val']
-    key = '--something='
-    value = 'val'
-    expected_result = ['--something=old_val,val']
-    self.assertEquals(expected_result, shell_arguments.append_to_argument(
-        arguments, key, value))
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/devtools/common/devtoolslib/shell_config.py b/mojo/devtools/common/devtoolslib/shell_config.py
deleted file mode 100644
index 2b55d54..0000000
--- a/mojo/devtools/common/devtoolslib/shell_config.py
+++ /dev/null
@@ -1,196 +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.
-
-"""Configuration for the shell abstraction.
-
-This module declares ShellConfig and knows how to compute it from command-line
-arguments, applying any default paths inferred from the checkout, configuration
-file, etc.
-"""
-
-import ast
-
-from devtoolslib import paths
-
-
-class ShellConfigurationException(Exception):
-  """Represents an error preventing creating a functional shell abstraction."""
-  pass
-
-
-class ShellConfig(object):
-  """Configuration for the shell abstraction."""
-
-  def __init__(self):
-    self.android = None
-    self.shell_path = None
-    self.origin = None
-    self.map_url_list = []
-    self.map_origin_list = []
-    self.dev_servers = []
-    self.sky = None
-    self.verbose = None
-
-    # Android-only.
-    self.adb_path = None
-    self.target_device = None
-    self.logcat_tags = None
-
-    # Desktop-only.
-    self.use_osmesa = None
-
-
-class DevServerConfig(object):
-  """Configuration for a development server running on a host and available to
-  the shell.
-  """
-  def __init__(self):
-    self.host = None
-    self.mappings = None
-
-
-def add_shell_arguments(parser):
-  """Adds argparse arguments allowing to configure shell abstraction using
-  configure_shell() below.
-  """
-  # Arguments configuring the shell run.
-  parser.add_argument('--android', help='Run on Android',
-                      action='store_true')
-  parser.add_argument('--shell-path', help='Path of the Mojo shell binary.')
-  parser.add_argument('--origin', help='Origin for mojo: URLs. This can be a '
-                      'web url or a local directory path.')
-  parser.add_argument('--map-url', action='append',
-                      help='Define a mapping for a url in the format '
-                      '<url>=<url-or-local-file-path>')
-  parser.add_argument('--map-origin', action='append',
-                      help='Define a mapping for a url origin in the format '
-                      '<origin>=<url-or-local-file-path>')
-  parser.add_argument('--sky', action='store_true',
-                      help='Maps mojo:sky_viewer as the content handler for '
-                           'dart apps.')
-  parser.add_argument('-v', '--verbose', action="store_true",
-                      help="Increase output verbosity")
-
-  android_group = parser.add_argument_group('Android-only',
-      'These arguments apply only when --android is passed.')
-  android_group.add_argument('--adb-path', help='Path of the adb binary.')
-  android_group.add_argument('--target-device', help='Device to run on.')
-  android_group.add_argument('--logcat-tags', help='Comma-separated list of '
-                             'additional logcat tags to display.')
-
-  desktop_group = parser.add_argument_group('Desktop-only',
-      'These arguments apply only when running on desktop.')
-  desktop_group.add_argument('--use-osmesa', action='store_true',
-                             help='Configure the native viewport service '
-                             'for off-screen rendering.')
-
-  config_file_group = parser.add_argument_group('Configuration file',
-      'These arguments allow to modify the behavior regarding the mojoconfig '
-      'file.')
-  config_file_group.add_argument('--config-file', type=file,
-                                 help='Path of the configuration file to use.')
-  config_file_group.add_argument('--no-config-file', action='store_true',
-                                 help='Pass to skip automatic discovery of the '
-                                 'mojoconfig file.')
-
-  # Arguments allowing to indicate the build directory we are targeting when
-  # running within a Chromium-like checkout (e.g. Mojo checkout). These will go
-  # away once we have devtools config files, see
-  # https://github.com/domokit/devtools/issues/28.
-  chromium_checkout_group = parser.add_argument_group(
-      'Chromium-like checkout configuration',
-      'These arguments allow to infer paths to tools and build results '
-      'when running within a Chromium-like checkout')
-  debug_group = chromium_checkout_group.add_mutually_exclusive_group()
-  debug_group.add_argument('--debug', help='Debug build (default)',
-                           default=True, action='store_true')
-  debug_group.add_argument('--release', help='Release build', default=False,
-                           dest='debug', action='store_false')
-  chromium_checkout_group.add_argument('--target-cpu',
-                                     help='CPU architecture to run for.',
-                                     choices=['x64', 'x86', 'arm'])
-
-
-def _discover_config_file():
-  config_file_path = paths.find_within_ancestors('mojoconfig')
-  if not config_file_path:
-    return None
-  return open(config_file_path, 'r')
-
-
-def _read_config_file(config_file, aliases):
-  spec = config_file.read()
-  for alias_pattern, alias_value in aliases:
-    spec = spec.replace(alias_pattern, alias_value)
-  return ast.literal_eval(spec)
-
-
-def get_shell_config(script_args):
-  """Processes command-line options defined in add_shell_arguments(), applying
-  any inferred default paths and produces an instance of ShellConfig.
-
-  Returns:
-    An instance of ShellConfig.
-  """
-  # Infer paths based on the Chromium configuration options
-  # (--debug/--release, etc.), if running within a Chromium-like checkout.
-  inferred_paths = paths.infer_paths(script_args.android, script_args.debug,
-                                     script_args.target_cpu)
-  shell_config = ShellConfig()
-
-  shell_config.android = script_args.android
-  shell_config.shell_path = (script_args.shell_path or
-                             inferred_paths['shell_path'])
-  shell_config.origin = script_args.origin
-  shell_config.map_url_list = script_args.map_url
-  shell_config.map_origin_list = script_args.map_origin
-  shell_config.sky = script_args.sky
-  shell_config.verbose = script_args.verbose
-
-  # Android-only.
-  shell_config.adb_path = (script_args.adb_path or inferred_paths['adb_path'])
-  shell_config.target_device = script_args.target_device
-  shell_config.logcat_tags = script_args.logcat_tags
-
-  # Desktop-only.
-  shell_config.use_osmesa = script_args.use_osmesa
-
-  if (shell_config.android and not shell_config.origin and
-      inferred_paths['build_dir_path']):
-    shell_config.origin = inferred_paths['build_dir_path']
-
-  # Read the mojoconfig file.
-  config_file = script_args.config_file
-  if not script_args.no_config_file:
-    config_file = config_file or _discover_config_file()
-
-  if config_file:
-    with config_file:
-      config_file_aliases = []
-      if inferred_paths['build_dir_path']:
-        config_file_aliases.append(('@{BUILD_DIR}',
-                                    inferred_paths['build_dir_path']))
-
-      config = None
-      try:
-        if script_args.verbose:
-          print 'Reading config file from: ' + config_file.name
-        config = _read_config_file(config_file, config_file_aliases)
-      except SyntaxError:
-        raise ShellConfigurationException('Failed to parse the mojoconfig '
-                                          'file.')
-
-    if 'dev_servers' in config:
-      try:
-        for dev_server_spec in config['dev_servers']:
-          dev_server_config = DevServerConfig()
-          dev_server_config.host = dev_server_spec['host']
-          dev_server_config.mappings = []
-          for prefix, path in dev_server_spec['mappings']:
-            dev_server_config.mappings.append((prefix, path))
-          shell_config.dev_servers.append(dev_server_config)
-      except (ValueError, KeyError):
-        raise ShellConfigurationException('Failed to parse dev_servers in '
-                                          'the mojoconfig file.')
-  return shell_config
diff --git a/mojo/devtools/common/devtoolslib/utils.py b/mojo/devtools/common/devtoolslib/utils.py
deleted file mode 100644
index 7bf2e1c..0000000
--- a/mojo/devtools/common/devtoolslib/utils.py
+++ /dev/null
@@ -1,16 +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.
-
-"""Python utils."""
-
-
-def overrides(parent_class):
-  """Inherits the docstring from the method of the same name in the indicated
-  parent class.
-  """
-  def overriding(method):
-    assert(method.__name__ in dir(parent_class))
-    method.__doc__ = getattr(parent_class, method.__name__).__doc__
-    return method
-  return overriding
diff --git a/mojo/devtools/common/mojo_debug b/mojo/devtools/common/mojo_debug
deleted file mode 100755
index fb4459f..0000000
--- a/mojo/devtools/common/mojo_debug
+++ /dev/null
@@ -1,330 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import argparse
-import codecs
-import logging
-import os.path
-import requests
-import signal
-import subprocess
-import sys
-import tempfile
-
-
-from android_gdb.install_remote_file_reader import install
-from devtoolslib import paths
-
-
-_MOJO_DEBUGGER_PORT = 7777
-_DEFAULT_PACKAGE_NAME = 'org.chromium.mojo.shell'
-
-
-# TODO(etiennej): Refactor with similar methods in subdirectories
-class DirectoryNotFoundException(Exception):
-  """Directory has not been found."""
-  pass
-
-
-def _get_dir_above(dirname):
-  """Returns the directory "above" this file containing |dirname|."""
-  path = paths.find_ancestor_with(dirname)
-  if not path:
-    raise DirectoryNotFoundException(dirname)
-  return path
-
-
-def _send_request(request, payload=None):
-  """Sends a request to mojo:debugger."""
-  try:
-    url = 'http://localhost:%s/%s' % (_MOJO_DEBUGGER_PORT, request)
-    if payload:
-      return requests.post(url, payload)
-    else:
-      return requests.get(url)
-  except requests.exceptions.ConnectionError:
-    print 'Failed to connect to mojo:debugger, make sure the shell is running.'
-    return None
-
-
-def _tracing_start(_):
-  """Starts tracing."""
-  if not _send_request('start_tracing'):
-    return 1
-  print "Started tracing."
-  return 0
-
-
-def _tracing_stop(args):
-  """Stops tracing and writes trace to file."""
-  if args.file_name:
-    file_name = args.file_name
-  else:
-    for i in xrange(1000):
-      candidate_file_name = 'mojo_trace_%03d.json' % i
-      if not os.path.exists(candidate_file_name):
-        file_name = candidate_file_name
-        break
-    else:
-      print 'Failed to pick a name for the trace output file.'
-      return 1
-
-  response = _send_request('stop_tracing')
-  if not response:
-    return 1
-
-  # https://github.com/domokit/mojo/issues/253
-  if int(response.headers['content-length']) != len(response.content):
-    print 'Response is truncated.'
-    return 1
-
-  with open(file_name, "wb") as trace_file:
-    trace_file.write('{"traceEvents":[')
-    trace_file.write(response.content)
-    trace_file.write(']}')
-  print "Trace saved in %s" % file_name
-  return 0
-
-
-def _add_tracing_command(subparsers):
-  """Sets up the command line parser to manage tracing."""
-  tracing_parser = subparsers.add_parser('tracing',
-      help='trace event profiler')
-  tracing_subparser = tracing_parser.add_subparsers(
-      help='the command to run')
-
-  start_tracing_parser = tracing_subparser.add_parser('start',
-      help='start tracing')
-  start_tracing_parser.set_defaults(func=_tracing_start)
-
-  stop_tracing_parser = tracing_subparser.add_parser('stop',
-      help='stop tracing and retrieve the result')
-  stop_tracing_parser.add_argument('file_name', type=str, nargs='?',
-      help='name of the output file (optional)')
-  stop_tracing_parser.set_defaults(func=_tracing_stop)
-
-
-def _wm_load(args):
-  """Loads (embeds) the given url in the window manager."""
-  if not _send_request('load', args.url):
-    return 1
-  return 0
-
-
-def _add_wm_command(subparsers):
-  """Sets up the parser for the 'wm' command."""
-  wm_parser = subparsers.add_parser('wm', help='window manager')
-  wm_subparser = wm_parser.add_subparsers(
-      help='the command to run')
-
-  wm_load_parser = wm_subparser.add_parser('load',
-      help='load (embed) the given url')
-  wm_load_parser.add_argument('url', type=str,
-      help='the url to load')
-  wm_load_parser.set_defaults(func=_wm_load)
-
-
-def _device_stack(args):
-  """Runs the device logcat through android_stack_parser."""
-  adb_path = args.adb_path if args.adb_path else 'adb'
-  logcat_cmd = [adb_path, 'logcat', '-d']
-  try:
-    logcat = subprocess.Popen(logcat_cmd, stdout=subprocess.PIPE)
-  except OSError:
-    print 'failed to call adb, make sure it is in PATH or pass --adb-path'
-    return 1
-
-  devtools_dir = os.path.dirname(os.path.abspath(__file__))
-  stack_command = [os.path.join(devtools_dir, 'android_stack_parser', 'stack')]
-  if args.build_dir:
-    stack_command.append('--build-dir=' + os.path.abspath(args.build_dir))
-  if args.ndk_dir:
-    stack_command.append('--ndk-dir=' + os.path.abspath(args.ndk_dir))
-  stack_command.append('-')
-  stack = subprocess.Popen(stack_command, stdin=logcat.stdout)
-
-  logcat.wait()
-  stack.wait()
-
-  if logcat.returncode:
-    print 'adb logcat failed, make sure the device is connected and available'
-    return logcat.returncode
-  if stack.returncode:
-    return stack.returncode
-  return 0
-
-
-def _gdb_attach(args):
-  """Run GDB on an instance of Mojo Shell on an android device."""
-  if args.ndk_dir:
-    ndk_dir = args.ndk_dir
-  else:
-    try:
-      ndk_dir = os.path.join(_get_dir_above('third_party'), 'third_party',
-                             'android_tools', 'ndk')
-      if not os.path.exists(ndk_dir):
-        raise DirectoryNotFoundException()
-    except DirectoryNotFoundException:
-      logging.fatal("Unable to find the Android NDK, please specify its path "
-          "with --ndk-dir.")
-      return
-
-  install_args = {}
-  if args.gsutil_dir:
-    install_args['gsutil'] = os.path.join(args.gsutil_dir, 'gsutil')
-  else:
-    try:
-      depot_tools_path = paths.find_depot_tools()
-      if not depot_tools_path:
-        raise DirectoryNotFoundException()
-      install_args['gsutil'] = os.path.join(depot_tools_path, 'third_party',
-                                            'gsutil', 'gsutil')
-      if not os.path.exists(install_args['gsutil']):
-        raise DirectoryNotFoundException()
-    except DirectoryNotFoundException:
-      logging.fatal("Unable to find gsutil, please specify its path with "
-                    "--gsutil-dir.")
-      return
-
-  if args.adb_path:
-    install_args['adb'] = args.adb_path
-  else:
-    install_args['adb'] = 'adb'
-
-  try:
-    install(**install_args)
-  except OSError as e:
-    if e.errno == 2:
-      # ADB not found in path, print an error message
-      logging.fatal("Unable to find ADB, please specify its path with "
-                    "--adb-path.")
-      return
-    else:
-      raise
-
-  gdb_path = os.path.join(
-      ndk_dir,
-      'toolchains',
-      # TODO(etiennej): Always select the most recent toolchain?
-      'arm-linux-androideabi-4.9',
-      'prebuilt',
-      # TODO(etiennej): DEPS mac NDK and use it on macs.
-      'linux-x86_64',
-      'bin',
-      'arm-linux-androideabi-gdb')
-  python_gdb_script_path = os.path.join(os.path.dirname(__file__),
-                                        'android_gdb', 'session.py')
-  debug_session_arguments = {}
-  if args.build_dir:
-    debug_session_arguments["build_directory"] = args.build_dir
-  else:
-    try:
-      debug_session_arguments["build_directory"] = os.path.join(
-          _get_dir_above('out'), 'out', 'android_Debug')
-      if not os.path.exists(debug_session_arguments["build_directory"]):
-        raise DirectoryNotFoundException()
-    except DirectoryNotFoundException:
-      logging.fatal("Unable to find the build directory, please specify it "
-                    "using --build-dir.")
-      return
-
-  if args.package_name:
-    debug_session_arguments["package_name"] = args.package_name
-  else:
-    debug_session_arguments["package_name"] = _DEFAULT_PACKAGE_NAME
-  debug_session_arguments['adb'] = install_args['adb']
-  if args.pyelftools_dir:
-    debug_session_arguments["pyelftools_dir"] = args.pyelftools_dir
-  else:
-    try:
-      debug_session_arguments["pyelftools_dir"] = os.path.join(
-          _get_dir_above('third_party'), 'third_party', 'pyelftools')
-      if not os.path.exists(debug_session_arguments["pyelftools_dir"]):
-        raise DirectoryNotFoundException()
-    except DirectoryNotFoundException:
-      logging.fatal("Unable to find pyelftools python module, please specify "
-          "its path using --pyelftools-dir.")
-      return
-
-  debug_session_arguments_str = ', '.join(
-      [k + '="' + codecs.encode(v, 'string_escape') + '"'
-       for k, v in debug_session_arguments.items()])
-
-  # We need to pass some commands to GDB at startup.
-  gdb_commands_file = tempfile.NamedTemporaryFile()
-  gdb_commands_file.write('source ' + python_gdb_script_path + '\n')
-  gdb_commands_file.write('py d = DebugSession(' + debug_session_arguments_str
-                          + ')\n')
-  gdb_commands_file.write('py d.start()\n')
-  gdb_commands_file.flush()
-
-  gdb_proc = subprocess.Popen([gdb_path, '-x', gdb_commands_file.name],
-                              stdin=sys.stdin,
-                              stdout=sys.stdout,
-                              stderr=sys.stderr)
-
-  # We don't want SIGINT to stop this program. It is automatically propagated by
-  # the system to gdb.
-  signal.signal(signal.SIGINT, signal.SIG_IGN)
-  gdb_proc.wait()
-  signal.signal(signal.SIGINT, signal.SIG_DFL)
-
-
-def _add_device_command(subparsers):
-  """Sets up the parser for the 'device' command."""
-  device_parser = subparsers.add_parser('device',
-      help='interact with the Android device (requires adb in PATH or passing '
-           '--adb-path)')
-  device_parser.add_argument('--adb-path', type=str,
-      help='path to the adb tool from the Android SDK (optional)')
-  device_subparser = device_parser.add_subparsers(
-      help='the command to run')
-
-  device_stack_parser = device_subparser.add_parser('stack',
-      help='symbolize the crash stacktraces from the device log')
-  device_stack_parser.add_argument('--ndk-dir', type=str,
-      help='path to the directory containing the Android NDK')
-  device_stack_parser.add_argument('--build-dir', type=str,
-      help='path to the build directory')
-  device_stack_parser.set_defaults(func=_device_stack)
-
-
-def _add_gdb_command(subparsers):
-  gdb_parser = subparsers.add_parser(
-      'gdb', help='Debug Mojo Shell and its apps using GDB')
-  gdb_subparser = gdb_parser.add_subparsers(
-      help='Commands to GDB')
-
-  gdb_attach_parser = gdb_subparser.add_parser(
-      'attach', help='Attach GDB to a running Mojo Shell process')
-  gdb_attach_parser.add_argument('--adb-path', type=str,
-      help='path to the adb tool from the Android SDK (optional)')
-  gdb_attach_parser.add_argument('--ndk-dir', type=str,
-      help='path to the directory containing the Android NDK')
-  gdb_attach_parser.add_argument('--build-dir', type=str,
-      help='path to the build directory')
-  gdb_attach_parser.add_argument('--pyelftools-dir', type=str,
-      help='Path to a directory containing third party libraries')
-  gdb_attach_parser.add_argument('--gsutil-dir', type=str,
-      help='Path to a directory containing gsutil')
-  gdb_attach_parser.add_argument('--package-name', type=str,
-      help='Name of the Mojo Shell android package to debug')
-  gdb_attach_parser.set_defaults(func=_gdb_attach)
-
-
-def main():
-  parser = argparse.ArgumentParser(description='Command-line interface for '
-                                                'mojo:debugger')
-  subparsers = parser.add_subparsers(help='the tool to run')
-  _add_device_command(subparsers)
-  _add_tracing_command(subparsers)
-  _add_wm_command(subparsers)
-  _add_gdb_command(subparsers)
-
-  args = parser.parse_args()
-  return args.func(args)
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/devtools/common/mojo_run b/mojo/devtools/common/mojo_run
deleted file mode 100755
index 554eeab..0000000
--- a/mojo/devtools/common/mojo_run
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import argparse
-import logging
-import sys
-
-from devtoolslib import shell_arguments
-from devtoolslib import shell_config
-
-_USAGE = ("mojo_run "
-         "[--args-for=<mojo-app>] "
-         "[--content-handlers=<handlers>] "
-         "[--enable-external-applications] "
-         "[--disable-cache] "
-         "[--enable-multiprocess] "
-         "[--wait-for-debugger] "
-         "[--sky <mojo-app>|<mojo-app>] "
-         """
-
-A <mojo-app> is a Mojo URL or a Mojo URL and arguments within quotes.
-Example: mojo_run "mojo:js_standalone test.js".
-<url-lib-path> is searched for shared libraries named by mojo URLs.
-The value of <handlers> is a comma separated list like:
-text/html,mojo:html_viewer,application/javascript,mojo:js_content_handler
-""")
-
-_DESCRIPTION = """Runner for Mojo applications.
-
-Any arguments not recognized by the script will be passed on as shell arguments.
-"""
-
-
-# Port on which the mojo:debugger http server will be available on the host
-# machine.
-_MOJO_DEBUGGER_PORT = 7777
-_DEFAULT_WINDOW_MANAGER = "mojo:kiosk_wm"
-
-
-def _configure_debugger(shell):
-  """Configures mojo:debugger to run and sets up port forwarding for its http
-  server if the shell is running on a device.
-
-  Returns:
-    Arguments that need to be appended to the shell argument list in order to
-    run with the debugger.
-  """
-  shell.forward_host_port_to_shell(_MOJO_DEBUGGER_PORT)
-  return ['mojo:debugger %d' % _MOJO_DEBUGGER_PORT]
-
-
-def main():
-  logging.basicConfig()
-
-  parser = argparse.ArgumentParser(usage=_USAGE, description=_DESCRIPTION)
-  shell_config.add_shell_arguments(parser)
-
-  parser.add_argument('--no-debugger', action="store_true",
-                      help='Do not spawn mojo:debugger.')
-  parser.add_argument('--window-manager', default=_DEFAULT_WINDOW_MANAGER,
-                      help='Window manager app to be mapped as '
-                      'mojo:window_manager. By default it is ' +
-                      _DEFAULT_WINDOW_MANAGER)
-
-  script_args, shell_args = parser.parse_known_args()
-
-  try:
-    config = shell_config.get_shell_config(script_args)
-    shell, shell_args = shell_arguments.get_shell(config, shell_args)
-  except shell_config.ShellConfigurationException as e:
-    print e
-    return 1
-
-  if not script_args.no_debugger:
-    if script_args.verbose:
-      print 'Spawning mojo:debugger, use `mojo_debug` to inspect the shell.'
-      print 'Note that mojo:debugger will prevent the shell from terminating,'
-      print '  pass --no-debugger to skip spawning mojo:debugger.'
-    shell_args.extend(_configure_debugger(shell))
-
-  shell_args = shell_arguments.append_to_argument(shell_args, '--url-mappings=',
-                                                  'mojo:window_manager=%s' %
-                                                  script_args.window_manager)
-
-  if script_args.verbose:
-    print "Shell arguments: " + str(shell_args)
-
-  shell.run(shell_args)
-  return 0
-
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/mojo/devtools/common/mojo_test b/mojo/devtools/common/mojo_test
deleted file mode 100755
index 2cf84b9..0000000
--- a/mojo/devtools/common/mojo_test
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Test runner for Mojo application tests.
-
-TODO(vtl|msw): Add a way of specifying data dependencies.
-"""
-
-import argparse
-import logging
-import sys
-
-from devtoolslib import apptest_dart
-from devtoolslib import apptest_gtest
-from devtoolslib import shell_arguments
-from devtoolslib import shell_config
-
-_DESCRIPTION = """Runner for Mojo application tests.
-
-|test_list_file| has to be a valid Python program that sets a |tests| global
-variable, containing entries of the following form:
-
- {
-   # Required URL for apptest.
-   "test": "mojo:test_app_url",
-   # Optional display name (otherwise the entry for "test" above is used).
-   "name": "mojo:test_app_url (more details)",
-   # Optional test type. Valid values:
-   #   * "gtest" (default)
-   #   * "gtest_isolated": like "gtest", but run with fixture isolation,
-   #      i.e., each test in a fresh mojo_shell
-   #   * "dart"
-   "type": "gtest",
-   # Optional arguments to be passed to the apptest.
-   "test-args": ["--an_arg", "another_arg"],
-   # Optional shell arguments.
-   "shell-args": ["--some-flag-for-the-shell", "--another-flag"],
-   # Optional timeout in seconds, 60 by default.
-   "timeout": 120,
- }
-
-|test_list_file| may reference the |target_os| global that will be any of
-['android', 'linux'], indicating the system on which the tests are to be run.
-
-Any arguments not recognized by the script will be passed on as shell arguments.
-"""
-
-_logger = logging.getLogger()
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      formatter_class=argparse.RawDescriptionHelpFormatter,
-      description=_DESCRIPTION)
-  parser.add_argument("test_list_file", type=file,
-                      help="a file listing apptests to run")
-  shell_config.add_shell_arguments(parser)
-
-  script_args, shell_args = parser.parse_known_args()
-
-  try:
-    config = shell_config.get_shell_config(script_args)
-    shell, common_shell_args = shell_arguments.get_shell(config, shell_args)
-  except shell_config.ShellConfigurationException as e:
-    print e
-    return 1
-
-  target_os = "android" if script_args.android else "linux"
-  test_list_globals = {"target_os": target_os}
-  exec script_args.test_list_file in test_list_globals
-  test_list = test_list_globals["tests"]
-
-  succeeded = True
-  for test_dict in test_list:
-    test = test_dict["test"]
-    test_name = test_dict.get("name", test)
-    test_type = test_dict.get("type", "gtest")
-    test_args = test_dict.get("test-args", [])
-    shell_args = test_dict.get("shell-args", []) + common_shell_args
-    timeout = test_dict.get("timeout", 60)
-
-    _logger.info("Will start: %s" % test_name)
-    print "Running %s...." % test_name,
-    sys.stdout.flush()
-
-    if test_type == "dart":
-      apptest_result = apptest_dart.run_dart_apptest(shell, shell_args, test,
-                                                     test_args, timeout)
-    elif test_type == "gtest":
-      apptest_result = apptest_gtest.run_gtest_apptest(shell, shell_args, test,
-                                                       test_args, timeout,
-                                                       False)
-    elif test_type == "gtest_isolated":
-      apptest_result = apptest_gtest.run_gtest_apptest(shell, shell_args, test,
-                                                       test_args, timeout,
-                                                       True)
-    else:
-      apptest_result = False
-      print "Unrecognized test type in %r" % test_dict
-
-    print "Succeeded" if apptest_result else "Failed"
-    _logger.info("Completed: %s" % test_name)
-    if not apptest_result:
-      succeeded = False
-  return 0 if succeeded else 1
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/devtools/common/remote_adb_setup b/mojo/devtools/common/remote_adb_setup
deleted file mode 100755
index d275ff6..0000000
--- a/mojo/devtools/common/remote_adb_setup
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/bash
-# 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.
-
-if [[ $# -ne 1 && $# -ne 2 ]]; then
-  cat <<'EOF'
-Usage: remote_adb_setup REMOTE_HOST [REMOTE_ADB]
-
-Configures adb on a remote machine to communicate with a device attached to the
-local machine. This is useful for installing APKs, running tests, etc while
-working remotely.
-
-Arguments:
-  REMOTE_HOST  hostname of remote machine
-  REMOTE_ADB   path to adb on the remote machine (you can omit this if adb is in
-               the remote host's path)
-EOF
-  exit 1
-fi
-
-remote_host="$1"
-remote_adb="${2:-adb}"
-
-# Ensure adb is in the local machine's path.
-if ! which adb >/dev/null; then
-  echo "error: adb must be in your local machine's path."
-  exit 1
-fi
-
-if which kinit >/dev/null; then
-  # Allow ssh to succeed without typing your password multiple times.
-  kinit -R || kinit
-fi
-
-# Kill the adb server on the remote host.
-ssh "$remote_host" "$remote_adb kill-server"
-
-# Start the adb server locally.
-adb start-server
-
-# Forward various ports from the remote host to the local host:
-#   5037: adb
-# and from the local host to the remote host:
-#   9998: http server for Sky
-#   31840: http server for the local mojo: origin
-ssh -C \
-    -R 5037:127.0.0.1:5037 \
-    -L 9998:127.0.0.1:9998 \
-    -L 31840:127.0.0.1:31840 \
-    "$remote_host"
diff --git a/mojo/edk/system/BUILD.gn b/mojo/edk/system/BUILD.gn
index ac292d5..5367be1 100644
--- a/mojo/edk/system/BUILD.gn
+++ b/mojo/edk/system/BUILD.gn
@@ -204,6 +204,7 @@
     "simple_dispatcher_unittest.cc",
     "test_channel_endpoint_client.cc",
     "test_channel_endpoint_client.h",
+    "test_utils_unittest.cc",
     "thread_annotations_unittest.cc",
     "unique_identifier_unittest.cc",
     "waiter_test_utils.cc",
diff --git a/mojo/edk/system/channel_endpoint.cc b/mojo/edk/system/channel_endpoint.cc
index 038de8d..e7e17b4 100644
--- a/mojo/edk/system/channel_endpoint.cc
+++ b/mojo/edk/system/channel_endpoint.cc
@@ -16,9 +16,9 @@
 ChannelEndpoint::ChannelEndpoint(ChannelEndpointClient* client,
                                  unsigned client_port,
                                  MessageInTransitQueue* message_queue)
-    : client_(client),
+    : state_(State::PAUSED),
+      client_(client),
       client_port_(client_port),
-      channel_state_(ChannelState::NOT_YET_ATTACHED),
       channel_(nullptr) {
   DCHECK(client_ || message_queue);
 
@@ -31,18 +31,14 @@
 
   MutexLocker locker(&mutex_);
 
-  switch (channel_state_) {
-    case ChannelState::NOT_YET_ATTACHED:
-    case ChannelState::DETACHED:
-      // We may reach here if we haven't been attached/run yet.
-      // TODO(vtl): We may also reach here if the channel is shut down early for
-      // some reason (with live message pipes on it). Ideally, we'd return false
-      // (and not enqueue the message), but we currently don't have a way to
-      // check this.
+  switch (state_) {
+    case State::PAUSED:
       channel_message_queue_.AddMessage(message.Pass());
       return true;
-    case ChannelState::ATTACHED:
+    case State::RUNNING:
       return WriteMessageNoLock(message.Pass());
+    case State::DEAD:
+      return false;
   }
 
   NOTREACHED();
@@ -58,7 +54,7 @@
   DCHECK(client != client_.get() || client_port != client_port_);
   client_ = client;
   client_port_ = client_port;
-  return channel_state_ != ChannelState::DETACHED;
+  return state_ != State::DEAD;
 }
 
 void ChannelEndpoint::DetachFromClient() {
@@ -69,7 +65,7 @@
   if (!channel_)
     return;
   channel_->DetachEndpoint(this, local_id_, remote_id_);
-  ResetChannelNoLock();
+  DieNoLock();
 }
 
 void ChannelEndpoint::AttachAndRun(Channel* channel,
@@ -80,11 +76,11 @@
   DCHECK(remote_id.is_valid());
 
   MutexLocker locker(&mutex_);
-  DCHECK(channel_state_ == ChannelState::NOT_YET_ATTACHED);
+  DCHECK(state_ == State::PAUSED);
   DCHECK(!channel_);
   DCHECK(!local_id_.is_valid());
   DCHECK(!remote_id_.is_valid());
-  channel_state_ = ChannelState::ATTACHED;
+  state_ = State::RUNNING;
   channel_ = channel;
   local_id_ = local_id;
   remote_id_ = remote_id;
@@ -96,7 +92,7 @@
 
   if (!client_) {
     channel_->DetachEndpoint(this, local_id_, remote_id_);
-    ResetChannelNoLock();
+    DieNoLock();
   }
 }
 
@@ -131,9 +127,9 @@
     // |DetachFromClient()| by calling |Channel::DetachEndpoint()| (and there
     // are racing detaches).
     if (channel_)
-      ResetChannelNoLock();
+      DieNoLock();
     else
-      DCHECK(channel_state_ == ChannelState::DETACHED);
+      DCHECK(state_ == State::DEAD);
   }
 
   // If |ReplaceClient()| is called (from another thread) after the above locked
@@ -190,7 +186,7 @@
       MutexLocker locker(&mutex_);
       if (!channel_ || !client_) {
         // This isn't a failure per se. (It just means that, e.g., the other end
-        // of the message point closed first.)
+        // of the message pipe closed first.)
         return;
       }
 
@@ -212,13 +208,13 @@
   }
 }
 
-void ChannelEndpoint::ResetChannelNoLock() {
-  DCHECK(channel_state_ == ChannelState::ATTACHED);
+void ChannelEndpoint::DieNoLock() {
+  DCHECK(state_ == State::RUNNING);
   DCHECK(channel_);
   DCHECK(local_id_.is_valid());
   DCHECK(remote_id_.is_valid());
 
-  channel_state_ = ChannelState::DETACHED;
+  state_ = State::DEAD;
   channel_ = nullptr;
   local_id_ = ChannelEndpointId();
   remote_id_ = ChannelEndpointId();
diff --git a/mojo/edk/system/channel_endpoint.h b/mojo/edk/system/channel_endpoint.h
index c70e66e..3ebe386 100644
--- a/mojo/edk/system/channel_endpoint.h
+++ b/mojo/edk/system/channel_endpoint.h
@@ -168,13 +168,23 @@
   // Helper for |OnReadMessage()|, handling messages for the client.
   void OnReadMessageForClient(scoped_ptr<MessageInTransit> message);
 
-  // Resets |channel_| to null (and sets |channel_state_| to
-  // |ChannelState::DETACHED|). This may only be called if |channel_| is
-  // non-null.
-  void ResetChannelNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
+  // Moves |state_| from |RUNNING| to |DEAD|. |channel_| must be non-null, but
+  // this does not call |channel_->DetachEndpoint()|.
+  void DieNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
 
   Mutex mutex_;
 
+  enum class State {
+    // |AttachAndRun()| has not been called yet (|channel_| is null).
+    PAUSED,
+    // |AttachAndRun()| has been called, but not |DetachFromChannel()|
+    // (|channel_| is non-null and valid).
+    RUNNING,
+    // |DetachFromChannel()| has been called (|channel_| is null).
+    DEAD
+  };
+  State state_ MOJO_GUARDED_BY(mutex_);
+
   // |client_| must be valid whenever it is non-null. Before |*client_| gives up
   // its reference to this object, it must call |DetachFromClient()|.
   // NOTE: This is a |scoped_refptr<>|, rather than a raw pointer, since the
@@ -193,17 +203,6 @@
   scoped_refptr<ChannelEndpointClient> client_ MOJO_GUARDED_BY(mutex_);
   unsigned client_port_ MOJO_GUARDED_BY(mutex_);
 
-  // State with respect to interaction with the |Channel|.
-  enum class ChannelState {
-    // |AttachAndRun()| has not been called yet (|channel_| is null).
-    NOT_YET_ATTACHED,
-    // |AttachAndRun()| has been called, but not |DetachFromChannel()|
-    // (|channel_| is non-null and valid).
-    ATTACHED,
-    // |DetachFromChannel()| has been called (|channel_| is null).
-    DETACHED
-  };
-  ChannelState channel_state_ MOJO_GUARDED_BY(mutex_);
   // |channel_| must be valid whenever it is non-null. Before |*channel_| gives
   // up its reference to this object, it must call |DetachFromChannel()|.
   // |local_id_| and |remote_id_| are valid if and only |channel_| is non-null.
diff --git a/mojo/edk/system/channel_manager.cc b/mojo/edk/system/channel_manager.cc
index a2e4bf9..097ffa2 100644
--- a/mojo/edk/system/channel_manager.cc
+++ b/mojo/edk/system/channel_manager.cc
@@ -87,6 +87,13 @@
   return dispatcher;
 }
 
+scoped_refptr<Channel> ChannelManager::CreateChannelWithoutBootstrapOnIOThread(
+    ChannelId channel_id,
+    embedder::ScopedPlatformHandle platform_handle) {
+  return CreateChannelOnIOThreadHelper(channel_id, platform_handle.Pass(),
+                                       nullptr);
+}
+
 scoped_refptr<MessagePipeDispatcher> ChannelManager::CreateChannel(
     ChannelId channel_id,
     embedder::ScopedPlatformHandle platform_handle,
@@ -163,19 +170,19 @@
   }
 }
 
-void ChannelManager::CreateChannelOnIOThreadHelper(
+scoped_refptr<Channel> ChannelManager::CreateChannelOnIOThreadHelper(
     ChannelId channel_id,
     embedder::ScopedPlatformHandle platform_handle,
     scoped_refptr<system::ChannelEndpoint> bootstrap_channel_endpoint) {
   DCHECK_NE(channel_id, kInvalidChannelId);
   DCHECK(platform_handle.is_valid());
-  DCHECK(bootstrap_channel_endpoint);
 
   // Create and initialize a |system::Channel|.
   scoped_refptr<system::Channel> channel =
       new system::Channel(platform_support_);
   channel->Init(system::RawChannel::Create(platform_handle.Pass()));
-  channel->SetBootstrapEndpoint(bootstrap_channel_endpoint);
+  if (bootstrap_channel_endpoint)
+    channel->SetBootstrapEndpoint(bootstrap_channel_endpoint);
 
   {
     MutexLocker locker(&mutex_);
@@ -183,6 +190,7 @@
     channels_[channel_id] = channel;
   }
   channel->SetChannelManager(this);
+  return channel;
 }
 
 void ChannelManager::CreateChannelHelper(
diff --git a/mojo/edk/system/channel_manager.h b/mojo/edk/system/channel_manager.h
index 014c1b3..1ff958d 100644
--- a/mojo/edk/system/channel_manager.h
+++ b/mojo/edk/system/channel_manager.h
@@ -72,6 +72,14 @@
       ChannelId channel_id,
       embedder::ScopedPlatformHandle platform_handle);
 
+  // Like |CreateChannelOnIOThread()|, but doesn't create a bootstrap message
+  // pipe. Returns the newly-created |Channel|.
+  // TODO(vtl): Maybe get rid of the others (and bootstrap message pipes in
+  // general).
+  scoped_refptr<Channel> CreateChannelWithoutBootstrapOnIOThread(
+      ChannelId channel_id,
+      embedder::ScopedPlatformHandle platform_handle);
+
   // Like |CreateChannelOnIOThread()|, but may be called from any thread. On
   // completion, will call |callback| (using |callback_thread_task_runner| if it
   // is non-null, else on the I/O thread). Note: This will always post a task to
@@ -116,8 +124,9 @@
       scoped_refptr<base::TaskRunner> callback_thread_task_runner);
 
   // Used by |CreateChannelOnIOThread()| and |CreateChannelHelper()|. Called on
-  // the I/O thread.
-  void CreateChannelOnIOThreadHelper(
+  // the I/O thread. |bootstrap_channel_endpoint| is optional and may be null.
+  // Returns the newly-created |Channel|.
+  scoped_refptr<Channel> CreateChannelOnIOThreadHelper(
       ChannelId channel_id,
       embedder::ScopedPlatformHandle platform_handle,
       scoped_refptr<system::ChannelEndpoint> bootstrap_channel_endpoint);
diff --git a/mojo/edk/system/channel_manager_unittest.cc b/mojo/edk/system/channel_manager_unittest.cc
index afa9b15..2d38b61 100644
--- a/mojo/edk/system/channel_manager_unittest.cc
+++ b/mojo/edk/system/channel_manager_unittest.cc
@@ -168,6 +168,9 @@
   EXPECT_EQ(MOJO_RESULT_OK, d->Close());
 }
 
+// TODO(vtl): Test |CreateChannelWithoutBootstrapOnIOThread()|. (This will
+// require additional functionality in |Channel|.)
+
 }  // namespace
 }  // namespace system
 }  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_impl_unittest.cc b/mojo/edk/system/data_pipe_impl_unittest.cc
index 3b0470b..0bc7506 100644
--- a/mojo/edk/system/data_pipe_impl_unittest.cc
+++ b/mojo/edk/system/data_pipe_impl_unittest.cc
@@ -2394,6 +2394,67 @@
   this->ConsumerClose();
 }
 
+// Tests the behavior of writing, closing the producer, and then doing a
+// two-phase read of all the data.
+// Note: If this test fails/crashes flakily, this is almost certainly an
+// indication of a problem in the implementation and not the test.
+TYPED_TEST(DataPipeImplTest, WriteCloseProducerTwoPhaseReadAllData) {
+  const char kTestData[] = "hello world";
+  const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
+
+  const MojoCreateDataPipeOptions options = {
+      kSizeOfOptions,                           // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
+      1u,                                       // |element_num_bytes|.
+      1000u                                     // |capacity_num_bytes|.
+  };
+  this->Create(options);
+  this->DoTransfer();
+
+  // Write some data, so we'll have something to read.
+  uint32_t num_bytes = kTestDataSize;
+  EXPECT_EQ(MOJO_RESULT_OK,
+            this->ProducerWriteData(UserPointer<const void>(kTestData),
+                                    MakeUserPointer(&num_bytes), false));
+  EXPECT_EQ(kTestDataSize, num_bytes);
+
+  // TODO(vtl): Hack: We can't currently wait for a specified amount of data to
+  // be available, so poll.
+  for (size_t i = 0; i < kMaxPoll; i++) {
+    num_bytes = 0u;
+    EXPECT_EQ(MOJO_RESULT_OK,
+              this->ConsumerQueryData(MakeUserPointer(&num_bytes)));
+    if (num_bytes >= kTestDataSize)
+      break;
+
+    test::Sleep(test::EpsilonDeadline());
+  }
+  EXPECT_EQ(kTestDataSize, num_bytes);
+
+  const void* read_buffer_ptr = nullptr;
+  num_bytes = 0u;
+  EXPECT_EQ(MOJO_RESULT_OK,
+            this->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
+                                        MakeUserPointer(&num_bytes), false));
+  EXPECT_EQ(kTestDataSize, num_bytes);
+  EXPECT_EQ(0, memcmp(read_buffer_ptr, kTestData, kTestDataSize));
+
+  // Close the producer.
+  this->ProducerClose();
+
+  // Note: This tiny sleep is to allow/encourage a certain race. In particular,
+  // for the remote producer case in
+  // |RemoteProducerDataPipeImpl::MarkDataAsConsumed()| (caused by
+  // |ConsumerEndReadData()| below) we want |producer_open()| to be false but
+  // the call to |channel_endpoint_->EnqueueMessage()| to fail. (This race can
+  // occur without the sleep, but is much less likely.)
+  test::Sleep(10u);
+
+  EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(num_bytes));
+
+  this->ConsumerClose();
+}
+
 }  // namespace
 }  // namespace system
 }  // namespace mojo
diff --git a/mojo/edk/system/ipc_support_unittest.cc b/mojo/edk/system/ipc_support_unittest.cc
index 823f6b9..695c4ec 100644
--- a/mojo/edk/system/ipc_support_unittest.cc
+++ b/mojo/edk/system/ipc_support_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/command_line.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/test/test_io_thread.h"
 #include "base/test/test_timeouts.h"
@@ -37,6 +38,84 @@
 
 const char kConnectionIdFlag[] = "test-connection-id";
 
+// Tests writing a message (containing just data) to |write_mp| and then reading
+// it from |read_mp| (it should be the next message, i.e., there should be no
+// other messages already enqueued in that direction).
+void TestWriteReadMessage(scoped_refptr<MessagePipeDispatcher> write_mp,
+                          scoped_refptr<MessagePipeDispatcher> read_mp) {
+  // Set up waiting on the read end first (to avoid racing).
+  Waiter waiter;
+  waiter.Init();
+  ASSERT_EQ(
+      MOJO_RESULT_OK,
+      read_mp->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 0, nullptr));
+
+  // Write a message with just 'x' through the write end.
+  EXPECT_EQ(MOJO_RESULT_OK,
+            write_mp->WriteMessage(UserPointer<const void>("x"), 1, nullptr,
+                                   MOJO_WRITE_MESSAGE_FLAG_NONE));
+
+  // Wait for it to arrive.
+  EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), nullptr));
+  read_mp->RemoveAwakable(&waiter, nullptr);
+
+  // Read the message from the read end.
+  char buffer[10] = {};
+  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
+  EXPECT_EQ(MOJO_RESULT_OK,
+            read_mp->ReadMessage(UserPointer<void>(buffer),
+                                 MakeUserPointer(&buffer_size), 0, nullptr,
+                                 MOJO_READ_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(1u, buffer_size);
+  EXPECT_EQ('x', buffer[0]);
+}
+
+// Writes a message pipe dispatcher (in a message) to |write_mp| and reads it
+// from |read_mp| (it should be the next message, i.e., there should be no other
+// other messages already enqueued in that direction).
+scoped_refptr<MessagePipeDispatcher> SendMessagePipeDispatcher(
+    scoped_refptr<MessagePipeDispatcher> write_mp,
+    scoped_refptr<MessagePipeDispatcher> read_mp,
+    scoped_refptr<MessagePipeDispatcher> mp_to_send) {
+  CHECK_NE(mp_to_send, write_mp);
+  CHECK_NE(mp_to_send, read_mp);
+
+  // Set up waiting on the read end first (to avoid racing).
+  Waiter waiter;
+  waiter.Init();
+  CHECK_EQ(
+      read_mp->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 0, nullptr),
+      MOJO_RESULT_OK);
+
+  // Write a message with just |mp_to_send| through the write end.
+  DispatcherTransport transport(
+      test::DispatcherTryStartTransport(mp_to_send.get()));
+  CHECK(transport.is_valid());
+  std::vector<DispatcherTransport> transports;
+  transports.push_back(transport);
+  CHECK_EQ(write_mp->WriteMessage(NullUserPointer(), 0, &transports,
+                                  MOJO_WRITE_MESSAGE_FLAG_NONE),
+           MOJO_RESULT_OK);
+  transport.End();
+
+  // Wait for it to arrive.
+  CHECK_EQ(waiter.Wait(test::ActionDeadline(), nullptr), MOJO_RESULT_OK);
+  read_mp->RemoveAwakable(&waiter, nullptr);
+
+  // Read the message from the read end.
+  DispatcherVector dispatchers;
+  uint32_t num_dispatchers = 10;
+  CHECK_EQ(
+      read_mp->ReadMessage(NullUserPointer(), NullUserPointer(), &dispatchers,
+                           &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE),
+      MOJO_RESULT_OK);
+  CHECK_EQ(dispatchers.size(), 1u);
+  CHECK_EQ(num_dispatchers, 1u);
+  CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::Type::MESSAGE_PIPE);
+  return scoped_refptr<MessagePipeDispatcher>(
+      static_cast<MessagePipeDispatcher*>(dispatchers[0].get()));
+}
+
 class TestMasterProcessDelegate : public embedder::MasterProcessDelegate {
  public:
   TestMasterProcessDelegate()
@@ -203,12 +282,95 @@
   MOJO_DISALLOW_COPY_AND_ASSIGN(TestSlave);
 };
 
+// Encapsulates both the master and slave sides for each slave.
+class TestSlaveSetup {
+ public:
+  TestSlaveSetup(embedder::SimplePlatformSupport* platform_support,
+                 base::TestIOThread* test_io_thread,
+                 TestMasterProcessDelegate* master_process_delegate,
+                 IPCSupport* master_ipc_support)
+      : platform_support_(platform_support),
+        test_io_thread_(test_io_thread),
+        master_process_delegate_(master_process_delegate),
+        master_ipc_support_(master_ipc_support) {}
+  ~TestSlaveSetup() {
+    CHECK(!slave_connection_);
+    CHECK(!slave_);
+  }
+
+  void Init() {
+    // Set up the master side entirely before the slave side, since this
+    // simulates what's likely to happen "in reality" more closely.
+    slave_connection_.reset(
+        new TestSlaveConnection(test_io_thread_, master_ipc_support_));
+    master_mp_ = slave_connection_->ConnectToSlave();
+
+    slave_.reset(new TestSlave(platform_support_, test_io_thread_,
+                               slave_connection_->PassSlavePlatformHandle()));
+    slave_mp_ = slave_->ConnectToMaster(slave_connection_->connection_id());
+  }
+
+  void TestConnection() {
+    TestWriteReadMessage(master_mp_, slave_mp_);
+    TestWriteReadMessage(slave_mp_, master_mp_);
+  }
+
+  scoped_refptr<MessagePipeDispatcher> PassMasterMessagePipe() {
+    return master_mp_.Pass();
+  }
+
+  scoped_refptr<MessagePipeDispatcher> PassSlaveMessagePipe() {
+    return slave_mp_.Pass();
+  }
+
+  void Shutdown() {
+    if (master_mp_) {
+      master_mp_->Close();
+      master_mp_ = nullptr;
+    }
+    if (slave_mp_) {
+      slave_mp_->Close();
+      slave_mp_ = nullptr;
+    }
+
+    slave_->ShutdownChannelToMaster();
+    slave_->ShutdownIPCSupport();
+    EXPECT_TRUE(master_process_delegate_->TryWaitForOnSlaveDisconnect());
+    slave_connection_->ShutdownChannelToSlave();
+
+    slave_.reset();
+    slave_connection_.reset();
+  }
+
+  TestSlaveConnection* slave_connection() { return slave_connection_.get(); }
+  // Note: To close the master message pipe, use |PassMasterMessagePipe()|.
+  MessagePipeDispatcher* master_mp() { return master_mp_.get(); }
+
+  TestSlave* slave() { return slave_.get(); }
+  // Note: To close the slave message pipe, use |PassSlaveMessagePipe()|.
+  MessagePipeDispatcher* slave_mp() { return slave_mp_.get(); }
+
+ private:
+  embedder::SimplePlatformSupport* const platform_support_;
+  base::TestIOThread* const test_io_thread_;
+  TestMasterProcessDelegate* const master_process_delegate_;
+  IPCSupport* const master_ipc_support_;
+
+  scoped_ptr<TestSlaveConnection> slave_connection_;
+  scoped_refptr<MessagePipeDispatcher> master_mp_;
+
+  scoped_ptr<TestSlave> slave_;
+  scoped_refptr<MessagePipeDispatcher> slave_mp_;
+
+  MOJO_DISALLOW_COPY_AND_ASSIGN(TestSlaveSetup);
+};
+
 class IPCSupportTest : public testing::Test {
  public:
   // Note: Run master process delegate methods on the I/O thread.
   IPCSupportTest()
       : test_io_thread_(base::TestIOThread::kAutoStart),
-        master_ipc_support_(&platform_support(),
+        master_ipc_support_(&platform_support_,
                             embedder::ProcessType::MASTER,
                             test_io_thread_.task_runner(),
                             &master_process_delegate_,
@@ -216,6 +378,14 @@
                             embedder::ScopedPlatformHandle()) {}
   ~IPCSupportTest() override {}
 
+  scoped_ptr<TestSlaveSetup> SetupSlave() {
+    scoped_ptr<TestSlaveSetup> s(
+        new TestSlaveSetup(&platform_support_, &test_io_thread_,
+                           &master_process_delegate_, &master_ipc_support_));
+    s->Init();
+    return s;
+  }
+
   void ShutdownMasterIPCSupport() {
     test_io_thread_.PostTaskAndWait(
         FROM_HERE, base::Bind(&IPCSupport::ShutdownOnIOThread,
@@ -242,38 +412,6 @@
   MOJO_DISALLOW_COPY_AND_ASSIGN(IPCSupportTest);
 };
 
-// Tests writing a message (containing just data) to |write_mp| and then reading
-// it from |read_mp| (it should be the next message, i.e., there should be no
-// other messages already enqueued in that direction).
-void TestWriteReadMessage(scoped_refptr<MessagePipeDispatcher> write_mp,
-                          scoped_refptr<MessagePipeDispatcher> read_mp) {
-  // Set up waiting on the read end first (to avoid racing).
-  Waiter waiter;
-  waiter.Init();
-  ASSERT_EQ(
-      MOJO_RESULT_OK,
-      read_mp->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 0, nullptr));
-
-  // Write a message with just 'x' through the write end.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            write_mp->WriteMessage(UserPointer<const void>("x"), 1, nullptr,
-                                   MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // Wait for it to arrive.
-  EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), nullptr));
-  read_mp->RemoveAwakable(&waiter, nullptr);
-
-  // Read the message from the read end.
-  char buffer[10] = {};
-  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            read_mp->ReadMessage(UserPointer<void>(buffer),
-                                 MakeUserPointer(&buffer_size), 0, nullptr,
-                                 MOJO_READ_MESSAGE_FLAG_NONE));
-  EXPECT_EQ(1u, buffer_size);
-  EXPECT_EQ('x', buffer[0]);
-}
-
 using MessagePipeDispatcherPair =
     std::pair<scoped_refptr<MessagePipeDispatcher>,
               scoped_refptr<MessagePipeDispatcher>>;
@@ -289,83 +427,23 @@
   return rv;
 }
 
-// Writes a message pipe dispatcher (in a message) to |write_mp| and reads it
-// from |read_mp| (it should be the next message, i.e., there should be no other
-// other messages already enqueued in that direction).
-scoped_refptr<MessagePipeDispatcher> SendMessagePipeDispatcher(
-    scoped_refptr<MessagePipeDispatcher> write_mp,
-    scoped_refptr<MessagePipeDispatcher> read_mp,
-    scoped_refptr<MessagePipeDispatcher> mp_to_send) {
-  CHECK_NE(mp_to_send, write_mp);
-  CHECK_NE(mp_to_send, read_mp);
-
-  // Set up waiting on the read end first (to avoid racing).
-  Waiter waiter;
-  waiter.Init();
-  CHECK_EQ(
-      read_mp->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 0, nullptr),
-      MOJO_RESULT_OK);
-
-  // Write a message with just |mp_to_send| through the write end.
-  DispatcherTransport transport(
-      test::DispatcherTryStartTransport(mp_to_send.get()));
-  CHECK(transport.is_valid());
-  std::vector<DispatcherTransport> transports;
-  transports.push_back(transport);
-  CHECK_EQ(write_mp->WriteMessage(NullUserPointer(), 0, &transports,
-                                  MOJO_WRITE_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  transport.End();
-
-  // Wait for it to arrive.
-  CHECK_EQ(waiter.Wait(test::ActionDeadline(), nullptr), MOJO_RESULT_OK);
-  read_mp->RemoveAwakable(&waiter, nullptr);
-
-  // Read the message from the read end.
-  DispatcherVector dispatchers;
-  uint32_t num_dispatchers = 10;
-  CHECK_EQ(
-      read_mp->ReadMessage(NullUserPointer(), NullUserPointer(), &dispatchers,
-                           &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE),
-      MOJO_RESULT_OK);
-  CHECK_EQ(dispatchers.size(), 1u);
-  CHECK_EQ(num_dispatchers, 1u);
-  CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::Type::MESSAGE_PIPE);
-  return scoped_refptr<MessagePipeDispatcher>(
-      static_cast<MessagePipeDispatcher*>(dispatchers[0].get()));
-}
-
 TEST_F(IPCSupportTest, MasterSlave) {
-  TestSlaveConnection slave_connection(&test_io_thread(),
-                                       &master_ipc_support());
-  scoped_refptr<MessagePipeDispatcher> master_mp =
-      slave_connection.ConnectToSlave();
+  scoped_ptr<TestSlaveSetup> s(SetupSlave());
 
-  TestSlave slave(&platform_support(), &test_io_thread(),
-                  slave_connection.PassSlavePlatformHandle());
-  scoped_refptr<MessagePipeDispatcher> slave_mp =
-      slave.ConnectToMaster(slave_connection.connection_id());
-
-  // Test that we can send a message from the master to the slave.
-  TestWriteReadMessage(master_mp, slave_mp);
-  // And vice versa.
-  TestWriteReadMessage(slave_mp, master_mp);
+  s->TestConnection();
 
   // Don't need the message pipe anymore.
-  master_mp->Close();
-  slave_mp->Close();
+  s->PassMasterMessagePipe()->Close();
+  s->PassSlaveMessagePipe()->Close();
 
   // A message was sent through the message pipe, |Channel|s must have been
   // established on both sides. The events have thus almost certainly been
   // signalled, but we'll wait just to be sure.
-  slave_connection.WaitForChannelToSlave();
-  slave.WaitForChannelToMaster();
+  s->slave_connection()->WaitForChannelToSlave();
+  s->slave()->WaitForChannelToMaster();
 
-  slave.ShutdownChannelToMaster();
-  slave.ShutdownIPCSupport();
-  EXPECT_TRUE(master_process_delegate().TryWaitForOnSlaveDisconnect());
+  s->Shutdown();
 
-  slave_connection.ShutdownChannelToSlave();
   ShutdownMasterIPCSupport();
 }
 
@@ -378,47 +456,28 @@
 // TODO(vtl): In this scenario, we can't test the intermediary (the master)
 // going away.
 TEST_F(IPCSupportTest, ConnectTwoSlaves) {
-  TestSlaveConnection slave1_connection(&test_io_thread(),
-                                        &master_ipc_support());
-  scoped_refptr<MessagePipeDispatcher> master_mp1 =
-      slave1_connection.ConnectToSlave();
-
-  TestSlave slave1(&platform_support(), &test_io_thread(),
-                   slave1_connection.PassSlavePlatformHandle());
-  scoped_refptr<MessagePipeDispatcher> slave1_mp =
-      slave1.ConnectToMaster(slave1_connection.connection_id());
-
-  TestSlaveConnection slave2_connection(&test_io_thread(),
-                                        &master_ipc_support());
-  scoped_refptr<MessagePipeDispatcher> master_mp2 =
-      slave2_connection.ConnectToSlave();
-
-  TestSlave slave2(&platform_support(), &test_io_thread(),
-                   slave2_connection.PassSlavePlatformHandle());
-  scoped_refptr<MessagePipeDispatcher> slave2_mp =
-      slave2.ConnectToMaster(slave2_connection.connection_id());
-
-  TestWriteReadMessage(master_mp1, slave1_mp);
-  TestWriteReadMessage(slave1_mp, master_mp1);
-  TestWriteReadMessage(master_mp2, slave2_mp);
-  TestWriteReadMessage(slave2_mp, master_mp2);
+  scoped_ptr<TestSlaveSetup> s1(SetupSlave());
+  scoped_ptr<TestSlaveSetup> s2(SetupSlave());
+  s1->TestConnection();
+  s2->TestConnection();
 
   // Make a message pipe (logically "in" the master) and send one end to each
   // slave.
-  MessagePipeDispatcherPair send_mps = CreateMessagePipe();
+  MessagePipeDispatcherPair send_mp = CreateMessagePipe();
   scoped_refptr<MessagePipeDispatcher> slave1_received_mp =
-      SendMessagePipeDispatcher(master_mp1, slave1_mp, send_mps.first);
+      SendMessagePipeDispatcher(s1->master_mp(), s1->slave_mp(), send_mp.first);
   scoped_refptr<MessagePipeDispatcher> slave2_received_mp =
-      SendMessagePipeDispatcher(master_mp2, slave2_mp, send_mps.second);
+      SendMessagePipeDispatcher(s2->master_mp(), s2->slave_mp(),
+                                send_mp.second);
 
   // These should be connected.
   TestWriteReadMessage(slave1_received_mp, slave2_received_mp);
   TestWriteReadMessage(slave2_received_mp, slave1_received_mp);
 
-  master_mp1->Close();
-  master_mp2->Close();
-  slave1_mp->Close();
-  slave2_mp->Close();
+  s1->PassMasterMessagePipe()->Close();
+  s2->PassMasterMessagePipe()->Close();
+  s1->PassSlaveMessagePipe()->Close();
+  s2->PassSlaveMessagePipe()->Close();
 
   // They should still be connected.
   TestWriteReadMessage(slave1_received_mp, slave2_received_mp);
@@ -427,15 +486,95 @@
   slave1_received_mp->Close();
   slave2_received_mp->Close();
 
-  slave1.ShutdownChannelToMaster();
-  slave1.ShutdownIPCSupport();
-  EXPECT_TRUE(master_process_delegate().TryWaitForOnSlaveDisconnect());
-  slave1_connection.ShutdownChannelToSlave();
+  s1->Shutdown();
+  s2->Shutdown();
 
-  slave2.ShutdownChannelToMaster();
-  slave2.ShutdownIPCSupport();
-  EXPECT_TRUE(master_process_delegate().TryWaitForOnSlaveDisconnect());
-  slave2_connection.ShutdownChannelToSlave();
+  ShutdownMasterIPCSupport();
+}
+
+// Like |ConnectTwoSlaves|, but does it twice, to test reusing a connection.
+TEST_F(IPCSupportTest, ConnectTwoSlavesTwice) {
+  scoped_ptr<TestSlaveSetup> s1(SetupSlave());
+  scoped_ptr<TestSlaveSetup> s2(SetupSlave());
+  s1->TestConnection();
+  s2->TestConnection();
+
+  MessagePipeDispatcherPair send_mp1 = CreateMessagePipe();
+  scoped_refptr<MessagePipeDispatcher> slave1_received_mp1 =
+      SendMessagePipeDispatcher(s1->master_mp(), s1->slave_mp(),
+                                send_mp1.first);
+  scoped_refptr<MessagePipeDispatcher> slave2_received_mp1 =
+      SendMessagePipeDispatcher(s2->master_mp(), s2->slave_mp(),
+                                send_mp1.second);
+
+  MessagePipeDispatcherPair send_mp2 = CreateMessagePipe();
+  scoped_refptr<MessagePipeDispatcher> slave1_received_mp2 =
+      SendMessagePipeDispatcher(s1->master_mp(), s1->slave_mp(),
+                                send_mp2.first);
+  scoped_refptr<MessagePipeDispatcher> slave2_received_mp2 =
+      SendMessagePipeDispatcher(s2->master_mp(), s2->slave_mp(),
+                                send_mp2.second);
+
+  s1->PassMasterMessagePipe()->Close();
+  s2->PassMasterMessagePipe()->Close();
+  s1->PassSlaveMessagePipe()->Close();
+  s2->PassSlaveMessagePipe()->Close();
+
+  TestWriteReadMessage(slave1_received_mp1, slave2_received_mp1);
+  TestWriteReadMessage(slave2_received_mp1, slave1_received_mp1);
+
+  TestWriteReadMessage(slave1_received_mp2, slave2_received_mp2);
+  TestWriteReadMessage(slave2_received_mp2, slave1_received_mp2);
+
+  slave1_received_mp1->Close();
+  slave2_received_mp1->Close();
+
+  TestWriteReadMessage(slave1_received_mp2, slave2_received_mp2);
+  TestWriteReadMessage(slave2_received_mp2, slave1_received_mp2);
+
+  slave1_received_mp2->Close();
+  slave2_received_mp2->Close();
+
+  s1->Shutdown();
+  s2->Shutdown();
+
+  ShutdownMasterIPCSupport();
+}
+
+// Creates a message pipe in the slave, which sends both ends (in separate
+// messages) to the master.
+TEST_F(IPCSupportTest, SlavePassBackToMaster) {
+  scoped_ptr<TestSlaveSetup> s(SetupSlave());
+
+  s->TestConnection();
+
+  // Make a message pipe (logically "in" the slave) and send both ends
+  // (separately) to the master.
+  MessagePipeDispatcherPair send_mp = CreateMessagePipe();
+  scoped_refptr<MessagePipeDispatcher> received_mp1 =
+      SendMessagePipeDispatcher(s->slave_mp(), s->master_mp(), send_mp.first);
+
+  TestWriteReadMessage(received_mp1, send_mp.second);
+  TestWriteReadMessage(send_mp.second, received_mp1);
+
+  scoped_refptr<MessagePipeDispatcher> received_mp2 =
+      SendMessagePipeDispatcher(s->slave_mp(), s->master_mp(), send_mp.second);
+
+  s->PassMasterMessagePipe()->Close();
+  s->PassSlaveMessagePipe()->Close();
+
+  TestWriteReadMessage(received_mp1, received_mp2);
+  TestWriteReadMessage(received_mp2, received_mp1);
+
+  s->Shutdown();
+
+  // These should still be connected.
+  // TODO(vtl): This is not yet implemented, thus will fail here!
+  // TestWriteReadMessage(received_mp1, received_mp2);
+  // TestWriteReadMessage(received_mp2, received_mp1);
+
+  received_mp1->Close();
+  received_mp2->Close();
 
   ShutdownMasterIPCSupport();
 }
diff --git a/mojo/edk/system/message_pipe_dispatcher_unittest.cc b/mojo/edk/system/message_pipe_dispatcher_unittest.cc
index f93cd90..aebc439 100644
--- a/mojo/edk/system/message_pipe_dispatcher_unittest.cc
+++ b/mojo/edk/system/message_pipe_dispatcher_unittest.cc
@@ -15,7 +15,6 @@
 
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_vector.h"
-#include "base/rand_util.h"
 #include "base/threading/simple_thread.h"
 #include "mojo/edk/system/message_pipe.h"
 #include "mojo/edk/system/test_utils.h"
@@ -504,12 +503,12 @@
       buffer[i] = static_cast<unsigned char>(i);
 
     // Number of messages to write.
-    *messages_written_ = static_cast<size_t>(base::RandInt(1000, 6000));
+    *messages_written_ = static_cast<size_t>(test::RandomInt(1000, 6000));
 
     // Write messages.
     for (size_t i = 0; i < *messages_written_; i++) {
       uint32_t bytes_to_write = static_cast<uint32_t>(
-          base::RandInt(1, static_cast<int>(kMaxMessageSize)));
+          test::RandomInt(1, static_cast<int>(kMaxMessageSize)));
       EXPECT_EQ(MOJO_RESULT_OK,
                 write_dispatcher_->WriteMessage(UserPointer<const void>(buffer),
                                                 bytes_to_write, nullptr,
diff --git a/mojo/edk/system/raw_channel_unittest.cc b/mojo/edk/system/raw_channel_unittest.cc
index a901791..2fa3f7b 100644
--- a/mojo/edk/system/raw_channel_unittest.cc
+++ b/mojo/edk/system/raw_channel_unittest.cc
@@ -18,7 +18,6 @@
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/memory/scoped_vector.h"
-#include "base/rand_util.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/test/test_io_thread.h"
 #include "base/threading/simple_thread.h"
@@ -325,7 +324,7 @@
 
     while (left_to_write_-- > 0) {
       EXPECT_TRUE(raw_channel_->WriteMessage(MakeTestMessage(
-          static_cast<uint32_t>(base::RandInt(1, kMaxRandomMessageSize)))));
+          static_cast<uint32_t>(test::RandomInt(1, kMaxRandomMessageSize)))));
     }
   }
 
diff --git a/mojo/edk/system/remote_producer_data_pipe_impl.cc b/mojo/edk/system/remote_producer_data_pipe_impl.cc
index 8d7fa26..833c505 100644
--- a/mojo/edk/system/remote_producer_data_pipe_impl.cc
+++ b/mojo/edk/system/remote_producer_data_pipe_impl.cc
@@ -348,15 +348,20 @@
 
 bool RemoteProducerDataPipeImpl::OnReadMessage(unsigned /*port*/,
                                                MessageInTransit* message) {
-  // Always take ownership of the message. (This means that we should always
-  // return true.)
-  scoped_ptr<MessageInTransit> msg(message);
-
   if (!producer_open()) {
+    // This will happen only on the rare occasion that the call to
+    // |OnReadMessage()| is racing with us calling
+    // |ChannelEndpoint::ReplaceClient()|, in which case we reject the message,
+    // and the |ChannelEndpoint| can retry (calling the new client's
+    // |OnReadMessage()|).
     DCHECK(!channel_endpoint_);
-    return true;
+    return false;
   }
 
+  // Otherwise, we take ownership of the message. (This means that we should
+  // always return true below.)
+  scoped_ptr<MessageInTransit> msg(message);
+
   if (!ValidateIncomingMessage(element_num_bytes(), capacity_num_bytes(),
                                current_num_bytes_, msg.get())) {
     Disconnect();
@@ -462,12 +467,8 @@
   // buffer around. Currently, we won't free it even if it empties later. (We
   // could do this -- requiring a check on every read -- but that seems to be
   // optimizing for the uncommon case.)
-  if (!consumer_open() || !current_num_bytes_) {
-    // Note: There can only be a two-phase *read* (by the consumer) if we still
-    // have data.
-    DCHECK(!consumer_in_two_phase_read());
+  if (!consumer_open() || !current_num_bytes_)
     DestroyBuffer();
-  }
 }
 
 }  // namespace system
diff --git a/mojo/edk/system/simple_dispatcher_unittest.cc b/mojo/edk/system/simple_dispatcher_unittest.cc
index 051e108..9e1bd7b 100644
--- a/mojo/edk/system/simple_dispatcher_unittest.cc
+++ b/mojo/edk/system/simple_dispatcher_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_vector.h"
-#include "base/synchronization/lock.h"
 #include "mojo/edk/system/test_utils.h"
 #include "mojo/edk/system/waiter.h"
 #include "mojo/edk/system/waiter_test_utils.h"
diff --git a/mojo/edk/system/test_utils.cc b/mojo/edk/system/test_utils.cc
index 8bd16eb..823bcf4 100644
--- a/mojo/edk/system/test_utils.cc
+++ b/mojo/edk/system/test_utils.cc
@@ -4,6 +4,9 @@
 
 #include "mojo/edk/system/test_utils.h"
 
+#include <stdint.h>
+#include <stdlib.h>
+
 #include <limits>
 
 #include "base/logging.h"
@@ -52,6 +55,23 @@
       base::TimeDelta::FromMicroseconds(static_cast<int64_t>(deadline)));
 }
 
+// TODO(vtl): Replace all of this implementation with suitable use of C++11
+// <random> when we can.
+int RandomInt(int min, int max) {
+  DCHECK_LE(min, max);
+  DCHECK_LE(static_cast<int64_t>(max) - min, RAND_MAX);
+  DCHECK_LT(static_cast<int64_t>(max) - min, std::numeric_limits<int>::max());
+
+  // This is in-range for an |int| due to the above.
+  int range = max - min + 1;
+  int max_valid = (RAND_MAX / range) * range - 1;
+  int value;
+  do {
+    value = rand();
+  } while (value > max_valid);
+  return min + (value % range);
+}
+
 Stopwatch::Stopwatch() {
 }
 
diff --git a/mojo/edk/system/test_utils.h b/mojo/edk/system/test_utils.h
index 144e07b..59f9dd5 100644
--- a/mojo/edk/system/test_utils.h
+++ b/mojo/edk/system/test_utils.h
@@ -13,6 +13,8 @@
 namespace system {
 namespace test {
 
+// Deadlines/timeouts and sleeping ---------------------------------------------
+
 MojoDeadline DeadlineFromMilliseconds(unsigned milliseconds);
 
 // A timeout smaller than |TestTimeouts::tiny_timeout()|, as a |MojoDeadline|.
@@ -32,6 +34,13 @@
 // Sleeps for at least the specified duration.
 void Sleep(MojoDeadline deadline);
 
+// Pseudorandom numbers for testing --------------------------------------------
+
+// Returns a (uniformly) (pseudo)random integer in the interval [min, max].
+// Currently, |max - min| must be at most |RAND_MAX| and must also be (strictly)
+// less than |INT_MAX|.
+int RandomInt(int min, int max);
+
 // Stopwatch -------------------------------------------------------------------
 
 // A simple "stopwatch" for measuring time elapsed from a given starting point.
diff --git a/mojo/edk/system/test_utils_unittest.cc b/mojo/edk/system/test_utils_unittest.cc
new file mode 100644
index 0000000..5a3eda5
--- /dev/null
+++ b/mojo/edk/system/test_utils_unittest.cc
@@ -0,0 +1,53 @@
+// 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.
+
+#include "mojo/edk/system/test_utils.h"
+
+#include <limits>
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace mojo {
+namespace system {
+namespace test {
+namespace {
+
+TEST(TestUtilsTest, RandomInt) {
+  static const int kMin = -3;
+  static const int kMax = 6;
+  static const unsigned kNumBuckets = kMax - kMin + 1;
+  unsigned buckets[kNumBuckets];
+
+  static const unsigned kIterations = 10000;
+  for (unsigned i = 0; i < kIterations; i++) {
+    int value = RandomInt(kMin, kMax);
+    ASSERT_GE(value, kMin);
+    ASSERT_LE(value, kMax);
+    buckets[value - kMin]++;
+  }
+
+  for (unsigned i = 0; i < kNumBuckets; i++) {
+    // The odds that a value in any bucket is less than the expected value
+    // should be very  small (if |kIterations| is sufficiently large compared to
+    // |kNumBuckets|).
+    // TODO(vtl): Actually calculate these odds, and maybe raise the proportion
+    // to something (much) larger than "half".
+    EXPECT_GE(buckets[i], kIterations / kNumBuckets / 2);
+  }
+}
+
+TEST(TestUtilsTest, RandomIntSameValues) {
+  static const int kIntMin = std::numeric_limits<int>::min();
+  EXPECT_EQ(kIntMin, RandomInt(kIntMin, kIntMin));
+
+  static const int kIntMax = std::numeric_limits<int>::max();
+  EXPECT_EQ(kIntMax, RandomInt(kIntMax, kIntMax));
+
+  EXPECT_EQ(0, RandomInt(0, 0));
+}
+
+}  // namespace
+}  // namespace test
+}  // namespace system
+}  // namespace mojo
diff --git a/mojo/edk/system/unique_identifier.cc b/mojo/edk/system/unique_identifier.cc
index 6e036c8..984fb52 100644
--- a/mojo/edk/system/unique_identifier.cc
+++ b/mojo/edk/system/unique_identifier.cc
@@ -4,16 +4,25 @@
 
 #include "mojo/edk/system/unique_identifier.h"
 
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/strings/string_number_conversions.h"
 #include "mojo/edk/embedder/platform_support.h"
 
 namespace mojo {
 namespace system {
 
+namespace {
+
+bool CapitalizedHexDigitToNumber(char c, unsigned char* number) {
+  if (c >= '0' && c <= '9')
+    *number = static_cast<unsigned char>(c - '0');
+  else if (c >= 'A' && c <= 'F')
+    *number = static_cast<unsigned char>(c - 'A' + 10);
+  else
+    return false;
+  return true;
+}
+
+}  // namespace
+
 // static
 UniqueIdentifier UniqueIdentifier::Generate(
     embedder::PlatformSupport* platform_support) {
@@ -25,20 +34,39 @@
 // static
 UniqueIdentifier UniqueIdentifier::FromString(const std::string& s,
                                               bool* success) {
-  UniqueIdentifier rv;
-  std::vector<uint8_t> bytes;
-  if (base::HexStringToBytes(s, &bytes) && bytes.size() == sizeof(rv.data_)) {
-    memcpy(rv.data_, &bytes[0], sizeof(rv.data_));
-    *success = true;
-  } else {
+  if (s.size() != 2 * sizeof(UniqueIdentifier::data_)) {
     *success = false;
+    return UniqueIdentifier();
   }
+
+  UniqueIdentifier rv;
+  for (size_t i = 0; i < sizeof(rv.data_); i++) {
+    unsigned char high_digit;
+    unsigned char low_digit;
+    // Note: |ToString()| always produces capitalized hex digits, so we should
+    // never get 'a' through 'f'.
+    if (!CapitalizedHexDigitToNumber(s[2 * i], &high_digit) ||
+        !CapitalizedHexDigitToNumber(s[2 * i + 1], &low_digit)) {
+      *success = false;
+      return UniqueIdentifier();
+    }
+    rv.data_[i] = (high_digit << 4) | low_digit;
+  }
+
+  *success = true;
   return rv;
 }
 
 std::string UniqueIdentifier::ToString() const {
+  // Currently, we encode as hexadecimal (using capitalized digits).
   // TODO(vtl): Maybe we should base-64 encode instead?
-  return base::HexEncode(data_, sizeof(data_));
+  static const char kHexDigits[] = "0123456789ABCDEF";
+  std::string rv(sizeof(data_) * 2, '\0');
+  for (size_t i = 0; i < sizeof(data_); i++) {
+    rv[2 * i] = kHexDigits[data_[i] >> 4];
+    rv[2 * i + 1] = kHexDigits[data_[i] & 0xf];
+  }
+  return rv;
 }
 
 }  // namespace system
diff --git a/mojo/edk/system/unique_identifier.h b/mojo/edk/system/unique_identifier.h
index 7db5e38..52ca57d 100644
--- a/mojo/edk/system/unique_identifier.h
+++ b/mojo/edk/system/unique_identifier.h
@@ -74,7 +74,7 @@
 
   explicit UniqueIdentifier() {}
 
-  char data_[16];
+  unsigned char data_[16];
 
   // Copying and assignment allowed.
 };
diff --git a/mojo/edk/system/unique_identifier_unittest.cc b/mojo/edk/system/unique_identifier_unittest.cc
index 1522446..1914af2 100644
--- a/mojo/edk/system/unique_identifier_unittest.cc
+++ b/mojo/edk/system/unique_identifier_unittest.cc
@@ -93,19 +93,23 @@
   // encoding. So first check something that we know should succeed, to roughly
   // confirm our knowledge.
   success = false;
-  UniqueIdentifier::FromString("0123456789abcdef0123456789ABCDEF", &success);
+  UniqueIdentifier::FromString("0123456789ABCDEF0123456789ABCDEF", &success);
   EXPECT_TRUE(success);
 
   success = true;
+  UniqueIdentifier::FromString("0123456789abcdef0123456789abcdef", &success);
+  EXPECT_FALSE(success);
+
+  success = true;
   UniqueIdentifier::FromString("!@#$%^&*()_+-=/\\,.<>[]{};':\"|", &success);
   EXPECT_FALSE(success);
 
   success = true;
-  UniqueIdentifier::FromString("0123456789abcdef0123456789ABCDE", &success);
+  UniqueIdentifier::FromString("0123456789ABCDEF0123456789ABCDE", &success);
   EXPECT_FALSE(success);
 
   success = true;
-  UniqueIdentifier::FromString("0123456789abcdef0123456789ABCD", &success);
+  UniqueIdentifier::FromString("0123456789ABCDEF0123456789ABCD", &success);
   EXPECT_FALSE(success);
 }
 
diff --git a/mojo/environment/BUILD.gn b/mojo/environment/BUILD.gn
index 5371935..5c7a9f0 100644
--- a/mojo/environment/BUILD.gn
+++ b/mojo/environment/BUILD.gn
@@ -3,8 +3,6 @@
 # found in the LICENSE file.
 
 source_set("chromium") {
-  output_name = "mojo_environment_chromium"
-
   sources = [
     "default_async_waiter.cc",
     "default_async_waiter.h",
@@ -27,6 +25,7 @@
     "//base",
     "//base/third_party/dynamic_annotations",
     "//mojo/common",
+    "//mojo/message_pump",
     "//mojo/public/c/environment",
     "//mojo/public/cpp/bindings:callback",
     "//mojo/public/cpp/environment",
diff --git a/mojo/environment/default_async_waiter.cc b/mojo/environment/default_async_waiter.cc
index 863cfe3..014e5c1 100644
--- a/mojo/environment/default_async_waiter.cc
+++ b/mojo/environment/default_async_waiter.cc
@@ -5,7 +5,7 @@
 #include "mojo/environment/default_async_waiter.h"
 
 #include "base/bind.h"
-#include "mojo/common/handle_watcher.h"
+#include "mojo/message_pump/handle_watcher.h"
 #include "mojo/public/c/environment/async_waiter.h"
 
 namespace mojo {
diff --git a/mojo/gles2/BUILD.gn b/mojo/gles2/BUILD.gn
index 92b2375..196ee6e 100644
--- a/mojo/gles2/BUILD.gn
+++ b/mojo/gles2/BUILD.gn
@@ -12,15 +12,38 @@
   defines = [ "GLES2_USE_MOJO" ]
 }
 
-source_set("gles2") {
+source_set("control_thunks") {
   sources = [
     "command_buffer_client_impl.cc",
     "command_buffer_client_impl.h",
-    "gles2_impl.cc",
+    "control_thunks_impl.cc",
+    "control_thunks_impl.h",
     "gles2_context.cc",
     "gles2_context.h",
   ]
 
+  deps = [
+    "//base",
+    "//mojo/public/c/system",
+    "//gpu/command_buffer/client",
+    "//gpu/command_buffer/client:gles2_cmd_helper",
+    "//gpu/command_buffer/client:gles2_implementation",
+    "//gpu/command_buffer/common",
+    "//mojo/public/c/gles2:headers",
+    "//mojo/public/c/gpu:MGL",
+    "//mojo/public/c/gpu:MGL_onscreen",
+    "//mojo/public/cpp/bindings",
+    "//mojo/public/cpp/system",
+    "//services/gles2:lib",
+    "//mojo/services/gpu/public/interfaces",
+  ]
+}
+
+source_set("gles2") {
+  sources = [
+    "gles2_impl.cc",
+  ]
+
   defines = [
     "GL_GLEXT_PROTOTYPES",
     "MOJO_GLES2_IMPLEMENTATION",
@@ -34,19 +57,26 @@
   all_dependent_configs = [ ":mojo_use_gles2" ]
 
   deps = [
-    "//base",
-    "//base/third_party/dynamic_annotations",
-    "//gpu/command_buffer/client",
-    "//gpu/command_buffer/client:gles2_cmd_helper",
-    "//gpu/command_buffer/client:gles2_implementation",
+    ":control_thunks",
     "//gpu/command_buffer/client:gles2_interface",
-    "//gpu/command_buffer/common",
-    "//mojo/environment:chromium",
     "//mojo/public/c/gles2:headers",
-    "//mojo/public/c/system",
-    "//mojo/public/cpp/bindings",
+    "//mojo/public/c/gpu:MGL",
+  ]
+}
+
+source_set("mgl") {
+  sources = [
+    "mgl_impl.cc",
+  ]
+
+  configs += [ ":gles2_use_mojo" ]
+
+  deps = [
+    ":control_thunks",
+    ":gles2",
+    "//mojo/public/c/gles2:headers",
+    "//mojo/public/c/gpu:MGL",
+    "//mojo/public/c/gpu:MGL_onscreen",
     "//mojo/public/cpp/system",
-    "//mojo/services/gpu/public/interfaces",
-    "//services/gles2:lib",
   ]
 }
diff --git a/mojo/gles2/control_thunks_impl.cc b/mojo/gles2/control_thunks_impl.cc
new file mode 100644
index 0000000..d428607
--- /dev/null
+++ b/mojo/gles2/control_thunks_impl.cc
@@ -0,0 +1,82 @@
+// 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.
+
+#include "mojo/gles2/control_thunks_impl.h"
+
+#include "mojo/gles2/gles2_context.h"
+#include "mojo/public/cpp/system/message_pipe.h"
+
+namespace gles2 {
+
+// static
+ControlThunksImpl* ControlThunksImpl::Get() {
+  static base::LazyInstance<ControlThunksImpl>::Leaky thunks;
+  return thunks.Pointer();
+}
+
+MGLContext ControlThunksImpl::CreateContext(
+    MGLOpenGLAPIVersion version,
+    MojoHandle command_buffer_handle,
+    MGLContext share_group,
+    MGLContextLostCallback lost_callback,
+    void* lost_callback_closure,
+    const struct MojoAsyncWaiter* async_waiter) {
+  mojo::MessagePipeHandle mph(command_buffer_handle);
+  mojo::ScopedMessagePipeHandle scoped_handle(mph);
+  scoped_ptr<GLES2Context> client(
+      new GLES2Context(async_waiter, scoped_handle.Pass(), lost_callback,
+                       lost_callback_closure));
+  if (!client->Initialize())
+    client.reset();
+  return client.release();
+}
+
+void ControlThunksImpl::DestroyContext(MGLContext context) {
+  delete static_cast<GLES2Context*>(context);
+}
+
+void ControlThunksImpl::MakeCurrent(MGLContext context) {
+  current_context_tls_.Set(static_cast<GLES2Context*>(context));
+}
+
+MGLContext ControlThunksImpl::GetCurrentContext() {
+  return current_context_tls_.Get();
+}
+
+void ControlThunksImpl::ResizeSurface(uint32_t width, uint32_t height) {
+  current_context_tls_.Get()->interface()->ResizeCHROMIUM(width, height, 1.f);
+}
+
+void ControlThunksImpl::SwapBuffers() {
+  current_context_tls_.Get()->interface()->SwapBuffers();
+}
+
+void* ControlThunksImpl::GetGLES2Interface(MojoGLES2Context context) {
+  GLES2Context* client = reinterpret_cast<GLES2Context*>(context);
+  DCHECK(client);
+  return client->interface();
+}
+
+void ControlThunksImpl::SignalSyncPoint(
+    MojoGLES2Context context,
+    uint32_t sync_point,
+    MojoGLES2SignalSyncPointCallback callback,
+    void* closure) {
+  current_context_tls_.Get()->context_support()->SignalSyncPoint(
+      sync_point, base::Bind(callback, closure));
+}
+
+gpu::gles2::GLES2Interface* ControlThunksImpl::CurrentGLES2Interface() {
+  if (!current_context_tls_.Get())
+    return nullptr;
+  return current_context_tls_.Get()->interface();
+}
+
+ControlThunksImpl::ControlThunksImpl() {
+}
+
+ControlThunksImpl::~ControlThunksImpl() {
+}
+
+}  // namespace gles2
diff --git a/mojo/gles2/control_thunks_impl.h b/mojo/gles2/control_thunks_impl.h
new file mode 100644
index 0000000..0543adf
--- /dev/null
+++ b/mojo/gles2/control_thunks_impl.h
@@ -0,0 +1,69 @@
+// 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.
+
+#ifndef MOJO_GLES2_CONTROL_THUNKS_IMPL_H_
+#define MOJO_GLES2_CONTROL_THUNKS_IMPL_H_
+
+#include "base/lazy_instance.h"
+#include "base/macros.h"
+#include "base/threading/thread_local.h"
+#include "gpu/GLES2/gl2extchromium.h"
+#include "mojo/gles2/gles2_context.h"
+#include "mojo/public/c/gles2/gles2.h"
+#include "mojo/public/c/gpu/MGL/mgl.h"
+
+namespace gpu {
+namespace gles2 {
+class GLES2Interface;
+}
+}
+
+namespace gles2 {
+
+// ControlThunksImpl is a singleton class that implements the MGL and MojoGLES2
+// control functions. The class maintains a lazily allocated TLS slot on each
+// thread for the current GL context.
+class ControlThunksImpl {
+ public:
+  static ControlThunksImpl* Get();
+
+  MGLContext CreateContext(MGLOpenGLAPIVersion version,
+                           MojoHandle command_buffer_handle,
+                           MGLContext share_group,
+                           MGLContextLostCallback lost_callback,
+                           void* lost_callback_closure,
+                           const struct MojoAsyncWaiter* async_waiter);
+
+  void DestroyContext(MGLContext context);
+
+  void MakeCurrent(MGLContext context);
+
+  MGLContext GetCurrentContext();
+
+  void ResizeSurface(uint32_t width, uint32_t height);
+
+  void SwapBuffers();
+
+  void* GetGLES2Interface(MojoGLES2Context context);
+
+  void SignalSyncPoint(MojoGLES2Context context,
+                       uint32_t sync_point,
+                       MojoGLES2SignalSyncPointCallback callback,
+                       void* closure);
+
+  gpu::gles2::GLES2Interface* CurrentGLES2Interface();
+
+ private:
+  friend base::DefaultLazyInstanceTraits<gles2::ControlThunksImpl>;
+  ControlThunksImpl();
+  ~ControlThunksImpl();
+
+  base::ThreadLocalPointer<GLES2Context> current_context_tls_;
+
+  DISALLOW_COPY_AND_ASSIGN(ControlThunksImpl);
+};
+
+}  // namespace gles2
+
+#endif  // MOJO_GLES2_CONTROL_THUNKS_IMPL_H_
diff --git a/mojo/gles2/gles2_context.cc b/mojo/gles2/gles2_context.cc
index 27b7c09..dff790c 100644
--- a/mojo/gles2/gles2_context.cc
+++ b/mojo/gles2/gles2_context.cc
@@ -21,7 +21,7 @@
 
 GLES2Context::GLES2Context(const MojoAsyncWaiter* async_waiter,
                            mojo::ScopedMessagePipeHandle command_buffer_handle,
-                           MojoGLES2ContextLost lost_callback,
+                           MGLContextLostCallback lost_callback,
                            void* closure)
     : command_buffer_(this, async_waiter, command_buffer_handle.Pass()),
       lost_callback_(lost_callback),
diff --git a/mojo/gles2/gles2_context.h b/mojo/gles2/gles2_context.h
index 87ccfd6..f725e25 100644
--- a/mojo/gles2/gles2_context.h
+++ b/mojo/gles2/gles2_context.h
@@ -10,8 +10,9 @@
 #include "gpu/command_buffer/client/gles2_implementation.h"
 #include "mojo/gles2/command_buffer_client_impl.h"
 #include "mojo/public/c/gles2/gles2.h"
+#include "mojo/public/c/gpu/MGL/mgl_types.h"
 
-struct MojoGLES2ContextPrivate {};
+struct MGLContextPrivate {};
 
 namespace gpu {
 class TransferBuffer;
@@ -23,12 +24,11 @@
 
 namespace gles2 {
 
-class GLES2Context : public CommandBufferDelegate,
-                     public MojoGLES2ContextPrivate {
+class GLES2Context : public CommandBufferDelegate, public MGLContextPrivate {
  public:
   explicit GLES2Context(const MojoAsyncWaiter* async_waiter,
                         mojo::ScopedMessagePipeHandle command_buffer_handle,
-                        MojoGLES2ContextLost lost_callback,
+                        MGLContextLostCallback lost_callback,
                         void* closure);
   ~GLES2Context() override;
   bool Initialize();
@@ -49,7 +49,7 @@
   scoped_ptr<gpu::gles2::GLES2CmdHelper> gles2_helper_;
   scoped_ptr<gpu::TransferBuffer> transfer_buffer_;
   scoped_ptr<gpu::gles2::GLES2Implementation> implementation_;
-  MojoGLES2ContextLost lost_callback_;
+  MGLContextLostCallback lost_callback_;
   void* closure_;
 
   MOJO_DISALLOW_COPY_AND_ASSIGN(GLES2Context);
diff --git a/mojo/gles2/gles2_impl.cc b/mojo/gles2/gles2_impl.cc
index 50e1d3f..dac1a00 100644
--- a/mojo/gles2/gles2_impl.cc
+++ b/mojo/gles2/gles2_impl.cc
@@ -2,78 +2,63 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/public/c/gles2/gles2.h"
-
-#include "base/lazy_instance.h"
-#include "base/threading/thread_local.h"
-#include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
-#include "mojo/gles2/gles2_context.h"
-
-using gles2::GLES2Context;
-
-namespace {
-
-base::LazyInstance<base::ThreadLocalPointer<gpu::gles2::GLES2Interface> >::Leaky
-    g_gpu_interface;
-
-}  // namespace
+#include "mojo/gles2/control_thunks_impl.h"
+#include "mojo/public/c/gles2/gles2.h"
+#include "mojo/public/c/gpu/MGL/mgl.h"
 
 extern "C" {
+
 MojoGLES2Context MojoGLES2CreateContext(MojoHandle handle,
                                         MojoGLES2ContextLost lost_callback,
                                         void* closure,
                                         const MojoAsyncWaiter* async_waiter) {
-  mojo::MessagePipeHandle mph(handle);
-  mojo::ScopedMessagePipeHandle scoped_handle(mph);
-  scoped_ptr<GLES2Context> client(new GLES2Context(
-      async_waiter, scoped_handle.Pass(), lost_callback, closure));
-  if (!client->Initialize())
-    client.reset();
-  return client.release();
+  MGLContext context = gles2::ControlThunksImpl::Get()->CreateContext(
+      MGL_API_VERSION_GLES2,  // version
+      handle,                 // command_buffer_handle
+      MGL_NO_CONTEXT,         // share_group
+      static_cast<MGLContextLostCallback>(lost_callback), closure,
+      async_waiter);
+  return reinterpret_cast<MojoGLES2Context>(context);
 }
 
 void MojoGLES2DestroyContext(MojoGLES2Context context) {
-  delete static_cast<GLES2Context*>(context);
+  gles2::ControlThunksImpl::Get()->DestroyContext(
+      reinterpret_cast<MGLContext>(context));
 }
 
 void MojoGLES2MakeCurrent(MojoGLES2Context context) {
-  gpu::gles2::GLES2Interface* interface = NULL;
-  if (context) {
-    GLES2Context* client = static_cast<GLES2Context*>(context);
-    interface = client->interface();
-    DCHECK(interface);
-  }
-  g_gpu_interface.Get().Set(interface);
+  gles2::ControlThunksImpl::Get()->MakeCurrent(
+      reinterpret_cast<MGLContext>(context));
 }
 
 void MojoGLES2SwapBuffers() {
-  DCHECK(g_gpu_interface.Get().Get());
-  g_gpu_interface.Get().Get()->SwapBuffers();
+  gles2::ControlThunksImpl::Get()->SwapBuffers();
 }
 
 void* MojoGLES2GetGLES2Interface(MojoGLES2Context context) {
-  return static_cast<GLES2Context*>(context)->interface();
+  return gles2::ControlThunksImpl::Get()->GetGLES2Interface(context);
 }
 
 void MojoGLES2SignalSyncPoint(MojoGLES2Context context,
                               uint32_t sync_point,
                               MojoGLES2SignalSyncPointCallback callback,
                               void* closure) {
-  DCHECK(context);
-  GLES2Context* client = static_cast<GLES2Context*>(context);
-  client->SignalSyncPoint(sync_point, callback, closure);
+  gles2::ControlThunksImpl::Get()->SignalSyncPoint(context, sync_point,
+                                                   callback, closure);
 }
 
-#define VISIT_GL_CALL(Function, ReturnType, PARAMETERS, ARGUMENTS) \
-  ReturnType gl##Function PARAMETERS {                             \
-    DCHECK(g_gpu_interface.Get().Get());                           \
-    return g_gpu_interface.Get().Get()->Function ARGUMENTS;        \
+#define VISIT_GL_CALL(Function, ReturnType, PARAMETERS, ARGUMENTS)             \
+  ReturnType GL_APIENTRY gl##Function PARAMETERS {                             \
+    auto interface = gles2::ControlThunksImpl::Get()->CurrentGLES2Interface(); \
+    DCHECK(interface);                                                         \
+    return interface->Function ARGUMENTS;                                      \
   }
 #include "mojo/public/c/gles2/gles2_call_visitor_autogen.h"
+#include "mojo/public/c/gles2/gles2_call_visitor_chromium_bind_uniform_location_autogen.h"
+#include "mojo/public/c/gles2/gles2_call_visitor_chromium_map_sub_autogen.h"
 #include "mojo/public/c/gles2/gles2_call_visitor_chromium_miscellaneous_autogen.h"
 #include "mojo/public/c/gles2/gles2_call_visitor_chromium_resize_autogen.h"
-#include "mojo/public/c/gles2/gles2_call_visitor_chromium_sub_image_autogen.h"
 #include "mojo/public/c/gles2/gles2_call_visitor_chromium_sync_point_autogen.h"
 #include "mojo/public/c/gles2/gles2_call_visitor_chromium_texture_mailbox_autogen.h"
 #include "mojo/public/c/gles2/gles2_call_visitor_ext_debug_marker_autogen.h"
diff --git a/mojo/gles2/mgl_impl.cc b/mojo/gles2/mgl_impl.cc
new file mode 100644
index 0000000..95eb093
--- /dev/null
+++ b/mojo/gles2/mgl_impl.cc
@@ -0,0 +1,46 @@
+// 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.
+
+// This file implements the MGL and MGL onscreen entry points exposed to the
+// Mojo application by the shell.
+
+#include "mojo/gles2/control_thunks_impl.h"
+#include "mojo/public/c/gles2/gles2.h"
+#include "mojo/public/c/gpu/MGL/mgl.h"
+#include "mojo/public/c/gpu/MGL/mgl_onscreen.h"
+
+extern "C" {
+
+MGLContext MGLCreateContext(MGLOpenGLAPIVersion version,
+                            MojoHandle command_buffer_handle,
+                            MGLContext share_group,
+                            MGLContextLostCallback lost_callback,
+                            void* lost_callback_closure,
+                            const struct MojoAsyncWaiter* async_waiter) {
+  return gles2::ControlThunksImpl::Get()->CreateContext(
+      version, command_buffer_handle, share_group, lost_callback,
+      lost_callback_closure, async_waiter);
+}
+
+void MGLDestroyContext(MGLContext context) {
+  return gles2::ControlThunksImpl::Get()->DestroyContext(context);
+}
+
+void MGLMakeCurrent(MGLContext context) {
+  return gles2::ControlThunksImpl::Get()->MakeCurrent(context);
+}
+
+MGLContext MGLGetCurrentContext() {
+  return gles2::ControlThunksImpl::Get()->GetCurrentContext();
+}
+
+void MGLResizeSurface(uint32_t width, uint32_t height) {
+  return gles2::ControlThunksImpl::Get()->ResizeSurface(width, height);
+}
+
+void MGLSwapBuffers() {
+  return gles2::ControlThunksImpl::Get()->SwapBuffers();
+}
+
+}  // extern "C"
diff --git a/mojo/go/BUILD.gn b/mojo/go/BUILD.gn
deleted file mode 100644
index 9b3ef62..0000000
--- a/mojo/go/BUILD.gn
+++ /dev/null
@@ -1,92 +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.
-
-import("rules.gni")
-
-go_library("application") {
-  sources = [
-    "//mojo/public/go/application/application_impl.go",
-    "//mojo/public/go/application/connection.go",
-  ]
-  deps = [
-    ":bindings",
-    ":system",
-  ]
-}
-
-go_library("bindings") {
-  sources = [
-    "//mojo/public/go/bindings/async_waiter.go",
-    "//mojo/public/go/bindings/connector.go",
-    "//mojo/public/go/bindings/decoder.go",
-    "//mojo/public/go/bindings/encoder.go",
-    "//mojo/public/go/bindings/interface.go",
-    "//mojo/public/go/bindings/invalid_handle.go",
-    "//mojo/public/go/bindings/message.go",
-    "//mojo/public/go/bindings/router.go",
-    "//mojo/public/go/bindings/stub.go",
-    "//mojo/public/go/bindings/util.go",
-  ]
-  deps = [
-    ":system",
-  ]
-}
-
-go_library("system") {
-  sources = [
-    "//mojo/public/go/system/core.go",
-    "//mojo/public/go/system/data_pipe.go",
-    "//mojo/public/go/system/handle.go",
-    "//mojo/public/go/system/message_pipe.go",
-    "//mojo/public/go/system/mojo_types.go",
-    "//mojo/public/go/system/shared_buffer.go",
-    "//mojo/public/go/system/system.go",
-    "//mojo/public/go/system/system_android.go",
-    "//mojo/public/go/system/system_linux.go",
-    "//mojo/public/go/system/system_nacl.go",
-  ]
-}
-
-go_library("platform_cgo") {
-  sources = [
-    "//mojo/public/platform/native_cgo/system_cgo.go",
-  ]
-}
-
-if (is_linux) {
-  group("go") {
-    testonly = true
-    deps = [
-      ":system_test",
-    ]
-  }
-  go_test_binary("system_test") {
-    sources = [
-      "tests/application_impl_test.go",
-      "tests/async_waiter_test.go",
-      "tests/encoding_test.go",
-      "tests/interface_test.go",
-      "tests/message_test.go",
-      "tests/request_response_test.go",
-      "tests/router_test.go",
-      "tests/system_test.go",
-      "tests/testutil.go",
-      "tests/testutil_test.go",
-      "tests/union_test.go",
-      "tests/validation_test.go",
-    ]
-    static_library_sources = [
-      "c_embedder/c_embedder.cc",
-      "c_embedder/c_embedder.h",
-    ]
-    deps = [
-      ":application",
-      ":platform_cgo",
-      "//examples/echo",
-      "//mojo/edk/system",
-      "//mojo/public/interfaces/bindings/tests:test_interfaces",
-      "//mojo/public/interfaces/bindings/tests:test_interfaces_experimental",
-    ]
-  }
-}
diff --git a/mojo/go/c_embedder/c_embedder.cc b/mojo/go/c_embedder/c_embedder.cc
deleted file mode 100644
index c0fa111..0000000
--- a/mojo/go/c_embedder/c_embedder.cc
+++ /dev/null
@@ -1,19 +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.
-
-#include "mojo/go/c_embedder/c_embedder.h"
-
-#include "mojo/edk/embedder/test_embedder.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void InitializeMojoEmbedder() {
-  mojo::embedder::test::InitWithSimplePlatformSupport();
-}
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
diff --git a/mojo/go/c_embedder/c_embedder.h b/mojo/go/c_embedder/c_embedder.h
deleted file mode 100644
index f2961d6..0000000
--- a/mojo/go/c_embedder/c_embedder.h
+++ /dev/null
@@ -1,18 +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.
-
-#ifndef MOJO_GO_C_EMBEDDER_C_EMBEDDER_H_
-#define MOJO_GO_C_EMBEDDER_C_EMBEDDER_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-__attribute__((visibility("default"))) void InitializeMojoEmbedder();
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_GO_C_EMBEDDER_C_EMBEDDER_H__
diff --git a/mojo/go/go.py b/mojo/go/go.py
deleted file mode 100755
index a0f93f2..0000000
--- a/mojo/go/go.py
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 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.
-
-"""
-This script invokes the go build tool.
-Must be called as follows:
-python go.py [--android] <go-tool> <build directory> <output file>
-<src directory> <CGO_CFLAGS> <CGO_LDFLAGS> <go-binary options>
-eg.
-python go.py /usr/lib/google-golang/bin/go out/build out/a.out .. "-I."
-"-L. -ltest" test -c test/test.go
-"""
-
-import argparse
-import os
-import shutil
-import subprocess
-import sys
-
-NDK_PLATFORM = 'android-16'
-NDK_TOOLCHAIN = 'arm-linux-androideabi-4.9'
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--android', action='store_true')
-  parser.add_argument('go_tool')
-  parser.add_argument('build_directory')
-  parser.add_argument('output_file')
-  parser.add_argument('src_root')
-  parser.add_argument('out_root')
-  parser.add_argument('cgo_cflags')
-  parser.add_argument('cgo_ldflags')
-  parser.add_argument('go_option', nargs='*')
-  args = parser.parse_args()
-  go_tool = os.path.abspath(args.go_tool)
-  build_dir = args.build_directory
-  out_file = os.path.abspath(args.output_file)
-  # The src directory specified is relative. We need this as an absolute path.
-  src_root = os.path.abspath(args.src_root)
-  # GOPATH must be absolute, and point to one directory up from |src_Root|
-  go_path = os.path.abspath(os.path.join(src_root, '..'))
-  # GOPATH also includes any third_party/go libraries that have been imported
-  go_path += ':' +  os.path.join(src_root, 'third_party', 'go')
-  go_path += ':' +  os.path.abspath(os.path.join(args.out_root, 'gen', 'go'))
-  if 'MOJO_GOPATH' in os.environ:
-    go_path += ':' + os.environ['MOJO_GOPATH']
-  go_options = args.go_option
-  try:
-    shutil.rmtree(build_dir, True)
-    os.mkdir(build_dir)
-  except Exception:
-    pass
-  old_directory = os.getcwd()
-  os.chdir(build_dir)
-  env = os.environ.copy()
-  env['GOPATH'] = go_path
-  env['GOROOT'] = os.path.dirname(os.path.dirname(go_tool))
-  env['CGO_CFLAGS'] = args.cgo_cflags
-  env['CGO_LDFLAGS'] = args.cgo_ldflags
-  if args.android:
-    env['CGO_ENABLED'] = '1'
-    env['GOOS'] = 'android'
-    env['GOARCH'] = 'arm'
-    env['GOARM'] = '7'
-    # The Android go tool prebuilt binary has a default path to the compiler,
-    # which with high probability points to an invalid path, so we override the
-    # CC env var that will be used by the go tool.
-    if 'CC' not in env:
-      ndk_path = os.path.join(src_root, 'third_party', 'android_tools', 'ndk')
-      if sys.platform.startswith('linux'):
-        arch = 'linux-x86_64'
-      elif sys.platform == 'darwin':
-        arch = 'darwin-x86_64'
-      else:
-        raise Exception('unsupported platform: ' + sys.platform)
-      ndk_cc = os.path.join(ndk_path, 'toolchains', NDK_TOOLCHAIN,
-          'prebuilt', arch, 'bin', 'arm-linux-androideabi-gcc')
-      sysroot = os.path.join(ndk_path, 'platforms', NDK_PLATFORM, 'arch-arm')
-      env['CGO_CFLAGS'] += ' --sysroot %s' % sysroot
-      env['CGO_LDFLAGS'] += ' --sysroot %s' % sysroot
-      env['CC'] = '%s --sysroot %s' % (ndk_cc, sysroot)
-
-  call_result = subprocess.call([go_tool] + go_options, env=env)
-  if call_result != 0:
-    return call_result
-  out_files = sorted([ f for f in os.listdir('.') if os.path.isfile(f)])
-  if (len(out_files) > 0):
-    shutil.move(out_files[0], out_file)
-  os.chdir(old_directory)
-  try:
-    shutil.rmtree(build_dir, True)
-  except Exception:
-    pass
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/go/rules.gni b/mojo/go/rules.gni
deleted file mode 100644
index 60714f0..0000000
--- a/mojo/go/rules.gni
+++ /dev/null
@@ -1,156 +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.
-
-declare_args() {
-  # By default, there is no go build tool, because go builds are not supported.
-  go_build_tool = ""
-}
-
-# Declare a go library.
-#
-# The target only writes a time stamp for input sources as the build is manages
-# by the go tool.
-#
-# Variables:
-#   sources(required): list of .go files
-#   deps: dependencies for the go library
-
-template("go_library") {
-  action(target_name) {
-    sources = invoker.sources
-    script = "//mojo/go/stamp.py"
-    outputs = [
-      "${target_out_dir}/${target_name}.script.stamp",
-    ]
-    if (defined(invoker.deps)) {
-      deps = invoker.deps
-    }
-    args = [ rebase_path(target_out_dir, root_build_dir) +
-             "/${target_name}.script.stamp" ]
-  }
-}
-
-# Declare a go test binary target.
-#
-# The target generates a go test executable, linking against other C code,
-# which is compiled into a static library and linked against Go.
-#
-# Only works on linux. |go_build_tool| must be set to the absolute path
-# of the go build tool.
-#
-# Variables (all required)
-#   sources: list of .go files to compile
-#   static_library_sources: list of C sources needed for the static library
-#   deps: dependencies for the static library
-
-template("go_test_binary") {
-  # Only available on linux for now.
-  assert(is_linux)
-  assert(defined(invoker.sources))
-  assert(go_build_tool != "")
-
-  static_library_name = target_name + "_static_library"
-
-  static_library(static_library_name) {
-    testonly = true
-    sources = invoker.static_library_sources
-    deps = invoker.deps
-    complete_static_lib = true
-  }
-
-  action(target_name) {
-    testonly = true
-    deps = [
-      ":$static_library_name",
-    ]
-    script = "//mojo/go/go.py"
-    inputs = invoker.sources
-    outputs = [
-      "${target_out_dir}/${target_name}",
-    ]
-
-    # Since go test does not permit specifying an output directory or output
-    # binary name, we create a temporary build directory, and the python
-    # script will later identify the output, copy it to the target location,
-    # and clean up the temporary build directory.
-    build_dir = "${target_out_dir}/${target_name}_build"
-    args = [
-             "--",
-             "${go_build_tool}",
-             rebase_path(build_dir, root_build_dir),
-             rebase_path(target_out_dir, root_build_dir) + "/${target_name}",
-             rebase_path("//", root_build_dir),
-             rebase_path(root_out_dir, root_build_dir),
-             "-I" + rebase_path("//"),
-             "-L" + rebase_path(target_out_dir) + " -l" + static_library_name +
-                 " -lstdc++ -lpthread -lm -lglib-2.0 -lrt",
-             "test",
-             "-c",
-           ] + rebase_path(invoker.sources, build_dir)
-  }
-}
-
-template("go_mojo_application") {
-  assert(is_android || is_linux)
-  assert(defined(invoker.sources))
-  assert(go_build_tool != "")
-
-  static_library_name = target_name + "_static_library"
-  static_library(static_library_name) {
-    complete_static_lib = true
-    deps = [
-      "//mojo/public/platform/native:system",
-    ]
-  }
-
-  go_library_name = target_name + "_go"
-  action(go_library_name) {
-    deps = invoker.deps + [
-             ":${static_library_name}",
-             "//mojo/go:application",
-             "//mojo/go:platform_cgo",
-             "//mojo/public/c/system",
-           ]
-    script = "//mojo/go/go.py"
-    inputs = invoker.sources
-    outputs = [
-      "${target_out_dir}/${target_name}",
-    ]
-
-    # Since go test does not permit specifying an output directory or output
-    # binary name, we create a temporary build directory, and the python
-    # script will later identify the output, copy it to the target location,
-    # and clean up the temporary build directory.
-    build_dir = "${target_out_dir}/${target_name}_build"
-    args = []
-    if (is_android) {
-      args += [ "--android" ]
-    }
-    args += [
-      "--",
-      "${go_build_tool}",
-      rebase_path(build_dir, root_build_dir),
-      rebase_path(target_out_dir, root_build_dir) + "/${target_name}",
-      rebase_path("//", root_build_dir),
-      rebase_path(root_out_dir, root_build_dir),
-      "-I" + rebase_path("//"),
-      "-L" + rebase_path(target_out_dir) + " -l" + static_library_name + "",
-      "build",
-    ]
-    args += [ "-buildmode=c-shared" ]
-    args += rebase_path(invoker.sources, build_dir)
-  }
-
-  copy(target_name) {
-    deps = [
-      ":${go_library_name}",
-    ]
-    sources = [
-      "${target_out_dir}/${go_library_name}",
-    ]
-    outputs = [
-      "${root_out_dir}/${target_name}.mojo",
-    ]
-  }
-}
diff --git a/mojo/go/stamp.py b/mojo/go/stamp.py
deleted file mode 100644
index 78db987..0000000
--- a/mojo/go/stamp.py
+++ /dev/null
@@ -1,24 +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.
-
-"""
-This script writes a time stamp.
-Has one argument - time stamp file. Usage:
-python stamp.py path/to/file
-"""
-
-import sys
-
-def WriteStampFile(stamp_file):
-  with open(stamp_file, "w"):
-    pass
-
-
-def main(argv):
-  stamp_file = argv[1]
-  WriteStampFile(stamp_file)
-  return 0
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/mojo/go/system/embedder/embedder.go b/mojo/go/system/embedder/embedder.go
deleted file mode 100644
index c0e4aae..0000000
--- a/mojo/go/system/embedder/embedder.go
+++ /dev/null
@@ -1,14 +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.
-
-package embedder
-
-/*
-#include "mojo/go/c_embedder/c_embedder.h"
-*/
-import "C"
-
-func InitializeMojoEmbedder() {
-	C.InitializeMojoEmbedder()
-}
diff --git a/mojo/go/tests/README.txt b/mojo/go/tests/README.txt
deleted file mode 100644
index 6cdda94..0000000
--- a/mojo/go/tests/README.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-Instructions to run system_test (Linux-only)
-
-1) Follow instructions in src/README.md file
-
-2) Build
-$ mojo/tools/mojob.py gn
-$ mojo/tools/mojob.py build
-
-3) Run
-$ out/Debug/obj/mojo/go/system_test -test.v
diff --git a/mojo/go/tests/application_impl_test.go b/mojo/go/tests/application_impl_test.go
deleted file mode 100644
index b28c95f..0000000
--- a/mojo/go/tests/application_impl_test.go
+++ /dev/null
@@ -1,161 +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.
-
-package tests
-
-import (
-	"fmt"
-	"sync"
-	"testing"
-
-	"mojo/public/go/application"
-	"mojo/public/go/bindings"
-
-	"examples/echo/echo"
-	mojoApp "mojo/public/interfaces/application/application"
-	sp "mojo/public/interfaces/application/service_provider"
-	"mojo/public/interfaces/application/shell"
-)
-
-var urls = [2]string{"first.example.com", "second.example.com"}
-
-func pairedURL(url string) string {
-	switch url {
-	case urls[0]:
-		return urls[1]
-	case urls[1]:
-		return urls[0]
-	default:
-		panic(fmt.Sprintf("unexpected URL %v", url))
-	}
-}
-
-func checkEcho(echoPointer echo.Echo_Pointer) {
-	echo := echo.NewEchoProxy(echoPointer, bindings.GetAsyncWaiter())
-	str := fmt.Sprintf("Hello, world")
-	response, err := echo.EchoString(&str)
-	if err != nil {
-		panic(err)
-	}
-	if *response != str {
-		panic(fmt.Sprintf("invalid response: want %v, got %v", str, *response))
-	}
-	echo.Close_Proxy()
-}
-
-type EchoImpl struct{}
-
-func (echo *EchoImpl) EchoString(inValue *string) (outValue *string, err error) {
-	return inValue, nil
-}
-
-// EchoDelegate implements mojo application. In this test configuration we
-// have two instances of this implementation that talk to each other.
-type EchoDelegate struct {
-	Wg       *sync.WaitGroup
-	localURL string
-}
-
-func (delegate *EchoDelegate) Create(request echo.Echo_Request) {
-	stub := echo.NewEchoStub(request, &EchoImpl{}, bindings.GetAsyncWaiter())
-	go func() {
-		if err := stub.ServeRequest(); err != nil {
-			panic(err)
-		}
-		stub.Close()
-		delegate.Wg.Done()
-	}()
-}
-
-// Initialize connects to other instance, providing and asking for echo service.
-func (delegate *EchoDelegate) Initialize(ctx application.Context) {
-	if ctx.URL() != delegate.localURL {
-		panic(fmt.Sprintf("invalid URL: want %v, got %v", delegate.localURL, ctx.URL()))
-	}
-	if len(ctx.Args()) != 1 || ctx.Args()[0] != delegate.localURL {
-		panic(fmt.Sprintf("invalid args: want %v, got %v", []string{delegate.localURL}, ctx.Args()))
-	}
-	go func() {
-		echoRequest, echoPointer := echo.CreateMessagePipeForEcho()
-		conn := ctx.ConnectToApplication(pairedURL(delegate.localURL), &echo.Echo_ServiceFactory{delegate})
-		if conn.RequestorURL() != delegate.localURL {
-			panic(fmt.Sprintf("invalid requestor URL: want %v, got %v", delegate.localURL, conn.RequestorURL()))
-		}
-		if conn.ConnectionURL() != pairedURL(delegate.localURL) {
-			panic(fmt.Sprintf("invalid connection URL: want %v, got %v", pairedURL(delegate.localURL), conn.ConnectionURL()))
-		}
-		conn.ConnectToService(&echoRequest)
-		checkEcho(echoPointer)
-	}()
-}
-
-// AcceptConnection accepts incoming connection, providing and asking for echo
-// service.
-func (delegate *EchoDelegate) AcceptConnection(conn *application.Connection) {
-	if conn.RequestorURL() != pairedURL(delegate.localURL) {
-		panic(fmt.Sprintf("invalid requestor URL: want %v, got %v", pairedURL(delegate.localURL), conn.RequestorURL()))
-	}
-	if conn.ConnectionURL() != delegate.localURL {
-		panic(fmt.Sprintf("invalid connection URL: want %v, got %v", delegate.localURL, conn.ConnectionURL()))
-	}
-	echoRequest, echoPointer := echo.CreateMessagePipeForEcho()
-	conn.ProvideServices(&echo.Echo_ServiceFactory{delegate}).ConnectToService(&echoRequest)
-	checkEcho(echoPointer)
-}
-
-func (delegate *EchoDelegate) Quit() {}
-
-// shellImpl forward connection from local EchoDelegate instance to remote.
-type shellImpl struct {
-	remoteApp *mojoApp.Application_Proxy
-	localURL  string
-}
-
-func (s *shellImpl) ConnectToApplication(URL string, services *sp.ServiceProvider_Request, exposedServices *sp.ServiceProvider_Pointer) error {
-	if URL != pairedURL(s.localURL) {
-		return fmt.Errorf("invalid URL: want %v, got %v", pairedURL(s.localURL), URL)
-	}
-	s.remoteApp.AcceptConnection(s.localURL, services, exposedServices, pairedURL(s.localURL))
-	return nil
-}
-
-func TestApplication(t *testing.T) {
-	var apps []*mojoApp.Application_Proxy
-	var responsesSent, appsTerminated sync.WaitGroup
-	// Create and run applications.
-	for i := 0; i < 2; i++ {
-		request, pointer := mojoApp.CreateMessagePipeForApplication()
-		apps = append(apps, mojoApp.NewApplicationProxy(pointer, bindings.GetAsyncWaiter()))
-		// Each app instance provides echo service once when it creates
-		// a connection and once other instance creates a connection.
-		responsesSent.Add(2)
-		appsTerminated.Add(1)
-		delegate := &EchoDelegate{&responsesSent, urls[i]}
-		go func() {
-			application.Run(delegate, request.PassMessagePipe().ReleaseNativeHandle())
-			appsTerminated.Done()
-		}()
-	}
-	// Provide a shell for each application.
-	for i := 0; i < 2; i++ {
-		shellRequest, shellPointer := shell.CreateMessagePipeForShell()
-		shellStub := shell.NewShellStub(shellRequest, &shellImpl{apps[i^1], urls[i]}, bindings.GetAsyncWaiter())
-		go func() {
-			if err := shellStub.ServeRequest(); err != nil {
-				panic(err)
-			}
-			shellStub.Close()
-		}()
-		apps[i].Initialize(shellPointer, &[]string{urls[i]}, urls[i])
-	}
-	// Wait and then close pipes.
-	responsesSent.Wait()
-	for i := 0; i < 2; i++ {
-		apps[i].RequestQuit()
-	}
-	appsTerminated.Wait()
-	for i := 0; i < 2; i++ {
-		apps[i].Close_Proxy()
-	}
-}
diff --git a/mojo/go/tests/async_waiter_test.go b/mojo/go/tests/async_waiter_test.go
deleted file mode 100644
index 8f137f8..0000000
--- a/mojo/go/tests/async_waiter_test.go
+++ /dev/null
@@ -1,92 +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.
-
-package tests
-
-import (
-	"fmt"
-	"sync"
-	"testing"
-
-	"mojo/public/go/bindings"
-	"mojo/public/go/system"
-)
-
-func checkWait(handle system.Handle, signals system.MojoHandleSignals, expected system.MojoResult, wg *sync.WaitGroup) {
-	wg.Add(1)
-	responseChan := make(chan bindings.WaitResponse)
-	bindings.GetAsyncWaiter().AsyncWait(handle, signals, responseChan)
-	go func() {
-		response := <-responseChan
-		if expected != response.Result {
-			panic(fmt.Sprintf("unexpected wait result: expected %v, got %v", expected, response.Result))
-		}
-		wg.Done()
-	}()
-}
-
-func checkCancel(handle system.Handle, wg *sync.WaitGroup) {
-	wg.Add(1)
-	responseChan := make(chan bindings.WaitResponse)
-	id := waiter.AsyncWait(handle, system.MOJO_HANDLE_SIGNAL_READABLE, responseChan)
-	go func() {
-		waiter.CancelWait(id)
-		response := <-responseChan
-		if expected := system.MOJO_RESULT_ABORTED; expected != response.Result {
-			panic(fmt.Sprintf("unexpected wait result: expected %v, got %v", expected, response.Result))
-		}
-		wg.Done()
-	}()
-}
-
-func TestAsyncWait(t *testing.T) {
-	r, h0, h1 := core.CreateMessagePipe(nil)
-	defer h0.Close()
-	defer h1.Close()
-	if r != system.MOJO_RESULT_OK {
-		t.Fatalf("error creating a message pipe %v", r)
-	}
-	var wg sync.WaitGroup
-	h0.WriteMessage([]byte{0}, nil, system.MOJO_WRITE_MESSAGE_FLAG_NONE)
-	checkWait(h0, system.MOJO_HANDLE_SIGNAL_WRITABLE, system.MOJO_RESULT_OK, &wg)
-	checkWait(h1, system.MOJO_HANDLE_SIGNAL_READABLE, system.MOJO_RESULT_OK, &wg)
-
-	if r, h0, h1 = core.CreateMessagePipe(nil); r != system.MOJO_RESULT_OK {
-		t.Fatalf("error creating a message pipe %v", r)
-	}
-	defer h1.Close()
-	h0.Close()
-	checkWait(h0, system.MOJO_HANDLE_SIGNAL_PEER_CLOSED, system.MOJO_RESULT_INVALID_ARGUMENT, &wg)
-	checkWait(h1, system.MOJO_HANDLE_SIGNAL_PEER_CLOSED, system.MOJO_RESULT_OK, &wg)
-
-	if r, h0, h1 = core.CreateMessagePipe(nil); r != system.MOJO_RESULT_OK {
-		t.Fatalf("error creating a message pipe %v", r)
-	}
-	defer h1.Close()
-	h0.Close()
-	checkWait(h0, system.MOJO_HANDLE_SIGNAL_PEER_CLOSED, system.MOJO_RESULT_INVALID_ARGUMENT, &wg)
-	checkWait(h1, system.MOJO_HANDLE_SIGNAL_READABLE, system.MOJO_RESULT_FAILED_PRECONDITION, &wg)
-	wg.Wait()
-}
-
-func TestAsyncWaitCancel(t *testing.T) {
-	r, h0, h1 := core.CreateMessagePipe(nil)
-	defer h0.Close()
-	defer h1.Close()
-	if r != system.MOJO_RESULT_OK {
-		t.Fatalf("error creating a message pipe %v", r)
-	}
-	var wg sync.WaitGroup
-	checkCancel(h0, &wg)
-	checkCancel(h1, &wg)
-
-	if r, h0, h1 = core.CreateMessagePipe(nil); r != system.MOJO_RESULT_OK {
-		t.Fatalf("error creating a message pipe %v", r)
-	}
-	defer h0.Close()
-	defer h1.Close()
-	checkCancel(h0, &wg)
-	checkCancel(h1, &wg)
-	wg.Wait()
-}
diff --git a/mojo/go/tests/encoding_test.go b/mojo/go/tests/encoding_test.go
deleted file mode 100644
index 41a3355..0000000
--- a/mojo/go/tests/encoding_test.go
+++ /dev/null
@@ -1,196 +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.
-
-package tests
-
-import (
-	"reflect"
-	"testing"
-
-	"mojo/public/go/bindings"
-	"mojo/public/go/system"
-	"mojo/public/interfaces/bindings/tests/rect"
-	test "mojo/public/interfaces/bindings/tests/serialization_test_structs"
-	"mojo/public/interfaces/bindings/tests/test_structs"
-)
-
-func check(t *testing.T, value, zeroValue bindings.Payload) {
-	message, err := bindings.EncodeMessage(bindings.MessageHeader{}, value)
-	if err != nil {
-		t.Fatalf("error encoding value %v: %v", value, err)
-	}
-	decodedMessage, err := bindings.ParseMessage(message.Bytes, message.Handles)
-	if err != nil {
-		t.Fatalf("error decoding message header from bytes %v for tested value %v: %v", message.Bytes, value, err)
-	}
-	if err = decodedMessage.DecodePayload(zeroValue); err != nil {
-		t.Fatalf("error decoding message payload from bytes %v for tested value %v: %v", message.Payload, value, err)
-	}
-	if !reflect.DeepEqual(value, zeroValue) {
-		t.Fatalf("unexpected value after decoding: expected %v, got %v", value, zeroValue)
-	}
-}
-
-func TestSerializationTestStructs(t *testing.T) {
-	check(t, &test.Struct1{1}, &test.Struct1{})
-	check(t, &test.Struct2{&mockHandle{handle: 1}}, &test.Struct2{})
-	check(t, &test.Struct3{test.Struct1{2}}, &test.Struct3{})
-	check(t, &test.Struct4{[]test.Struct1{test.Struct1{1}, test.Struct1{2}}}, &test.Struct4{})
-	check(t, &test.Struct5{[2]test.Struct1{test.Struct1{1}, test.Struct1{2}}}, &test.Struct5{})
-	check(t, &test.Struct6{"hello, world!"}, &test.Struct6{})
-
-	check(t, &test.StructOfNullables{nil, nil, nil}, &test.StructOfNullables{})
-	handle := system.Handle(&mockHandle{handle: 1})
-	s := "hello, world"
-	check(t, &test.StructOfNullables{&handle, nil, nil}, &test.StructOfNullables{})
-	check(t, &test.StructOfNullables{&handle, &test.Struct1{3}, nil}, &test.StructOfNullables{})
-	check(t, &test.StructOfNullables{&handle, &test.Struct1{3}, &s}, &test.StructOfNullables{})
-	check(t, &test.StructOfNullables{&handle, nil, &s}, &test.StructOfNullables{})
-}
-
-func TestStructs(t *testing.T) {
-	s1 := "hello, world!"
-	s2 := "world, hello!"
-	handle := system.Handle(&mockHandle{handle: 1})
-	messagePipeHandle := system.MessagePipeHandle(&mockHandle{handle: 2})
-	consumerHandle := system.ConsumerHandle(&mockHandle{handle: 3})
-	producerHandle := system.ProducerHandle(&mockHandle{handle: 4})
-	sharedBufferHandle := system.SharedBufferHandle(&mockHandle{handle: 5})
-	value := bindings.Payload(&test_structs.NoDefaultFieldValues{
-		F0:  true,                        // bool
-		F1:  -2,                          // int8
-		F2:  3,                           // uint8
-		F3:  -4000,                       // int16
-		F4:  5000,                        // uint16
-		F5:  -6000000,                    // int32
-		F6:  7000000,                     // uint32
-		F7:  -8000000000000,              // int64
-		F8:  9000000000000,               // uint64
-		F9:  1e-45,                       // float
-		F10: -1e45,                       // double
-		F11: s1,                          // string
-		F12: &s2,                         // string?
-		F13: messagePipeHandle,           // handle<message_pipe>
-		F14: consumerHandle,              // handle<data_pipe_consumer>
-		F15: producerHandle,              // handle<data_pipe_producer>
-		F16: &messagePipeHandle,          // handle<message_pipe>?
-		F17: &consumerHandle,             // handle<data_pipe_consumer>?
-		F18: &producerHandle,             // handle<data_pipe_producer>?
-		F19: handle,                      // handle
-		F20: &handle,                     // handle?
-		F21: sharedBufferHandle,          // handle<shared_buffer>
-		F22: &sharedBufferHandle,         // handle<shared_buffer>?
-		F23: []string{s1, s2},            // array<string>
-		F24: []*string{&s1, &s2},         // array<string?>
-		F25: &[]string{s1, s2},           // array<string>?
-		F26: &[]*string{&s1, &s2},        // array<string?>?
-		F27: test_structs.EmptyStruct{},  // EmptyStruct
-		F28: &test_structs.EmptyStruct{}, // EmptyStruct?
-	})
-	check(t, value, &test_structs.NoDefaultFieldValues{})
-
-	value = &test_structs.ScopedConstants{
-		test_structs.ScopedConstants_EType_E0,
-		test_structs.ScopedConstants_EType_E1,
-		test_structs.ScopedConstants_EType_E2,
-		test_structs.ScopedConstants_EType_E3,
-		test_structs.ScopedConstants_EType_E4,
-		10,
-		25,
-	}
-	check(t, value, &test_structs.ScopedConstants{})
-
-	value = &test_structs.MapKeyTypes{
-		F0:  map[bool]bool{false: true, true: false},
-		F1:  map[int8]int8{15: -45, -42: 50},
-		F2:  map[uint8]uint8{15: 45, 42: 50},
-		F3:  map[int16]int16{-15: 45, -42: 50},
-		F4:  map[uint16]uint16{15: 45, 42: 50},
-		F5:  map[int32]int32{15: -45, 42: 50},
-		F6:  map[uint32]uint32{15: 45, 42: 50},
-		F7:  map[int64]int64{15: 45, 42: -50},
-		F8:  map[uint64]uint64{15: 45, 42: 50},
-		F9:  map[float32]float32{1.5: 2.5, 3.5: 1e-9},
-		F10: map[float64]float64{1.5: 2.5, 3.5: 1e-9},
-		F11: map[string]string{s1: s2, s2: s1},
-	}
-	check(t, value, &test_structs.MapKeyTypes{})
-
-	value = &test_structs.MapValueTypes{
-		F0: map[string][]string{
-			s1: []string{s1, s2},
-			s2: []string{s2, s1},
-		},
-		F1: map[string]*[]string{
-			s1: &[]string{s1, s2},
-			s2: &[]string{s2, s1},
-		},
-		F2: map[string][]*string{
-			s1: []*string{&s1, &s2},
-			s2: []*string{&s2, &s1},
-		},
-		F3: map[string][2]string{
-			s1: [2]string{s1, s2},
-			s2: [2]string{s2, s1},
-		},
-		F4: map[string][]*[2]string{
-			s1: []*[2]string{&[2]string{s1, s2}},
-			s2: []*[2]string{&[2]string{s1, s2}},
-		},
-		F5: map[string][1][2]string{
-			s1: [1][2]string{[2]string{s1, s2}},
-			s2: [1][2]string{[2]string{s1, s2}},
-		},
-		F6: map[string]*rect.Rect{
-			s1: &rect.Rect{},
-			s2: &rect.Rect{3, 4, 5, 6},
-		},
-		F7: map[string]map[string]string{
-			s1: map[string]string{s1: s1, s2: s2},
-			s2: map[string]string{s1: s2, s2: s1},
-		},
-		F8: map[string][]map[string]string{
-			s1: []map[string]string{
-				map[string]string{s1: s1, s2: s2},
-				map[string]string{s1: s2, s2: s1},
-			},
-			s2: []map[string]string{
-				map[string]string{s1: s1, s2: s2},
-				map[string]string{s1: s2, s2: s1},
-			},
-		},
-		F9: map[string]system.Handle{
-			s1: handle,
-			s2: handle,
-		},
-		F10: map[string][]system.Handle{
-			s1: []system.Handle{handle},
-			s2: []system.Handle{},
-		},
-		F11: map[string]map[string]system.Handle{
-			s1: map[string]system.Handle{s1: handle},
-			s2: map[string]system.Handle{s2: handle},
-		},
-  }
-	check(t, value, &test_structs.MapValueTypes{})
-
-	value = &test_structs.BitArrayValues{
-		F0: [1]bool{true},
-		F1: [7]bool{true, false, true, false, true, false, true},
-		F2: [9]bool{true, true, true, false, false, false, true, true, true},
-		F3: []bool{true, false, true, false},
-		F4: [][]bool{[]bool{true}},
-		F5: []*[]bool{
-			&[]bool{true, false, true},
-			&[]bool{false, true},
-		},
-		F6: []*[2]bool{
-			&[2]bool{false, false},
-			&[2]bool{false, true},
-			&[2]bool{true, false},
-			&[2]bool{true, true},
-		},
-	}
-	check(t, value, &test_structs.BitArrayValues{})
-}
diff --git a/mojo/go/tests/interface_test.go b/mojo/go/tests/interface_test.go
deleted file mode 100644
index a3f8f90..0000000
--- a/mojo/go/tests/interface_test.go
+++ /dev/null
@@ -1,25 +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.
-
-package tests
-
-import (
-	"testing"
-
-	"mojo/public/go/bindings"
-)
-
-func TestPassMessagePipe(t *testing.T) {
-	r, p := bindings.CreateMessagePipeForMojoInterface()
-	r1, p1 := r, p
-	handle := r1.PassMessagePipe()
-	defer handle.Close()
-	p1.Close()
-	rhandle, phandle := r.PassMessagePipe(), p.PassMessagePipe()
-	if rhandle.IsValid() || phandle.IsValid() {
-		t.Fatal("message pipes should be invalid after PassMessagePipe() or Close()")
-	}
-	rhandle.Close()
-	phandle.Close()
-}
diff --git a/mojo/go/tests/message_test.go b/mojo/go/tests/message_test.go
deleted file mode 100644
index 0b0d63e..0000000
--- a/mojo/go/tests/message_test.go
+++ /dev/null
@@ -1,45 +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.
-
-package tests
-
-import (
-	"testing"
-
-	"mojo/public/go/bindings"
-)
-
-func checkMessageEncoding(t *testing.T, header, payload bindings.MessageHeader) {
-	var encodedMessage, decodedMessage *bindings.Message
-	var err error
-	var decodedHeader, decodedPayload bindings.MessageHeader
-
-	if encodedMessage, err = bindings.EncodeMessage(header, &payload); err != nil {
-		t.Fatalf("Failed encoding message: %v", err)
-	}
-
-	if decodedMessage, err = bindings.ParseMessage(encodedMessage.Bytes, nil); err != nil {
-		t.Fatalf("Failed decoding message header: %v", err)
-	}
-	if decodedHeader = decodedMessage.Header; decodedHeader != header {
-		t.Fatalf("Unexpected header decoded: got %v, want %v", decodedHeader, header)
-	}
-	if err = decodedMessage.DecodePayload(&decodedPayload); err != nil {
-		t.Fatalf("Failed decoding message payload: %v", err)
-	}
-	if decodedPayload != payload {
-		t.Fatalf("Unexpected header with request id decoded: got %v, want %v", decodedPayload, payload)
-	}
-}
-
-// TestMessageHeader tests that headers are identical after being
-// encoded/decoded.
-func TestMessageHeader(t *testing.T) {
-	header := bindings.MessageHeader{2, 0, 0}
-	headerWithId := bindings.MessageHeader{1, 2, 3}
-	checkMessageEncoding(t, header, headerWithId)
-	checkMessageEncoding(t, headerWithId, header)
-	headerWithZeroId := bindings.MessageHeader{1, 2, 0}
-	checkMessageEncoding(t, headerWithZeroId, header)
-}
diff --git a/mojo/go/tests/request_response_test.go b/mojo/go/tests/request_response_test.go
deleted file mode 100644
index 0b79f69..0000000
--- a/mojo/go/tests/request_response_test.go
+++ /dev/null
@@ -1,78 +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.
-
-package tests
-
-import (
-	"testing"
-
-	"examples/echo/echo"
-	"mojo/public/go/bindings"
-	"mojo/public/go/system"
-)
-
-func TestProxyClosesPipe(t *testing.T) {
-	request, pointer := echo.CreateMessagePipeForEcho()
-	// Create a message with valid header and invalid payload and send it.
-	header := bindings.MessageHeader{0, bindings.MessageIsResponseFlag, 1}
-	message, err := bindings.EncodeMessage(header, &header)
-	if err != nil {
-		t.Fatalf("Error encoding message: %v", err)
-	}
-	requestPipe := request.PassMessagePipe()
-	if r := requestPipe.WriteMessage(message.Bytes, nil, system.MOJO_WRITE_MESSAGE_FLAG_NONE); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Can't send a message: %v", r)
-	}
-
-	// Make echo request with response (that is already sent).
-	echoProxy := echo.NewEchoProxy(pointer, waiter)
-	_, err = echoProxy.EchoString(bindings.StringPointer("hello, world"))
-	if err == nil {
-		t.Fatalf("Message is invalid, error expected")
-	}
-
-	// Wait for the pipe to be closed.
-	waitResponseChan := make(chan bindings.WaitResponse)
-	waiter.AsyncWait(requestPipe, system.MOJO_HANDLE_SIGNAL_PEER_CLOSED, waitResponseChan)
-	waitResponse := <-waitResponseChan
-	if waitResponse.Result != system.MOJO_RESULT_OK {
-		t.Fatalf("Error waiting on pipe to be closed: %v", waitResponse.Result)
-	}
-	requestPipe.Close()
-}
-
-type echoImpl struct{}
-
-func (impl *echoImpl) EchoString(in *string) (*string, error) {
-	return nil, nil
-}
-
-func TestStubClosesPipe(t *testing.T) {
-	request, pointer := echo.CreateMessagePipeForEcho()
-	// Create a message with valid header and invalid payload and send it.
-	header := bindings.MessageHeader{0, bindings.MessageIsResponseFlag, 1}
-	message, err := bindings.EncodeMessage(header, &header)
-	if err != nil {
-		t.Fatalf("Error encoding message: %v", err)
-	}
-	pointerPipe := pointer.PassMessagePipe()
-	if r := pointerPipe.WriteMessage(message.Bytes, nil, system.MOJO_WRITE_MESSAGE_FLAG_NONE); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Can't send a message: %v", r)
-	}
-
-	// Make echo request with response (that is already sent).
-	echoStub := echo.NewEchoStub(request, &echoImpl{}, waiter)
-	if err := echoStub.ServeRequest(); err == nil {
-		t.Fatalf("Message is invalid, error expected")
-	}
-
-	// Wait for the pipe to be closed.
-	waitResponseChan := make(chan bindings.WaitResponse)
-	waiter.AsyncWait(pointerPipe, system.MOJO_HANDLE_SIGNAL_PEER_CLOSED, waitResponseChan)
-	waitResponse := <-waitResponseChan
-	if waitResponse.Result != system.MOJO_RESULT_OK {
-		t.Fatalf("Error waiting on pipe to be closed: %v", waitResponse.Result)
-	}
-	pointerPipe.Close()
-}
diff --git a/mojo/go/tests/router_test.go b/mojo/go/tests/router_test.go
deleted file mode 100644
index ec8ebb3..0000000
--- a/mojo/go/tests/router_test.go
+++ /dev/null
@@ -1,148 +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.
-
-package tests
-
-import (
-	"regexp"
-	"sync"
-	"testing"
-
-	"mojo/public/go/bindings"
-	"mojo/public/go/system"
-)
-
-func expectError(t *testing.T, expected string, err error) {
-	if err == nil {
-		t.Fatalf("unexpected nil error, expected %v", expected)
-	}
-	if ok, _ := regexp.MatchString(expected, err.Error()); !ok {
-		t.Fatalf("unexpected error: expected %v, got %v", expected, err.Error())
-	}
-}
-
-func encodeMessage(header bindings.MessageHeader, payload bindings.Payload) *bindings.Message {
-	message, err := bindings.EncodeMessage(header, payload)
-	if err != nil {
-		panic(err)
-	}
-	return message
-}
-
-func TestAccept(t *testing.T) {
-	r, h0, h1 := core.CreateMessagePipe(nil)
-	defer h1.Close()
-	if r != system.MOJO_RESULT_OK {
-		t.Fatalf("can't create a message pipe: %v", r)
-	}
-	router := bindings.NewRouter(h0, bindings.GetAsyncWaiter())
-	header := bindings.MessageHeader{0, 0, 0}
-	if err := router.Accept(encodeMessage(header, &header)); err != nil {
-		t.Fatal(err)
-	}
-	header = bindings.MessageHeader{0, bindings.MessageExpectsResponseFlag, 1}
-	err := router.Accept(encodeMessage(header, &header))
-	expectError(t, "message header should have a zero request ID", err)
-	router.Close()
-}
-
-func TestAcceptWithResponse(t *testing.T) {
-	r, h0, h1 := core.CreateMessagePipe(nil)
-	defer h1.Close()
-	if r != system.MOJO_RESULT_OK {
-		t.Fatalf("can't create a message pipe: %v", r)
-	}
-	router := bindings.NewRouter(h0, bindings.GetAsyncWaiter())
-	header := bindings.MessageHeader{0, bindings.MessageIsResponseFlag, 1}
-	bindings.WriteMessage(h1, encodeMessage(header, &header))
-	header = bindings.MessageHeader{0, bindings.MessageExpectsResponseFlag, 1}
-	if result := <-router.AcceptWithResponse(encodeMessage(header, &header)); result.Error != nil {
-		t.Fatal(result.Error)
-	}
-	header = bindings.MessageHeader{0, 0, 0}
-	err := (<-router.AcceptWithResponse(encodeMessage(header, &header))).Error
-	expectError(t, "message header should have a request ID", err)
-	router.Close()
-}
-
-const numberOfRequests = 50
-
-func TestAcceptWithResponseMultiple(t *testing.T) {
-	r, h0, h1 := core.CreateMessagePipe(nil)
-	defer h1.Close()
-	if r != system.MOJO_RESULT_OK {
-		t.Fatalf("can't create a message pipe: %v", r)
-	}
-	router := bindings.NewRouter(h0, bindings.GetAsyncWaiter())
-	var wg sync.WaitGroup
-	wg.Add(numberOfRequests + 1)
-	// Serve requests.
-	go func() {
-		for i := 0; i < numberOfRequests; i++ {
-			c := make(chan bindings.WaitResponse, 1)
-			bindings.GetAsyncWaiter().AsyncWait(h1, system.MOJO_HANDLE_SIGNAL_READABLE, c)
-			r, bytes, handles := h1.ReadMessage(system.MOJO_READ_MESSAGE_FLAG_NONE)
-			if r != system.MOJO_RESULT_OK {
-				t.Fatalf("can't read from a message pipe: %v", r)
-			}
-			r = h1.WriteMessage(bytes, handles, system.MOJO_WRITE_MESSAGE_FLAG_NONE)
-			if r != system.MOJO_RESULT_OK {
-				t.Fatalf("can't write to a message pipe: %v", r)
-			}
-		}
-		wg.Done()
-	}()
-	// Send concurrent requests.
-	for i := 0; i < numberOfRequests; i++ {
-		go func(i int) {
-			header := bindings.MessageHeader{0, bindings.MessageExpectsResponseFlag, uint64(i + 1)}
-			err := (<-router.AcceptWithResponse(encodeMessage(header, &header))).Error
-			if err != nil {
-				panic(err)
-			}
-			wg.Done()
-		}(i)
-	}
-	wg.Wait()
-	router.Close()
-}
-
-func TestClose(t *testing.T) {
-	r, h0, h1 := core.CreateMessagePipe(nil)
-	defer h1.Close()
-	if r != system.MOJO_RESULT_OK {
-		t.Fatalf("can't create a message pipe: %v", r)
-	}
-	router := bindings.NewRouter(h0, bindings.GetAsyncWaiter())
-	var wg sync.WaitGroup
-	wg.Add(numberOfRequests*2 + 1)
-
-	// Send requests from the same go routine.
-	for i := 0; i < numberOfRequests; i++ {
-		header := bindings.MessageHeader{0, bindings.MessageExpectsResponseFlag, uint64(i + 1)}
-		c := router.AcceptWithResponse(encodeMessage(header, &header))
-		go func() {
-			if err := (<-c).Error; err == nil {
-				panic("unexpected nil error")
-			}
-			wg.Done()
-		}()
-	}
-	// Send requests from different go routines.
-	for i := 0; i < numberOfRequests; i++ {
-		go func(i int) {
-			header := bindings.MessageHeader{0, bindings.MessageExpectsResponseFlag, uint64(i + 1)}
-			err := (<-router.AcceptWithResponse(encodeMessage(header, &header))).Error
-			if err == nil {
-				panic("unexpected nil error")
-			}
-			wg.Done()
-		}(i + numberOfRequests)
-	}
-	go func() {
-		router.Close()
-		wg.Done()
-	}()
-	wg.Wait()
-}
diff --git a/mojo/go/tests/system_test.go b/mojo/go/tests/system_test.go
deleted file mode 100644
index 77b80fe..0000000
--- a/mojo/go/tests/system_test.go
+++ /dev/null
@@ -1,302 +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.
-
-package tests
-
-import (
-	"bytes"
-	"testing"
-
-	"mojo/public/go/system"
-)
-
-const (
-	MOJO_HANDLE_SIGNAL_READWRITABLE = system.MojoHandleSignals(system.MOJO_HANDLE_SIGNAL_READABLE |
-		system.MOJO_HANDLE_SIGNAL_WRITABLE)
-	MOJO_HANDLE_SIGNAL_ALL = system.MojoHandleSignals(system.MOJO_HANDLE_SIGNAL_READABLE |
-		system.MOJO_HANDLE_SIGNAL_WRITABLE |
-		system.MOJO_HANDLE_SIGNAL_PEER_CLOSED)
-)
-
-func TestGetTimeTicksNow(t *testing.T) {
-	x := core.GetTimeTicksNow()
-	if x < 10 {
-		t.Error("Invalid GetTimeTicksNow return value")
-	}
-}
-
-func TestHandle(t *testing.T) {
-	var handle system.SharedBufferHandle
-	var r system.MojoResult
-
-	if r, handle = core.CreateSharedBuffer(nil, 1); r != system.MOJO_RESULT_OK {
-		t.Fatalf("CreateSharedBuffer failed:%v", r)
-	}
-	if !handle.IsValid() {
-		t.Fatalf("CreateSharedBuffer returned invalid handle:%v", handle)
-	}
-	duplicate := handle
-	if duplicate.NativeHandle() != handle.NativeHandle() {
-		t.Fatalf("duplicate(%v) and handle(%v) point to different handles", duplicate.NativeHandle(), handle.NativeHandle())
-	}
-	releasedHandle := handle.ReleaseNativeHandle()
-	if duplicate.IsValid() || handle.IsValid() {
-		t.Fatalf("duplicate(%v) and handle(%v) should be invalid after releasing native handle", duplicate.NativeHandle(), handle.NativeHandle())
-	}
-	handle = core.AcquireNativeHandle(releasedHandle).ToSharedBufferHandle()
-	if handle.NativeHandle() != releasedHandle || !handle.IsValid() {
-		t.Fatalf("handle(%v) should be valid after AcquireNativeHandle", handle.NativeHandle())
-	}
-	untypedHandle := handle.ToUntypedHandle()
-	if handle.IsValid() {
-		t.Fatalf("handle(%v) should be invalid after call ToUntypedHandle", handle.NativeHandle())
-	}
-	handle = untypedHandle.ToSharedBufferHandle()
-	if untypedHandle.IsValid() {
-		t.Fatalf("untypedHandle(%v) should be invalid after call ToSharedBufferHandle", untypedHandle.NativeHandle())
-	}
-	if handle.NativeHandle() != releasedHandle {
-		t.Fatalf("handle(%v) should be wrapping %v", handle.NativeHandle(), releasedHandle)
-	}
-	if r = handle.Close(); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Close on handle failed:%v", r)
-	}
-}
-
-func TestMessagePipe(t *testing.T) {
-	var h0, h1 system.MessagePipeHandle
-	var r system.MojoResult
-	var state system.MojoHandleSignalsState
-
-	if r, h0, h1 = core.CreateMessagePipe(nil); r != system.MOJO_RESULT_OK {
-		t.Fatalf("CreateMessagePipe failed:%v", r)
-	}
-	if !h0.IsValid() || !h1.IsValid() {
-		t.Fatalf("CreateMessagePipe returned invalid handles h0:%v h1:%v", h0, h1)
-	}
-
-	r, state = h0.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, 0)
-	if r != system.MOJO_RESULT_DEADLINE_EXCEEDED {
-		t.Fatalf("h0 should not be readable:%v", r)
-	}
-	if state.SatisfiedSignals != system.MOJO_HANDLE_SIGNAL_WRITABLE {
-		t.Fatalf("state should be not be signaled readable after CreateMessagePipe:%v", state.SatisfiedSignals)
-	}
-	if state.SatisfiableSignals != MOJO_HANDLE_SIGNAL_ALL {
-		t.Fatalf("state should allow all signals after CreateMessagePipe:%v", state.SatisfiableSignals)
-	}
-
-	r, state = h0.Wait(system.MOJO_HANDLE_SIGNAL_WRITABLE, system.MOJO_DEADLINE_INDEFINITE)
-	if r != system.MOJO_RESULT_OK {
-		t.Fatalf("h0 should be writable:%v", r)
-	}
-	if state.SatisfiedSignals != system.MOJO_HANDLE_SIGNAL_WRITABLE {
-		t.Fatalf("state should be signaled writable after core.Wait:%v", state.SatisfiedSignals)
-	}
-	if state.SatisfiableSignals != MOJO_HANDLE_SIGNAL_ALL {
-		t.Fatalf("state should allow all signals after core.Wait:%v", state.SatisfiableSignals)
-	}
-
-	if r, _, _ = h0.ReadMessage(system.MOJO_READ_MESSAGE_FLAG_NONE); r != system.MOJO_RESULT_SHOULD_WAIT {
-		t.Fatalf("Read on h0 did not return wait:%v", r)
-	}
-	kHello := []byte("hello")
-	if r = h1.WriteMessage(kHello, nil, system.MOJO_WRITE_MESSAGE_FLAG_NONE); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Failed WriteMessage on h1:%v", r)
-	}
-
-	r, state = h0.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, system.MOJO_DEADLINE_INDEFINITE)
-	if r != system.MOJO_RESULT_OK {
-		t.Fatalf("h0 should be readable after WriteMessage to h1:%v", r)
-	}
-	if state.SatisfiedSignals != MOJO_HANDLE_SIGNAL_READWRITABLE {
-		t.Fatalf("h0 should be signaled readable after WriteMessage to h1:%v", state.SatisfiedSignals)
-	}
-	if state.SatisfiableSignals != MOJO_HANDLE_SIGNAL_ALL {
-		t.Fatalf("h0 should be readable/writable after WriteMessage to h1:%v", state.SatisfiableSignals)
-	}
-	if !state.SatisfiableSignals.IsReadable() || !state.SatisfiableSignals.IsWritable() || !state.SatisfiableSignals.IsClosed() {
-		t.Fatalf("Helper functions are misbehaving")
-	}
-
-	r, msg, _ := h0.ReadMessage(system.MOJO_READ_MESSAGE_FLAG_NONE)
-	if r != system.MOJO_RESULT_OK {
-		t.Fatalf("Failed ReadMessage on h0:%v", r)
-	}
-	if !bytes.Equal(msg, kHello) {
-		t.Fatalf("Invalid message expected:%s, got:%s", kHello, msg)
-	}
-
-	r, index, states := core.WaitMany([]system.Handle{h0}, []system.MojoHandleSignals{system.MOJO_HANDLE_SIGNAL_READABLE}, 10)
-	if r != system.MOJO_RESULT_DEADLINE_EXCEEDED {
-		t.Fatalf("h0 should not be readable after reading message:%v", r)
-	}
-	if index != -1 {
-		t.Fatalf("should be no index after MOJO_RESULT_DEADLINE_EXCEEDED:%v", index)
-	}
-	if len(states) != 1 {
-		t.Fatalf("states should be set after WaitMany:%v", states)
-	}
-	if states[0].SatisfiedSignals != system.MOJO_HANDLE_SIGNAL_WRITABLE {
-		t.Fatalf("h0 should be signaled readable WaitMany:%v", states[0].SatisfiedSignals)
-	}
-	if states[0].SatisfiableSignals != MOJO_HANDLE_SIGNAL_ALL {
-		t.Fatalf("h0 should be readable/writable after WaitMany:%v", states[0].SatisfiableSignals)
-	}
-
-	if r = h0.Close(); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Close on h0 failed:%v", r)
-	}
-
-	r, state = h1.Wait(MOJO_HANDLE_SIGNAL_READWRITABLE, system.MOJO_DEADLINE_INDEFINITE)
-	if r != system.MOJO_RESULT_FAILED_PRECONDITION {
-		t.Fatalf("h1 should not be readable/writable after Close(h0):%v", r)
-	}
-	if state.SatisfiedSignals != system.MOJO_HANDLE_SIGNAL_PEER_CLOSED {
-		t.Fatalf("state should be signaled closed after Close(h0):%v", state.SatisfiedSignals)
-	}
-	if state.SatisfiableSignals != system.MOJO_HANDLE_SIGNAL_PEER_CLOSED {
-		t.Fatalf("state should only be closable after Close(h0):%v", state.SatisfiableSignals)
-	}
-
-	if r = h1.Close(); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Close on h1 failed:%v", r)
-	}
-}
-
-func TestDataPipe(t *testing.T) {
-	var hp system.ProducerHandle
-	var hc system.ConsumerHandle
-	var r system.MojoResult
-
-	if r, hp, hc = core.CreateDataPipe(nil); r != system.MOJO_RESULT_OK {
-		t.Fatalf("CreateDataPipe failed:%v", r)
-	}
-	if !hp.IsValid() || !hc.IsValid() {
-		t.Fatalf("CreateDataPipe returned invalid handles hp:%v hc:%v", hp, hc)
-	}
-	if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, 0); r != system.MOJO_RESULT_DEADLINE_EXCEEDED {
-		t.Fatalf("hc should not be readable:%v", r)
-	}
-	if r, _ = hp.Wait(system.MOJO_HANDLE_SIGNAL_WRITABLE, system.MOJO_DEADLINE_INDEFINITE); r != system.MOJO_RESULT_OK {
-		t.Fatalf("hp should be writeable:%v", r)
-	}
-
-	// Test one-phase read/write.
-	// Writing.
-	kHello := []byte("hello")
-	r, numBytes := hp.WriteData(kHello, system.MOJO_WRITE_DATA_FLAG_NONE)
-	if r != system.MOJO_RESULT_OK || numBytes != len(kHello) {
-		t.Fatalf("Failed WriteData on hp:%v numBytes:%d", r, numBytes)
-	}
-	// Reading.
-	if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, system.MOJO_DEADLINE_INDEFINITE); r != system.MOJO_RESULT_OK {
-		t.Fatalf("hc should be readable after WriteData on hp:%v", r)
-	}
-	r, data := hc.ReadData(system.MOJO_READ_DATA_FLAG_NONE)
-	if r != system.MOJO_RESULT_OK {
-		t.Fatalf("Failed ReadData on hc:%v", r)
-	}
-	if !bytes.Equal(data, kHello) {
-		t.Fatalf("Invalid data expected:%s, got:%s", kHello, data)
-	}
-
-	// Test two-phase read/write.
-	// Writing.
-	kHello = []byte("Hello, world!")
-	r, buf := hp.BeginWriteData(len(kHello), system.MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)
-	if r != system.MOJO_RESULT_OK {
-		t.Fatalf("Failed BeginWriteData on hp:%v numBytes:%d", r, len(kHello))
-	}
-	if len(buf) < len(kHello) {
-		t.Fatalf("Buffer size(%d) should be at least %d", len(buf), len(kHello))
-	}
-	copy(buf, kHello)
-	if r, _ := hp.WriteData(kHello, system.MOJO_WRITE_DATA_FLAG_NONE); r != system.MOJO_RESULT_BUSY {
-		t.Fatalf("hp should be busy during a two-phase write: %v", r)
-	}
-	if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, 0); r != system.MOJO_RESULT_DEADLINE_EXCEEDED {
-		t.Fatalf("hc shouldn't be readable before EndWriteData on hp:%v", r)
-	}
-	if r := hp.EndWriteData(len(kHello)); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Failed EndWriteData on hp:%v", r)
-	}
-	// Reading.
-	if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, system.MOJO_DEADLINE_INDEFINITE); r != system.MOJO_RESULT_OK {
-		t.Fatalf("hc should be readable after EndWriteData on hp:%v", r)
-	}
-	if r, buf = hc.BeginReadData(len(kHello), system.MOJO_READ_DATA_FLAG_ALL_OR_NONE); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Failed BeginReadData on hc:%v numBytes:%d", r, len(kHello))
-	}
-	if len(buf) != len(kHello) {
-		t.Fatalf("Buffer size(%d) should be equal to %d", len(buf), len(kHello))
-	}
-	if r, _ := hc.ReadData(system.MOJO_READ_DATA_FLAG_NONE); r != system.MOJO_RESULT_BUSY {
-		t.Fatalf("hc should be busy during a two-phase read: %v", r)
-	}
-	if !bytes.Equal(buf, kHello) {
-		t.Fatalf("Invalid data expected:%s, got:%s", kHello, buf)
-	}
-	if r := hc.EndReadData(len(buf)); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Failed EndReadData on hc:%v", r)
-	}
-
-	if r = hp.Close(); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Close on hp failed:%v", r)
-	}
-	if r, _ = hc.Wait(system.MOJO_HANDLE_SIGNAL_READABLE, system.MOJO_DEADLINE_INDEFINITE); r != system.MOJO_RESULT_FAILED_PRECONDITION {
-		t.Fatalf("hc should not be readable after hp closed:%v", r)
-	}
-	if r = hc.Close(); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Close on hc failed:%v", r)
-	}
-}
-
-func TestSharedBuffer(t *testing.T) {
-	var h0, h1 system.SharedBufferHandle
-	var buf []byte
-	var r system.MojoResult
-
-	if r, h0 = core.CreateSharedBuffer(nil, 100); r != system.MOJO_RESULT_OK {
-		t.Fatalf("CreateSharedBuffer failed:%v", r)
-	}
-	if !h0.IsValid() {
-		t.Fatalf("CreateSharedBuffer returned an invalid handle h0:%v", h0)
-	}
-	if r, buf = h0.MapBuffer(0, 100, system.MOJO_MAP_BUFFER_FLAG_NONE); r != system.MOJO_RESULT_OK {
-		t.Fatalf("MapBuffer failed to map buffer with h0:%v", r)
-	}
-	if len(buf) != 100 || cap(buf) != 100 {
-		t.Fatalf("Buffer length(%d) and capacity(%d) should be %d", len(buf), cap(buf), 100)
-	}
-	buf[50] = 'x'
-	if r, h1 = h0.DuplicateBufferHandle(nil); r != system.MOJO_RESULT_OK {
-		t.Fatalf("DuplicateBufferHandle of h0 failed:%v", r)
-	}
-	if !h1.IsValid() {
-		t.Fatalf("DuplicateBufferHandle returned an invalid handle h1:%v", h1)
-	}
-	if r = h0.Close(); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Close on h0 failed:%v", r)
-	}
-	buf[51] = 'y'
-	if r = h1.UnmapBuffer(buf); r != system.MOJO_RESULT_OK {
-		t.Fatalf("UnmapBuffer failed:%v", r)
-	}
-	if r, buf = h1.MapBuffer(50, 50, system.MOJO_MAP_BUFFER_FLAG_NONE); r != system.MOJO_RESULT_OK {
-		t.Fatalf("MapBuffer failed to map buffer with h1:%v", r)
-	}
-	if len(buf) != 50 || cap(buf) != 50 {
-		t.Fatalf("Buffer length(%d) and capacity(%d) should be %d", len(buf), cap(buf), 50)
-	}
-	if buf[0] != 'x' || buf[1] != 'y' {
-		t.Fatalf("Failed to validate shared buffer. expected:x,y got:%s,%s", buf[0], buf[1])
-	}
-	if r = h1.UnmapBuffer(buf); r != system.MOJO_RESULT_OK {
-		t.Fatalf("UnmapBuffer failed:%v", r)
-	}
-	if r = h1.Close(); r != system.MOJO_RESULT_OK {
-		t.Fatalf("Close on h1 failed:%v", r)
-	}
-}
diff --git a/mojo/go/tests/testutil.go b/mojo/go/tests/testutil.go
deleted file mode 100644
index 99d33f7..0000000
--- a/mojo/go/tests/testutil.go
+++ /dev/null
@@ -1,203 +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.
-
-package tests
-
-import (
-	"encoding/binary"
-	"fmt"
-	"math"
-	"strings"
-
-	"mojo/go/system/embedder"
-	"mojo/public/go/bindings"
-	"mojo/public/go/system"
-)
-
-var core system.Core
-var waiter bindings.AsyncWaiter
-
-func init() {
-	embedder.InitializeMojoEmbedder()
-	core = system.GetCore()
-	waiter = bindings.GetAsyncWaiter()
-}
-
-type mockHandle struct {
-	bindings.InvalidHandle
-	handle system.MojoHandle
-}
-
-func (h *mockHandle) IsValid() bool {
-	return true
-}
-
-func (h *mockHandle) ReleaseNativeHandle() system.MojoHandle {
-	return h.handle
-}
-
-func (h *mockHandle) ToUntypedHandle() system.UntypedHandle {
-	return h
-}
-
-func (h *mockHandle) ToConsumerHandle() system.ConsumerHandle {
-	return h
-}
-
-func (h *mockHandle) ToProducerHandle() system.ProducerHandle {
-	return h
-}
-
-func (h *mockHandle) ToMessagePipeHandle() system.MessagePipeHandle {
-	return h
-}
-
-func (h *mockHandle) ToSharedBufferHandle() system.SharedBufferHandle {
-	return h
-}
-
-// inputParser parses validation tests input format as described in
-// |mojo/public/cpp/bindings/tests/validation_test_input_parser.h|
-type inputParser struct {
-}
-
-type dataItem struct {
-	Type  string
-	Value string
-}
-
-type pointerPlaceholder struct {
-	Position int
-	Size     int
-}
-
-func (p *inputParser) parseToDataItems(s string) []dataItem {
-	var items []dataItem
-	s = strings.TrimSpace(s)
-	for len(s) > 0 {
-		// Parsing data item type.
-		var itemType string
-		if s[0] == '[' {
-			closeBracket := strings.Index(s, "]")
-			if closeBracket == -1 {
-				panic("unmatched left [")
-			}
-			itemType = strings.TrimSpace(s[1:closeBracket])
-			s = strings.TrimSpace(s[closeBracket+1:])
-		} else {
-			itemType = "u1"
-		}
-
-		// Parsing data item value.
-		itemEnd := strings.IndexAny(s, "[ \t\n\r")
-		if itemEnd == -1 {
-			items = append(items, dataItem{itemType, strings.TrimSpace(s)})
-			s = ""
-		} else {
-			items = append(items, dataItem{itemType, strings.TrimSpace(s[:itemEnd])})
-			s = strings.TrimSpace(s[itemEnd:])
-		}
-	}
-	return items
-}
-
-// Parse parses a validation tests input string that has no comments.
-// Panics if input has errors.
-func (p *inputParser) Parse(s string) ([]byte, []system.UntypedHandle) {
-	var bytes []byte
-	var buf [8]byte
-	// We need non-nil slice for comparing values with reflect.DeepEqual.
-	handles := []system.UntypedHandle{}
-	pointers := make(map[string]pointerPlaceholder)
-	for _, item := range p.parseToDataItems(s) {
-		switch item.Type {
-		case "u1":
-			var value uint8
-			fmt.Sscan(item.Value, &value)
-			bytes = append(bytes, byte(value))
-		case "u2":
-			var value uint16
-			fmt.Sscan(item.Value, &value)
-			binary.LittleEndian.PutUint16(buf[:2], value)
-			bytes = append(bytes, buf[:2]...)
-		case "u4":
-			var value uint32
-			fmt.Sscan(item.Value, &value)
-			binary.LittleEndian.PutUint32(buf[:4], value)
-			bytes = append(bytes, buf[:4]...)
-		case "u8":
-			var value uint64
-			fmt.Sscan(item.Value, &value)
-			binary.LittleEndian.PutUint64(buf[:8], value)
-			bytes = append(bytes, buf[:8]...)
-		case "s1":
-			var value int8
-			fmt.Sscan(item.Value, &value)
-			bytes = append(bytes, byte(value))
-		case "s2":
-			var value int16
-			fmt.Sscan(item.Value, &value)
-			binary.LittleEndian.PutUint16(buf[:2], uint16(value))
-			bytes = append(bytes, buf[:2]...)
-		case "s4":
-			var value int32
-			fmt.Sscan(item.Value, &value)
-			binary.LittleEndian.PutUint32(buf[:4], uint32(value))
-			bytes = append(bytes, buf[:4]...)
-		case "s8":
-			var value int64
-			fmt.Sscan(item.Value, &value)
-			binary.LittleEndian.PutUint64(buf[:8], uint64(value))
-			bytes = append(bytes, buf[:8]...)
-		case "b":
-			var value byte
-			for i := 0; i < 8; i++ {
-				value <<= 1
-				if item.Value[i] == '1' {
-					value++
-				}
-			}
-			bytes = append(bytes, value)
-		case "f":
-			var value float32
-			fmt.Sscan(item.Value, &value)
-			binary.LittleEndian.PutUint32(buf[:4], math.Float32bits(value))
-			bytes = append(bytes, buf[:4]...)
-		case "d":
-			var value float64
-			fmt.Sscan(item.Value, &value)
-			binary.LittleEndian.PutUint64(buf[:8], math.Float64bits(value))
-			bytes = append(bytes, buf[:8]...)
-		case "dist4":
-			pointers[item.Value] = pointerPlaceholder{len(bytes), 4}
-			bytes = append(bytes, buf[:4]...)
-		case "dist8":
-			pointers[item.Value] = pointerPlaceholder{len(bytes), 8}
-			bytes = append(bytes, buf[:8]...)
-		case "anchr":
-			placeholder := pointers[item.Value]
-			dist := len(bytes) - placeholder.Position
-			switch placeholder.Size {
-			case 4:
-				binary.LittleEndian.PutUint32(bytes[placeholder.Position:], uint32(dist))
-			case 8:
-				binary.LittleEndian.PutUint64(bytes[placeholder.Position:], uint64(dist))
-			}
-			delete(pointers, item.Value)
-		case "handles":
-			var value int
-			fmt.Sscan(item.Value, &value)
-			handles = make([]system.UntypedHandle, value)
-			for i, _ := range handles {
-				handles[i] = &mockHandle{handle: system.MojoHandle(i + 1)}
-			}
-		default:
-			panic(fmt.Sprintf("unsupported item type: %v", item.Type))
-		}
-	}
-	if len(pointers) != 0 {
-		panic(fmt.Sprintf("unmatched pointers: %v", pointers))
-	}
-	return bytes, handles
-}
diff --git a/mojo/go/tests/testutil_test.go b/mojo/go/tests/testutil_test.go
deleted file mode 100644
index 36c0e7c..0000000
--- a/mojo/go/tests/testutil_test.go
+++ /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.
-
-package tests
-
-import (
-	"bytes"
-	"encoding/binary"
-	"math"
-	"testing"
-)
-
-func verifyInputParser(t *testing.T, s string, expected []byte, handlesCount int) {
-	parser := &inputParser{}
-	b, h := parser.Parse(s)
-	if !bytes.Equal(b, expected) {
-		t.Fatalf("unexpected byte slice after parsing %v: expected %v, got %v", s, expected, b)
-	}
-	if len(h) != handlesCount {
-		t.Fatalf("unexpected handles count after parsing %v: expected %v, got %v", s, handlesCount, len(h))
-	}
-}
-
-func TestInputParser(t *testing.T) {
-	var buf []byte
-	buf = make([]byte, 1+2+4+8+1+1)
-	buf[0] = 0x10
-	binary.LittleEndian.PutUint16(buf[1:], 65535)
-	binary.LittleEndian.PutUint32(buf[3:], 65536)
-	binary.LittleEndian.PutUint64(buf[7:], 0xFFFFFFFFFFFFFFFF)
-	buf[15] = 0
-	buf[16] = 0xFF
-	verifyInputParser(t, "[u1]0x10 [u2]65535 [u4]65536 [u8]0xFFFFFFFFFFFFFFFF 0 0Xff", buf, 0)
-
-	buf = make([]byte, 8+1+2+4)
-	binary.LittleEndian.PutUint64(buf[0:], math.MaxUint64-0x800+1)
-	buf[8] = math.MaxUint8 - 128 + 1
-	binary.LittleEndian.PutUint16(buf[9:], 0)
-	binary.LittleEndian.PutUint32(buf[11:], math.MaxUint32-40+1)
-	verifyInputParser(t, "[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40", buf, 0)
-
-	buf = make([]byte, 1+1+1)
-	buf[0] = 11
-	buf[1] = 0x80
-	buf[2] = 0
-	verifyInputParser(t, "[b]00001011 [b]10000000  \r [b]00000000", buf, 0)
-
-	buf = make([]byte, 4+8)
-	binary.LittleEndian.PutUint32(buf[0:], math.Float32bits(+.3e9))
-	binary.LittleEndian.PutUint64(buf[4:], math.Float64bits(-10.03))
-	verifyInputParser(t, "[f]+.3e9 [d]-10.03", buf, 0)
-
-	buf = make([]byte, 4+1+8+1)
-	binary.LittleEndian.PutUint32(buf[0:], 14)
-	buf[4] = 0
-	binary.LittleEndian.PutUint64(buf[5:], 9)
-	buf[13] = 0
-	verifyInputParser(t, "[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar", buf, 0)
-
-	buf = make([]byte, 8)
-	binary.LittleEndian.PutUint64(buf[0:], 2)
-	verifyInputParser(t, "[handles]50 [u8]2", buf, 50)
-}
diff --git a/mojo/go/tests/union_test.go b/mojo/go/tests/union_test.go
deleted file mode 100644
index 9e8847c..0000000
--- a/mojo/go/tests/union_test.go
+++ /dev/null
@@ -1,184 +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.
-
-package tests
-
-import (
-	"testing"
-
-	"mojo/public/go/bindings"
-	"mojo/public/go/system"
-	"mojo/public/interfaces/bindings/tests/test_unions"
-)
-
-type Encodable interface {
-	Encode(encoder *bindings.Encoder) error
-}
-
-func TestPodUnion(t *testing.T) {
-	tests := []test_unions.PodUnion{
-		&test_unions.PodUnionFInt8{8},
-		&test_unions.PodUnionFInt16{16},
-		&test_unions.PodUnionFUint64{64},
-		&test_unions.PodUnionFBool{true},
-		&test_unions.PodUnionFEnum{test_unions.AnEnum_Second},
-	}
-
-	for _, union := range tests {
-		var wrapper, zeroWrapper test_unions.WrapperStruct
-		wrapper.PodUnion = union
-		check(t, &wrapper, &zeroWrapper)
-	}
-}
-
-func TestHandleUnion(t *testing.T) {
-	tests := []test_unions.HandleUnion{
-		&test_unions.HandleUnionFHandle{system.Handle(&mockHandle{handle: 1})},
-		&test_unions.HandleUnionFMessagePipe{system.MessagePipeHandle(&mockHandle{handle: 2})},
-		&test_unions.HandleUnionFDataPipeConsumer{system.ConsumerHandle(&mockHandle{handle: 3})},
-		&test_unions.HandleUnionFDataPipeProducer{system.ProducerHandle(&mockHandle{handle: 4})},
-		&test_unions.HandleUnionFSharedBuffer{system.SharedBufferHandle(&mockHandle{handle: 5})},
-	}
-
-	for _, union := range tests {
-		var wrapper, zeroWrapper test_unions.WrapperStruct
-		wrapper.HandleUnion = union
-		check(t, &wrapper, &zeroWrapper)
-	}
-}
-
-func TestObjectUnion(t *testing.T) {
-	tests := []test_unions.ObjectUnion{
-		&test_unions.ObjectUnionFDummy{test_unions.DummyStruct{10}},
-		&test_unions.ObjectUnionFArrayInt8{[]int8{1, 2, 3, 4}},
-		&test_unions.ObjectUnionFMapInt8{map[string]int8{"hello": 1, "world": 2}},
-		&test_unions.ObjectUnionFNullable{},
-		&test_unions.ObjectUnionFPodUnion{&test_unions.PodUnionFInt8{8}},
-		&test_unions.ObjectUnionFPodUnion{&test_unions.PodUnionFInt64{64}},
-		&test_unions.ObjectUnionFPodUnion{&test_unions.PodUnionFBool{true}},
-		&test_unions.ObjectUnionFPodUnion{&test_unions.PodUnionFEnum{test_unions.AnEnum_Second}},
-	}
-
-	for _, union := range tests {
-		var wrapper, zeroWrapper test_unions.WrapperStruct
-		wrapper.ObjectUnion = union
-		check(t, &wrapper, &zeroWrapper)
-	}
-}
-
-func encode(t *testing.T, value Encodable) ([]byte, []system.UntypedHandle, error) {
-	encoder := bindings.NewEncoder()
-	err := value.Encode(encoder)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	bytes, handles, err := encoder.Data()
-	if err != nil {
-		return nil, nil, err
-	}
-
-	return bytes, handles, nil
-}
-
-func TestNonNullableNullInUnion(t *testing.T) {
-	var wrapper test_unions.WrapperStruct
-	fdummy := test_unions.ObjectUnionFDummy{test_unions.DummyStruct{10}}
-	wrapper.ObjectUnion = &fdummy
-
-	bytes, handles, _ := encode(t, &wrapper)
-	bytes[16] = 0
-
-	var decoded test_unions.WrapperStruct
-	decoder := bindings.NewDecoder(bytes, handles)
-
-	if err := decoded.Decode(decoder); err == nil {
-		t.Fatalf("Null non-nullable should have failed validation.")
-	}
-}
-
-func TestUnionInStruct(t *testing.T) {
-	var ss, out test_unions.SmallStruct
-	ss.PodUnion = &test_unions.PodUnionFInt8{10}
-	check(t, &ss, &out)
-
-	bytes, _, _ := encode(t, &ss)
-	if int(bytes[8*2]) != 16 {
-		t.Fatalf("Union does not start at the correct location in struct.")
-	}
-}
-
-func TestUnionInArray(t *testing.T) {
-	var ss, out test_unions.SmallStruct
-	ss.PodUnionArray = &[]test_unions.PodUnion{
-		&test_unions.PodUnionFInt8{8},
-		&test_unions.PodUnionFInt16{16},
-		&test_unions.PodUnionFUint64{64},
-		&test_unions.PodUnionFBool{true},
-		&test_unions.PodUnionFEnum{test_unions.AnEnum_Second},
-	}
-	check(t, &ss, &out)
-}
-
-func TestUnionInArrayNullNullable(t *testing.T) {
-	var ss, out test_unions.SmallStruct
-	ss.NullablePodUnionArray = &[]test_unions.PodUnion{
-		nil,
-		&test_unions.PodUnionFInt8{8},
-		&test_unions.PodUnionFInt16{16},
-		&test_unions.PodUnionFUint64{64},
-		&test_unions.PodUnionFBool{true},
-		&test_unions.PodUnionFEnum{test_unions.AnEnum_Second},
-	}
-	check(t, &ss, &out)
-}
-
-func TestUnionInArrayNonNullableNull(t *testing.T) {
-	// Encoding should fail
-	var ss test_unions.SmallStruct
-	ss.PodUnionArray = &[]test_unions.PodUnion{
-		nil,
-		&test_unions.PodUnionFInt8{8},
-		&test_unions.PodUnionFInt16{16},
-		&test_unions.PodUnionFUint64{64},
-		&test_unions.PodUnionFBool{true},
-		&test_unions.PodUnionFEnum{test_unions.AnEnum_Second},
-	}
-
-	_, _, err := encode(t, &ss)
-	if typedErr := err.(*bindings.ValidationError); typedErr.ErrorCode != bindings.UnexpectedNullUnion {
-		t.Fatalf("Non-nullable null should have failed to encode.")
-	}
-
-	// Decoding should also fail
-	ss.PodUnionArray = &[]test_unions.PodUnion{
-		&test_unions.PodUnionFInt8{8},
-		&test_unions.PodUnionFInt16{16},
-		&test_unions.PodUnionFUint64{64},
-		&test_unions.PodUnionFBool{true},
-		&test_unions.PodUnionFEnum{test_unions.AnEnum_Second},
-	}
-	bytes, handles, _ := encode(t, &ss)
-
-	// Set first union to null.
-	bytes[8*10] = 0
-	var decoded test_unions.SmallStruct
-	decoder := bindings.NewDecoder(bytes, handles)
-	err = decoded.Decode(decoder)
-	if typedErr := err.(*bindings.ValidationError); typedErr.ErrorCode != bindings.UnexpectedNullUnion {
-		t.Fatalf("Null non-nullable should have failed to decode.")
-	}
-}
-
-func TestUnionInMap(t *testing.T) {
-	var ss, out test_unions.SmallStruct
-	ss.PodUnionMap = &map[string]test_unions.PodUnion{
-		"eight":      &test_unions.PodUnionFInt8{8},
-		"sixteen":    &test_unions.PodUnionFInt16{16},
-		"sixty-four": &test_unions.PodUnionFUint64{64},
-		"bool":       &test_unions.PodUnionFBool{true},
-		"enum":       &test_unions.PodUnionFEnum{test_unions.AnEnum_Second},
-	}
-	check(t, &ss, &out)
-}
diff --git a/mojo/go/tests/validation_test.go b/mojo/go/tests/validation_test.go
deleted file mode 100644
index b3120e0..0000000
--- a/mojo/go/tests/validation_test.go
+++ /dev/null
@@ -1,453 +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.
-
-package tests
-
-import (
-	"fmt"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"reflect"
-	"strings"
-	"testing"
-
-	"mojo/public/go/bindings"
-	"mojo/public/go/system"
-	test "mojo/public/interfaces/bindings/tests/validation_test_interfaces"
-)
-
-func getTestPath(name string) string {
-	// TODO(rogulenko): try to get a better solution.
-	// This should be .../out/name{Debug|Release}/obj/mojo/go.
-	dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
-	if err != nil {
-		panic(err)
-	}
-	// Go 5 folders up.
-	for i := 0; i < 5; i++ {
-		dir = filepath.Dir(dir)
-	}
-	testsFolder := filepath.Join("mojo", "public", "interfaces", "bindings", "tests", "data", "validation")
-	if name != "" {
-		return filepath.Join(dir, testsFolder, name)
-	} else {
-		return filepath.Join(dir, testsFolder)
-	}
-}
-
-func listTestFiles() []string {
-	files, err := ioutil.ReadDir(getTestPath(""))
-	if err != nil {
-		panic(err)
-	}
-	var fileNames []string
-	for _, file := range files {
-		if file.Mode().IsRegular() {
-			fileNames = append(fileNames, file.Name())
-		}
-	}
-	return fileNames
-}
-
-func getMatchingTests(fileNames []string, prefix string) []string {
-	var result []string
-	extension := ".data"
-	for _, fileName := range fileNames {
-		if strings.HasPrefix(fileName, prefix) && strings.HasSuffix(fileName, extension) {
-			result = append(result, strings.TrimSuffix(fileName, extension))
-		}
-	}
-	if len(result) == 0 {
-		panic("empty test list")
-	}
-	return result
-}
-
-func readTest(testName string) ([]byte, []system.UntypedHandle) {
-	content, err := ioutil.ReadFile(getTestPath(testName + ".data"))
-	if err != nil {
-		panic(err)
-	}
-	lines := strings.Split(strings.Replace(string(content), "\r", "\n", -1), "\n")
-	for i, _ := range lines {
-		lines[i] = strings.Split(lines[i], "//")[0]
-	}
-	parser := &inputParser{}
-	bytes, handles := parser.Parse(strings.Join(lines, " "))
-	return bytes, handles
-}
-
-func readAnswer(testName string) string {
-	content, err := ioutil.ReadFile(getTestPath(testName + ".expected"))
-	if err != nil {
-		panic(err)
-	}
-	return strings.TrimSpace(string(content))
-}
-
-func pipeOwner(h system.MessagePipeHandle) bindings.MessagePipeHandleOwner {
-	return bindings.NewMessagePipeHandleOwner(h)
-}
-
-type rawMessage struct {
-	Bytes   []byte
-	Handles []system.UntypedHandle
-}
-
-type mockMessagePipeHandle struct {
-	bindings.InvalidHandle
-	messages chan rawMessage
-}
-
-func NewMockMessagePipeHandle() *mockMessagePipeHandle {
-	h := &mockMessagePipeHandle{}
-	h.messages = make(chan rawMessage, 10)
-	return h
-}
-
-func (h *mockMessagePipeHandle) reset() {
-	h.messages = make(chan rawMessage, 10)
-}
-
-func (h *mockMessagePipeHandle) IsValid() bool {
-	return true
-}
-
-func (h *mockMessagePipeHandle) ToUntypedHandle() system.UntypedHandle {
-	return h
-}
-
-func (h *mockMessagePipeHandle) ToMessagePipeHandle() system.MessagePipeHandle {
-	return h
-}
-
-func (h *mockMessagePipeHandle) ReadMessage(flags system.MojoReadMessageFlags) (system.MojoResult, []byte, []system.UntypedHandle) {
-	message := <-h.messages
-	return system.MOJO_RESULT_OK, message.Bytes, message.Handles
-}
-
-func (h *mockMessagePipeHandle) WriteMessage(bytes []byte, handles []system.UntypedHandle, flags system.MojoWriteMessageFlags) system.MojoResult {
-	h.messages <- rawMessage{bytes, handles}
-	return system.MOJO_RESULT_OK
-}
-
-type conformanceValidator struct {
-	CheckArgs bool
-	Proxy     test.ConformanceTestInterface
-}
-
-func (v *conformanceValidator) Method0(inParam0 float32) error {
-	if !v.CheckArgs {
-		return nil
-	}
-	param0 := float32(-1)
-	if inParam0 != param0 {
-		return fmt.Errorf("unexpected value (Method0, inParam0): expected %v, got %v", param0, inParam0)
-	}
-	return v.Proxy.Method0(inParam0)
-}
-
-func (v *conformanceValidator) Method1(inParam0 test.StructA) error {
-	if !v.CheckArgs {
-		return nil
-	}
-	param0 := test.StructA{1234}
-	if !reflect.DeepEqual(inParam0, param0) {
-		return fmt.Errorf("unexpected value (Method1, inParam0): expected %v, got %v", param0, inParam0)
-	}
-	return v.Proxy.Method1(inParam0)
-}
-
-func (v *conformanceValidator) Method2(inParam0 test.StructB, inParam1 test.StructA) error {
-	if !v.CheckArgs {
-		return nil
-	}
-	param0 := test.StructB{test.StructA{12345}}
-	param1 := test.StructA{67890}
-	if !reflect.DeepEqual(inParam0, param0) {
-		return fmt.Errorf("unexpected value (Method2, inParam0): expected %v, got %v", param0, inParam0)
-	}
-	if !reflect.DeepEqual(inParam1, param1) {
-		return fmt.Errorf("unexpected value (Method2, inParam1): expected %v, got %v", param1, inParam1)
-	}
-	return v.Proxy.Method2(inParam0, inParam1)
-}
-
-func (v *conformanceValidator) Method3(inParam0 []bool) error {
-	if !v.CheckArgs {
-		return nil
-	}
-	param0 := []bool{true, false, true, false, true, false, true, false, true, true, true, true}
-	if !reflect.DeepEqual(inParam0, param0) {
-		return fmt.Errorf("unexpected value (Method3, inParam0): expected %v, got %v", param0, inParam0)
-	}
-	return v.Proxy.Method3(inParam0)
-}
-
-func (v *conformanceValidator) Method4(inParam0 test.StructC, inParam1 []uint8) error {
-	if !v.CheckArgs {
-		return nil
-	}
-	param0 := test.StructC{[]uint8{0, 1, 2}}
-	param1 := []uint8{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
-	if !reflect.DeepEqual(inParam0, param0) {
-		return fmt.Errorf("unexpected value (Method4, inParam0): expected %v, got %v", param0, inParam0)
-	}
-	if !reflect.DeepEqual(inParam1, param1) {
-		return fmt.Errorf("unexpected value (Method4, inParam1): expected %v, got %v", param1, inParam1)
-	}
-	return v.Proxy.Method4(inParam0, inParam1)
-}
-
-func (v *conformanceValidator) Method5(inParam0 test.StructE, inParam1 system.ProducerHandle) error {
-	if !v.CheckArgs {
-		return nil
-	}
-	param0 := test.StructE{
-		test.StructD{[]system.MessagePipeHandle{
-			&mockHandle{handle: 1},
-			&mockHandle{handle: 2},
-		}},
-		&mockHandle{handle: 4},
-	}
-	param1 := &mockHandle{handle: 5}
-	if !reflect.DeepEqual(inParam0, param0) {
-		return fmt.Errorf("unexpected value (Method5, inParam0): expected %v, got %v", param0, inParam0)
-	}
-	if !reflect.DeepEqual(inParam1, param1) {
-		return fmt.Errorf("unexpected value (Method5, inParam1): expected %v, got %v", param1, inParam1)
-	}
-	return v.Proxy.Method5(inParam0, inParam1)
-}
-
-func (v *conformanceValidator) Method6(inParam0 [][]uint8) error {
-	if !v.CheckArgs {
-		return nil
-	}
-	param0 := [][]uint8{[]uint8{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}
-	if !reflect.DeepEqual(inParam0, param0) {
-		return fmt.Errorf("unexpected value (Method6, inParam0): expected %v, got %v", param0, inParam0)
-	}
-	return v.Proxy.Method6(inParam0)
-}
-
-func (v *conformanceValidator) Method7(inParam0 test.StructF, inParam1 [2]*[3]uint8) error {
-	if !v.CheckArgs {
-		return nil
-	}
-	param0 := test.StructF{[3]uint8{0, 1, 2}}
-	param1 := [2]*[3]uint8{
-		nil,
-		&[3]uint8{0, 1, 2},
-	}
-	if !reflect.DeepEqual(inParam0, param0) {
-		return fmt.Errorf("unexpected value (Method7, inParam0): expected %v, got %v", param0, inParam0)
-	}
-	if !reflect.DeepEqual(inParam1, param1) {
-		return fmt.Errorf("unexpected value (Method7, inParam1): expected %v, got %v", param1, inParam1)
-	}
-	return v.Proxy.Method7(inParam0, inParam1)
-}
-
-func (v *conformanceValidator) Method8(inParam0 []*[]string) error {
-	if !v.CheckArgs {
-		return nil
-	}
-	param0 := []*[]string{
-		nil,
-		&[]string{string([]byte{0, 1, 2, 3, 4})},
-		nil,
-	}
-	if !reflect.DeepEqual(inParam0, param0) {
-		return fmt.Errorf("unexpected value (Method8, inParam0): expected %v, got %v", param0, inParam0)
-	}
-	return v.Proxy.Method8(inParam0)
-}
-
-func (v *conformanceValidator) Method9(inParam0 *[][]*system.Handle) error {
-	if !v.CheckArgs {
-		return nil
-	}
-	handles := []system.Handle{
-		&mockHandle{handle: 1},
-		&mockHandle{handle: 3},
-		&mockHandle{handle: 4},
-	}
-	param0 := &[][]*system.Handle{
-		[]*system.Handle{&handles[0], nil},
-		[]*system.Handle{&handles[1], nil, &handles[2]},
-	}
-	if !reflect.DeepEqual(inParam0, param0) {
-		return fmt.Errorf("unexpected value (Method9, inParam0): expected %v, got %v", param0, inParam0)
-	}
-	return v.Proxy.Method9(inParam0)
-}
-
-func (v *conformanceValidator) Method10(inParam0 map[string]uint8) error {
-	if !v.CheckArgs {
-		return nil
-	}
-	param0 := map[string]uint8{
-		string([]byte{0, 1, 2, 3, 4}): 1,
-		string([]byte{5, 6, 7, 8, 9}): 2,
-	}
-	if !reflect.DeepEqual(inParam0, param0) {
-		return fmt.Errorf("unexpected value (Method10, inParam0): expected %v, got %v", param0, inParam0)
-	}
-	return v.Proxy.Method10(inParam0)
-}
-
-func (v *conformanceValidator) Method11(test.StructG) error {
-	return nil
-}
-
-func (v *conformanceValidator) Method12(float32) (float32, error) {
-	return 0, nil
-}
-
-func (v *conformanceValidator) Method13(*test.InterfaceA_Pointer, uint32, *test.InterfaceA_Pointer) error {
-	return nil
-}
-
-func verifyValidationError(t *testing.T, test string, err error, answer string) {
-	if (err == nil) != (answer == "PASS") {
-		t.Fatalf("unexpected result for test %v: %v", test, err)
-	}
-	if answer != "PASS" {
-		validationError, ok := err.(*bindings.ValidationError)
-		if !ok {
-			t.Fatalf("can't convert err '%v' to ValidationError in test %v", err, test)
-		}
-		code := validationError.ErrorCode
-		if code != answer {
-			t.Fatalf("unexpected error code in test %v: got %v(%v), want %v", test, code, err, answer)
-		}
-	}
-}
-
-func TestConformanceValidation(t *testing.T) {
-	tests := getMatchingTests(listTestFiles(), "conformance_")
-
-	h := NewMockMessagePipeHandle()
-	proxyIn, proxyOut := h, h
-	interfacePointer := test.ConformanceTestInterface_Pointer{pipeOwner(proxyIn)}
-	impl := &conformanceValidator{false, test.NewConformanceTestInterfaceProxy(interfacePointer, waiter)}
-
-	h = NewMockMessagePipeHandle()
-	stubIn, stubOut := h, h
-	interfaceRequest := test.ConformanceTestInterface_Request{pipeOwner(stubOut)}
-	stub := test.NewConformanceTestInterfaceStub(interfaceRequest, impl, waiter)
-	for _, test := range tests {
-		bytes, handles := readTest(test)
-		answer := readAnswer(test)
-		impl.CheckArgs = strings.HasSuffix(test, "_good")
-		stubIn.WriteMessage(bytes, handles, system.MOJO_WRITE_MESSAGE_FLAG_NONE)
-		err := stub.ServeRequest()
-		verifyValidationError(t, test, err, answer)
-
-		if !impl.CheckArgs {
-			continue
-		}
-		// Decode again to verify correctness of encoding.
-		_, bytes, handles = proxyOut.ReadMessage(system.MOJO_READ_MESSAGE_FLAG_NONE)
-		stubIn.WriteMessage(bytes, handles, system.MOJO_WRITE_MESSAGE_FLAG_NONE)
-		if err := stub.ServeRequest(); err != nil {
-			t.Fatalf("error processing encoded data for test %v: %v", test, err)
-		}
-		proxyOut.ReadMessage(system.MOJO_READ_MESSAGE_FLAG_NONE)
-		// Do not compare encoded bytes, as some tests contain maps, that
-		// can be encoded randomly.
-	}
-}
-
-func runTests(t *testing.T, prefix string, in *mockMessagePipeHandle, check func() error) {
-	tests := getMatchingTests(listTestFiles(), prefix)
-	for _, test := range tests {
-		bytes, handles := readTest(test)
-		answer := readAnswer(test)
-		// Replace request ID to match proxy numbers.
-		if bytes[0] == 24 {
-			bytes[16] = 1
-		}
-		in.WriteMessage(bytes, handles, system.MOJO_WRITE_MESSAGE_FLAG_NONE)
-		verifyValidationError(t, test, check(), answer)
-	}
-}
-
-type integrationStubImpl struct{}
-
-func (s *integrationStubImpl) Method0(test.BasicStruct) ([]uint8, error) {
-	return nil, nil
-}
-
-func TestIntegrationTests(t *testing.T) {
-	h := NewMockMessagePipeHandle()
-	checkStub := func() error {
-		interfaceRequest := test.IntegrationTestInterface_Request{pipeOwner(h)}
-		stub := test.NewIntegrationTestInterfaceStub(interfaceRequest, &integrationStubImpl{}, waiter)
-		err := stub.ServeRequest()
-		stub.Close()
-		h.reset()
-		return err
-	}
-	runTests(t, "integration_intf_rqst_", h, checkStub)
-	runTests(t, "integration_msghdr_", h, checkStub)
-
-	checkProxy := func() error {
-		interfacePointer := test.IntegrationTestInterface_Pointer{pipeOwner(h)}
-		proxy := test.NewIntegrationTestInterfaceProxy(interfacePointer, waiter)
-		_, err := proxy.Method0(test.BasicStruct{})
-		proxy.Close_Proxy()
-		h.reset()
-		return err
-	}
-	runTests(t, "integration_intf_resp_", h, checkProxy)
-	runTests(t, "integration_msghdr_", h, checkProxy)
-}
-
-type boundsCheckStubImpl struct{}
-
-func (s *boundsCheckStubImpl) Method0(uint8) (uint8, error) {
-	return 0, nil
-}
-
-func (s *boundsCheckStubImpl) Method1(uint8) error {
-	return nil
-}
-
-func TestBoundsCheck(t *testing.T) {
-	h := NewMockMessagePipeHandle()
-	checkStub := func() error {
-		interfaceRequest := test.BoundsCheckTestInterface_Request{pipeOwner(h)}
-		stub := test.NewBoundsCheckTestInterfaceStub(interfaceRequest, &boundsCheckStubImpl{}, waiter)
-		err := stub.ServeRequest()
-		stub.Close()
-		return err
-	}
-	runTests(t, "boundscheck_", h, checkStub)
-
-	checkProxy := func() error {
-		interfacePointer := test.BoundsCheckTestInterface_Pointer{pipeOwner(h)}
-		proxy := test.NewBoundsCheckTestInterfaceProxy(interfacePointer, waiter)
-		_, err := proxy.Method0(0)
-		proxy.Close_Proxy()
-		h.reset()
-		return err
-	}
-	runTests(t, "resp_boundscheck_", h, checkProxy)
-}
-
-func TestConformanceResponse(t *testing.T) {
-	h := NewMockMessagePipeHandle()
-	checkProxy := func() error {
-		interfacePointer := test.ConformanceTestInterface_Pointer{pipeOwner(h)}
-		proxy := test.NewConformanceTestInterfaceProxy(interfacePointer, waiter)
-		_, err := proxy.Method12(0)
-		proxy.Close_Proxy()
-		h.reset()
-		return err
-	}
-	runTests(t, "resp_conformance_", h, checkProxy)
-}
diff --git a/mojo/gpu/BUILD.gn b/mojo/gpu/BUILD.gn
index fb0e4d8..44faf91 100644
--- a/mojo/gpu/BUILD.gn
+++ b/mojo/gpu/BUILD.gn
@@ -28,6 +28,7 @@
     "//gpu/command_buffer/common",
     "//mojo/environment:chromium",
     "//mojo/public/c/gles2",
+    "//mojo/public/c/gpu:gpu_onscreen",
     "//mojo/public/c/system",
     "//mojo/public/cpp/application",
     "//mojo/public/cpp/bindings",
diff --git a/mojo/gpu/gl_context.cc b/mojo/gpu/gl_context.cc
index 73941d6..3b4830a 100644
--- a/mojo/gpu/gl_context.cc
+++ b/mojo/gpu/gl_context.cc
@@ -7,6 +7,7 @@
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/interfaces/application/shell.mojom.h"
 #include "mojo/services/gpu/public/interfaces/gpu.mojom.h"
+#include "mojo/gpu/mojo_gles2_impl_autogen.h"
 
 namespace mojo {
 
@@ -24,8 +25,7 @@
   context_ = MojoGLES2CreateContext(
       command_buffer.PassInterface().PassHandle().release().value(),
       &ContextLostThunk, this, Environment::GetDefaultAsyncWaiter());
-  gl_ = static_cast<gpu::gles2::GLES2Interface*>(
-      MojoGLES2GetGLES2Interface(context_));
+  gl_impl_.reset(new MojoGLES2Impl(context_));
 }
 
 GLContext::~GLContext() {
@@ -44,6 +44,10 @@
   delete this;
 }
 
+gpu::gles2::GLES2Interface* GLContext::gl() const {
+  return gl_impl_.get();
+}
+
 void GLContext::AddObserver(Observer* observer) {
   observers_.AddObserver(observer);
 }
diff --git a/mojo/gpu/gl_context.h b/mojo/gpu/gl_context.h
index 79ef518..9c5eb3a 100644
--- a/mojo/gpu/gl_context.h
+++ b/mojo/gpu/gl_context.h
@@ -17,6 +17,7 @@
 }
 
 namespace mojo {
+class MojoGLES2Impl;
 class Shell;
 
 class GLContext {
@@ -34,7 +35,7 @@
   void MakeCurrent();
   void Destroy();
 
-  gpu::gles2::GLES2Interface* gl() const { return gl_; }
+  gpu::gles2::GLES2Interface* gl() const;
 
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
@@ -47,7 +48,7 @@
   void OnContextLost();
 
   MojoGLES2Context context_;
-  gpu::gles2::GLES2Interface* gl_;
+  scoped_ptr<MojoGLES2Impl> gl_impl_;
 
   base::ObserverList<Observer> observers_;
   base::WeakPtrFactory<GLContext> weak_factory_;
diff --git a/mojo/gpu/mojo_gles2_impl_autogen.cc b/mojo/gpu/mojo_gles2_impl_autogen.cc
index a716a4d..fb55202 100644
--- a/mojo/gpu/mojo_gles2_impl_autogen.cc
+++ b/mojo/gpu/mojo_gles2_impl_autogen.cc
@@ -11,9 +11,16 @@
 #include "mojo/gpu/mojo_gles2_impl_autogen.h"
 
 #include "base/logging.h"
+#include "mojo/public/c/gles2/chromium_bind_uniform_location.h"
+#include "mojo/public/c/gles2/chromium_map_sub.h"
+#include "mojo/public/c/gles2/chromium_miscellaneous.h"
 #include "mojo/public/c/gles2/chromium_sync_point.h"
 #include "mojo/public/c/gles2/chromium_texture_mailbox.h"
+#include "mojo/public/c/gles2/ext_debug_marker.h"
 #include "mojo/public/c/gles2/gles2.h"
+#include "mojo/public/c/gles2/occlusion_query_ext.h"
+#include "mojo/public/c/gles2/oes_vertex_array_object.h"
+#include "mojo/public/c/gpu/MGL/mgl_onscreen.h"
 
 namespace mojo {
 
@@ -771,8 +778,8 @@
   NOTREACHED() << "Unimplemented ShallowFinishCHROMIUM.";
 }
 void MojoGLES2Impl::ShallowFlushCHROMIUM() {
-  return static_cast<gpu::gles2::GLES2Interface*>(
-             MojoGLES2GetGLES2Interface(context_))->ShallowFlushCHROMIUM();
+  MojoGLES2MakeCurrent(context_);
+  glShallowFlushCHROMIUM();
 }
 void MojoGLES2Impl::OrderingBarrierCHROMIUM() {
   NOTREACHED() << "Unimplemented OrderingBarrierCHROMIUM.";
@@ -1203,63 +1210,68 @@
   NOTREACHED() << "Unimplemented TexStorage2DEXT.";
 }
 void MojoGLES2Impl::GenQueriesEXT(GLsizei n, GLuint* queries) {
-  return static_cast<gpu::gles2::GLES2Interface*>(
-             MojoGLES2GetGLES2Interface(context_))->GenQueriesEXT(n, queries);
+  MojoGLES2MakeCurrent(context_);
+  glGenQueriesEXT(n, queries);
 }
 void MojoGLES2Impl::DeleteQueriesEXT(GLsizei n, const GLuint* queries) {
-  return static_cast<gpu::gles2::GLES2Interface*>(
-             MojoGLES2GetGLES2Interface(context_))
-      ->DeleteQueriesEXT(n, queries);
+  MojoGLES2MakeCurrent(context_);
+  glDeleteQueriesEXT(n, queries);
 }
 GLboolean MojoGLES2Impl::IsQueryEXT(GLuint id) {
-  NOTREACHED() << "Unimplemented IsQueryEXT.";
-  return 0;
+  MojoGLES2MakeCurrent(context_);
+  return glIsQueryEXT(id);
 }
 void MojoGLES2Impl::BeginQueryEXT(GLenum target, GLuint id) {
-  return static_cast<gpu::gles2::GLES2Interface*>(
-             MojoGLES2GetGLES2Interface(context_))->BeginQueryEXT(target, id);
+  MojoGLES2MakeCurrent(context_);
+  glBeginQueryEXT(target, id);
 }
 void MojoGLES2Impl::BeginTransformFeedback(GLenum primitivemode) {
   NOTREACHED() << "Unimplemented BeginTransformFeedback.";
 }
 void MojoGLES2Impl::EndQueryEXT(GLenum target) {
-  return static_cast<gpu::gles2::GLES2Interface*>(
-             MojoGLES2GetGLES2Interface(context_))->EndQueryEXT(target);
+  MojoGLES2MakeCurrent(context_);
+  glEndQueryEXT(target);
 }
 void MojoGLES2Impl::EndTransformFeedback() {
   NOTREACHED() << "Unimplemented EndTransformFeedback.";
 }
 void MojoGLES2Impl::GetQueryivEXT(GLenum target, GLenum pname, GLint* params) {
-  NOTREACHED() << "Unimplemented GetQueryivEXT.";
+  MojoGLES2MakeCurrent(context_);
+  glGetQueryivEXT(target, pname, params);
 }
 void MojoGLES2Impl::GetQueryObjectuivEXT(GLuint id,
                                          GLenum pname,
                                          GLuint* params) {
-  return static_cast<gpu::gles2::GLES2Interface*>(
-             MojoGLES2GetGLES2Interface(context_))
-      ->GetQueryObjectuivEXT(id, pname, params);
+  MojoGLES2MakeCurrent(context_);
+  glGetQueryObjectuivEXT(id, pname, params);
 }
 void MojoGLES2Impl::InsertEventMarkerEXT(GLsizei length, const GLchar* marker) {
-  NOTREACHED() << "Unimplemented InsertEventMarkerEXT.";
+  MojoGLES2MakeCurrent(context_);
+  glInsertEventMarkerEXT(length, marker);
 }
 void MojoGLES2Impl::PushGroupMarkerEXT(GLsizei length, const GLchar* marker) {
-  NOTREACHED() << "Unimplemented PushGroupMarkerEXT.";
+  MojoGLES2MakeCurrent(context_);
+  glPushGroupMarkerEXT(length, marker);
 }
 void MojoGLES2Impl::PopGroupMarkerEXT() {
-  NOTREACHED() << "Unimplemented PopGroupMarkerEXT.";
+  MojoGLES2MakeCurrent(context_);
+  glPopGroupMarkerEXT();
 }
 void MojoGLES2Impl::GenVertexArraysOES(GLsizei n, GLuint* arrays) {
-  NOTREACHED() << "Unimplemented GenVertexArraysOES.";
+  MojoGLES2MakeCurrent(context_);
+  glGenVertexArraysOES(n, arrays);
 }
 void MojoGLES2Impl::DeleteVertexArraysOES(GLsizei n, const GLuint* arrays) {
-  NOTREACHED() << "Unimplemented DeleteVertexArraysOES.";
+  MojoGLES2MakeCurrent(context_);
+  glDeleteVertexArraysOES(n, arrays);
 }
 GLboolean MojoGLES2Impl::IsVertexArrayOES(GLuint array) {
-  NOTREACHED() << "Unimplemented IsVertexArrayOES.";
-  return 0;
+  MojoGLES2MakeCurrent(context_);
+  return glIsVertexArrayOES(array);
 }
 void MojoGLES2Impl::BindVertexArrayOES(GLuint array) {
-  NOTREACHED() << "Unimplemented BindVertexArrayOES.";
+  MojoGLES2MakeCurrent(context_);
+  glBindVertexArrayOES(array);
 }
 void MojoGLES2Impl::SwapBuffers() {
   NOTREACHED() << "Unimplemented SwapBuffers.";
@@ -1287,11 +1299,12 @@
                                               GLintptr offset,
                                               GLsizeiptr size,
                                               GLenum access) {
-  NOTREACHED() << "Unimplemented MapBufferSubDataCHROMIUM.";
-  return 0;
+  MojoGLES2MakeCurrent(context_);
+  return glMapBufferSubDataCHROMIUM(target, offset, size, access);
 }
 void MojoGLES2Impl::UnmapBufferSubDataCHROMIUM(const void* mem) {
-  NOTREACHED() << "Unimplemented UnmapBufferSubDataCHROMIUM.";
+  MojoGLES2MakeCurrent(context_);
+  glUnmapBufferSubDataCHROMIUM(mem);
 }
 void* MojoGLES2Impl::MapBufferRange(GLenum target,
                                     GLintptr offset,
@@ -1313,20 +1326,19 @@
                                               GLenum format,
                                               GLenum type,
                                               GLenum access) {
-  return static_cast<gpu::gles2::GLES2Interface*>(
-             MojoGLES2GetGLES2Interface(context_))
-      ->MapTexSubImage2DCHROMIUM(target, level, xoffset, yoffset, width, height,
-                                 format, type, access);
+  MojoGLES2MakeCurrent(context_);
+  return glMapTexSubImage2DCHROMIUM(target, level, xoffset, yoffset, width,
+                                    height, format, type, access);
 }
 void MojoGLES2Impl::UnmapTexSubImage2DCHROMIUM(const void* mem) {
-  return static_cast<gpu::gles2::GLES2Interface*>(
-             MojoGLES2GetGLES2Interface(context_))
-      ->UnmapTexSubImage2DCHROMIUM(mem);
+  MojoGLES2MakeCurrent(context_);
+  glUnmapTexSubImage2DCHROMIUM(mem);
 }
 void MojoGLES2Impl::ResizeCHROMIUM(GLuint width,
                                    GLuint height,
                                    GLfloat scale_factor) {
-  NOTREACHED() << "Unimplemented ResizeCHROMIUM.";
+  MojoGLES2MakeCurrent(context_);
+  MGLResizeSurface(width, height);
 }
 const GLchar* MojoGLES2Impl::GetRequestableExtensionsCHROMIUM() {
   NOTREACHED() << "Unimplemented GetRequestableExtensionsCHROMIUM.";
@@ -1460,7 +1472,8 @@
 void MojoGLES2Impl::BindUniformLocationCHROMIUM(GLuint program,
                                                 GLint location,
                                                 const char* name) {
-  NOTREACHED() << "Unimplemented BindUniformLocationCHROMIUM.";
+  MojoGLES2MakeCurrent(context_);
+  glBindUniformLocationCHROMIUM(program, location, name);
 }
 void MojoGLES2Impl::GenValuebuffersCHROMIUM(GLsizei n, GLuint* buffers) {
   NOTREACHED() << "Unimplemented GenValuebuffersCHROMIUM.";
diff --git a/mojo/message_pump/BUILD.gn b/mojo/message_pump/BUILD.gn
new file mode 100644
index 0000000..14daad6
--- /dev/null
+++ b/mojo/message_pump/BUILD.gn
@@ -0,0 +1,39 @@
+# 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.
+
+source_set("message_pump") {
+  sources = [
+    "handle_watcher.cc",
+    "handle_watcher.h",
+    "message_pump_mojo.cc",
+    "message_pump_mojo.h",
+    "message_pump_mojo_handler.h",
+    "time_helper.cc",
+    "time_helper.h",
+  ]
+
+  deps = [
+    "//base",
+    "//mojo/public/cpp/system",
+  ]
+}
+
+source_set("tests") {
+  testonly = true
+
+  sources = [
+    "handle_watcher_unittest.cc",
+    "message_pump_mojo_unittest.cc",
+  ]
+
+  deps = [
+    ":message_pump",
+    "//base",
+    "//base/test:test_support",
+    "//base:message_loop_tests",
+    "//mojo/public/cpp/system",
+    "//mojo/public/cpp/test_support:test_utils",
+    "//testing/gtest",
+  ]
+}
diff --git a/mojo/common/handle_watcher.cc b/mojo/message_pump/handle_watcher.cc
similarity index 98%
rename from mojo/common/handle_watcher.cc
rename to mojo/message_pump/handle_watcher.cc
index c7fa81f..2465579 100644
--- a/mojo/common/handle_watcher.cc
+++ b/mojo/message_pump/handle_watcher.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/common/handle_watcher.h"
+#include "mojo/message_pump/handle_watcher.h"
 
 #include <map>
 
@@ -20,9 +20,9 @@
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
-#include "mojo/common/message_pump_mojo.h"
-#include "mojo/common/message_pump_mojo_handler.h"
-#include "mojo/common/time_helper.h"
+#include "mojo/message_pump/message_pump_mojo.h"
+#include "mojo/message_pump/message_pump_mojo_handler.h"
+#include "mojo/message_pump/time_helper.h"
 
 namespace mojo {
 namespace common {
diff --git a/mojo/common/handle_watcher.h b/mojo/message_pump/handle_watcher.h
similarity index 92%
rename from mojo/common/handle_watcher.h
rename to mojo/message_pump/handle_watcher.h
index fb89716..f024d94 100644
--- a/mojo/common/handle_watcher.h
+++ b/mojo/message_pump/handle_watcher.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 MOJO_COMMON_HANDLE_WATCHER_H_
-#define MOJO_COMMON_HANDLE_WATCHER_H_
+#ifndef MOJO_MESSAGE_PUMP_HANDLE_WATCHER_H_
+#define MOJO_MESSAGE_PUMP_HANDLE_WATCHER_H_
 
 #include "base/basictypes.h"
 #include "base/callback_forward.h"
@@ -60,4 +60,4 @@
 }  // namespace common
 }  // namespace mojo
 
-#endif  // MOJO_COMMON_HANDLE_WATCHER_H_
+#endif  // MOJO_MESSAGE_PUMP_HANDLE_WATCHER_H_
diff --git a/mojo/common/handle_watcher_unittest.cc b/mojo/message_pump/handle_watcher_unittest.cc
similarity index 98%
rename from mojo/common/handle_watcher_unittest.cc
rename to mojo/message_pump/handle_watcher_unittest.cc
index 46d2a27..36f15ac 100644
--- a/mojo/common/handle_watcher_unittest.cc
+++ b/mojo/message_pump/handle_watcher_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/common/handle_watcher.h"
+#include "mojo/message_pump/handle_watcher.h"
 
 #include <string>
 
@@ -13,8 +13,8 @@
 #include "base/run_loop.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "base/threading/thread.h"
-#include "mojo/common/message_pump_mojo.h"
-#include "mojo/common/time_helper.h"
+#include "mojo/message_pump/message_pump_mojo.h"
+#include "mojo/message_pump/time_helper.h"
 #include "mojo/public/cpp/system/core.h"
 #include "mojo/public/cpp/test_support/test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/mojo/common/message_pump_mojo.cc b/mojo/message_pump/message_pump_mojo.cc
similarity index 98%
rename from mojo/common/message_pump_mojo.cc
rename to mojo/message_pump/message_pump_mojo.cc
index 544960b..e7f7d10 100644
--- a/mojo/common/message_pump_mojo.cc
+++ b/mojo/message_pump/message_pump_mojo.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/common/message_pump_mojo.h"
+#include "mojo/message_pump/message_pump_mojo.h"
 
 #include <algorithm>
 #include <vector>
@@ -12,8 +12,8 @@
 #include "base/logging.h"
 #include "base/threading/thread_local.h"
 #include "base/time/time.h"
-#include "mojo/common/message_pump_mojo_handler.h"
-#include "mojo/common/time_helper.h"
+#include "mojo/message_pump/message_pump_mojo_handler.h"
+#include "mojo/message_pump/time_helper.h"
 
 namespace mojo {
 namespace common {
diff --git a/mojo/common/message_pump_mojo.h b/mojo/message_pump/message_pump_mojo.h
similarity index 96%
rename from mojo/common/message_pump_mojo.h
rename to mojo/message_pump/message_pump_mojo.h
index fc1e40b..522b0e5 100644
--- a/mojo/common/message_pump_mojo.h
+++ b/mojo/message_pump/message_pump_mojo.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 MOJO_COMMON_MESSAGE_PUMP_MOJO_H_
-#define MOJO_COMMON_MESSAGE_PUMP_MOJO_H_
+#ifndef MOJO_MESSAGE_PUMP_MESSAGE_PUMP_MOJO_H_
+#define MOJO_MESSAGE_PUMP_MESSAGE_PUMP_MOJO_H_
 
 #include <map>
 #include <utility>
@@ -135,4 +135,4 @@
 }  // namespace common
 }  // namespace mojo
 
-#endif  // MOJO_COMMON_MESSAGE_PUMP_MOJO_H_
+#endif  // MOJO_MESSAGE_PUMP_MESSAGE_PUMP_MOJO_H_
diff --git a/mojo/common/message_pump_mojo_handler.h b/mojo/message_pump/message_pump_mojo_handler.h
similarity index 79%
rename from mojo/common/message_pump_mojo_handler.h
rename to mojo/message_pump/message_pump_mojo_handler.h
index b55132d..3a4eccc 100644
--- a/mojo/common/message_pump_mojo_handler.h
+++ b/mojo/message_pump/message_pump_mojo_handler.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 MOJO_COMMON_MESSAGE_PUMP_MOJO_HANDLER_H_
-#define MOJO_COMMON_MESSAGE_PUMP_MOJO_HANDLER_H_
+#ifndef MOJO_MESSAGE_PUMP_MESSAGE_PUMP_MOJO_HANDLER_H_
+#define MOJO_MESSAGE_PUMP_MESSAGE_PUMP_MOJO_HANDLER_H_
 
 #include "mojo/public/cpp/system/core.h"
 
@@ -25,4 +25,4 @@
 }  // namespace common
 }  // namespace mojo
 
-#endif  // MOJO_COMMON_MESSAGE_PUMP_MOJO_HANDLER_H_
+#endif  // MOJO_MESSAGE_PUMP_MESSAGE_PUMP_MOJO_HANDLER_H_
diff --git a/mojo/common/message_pump_mojo_unittest.cc b/mojo/message_pump/message_pump_mojo_unittest.cc
similarity index 96%
rename from mojo/common/message_pump_mojo_unittest.cc
rename to mojo/message_pump/message_pump_mojo_unittest.cc
index 09cbe54..687d5f3 100644
--- a/mojo/common/message_pump_mojo_unittest.cc
+++ b/mojo/message_pump/message_pump_mojo_unittest.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/common/message_pump_mojo.h"
+#include "mojo/message_pump/message_pump_mojo.h"
 
 #include "base/message_loop/message_loop_test.h"
 #include "base/run_loop.h"
-#include "mojo/common/message_pump_mojo_handler.h"
+#include "mojo/message_pump/message_pump_mojo_handler.h"
 #include "mojo/public/cpp/system/core.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/mojo/common/time_helper.cc b/mojo/message_pump/time_helper.cc
similarity index 93%
rename from mojo/common/time_helper.cc
rename to mojo/message_pump/time_helper.cc
index 36fd087..ffd667e 100644
--- a/mojo/common/time_helper.cc
+++ b/mojo/message_pump/time_helper.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/common/time_helper.h"
+#include "mojo/message_pump/time_helper.h"
 
 #include "base/time/tick_clock.h"
 
diff --git a/mojo/common/time_helper.h b/mojo/message_pump/time_helper.h
similarity index 83%
rename from mojo/common/time_helper.h
rename to mojo/message_pump/time_helper.h
index 84029ec..dfdc7bb 100644
--- a/mojo/common/time_helper.h
+++ b/mojo/message_pump/time_helper.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 MOJO_COMMON_TIME_HELPER_H_
-#define MOJO_COMMON_TIME_HELPER_H_
+#ifndef MOJO_MESSAGE_PUMP_TIME_HELPER_H_
+#define MOJO_MESSAGE_PUMP_TIME_HELPER_H_
 
 #include "base/time/time.h"
 
@@ -30,4 +30,4 @@
 }  // namespace common
 }  // namespace mojo
 
-#endif  // MOJO_COMMON_TIME_HELPER_H_
+#endif  // MOJO_MESSAGE_PUMP_TIME_HELPER_H_
diff --git a/mojo/mojo_apps_js_unittests.isolate b/mojo/mojo_apps_js_unittests.isolate
deleted file mode 100644
index 6921a46..0000000
--- a/mojo/mojo_apps_js_unittests.isolate
+++ /dev/null
@@ -1,50 +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.
-{
-  'includes': [
-    '../third_party/icu/icu.isolate',
-  ],
-  'conditions': [
-    ['OS=="win" or OS=="mac" or OS=="linux"', {
-      'variables': {
-        'command': [
-          '../testing/test_env.py',
-          '<(PRODUCT_DIR)/mojo_apps_js_unittests<(EXECUTABLE_SUFFIX)',
-          '--brave-new-test-launcher',
-          '--test-launcher-bot-mode',
-        ],
-        'files': [
-          '../gin/test/expect.js',
-          '../testing/test_env.py',
-          '<(PRODUCT_DIR)/gen/mojo/public/interfaces/bindings/tests/',
-          '<(PRODUCT_DIR)/mojo_apps_js_unittests<(EXECUTABLE_SUFFIX)',
-          'apps/js/',
-          'bindings/js/',
-          'public/js/bindings/',
-        ],
-      },
-    }],
-    ['OS=="win"', {
-      'variables': {
-        'files': [
-          '<(PRODUCT_DIR)/mojo_test_support.dll',
-        ],
-      },
-    }],
-    ['OS=="linux"', {
-      'variables': {
-        'files': [
-          '<(PRODUCT_DIR)/lib/libmojo_test_support.so',
-        ],
-      },
-    }],
-    ['OS=="mac"', {
-      'variables': {
-        'files': [
-          '<(PRODUCT_DIR)/libmojo_test_support.dylib',
-        ],
-      },
-    }],
-  ],
-}
diff --git a/mojo/mojo_js_unittests.isolate b/mojo/mojo_js_unittests.isolate
deleted file mode 100644
index 2b3131b..0000000
--- a/mojo/mojo_js_unittests.isolate
+++ /dev/null
@@ -1,49 +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.
-{
-  'includes': [
-    '../third_party/icu/icu.isolate',
-  ],
-  'conditions': [
-    ['OS=="win" or OS=="mac" or OS=="linux"', {
-      'variables': {
-        'command': [
-          '../testing/test_env.py',
-          '<(PRODUCT_DIR)/mojo_js_unittests<(EXECUTABLE_SUFFIX)',
-          '--brave-new-test-launcher',
-          '--test-launcher-bot-mode',
-        ],
-        'files': [
-          '../gin/test/expect.js',
-          '../testing/test_env.py',
-          '<(PRODUCT_DIR)/gen/mojo/public/interfaces/bindings/tests/',
-          '<(PRODUCT_DIR)/mojo_js_unittests<(EXECUTABLE_SUFFIX)',
-          'bindings/js/',
-          'public/js/bindings/',
-        ],
-      },
-    }],
-    ['OS=="win"', {
-      'variables': {
-        'files': [
-          '<(PRODUCT_DIR)/mojo_test_support.dll',
-        ],
-      },
-    }],
-    ['OS=="linux"', {
-      'variables': {
-        'files': [
-          '<(PRODUCT_DIR)/lib/libmojo_test_support.so',
-        ],
-      },
-    }],
-    ['OS=="mac"', {
-      'variables': {
-        'files': [
-          '<(PRODUCT_DIR)/libmojo_test_support.dylib',
-        ],
-      },
-    }],
-  ],
-}
diff --git a/mojo/mojo_python_unittests.isolate b/mojo/mojo_python_unittests.isolate
deleted file mode 100644
index 4fea84a..0000000
--- a/mojo/mojo_python_unittests.isolate
+++ /dev/null
@@ -1,22 +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.
-{
-  'conditions': [
-    ['OS=="linux"', {
-      'variables': {
-        'command': [
-          'tools/run_mojo_python_bindings_tests.py',
-          '--build-dir=<(PRODUCT_DIR)',
-        ],
-        'files': [
-          '<(PRODUCT_DIR)/gen/mojo/public/interfaces/bindings/tests/',
-          '<(PRODUCT_DIR)/python/',
-          'python/tests/',
-          'tools/pylib/mojo_python_tests_runner.py',
-          'tools/run_mojo_python_bindings_tests.py',
-        ],
-      },
-    }],
-  ],
-}
diff --git a/mojo/nacl/BUILD.gn b/mojo/nacl/BUILD.gn
deleted file mode 100644
index 0c37c18..0000000
--- a/mojo/nacl/BUILD.gn
+++ /dev/null
@@ -1,75 +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.
-
-# Trusted code
-if (!is_nacl) {
-  # A simple shell for running untrusted binaries that talk to the Mojo
-  # embedder. (No services.)
-  executable("monacl_shell") {
-    testonly = true
-    sources = [
-      "monacl_shell.cc",
-    ]
-    deps = [
-      "//base:base",
-      "//mojo/edk/system:system",
-      "//nacl_bindings:monacl_sel",
-    ]
-
-    data_deps = [ "//nacl_bindings:irt_mojo(//native_client/build/toolchain/nacl:irt_${target_cpu})" ]
-  }
-}
-
-# Untrusted code
-if (is_nacl) {
-  # Unit test for the Mojo public API.
-  executable("monacl_test") {
-    testonly = true
-    sources = [
-      "//mojo/public/cpp/system/tests/core_unittest.cc",
-      "//mojo/public/cpp/system/tests/macros_unittest.cc",
-    ]
-    deps = [
-      "//mojo/public/c/system/tests:tests",
-      "//mojo/public/cpp/system:system",
-      "//mojo/public/platform/nacl:mojo",
-      "//testing/gtest:gtest",
-      "//testing/gtest:gtest_main",
-    ]
-  }
-
-  group("mojo_nacl_tests_untrusted") {
-    testonly = true
-    deps = [
-      ":monacl_test",
-      "//examples/apptest",
-      "//examples/wget",
-      "//services/clipboard",
-      "//services/clipboard:apptests",
-      "//services/files:apptests",
-
-      # TODO(ncbray): enable when NaCl has pthread rw locks.
-      #"//services/http_server",
-      "//services/http_server:apptests",
-      "//services/view_manager:mojo_view_manager_client_apptests",
-      "//services/view_manager:view_manager_service_apptests",
-      "//services/window_manager:window_manager_apptests",
-      "//shell:apptests",
-    ]
-  }
-}
-
-group("mojo_nacl") {
-  deps = [
-    "//services/nacl:nacl_content_handler",
-  ]
-}
-
-group("mojo_nacl_tests") {
-  testonly = true
-  deps = [
-    ":mojo_nacl_tests_untrusted(//native_client/build/toolchain/nacl:clang_newlib_${current_cpu})",
-    ":monacl_shell",
-  ]
-}
diff --git a/mojo/nacl/README.md b/mojo/nacl/README.md
deleted file mode 100644
index 412c4de..0000000
--- a/mojo/nacl/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-About
-=====
-
-This is a prototype for plumbing Mojo into the NaCl sandbox.  It is
-currently insecure (see below), does not provide a stable ABI (IRT
-support must be added), and does not support Mojo functions that
-return pointers (for example, `MojoMapBuffer`).
-
-
-Using
-=====
-
-To use this prototype run `mojo/tools/mojob.py gn --nacl` and then build
-and test as usual.
-
-Run `mojo/tools/mojob.py nacltest` for additional nacl-specific tests.
-
-
-Notes
-=====
-
-`generator/interface.py` contains a programmatic description of the
-stable Mojo interface.  This will need to be updated as the interface
-changes.  Run `generator/generate_nacl_bindings.py` to generate the
-bindings that plumb this interface into the NaCl sandbox.
-
-
-Security TODO
-=============
-
-* Separate trusted and untrusted Mojo handles.
-* Validate and copy option structures.
-* Protect untrusted buffers passed into Mojo:
-  * `NaClVmIoWillStart/HasEnded`.
-  * volatile accesses to untrusted memory (untrusted code could race).
-* Overflow checking in array bounds validation.
-
diff --git a/mojo/nacl/monacl_shell.cc b/mojo/nacl/monacl_shell.cc
deleted file mode 100644
index 714c04f..0000000
--- a/mojo/nacl/monacl_shell.cc
+++ /dev/null
@@ -1,48 +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.
-
-#include <iostream>
-
-#include "base/files/file.h"
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/simple_platform_support.h"
-#include "nacl_bindings/monacl_sel_main.h"
-#include "native_client/src/public/nacl_desc.h"
-
-NaClDesc* OpenFile(const char* filename) {
-  base::FilePath path(filename);
-  base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
-  if (!file.IsValid()) {
-    perror(filename);
-    exit(1);
-  }
-  return NaClDescCreateWithFilePathMetadata(file.TakePlatformFile(), "");
-}
-
-int main(int argc, char* argv[]) {
-  if (argc < 3) {
-    std::cout << "Usage: " << argv[0] << " irt.nexe app.nexe [args for app]" <<
-        std::endl;
-    return 1;
-  }
-
-  const char* irt_file = argv[1];
-  const char* nexe_file = argv[2];
-
-  NaClDesc* irt_desc = OpenFile(irt_file);
-  NaClDesc* nexe_desc = OpenFile(nexe_file);
-
-  mojo::embedder::Init(scoped_ptr<mojo::embedder::PlatformSupport>(
-      new mojo::embedder::SimplePlatformSupport()));
-
-  int exit_code = mojo::LaunchNaCl(nexe_desc, irt_desc, argc - 2, argv + 2,
-                                   MOJO_HANDLE_INVALID);
-
-  // Exits the process cleanly, does not return.
-  mojo::NaClExit(exit_code);
-  NOTREACHED();
-  return 1;
-}
diff --git a/mojo/python/BUILD.gn b/mojo/python/BUILD.gn
deleted file mode 100644
index 92bfd60..0000000
--- a/mojo/python/BUILD.gn
+++ /dev/null
@@ -1,66 +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.
-
-import("//mojo/public/python/rules.gni")
-import("//third_party/cython/rules.gni")
-
-group("python") {
-  deps = [
-    ":mojo_embedder",
-    ":packaged_utils",
-    ":utils",
-    ":validation_util",
-    "//mojo/public/python",
-  ]
-}
-
-copy("utils") {
-  sources = [
-    "mojo_utils/__init__.py",
-    "mojo_utils/data_pipe_utils.py",
-  ]
-  outputs = [
-    "$root_out_dir/python/mojo_utils/{{source_file_part}}",
-  ]
-}
-
-python_package("packaged_utils") {
-  sources = [
-    "mojo_utils/__init__.py",
-    "mojo_utils/data_pipe_utils.py",
-  ]
-  datadeps = [
-    "//mojo/public/python:mojo_system",
-  ]
-}
-
-python_binary_module("mojo_embedder") {
-  cython_sources = [ "system/mojo_embedder.pyx" ]
-  deps = [
-    "//mojo/edk/system",
-  ]
-  datadeps = [
-    "//mojo/public/python:mojo_system",
-  ]
-}
-
-copy("tests_module") {
-  sources = [
-    "system/mojo_tests/__init__.py",
-  ]
-  outputs = [
-    "$root_out_dir/python/mojo_tests/{{source_file_part}}",
-  ]
-}
-
-python_binary_module("validation_util") {
-  python_base_module = "mojo_tests"
-  cython_sources = [ "system/mojo_tests/validation_util.pyx" ]
-  deps = [
-    "//mojo/public/cpp/bindings/tests:mojo_public_bindings_test_utils",
-  ]
-  datadeps = [
-    ":tests_module",
-  ]
-}
diff --git a/mojo/python/mojo_utils/__init__.py b/mojo/python/mojo_utils/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/mojo/python/mojo_utils/__init__.py
+++ /dev/null
@@ -1,3 +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.
diff --git a/mojo/python/mojo_utils/data_pipe_utils.py b/mojo/python/mojo_utils/data_pipe_utils.py
deleted file mode 100644
index 2a46ea5..0000000
--- a/mojo/python/mojo_utils/data_pipe_utils.py
+++ /dev/null
@@ -1,76 +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.
-
-import itertools
-import sys
-
-import mojo_system
-from mojo_bindings import promise
-
-class DataPipeCopyException(Exception):
-  def __init__(self, *args, **kwargs):
-    Exception.__init__(self, *args, **kwargs)
-    self.__traceback__ = sys.exc_info()[2]
-
-
-def CopyFromDataPipe(data_pipe, deadline):
-  """
-  Returns a Promise that operates as follows:
-  - If |data_pipe| is successfully read from, the promise resolves with the
-    bytes that were read.
-  - Otherwise, the promise rejects with an exception whose message contains the
-    status from the attempted read.
-  """
-  class DataPipeCopyHelper():
-    def __init__(self, data_pipe, deadline, resolve, reject):
-      self.data_pipe = data_pipe
-      self.original_deadline = deadline
-      self.start_time = mojo_system.GetTimeTicksNow()
-      self.resolve = resolve
-      self.reject = reject
-      self.buffer_size = 1024
-      self.data = bytearray(self.buffer_size)
-      self.index = 0
-
-    def _ComputeCurrentDeadline(self):
-      if self.original_deadline == mojo_system.DEADLINE_INDEFINITE:
-        return self.original_deadline
-      elapsed_time = mojo_system.GetTimeTicksNow() - self.start_time
-      return max(0, self.original_deadline - elapsed_time)
-
-    def CopyFromDataPipeAsync(self, result):
-      while result == mojo_system.RESULT_OK:
-        assert self.index <= len(self.data)
-        if self.index == len(self.data):
-          self.buffer_size *= 2
-          self.data.extend(itertools.repeat(0, self.buffer_size))
-
-        # Careful! Have to construct a memoryview object here as otherwise the
-        # slice operation will create a copy of |data| and hence not write into
-        # |data| as desired.
-        result, read_bytes = self.data_pipe.ReadData(
-            memoryview(self.data)[self.index:])
-        if read_bytes:
-          self.index += len(read_bytes)
-        del read_bytes
-
-      if result == mojo_system.RESULT_SHOULD_WAIT:
-        data_pipe.AsyncWait(mojo_system.HANDLE_SIGNAL_READABLE,
-                            self._ComputeCurrentDeadline(),
-                            self.CopyFromDataPipeAsync)
-        return
-
-      # Treat a failed precondition as EOF.
-      if result == mojo_system.RESULT_FAILED_PRECONDITION:
-        self.resolve(self.data[:self.index])
-        return
-
-      self.reject(DataPipeCopyException("Result: %d" % result))
-
-
-  def GenerationMethod(resolve, reject):
-    helper = DataPipeCopyHelper(data_pipe, deadline, resolve, reject)
-    helper.CopyFromDataPipeAsync(mojo_system.RESULT_OK)
-
-  return promise.Promise(GenerationMethod)
diff --git a/mojo/python/system/mojo_embedder.pyx b/mojo/python/system/mojo_embedder.pyx
deleted file mode 100644
index 75ae387..0000000
--- a/mojo/python/system/mojo_embedder.pyx
+++ /dev/null
@@ -1,50 +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.
-
-# distutils: language = c++
-
-from libc.stdint cimport uintptr_t
-from libcpp cimport bool
-
-import mojo_system
-import mojo_system_impl
-
-cdef extern from "third_party/cython/python_export.h":
-  pass
-
-cdef extern from "base/memory/scoped_ptr.h":
-  cdef cppclass scoped_ptr[T]:
-    scoped_ptr(T*)
-
-cdef extern from "mojo/edk/embedder/platform_support.h" \
-    namespace "mojo::embedder" nogil:
-  cdef cppclass PlatformSupport:
-    pass
-
-cdef extern from "mojo/edk/embedder/simple_platform_support.h" \
-    namespace "mojo::embedder" nogil:
-  cdef cppclass SimplePlatformSupport(PlatformSupport):
-    SimplePlatformSupport()
-
-cdef extern from "mojo/edk/embedder/embedder.h" nogil:
-  cdef void InitCEmbedder "mojo::embedder::Init"(
-      scoped_ptr[PlatformSupport] platform_support)
-
-cdef extern from "mojo/public/platform/native/system_thunks.h" nogil:
-  cdef struct MojoSystemThunks:
-    pass
-  cdef MojoSystemThunks MojoMakeSystemThunks()
-
-cdef extern from "mojo/edk/embedder/test_embedder.h" nogil:
-  cdef bool ShutdownCEmbedderForTest "mojo::embedder::test::Shutdown"()
-
-def Init():
-  InitCEmbedder(scoped_ptr[PlatformSupport](
-      new SimplePlatformSupport()))
-  cdef MojoSystemThunks thunks = MojoMakeSystemThunks()
-  mojo_system.SetSystemThunks(<uintptr_t>(&thunks))
-  mojo_system_impl.SetSystemThunks(<uintptr_t>(&thunks))
-
-def ShutdownForTest():
-  return ShutdownCEmbedderForTest()
diff --git a/mojo/python/system/mojo_tests/__init__.py b/mojo/python/system/mojo_tests/__init__.py
deleted file mode 100644
index 4d6aabb..0000000
--- a/mojo/python/system/mojo_tests/__init__.py
+++ /dev/null
@@ -1,3 +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.
diff --git a/mojo/python/system/mojo_tests/validation_util.pyx b/mojo/python/system/mojo_tests/validation_util.pyx
deleted file mode 100644
index e7bdbcd..0000000
--- a/mojo/python/system/mojo_tests/validation_util.pyx
+++ /dev/null
@@ -1,35 +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.
-
-# distutils: language = c++
-
-from libc.stdint cimport uint8_t
-from libcpp cimport bool
-from libcpp.string cimport string
-from libcpp.vector cimport vector
-
-cdef extern from "third_party/cython/python_export.h":
-  pass
-
-cdef extern from "mojo/public/cpp/bindings/tests/validation_test_input_parser.h":
-  cdef bool ParseValidationTestInput "mojo::test::ParseValidationTestInput"(
-      string input,
-      vector[uint8_t]* data,
-      size_t* num_handles,
-      string* error_message)
-
-class Data(object):
-  def __init__(self, data, num_handles, error_message):
-    self.data = data
-    self.num_handles = num_handles
-    self.error_message = error_message
-
-def ParseData(value):
-  cdef string value_as_string = value
-  cdef vector[uint8_t] data_as_vector
-  cdef size_t num_handles
-  cdef string error_message
-  ParseValidationTestInput(
-      value, &data_as_vector, &num_handles, &error_message)
-  return Data(bytearray(data_as_vector), num_handles, error_message)
diff --git a/mojo/python/tests/async_wait_unittest.py b/mojo/python/tests/async_wait_unittest.py
deleted file mode 100644
index 61b0c2c..0000000
--- a/mojo/python/tests/async_wait_unittest.py
+++ /dev/null
@@ -1,50 +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.
-
-import mojo_unittest
-
-# pylint: disable=E0611
-import mojo_system as system
-
-
-class AsyncWaitTest(mojo_unittest.MojoTestCase):
-
-  def setUp(self):
-    super(AsyncWaitTest, self).setUp()
-    self.array = []
-    self.handles = system.MessagePipe()
-    self.cancel = self.handles.handle0.AsyncWait(system.HANDLE_SIGNAL_READABLE,
-                                                 system.DEADLINE_INDEFINITE,
-                                                 self._OnResult)
-
-  def tearDown(self):
-    self.cancel()
-    self.handles = None
-    self.array = None
-    super(AsyncWaitTest, self).tearDown()
-
-  def _OnResult(self, value):
-    self.array.append(value)
-
-  def _WriteToHandle(self):
-    self.handles.handle1.WriteMessage()
-
-  def _PostWriteAndRun(self):
-    self.loop.PostDelayedTask(self._WriteToHandle, 0)
-    self.loop.RunUntilIdle()
-
-  def testAsyncWait(self):
-    self._PostWriteAndRun()
-    self.assertEquals(len(self.array), 1)
-    self.assertEquals(system.RESULT_OK, self.array[0])
-
-  def testAsyncWaitCancel(self):
-    self.loop.PostDelayedTask(self.cancel, 0)
-    self._PostWriteAndRun()
-    self.assertEquals(len(self.array), 0)
-
-  def testAsyncWaitImmediateCancel(self):
-    self.cancel()
-    self._PostWriteAndRun()
-    self.assertEquals(len(self.array), 0)
diff --git a/mojo/python/tests/bindings_constants_unittest.py b/mojo/python/tests/bindings_constants_unittest.py
deleted file mode 100644
index 4db08c1..0000000
--- a/mojo/python/tests/bindings_constants_unittest.py
+++ /dev/null
@@ -1,38 +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.
-
-import math
-import unittest
-
-# Generated files
-# pylint: disable=F0401
-import sample_service_mojom
-import test_constants_mojom
-
-class ConstantBindingsTest(unittest.TestCase):
-
-  def testConstantGeneration(self):
-    self.assertEquals(test_constants_mojom.INT8_VALUE, -2)
-    self.assertEquals(test_constants_mojom.UINT64_VALUE, 9999999999999999999)
-    self.assertEquals(test_constants_mojom.DOUBLE_INFINITY,
-                      float('inf'))
-    self.assertEquals(test_constants_mojom.DOUBLE_NEGATIVE_INFINITY,
-                      float('-inf'))
-    self.assertTrue(math.isnan(test_constants_mojom.DOUBLE_NA_N))
-    self.assertEquals(test_constants_mojom.FLOAT_INFINITY,
-                      float('inf'))
-    self.assertEquals(test_constants_mojom.FLOAT_NEGATIVE_INFINITY,
-                      float('-inf'))
-    self.assertTrue(math.isnan(test_constants_mojom.FLOAT_NA_N))
-
-  def testConstantOnStructGeneration(self):
-    self.assertEquals(test_constants_mojom.StructWithConstants.INT8_VALUE, 5)
-
-  def testStructImmutability(self):
-    with self.assertRaises(AttributeError):
-      sample_service_mojom.Foo.FOOBY = 0
-    with self.assertRaises(AttributeError):
-      del sample_service_mojom.Foo.FOOBY
-    with self.assertRaises(AttributeError):
-      sample_service_mojom.Foo.BAR = 1
diff --git a/mojo/python/tests/bindings_control_messages_unittest.py b/mojo/python/tests/bindings_control_messages_unittest.py
deleted file mode 100644
index 12dcfe4..0000000
--- a/mojo/python/tests/bindings_control_messages_unittest.py
+++ /dev/null
@@ -1,90 +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.
-
-# pylint: disable=F0401,E0611
-import mojo_bindings.promise as promise
-import mojo_system as system
-import mojo_unittest
-import sample_interfaces_mojom
-
-
-def _BuildProxy(impl):
-  pipe = system.MessagePipe()
-  impl.__class__.manager.Bind(impl, pipe.handle0)
-  return impl.__class__.manager.Proxy(pipe.handle1)
-
-
-def _ExtractValue(v_promise):
-  container = []
-  @promise.async
-  def GetInternalValue(value):
-    container.append(value)
-  GetInternalValue(v_promise)
-  assert len(container)
-  return container[0]
-
-
-class IntegerAccessorImpl(sample_interfaces_mojom.IntegerAccessor):
-  """
-  Interface definition is in
-  mojo/public/interfaces/bindings/tests/sample_interfaces.mojom
-  """
-  def __init__(self):
-    self.values = {
-      'data': 0,
-      'type': 0,
-    }
-
-  def GetInteger(self):
-    return self.values;
-
-  def SetInteger(self, **values):
-    self.values = values
-
-  def GetInternalValue(self):
-    return self.values['data']
-
-
-class ControlMessagesTest(mojo_unittest.MojoTestCase):
-
-  def testQueryVersion(self):
-    p = _BuildProxy(IntegerAccessorImpl())
-    self.assertEquals(p.manager.version, 0)
-    v_promise = p.manager.QueryVersion()
-    self.loop.RunUntilIdle()
-    self.assertEquals(v_promise.state, promise.Promise.STATE_FULLFILLED)
-    self.assertEquals(_ExtractValue(v_promise), 3)
-    self.assertEquals(p.manager.version, 3)
-
-  def testRequireVersion(self):
-    impl = IntegerAccessorImpl()
-    errors = []
-    p = _BuildProxy(impl)
-    p.manager.AddOnErrorCallback(lambda: errors.append(0))
-
-    self.assertEquals(p.manager.version, 0)
-
-    p.manager.RequireVersion(1)
-    self.assertEquals(p.manager.version, 1)
-    p.SetInteger(123, sample_interfaces_mojom.Enum.VALUE)
-    self.loop.RunUntilIdle()
-    self.assertEquals(len(errors), 0)
-    self.assertEquals(impl.GetInternalValue(), 123)
-
-    p.manager.RequireVersion(3)
-    self.assertEquals(p.manager.version, 3)
-    p.SetInteger(456, sample_interfaces_mojom.Enum.VALUE)
-    self.loop.RunUntilIdle()
-    self.assertEquals(len(errors), 0)
-    self.assertEquals(impl.GetInternalValue(), 456)
-
-    # Require a version that is not supported by the implementation side.
-    p.manager.RequireVersion(4)
-    # version is updated synchronously.
-    self.assertEquals(p.manager.version, 4)
-    p.SetInteger(789, sample_interfaces_mojom.Enum.VALUE)
-    self.loop.RunUntilIdle()
-    self.assertEquals(len(errors), 1)
-    # The call to SetInteger() after RequireVersion() is ignored.
-    self.assertEquals(impl.GetInternalValue(), 456)
diff --git a/mojo/python/tests/bindings_enums_unittest.py b/mojo/python/tests/bindings_enums_unittest.py
deleted file mode 100644
index 6ec5d8c..0000000
--- a/mojo/python/tests/bindings_enums_unittest.py
+++ /dev/null
@@ -1,61 +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.
-
-import unittest
-
-# Generated files
-# pylint: disable=F0401
-import sample_import_mojom
-import sample_service_mojom
-
-
-class EnumBindingsTest(unittest.TestCase):
-
-  # Testing enum classes are in the right module.
-  def testModule(self):
-    self.assertEquals(sample_import_mojom.Shape.__module__,
-                      'sample_import_mojom')
-
-  # Testing that enum class have expected constant values.
-  def testTopLevelEnumGeneration(self):
-    self.assertEquals(sample_import_mojom.Shape.RECTANGLE, 1)
-    self.assertEquals(sample_import_mojom.Shape.CIRCLE, 2)
-    self.assertEquals(sample_import_mojom.Shape.TRIANGLE, 3)
-    self.assertEquals(sample_import_mojom.Shape.LAST,
-                      sample_import_mojom.Shape.TRIANGLE)
-
-    self.assertEquals(sample_import_mojom.AnotherShape.RECTANGLE, 10)
-    self.assertEquals(sample_import_mojom.AnotherShape.CIRCLE, 11)
-    self.assertEquals(sample_import_mojom.AnotherShape.TRIANGLE, 12)
-
-    self.assertEquals(sample_import_mojom.YetAnotherShape.RECTANGLE, 20)
-    self.assertEquals(sample_import_mojom.YetAnotherShape.CIRCLE, 21)
-    self.assertEquals(sample_import_mojom.YetAnotherShape.TRIANGLE, 22)
-
-  # Testing that internal enum class have expected constant values.
-  def testInternalEnumGeneration(self):
-    self.assertEquals(sample_service_mojom.Bar.Type.VERTICAL, 1)
-    self.assertEquals(sample_service_mojom.Bar.Type.HORIZONTAL, 2)
-    self.assertEquals(sample_service_mojom.Bar.Type.BOTH, 3)
-    self.assertEquals(sample_service_mojom.Bar.Type.INVALID, 4)
-
-  # Testing an enum class cannot be instantiated.
-  def testNonInstantiableEnum(self):
-    with self.assertRaises(TypeError):
-      sample_import_mojom.Shape()
-
-  # Testing an enum does not contain the VALUES constant.
-  def testNoVALUESConstant(self):
-    with self.assertRaises(AttributeError):
-      # pylint: disable=W0104
-      sample_import_mojom.Shape.VALUES
-
-  # Testing enum values are frozen.
-  def testEnumFrozen(self):
-    with self.assertRaises(AttributeError):
-      sample_import_mojom.Shape.RECTANGLE = 2
-    with self.assertRaises(AttributeError):
-      del sample_import_mojom.Shape.RECTANGLE
-    with self.assertRaises(AttributeError):
-      sample_import_mojom.Shape.NewShape = 4
diff --git a/mojo/python/tests/bindings_interface_unittest.py b/mojo/python/tests/bindings_interface_unittest.py
deleted file mode 100644
index ac42ed3..0000000
--- a/mojo/python/tests/bindings_interface_unittest.py
+++ /dev/null
@@ -1,123 +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.
-
-import gc
-import weakref
-
-# pylint: disable=F0401,E0611
-import mojo_bindings.promise as promise
-import mojo_system as system
-import mojo_unittest
-import regression_tests_mojom
-import sample_factory_mojom
-import sample_service_mojom
-
-
-def _BuildProxy(impl):
-  pipe = system.MessagePipe()
-  impl.__class__.manager.Bind(impl, pipe.handle0)
-  return impl.__class__.manager.Proxy(pipe.handle1)
-
-
-def _ExtractValue(p):
-  container = []
-  @promise.async
-  def GetValue(value):
-    container.append(value)
-  GetValue(p)
-  assert len(container)
-  return container[0]
-
-
-class EmptyServiceImpl(sample_service_mojom.Service):
-
-  def __init__(self):
-    pass
-
-
-class ServiceImpl(sample_service_mojom.Service):
-
-  def __init__(self):
-    pass
-
-  # pylint: disable=C0102,W0613
-  def Frobinate(self, foo, baz, port):
-    return baz
-
-
-class NamedObjectImpl(sample_factory_mojom.NamedObject):
-
-  def __init__(self):
-    self.name = 'name'
-
-  def SetName(self, name):
-    self.name = name
-
-  def GetName(self):
-    return self.name
-
-
-class DelegatingNamedObject(sample_factory_mojom.NamedObject):
-
-  def __init__(self):
-    self.proxy = _BuildProxy(NamedObjectImpl())
-
-  def SetName(self, name):
-    self.proxy.SetName(name)
-
-  def GetName(self):
-    return self.proxy.GetName()
-
-class InterfaceTest(mojo_unittest.MojoTestCase):
-
-  def testBaseInterface(self):
-    service = sample_service_mojom.Service()
-    with self.assertRaises(AttributeError):
-      service.NotExisting()
-    with self.assertRaises(NotImplementedError):
-      service.Frobinate()
-
-  def testEmpty(self):
-    service = EmptyServiceImpl()
-    with self.assertRaises(NotImplementedError):
-      service.Frobinate()
-
-  def testServiceWithReturnValue(self):
-    proxy = _BuildProxy(DelegatingNamedObject())
-    p1 = proxy.GetName()
-
-    self.assertEquals(p1.state, promise.Promise.STATE_PENDING)
-    self.loop.RunUntilIdle()
-    self.assertEquals(p1.state, promise.Promise.STATE_FULLFILLED)
-    name = _ExtractValue(p1)
-    self.assertEquals(name, 'name')
-
-    proxy.SetName('hello')
-    p2 = proxy.GetName()
-
-    self.assertEquals(p2.state, promise.Promise.STATE_PENDING)
-    self.loop.RunUntilIdle()
-    self.assertEquals(p2.state, promise.Promise.STATE_FULLFILLED)
-    name = _ExtractValue(p2)
-    self.assertEquals(name, 'hello')
-
-  def testCloseProxy(self):
-    named_object_impl = NamedObjectImpl()
-    proxy = _BuildProxy(named_object_impl)
-    response = proxy.GetName()
-    proxy.manager.Close()
-
-    self.assertEquals(response.state, promise.Promise.STATE_REJECTED)
-
-  def testCloseImplementationWithResponse(self):
-    impl = DelegatingNamedObject()
-    proxy = _BuildProxy(impl)
-    p1 = proxy.GetName()
-
-    self.assertEquals(p1.state, promise.Promise.STATE_PENDING)
-
-    impl.manager.Close()
-    self.loop.RunUntilIdle()
-
-    self.assertEquals(p1.state, promise.Promise.STATE_REJECTED)
diff --git a/mojo/python/tests/bindings_serialization_deserialization_unittest.py b/mojo/python/tests/bindings_serialization_deserialization_unittest.py
deleted file mode 100644
index 64397c2..0000000
--- a/mojo/python/tests/bindings_serialization_deserialization_unittest.py
+++ /dev/null
@@ -1,102 +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.
-
-import math
-
-import mojo_unittest
-
-# pylint: disable=E0611,F0401
-import mojo_bindings.serialization as serialization
-import mojo_system
-
-# Generated files
-# pylint: disable=F0401
-import sample_import_mojom
-import sample_import2_mojom
-import sample_service_mojom
-
-
-def _NewHandle():
-  return mojo_system.MessagePipe().handle0
-
-
-def _NewBar():
-  bar_instance = sample_service_mojom.Bar()
-  bar_instance.alpha = 22
-  bar_instance.beta = 87
-  bar_instance.gamma = 122
-  bar_instance.type = sample_service_mojom.Bar.Type.BOTH
-  return bar_instance
-
-
-def _NewFoo():
-  foo_instance = sample_service_mojom.Foo()
-  foo_instance.name = "Foo.name"
-  foo_instance.x = 23
-  foo_instance.y = -23
-  foo_instance.a = False
-  foo_instance.b = True
-  foo_instance.c = True
-  foo_instance.bar = _NewBar()
-  foo_instance.extra_bars = [
-      _NewBar(),
-      _NewBar(),
-  ]
-  foo_instance.data = 'Hello world'
-  foo_instance.source = _NewHandle()
-  foo_instance.input_streams = [ _NewHandle() ]
-  foo_instance.output_streams = [ _NewHandle(), _NewHandle() ]
-  foo_instance.array_of_array_of_bools = [ [ True, False ], [] ]
-  foo_instance.multi_array_of_strings = [
-      [
-          [ "1", "2" ],
-          [],
-          [ "3", "4" ],
-      ],
-      [],
-  ]
-  foo_instance.array_of_bools = [ True, 0, 1, 2, 0, 0, 0, 0, 0, True ]
-  return foo_instance
-
-
-class SerializationDeserializationTest(mojo_unittest.MojoTestCase):
-
-  def testFooSerialization(self):
-    (data, _) = _NewFoo().Serialize()
-    self.assertTrue(len(data))
-    self.assertEquals(len(data) % 8, 0)
-
-  def testFooDeserialization(self):
-    (data, handles) = _NewFoo().Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    self.assertTrue(
-        sample_service_mojom.Foo.Deserialize(context))
-
-  def testFooSerializationDeserialization(self):
-    foo1 = _NewFoo()
-    (data, handles) = foo1.Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    foo2 = sample_service_mojom.Foo.Deserialize(context)
-    self.assertEquals(foo1, foo2)
-
-  def testDefaultsTestSerializationDeserialization(self):
-    v1 = sample_service_mojom.DefaultsTest()
-    v1.a18 = []
-    v1.a19 = ""
-    v1.a21 = sample_import_mojom.Point()
-    v1.a22.location = sample_import_mojom.Point()
-    v1.a22.size = sample_import2_mojom.Size()
-    (data, handles) = v1.Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    v2 = sample_service_mojom.DefaultsTest.Deserialize(context)
-    # NaN needs to be a special case.
-    self.assertNotEquals(v1, v2)
-    self.assertTrue(math.isnan(v2.a28))
-    self.assertTrue(math.isnan(v2.a31))
-    v1.a28 = v2.a28 = v1.a31 = v2.a31 = 0
-    self.assertEquals(v1, v2)
-
-  def testFooDeserializationError(self):
-    with self.assertRaises(Exception):
-      sample_service_mojom.Foo.Deserialize("", [])
diff --git a/mojo/python/tests/bindings_structs_unittest.py b/mojo/python/tests/bindings_structs_unittest.py
deleted file mode 100644
index c53c1a0..0000000
--- a/mojo/python/tests/bindings_structs_unittest.py
+++ /dev/null
@@ -1,217 +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.
-
-import math
-import unittest
-
-# pylint: disable=E0611,F0401
-import mojo_system
-
-# Generated files
-# pylint: disable=F0401
-import regression_tests_mojom
-import sample_import_mojom
-import sample_import2_mojom
-import sample_service_mojom
-
-
-class StructBindingsTest(unittest.TestCase):
-
-  def testModule(self):
-    self.assertEquals(sample_service_mojom.DefaultsTest.__module__,
-                      'sample_service_mojom')
-
-  def testDefaultsTest(self):
-    defaults_test = sample_service_mojom.DefaultsTest()
-    self.assertEquals(defaults_test.a0, -12)
-    self.assertEquals(defaults_test.a1, 12)
-    self.assertEquals(defaults_test.a2, 1234)
-    self.assertEquals(defaults_test.a3, 34567)
-    self.assertEquals(defaults_test.a4, 123456)
-    self.assertEquals(defaults_test.a5, 3456789012)
-    self.assertEquals(defaults_test.a6, -111111111111)
-    self.assertEquals(defaults_test.a7, 9999999999999999999)
-    self.assertEquals(defaults_test.a8, 0x12345)
-    self.assertEquals(defaults_test.a9, -0x12345)
-    self.assertEquals(defaults_test.a10, 1234)
-    self.assertEquals(defaults_test.a11, True)
-    self.assertEquals(defaults_test.a12, False)
-    self.assertEquals(defaults_test.a13, 123.25)
-    self.assertEquals(defaults_test.a14, 1234567890.123)
-    self.assertEquals(defaults_test.a15, 1E10)
-    self.assertEquals(defaults_test.a16, -1.2E+20)
-    self.assertEquals(defaults_test.a17, 1.23E-20)
-    self.assertEquals(defaults_test.a18, None)
-    self.assertEquals(defaults_test.a19, None)
-    self.assertEquals(defaults_test.a20, sample_service_mojom.Bar.Type.BOTH)
-    self.assertEquals(defaults_test.a21, None)
-    self.assertTrue(isinstance(defaults_test.a22, sample_import2_mojom.Thing))
-    self.assertEquals(defaults_test.a23, 0xFFFFFFFFFFFFFFFF)
-    self.assertEquals(defaults_test.a24, 0x123456789)
-    self.assertEquals(defaults_test.a25, -0x123456789)
-    self.assertEquals(defaults_test.a26, float('inf'))
-    self.assertEquals(defaults_test.a27, float('-inf'))
-    self.assertTrue(math.isnan(defaults_test.a28))
-    self.assertEquals(defaults_test.a29, float('inf'))
-    self.assertEquals(defaults_test.a30, float('-inf'))
-    self.assertTrue(math.isnan(defaults_test.a31))
-
-  def testNoAliasing(self):
-    foo1 = sample_service_mojom.Foo()
-    foo2 = sample_service_mojom.Foo()
-    foo1.name = "foo1"
-    foo2.name = "foo2"
-    self.assertEquals(foo1.name, "foo1")
-    self.assertEquals(foo2.name, "foo2")
-
-    defaults_test1 = sample_service_mojom.DefaultsTest()
-    defaults_test2 = sample_service_mojom.DefaultsTest()
-    self.assertIsNot(defaults_test1.a22, defaults_test2.a22)
-
-  def testImmutableAttributeSet(self):
-    foo_instance = sample_service_mojom.Foo()
-    with self.assertRaises(AttributeError):
-      foo_instance.new_attribute = None
-    with self.assertRaises(AttributeError):
-      del foo_instance.name
-
-  def _TestIntegerField(self, entity, field_name, bits, signed):
-    if signed:
-      min_value = -(1 << (bits - 1))
-      max_value = (1 << (bits - 1)) - 1
-    else:
-      min_value = 0
-      max_value = (1 << bits) - 1
-    entity.__setattr__(field_name, min_value)
-    entity.__setattr__(field_name, max_value)
-    with self.assertRaises(TypeError):
-      entity.__setattr__(field_name, None)
-    with self.assertRaises(OverflowError):
-      entity.__setattr__(field_name, min_value - 1)
-    with self.assertRaises(OverflowError):
-      entity.__setattr__(field_name, max_value + 1)
-    with self.assertRaises(TypeError):
-      entity.__setattr__(field_name, 'hello world')
-
-  def testTypes(self):
-    defaults_test = sample_service_mojom.DefaultsTest()
-    # Integer types
-    self._TestIntegerField(defaults_test, 'a0', 8, True)
-    self._TestIntegerField(defaults_test, 'a1', 8, False)
-    self._TestIntegerField(defaults_test, 'a2', 16, True)
-    self._TestIntegerField(defaults_test, 'a3', 16, False)
-    self._TestIntegerField(defaults_test, 'a4', 32, True)
-    self._TestIntegerField(defaults_test, 'a5', 32, False)
-    self._TestIntegerField(defaults_test, 'a6', 64, True)
-    self._TestIntegerField(defaults_test, 'a7', 64, False)
-
-    # Boolean types
-    defaults_test.a11 = False
-    self.assertEquals(defaults_test.a11, False)
-    defaults_test.a11 = None
-    self.assertEquals(defaults_test.a11, False)
-    defaults_test.a11 = []
-    self.assertEquals(defaults_test.a11, False)
-    defaults_test.a12 = True
-    self.assertEquals(defaults_test.a12, True)
-    defaults_test.a12 = 1
-    self.assertEquals(defaults_test.a12, True)
-    defaults_test.a12 = [[]]
-    self.assertEquals(defaults_test.a12, True)
-
-    # Floating point types
-    with self.assertRaises(TypeError):
-      defaults_test.a13 = 'hello'
-    with self.assertRaises(TypeError):
-      defaults_test.a14 = 'hello'
-
-    # Array type
-    defaults_test.a18 = None
-    defaults_test.a18 = []
-    defaults_test.a18 = [ 0 ]
-    defaults_test.a18 = [ 255 ]
-    defaults_test.a18 = [ 0, 255 ]
-    with self.assertRaises(TypeError):
-      defaults_test.a18 = [[]]
-    with self.assertRaises(OverflowError):
-      defaults_test.a18 = [ -1 ]
-    with self.assertRaises(OverflowError):
-      defaults_test.a18 = [ 256 ]
-
-    # String type
-    defaults_test.a19 = None
-    defaults_test.a19 = ''
-    defaults_test.a19 = 'hello world'
-    with self.assertRaises(TypeError):
-      defaults_test.a19 = [[]]
-    with self.assertRaises(TypeError):
-      defaults_test.a19 = [ -1 ]
-    with self.assertRaises(TypeError):
-      defaults_test.a19 = [ 256 ]
-
-    # Structs
-    defaults_test.a21 = None
-    defaults_test.a21 = sample_import_mojom.Point()
-    with self.assertRaises(TypeError):
-      defaults_test.a21 = 1
-    with self.assertRaises(TypeError):
-      defaults_test.a21 = sample_import2_mojom.Thing()
-
-    # Handles
-    foo_instance = sample_service_mojom.Foo()
-    foo_instance.source = None
-    foo_instance.source = mojo_system.Handle()
-    with self.assertRaises(TypeError):
-      foo_instance.source = 1
-    with self.assertRaises(TypeError):
-      foo_instance.source = object()
-
-  def testConstructor(self):
-    bar_instance = sample_service_mojom.Bar()
-    foo_instance = sample_service_mojom.Foo(name="Foo",
-                                            x=-1,
-                                            y=5,
-                                            a=False,
-                                            bar=bar_instance)
-    self.assertEquals(foo_instance.name, "Foo")
-    self.assertEquals(foo_instance.x, -1)
-    self.assertEquals(foo_instance.y, 5)
-    self.assertEquals(foo_instance.a, False)
-    self.assertEquals(foo_instance.bar, bar_instance)
-
-  def testPositionalConstructor(self):
-    p = sample_import_mojom.Point()
-    self.assertEquals(p.x, 0)
-    self.assertEquals(p.y, 0)
-
-    p = sample_import_mojom.Point(34)
-    self.assertEquals(p.x, 34)
-    self.assertEquals(p.y, 0)
-
-    p = sample_import_mojom.Point(34, 12)
-    self.assertEquals(p.x, 34)
-    self.assertEquals(p.y, 12)
-
-    p = sample_import_mojom.Point(x=34, y=12)
-    self.assertEquals(p.x, 34)
-    self.assertEquals(p.y, 12)
-
-    p = sample_import_mojom.Point(34, y=12)
-    self.assertEquals(p.x, 34)
-    self.assertEquals(p.y, 12)
-
-    with self.assertRaises(TypeError):
-      p = sample_import_mojom.Point(0, 0, 0)
-    with self.assertRaises(TypeError):
-      p = sample_import_mojom.Point(0, x=0)
-    with self.assertRaises(TypeError):
-      p = sample_import_mojom.Point(c=0)
-
-  def testCyclicDefinition(self):
-    a = regression_tests_mojom.A()
-    b = regression_tests_mojom.B()
-    self.assertIsNone(a.b)
-    self.assertIsNone(b.a)
-    a.b = b
-    self.assertIs(a.b, b)
diff --git a/mojo/python/tests/bindings_structs_version_unittest.py b/mojo/python/tests/bindings_structs_version_unittest.py
deleted file mode 100644
index 231f240..0000000
--- a/mojo/python/tests/bindings_structs_version_unittest.py
+++ /dev/null
@@ -1,150 +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.
-
-import math
-import unittest
-
-import mojo_unittest
-
-# pylint: disable=E0611,F0401
-import mojo_bindings.serialization as serialization
-import mojo_system
-
-# Generated files
-# pylint: disable=F0401
-import rect_mojom
-import test_structs_mojom
-
-
-class StructVersionBindingsTest(mojo_unittest.MojoTestCase):
-
-  def SerializeAndDeserialize(self, target_class, input_instance):
-    (data, handles) = input_instance.Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    return target_class.Deserialize(context)
-
-  def MakeRect(self, factor):
-    return rect_mojom.Rect(
-        x=factor, y=2*factor, width=10*factor, height=20*factor)
-
-  def testOldToNew(self):
-    v0 = test_structs_mojom.MultiVersionStructV0()
-    v0.f_int32 = 123
-    expected = test_structs_mojom.MultiVersionStruct()
-    expected.f_int32 = 123
-
-    output = self.SerializeAndDeserialize(
-        test_structs_mojom.MultiVersionStruct, v0)
-    self.assertEquals(output, expected)
-
-    v1 = test_structs_mojom.MultiVersionStructV1()
-    v1.f_int32 = 123
-    v1.f_rect = self.MakeRect(5)
-    expected = test_structs_mojom.MultiVersionStruct()
-    expected.f_int32 = 123
-    expected.f_rect = self.MakeRect(5)
-
-    output = self.SerializeAndDeserialize(
-        test_structs_mojom.MultiVersionStruct, v1)
-    self.assertEquals(output, expected)
-
-    v3 = test_structs_mojom.MultiVersionStructV3()
-    v3.f_int32 = 123
-    v3.f_rect = self.MakeRect(5)
-    v3.f_string = 'hello'
-    expected = test_structs_mojom.MultiVersionStruct()
-    expected.f_int32 = 123
-    expected.f_rect = self.MakeRect(5)
-    expected.f_string = 'hello'
-
-    output = self.SerializeAndDeserialize(
-        test_structs_mojom.MultiVersionStruct, v3)
-    self.assertEquals(output, expected)
-
-    v5 = test_structs_mojom.MultiVersionStructV5()
-    v5.f_int32 = 123
-    v5.f_rect = self.MakeRect(5)
-    v5.f_string = 'hello'
-    v5.f_array = [10, 9, 8]
-    expected = test_structs_mojom.MultiVersionStruct()
-    expected.f_int32 = 123
-    expected.f_rect = self.MakeRect(5)
-    expected.f_string = 'hello'
-    expected.f_array = [10, 9, 8]
-
-    output = self.SerializeAndDeserialize(
-        test_structs_mojom.MultiVersionStruct, v5)
-    self.assertEquals(output, expected)
-
-    pipe = mojo_system.MessagePipe()
-    v7 = test_structs_mojom.MultiVersionStructV7()
-    v7.f_int32 = 123
-    v7.f_rect = self.MakeRect(5)
-    v7.f_string = 'hello'
-    v7.f_array = [10, 9, 8]
-    v7.f_message_pipe = pipe.handle0
-    v7.f_bool = True
-    expected = test_structs_mojom.MultiVersionStruct()
-    expected.f_int32 = 123
-    expected.f_rect = self.MakeRect(5)
-    expected.f_string = 'hello'
-    expected.f_array = [10, 9, 8]
-    expected.f_message_pipe = pipe.handle0
-    expected.f_bool = True
-
-    output = self.SerializeAndDeserialize(
-        test_structs_mojom.MultiVersionStruct, v7)
-    self.assertEquals(output, expected)
-
-  def testNewToNew(self):
-    pipe = mojo_system.MessagePipe()
-    input_struct = test_structs_mojom.MultiVersionStruct()
-    input_struct.f_int32 = 123
-    input_struct.f_rect = self.MakeRect(5)
-    input_struct.f_string = 'hello'
-    input_struct.f_array = [10, 9, 8]
-    input_struct.f_message_pipe = pipe.handle0
-    input_struct.f_bool = True
-    input_struct.f_int16 = 256
-
-    expected = test_structs_mojom.MultiVersionStructV7()
-    expected.f_int32 = 123
-    expected.f_rect = self.MakeRect(5)
-    expected.f_string = 'hello'
-    expected.f_array = [10, 9, 8]
-    expected.f_message_pipe = pipe.handle0
-    expected.f_bool = True
-    output = self.SerializeAndDeserialize(
-        test_structs_mojom.MultiVersionStructV7, input_struct)
-    self.assertEquals(output, expected)
-
-    expected = test_structs_mojom.MultiVersionStructV5()
-    expected.f_int32 = 123
-    expected.f_rect = self.MakeRect(5)
-    expected.f_string = 'hello'
-    expected.f_array = [10, 9, 8]
-    output = self.SerializeAndDeserialize(
-        test_structs_mojom.MultiVersionStructV5, input_struct)
-    self.assertEquals(output, expected)
-
-    expected = test_structs_mojom.MultiVersionStructV3()
-    expected.f_int32 = 123
-    expected.f_rect = self.MakeRect(5)
-    expected.f_string = 'hello'
-    output = self.SerializeAndDeserialize(
-        test_structs_mojom.MultiVersionStructV3, input_struct)
-    self.assertEquals(output, expected)
-
-    expected = test_structs_mojom.MultiVersionStructV1()
-    expected.f_int32 = 123
-    expected.f_rect = self.MakeRect(5)
-    output = self.SerializeAndDeserialize(
-        test_structs_mojom.MultiVersionStructV1, input_struct)
-    self.assertEquals(output, expected)
-
-    expected = test_structs_mojom.MultiVersionStructV0()
-    expected.f_int32 = 123
-    output = self.SerializeAndDeserialize(
-        test_structs_mojom.MultiVersionStructV0, input_struct)
-    self.assertEquals(output, expected)
diff --git a/mojo/python/tests/bindings_unions_unittest.py b/mojo/python/tests/bindings_unions_unittest.py
deleted file mode 100644
index b1d742f..0000000
--- a/mojo/python/tests/bindings_unions_unittest.py
+++ /dev/null
@@ -1,188 +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.
-
-import struct
-import unittest
-
-# Generated files
-# pylint: disable=F0401
-import test_unions_mojom
-import mojo_bindings.serialization as serialization
-
-class UnionBindingsTest(unittest.TestCase):
-
-  def testBasics(self):
-    u = test_unions_mojom.PodUnion()
-    self.assertTrue(u.IsUnknown())
-
-    u.f_uint32 = 32
-    self.assertEquals(u.f_uint32, 32)
-    self.assertEquals(u.data, 32)
-    self.assertEquals(test_unions_mojom.PodUnion.Tags.f_uint32, u.tag)
-    self.assertFalse(u.IsUnknown())
-
-    u = test_unions_mojom.PodUnion(f_uint8=8)
-    self.assertEquals(u.f_uint8, 8)
-    self.assertEquals(u.data, 8)
-    self.assertEquals(test_unions_mojom.PodUnion.Tags.f_uint8, u.tag)
-
-    with self.assertRaises(TypeError):
-      test_unions_mojom.PodUnion(f_uint8=8, f_int16=10)
-
-    with self.assertRaises(AttributeError):
-      test_unions_mojom.PodUnion(bad_field=10)
-
-    with self.assertRaises(AttributeError):
-      u = test_unions_mojom.PodUnion()
-      u.bad_field = 32
-
-    with self.assertRaises(AttributeError):
-      _ = u.f_uint16
-
-  def testPodUnionSerialization(self):
-    u = test_unions_mojom.PodUnion(f_uint32=32)
-    (data, handles) = u.Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.PodUnion.Deserialize(context)
-
-    self.assertFalse(decoded.IsUnknown())
-    self.assertEquals(u, decoded)
-
-  def testUnionUnknownTag(self):
-    u = test_unions_mojom.NewUnion(f_int16=10)
-    (data, handles) = u.Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.OldUnion.Deserialize(context)
-
-    self.assertTrue(decoded.IsUnknown())
-
-  def testObjectInUnionSerialization(self):
-    u = test_unions_mojom.ObjectUnion(
-        f_dummy=test_unions_mojom.DummyStruct())
-    u.f_dummy.f_int8 = 8
-    (data, handles) = u.Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.ObjectUnion.Deserialize(context)
-
-    self.assertEquals(u, decoded)
-
-  def testObjectInUnionInObjectSerialization(self):
-    s = test_unions_mojom.SmallObjStruct()
-    s.obj_union = test_unions_mojom.ObjectUnion(
-        f_dummy=test_unions_mojom.DummyStruct())
-    s.obj_union.f_dummy.f_int8 = 25
-    (data, handles) = s.Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.SmallObjStruct.Deserialize(context)
-
-    self.assertEquals(s, decoded)
-
-  def testNestedUnionSerialization(self):
-    u = test_unions_mojom.ObjectUnion(
-        f_pod_union=test_unions_mojom.PodUnion(f_int32=32))
-
-    (data, handles) = u.Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.ObjectUnion.Deserialize(context)
-
-    self.assertEquals(u, decoded)
-
-  def testNullableNullObjectInUnionSerialization(self):
-    u =  test_unions_mojom.ObjectUnion(f_nullable=None)
-    (data, handles) = u.Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.ObjectUnion.Deserialize(context)
-
-    self.assertEquals(u, decoded)
-
-  def testNonNullableNullObjectInUnionSerialization(self):
-    u =  test_unions_mojom.ObjectUnion(f_dummy=None)
-    with self.assertRaises(serialization.SerializationException):
-      u.Serialize()
-
-  def testArrayInUnionSerialization(self):
-    u = test_unions_mojom.ObjectUnion(
-        f_array_int8=[1, 2, 3, 4, 5])
-    (data, handles) = u.Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.ObjectUnion.Deserialize(context)
-
-    self.assertEquals(u, decoded)
-
-  def testMapInUnionSerialization(self):
-    u = test_unions_mojom.ObjectUnion(
-        f_map_int8={'one': 1, 'two': 2, 'three': 3})
-    (data, handles) = u.Serialize()
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.ObjectUnion.Deserialize(context)
-
-    self.assertEquals(u, decoded)
-
-  def testUnionInObject(self):
-    s = test_unions_mojom.SmallStruct()
-    s.pod_union = test_unions_mojom.PodUnion(f_uint32=32)
-    (data, handles) = s.Serialize()
-
-    # This is where the data should be serialized to.
-    size, tag, value = struct.unpack_from('<IIQ', buffer(data), 16)
-    self.assertEquals(16, size)
-    self.assertEquals(6, tag)
-    self.assertEquals(32, value)
-
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.SmallStruct.Deserialize(context)
-
-    self.assertEquals(s, decoded)
-
-  def testUnionInArray(self):
-    s = test_unions_mojom.SmallStruct()
-    s.pod_union_array = [
-        test_unions_mojom.PodUnion(f_uint32=32),
-        test_unions_mojom.PodUnion(f_uint16=16),
-        test_unions_mojom.PodUnion(f_uint64=64),
-        ]
-    (data, handles) = s.Serialize()
-
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.SmallStruct.Deserialize(context)
-
-    self.assertEquals(s, decoded)
-
-  def testNonNullableNullUnionInArray(self):
-    s = test_unions_mojom.SmallStruct()
-    s.pod_union_array = [
-        test_unions_mojom.PodUnion(f_uint32=32),
-        None,
-        test_unions_mojom.PodUnion(f_uint64=64),
-        ]
-    with self.assertRaises(serialization.SerializationException):
-      s.Serialize()
-
-  def testNullableNullUnionInArray(self):
-    s = test_unions_mojom.SmallStruct()
-    s.nullable_pod_union_array = [
-        test_unions_mojom.PodUnion(f_uint32=32),
-        None,
-        test_unions_mojom.PodUnion(f_uint64=64),
-        ]
-    (data, handles) = s.Serialize()
-
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.SmallStruct.Deserialize(context)
-
-    self.assertEquals(s, decoded)
-
-  def testUnionInMap(self):
-    s = test_unions_mojom.SmallStruct()
-    s.pod_union_map = {
-        'f_uint32': test_unions_mojom.PodUnion(f_uint32=32),
-        'f_uint16': test_unions_mojom.PodUnion(f_uint16=16),
-        'f_uint64': test_unions_mojom.PodUnion(f_uint64=64),
-        }
-    (data, handles) = s.Serialize()
-
-    context = serialization.RootDeserializationContext(data, handles)
-    decoded = test_unions_mojom.SmallStruct.Deserialize(context)
-
-    self.assertEquals(s, decoded)
diff --git a/mojo/python/tests/data_pipe_utils_unittest.py b/mojo/python/tests/data_pipe_utils_unittest.py
deleted file mode 100644
index b6bc9fa..0000000
--- a/mojo/python/tests/data_pipe_utils_unittest.py
+++ /dev/null
@@ -1,96 +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.
-
-import random
-
-import mojo_unittest
-from mojo_bindings import promise
-
-# pylint: disable=F0401
-import mojo_system as system
-
-# pylint: disable=F0401
-from mojo_utils import data_pipe_utils
-
-
-def _GetRandomBuffer(size):
-  random.seed(size)
-  return bytearray(''.join(chr(random.randint(0, 255)) for i in xrange(size)))
-
-
-class DataPipeCopyTest(mojo_unittest.MojoTestCase):
-  def setUp(self):
-    super(DataPipeCopyTest, self).setUp()
-    self.handles = system.DataPipe()
-    self.error = None
-
-  def tearDown(self):
-    self.handles = None
-    super(DataPipeCopyTest, self).tearDown()
-
-  def _writeDataAndClose(self, handle, data):
-    status, num_bytes_written = handle.WriteData(data)
-    handle.Close()
-    self.assertEquals(system.RESULT_OK, status)
-    self.assertEquals(len(data), num_bytes_written)
-
-  def _copyDataFromPipe(self, handle, expected_data,
-                        deadline=system.DEADLINE_INDEFINITE):
-    self._VerifyDataCopied(data_pipe_utils.CopyFromDataPipe(
-         handle, deadline), expected_data).Catch(self._CatchError)
-
-  def _CatchError(self, error):
-    if self.loop:
-      self.loop.Quit()
-    self.error = error
-
-  @promise.async
-  def _VerifyDataCopied(self, data, expected_data):
-    self.assertEquals(expected_data, data)
-    self.loop.Quit()
-
-  def _runAndCheckError(self):
-    self.loop.Run()
-    if self.error:
-      # pylint: disable=E0702
-      raise self.error
-
-  def _testEagerWrite(self, data):
-    self._writeDataAndClose(self.handles.producer_handle, data)
-    self._copyDataFromPipe(self.handles.consumer_handle, data)
-    self._runAndCheckError()
-
-  def _testDelayedWrite(self, data):
-    self._copyDataFromPipe(self.handles.consumer_handle, data)
-    self._writeDataAndClose(self.handles.producer_handle, data)
-    self._runAndCheckError()
-
-  def testTimeout(self):
-    self._copyDataFromPipe(self.handles.consumer_handle, bytearray(),
-                           deadline=100)
-    with self.assertRaises(data_pipe_utils.DataPipeCopyException):
-      self._runAndCheckError()
-
-  def testCloseProducerWithoutWriting(self):
-    self._copyDataFromPipe(self.handles.consumer_handle, bytearray())
-    self.handles.producer_handle.Close()
-    self._runAndCheckError()
-
-  def testEagerWriteOfEmptyData(self):
-    self._testEagerWrite(bytearray())
-
-  def testDelayedWriteOfEmptyData(self):
-    self._testDelayedWrite(bytearray())
-
-  def testEagerWriteOfNonEmptyData(self):
-    self._testEagerWrite(_GetRandomBuffer(1024))
-
-  def testDelayedWriteOfNonEmptyData(self):
-    self._testDelayedWrite(_GetRandomBuffer(1024))
-
-  def testEagerWriteOfLargeBuffer(self):
-    self._testEagerWrite(_GetRandomBuffer(32 * 1024))
-
-  def testDelayedWriteOfLargeBuffer(self):
-    self._testDelayedWrite(_GetRandomBuffer(32 * 1024))
diff --git a/mojo/python/tests/generation_unittest.py b/mojo/python/tests/generation_unittest.py
deleted file mode 100644
index 0282ae5..0000000
--- a/mojo/python/tests/generation_unittest.py
+++ /dev/null
@@ -1,37 +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.
-
-import mojo_unittest
-from mojo_bindings import reflection
-from mojo_bindings import interface_reflection
-
-
-class GenerationTest(mojo_unittest.MojoTestCase):
-
-  TEST_PACKAGES = [
-    'math_calculator_mojom',
-    'no_module_mojom',
-    'rect_mojom',
-    'regression_tests_mojom',
-    'sample_factory_mojom',
-    'sample_import2_mojom',
-    'sample_import_mojom',
-    'sample_interfaces_mojom',
-    'sample_service_mojom',
-    'serialization_test_structs_mojom',
-    'test_structs_mojom',
-    'validation_test_interfaces_mojom',
-  ]
-
-  @staticmethod
-  def testGeneration():
-    buildable_types = (reflection.MojoStructType,
-                       interface_reflection.MojoInterfaceType)
-    for module_name in GenerationTest.TEST_PACKAGES:
-      module = __import__(module_name)
-      for element_name in dir(module):
-        element = getattr(module, element_name)
-        if isinstance(element, buildable_types):
-          # Check struct and interface are buildable
-          element()
diff --git a/mojo/python/tests/messaging_unittest.py b/mojo/python/tests/messaging_unittest.py
deleted file mode 100644
index c5d6a2b..0000000
--- a/mojo/python/tests/messaging_unittest.py
+++ /dev/null
@@ -1,218 +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.
-
-import unittest
-
-import mojo_unittest
-from mojo_bindings import messaging
-
-# pylint: disable=E0611
-import mojo_system as system
-
-
-class _ForwardingConnectionErrorHandler(messaging.ConnectionErrorHandler):
-
-  def __init__(self, callback):
-    messaging.ConnectionErrorHandler.__init__(self)
-    self._callback = callback
-
-  def OnError(self, result):
-    self._callback(result)
-
-
-class ConnectorTest(mojo_unittest.MojoTestCase):
-
-  def setUp(self):
-    super(ConnectorTest, self).setUp()
-    self.received_messages = []
-    self.received_errors = []
-    def _OnMessage(message):
-      self.received_messages.append(message)
-      return True
-    def _OnError(result):
-      self.received_errors.append(result)
-    handles = system.MessagePipe()
-    self.connector = messaging.Connector(handles.handle1)
-    self.connector.SetIncomingMessageReceiver(
-        messaging.ForwardingMessageReceiver(_OnMessage))
-    self.connector.SetErrorHandler(
-        _ForwardingConnectionErrorHandler(_OnError))
-    self.connector.Start()
-    self.handle = handles.handle0
-
-
-  def tearDown(self):
-    self.connector = None
-    self.handle = None
-    self.received_messages = []
-    self.received_errors = []
-    super(ConnectorTest, self).tearDown()
-
-  def testConnectorRead(self):
-    self.handle.WriteMessage()
-    self.loop.RunUntilIdle()
-    self.assertTrue(self.received_messages)
-    self.assertFalse(self.received_errors)
-
-  def testConnectorWrite(self):
-    self.connector.Accept(messaging.Message())
-    (result, _, _) = self.handle.ReadMessage()
-    self.assertEquals(result, system.RESULT_OK)
-    self.assertFalse(self.received_errors)
-
-  def testConnectorCloseRemoteHandle(self):
-    self.handle.Close()
-    self.loop.RunUntilIdle()
-    self.assertFalse(self.received_messages)
-    self.assertTrue(self.received_errors)
-    self.assertEquals(self.received_errors[0],
-                      system.RESULT_FAILED_PRECONDITION)
-
-  def testConnectorDeleteConnector(self):
-    self.connector = None
-    (result, _, _) = self.handle.ReadMessage()
-    self.assertEquals(result, system.RESULT_FAILED_PRECONDITION)
-
-  def testConnectorWriteHandle(self):
-    new_handles = system.MessagePipe()
-    self.handle.WriteMessage(None, [new_handles.handle0])
-    self.loop.RunUntilIdle()
-    self.assertTrue(self.received_messages)
-    self.assertTrue(self.received_messages[0].handles)
-    self.assertFalse(self.received_errors)
-
-
-class HeaderTest(unittest.TestCase):
-
-  def testSimpleMessageHeader(self):
-    header = messaging.MessageHeader(0xdeadbeaf, messaging.NO_FLAG)
-    self.assertEqual(header.message_type, 0xdeadbeaf)
-    self.assertFalse(header.has_request_id)
-    self.assertFalse(header.expects_response)
-    self.assertFalse(header.is_response)
-    data = header.Serialize()
-    other_header = messaging.MessageHeader.Deserialize(data)
-    self.assertEqual(other_header.message_type, 0xdeadbeaf)
-    self.assertFalse(other_header.has_request_id)
-    self.assertFalse(other_header.expects_response)
-    self.assertFalse(other_header.is_response)
-
-  def testMessageHeaderWithRequestID(self):
-    # Request message.
-    header = messaging.MessageHeader(0xdeadbeaf,
-                                     messaging.MESSAGE_EXPECTS_RESPONSE_FLAG)
-
-    self.assertEqual(header.message_type, 0xdeadbeaf)
-    self.assertTrue(header.has_request_id)
-    self.assertTrue(header.expects_response)
-    self.assertFalse(header.is_response)
-    self.assertEqual(header.request_id, 0)
-
-    data = header.Serialize()
-    other_header = messaging.MessageHeader.Deserialize(data)
-
-    self.assertEqual(other_header.message_type, 0xdeadbeaf)
-    self.assertTrue(other_header.has_request_id)
-    self.assertTrue(other_header.expects_response)
-    self.assertFalse(other_header.is_response)
-    self.assertEqual(other_header.request_id, 0)
-
-    header.request_id = 0xdeadbeafdeadbeaf
-    data = header.Serialize()
-    other_header = messaging.MessageHeader.Deserialize(data)
-
-    self.assertEqual(other_header.request_id, 0xdeadbeafdeadbeaf)
-
-    # Response message.
-    header = messaging.MessageHeader(0xdeadbeaf,
-                                     messaging.MESSAGE_IS_RESPONSE_FLAG,
-                                     0xdeadbeafdeadbeaf)
-
-    self.assertEqual(header.message_type, 0xdeadbeaf)
-    self.assertTrue(header.has_request_id)
-    self.assertFalse(header.expects_response)
-    self.assertTrue(header.is_response)
-    self.assertEqual(header.request_id, 0xdeadbeafdeadbeaf)
-
-    data = header.Serialize()
-    other_header = messaging.MessageHeader.Deserialize(data)
-
-    self.assertEqual(other_header.message_type, 0xdeadbeaf)
-    self.assertTrue(other_header.has_request_id)
-    self.assertFalse(other_header.expects_response)
-    self.assertTrue(other_header.is_response)
-    self.assertEqual(other_header.request_id, 0xdeadbeafdeadbeaf)
-
-
-class RouterTest(mojo_unittest.MojoTestCase):
-
-  def setUp(self):
-    super(RouterTest, self).setUp()
-    self.received_messages = []
-    self.received_errors = []
-    def _OnMessage(message):
-      self.received_messages.append(message)
-      return True
-    def _OnError(result):
-      self.received_errors.append(result)
-    handles = system.MessagePipe()
-    self.router = messaging.Router(handles.handle1)
-    self.router.SetIncomingMessageReceiver(
-        messaging.ForwardingMessageReceiver(_OnMessage))
-    self.router.SetErrorHandler(
-        _ForwardingConnectionErrorHandler(_OnError))
-    self.router.Start()
-    self.handle = handles.handle0
-
-  def tearDown(self):
-    self.router = None
-    self.handle = None
-    super(RouterTest, self).tearDown()
-
-  def testSimpleMessage(self):
-    header_data = messaging.MessageHeader(0, messaging.NO_FLAG).Serialize()
-    message = messaging.Message(header_data)
-    self.router.Accept(message)
-    self.loop.RunUntilIdle()
-    self.assertFalse(self.received_errors)
-    self.assertFalse(self.received_messages)
-    (res, data, _) = self.handle.ReadMessage(bytearray(len(header_data)))
-    self.assertEquals(system.RESULT_OK, res)
-    self.assertEquals(data[0], header_data)
-
-  def testSimpleReception(self):
-    header_data = messaging.MessageHeader(0, messaging.NO_FLAG).Serialize()
-    self.handle.WriteMessage(header_data)
-    self.loop.RunUntilIdle()
-    self.assertFalse(self.received_errors)
-    self.assertEquals(len(self.received_messages), 1)
-    self.assertEquals(self.received_messages[0].data, header_data)
-
-  def testRequestResponse(self):
-    header_data = messaging.MessageHeader(
-        0, messaging.MESSAGE_EXPECTS_RESPONSE_FLAG).Serialize()
-    message = messaging.Message(header_data)
-    back_messages = []
-    def OnBackMessage(message):
-      back_messages.append(message)
-      return True
-    self.router.AcceptWithResponder(message,
-                                    messaging.ForwardingMessageReceiver(
-                                        OnBackMessage))
-    self.loop.RunUntilIdle()
-    self.assertFalse(self.received_errors)
-    self.assertFalse(self.received_messages)
-    (res, data, _) = self.handle.ReadMessage(bytearray(len(header_data)))
-    self.assertEquals(system.RESULT_OK, res)
-    message_header = messaging.MessageHeader.Deserialize(data[0])
-    self.assertNotEquals(message_header.request_id, 0)
-    response_header_data = messaging.MessageHeader(
-        0,
-        messaging.MESSAGE_IS_RESPONSE_FLAG,
-        message_header.request_id).Serialize()
-    self.handle.WriteMessage(response_header_data)
-    self.loop.RunUntilIdle()
-    self.assertFalse(self.received_errors)
-    self.assertEquals(len(back_messages), 1)
-    self.assertEquals(back_messages[0].data, response_header_data)
diff --git a/mojo/python/tests/mojo_unittest.py b/mojo/python/tests/mojo_unittest.py
deleted file mode 100644
index fc921ac..0000000
--- a/mojo/python/tests/mojo_unittest.py
+++ /dev/null
@@ -1,24 +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.
-
-import unittest
-
-# pylint: disable=E0611,F0401
-import mojo_embedder
-import mojo_system
-
-
-class MojoTestCase(unittest.TestCase):
-  def __init__(self, *args, **kwargs):
-    unittest.TestCase.__init__(self, *args, **kwargs)
-    self.loop = None
-
-  def run(self, *args, **kwargs):
-    try:
-      mojo_embedder.Init()
-      self.loop = mojo_system.RunLoop()
-      unittest.TestCase.run(self, *args, **kwargs)
-    finally:
-      self.loop = None
-      assert mojo_embedder.ShutdownForTest()
diff --git a/mojo/python/tests/promise_unittest.py b/mojo/python/tests/promise_unittest.py
deleted file mode 100644
index bb85f5a..0000000
--- a/mojo/python/tests/promise_unittest.py
+++ /dev/null
@@ -1,238 +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.
-
-import unittest
-
-# pylint: disable=F0401
-from mojo_bindings import promise
-
-
-class PromiseTest(unittest.TestCase):
-
-  def setUp(self):
-    self.accumulated = []
-
-  def _AddToAccumulated(self, res):
-    self.accumulated.append(res)
-    return res
-
-  def testResolve(self):
-    p = promise.Promise.Resolve(0)
-    self.assertEquals(p.state, promise.Promise.STATE_FULLFILLED)
-    p.Then(self._AddToAccumulated)
-    self.assertEquals(self.accumulated, [0])
-
-  def testResolveToPromise(self):
-    p = promise.Promise.Resolve(0)
-    self.assertEquals(p.state, promise.Promise.STATE_FULLFILLED)
-    q = promise.Promise.Resolve(p)
-    self.assertEquals(p.state, promise.Promise.STATE_FULLFILLED)
-    q.Then(self._AddToAccumulated)
-    self.assertEquals(self.accumulated, [0])
-
-  def testReject(self):
-    p = promise.Promise.Reject(0)
-    self.assertEquals(p.state, promise.Promise.STATE_REJECTED)
-    p.Then(onRejected=self._AddToAccumulated)
-    self.assertEquals(self.accumulated, [0])
-
-  def testGeneratorFunctionResolve(self):
-    (p, resolve, _) = _GetPromiseAndFunctions()
-    self.assertEquals(p.state, promise.Promise.STATE_PENDING)
-    p.Then(self._AddToAccumulated)
-    resolve(0)
-    self.assertEquals(p.state, promise.Promise.STATE_FULLFILLED)
-    self.assertEquals(self.accumulated, [0])
-
-  def testGeneratorFunctionReject(self):
-    (p, _, reject) = _GetPromiseAndFunctions()
-    self.assertEquals(p.state, promise.Promise.STATE_PENDING)
-    p.Then(None, self._AddToAccumulated)
-    reject(0)
-    self.assertEquals(p.state, promise.Promise.STATE_REJECTED)
-    self.assertEquals(self.accumulated, [0])
-
-  def testGeneratorFunctionResolveToPromise(self):
-    (p1, resolve, _) = _GetPromiseAndFunctions()
-    p2 = promise.Promise(lambda x, y: x(p1))
-    self.assertEquals(p2.state, promise.Promise.STATE_PENDING)
-    p2.Then(self._AddToAccumulated)
-    resolve(promise.Promise.Resolve(0))
-    self.assertEquals(self.accumulated, [0])
-
-  def testComputation(self):
-    (p, resolve, _) = _GetPromiseAndFunctions()
-    p.Then(lambda x: x+1).Then(lambda x: x+2).Then(self._AddToAccumulated)
-    self.assertEquals(self.accumulated, [])
-    resolve(0)
-    self.assertEquals(self.accumulated, [3])
-
-  def testRecoverAfterException(self):
-    (p, resolve, _) = _GetPromiseAndFunctions()
-    q = p.Then(_ThrowException).Catch(self._AddToAccumulated)
-    self.assertEquals(self.accumulated, [])
-    resolve(0)
-    self.assertEquals(q.state, promise.Promise.STATE_FULLFILLED)
-    self.assertEquals(len(self.accumulated), 1)
-    self.assertIsInstance(self.accumulated[0], RuntimeError)
-    self.assertEquals(self.accumulated[0].message, 0)
-
-  def testMultipleRejectResolve(self):
-    (p, resolve, reject) = _GetPromiseAndFunctions()
-    p.Then(self._AddToAccumulated, self._AddToAccumulated)
-    resolve(0)
-    self.assertEquals(self.accumulated, [0])
-    resolve(0)
-    self.assertEquals(self.accumulated, [0])
-    reject(0)
-    self.assertEquals(self.accumulated, [0])
-
-    self.accumulated = []
-    (p, resolve, reject) = _GetPromiseAndFunctions()
-    p.Then(self._AddToAccumulated, self._AddToAccumulated)
-    reject(0)
-    self.assertEquals(self.accumulated, [0])
-    resolve(0)
-    self.assertEquals(self.accumulated, [0])
-    reject(0)
-    self.assertEquals(self.accumulated, [0])
-
-  def testAll(self):
-    promises_and_functions = [_GetPromiseAndFunctions() for x in xrange(10)]
-    promises = [x[0] for x in promises_and_functions]
-    all_promise = promise.Promise.All(*promises)
-    res = []
-    def AddToRes(values):
-      res.append(values)
-    all_promise.Then(AddToRes, AddToRes)
-    for i, (_, resolve, _) in enumerate(promises_and_functions):
-      self.assertEquals(len(res), 0)
-      resolve(i)
-    self.assertEquals(len(res), 1)
-    self.assertEquals(res[0], [i for i in xrange(10)])
-    self.assertEquals(all_promise.state, promise.Promise.STATE_FULLFILLED)
-
-  def testAllFailure(self):
-    promises_and_functions = [_GetPromiseAndFunctions() for x in xrange(10)]
-    promises = [x[0] for x in promises_and_functions]
-    all_promise = promise.Promise.All(*promises)
-    res = []
-    def AddToRes(values):
-      res.append(values)
-    all_promise.Then(AddToRes, AddToRes)
-    for i in xrange(10):
-      if i <= 5:
-        self.assertEquals(len(res), 0)
-      else:
-        self.assertEquals(len(res), 1)
-      if i != 5:
-        promises_and_functions[i][1](i)
-      else:
-        promises_and_functions[i][2]('error')
-    self.assertEquals(len(res), 1)
-    self.assertEquals(res[0], 'error')
-    self.assertEquals(all_promise.state, promise.Promise.STATE_REJECTED)
-
-  def testRace(self):
-    promises_and_functions = [_GetPromiseAndFunctions() for x in xrange(10)]
-    promises = [x[0] for x in promises_and_functions]
-    race_promise = promise.Promise.Race(*promises)
-    res = []
-    def AddToRes(values):
-      res.append(values)
-    race_promise.Then(AddToRes, AddToRes)
-    self.assertEquals(len(res), 0)
-    promises_and_functions[7][1]('success')
-    self.assertEquals(len(res), 1)
-    for i, (f) in enumerate(promises_and_functions):
-      f[1 + (i % 2)](i)
-    self.assertEquals(len(res), 1)
-    self.assertEquals(res[0], 'success')
-    self.assertEquals(race_promise.state, promise.Promise.STATE_FULLFILLED)
-
-  def testRaceFailure(self):
-    promises_and_functions = [_GetPromiseAndFunctions() for x in xrange(10)]
-    promises = [x[0] for x in promises_and_functions]
-    race_promise = promise.Promise.Race(*promises)
-    res = []
-    def AddToRes(values):
-      res.append(values)
-    race_promise.Then(AddToRes, AddToRes)
-    self.assertEquals(len(res), 0)
-    promises_and_functions[7][2]('error')
-    self.assertEquals(len(res), 1)
-    for i, (f) in enumerate(promises_and_functions):
-      f[1 + (i % 2)](i)
-    self.assertEquals(len(res), 1)
-    self.assertEquals(res[0], 'error')
-    self.assertEquals(race_promise.state, promise.Promise.STATE_REJECTED)
-
-  def testAsync(self):
-    @promise.async
-    def ComputeAdd(*values, **kwvalues):
-      return sum(values) + sum(kwvalues.values())
-    res = []
-    def AddToRes(values):
-      res.append(values)
-
-    # Simple test.
-    ComputeAdd(1, 2, foo=3).Then(AddToRes)
-    self.assertEquals(res, [6])
-
-    # Resolve promises
-    res = []
-    promises_and_functions = [_GetPromiseAndFunctions() for x in xrange(10)]
-    promises = [x[0] for x in promises_and_functions]
-    dict_promises = dict(zip(map(str, xrange(10)), promises))
-    add_promise = ComputeAdd(*promises, **dict_promises).Then(AddToRes)
-    self.assertEquals(len(res), 0)
-    self.assertEquals(add_promise.state, promise.Promise.STATE_PENDING)
-    for _, r, _ in promises_and_functions:
-      r(1)
-    self.assertEquals(res, [20])
-    self.assertEquals(add_promise.state, promise.Promise.STATE_FULLFILLED)
-
-    # Fail promise
-    res = []
-    promises_and_functions = [_GetPromiseAndFunctions() for x in xrange(10)]
-    promises = [x[0] for x in promises_and_functions]
-    add_promise = ComputeAdd(*promises).Then(AddToRes).Catch(AddToRes)
-    self.assertEquals(len(res), 0)
-    self.assertEquals(add_promise.state, promise.Promise.STATE_PENDING)
-    promises_and_functions[7][2]('error')
-    self.assertEquals(res, ['error'])
-    self.assertEquals(add_promise.state, promise.Promise.STATE_FULLFILLED)
-
-
-  def testAttributeGetter(self):
-    class MyObject(object):
-      def __init__(self):
-        self.value = 0
-      def GetValue(self, value=None):
-        return value
-    p = promise.Promise.Resolve(MyObject())
-    res = []
-    def AddToRes(values):
-      res.append(values)
-
-    p.value.Then(AddToRes)
-    p.GetValue(promise.Promise.Resolve(1)).Then(AddToRes)
-    self.assertEquals(res, [0, 1])
-
-    res = []
-    p.GetTwo().Catch(AddToRes)
-    self.assertEquals(len(res), 1)
-
-
-def _GetPromiseAndFunctions():
-  functions = {}
-  def GeneratorFunction(resolve, reject):
-    functions['resolve'] = resolve
-    functions['reject'] = reject
-  p = promise.Promise(GeneratorFunction)
-  return (p, functions['resolve'], functions['reject'])
-
-
-def _ThrowException(x):
-  raise RuntimeError(x)
diff --git a/mojo/python/tests/runloop_unittest.py b/mojo/python/tests/runloop_unittest.py
deleted file mode 100644
index c471ea9..0000000
--- a/mojo/python/tests/runloop_unittest.py
+++ /dev/null
@@ -1,41 +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.
-
-import mojo_unittest
-
-# pylint: disable=E0611
-import mojo_system as system
-
-
-def _Increment(array):
-  def _Closure():
-    array.append(0)
-  return _Closure
-
-
-class RunLoopTest(mojo_unittest.MojoTestCase):
-
-  def testRunLoop(self):
-    array = []
-    for _ in xrange(10):
-      self.loop.PostDelayedTask(_Increment(array))
-    self.loop.RunUntilIdle()
-    self.assertEquals(len(array), 10)
-
-  def testRunLoopWithException(self):
-    def Throw():
-      raise Exception("error")
-    array = []
-    self.loop.PostDelayedTask(Throw)
-    self.loop.PostDelayedTask(_Increment(array))
-    with self.assertRaisesRegexp(Exception, '^error$'):
-      self.loop.Run()
-    self.assertEquals(len(array), 0)
-    self.loop.RunUntilIdle()
-    self.assertEquals(len(array), 1)
-
-  def testCurrent(self):
-    self.assertEquals(system.RunLoop.Current(), self.loop)
-    self.loop = None
-    self.assertIsNone(system.RunLoop.Current())
diff --git a/mojo/python/tests/system_unittest.py b/mojo/python/tests/system_unittest.py
deleted file mode 100644
index 7a3febc..0000000
--- a/mojo/python/tests/system_unittest.py
+++ /dev/null
@@ -1,327 +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.
-
-import random
-import time
-
-import mojo_unittest
-
-# pylint: disable=E0611
-import mojo_system as system
-
-DATA_SIZE = 1024
-
-
-def _GetRandomBuffer(size):
-  random.seed(size)
-  return bytearray(''.join(chr(random.randint(0, 255)) for i in xrange(size)))
-
-
-class CoreTest(mojo_unittest.MojoTestCase):
-
-  HANDLE_SIGNAL_READWRITABLE = (system.HANDLE_SIGNAL_READABLE |
-      system.HANDLE_SIGNAL_WRITABLE)
-  HANDLE_SIGNAL_ALL = (system.HANDLE_SIGNAL_READABLE |
-      system.HANDLE_SIGNAL_WRITABLE | system.HANDLE_SIGNAL_PEER_CLOSED)
-
-  def testResults(self):
-    self.assertEquals(system.RESULT_OK, 0)
-    self.assertGreater(system.RESULT_CANCELLED, 0)
-    self.assertGreater(system.RESULT_UNKNOWN, 0)
-    self.assertGreater(system.RESULT_INVALID_ARGUMENT, 0)
-    self.assertGreater(system.RESULT_DEADLINE_EXCEEDED, 0)
-    self.assertGreater(system.RESULT_NOT_FOUND, 0)
-    self.assertGreater(system.RESULT_ALREADY_EXISTS, 0)
-    self.assertGreater(system.RESULT_PERMISSION_DENIED, 0)
-    self.assertGreater(system.RESULT_RESOURCE_EXHAUSTED, 0)
-    self.assertGreater(system.RESULT_FAILED_PRECONDITION, 0)
-    self.assertGreater(system.RESULT_ABORTED, 0)
-    self.assertGreater(system.RESULT_OUT_OF_RANGE, 0)
-    self.assertGreater(system.RESULT_UNIMPLEMENTED, 0)
-    self.assertGreater(system.RESULT_INTERNAL, 0)
-    self.assertGreater(system.RESULT_UNAVAILABLE, 0)
-    self.assertGreater(system.RESULT_DATA_LOSS, 0)
-    self.assertGreater(system.RESULT_BUSY, 0)
-    self.assertGreater(system.RESULT_SHOULD_WAIT, 0)
-
-  def testConstants(self):
-    self.assertGreaterEqual(system.DEADLINE_INDEFINITE, 0)
-    self.assertGreaterEqual(system.HANDLE_SIGNAL_NONE, 0)
-    self.assertGreaterEqual(system.HANDLE_SIGNAL_READABLE, 0)
-    self.assertGreaterEqual(system.HANDLE_SIGNAL_WRITABLE, 0)
-    self.assertGreaterEqual(system.HANDLE_SIGNAL_PEER_CLOSED, 0)
-    self.assertGreaterEqual(system.WRITE_MESSAGE_FLAG_NONE, 0)
-    self.assertGreaterEqual(system.READ_MESSAGE_FLAG_NONE, 0)
-    self.assertGreaterEqual(system.READ_MESSAGE_FLAG_MAY_DISCARD, 0)
-    self.assertGreaterEqual(system.WRITE_DATA_FLAG_NONE, 0)
-    self.assertGreaterEqual(system.WRITE_DATA_FLAG_ALL_OR_NONE, 0)
-    self.assertGreaterEqual(system.READ_DATA_FLAG_NONE, 0)
-    self.assertGreaterEqual(system.READ_DATA_FLAG_ALL_OR_NONE, 0)
-    self.assertGreaterEqual(system.READ_DATA_FLAG_DISCARD, 0)
-    self.assertGreaterEqual(system.READ_DATA_FLAG_QUERY, 0)
-    self.assertGreaterEqual(system.READ_DATA_FLAG_PEEK, 0)
-    self.assertGreaterEqual(system.MAP_BUFFER_FLAG_NONE, 0)
-
-  def testGetTimeTicksNow(self):
-    v1 = system.GetTimeTicksNow()
-    time.sleep(1e-3)
-    v2 = system.GetTimeTicksNow()
-    self.assertGreater(v1, 0)
-    self.assertGreater(v2, v1 + 1e2)
-    self.assertLess(v2, v1 + 1e5)
-
-  def _testHandlesCreation(self, *args):
-    for handle in args:
-      self.assertTrue(handle.IsValid())
-      handle.Close()
-      self.assertFalse(handle.IsValid())
-
-  def _TestMessageHandleCreation(self, handles):
-    self._testHandlesCreation(handles.handle0, handles.handle1)
-
-  def testCreateMessagePipe(self):
-    self._TestMessageHandleCreation(system.MessagePipe())
-
-  def testCreateMessagePipeWithNoneOptions(self):
-    self._TestMessageHandleCreation(system.MessagePipe(None))
-
-  def testCreateMessagePipeWithOptions(self):
-    self._TestMessageHandleCreation(
-        system.MessagePipe(system.CreateMessagePipeOptions()))
-
-  def testWaitOverMessagePipe(self):
-    handles = system.MessagePipe()
-    handle = handles.handle0
-
-    (res, states) = handle.Wait(
-        system.HANDLE_SIGNAL_WRITABLE, system.DEADLINE_INDEFINITE)
-    self.assertEquals(system.RESULT_OK, res)
-    self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[0])
-    self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1])
-
-    (res, states) = handle.Wait(system.HANDLE_SIGNAL_READABLE, 0)
-    self.assertEquals(system.RESULT_DEADLINE_EXCEEDED, res)
-    self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[0])
-    self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1])
-
-    handles.handle1.WriteMessage()
-
-    (res, states) = handle.Wait(
-            system.HANDLE_SIGNAL_READABLE,
-            system.DEADLINE_INDEFINITE)
-    self.assertEquals(system.RESULT_OK, res)
-    self.assertEquals(CoreTest.HANDLE_SIGNAL_READWRITABLE, states[0])
-    self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1])
-
-  def testWaitInvalidArgument(self):
-    (res, index, states) = system.WaitMany(
-            [(system.Handle(0), system.HANDLE_SIGNAL_WRITABLE),
-             (system.Handle(0), system.HANDLE_SIGNAL_WRITABLE)],
-            system.DEADLINE_INDEFINITE)
-    self.assertEquals(system.RESULT_INVALID_ARGUMENT, res)
-    self.assertEquals(0, index)
-    self.assertEquals(states, None)
-
-  def testWaitOverManyMessagePipe(self):
-    handles = system.MessagePipe()
-    handle0 = handles.handle0
-    handle1 = handles.handle1
-
-    (res, index, states) = system.WaitMany(
-            [(handle0, system.HANDLE_SIGNAL_WRITABLE),
-             (handle1, system.HANDLE_SIGNAL_WRITABLE)],
-            system.DEADLINE_INDEFINITE)
-    self.assertEquals(system.RESULT_OK, res)
-    self.assertEquals(0, index)
-    self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[0][0])
-    self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[0][1])
-    self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[1][0])
-    self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1][1])
-
-    (res, index, states) = system.WaitMany(
-            [(handle0, system.HANDLE_SIGNAL_READABLE),
-             (handle1, system.HANDLE_SIGNAL_READABLE)], 0)
-    self.assertEquals(system.RESULT_DEADLINE_EXCEEDED, res)
-    self.assertEquals(None, index)
-    self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[0][0])
-    self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[0][1])
-    self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[1][0])
-    self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1][1])
-
-    handle0.WriteMessage()
-
-    (res, index, states) = system.WaitMany(
-            [(handle0, system.HANDLE_SIGNAL_READABLE),
-             (handle1, system.HANDLE_SIGNAL_READABLE)],
-            system.DEADLINE_INDEFINITE)
-    self.assertEquals(system.RESULT_OK, res)
-    self.assertEquals(1, index)
-    self.assertEquals(system.HANDLE_SIGNAL_WRITABLE, states[0][0])
-    self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[0][1])
-    self.assertEquals(CoreTest.HANDLE_SIGNAL_READWRITABLE, states[1][0])
-    self.assertEquals(CoreTest.HANDLE_SIGNAL_ALL, states[1][1])
-
-  def testSendBytesOverMessagePipe(self):
-    handles = system.MessagePipe()
-    data = _GetRandomBuffer(DATA_SIZE)
-    handles.handle0.WriteMessage(data)
-    (res, buffers, next_message) = handles.handle1.ReadMessage()
-    self.assertEquals(system.RESULT_RESOURCE_EXHAUSTED, res)
-    self.assertEquals(None, buffers)
-    self.assertEquals((DATA_SIZE, 0), next_message)
-    result = bytearray(DATA_SIZE)
-    (res, buffers, next_message) = handles.handle1.ReadMessage(result)
-    self.assertEquals(system.RESULT_OK, res)
-    self.assertEquals(None, next_message)
-    self.assertEquals((data, []), buffers)
-
-  def testSendEmptyDataOverMessagePipe(self):
-    handles = system.MessagePipe()
-    handles.handle0.WriteMessage(None)
-    (res, buffers, next_message) = handles.handle1.ReadMessage()
-
-    self.assertEquals(system.RESULT_OK, res)
-    self.assertEquals(None, next_message)
-    self.assertEquals((None, []), buffers)
-
-  def testSendHandleOverMessagePipe(self):
-    handles = system.MessagePipe()
-    handles_to_send = system.MessagePipe()
-    handles.handle0.WriteMessage(handles=[handles_to_send.handle0,
-                                           handles_to_send.handle1])
-    (res, buffers, next_message) = handles.handle1.ReadMessage(
-        max_number_of_handles=2)
-
-    self.assertFalse(handles_to_send.handle0.IsValid())
-    self.assertFalse(handles_to_send.handle1.IsValid())
-    self.assertEquals(system.RESULT_OK, res)
-    self.assertEquals(None, next_message)
-    self.assertEquals(None, buffers[0])
-    self.assertEquals(2, len(buffers[1]))
-
-    handles = buffers[1]
-    for handle in handles:
-      self.assertTrue(handle.IsValid())
-      (res, buffers, next_message) = handle.ReadMessage()
-      self.assertEquals(system.RESULT_SHOULD_WAIT, res)
-
-    for handle in handles:
-      handle.WriteMessage()
-
-    for handle in handles:
-      (res, buffers, next_message) = handle.ReadMessage()
-      self.assertEquals(system.RESULT_OK, res)
-
-  def _TestDataHandleCreation(self, handles):
-    self._testHandlesCreation(
-        handles.producer_handle, handles.consumer_handle)
-
-  def testCreateDataPipe(self):
-    self._TestDataHandleCreation(system.DataPipe())
-
-  def testCreateDataPipeWithNoneOptions(self):
-    self._TestDataHandleCreation(system.DataPipe(None))
-
-  def testCreateDataPipeWithDefaultOptions(self):
-    self._TestDataHandleCreation(
-        system.DataPipe(system.CreateDataPipeOptions()))
-
-  def testCreateDataPipeWithElementSize(self):
-    options = system.CreateDataPipeOptions()
-    options.element_num_bytes = 5
-    self._TestDataHandleCreation(system.DataPipe(options))
-
-  def testCreateDataPipeWithCapacity(self):
-    options = system.CreateDataPipeOptions()
-    options.element_capacity_num_bytes = DATA_SIZE
-    self._TestDataHandleCreation(system.DataPipe(options))
-
-  def testCreateDataPipeWithIncorrectParameters(self):
-    options = system.CreateDataPipeOptions()
-    options.element_num_bytes = 5
-    options.capacity_num_bytes = DATA_SIZE
-    with self.assertRaises(system.MojoException) as cm:
-      self._TestDataHandleCreation(system.DataPipe(options))
-    self.assertEquals(system.RESULT_INVALID_ARGUMENT, cm.exception.mojo_result)
-
-  def testSendEmptyDataOverDataPipe(self):
-    pipes = system.DataPipe()
-    self.assertEquals((system.RESULT_OK, 0), pipes.producer_handle.WriteData())
-    self.assertEquals(
-        (system.RESULT_OK, None), pipes.consumer_handle.ReadData())
-
-  def testSendDataOverDataPipe(self):
-    pipes = system.DataPipe()
-    data = _GetRandomBuffer(DATA_SIZE)
-    self.assertEquals((system.RESULT_OK, DATA_SIZE),
-                      pipes.producer_handle.WriteData(data))
-    self.assertEquals((system.RESULT_OK, data),
-                      pipes.consumer_handle.ReadData(
-                          bytearray(DATA_SIZE), system.READ_DATA_FLAG_PEEK))
-    self.assertEquals((system.RESULT_OK, data),
-                      pipes.consumer_handle.ReadData(bytearray(DATA_SIZE)))
-
-  def testTwoPhaseWriteOnDataPipe(self):
-    pipes = system.DataPipe()
-    (res, buf) = pipes.producer_handle.BeginWriteData(DATA_SIZE)
-    self.assertEquals(system.RESULT_OK, res)
-    self.assertGreaterEqual(len(buf.buffer), DATA_SIZE)
-    data = _GetRandomBuffer(DATA_SIZE)
-    buf.buffer[0:DATA_SIZE] = data
-    self.assertEquals(system.RESULT_OK, buf.End(DATA_SIZE))
-    self.assertEquals((system.RESULT_OK, data),
-                      pipes.consumer_handle.ReadData(bytearray(DATA_SIZE)))
-
-  def testTwoPhaseReadOnDataPipe(self):
-    pipes = system.DataPipe()
-    data = _GetRandomBuffer(DATA_SIZE)
-    self.assertEquals((system.RESULT_OK, DATA_SIZE),
-                      pipes.producer_handle.WriteData(data))
-    (res, buf) = pipes.consumer_handle.BeginReadData()
-    self.assertEquals(system.RESULT_OK, res)
-    self.assertEquals(DATA_SIZE, len(buf.buffer))
-    self.assertEquals(data, buf.buffer)
-    self.assertEquals(system.RESULT_OK, buf.End(DATA_SIZE))
-
-  def testCreateSharedBuffer(self):
-    self._testHandlesCreation(system.CreateSharedBuffer(DATA_SIZE))
-
-  def testCreateSharedBufferWithNoneOptions(self):
-    self._testHandlesCreation(system.CreateSharedBuffer(DATA_SIZE, None))
-
-  def testCreateSharedBufferWithDefaultOptions(self):
-    self._testHandlesCreation(
-        system.CreateSharedBuffer(
-            DATA_SIZE,
-            system.CreateSharedBufferOptions()))
-
-  def testDuplicateSharedBuffer(self):
-    handle = system.CreateSharedBuffer(DATA_SIZE)
-    self._testHandlesCreation(handle.Duplicate())
-
-  def testDuplicateSharedBufferWithNoneOptions(self):
-    handle = system.CreateSharedBuffer(DATA_SIZE)
-    self._testHandlesCreation(handle.Duplicate(None))
-
-  def testDuplicateSharedBufferWithDefaultOptions(self):
-    handle = system.CreateSharedBuffer(DATA_SIZE)
-    self._testHandlesCreation(
-        handle.Duplicate(system.DuplicateSharedBufferOptions()))
-
-  def testSendBytesOverSharedBuffer(self):
-    handle = system.CreateSharedBuffer(DATA_SIZE)
-    duplicated = handle.Duplicate()
-    data = _GetRandomBuffer(DATA_SIZE)
-    (res1, buf1) = handle.Map(0, DATA_SIZE)
-    (res2, buf2) = duplicated.Map(0, DATA_SIZE)
-    self.assertEquals(system.RESULT_OK, res1)
-    self.assertEquals(system.RESULT_OK, res2)
-    self.assertEquals(DATA_SIZE, len(buf1.buffer))
-    self.assertEquals(DATA_SIZE, len(buf2.buffer))
-    self.assertEquals(buf1.buffer, buf2.buffer)
-
-    buf1.buffer[:] = data
-    self.assertEquals(data, buf1.buffer)
-    self.assertEquals(data, buf2.buffer)
-    self.assertEquals(buf1.buffer, buf2.buffer)
diff --git a/mojo/python/tests/validation_unittest.py b/mojo/python/tests/validation_unittest.py
deleted file mode 100644
index 7b1f07e..0000000
--- a/mojo/python/tests/validation_unittest.py
+++ /dev/null
@@ -1,90 +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.
-
-import logging
-import os
-import os.path
-
-import mojo_unittest
-import validation_test_interfaces_mojom
-
-# pylint: disable=E0611
-import mojo_system as system
-from mojo_bindings import messaging
-from mojo_tests import validation_util
-from mopy.paths import Paths
-
-logging.basicConfig(level=logging.ERROR)
-paths = Paths()
-
-
-class RoutingMessageReceiver(messaging.MessageReceiver):
-  def __init__(self, request, response):
-    self.request = request
-    self.response = response
-
-  def Accept(self, message):
-    if message.header.is_response:
-      return self.response.Accept(message)
-    else:
-      return self.request.Accept(message)
-
-
-class SinkMessageReceiver(messaging.MessageReceiverWithResponder):
-
-  def Accept(self, message):
-    return False
-
-  def AcceptWithResponder(self, message, responder):
-    return False
-
-  def Close(self):
-    pass
-
-
-class HandleMock(object):
-  def IsValid(self):
-    return True
-
-  def Close(self):
-    pass
-
-
-class ValidationTest(mojo_unittest.MojoTestCase):
-
-  @staticmethod
-  def ParseData(data_dir, filename):
-    data = validation_util.ParseData(
-        open(os.path.join(data_dir, filename), 'r').read())
-    expect_file = filename[:-4] + 'expected'
-    expected_error = open(
-        os.path.join(data_dir, expect_file), 'r').read().strip();
-    success = expected_error == 'PASS'
-    return (filename, data, success)
-
-  @staticmethod
-  def GetData(prefix):
-    data_dir = os.path.join(paths.src_root, 'mojo', 'public', 'interfaces',
-                            'bindings', 'tests', 'data', 'validation')
-
-    # TODO(yzshen): Skip some interface versioning tests.
-    skipped_tests = ["conformance_mthd13_good_2.data"]
-
-    return [ValidationTest.ParseData(data_dir, x) for x in os.listdir(data_dir)
-            if x.startswith(prefix) and x.endswith('.data') and
-               x not in skipped_tests]
-
-  def runTest(self, prefix, message_receiver):
-    for (filename, data, expected) in ValidationTest.GetData(prefix):
-      self.assertEquals(len(data.error_message), 0)
-      handles = [HandleMock() for _ in xrange(data.num_handles)]
-      message = messaging.Message(data.data, handles)
-      self.assertEquals(message_receiver.Accept(message), expected,
-                        'Unexpected result for test: %s' % filename)
-
-  def testConformance(self):
-    manager = validation_test_interfaces_mojom.ConformanceTestInterface.manager
-    proxy = manager._InternalProxy(SinkMessageReceiver(), None, 0)
-    stub = manager._Stub(proxy)
-    self.runTest('conformance_', stub)
diff --git a/mojo/services/BUILD.gn b/mojo/services/BUILD.gn
index b990e92..3b67165 100644
--- a/mojo/services/BUILD.gn
+++ b/mojo/services/BUILD.gn
@@ -3,33 +3,8 @@
 # found in the LICENSE file.
 
 import("//build/config/ui.gni")
+import("//mojo/services/mojo_services.gni")
 
 group("services") {
-  deps = [
-    "//mojo/services/accessibility/public/interfaces",
-    "//mojo/services/asset_bundle/public/interfaces",
-    "//mojo/services/authenticating_url_loader_interceptor/public/interfaces",
-    "//mojo/services/authentication/public/interfaces",
-    "//mojo/services/camera_roll/public/interfaces",
-    "//mojo/services/clipboard/public/interfaces",
-    "//mojo/services/content_handler/public/interfaces",
-    "//mojo/services/device_info/public/interfaces",
-    "//mojo/services/files/public/interfaces",
-    "//mojo/services/geometry/public/interfaces",
-    "//mojo/services/http_server/public/interfaces",
-    "//mojo/services/input_events/public/interfaces",
-    "//mojo/services/location/public/interfaces",
-    "//mojo/services/native_viewport/public/interfaces",
-    "//mojo/services/navigation/public/interfaces",
-    "//mojo/services/network/public/interfaces",
-    "//mojo/services/notifications/public/interfaces",
-    "//mojo/services/nfc/public/interfaces",
-    "//mojo/services/sensors/public/interfaces",
-    "//mojo/services/service_registry/public/interfaces",
-    "//mojo/services/speech_recognizer/public/interfaces",
-    "//mojo/services/surfaces/public/interfaces",
-    "//mojo/services/terminal/public/interfaces",
-    "//mojo/services/view_manager/public/interfaces",
-    "//mojo/services/window_manager/public/interfaces",
-  ]
+  deps = mojo_services
 }
diff --git a/mojo/services/mojo_services.gni b/mojo/services/mojo_services.gni
new file mode 100644
index 0000000..74c0981
--- /dev/null
+++ b/mojo/services/mojo_services.gni
@@ -0,0 +1,33 @@
+# 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.
+
+mojo_services = [
+  "//mojo/services/accessibility/public/interfaces",
+  "//mojo/services/asset_bundle/public/interfaces",
+  "//mojo/services/authenticating_url_loader_interceptor/public/interfaces",
+  "//mojo/services/authentication/public/interfaces",
+  "//mojo/services/camera_roll/public/interfaces",
+  "//mojo/services/clipboard/public/interfaces",
+  "//mojo/services/content_handler/public/interfaces",
+  "//mojo/services/device_info/public/interfaces",
+  "//mojo/services/files/public/interfaces",
+  "//mojo/services/geometry/public/interfaces",
+  "//mojo/services/http_server/public/interfaces",
+  "//mojo/services/input_events/public/interfaces",
+  "//mojo/services/location/public/interfaces",
+  "//mojo/services/native_viewport/public/interfaces",
+  "//mojo/services/navigation/public/interfaces",
+  "//mojo/services/network/public/interfaces",
+  "//mojo/services/notifications/public/interfaces",
+  "//mojo/services/nfc/public/interfaces",
+  "//mojo/services/sensors/public/interfaces",
+  "//mojo/services/service_registry/public/interfaces",
+  "//mojo/services/speech_recognizer/public/interfaces",
+  "//mojo/services/sharing/public/interfaces",
+  "//mojo/services/surfaces/public/interfaces",
+  "//mojo/services/terminal/public/interfaces",
+  "//mojo/services/vanadium/security/public/interfaces",
+  "//mojo/services/view_manager/public/interfaces",
+  "//mojo/services/window_manager/public/interfaces",
+]
diff --git a/mojo/services/sharing/public/interfaces/BUILD.gn b/mojo/services/sharing/public/interfaces/BUILD.gn
new file mode 100644
index 0000000..b5e0c3c
--- /dev/null
+++ b/mojo/services/sharing/public/interfaces/BUILD.gn
@@ -0,0 +1,16 @@
+# 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.
+
+import("//build/module_args/mojo.gni")
+import("$mojo_sdk_root/mojo/public/tools/bindings/mojom.gni")
+
+mojom("interfaces") {
+  sources = [
+    "sharing.mojom",
+  ]
+
+  import_dirs = [ get_path_info("../../../", "abspath") ]
+
+  mojo_sdk_deps = [ "mojo/public/interfaces/application" ]
+}
diff --git a/mojo/services/sharing/public/interfaces/sharing.mojom b/mojo/services/sharing/public/interfaces/sharing.mojom
new file mode 100644
index 0000000..494b552
--- /dev/null
+++ b/mojo/services/sharing/public/interfaces/sharing.mojom
@@ -0,0 +1,10 @@
+// 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.
+
+[DartPackage="mojo_services"]
+module mojo;
+
+interface SharingService {
+  ShareText(string text);
+};
diff --git a/mojo/services/tracing/public/interfaces/tracing.mojom b/mojo/services/tracing/public/interfaces/tracing.mojom
index 6b39e9c..a261e90 100644
--- a/mojo/services/tracing/public/interfaces/tracing.mojom
+++ b/mojo/services/tracing/public/interfaces/tracing.mojom
@@ -5,24 +5,24 @@
 [DartPackage="mojo_services"]
 module tracing;
 
-// To participate in the tracing ecosystem, implement the TraceController
-// interface and connect to the tracing app. Then, when the controller's Start()
+// To participate in the tracing ecosystem, implement the TraceProvider
+// interface and connect to the tracing app. Then, when the provider's Start()
 // function is called collect tracing data and pass it back via the provided
-// TraceDataCollector interface up until Stop() is called.
+// TraceRecorder interface up until Stop() is called.
 
-interface TraceController {
+interface TraceProvider {
   // Categories can either be the empty string to mean the default set of
   // categories or a comma-delimited list of categories to trace.
-  StartTracing(string categories, TraceDataCollector collector);
+  StartTracing(string categories, TraceRecorder recorder);
   StopTracing();
 };
 
-interface TraceDataCollector {
-  DataCollected(string json);
+interface TraceRecorder {
+  Record(string json);
 };
 
-interface TraceCoordinator {
-  // Request tracing data from all connected TraceControllers to stream to
+interface TraceCollector {
+  // Request tracing data from all connected providers to stream to
   // |stream|.
   Start(handle<data_pipe_producer> stream, string categories);
 
diff --git a/mojo/services/vanadium/security/public/interfaces/BUILD.gn b/mojo/services/vanadium/security/public/interfaces/BUILD.gn
new file mode 100644
index 0000000..48eea5b
--- /dev/null
+++ b/mojo/services/vanadium/security/public/interfaces/BUILD.gn
@@ -0,0 +1,12 @@
+# 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.
+
+import("//build/module_args/mojo.gni")
+import("$mojo_sdk_root/mojo/public/tools/bindings/mojom.gni")
+
+mojom("interfaces") {
+  sources = [
+    "principal.mojom",
+  ]
+}
diff --git a/mojo/services/vanadium/security/public/interfaces/principal.mojom b/mojo/services/vanadium/security/public/interfaces/principal.mojom
new file mode 100644
index 0000000..9c58834
--- /dev/null
+++ b/mojo/services/vanadium/security/public/interfaces/principal.mojom
@@ -0,0 +1,49 @@
+// 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.
+
+module vanadium;
+
+// Represents the name of an application. |url| is the url of the
+// application. |qualifier| is a string that allows to tie a specific
+// instance of an application to another.
+struct AppInstanceName {
+  string url;
+  string? qualifier;
+};
+
+// Certificate represents a human-readable name and public-key (DER encoded) pair.
+// The private-key for a certificate is only available for signing operations
+// within the principal service application.
+struct Certificate {
+   string extension;
+   array<uint8>? publickey;
+};
+
+// Blessing is a credential binding a user identity to a public key. The corresponding
+// private key is only available for signing within the PrincipalService application.
+struct Blessing {
+   array<Certificate> chain;
+};
+
+// ChainSeparator is the separator used to join name extensions in a certificate chain.
+const string ChainSeparator = "/";
+
+// A service that binds user identities to an application instance running in Mojo
+interface PrincipalService {
+  // Login is called by an application instance (requestor_url/qualifier) that
+  // wants to get a user blessing. The service may obtain the user blessing
+  // through a third-party authentication flow (eg:oauth2). The user blessing
+  // is bound to a public/private key-pair that this service generates and
+  // persists for this application instance. Returns null if login fails.
+  Login() => (Blessing? user_blessing);
+
+  // Removes the user blessing for the application instance that invokes the
+  // Logout method.
+  Logout();
+
+  // GetUserBlessing returns the user blessing for a given application instance.
+  // It returns an error if the application instance has not invoked Login().
+  GetUserBlessing(AppInstanceName app) => (Blessing? user_blessing);
+};
+
diff --git a/mojo/tests/BUILD.gn b/mojo/tests/BUILD.gn
deleted file mode 100644
index 03411fe..0000000
--- a/mojo/tests/BUILD.gn
+++ /dev/null
@@ -1,32 +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.
-
-import("//testing/test.gni")
-import("//mojo/public/mojo.gni")
-
-test("mojo_task_tracker_perftests") {
-  deps = [
-    "//base/test:test_support",
-    "//mojo/common",
-    "//mojo/edk/system",
-    "//mojo/edk/test:test_support",
-    "//mojo/edk/test:test_support_impl",
-    "//mojo/environment:chromium",
-    "//mojo/public/c/test_support",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/bindings:callback",
-    "//mojo/public/cpp/environment",
-    "//mojo/public/cpp/system",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//mojo/public/cpp/utility",
-    "//mojo/public/interfaces/bindings/tests:test_interfaces",
-    "//base",
-    "//testing/gtest",
-  ]
-
-  sources = [
-    "../edk/test/run_all_perftests.cc",
-    "task_tracker_perftest.cc",
-  ]
-}
diff --git a/mojo/tests/task_tracker_perftest.cc b/mojo/tests/task_tracker_perftest.cc
deleted file mode 100644
index a2ffdb3..0000000
--- a/mojo/tests/task_tracker_perftest.cc
+++ /dev/null
@@ -1,135 +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.
-
-#include <numeric>
-
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/timer/elapsed_timer.h"
-#include "base/tracked_objects.h"
-#include "mojo/common/message_pump_mojo.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/environment/environment.h"
-#include "mojo/public/cpp/environment/task_tracker.h"
-#include "mojo/public/cpp/test_support/test_support.h"
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class ProviderImpl : public sample::Provider {
- public:
-  explicit ProviderImpl(InterfaceRequest<sample::Provider> request)
-      : binding_(this, request.Pass()) {}
-
-  void EchoString(const String& a,
-                  const Callback<void(String)>& callback) override {
-    callback.Run(a);
-  }
-
-  void EchoStrings(const String& a,
-                   const String& b,
-                   const Callback<void(String, String)>& callback) override {
-    CHECK(false);
-  }
-
-  void EchoMessagePipeHandle(
-      ScopedMessagePipeHandle a,
-      const Callback<void(ScopedMessagePipeHandle)>& callback) override {
-    CHECK(false);
-  }
-
-  void EchoEnum(sample::Enum a,
-                const Callback<void(sample::Enum)>& callback) override {
-    CHECK(false);
-  }
-
-  void EchoInt(int32_t a, const EchoIntCallback& callback) override {
-    CHECK(false);
-  }
-
-  Binding<sample::Provider> binding_;
-};
-
-class RequestResponsePerfTest : public testing::Test {
- public:
-  RequestResponsePerfTest()
-      : loop_(make_scoped_ptr(new common::MessagePumpMojo())) {}
-
-  ~RequestResponsePerfTest() override { loop_.RunUntilIdle(); }
-
-  void Iterate(size_t count);
-  void Measure(const char* case_nam);
-
-  void SetUp() override {
-    tracked_objects::ThreadData::InitializeAndSetTrackingStatus(
-        tracked_objects::ThreadData::PROFILING_ACTIVE);
-  }
-
-  void TearDown() override {
-    tracked_objects::ThreadData::InitializeAndSetTrackingStatus(
-        tracked_objects::ThreadData::DEACTIVATED);
-  }
-
-  void PumpMessages() { loop_.RunUntilIdle(); }
-
- private:
-  base::MessageLoop loop_;
-};
-
-const size_t kCallsPerIteration = 1000;
-const size_t kIterations = 1000;
-
-void RequestResponsePerfTest::Iterate(size_t count) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(GetProxy(&provider));
-
-  size_t remaining = count;
-  Callback<void(const String&)> reply =
-      [&provider, &reply, &remaining](const String& a) {
-        if (!remaining)
-          return;
-        remaining--;
-        provider->EchoString(a, reply);
-      };
-
-  provider->EchoString(String::From("hello"), reply);
-  PumpMessages();
-}
-
-void RequestResponsePerfTest::Measure(const char* case_name) {
-  std::vector<double> laps;
-  for (size_t i = 0; i < kIterations; ++i) {
-    base::ElapsedTimer timer;
-    Iterate(kCallsPerIteration);
-    laps.push_back(timer.Elapsed().InMillisecondsF());
-  }
-
-  double avg = std::accumulate(laps.begin(), laps.end(), 0.0) / laps.size();
-  double var = std::accumulate(laps.begin(), laps.end(), 0.0, [avg](double acc,
-                                                                    double x) {
-    return acc + (x - avg) * (x - avg);
-  }) / laps.size();
-
-  double sd = sqrt(var);
-  mojo::test::LogPerfResult(case_name, "Avg", avg, "ms/1000call");
-  mojo::test::LogPerfResult(case_name, "SD", sd, "ms/1000call");
-}
-
-TEST_F(RequestResponsePerfTest, TrackingEnabled) {
-  Environment::GetDefaultTaskTracker()->SetEnabled(true);
-  Measure(__FUNCTION__);
-  Environment::GetDefaultTaskTracker()->SetEnabled(false);
-}
-
-TEST_F(RequestResponsePerfTest, TrackingDisabled) {
-  Measure(__FUNCTION__);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/tools/BUILD.gn b/mojo/tools/BUILD.gn
deleted file mode 100644
index dbeaf7e..0000000
--- a/mojo/tools/BUILD.gn
+++ /dev/null
@@ -1,28 +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.
-
-executable("message_generator") {
-  testonly = true
-  output_name = "mojo_message_generator"
-
-  sources = [
-    "message_generator.cc",
-  ]
-
-  deps = [
-    "//base",
-    "//build/config/sanitizers:deps",
-    "//mojo/common",
-    "//mojo/edk/system",
-    "//mojo/environment:chromium",
-    "//mojo/public/cpp/bindings",
-    "//testing/gtest",
-  ]
-}
-
-executable("remote_file_reader") {
-  sources = [
-    "remote_file_reader.cc",
-  ]
-}
diff --git a/mojo/tools/analyze_bloat.py b/mojo/tools/analyze_bloat.py
deleted file mode 100755
index 90ced08..0000000
--- a/mojo/tools/analyze_bloat.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import argparse
-import logging
-import os
-import re
-import subprocess
-import sys
-
-from mopy.paths import Paths
-
-ANDROID_TOOLS_DIR = ('third_party/android_tools/ndk/toolchains/' +
-    'arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin')
-
-def binaries(path):
-    for item in os.listdir(path):
-        match = re.match(r'^(\w+)\.mojo$', item)
-        if match:
-            name = match.group(1)
-            if name.endswith('apptests'):
-                continue
-            binary = os.path.join(path, 'lib%s_library.so' % name)
-            if os.path.exists(binary):
-                yield name, binary
-
-def check_deps():
-    success = True
-    if not os.path.exists('bloat'):
-        print ("Can't find bloat.py. Did you " +
-            "'git clone https://github.com/martine/bloat.git' ?")
-        success = False
-    if not os.path.exists('webtreemap'):
-        print ("Can't find webtreemap. Did you " +
-            "'git clone https://github.com/martine/webtreemap.git' ?")
-        success = False
-    if not success:
-        sys.exit(1)
-
-def main():
-    logging.basicConfig(level=logging.WARN)
-    parser = argparse.ArgumentParser(description='Dump bloat treeview.')
-    args = parser.parse_args()
-    check_deps()
-
-    # Always use android release?
-    rel_build_dir = os.path.join('out', 'android_Release')
-    src_root = Paths().src_root
-    build_dir = os.path.join(src_root, rel_build_dir)
-
-    tools_dir = os.path.join(src_root, ANDROID_TOOLS_DIR)
-    tools_prefix = 'arm-linux-androideabi-'
-
-    nm = os.path.join(tools_dir, tools_prefix + 'nm')
-    objdump = os.path.join(tools_dir, tools_prefix + 'objdump')
-
-    for name, binary in binaries(build_dir):
-        print 'Analyzing', name
-
-        nm_path = name + '.nm'
-        objdump_path = name + '.objdump'
-        json_path = name + '.json'
-        html_path = name + '.html'
-
-        with open(nm_path, 'w') as nm_file:
-            args = [nm, '-C', '-S', '-l', binary]
-            subprocess.check_call(args, stdout=nm_file)
-
-        with open(objdump_path, 'w') as objdump_file:
-            subprocess.check_call([objdump, '-h', binary], stdout=objdump_file)
-
-        with open(json_path, 'w') as json_file:
-            subprocess.check_call([
-                sys.executable,
-                'bloat/bloat.py',
-                '--nm-output=' + nm_path,
-                '--objdump-output=' + objdump_path,
-                '--strip-prefix=' + src_root + '/',
-                'syms'
-            ], stdout=json_file)
-
-        source = None
-        with open('bloat/index.html', 'r') as source_file:
-            source = source_file.read().replace('bloat.json', json_path)
-
-        with open(html_path, 'w') as html_file:
-            html_file.write(source)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/mojo/tools/android_shortcuts/BUILD.gn b/mojo/tools/android_shortcuts/BUILD.gn
deleted file mode 100644
index e560661..0000000
--- a/mojo/tools/android_shortcuts/BUILD.gn
+++ /dev/null
@@ -1,41 +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.
-
-assert(is_android)
-
-import("//build/config/android/config.gni")
-import("//build/config/android/rules.gni")
-
-group("android_shortcuts") {
-  deps = [
-    ":java",
-    ":shortcuts_apk",
-  ]
-}
-
-android_library("java") {
-  java_files = [
-    "apk/src/org/chromium/mojo/shortcuts/AlarmReceiver.java",
-    "apk/src/org/chromium/mojo/shortcuts/ApplicationUpdater.java",
-    "apk/src/org/chromium/mojo/shortcuts/ShortcutsActivity.java",
-  ]
-}
-
-android_resources("resources") {
-  resource_dirs = [ "apk/res" ]
-  custom_package = "org.chromium.mojo.shortcuts"
-}
-
-android_apk("shortcuts_apk") {
-  apk_name = "MojoShortcuts"
-
-  android_manifest = "apk/AndroidManifest.xml"
-
-  asset_location = "apk/res"
-
-  deps = [
-    ":java",
-    ":resources",
-  ]
-}
diff --git a/mojo/tools/android_shortcuts/apk/AndroidManifest.xml b/mojo/tools/android_shortcuts/apk/AndroidManifest.xml
deleted file mode 100644
index 12a93fe..0000000
--- a/mojo/tools/android_shortcuts/apk/AndroidManifest.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!-- 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.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    package="org.chromium.mojo.shortcuts">
-
-    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
-    <uses-permission android:name="android.permission.DELETE_PACKAGES"
-        tools:ignore="ProtectedPermissions"/>
-    <uses-permission android:name="android.permission.INSTALL_PACKAGES"
-        tools:ignore="ProtectedPermissions"/>
-    <uses-permission android:name="android.permission.INTERNET"/>
-    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
-    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>
-
-    <application android:label="@string/application_name">
-        <activity android:name="ShortcutsActivity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-        </activity>
-
-        <receiver android:name=".AlarmReceiver"
-                  android:enabled="true">
-            <intent-filter>
-                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
-            </intent-filter>
-        </receiver>
-    </application>
-
-</manifest>
diff --git a/mojo/tools/android_shortcuts/apk/res/values/strings.xml b/mojo/tools/android_shortcuts/apk/res/values/strings.xml
deleted file mode 100644
index fe96745..0000000
--- a/mojo/tools/android_shortcuts/apk/res/values/strings.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!-- 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.
- -->
-
-<resources>
-<string name="application_name">Mojo Shortcuts</string>
-</resources>
diff --git a/mojo/tools/android_shortcuts/apk/src/org/chromium/mojo/shortcuts/AlarmReceiver.java b/mojo/tools/android_shortcuts/apk/src/org/chromium/mojo/shortcuts/AlarmReceiver.java
deleted file mode 100644
index 98f540a..0000000
--- a/mojo/tools/android_shortcuts/apk/src/org/chromium/mojo/shortcuts/AlarmReceiver.java
+++ /dev/null
@@ -1,54 +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.
-
-package org.chromium.mojo.shortcuts;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-
-/**
- * Receives broadcast when device is rebooted or through the {@link AlarmManager}.
- */
-public class AlarmReceiver extends BroadcastReceiver {
-    private static final ScheduledExecutorService EXECUTOR =
-            Executors.newSingleThreadScheduledExecutor();
-
-    public static void setupAlarm(Context context) {
-        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
-        Intent intent = new Intent(context, AlarmReceiver.class);
-        PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
-        alarmManager.cancel(alarmIntent);
-        alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
-                AlarmManager.INTERVAL_DAY, AlarmManager.INTERVAL_DAY, alarmIntent);
-    }
-
-    /**
-     * @see android.content.BroadcastReceiver#onReceive(android.content.Context,
-     *      android.content.Intent)
-     */
-    @Override
-    public void onReceive(final Context context, Intent intent) {
-        // This receiver listen to android.intent.action.BOOT_COMPLETED through the application
-        // manifest. When this happens, register the alarm.
-        if (intent.getAction() != null
-                && intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
-            setupAlarm(context);
-        }
-        // In all cases, whether this is called through the alarm or at boot, check for applications
-        // to update.
-        EXECUTOR.execute(new Runnable() {
-
-            @Override
-            public void run() {
-                ApplicationUpdater.checkAndUpdateApplications(context);
-            }
-        });
-    }
-}
diff --git a/mojo/tools/android_shortcuts/apk/src/org/chromium/mojo/shortcuts/ApplicationUpdater.java b/mojo/tools/android_shortcuts/apk/src/org/chromium/mojo/shortcuts/ApplicationUpdater.java
deleted file mode 100644
index 33d5970..0000000
--- a/mojo/tools/android_shortcuts/apk/src/org/chromium/mojo/shortcuts/ApplicationUpdater.java
+++ /dev/null
@@ -1,157 +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.
-
-package org.chromium.mojo.shortcuts;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.net.Uri;
-import android.os.Environment;
-import android.util.Log;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-/**
- * Helper class to update apks.
- */
-public class ApplicationUpdater {
-    private static final String TAG = "ApplicationUpdater";
-
-    private static class ApplicationLocation {
-        private final String mPackageName;
-        private final String mURL;
-
-        public ApplicationLocation(String packageName, String url) {
-            mPackageName = packageName;
-            mURL = url;
-        }
-
-        /**
-         * Returns the application package.
-         */
-        public String getPackageName() {
-            return mPackageName;
-        }
-
-        /**
-         * Returns the application update URL.
-         */
-        public URL getURL() {
-            try {
-                return new URL(mURL);
-            } catch (MalformedURLException e) {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-
-    private static final ApplicationLocation[] APPLICATIONS = {
-            new ApplicationLocation(
-                    "org.chromium.mojo.shortcuts", "http://domokit.github.io/MojoShortcuts.apk"),
-            new ApplicationLocation(
-                    "org.chromium.mojo.shell", "http://domokit.github.io/MojoShell.apk")};
-
-    private static boolean applicationNeedsUpdate(
-            Context context, ApplicationLocation application) {
-        PackageManager pm = context.getPackageManager();
-        try {
-            PackageInfo pi = pm.getPackageInfo(application.getPackageName(), 0);
-            HttpURLConnection urlConnection =
-                    (HttpURLConnection) application.getURL().openConnection();
-            urlConnection.setRequestMethod("HEAD");
-            urlConnection.connect();
-            long application_timestamp = urlConnection.getHeaderFieldDate("Last-Modified", 0);
-            return application_timestamp > pi.lastUpdateTime;
-        } catch (PackageManager.NameNotFoundException e) {
-            return true;
-        } catch (IOException e) {
-            Log.e(TAG,
-                    "Unable to retrieve information for package: " + application.getPackageName(),
-                    e);
-        }
-        return false;
-    }
-
-    private static String hex(byte bytes[]) {
-        StringBuilder sb = new StringBuilder();
-        for (byte b : bytes) {
-            sb.append(String.format("%02x", b & 0xff));
-        }
-        return sb.toString();
-    }
-
-    private static String getFilename(URL url) {
-        try {
-            return hex(url.toString().getBytes("UTF8"));
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private static void cleanDownloadDirectory() {
-        File directory = getDownloadDirectory();
-        for (File file : directory.listFiles()) {
-            file.delete();
-        }
-    }
-
-    private static File getDownloadDirectory() {
-        File directory = new File(Environment.getExternalStorageDirectory(), "mojo_shortcuts");
-        directory.mkdirs();
-        return directory;
-    }
-
-    private static void updateApplication(Context context, ApplicationLocation application) {
-        try {
-            URL url = application.getURL();
-            HttpURLConnection c = (HttpURLConnection) url.openConnection();
-            c.setRequestMethod("GET");
-            c.connect();
-
-            File outputFile = new File(getDownloadDirectory(), getFilename(url));
-
-            FileOutputStream fos = new FileOutputStream(outputFile);
-            try {
-                InputStream is = c.getInputStream();
-                try {
-                    byte[] buffer = new byte[4096];
-                    int len1 = 0;
-                    while ((len1 = is.read(buffer)) != -1) {
-                        fos.write(buffer, 0, len1);
-                    }
-                } finally {
-                    is.close();
-                }
-            } finally {
-                fos.close();
-            }
-
-            Intent intent = new Intent(Intent.ACTION_VIEW);
-            intent.setDataAndType(
-                    Uri.fromFile(outputFile), "application/vnd.android.package-archive");
-            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            context.startActivity(intent);
-        } catch (IOException e) {
-            Log.e(TAG, "Unable to update package: " + application.getPackageName(), e);
-        }
-    }
-
-    public static void checkAndUpdateApplications(Context context) {
-        cleanDownloadDirectory();
-        for (ApplicationLocation application : APPLICATIONS) {
-            if (applicationNeedsUpdate(context, application)) {
-                updateApplication(context, application);
-            }
-        }
-    }
-}
diff --git a/mojo/tools/android_shortcuts/apk/src/org/chromium/mojo/shortcuts/ShortcutsActivity.java b/mojo/tools/android_shortcuts/apk/src/org/chromium/mojo/shortcuts/ShortcutsActivity.java
deleted file mode 100644
index 4f8fcb6..0000000
--- a/mojo/tools/android_shortcuts/apk/src/org/chromium/mojo/shortcuts/ShortcutsActivity.java
+++ /dev/null
@@ -1,107 +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.
-
-package org.chromium.mojo.shortcuts;
-
-import android.app.Activity;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.os.Bundle;
-import android.util.JsonWriter;
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Main activity for the shortcuts application. It installs default shortcuts and sets up the alarm
- * for the auto-update process.
- */
-public class ShortcutsActivity extends Activity {
-    private static final String TAG = "ShortcutsActivity";
-
-    private static class Shortcut {
-        private final String mName;
-        private final String mUrl;
-
-        public Shortcut(String name, String url) {
-            mName = name;
-            mUrl = url;
-        }
-
-        public String getName() {
-            return mName;
-        }
-
-        public String getUrl() {
-            return mUrl;
-        }
-
-        public Intent getIntent() throws IOException {
-            List<String> commandLine = new ArrayList<String>();
-            commandLine.add("--origin=https://domokit.github.io/mojo");
-            commandLine.add("--url-mappings=mojo:window_manager=mojo:kiosk_wm");
-            commandLine.add("--args-for=mojo:window_manager " + getUrl());
-            commandLine.add("mojo:window_manager");
-            Intent intent = new Intent();
-            intent.setComponent(new ComponentName(
-                    "org.chromium.mojo.shell", "org.chromium.mojo.shell.MojoShellActivity"));
-            intent.setAction(Intent.ACTION_VIEW);
-            intent.putExtra("encodedParameters", jsonEncode(commandLine));
-            return intent;
-        }
-
-        private static String jsonEncode(List<String> list) throws IOException {
-            StringWriter sw = new StringWriter();
-            JsonWriter json = new JsonWriter(sw);
-            json.beginArray();
-            for (String p : list) {
-                json.value(p);
-            }
-            json.endArray();
-            json.close();
-            return sw.toString();
-        }
-    }
-
-    private static final Shortcut[] SHORTCUTS = {
-            new Shortcut("Home", "https://domokit.github.io/home")};
-
-    /**
-     * @see android.app.Activity#onCreate(android.os.Bundle)
-     */
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        SharedPreferences shortcuts = getSharedPreferences("shortcuts", MODE_PRIVATE);
-        Editor editor = shortcuts.edit();
-
-        for (Shortcut shortcut : SHORTCUTS) {
-            try {
-                Intent intent = new Intent();
-                intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcut.getIntent());
-                intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, shortcut.getName());
-                intent.setAction("com.android.launcher.action.UNINSTALL_SHORTCUT");
-                sendBroadcast(intent);
-
-                intent = new Intent();
-                intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcut.getIntent());
-                intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, shortcut.getName());
-                intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
-                sendBroadcast(intent);
-            } catch (IOException e) {
-                Log.e(TAG, "Unable to install shortcut", e);
-            }
-            editor.putString(shortcut.getName(), shortcut.getUrl());
-        }
-        editor.apply();
-        AlarmReceiver.setupAlarm(this);
-        finish();
-    }
-}
diff --git a/mojo/tools/apptest_runner.py b/mojo/tools/apptest_runner.py
deleted file mode 100755
index b3378ef..0000000
--- a/mojo/tools/apptest_runner.py
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""A test runner for application tests."""
-
-import argparse
-import logging
-import os.path
-import subprocess
-import sys
-
-from mopy import gtest
-from mopy.config import Config
-from mopy.gn import ConfigForGNArgs, ParseGNConfig
-from mopy.log import InitLogging
-from mopy.paths import Paths
-
-
-_logger = logging.getLogger()
-
-
-def main():
-  parser = argparse.ArgumentParser(description="A test runner for application "
-                                               "tests.")
-
-  parser.add_argument("--verbose", help="be verbose (multiple times for more)",
-                      default=0, dest="verbose_count", action="count")
-  parser.add_argument("test_list_file", type=str,
-                      help="a file listing apptests to run")
-  parser.add_argument("build_dir", type=str,
-                      help="the build output directory")
-  args = parser.parse_args()
-
-  InitLogging(args.verbose_count)
-  config = ConfigForGNArgs(ParseGNConfig(args.build_dir))
-  paths = Paths(config)
-  command_line = [os.path.join(os.path.dirname(__file__), os.path.pardir,
-                               "devtools", "common", "mojo_test"),
-                  str(args.test_list_file)]
-
-  if config.target_os == Config.OS_ANDROID:
-    command_line.append("--android")
-    command_line.append("--adb-path=" + paths.adb_path)
-    command_line.append("--origin=" + paths.build_dir)
-
-  command_line.append("--shell-path=" + paths.target_mojo_shell_path)
-  if args.verbose_count:
-    command_line.append("--verbose")
-
-  gtest.set_color()
-  print "Running " + str(command_line)
-  ret = subprocess.call(command_line)
-  return ret
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/tools/check_mojom_golden_files.py b/mojo/tools/check_mojom_golden_files.py
deleted file mode 100755
index ae80ceb..0000000
--- a/mojo/tools/check_mojom_golden_files.py
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import argparse
-import os.path
-import sys
-from filecmp import dircmp
-from shutil import rmtree
-from tempfile import mkdtemp
-from mopy.paths import Paths
-
-paths = Paths()
-
-sys.path.insert(0, os.path.join(paths.mojo_dir, "public", "tools", "bindings",
-                                "pylib"))
-from mojom_tests.support.find_files import FindFiles
-from mojom_tests.support.run_bindings_generator import RunBindingsGenerator
-
-
-def _ProcessDircmpResults(results, verbose=False):
-  """Prints results of directory comparison and returns true if they are
-  identical (note: the "left" directory should be the golden directory)."""
-  rv = not (bool(results.left_only) or bool(results.right_only) or \
-            bool(results.common_funny) or bool(results.funny_files) or \
-            bool(results.diff_files))
-  if verbose:
-    for f in results.left_only:
-      print "%s exists in golden directory but not in current output" % f
-    for f in results.right_only:
-      print "%s exists in current output but not in golden directory" % f
-    for f in results.common_funny + results.funny_files:
-      print "Unable to compare %s between golden directory and current output" \
-          % f
-    for f in results.diff_files:
-      print "%s differs between golden directory and current output" % f
-  for r in results.subdirs.values():
-    # If we're being verbose, check subdirectories even if we know that there
-    # are differences. Note that it's "... and rv" to avoid the short-circuit.
-    if rv or verbose:
-      rv = _ProcessDircmpResults(r, verbose=verbose) and rv
-  return rv
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument("--generate_golden_files", action="store_true",
-                      help=("generate golden files (does not obliterate "
-                            "directory"))
-  parser.add_argument("--keep_temp_dir", action="store_true",
-                      help="don't delete the temporary directory")
-  parser.add_argument("--verbose", action="store_true",
-                      help="spew excess verbiage")
-  parser.add_argument("golden_dir", metavar="GOLDEN_DIR",
-                      help="directory with the golden files")
-  args = parser.parse_args()
-
-  if args.generate_golden_files:
-    if os.path.exists(args.golden_dir):
-      print "WARNING: golden directory %s already exists" % args.golden_dir
-    out_dir = args.golden_dir
-  else:
-    if not os.path.exists(args.golden_dir):
-      print "ERROR: golden directory %s does not exist" % args.golden_dir
-      return 1
-    out_dir = mkdtemp()
-  if args.verbose:
-    print "Generating files to %s ..." % out_dir
-
-  mojom_files = FindFiles(paths.mojo_dir, "*.mojom")
-  for mojom_file in mojom_files:
-    if args.verbose:
-      print "  Processing %s ..." % os.path.relpath(mojom_file, paths.mojo_dir)
-    # TODO(vtl): This may wrong, since the path can be overridden in the .gyp
-    # file.
-    RunBindingsGenerator(out_dir, paths.mojo_dir, mojom_file,
-                         ["-I", paths.src_root])
-
-  if args.generate_golden_files:
-    return 0
-
-  identical = _ProcessDircmpResults(dircmp(args.golden_dir, out_dir, ignore=[]),
-                                    verbose=args.verbose)
-
-  if args.keep_temp_dir:
-    if args.verbose:
-      print "Not removing %s ..." % out_dir
-  else:
-    if args.verbose:
-      print "Removing %s ..." % out_dir
-    rmtree(out_dir)
-
-  if not identical:
-    print "FAILURE: current output differs from golden files"
-    return 1
-
-  print "SUCCESS: current output identical to golden files"
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/tools/data/apptests b/mojo/tools/data/apptests
deleted file mode 100644
index 6cada41..0000000
--- a/mojo/tools/data/apptests
+++ /dev/null
@@ -1,127 +0,0 @@
-# This file contains a list of Mojo apptests. For description of the file
-# format, see `mojo_test` in devtools.
-
-tests = [
-  {
-    "test": "mojo:asset_bundle_apptests",
-  },
-  {
-    "test": "mojo:authenticating_url_loader_interceptor_apptests",
-  },
-  {
-    "test": "mojo:clipboard_apptests",
-  },
-  {
-    "test": "mojo:example_apptests",
-    # ExampleApplicationTest.CheckCommandLineArg checks --example_apptest_arg.
-    "test-args": ["--example_apptest_arg"],
-  },
-  {
-    "test": "mojo:example_apptests",
-    "name": "mojo:example_apptests (multiprocess)",
-    # ExampleApplicationTest.CheckCommandLineArg checks --example_apptest_arg.
-    "test-args": ["--example_apptest_arg"],
-    "shell-args": ["--enable-multiprocess"],
-  },
-  {
-    "test": "mojo:files_apptests",
-  },
-  {
-    "test": "mojo:http_server_apptests",
-  },
-  {
-    "test": "mojo:mojio_apptests",
-  },
-  {
-    "test": "mojo:moterm_apptests",
-    "shell-args": ["--args-for=mojo:native_viewport_service --use-headless-config --use-osmesa"],
-  },
-  {
-    "test": "mojo:texture_apptests",
-    "shell-args": ["--args-for=mojo:native_viewport_service --use-headless-config --use-osmesa"],
-  },
-  {
-    "test": "mojo:mojo_view_manager_client_apptests",
-    "shell-args": ["--args-for=mojo:native_viewport_service --use-headless-config --use-osmesa"],
-  },
-  {
-    "test": "mojo:prediction_apptests",
-  },
-  {
-    "test": "mojo:view_manager_service_apptests",
-    "type": "gtest_isolated",
-    "shell-args": ["--args-for=mojo:native_viewport_service --use-headless-config --use-osmesa"],
-  },
-  {
-    "test": "mojo:network_service_apptests",
-  },
-  {
-    "test": "mojo:window_manager_apptests",
-    "shell-args": ["--args-for=mojo:native_viewport_service --use-headless-config --use-osmesa"],
-  },
-  {
-    "test": "mojo:versioning_apptests",
-  },
-  {
-    "test": "mojo:url_response_disk_cache_apptests",
-  },
-]
-
-if target_os == 'linux':
-  tests += [
-    {
-      "test": "mojo:example_apptests",
-      "name": "mojo:example_apptests (python_example_service)",
-      # ExampleApplicationTest.CheckCommandLineArg checks --example_apptest_arg.
-      "test-args": ["--example_apptest_arg"],
-      "shell-args": [
-        "--url-mappings=mojo:example_service=mojo:python_example_service"
-      ],
-    },
-    {
-      "test": "mojo:mojo_url_redirector_apptests",
-      "test-args": ["--redirector_port=49152",
-                    "--app_location_files_port=49153"],
-      "shell-args": ["--args-for=mojo:mojo_url_redirector 0.0.0.0:49152 http://localhost:49153"],
-    }
-  ]
-
-if target_os == 'android':
-  tests += [
-    {
-      "test": "mojo:example_apptests",
-      "name": "mojo:example_apptests (android_example_service)",
-      # ExampleApplicationTest.CheckCommandLineArg checks --example_apptest_arg.
-      "test-args": ["--example_apptest_arg"],
-      "shell-args": [
-        "--url-mappings=mojo:example_service=mojo:android_example_service"
-      ],
-    },
-    {
-      "test": "mojo:notification_apptests",
-    },
-    {
-      "test": "mojo:shell_nfc_apptests",
-    },
-  ]
-
-if target_os != 'android':
-  tests += [
-    {
-      "test": "mojo:js_apptests",
-      "type": "gtest_isolated",
-    },
-    {
-      "test": "mojo:reaper_apptests",
-    },
-    {
-      "test": "mojo:dart_apptests",
-      "type": "dart",
-    },
-    {
-      # https://github.com/domokit/mojo/issues/61
-      # Sometime the shell get a trucated application when exposed through the
-      # http server.
-      "test": "mojo:shell_apptests",
-    },
-  ]
diff --git a/mojo/tools/data/nacl_apptests b/mojo/tools/data/nacl_apptests
deleted file mode 100644
index eeba8ca..0000000
--- a/mojo/tools/data/nacl_apptests
+++ /dev/null
@@ -1,33 +0,0 @@
-# This file contains a list of NaCl Mojo gtest unit tests.
-# This must be a valid python dictionary.
-# TODO(vtl|msw): Add a way of specifying data dependencies.
-tests = [
-  # TODO(ncbray): support other architectures.
-  {
-    "test": "mojo:clipboard_apptests_x64.nexe",
-  },
-  {
-    "test": "mojo:example_apptests_x64.nexe",
-    # ExampleApplicationTest.CheckCommandLineArg checks --example_apptest_arg.
-    "test-args": ["--example_apptest_arg"],
-  },
-  {
-    "test": "mojo:files_apptests_x64.nexe",
-  },
-  {
-    "test": "mojo:mojo_view_manager_client_apptests_x64.nexe",
-    "shell-args": ["--args-for=mojo:native_viewport_service --use-headless-config --use-osmesa"],
-  },
-  {
-    "test": "mojo:view_manager_service_apptests_x64.nexe",
-    "type": "gtest_isolated",
-    "shell-args": ["--args-for=mojo:native_viewport_service --use-headless-config --use-osmesa"],
-  },
-  {
-    "test": "mojo:window_manager_apptests_x64.nexe",
-  },
-  {
-    "test": "mojo:shell_apptests_x64.nexe",
-  },
-  # TODO(ncbray): http_server_apptests (uses two-stage data pipe reads)
-]
diff --git a/mojo/tools/data/unittests b/mojo/tools/data/unittests
deleted file mode 100644
index 39af324..0000000
--- a/mojo/tools/data/unittests
+++ /dev/null
@@ -1,96 +0,0 @@
-# This file contains a list of Mojo gtest unit tests.
-# This must be valid python. It can use the |config| global that will be a
-# mopy.config.Config object and must set a |tests| global that will contain the
-# tests to run.
-# TODO(vtl): Add a way of specifying data dependencies instead of cacheable.
-
-tests = [
-  # System tests:
-  {
-    "test": "mojo_system_unittests",
-  },
-
-  # Public tests:
-  {
-    "test": "mojo_public_bindings_unittests",
-    "cacheable": False,
-  },
-  {
-    "test": "mojo_public_environment_unittests",
-  },
-  {
-    "test": "mojo_public_system_unittests",
-  },
-  {
-    "test": "mojo_public_utility_unittests",
-  },
-  {
-    "test": "mojo_system_impl_private_unittests",
-  },
-
-  # Non-system, non-public tests:
-  {
-    "test": "crypto_unittests",
-  },
-  {
-    "test": "mojo_application_manager_unittests",
-  },
-  {
-    "test": "mojo_common_unittests",
-  },
-  {
-    "test": "mojo_view_manager_lib_unittests",
-  },
-  {
-    "test": "mojo_surfaces_lib_unittests",
-  },
-  {
-    "test": "view_manager_service_unittests",
-  },
-  {
-    "test": "window_manager_unittests",
-  },
-
-  # Shell integration tests:
-  {
-    "test": "mojo_shell_tests",
-    "cacheable": False,
-  },
-  {
-    "test": "crash_unittests",
-  },
-]
-
-if config.target_os != config.OS_ANDROID:
-  tests += [
-    # Tests for components we depend on:
-    {
-      "test": "gfx_unittests",
-    },
-    {
-      "test": "events_unittests",
-    },
-
-    # JavaScript tests:
-    {
-      "test": "js_unittests",
-      "cacheable": False,
-    },
-    {
-      "test": "js_integration_tests",
-      "cacheable": False,
-    },
-    {
-      "test": "js_services_unittests",
-      "cacheable": False,
-    },
-  ]
-
-# TODO: get dart unittests working with android.
-if config.target_os != config.OS_ANDROID:
-  tests += [
-    {
-      "test": "dart_unittests",
-      "cacheable": False,
-    },
-  ]
diff --git a/mojo/tools/deploy_domokit_site.py b/mojo/tools/deploy_domokit_site.py
deleted file mode 100755
index 7175092..0000000
--- a/mojo/tools/deploy_domokit_site.py
+++ /dev/null
@@ -1,157 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Deploy domokit.github.io"""
-
-# NOTE: Requires that download_material_design_icons to have been run from
-# $build_dir/gen/dart-dpkg/sky.
-
-import argparse
-import logging
-import os
-import shutil
-import subprocess
-
-from mopy.paths import Paths
-
-
-def git_revision():
-    return subprocess.check_output(['git', 'rev-parse', 'HEAD']).strip()
-
-
-def mojo_filter(path):
-    if not os.path.isfile(path):
-        return False
-    _, ext = os.path.splitext(path)
-    if ext != '.mojo':
-        return False
-    return 'apptests' not in os.path.basename(path)
-
-
-def gen_filter(path):
-    if os.path.isdir(path):
-        return True
-    _, ext = os.path.splitext(path)
-    # Don't include all .dart, just .mojom.dart.
-    return ext == '.sky' or path.endswith('.mojom.dart')
-
-
-def examples_filter(path):
-    if os.path.isdir(path):
-        return True
-    return 'packages' != os.path.basename(path)
-
-
-def sky_or_dart_filter(path):
-    if os.path.isdir(path):
-        return True
-    _, ext = os.path.splitext(path)
-    # .dart includes '.mojom.dart'
-    return ext == '.sky' or ext == '.dart'
-
-
-def assets_filter(path):
-    if os.path.isdir(path):
-        return True
-    if os.path.basename(os.path.dirname(path)) != 'drawable-xxhdpi':
-        return False
-    # We only use the 18 and 24s for now.
-    return '18dp' in path or '24dp' in path
-
-
-def packages_filter(path):
-    if 'packages/sky/assets/material-design-icons/' in path:
-        return assets_filter(path)
-    if '.gitignore' in path:
-        return False
-    return True
-
-
-def ensure_dir_exists(path):
-    if not os.path.exists(path):
-        os.makedirs(path)
-
-
-def copy(from_root, to_root, filter_func=None, followlinks=False):
-    assert os.path.exists(from_root), "%s does not exist!" % from_root
-    if os.path.isfile(from_root):
-        ensure_dir_exists(os.path.dirname(to_root))
-        shutil.copy(from_root, to_root)
-        return
-
-    if os.path.exists(to_root):
-        shutil.rmtree(to_root)
-    os.makedirs(to_root)
-
-    for root, dirs, files in os.walk(from_root, followlinks=followlinks):
-        # filter_func expects paths not names, so wrap it to make them absolute.
-        wrapped_filter = None
-        if filter_func:
-            wrapped_filter = lambda name: filter_func(os.path.join(root, name))
-
-        for name in filter(wrapped_filter, files):
-            from_path = os.path.join(root, name)
-            root_rel_path = os.path.relpath(from_path, from_root)
-            to_path = os.path.join(to_root, root_rel_path)
-            to_dir = os.path.dirname(to_path)
-            if not os.path.exists(to_dir):
-                os.makedirs(to_dir)
-            shutil.copyfile(from_path, to_path)
-
-        dirs[:] = filter(wrapped_filter, dirs)
-
-
-def main():
-    logging.basicConfig(level=logging.WARN)
-    parser = argparse.ArgumentParser(description='Deploy a new build of mojo.')
-    parser.add_argument('deploy_root', type=str)
-    args = parser.parse_args()
-
-    # Always use android release?
-    rel_build_dir = os.path.join('out', 'android_Release')
-    build_dir = os.path.join(Paths().src_root, rel_build_dir)
-    paths = Paths(build_dir=build_dir)
-    dart_pkg_dir = os.path.join(paths.build_dir, 'gen', 'dart-pkg')
-    sky_pkg_dir = os.path.join(dart_pkg_dir, 'sky')
-    sky_pkg_lib_dir = os.path.join(sky_pkg_dir, 'lib')
-    dart_pkg_packages_dir = os.path.join(dart_pkg_dir, 'packages')
-
-    def deploy_path(rel_path):
-        return os.path.join(args.deploy_root, rel_path)
-
-    def src_path(rel_path):
-        return os.path.join(paths.src_root, rel_path)
-
-    # Verify that material-design-icons have been downloaded.
-    icons_dir = os.path.join(dart_pkg_packages_dir,
-                             'sky/assets/material-design-icons')
-    if not os.path.isdir(icons_dir):
-        print('NOTE: Running `download_material_design_icons` for you.');
-        subprocess.check_call([
-                os.path.join(sky_pkg_lib_dir, 'download_material_design_icons')
-            ])
-
-    # Copy sky/sdk/example into example/
-    copy(src_path('sky/sdk/example'), deploy_path('example'), examples_filter)
-
-    # Deep copy packages/. This follows symlinks and flattens them.
-    packages_root = deploy_path('packages')
-    copy(dart_pkg_packages_dir, packages_root, packages_filter, True)
-
-    # Write out license.
-    with open(deploy_path('LICENSES.sky'), 'w') as license_file:
-        subprocess.check_call([src_path('tools/licenses.py'), 'credits'],
-            stdout=license_file)
-
-    # Run git commands.
-    subprocess.check_call(['git', 'add', '.'], cwd=args.deploy_root)
-    subprocess.check_call([
-        'git', 'commit',
-        '-m', '%s from %s' % (rel_build_dir, git_revision())
-        ], cwd=args.deploy_root)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/mojo/tools/devtools.py b/mojo/tools/devtools.py
deleted file mode 100644
index 28a0d91..0000000
--- a/mojo/tools/devtools.py
+++ /dev/null
@@ -1,15 +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.
-
-import os
-import sys
-
-
-def add_lib_to_path():
-  """ Adds the devtools pylib to path, allowing to use it in the internal
-  /mojo/tools/ tooling. """
-  sys.path.append(os.path.join(os.path.dirname(__file__),
-                               os.pardir,
-                               "devtools",
-                               "common"))
diff --git a/mojo/tools/download_keystore.py b/mojo/tools/download_keystore.py
deleted file mode 100755
index 97ed4b5..0000000
--- a/mojo/tools/download_keystore.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Tool to download keys needed to sign the official Mojo Shell APK build.
-"""
-
-import argparse
-import os
-import subprocess
-import sys
-
-import mopy.gn as gn
-from mopy.config import Config
-from mopy.paths import Paths
-
-
-# Google Storage path of the official keystore to download.
-_KEYSTORE_PATH = "gs://mojo/android/keys/mojo_shell-official.keystore"
-_KEYSTORE_PWD_PATH = "gs://mojo/android/keys/mojo_shell-official.pwd"
-
-
-def _get_gsutil_exe():
-  """Get the path to gsutil executable."""
-  config = Config(target_os=Config.OS_ANDROID, is_debug=False,
-                  is_official_build=True)
-  paths = Paths(config)
-  sys.path.insert(0, os.path.join(paths.src_root, "tools"))
-  # pylint: disable=F0401
-  import find_depot_tools
-  depot_tools_path = find_depot_tools.add_depot_tools_to_path()
-  gsutil_exe = os.path.join(depot_tools_path, "third_party", "gsutil",
-                            "gsutil")
-  return gsutil_exe
-
-
-def _download_keystore(args):
-  """Downloads the keystore file on local disk."""
-  directory_path = args.output[0]
-  if args.verbose:
-    print "Downloading " + _KEYSTORE_PATH + " to " + directory_path
-  gsutil_exe = _get_gsutil_exe()
-  if args.dry_run:
-    print str([gsutil_exe, "cp", _KEYSTORE_PATH, directory_path])
-  else:
-    subprocess.check_call([gsutil_exe, "cp", _KEYSTORE_PATH, directory_path])
-
-
-def _output_password(args):
-  """Outputs the keystore password on the standard output."""
-  # The build system cannot read a file that is generated by a script and
-  # use its content as a variable. It can either 1/ read a file already there
-  # or 2/ put a script output in a variable. Hence the fact that we do not
-  # download the password to a file, but output it on the standard output.
-  gsutil_exe = _get_gsutil_exe()
-
-  if args.dry_run:
-    print str([gsutil_exe, "cat", _KEYSTORE_PWD_PATH])
-  else:
-    subprocess.check_call([gsutil_exe, "cat", _KEYSTORE_PWD_PATH],
-                          stdout=sys.stdout)
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description="Downloads the keystore used to sign official APK builds.")
-  parser.add_argument("-n", "--dry_run", help="Dry run, do not actually "+
-      "download", action="store_true")
-  parser.add_argument("-v", "--verbose", help="Verbose mode",
-      action="store_true")
-
-  subparsers = parser.add_subparsers()
-
-  keystore_file_parser = subparsers.add_parser(
-      "keystore_file", help="Downloads the keystore file")
-  keystore_file_parser.add_argument("output", nargs=1, type=str,
-                      help="Output path to save the keystore to")
-  keystore_file_parser.set_defaults(func=_download_keystore)
-
-  keystore_pwd_parser = subparsers.add_parser(
-      "keystore_password", help="Outputs the keystore password")
-  keystore_pwd_parser.set_defaults(func=_output_password)
-
-  args = parser.parse_args()
-  args.func(args)
-
-
-  return 0
-
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/mojo/tools/embed/data.h b/mojo/tools/embed/data.h
deleted file mode 100644
index 50bf074..0000000
--- a/mojo/tools/embed/data.h
+++ /dev/null
@@ -1,22 +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.
-
-#ifndef MOJO_TOOLS_EMBED_DATA_H_
-#define MOJO_TOOLS_EMBED_DATA_H_
-
-#include <stddef.h>  // For size_t.
-
-namespace mojo {
-namespace embed {
-
-struct Data {
-  const char* const hash;
-  const char* const data;
-  const size_t size;
-};
-
-}  // namespace embed
-}  // namespace mojo
-
-#endif  // MOJO_TOOLS_EMBED_DATA_H_
diff --git a/mojo/tools/embed/embed_data.py b/mojo/tools/embed/embed_data.py
deleted file mode 100755
index f34348a..0000000
--- a/mojo/tools/embed/embed_data.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import argparse
-import hashlib
-import os
-import sys
-
-def main():
-  """Command line utility to embed file in a C executable."""
-  parser = argparse.ArgumentParser(
-      description='Generate a source file to embed the content of a file')
-
-  parser.add_argument('source')
-  parser.add_argument('out_dir')
-  parser.add_argument('namespace')
-  parser.add_argument('variable')
-
-  opts = parser.parse_args()
-
-  if not os.path.exists(opts.out_dir):
-    os.makedirs(opts.out_dir)
-
-  header = os.path.join(opts.out_dir, '%s.h' % opts.variable)
-  c_file = os.path.join(opts.out_dir, '%s.cc' % opts.variable)
-  namespaces = opts.namespace.split('::')
-
-  data = None
-  with open(opts.source, "rb") as f:
-    data = f.read()
-
-  with open(header, "w") as f:
-    f.write('// Generated file. Do not modify.\n')
-    f.write('\n')
-    f.write('#include "mojo/tools/embed/data.h"\n')
-    f.write('\n')
-    for n in namespaces:
-      f.write('namespace %s {\n' % n)
-    f.write('extern const mojo::embed::Data %s;\n' % opts.variable);
-    for n in reversed(namespaces):
-      f.write('}  // namespace %s\n' % n)
-
-  sha1hash = hashlib.sha1(data).hexdigest()
-  values = ["0x%02x" % ord(c) for c in data]
-  lines = []
-  chunk_size = 16
-  for i in range(0, len(values), chunk_size):
-    lines.append("  " + ", ".join(values[i: i + chunk_size]))
-
-  with open(c_file, "w") as f:
-    f.write('// Generated file. Do not modify.\n')
-    f.write('\n')
-    f.write('#include "mojo/tools/embed/data.h"\n')
-    f.write('\n')
-    for n in namespaces:
-      f.write('namespace %s {\n' % n)
-    f.write('namespace {\n')
-    f.write("const char data[%d] = {\n" % len(data))
-    f.write(",\n".join(lines))
-    f.write("\n};\n")
-    f.write('}  // namespace\n')
-    f.write('\n')
-    f.write('extern const mojo::embed::Data %s;\n' % opts.variable);
-    f.write('const mojo::embed::Data %s = {\n' % opts.variable);
-    f.write('  "%s",\n' % sha1hash)
-    f.write('  data,\n')
-    f.write('  sizeof(data)\n')
-    f.write('};\n');
-    f.write('\n')
-    for n in reversed(namespaces):
-      f.write('}  // namespace %s\n' % n)
-
-if __name__ == '__main__':
-  main()
diff --git a/mojo/tools/embed/rules.gni b/mojo/tools/embed/rules.gni
deleted file mode 100644
index 6171812..0000000
--- a/mojo/tools/embed/rules.gni
+++ /dev/null
@@ -1,49 +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.
-
-template("embed_file") {
-  assert(defined(invoker.variable))
-  assert(defined(invoker.source))
-  assert(defined(invoker.namespace))
-
-  variable = invoker.variable
-  generator_target_name = "__${target_name}_generator"
-  generator_outputs = [
-    "${target_gen_dir}/${variable}.cc",
-    "${target_gen_dir}/${variable}.h",
-  ]
-
-  action(generator_target_name) {
-    script = "//mojo/tools/embed/embed_data.py"
-    sources = [
-      invoker.source,
-    ]
-    outputs = generator_outputs
-    args = [
-      rebase_path(invoker.source),
-      rebase_path(target_gen_dir),
-      invoker.namespace,
-      variable,
-    ]
-
-    if (defined(invoker.testonly)) {
-      testonly = invoker.testonly
-    }
-    if (defined(invoker.deps)) {
-      deps = invoker.deps
-    }
-  }
-
-  source_set(target_name) {
-    sources = generator_outputs
-
-    if (defined(invoker.testonly)) {
-      testonly = invoker.testonly
-    }
-
-    deps = [
-      ":${generator_target_name}",
-    ]
-  }
-}
diff --git a/mojo/tools/generate_java_callback_interfaces.py b/mojo/tools/generate_java_callback_interfaces.py
deleted file mode 100644
index 257a540..0000000
--- a/mojo/tools/generate_java_callback_interfaces.py
+++ /dev/null
@@ -1,69 +0,0 @@
-"""Generate the org.chromium.mojo.bindings.Callbacks interface"""
-
-import argparse
-import sys
-
-CALLBACK_TEMPLATE = ("""
-    /**
-     * A generic %d-argument callback.
-     *
-     * %s
-     */
-    interface Callback%d<%s> {
-        /**
-         * Call the callback.
-         */
-        public void call(%s);
-    }
-""")
-
-INTERFACE_TEMPLATE = (
-"""// 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.
-
-// This file was generated using
-//     mojo/tools/generate_java_callback_interfaces.py
-
-package org.chromium.mojo.bindings;
-
-/**
- * Contains a generic interface for callbacks.
- */
-public interface Callbacks {
-
-    /**
-     * A generic callback.
-     */
-    interface Callback0 {
-        /**
-         * Call the callback.
-         */
-        public void call();
-    }
-%s
-}""")
-
-def GenerateCallback(nb_args):
-  params = '\n      * '.join(
-      ['@param <T%d> the type of argument %d.' % (i+1, i+1)
-       for i in xrange(nb_args)])
-  template_parameters = ', '.join(['T%d' % (i+1) for i in xrange(nb_args)])
-  callback_parameters = ', '.join(['T%d arg%d' % ((i+1), (i+1))
-                                   for i in xrange(nb_args)])
-  return CALLBACK_TEMPLATE % (nb_args, params, nb_args, template_parameters,
-                              callback_parameters)
-
-def main():
-  parser = argparse.ArgumentParser(
-      description="Generate org.chromium.mojo.bindings.Callbacks")
-  parser.add_argument("max_args", nargs=1, type=int,
-      help="maximal number of arguments to generate callbacks for")
-  args = parser.parse_args()
-  max_args = args.max_args[0]
-  print INTERFACE_TEMPLATE % ''.join([GenerateCallback(i+1)
-                                      for i in xrange(max_args)])
-  return 0
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/mojo/tools/get_test_list.py b/mojo/tools/get_test_list.py
deleted file mode 100755
index 341b3d8..0000000
--- a/mojo/tools/get_test_list.py
+++ /dev/null
@@ -1,243 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Central list of tests to run (as appropriate for a given config). Add tests
-to run by modifying this file.
-
-Note that this file is both imported (by mojob.py) and run directly (via a
-recipe)."""
-
-
-import argparse
-import json
-import os
-import sys
-
-from mopy.config import Config
-from mopy.paths import Paths
-
-
-def GetTestList(config, verbose_count=0):
-  """Gets the list of tests to run for the given config. The test list (which is
-  returned) is just a list of dictionaries, each dictionary having two required
-  fields:
-    {
-      "name": "Short name",
-      "command": ["python", "test_runner.py", "--some", "args"]
-    }
-  """
-
-  types_to_run = set(config.test_types)
-
-  # See above for a description of the test list.
-  test_list = []
-
-  paths = Paths(config)
-  build_dir = paths.SrcRelPath(paths.build_dir)
-  target_os = config.target_os
-
-  verbose_flags = verbose_count * ["--verbose"]
-
-  # Utility functions ----------------------------------------------------------
-
-  # Call this to determine if a test matching classes this_tests_types should
-  # run: e.g., ShouldRunTest(Config.TEST_TYPE_DEFAULT, "sky") returns true if
-  # the test list being requested specifies the default set or the "sky" set.
-  def ShouldRunTest(*this_tests_types):
-    return not types_to_run.isdisjoint(this_tests_types)
-
-  # Call this to add the given command to the test list.
-  def AddEntry(name, command):
-    if config.sanitizer == Config.SANITIZER_ASAN:
-      command = (["python", os.path.join("mojo", "tools",
-                                         "run_command_through_symbolizer.py")] +
-                 command)
-    test_list.append({"name": name, "command": command})
-
-  # Call this to add the given command to the test list. If appropriate, the
-  # command will be run under xvfb.
-  def AddXvfbEntry(name, command):
-    real_command = ["python"]
-    if config.target_os == Config.OS_LINUX:
-      real_command += ["./testing/xvfb.py", paths.SrcRelPath(paths.build_dir)]
-    real_command += command
-    AddEntry(name, real_command)
-
-  # ----------------------------------------------------------------------------
-
-  # TODO(vtl): Currently, we only know how to run tests for Android, Linux, or
-  # Windows.
-  if target_os not in (Config.OS_ANDROID, Config.OS_LINUX, Config.OS_WINDOWS,
-                       Config.OS_IOS):
-    return test_list
-
-  # Tests run by default -------------------------------------------------------
-
-  # C++ unit tests:
-  if ShouldRunTest(Config.TEST_TYPE_DEFAULT, Config.TEST_TYPE_UNIT):
-    AddXvfbEntry("Unit tests",
-                 [os.path.join("mojo", "tools", "test_runner.py"),
-                  os.path.join("mojo", "tools", "data", "unittests"),
-                  build_dir] + verbose_flags)
-    # NaCl tests (Linux only):
-    if (target_os == Config.OS_LINUX and
-        config.sanitizer != Config.SANITIZER_ASAN):
-      AddEntry("NaCl tests",
-               [os.path.join(build_dir, "monacl_shell"),
-                os.path.join(build_dir, "irt_" + config.target_cpu,
-                             "irt_mojo.nexe"),
-                os.path.join(build_dir, "clang_newlib_" + config.target_cpu,
-                             "monacl_test.nexe")])
-
-  # C++ app tests:
-  if ShouldRunTest(Config.TEST_TYPE_DEFAULT, "app"):
-    AddXvfbEntry("App tests",
-                 [os.path.join("mojo", "tools", "apptest_runner.py"),
-                  os.path.join("mojo", "tools", "data", "apptests"),
-                  build_dir] + verbose_flags)
-    # NaCl app tests (Linux only):
-    if (target_os == Config.OS_LINUX and
-        config.sanitizer != Config.SANITIZER_ASAN):
-      AddXvfbEntry("NaCl app tests",
-                   [os.path.join("mojo", "tools", "apptest_runner.py"),
-                    os.path.join("mojo", "tools", "data", "nacl_apptests"),
-                    build_dir] + verbose_flags)
-
-  # Go unit tests (Linux-only):
-  if (target_os == Config.OS_LINUX and
-      config.sanitizer != Config.SANITIZER_ASAN and
-      ShouldRunTest(Config.TEST_TYPE_DEFAULT, Config.TEST_TYPE_UNIT, "go")):
-    AddEntry("Go unit tests",
-             [os.path.join(build_dir, "obj", "mojo", "go", "system_test")])
-
-  # Python unit tests:
-  if ShouldRunTest(Config.TEST_TYPE_DEFAULT, Config.TEST_TYPE_UNIT, "python"):
-    AddEntry("Python unit tests",
-             ["python", os.path.join("mojo", "tools",
-              "run_mojo_python_tests.py")])
-
-  # Python bindings tests (Linux-only):
-  # See http://crbug.com/438781 for details on asan exclusion.
-  if (target_os == Config.OS_LINUX and
-      ShouldRunTest(Config.TEST_TYPE_DEFAULT, Config.TEST_TYPE_UNIT,
-                    "python") and
-      config.sanitizer != Config.SANITIZER_ASAN):
-    AddEntry("Python bindings tests",
-             ["python",
-              os.path.join("mojo", "tools",
-                           "run_mojo_python_bindings_tests.py"),
-              "--build-dir=" + build_dir])
-
-  # Sky tests (Linux-only):
-  # TODO(abarth): Re-enabled in ASAN once the DartVM works in ASAN.
-  # See https://code.google.com/p/dart/issues/detail?id=22122
-  if (target_os == Config.OS_LINUX and
-      ShouldRunTest(Config.TEST_TYPE_DEFAULT, "sky") and
-      config.sanitizer != Config.SANITIZER_ASAN):
-    sky_command = ["python",
-                   "sky/tools/test_sky",
-                   "-t", os.path.basename(build_dir),
-                   "--no-new-test-results", "--no-show-results", "--verbose"]
-    if config.values.get("builder_name"):
-      sky_command += ["--builder-name", config.values["builder_name"]]
-    if config.values.get("build_number"):
-      sky_command += ["--build-number", config.values["build_number"]]
-    if config.values.get("master_name"):
-      sky_command += ["--master-name", config.values["master_name"]]
-    if config.values.get("test_results_server"):
-      sky_command += ["--test-results-server",
-                      config.values["test_results_server"]]
-    AddXvfbEntry("Sky tests", sky_command)
-
-  # Observatory tests (Linux-only):
-  if target_os == Config.OS_LINUX:
-    AddEntry("Dart Observatory tests",
-             ["python",
-              os.path.join("mojo", "dart", "observatory_tester", "runner.py"),
-              "--build-dir=" + build_dir,
-              "--dart-exe=third_party/dart-sdk/dart-sdk/bin/dart"])
-
-    AddEntry("Dart HTTP Load test",
-           ["python",
-            os.path.join("mojo", "dart", "http_load_test", "runner.py"),
-            "--build-dir=" + build_dir,
-            "--dart-exe=third_party/dart-sdk/dart-sdk/bin/dart"])
-
-  # mojo tools unit tests:
-  if ShouldRunTest(Config.TEST_TYPE_DEFAULT, Config.TEST_TYPE_UNIT, "tools"):
-    AddEntry("Mojo tools unit tests",
-             ["python", os.path.join("mojo", "tools", "testing",
-                                     "mojom_fetcher",
-                                     "mojom_fetcher_tests.py")])
-
-  # Dart mojom package generate.dart script tests:
-  if target_os == Config.OS_LINUX:
-    AddEntry("Dart mojom package generate tests",
-        [os.path.join("third_party", "dart-sdk", "dart-sdk", "bin", "dart"),
-         "--checked",
-         "-p", os.path.join("mojo", "dart", "mojom", "packages"),
-         os.path.join("mojo", "dart", "mojom", "test", "generate_test.dart")])
-
-  # Perf tests -----------------------------------------------------------------
-
-  if target_os == Config.OS_LINUX and ShouldRunTest(Config.TEST_TYPE_PERF):
-    perf_id = "linux_%s" % ("debug" if config.is_debug else "release")
-    test_names = ["mojo_public_system_perftests",
-                  "mojo_public_bindings_perftests"]
-
-    for test_name in test_names:
-      command = ["python",
-                 os.path.join("mojo", "tools", "perf_test_runner.py"),
-                 "--perf-id", perf_id,
-                 "--test-name", test_name,
-                 "--perf-data-path",
-                 os.path.join(build_dir, test_name + "_perf.log"),
-                 "--production-dashboard"]
-      if config.values.get("builder_name"):
-        command += ["--builder-name", config.values["builder_name"]]
-      if config.values.get("build_number"):
-        command += ["--build-number", config.values["build_number"]]
-      if config.values.get("master_name"):
-        command += ["--master-name", config.values["master_name"]]
-      command += [os.path.join(build_dir, test_name)]
-
-      AddEntry(test_name, command)
-
-  # Integration tests ----------------------------------------------------------
-
-  if target_os == Config.OS_ANDROID and ShouldRunTest(
-      Config.TEST_TYPE_DEFAULT, Config.TEST_TYPE_INTEGRATION):
-    AddEntry("Integration test (MojoTest)",
-             ["python",
-              os.path.join("build", "android", "test_runner.py"),
-              "instrumentation",
-              "--test-apk=MojoTest",
-              "--output-directory=%s" % build_dir,
-              "--test_data=bindings:mojo/public/interfaces/bindings/tests/data"]
-             + verbose_flags)
-
-  return test_list
-
-
-def main():
-  parser = argparse.ArgumentParser(description="Gets tests to execute.")
-  parser.add_argument("config_file", metavar="config.json",
-                      type=argparse.FileType("rb"),
-                      help="Input JSON file with test configuration.")
-  parser.add_argument("test_list_file", metavar="test_list.json", nargs="?",
-                      type=argparse.FileType("wb"), default=sys.stdout,
-                      help="Output JSON file with test list.")
-  args = parser.parse_args()
-
-  config = Config(**json.load(args.config_file))
-  test_list = GetTestList(config)
-  json.dump(test_list, args.test_list_file, indent=2)
-  args.test_list_file.write("\n")
-
-  return 0
-
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/mojo/tools/linux64/dump_syms.sha1 b/mojo/tools/linux64/dump_syms.sha1
deleted file mode 100644
index fd68948..0000000
--- a/mojo/tools/linux64/dump_syms.sha1
+++ /dev/null
@@ -1 +0,0 @@
-4bd8f841d0cebc3f7dac4c5bf2cdf86694605692
diff --git a/mojo/tools/linux64/symupload.sha1 b/mojo/tools/linux64/symupload.sha1
deleted file mode 100644
index d4563e4..0000000
--- a/mojo/tools/linux64/symupload.sha1
+++ /dev/null
@@ -1 +0,0 @@
-5d03513c81fba7f0acdc3ea314c46667d6624eb6
\ No newline at end of file
diff --git a/mojo/tools/message_generator.cc b/mojo/tools/message_generator.cc
deleted file mode 100644
index 08b7dccb..0000000
--- a/mojo/tools/message_generator.cc
+++ /dev/null
@@ -1,63 +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.
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/message_internal.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-// This file is used to generate various files corresponding to mojo
-// messages. The various binding implementations can parse these to verify they
-// correctly decode messages.
-//
-// The output consists of each byte of the message encoded in a hex string with
-// a newline after it.
-namespace mojo {
-namespace {
-
-std::string BinaryToHex(const base::StringPiece& piece) {
-  std::string result("// File generated by mojo_message_generator.\n");;
-  result.reserve(result.size() + (piece.size() * 5));
-  for (size_t i = 0; i < piece.size(); ++i)
-    base::StringAppendF(&result, "0X%.2X\n", static_cast<int>(piece.data()[i]));
-  return result;
-}
-
-void WriteMessageToFile(const Message& message, const base::FilePath& path) {
-  const std::string hex_message(BinaryToHex(
-      base::StringPiece(reinterpret_cast<const char*>(message.data()),
-                        message.data_num_bytes())));
-  CHECK_EQ(static_cast<int>(hex_message.size()),
-           base::WriteFile(path, hex_message.data(),
-                           static_cast<int>(hex_message.size())));
-}
-
-// Generates a message of type MessageData. The message uses the name 21,
-// with 4 bytes of payload: 0x9, 0x8, 0x7, 0x6.
-void GenerateMessageDataMessage() {
-  internal::MessageBuilder builder(static_cast<uint32_t>(21),
-                                   static_cast<size_t>(4));
-  char* data = static_cast<char*>(builder.buffer()->Allocate(4));
-  DCHECK(data);
-  data[0] = 9;
-  data[1] = 8;
-  data[2] = 7;
-  data[3] = 6;
-
-  Message message;
-  builder.Finish(&message);
-  WriteMessageToFile(message,
-                     base::FilePath(FILE_PATH_LITERAL("message_data")));
-}
-
-}  // namespace
-}  // namespace mojo
-
-int main(int argc, char** argv) {
-  mojo::GenerateMessageDataMessage();
-  return 0;
-}
diff --git a/mojo/tools/mojob.py b/mojo/tools/mojob.py
deleted file mode 100755
index e7bda93..0000000
--- a/mojo/tools/mojob.py
+++ /dev/null
@@ -1,318 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""A simple script to make building/testing Mojo components easier."""
-
-import argparse
-from copy import deepcopy
-import logging
-from multiprocessing import cpu_count
-import os
-import subprocess
-import sys
-
-from get_test_list import GetTestList
-from mopy.config import Config
-from mopy.paths import Paths
-from mopy.gn import GNArgsForConfig, ParseGNConfig, CommandLineForGNArgs
-from mopy.log import InitLogging
-
-
-_logger = logging.getLogger()
-_verbose_count = 0
-
-
-def _args_to_config(args):
-  # Default to host OS.
-  target_os = None
-  if args.android:
-    target_os = Config.OS_ANDROID
-  elif args.ios:
-    target_os = Config.OS_IOS
-
-  target_cpu = args.target_cpu
-
-  additional_args = {}
-
-  if 'clang' in args:
-    additional_args['is_clang'] = args.clang
-
-  if 'asan' in args and args.asan:
-    additional_args['sanitizer'] = Config.SANITIZER_ASAN
-
-  # Additional non-standard config entries:
-
-  if 'goma' in args:
-    goma_dir = os.environ.get('GOMA_DIR')
-    goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma')
-    if args.goma and goma_dir:
-      additional_args['use_goma'] = True
-      additional_args['goma_dir'] = goma_dir
-    elif args.goma and os.path.exists(goma_home_dir):
-      additional_args['use_goma'] = True
-      additional_args['goma_dir'] = goma_home_dir
-    else:
-      additional_args['use_goma'] = False
-      additional_args['goma_dir'] = None
-
-  if 'nacl' in args:
-    additional_args['use_nacl'] = args.nacl
-
-  if not ('asan' in args and args.asan):
-    go_dir = os.path.join(Paths().src_root, 'third_party', 'go', 'tool')
-    if args.android:
-      additional_args['mojo_use_go'] = True
-      additional_args['go_build_tool'] = os.path.join(
-          go_dir, 'android_arm', 'bin', 'go')
-    elif target_os is None and Config.GetHostOS() == Config.OS_LINUX:
-      additional_args['mojo_use_go'] = True
-      additional_args['go_build_tool'] = os.path.join(
-          go_dir, 'linux_amd64', 'bin', 'go')
-
-  if 'dry_run' in args:
-    additional_args['dry_run'] = args.dry_run
-
-  if 'builder_name' in args:
-    additional_args['builder_name'] = args.builder_name
-  if 'build_number' in args:
-    additional_args['build_number'] = args.build_number
-  if 'master_name' in args:
-    additional_args['master_name'] = args.master_name
-  if 'test_results_server' in args:
-    additional_args['test_results_server'] = args.test_results_server
-
-  if 'gn_args' in args:
-    additional_args['gn_args'] = args.gn_args
-
-  is_debug = args.debug and not args.official
-
-  return Config(target_os=target_os, target_cpu=target_cpu,
-                is_debug=is_debug, is_official_build=args.official,
-                dcheck_always_on=args.dcheck_always_on,
-                is_simulator=args.simulator, **additional_args)
-
-
-def _get_out_dir(config):
-  """Gets the build output directory (e.g., out/Debug), relative to src, for the
-  given config."""
-
-  paths = Paths(config)
-  return paths.SrcRelPath(paths.build_dir)
-
-
-def _sync(config):  # pylint: disable=W0613
-  """Runs gclient sync for the given config."""
-
-  _logger.debug('_sync()')
-  return subprocess.call(['gclient', 'sync'])
-
-
-def _gn(config):
-  """Runs gn gen for the given config."""
-
-  _logger.debug('_gn()')
-
-  command = ['gn', 'gen', '--check']
-
-  gn_args = CommandLineForGNArgs(GNArgsForConfig(config))
-  out_dir = _get_out_dir(config)
-  command.append(out_dir)
-  command.append('--args=%s' % ' '.join(gn_args))
-
-  print 'Running %s %s ...' % (command[0],
-                               ' '.join('\'%s\'' % x for x in command[1:]))
-  return subprocess.call(command)
-
-
-def _build(config):
-  """Builds for the given config."""
-
-  _logger.debug('_build()')
-
-  out_dir = _get_out_dir(config)
-  gn_args = ParseGNConfig(out_dir)
-  print 'Building in %s ...' % out_dir
-  if gn_args.get('use_goma'):
-    # Use the configured goma directory.
-    local_goma_dir = gn_args.get('goma_dir')
-    print 'Ensuring goma (in %s) started ...' % local_goma_dir
-    command = ['python',
-               os.path.join(local_goma_dir, 'goma_ctl.py'),
-               'ensure_start']
-    exit_code = subprocess.call(command)
-    if exit_code:
-      return exit_code
-
-    # Goma allows us to run many more jobs in parallel, say 32 per core/thread
-    # (= 1024 on a 16-core, 32-thread Z620). Limit the load average to 4 per
-    # core/thread (= 128 on said Z620).
-    jobs = cpu_count() * 32
-    limit = cpu_count() * 4
-    return subprocess.call(['ninja', '-j', str(jobs), '-l', str(limit),
-                            '-C', out_dir])
-  else:
-    return subprocess.call(['ninja', '-C', out_dir])
-
-
-def _run_tests(config, test_types):
-  """Runs the tests of the given type(s) for the given config."""
-
-  assert isinstance(test_types, list)
-  config = deepcopy(config)
-  config.values['test_types'] = test_types
-
-  test_list = GetTestList(config, verbose_count=_verbose_count)
-  dry_run = config.values.get('dry_run')
-  final_exit_code = 0
-  failure_list = []
-  for entry in test_list:
-    print 'Running: %s' % entry['name']
-    print 'Command: %s' % ' '.join(entry['command'])
-    if dry_run:
-      continue
-
-    _logger.info('Starting: %s' % ' '.join(entry['command']))
-    exit_code = subprocess.call(entry['command'])
-    _logger.info('Completed: %s' % ' '.join(entry['command']))
-    if exit_code:
-      if not final_exit_code:
-        final_exit_code = exit_code
-      failure_list.append(entry['name'])
-
-  print 72 * '='
-  print 'SUMMARY:',
-  if dry_run:
-    print 'Dry run: no tests run'
-  elif not failure_list:
-    assert not final_exit_code
-    print 'All tests passed'
-  else:
-    assert final_exit_code
-    print 'The following had failures:', ', '.join(failure_list)
-
-  return final_exit_code
-
-
-def _test(config):
-  _logger.debug('_test()')
-  return _run_tests(config, [Config.TEST_TYPE_DEFAULT])
-
-
-def _perftest(config):
-  _logger.debug('_perftest()')
-  return _run_tests(config, [Config.TEST_TYPE_PERF])
-
-
-def _pytest(config):
-  _logger.debug('_pytest()')
-  return _run_tests(config, ['python'])
-
-
-def main():
-  os.chdir(Paths().src_root)
-
-  parser = argparse.ArgumentParser(description='A script to make building'
-      '/testing Mojo components easier.')
-
-  parent_parser = argparse.ArgumentParser(add_help=False)
-
-  parent_parser.add_argument('--verbose',
-                             help='Be verbose (multiple times for more)',
-                             default=0, dest='verbose_count', action='count')
-
-  parent_parser.add_argument('--asan', help='Use Address Sanitizer',
-                             action='store_true')
-  parent_parser.add_argument('--dcheck_always_on',
-                             help='DCHECK and MOJO_DCHECK are fatal even in '
-                             'release builds',
-                             action='store_true')
-
-  debug_group = parent_parser.add_mutually_exclusive_group()
-  debug_group.add_argument('--debug', help='Debug build (default)',
-                           default=True, action='store_true')
-  debug_group.add_argument('--release', help='Release build', default=False,
-                           dest='debug', action='store_false')
-  # The official build is a release build suitable for distribution, with a
-  # different package name.
-  debug_group.add_argument('--official', help='Official build', default=False,
-                           dest='official', action='store_true')
-
-  os_group = parent_parser.add_mutually_exclusive_group()
-  os_group.add_argument('--android', help='Build for Android',
-                        action='store_true')
-  os_group.add_argument('--ios', help='Build for iOS',
-                        action='store_true')
-
-  parent_parser.add_argument('--simulator',
-                             help='Build for a simulator of the target',
-                             action='store_true')
-
-  parent_parser.add_argument('--target-cpu',
-                             help='CPU architecture to build for.',
-                             choices=['x64', 'x86', 'arm'])
-
-  subparsers = parser.add_subparsers()
-
-  sync_parser = subparsers.add_parser('sync', parents=[parent_parser],
-      help='Sync using gclient (does not run gn).')
-  sync_parser.set_defaults(func=_sync)
-
-  gn_parser = subparsers.add_parser('gn', parents=[parent_parser],
-                                    help='Run gn for mojo (does not sync).')
-  gn_parser.set_defaults(func=_gn)
-  gn_parser.add_argument('--args', help='Specify extra args',
-                         default=None, dest='gn_args')
-  # Note: no default, if nothing is specified on the command line GN decides.
-  gn_parser.add_argument('--nacl', help='Add in NaCl', action='store_true',
-                         default=argparse.SUPPRESS)
-  gn_parser.add_argument('--no-nacl', help='Remove NaCl', action='store_false',
-                         default=argparse.SUPPRESS, dest='nacl')
-
-  clang_group = gn_parser.add_mutually_exclusive_group()
-  clang_group.add_argument('--clang', help='Use Clang (default)', default=None,
-                           action='store_true')
-  clang_group.add_argument('--gcc', help='Use GCC',
-                           dest='clang', action='store_false')
-  goma_group = gn_parser.add_mutually_exclusive_group()
-  goma_group.add_argument('--goma',
-                          help='Use Goma (if $GOMA_DIR is set or $HOME/goma '
-                               'exists; default)',
-                          default=True,
-                          action='store_true')
-  goma_group.add_argument('--no-goma', help='Don\'t use Goma', default=False,
-                          dest='goma', action='store_false')
-
-  build_parser = subparsers.add_parser('build', parents=[parent_parser],
-                                       help='Build')
-  build_parser.set_defaults(func=_build)
-
-  test_parser = subparsers.add_parser('test', parents=[parent_parser],
-                                      help='Run unit tests (does not build).')
-  test_parser.set_defaults(func=_test)
-  test_parser.add_argument('--dry-run',
-                           help='Print instead of executing commands',
-                           default=False, action='store_true')
-
-  perftest_parser = subparsers.add_parser('perftest', parents=[parent_parser],
-      help='Run perf tests (does not build).')
-  perftest_parser.set_defaults(func=_perftest)
-
-  pytest_parser = subparsers.add_parser('pytest', parents=[parent_parser],
-      help='Run Python unit tests (does not build).')
-  pytest_parser.set_defaults(func=_pytest)
-
-  args = parser.parse_args()
-  global _verbose_count
-  _verbose_count = args.verbose_count
-  InitLogging(_verbose_count)
-
-  if args.simulator and not args.ios:
-    sys.exit("Currently, the simulator target is only configured for iOS")
-
-  return args.func(_args_to_config(args))
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/tools/mopy/__init__.py b/mojo/tools/mopy/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/tools/mopy/__init__.py
+++ /dev/null
diff --git a/mojo/tools/mopy/config.py b/mojo/tools/mopy/config.py
deleted file mode 100644
index a0df490..0000000
--- a/mojo/tools/mopy/config.py
+++ /dev/null
@@ -1,148 +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.
-
-"""Build/test configurations, which are just dictionaries. This
-"defines" the schema and provides some wrappers."""
-
-
-import platform
-import sys
-
-
-class Config(object):
-  """A Config is basically just a wrapper around a dictionary that species a
-  build/test configuration. The dictionary is accessible through the values
-  member."""
-
-  # Valid values for target_os (None is also valid):
-  OS_ANDROID = "android"
-  OS_IOS = "ios"
-  OS_LINUX = "linux"
-  OS_MAC = "mac"
-  OS_WINDOWS = "windows"
-
-  # Valid values for target_cpu (None is also valid):
-  ARCH_X86 = "x86"
-  ARCH_X64 = "x64"
-  ARCH_ARM = "arm"
-
-  # Valid values for sanitizer (None is also valid):
-  SANITIZER_ASAN = "asan"
-
-  # Standard values for test types (test types are arbitrary strings; other
-  # values are allowed).
-  TEST_TYPE_DEFAULT = "default"
-  TEST_TYPE_UNIT = "unit"
-  TEST_TYPE_PERF = "perf"
-  TEST_TYPE_INTEGRATION = "integration"
-
-  def __init__(self, target_os=None, target_cpu=None, is_debug=True,
-               is_clang=None, sanitizer=None, dcheck_always_on=False,
-               is_simulator=False, is_official_build=False, **kwargs):
-    """Constructs a Config with key-value pairs specified via keyword arguments.
-    If target_os is not specified, it will be set to the host OS."""
-
-    assert target_os in (None, Config.OS_ANDROID, Config.OS_IOS,
-                         Config.OS_LINUX, Config.OS_MAC,
-                         Config.OS_WINDOWS)
-    assert target_cpu in (None, Config.ARCH_X86, Config.ARCH_X64,
-                           Config.ARCH_ARM)
-    assert isinstance(is_debug, bool)
-    assert isinstance(is_official_build, bool)
-    assert is_clang is None or isinstance(is_clang, bool)
-    assert sanitizer in (None, Config.SANITIZER_ASAN)
-    if "test_types" in kwargs:
-      assert isinstance(kwargs["test_types"], list)
-
-    self.values = {}
-    self.values["target_os"] = (self.GetHostOS() if target_os is None else
-                                target_os)
-
-    if target_cpu is None:
-      if target_os == Config.OS_ANDROID:
-        target_cpu = Config.ARCH_ARM
-      elif target_os == Config.OS_IOS:
-        target_cpu = Config.ARCH_X64 if is_simulator else Config.ARCH_ARM
-      else:
-        target_cpu = self.GetHostCPUArch()
-
-    self.values["target_cpu"] = target_cpu
-    self.values["is_simulator"] = is_simulator
-    self.values["is_debug"] = is_debug
-    self.values["is_official_build"] = is_official_build
-    self.values["is_clang"] = is_clang
-    self.values["sanitizer"] = sanitizer
-    self.values["dcheck_always_on"] = dcheck_always_on
-
-    self.values.update(kwargs)
-
-  @staticmethod
-  def GetHostOS():
-    if sys.platform == "linux2":
-      return Config.OS_LINUX
-    if sys.platform == "darwin":
-      return Config.OS_MAC
-    if sys.platform == "win32":
-      return Config.OS_WINDOWS
-    raise NotImplementedError("Unsupported host OS")
-
-  @staticmethod
-  def GetHostCPUArch():
-    # Derived from //native_client/pynacl/platform.py
-    machine = platform.machine()
-    if machine in ("x86", "x86-32", "x86_32", "x8632", "i386", "i686", "ia32",
-                   "32"):
-      return Config.ARCH_X86
-    if machine in ("x86-64", "amd64", "x86_64", "x8664", "64"):
-      return Config.ARCH_X64
-    if machine.startswith("arm"):
-      return Config.ARCH_ARM
-    raise Exception("Cannot identify CPU arch: %s" % machine)
-
-  # Getters for standard fields ------------------------------------------------
-
-  @property
-  def target_os(self):
-    """OS of the build/test target."""
-    return self.values["target_os"]
-
-  @property
-  def target_cpu(self):
-    """CPU arch of the build/test target."""
-    return self.values["target_cpu"]
-
-  @property
-  def is_simulator(self):
-    """Is a simulator build?"""
-    return self.values["is_simulator"]
-
-  @property
-  def is_debug(self):
-    """Is Debug build?"""
-    return self.values["is_debug"]
-
-  @property
-  def is_official_build(self):
-    """Is Official build?"""
-    return self.values["is_official_build"]
-
-  @property
-  def dcheck_always_on(self):
-    """DCHECK and MOJO_DCHECK are fatal even in release builds"""
-    return self.values["dcheck_always_on"]
-
-  @property
-  def is_clang(self):
-    """Should use clang?"""
-    return self.values["is_clang"]
-
-  @property
-  def sanitizer(self):
-    """Sanitizer to use, if any."""
-    return self.values["sanitizer"]
-
-  @property
-  def test_types(self):
-    """List of test types to run."""
-    return self.values.get("test_types", [Config.TEST_TYPE_DEFAULT])
diff --git a/mojo/tools/mopy/file_hash.py b/mojo/tools/mopy/file_hash.py
deleted file mode 100644
index abdd821..0000000
--- a/mojo/tools/mopy/file_hash.py
+++ /dev/null
@@ -1,26 +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.
-
-import logging
-
-# pylint: disable=E0611
-from hashlib import sha256
-
-from mopy.memoize import memoize
-
-_logging = logging.getLogger()
-
-@memoize
-def file_hash(filename):
-  """Returns a string representing the hash of the given file."""
-  _logging.debug("Hashing %s ...", filename)
-  with open(filename, mode='rb') as f:
-    m = sha256()
-    while True:
-      block = f.read(4096)
-      if not block:
-        break
-      m.update(block)
-  _logging.debug("  => %s", m.hexdigest())
-  return m.hexdigest()
diff --git a/mojo/tools/mopy/gn.py b/mojo/tools/mopy/gn.py
deleted file mode 100644
index 47253ea..0000000
--- a/mojo/tools/mopy/gn.py
+++ /dev/null
@@ -1,157 +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.
-
-"""
-GN-related configuration functions, e.g., to produce a Config object from a GN
-args.gn file).
-"""
-
-
-import ast
-import os.path
-import re
-
-from .config import Config
-
-
-def BuildDirectoryForConfig(config, src_root):
-  """
-  Returns the build directory for the given configuration.
-  """
-  subdir = ""
-  if config.target_os == Config.OS_ANDROID:
-    subdir += "android_"
-    if config.target_cpu != Config.ARCH_ARM:
-      subdir += config.target_cpu + "_"
-  elif config.target_os == Config.OS_IOS:
-    subdir += "ios_"
-  if config.is_simulator:
-    subdir += "sim_"
-  if config.is_official_build:
-    subdir += "Official"
-  elif config.is_debug:
-    subdir += "Debug"
-  else:
-    subdir += "Release"
-  if config.sanitizer == Config.SANITIZER_ASAN:
-    subdir += "_asan"
-  if not(config.is_debug) and config.dcheck_always_on:
-    subdir += "_dcheck"
-  return os.path.join(src_root, "out", subdir)
-
-
-def GNArgsForConfig(config):
-  """
-  Return the arguments for gn for the given configuration. This function returns
-  a dictionary with boolean values as boolean.
-  """
-  gn_args = {}
-
-  gn_args["is_debug"] = bool(config.is_debug)
-  gn_args["is_official_build"] = bool(config.is_official_build)
-  gn_args["is_asan"] = config.sanitizer == Config.SANITIZER_ASAN
-
-  if config.is_clang is not None:
-    gn_args["is_clang"] = bool(config.is_clang)
-  else:
-    gn_args["is_clang"] = config.target_os not in (Config.OS_ANDROID,
-                                                   Config.OS_WINDOWS)
-
-  if config.values.get("use_goma"):
-    gn_args["use_goma"] = True
-    gn_args["goma_dir"] = config.values["goma_dir"]
-  else:
-    gn_args["use_goma"] = False
-
-  gn_args["dcheck_always_on"] = config.dcheck_always_on
-
-  if config.target_os == Config.OS_ANDROID:
-    gn_args["target_os"] = "android"
-  elif config.target_os == Config.OS_IOS:
-    gn_args["target_os"] = "ios"
-    gn_args["ios_deployment_target"] = "7.0"
-    gn_args["clang_use_chrome_plugins"] = False
-    if config.is_simulator:
-      gn_args["use_libjpeg_turbo"] = False
-    gn_args["use_ios_simulator"] = config.is_simulator
-  elif config.target_os == Config.OS_LINUX:
-    gn_args["use_aura"] = False
-    gn_args["use_glib"] = False
-    gn_args["use_system_harfbuzz"] = False
-
-  gn_args["target_cpu"] = config.target_cpu
-
-  if "use_nacl" in config.values:
-    gn_args["mojo_use_nacl"] = config.values.get("use_nacl", False)
-
-  if "mojo_use_go" in config.values:
-    gn_args["mojo_use_go"] = config.values.get("mojo_use_go", False)
-    if gn_args["mojo_use_go"]:
-      gn_args["go_build_tool"] = config.values.get("go_build_tool")
-
-  extra_args = config.values.get("gn_args")
-  if extra_args:
-    for arg in extra_args.split():
-      (name, val) = arg.split('=')
-      gn_args[name] = val
-
-  return gn_args
-
-
-def CommandLineForGNArgs(gn_args):
-  """
-  Returns the list of gn arguments to use with the gn command line.
-  """
-  def _ToCommandLine(key, value):
-    if type(value) is bool:
-      return "%s=%s" % (key, "true" if value else "false")
-    return "%s=\"%s\"" % (key, value)
-  return [_ToCommandLine(x, y) for x, y in gn_args.iteritems()]
-
-
-def ConfigForGNArgs(args):
-  """
-  Return the Config object for the given gn arguments. This function takes a
-  dictionary with boolean values as boolean.
-  """
-  config_args = {}
-  config_args["is_debug"] = args.get("is_debug", True)
-  config_args["is_official_build"] = args.get("is_official_build", False)
-  config_args["sanitizer"] = (
-      Config.SANITIZER_ASAN if args.get("is_asan") else None)
-  config_args["is_clang"] = args.get("is_clang", False)
-  config_args["use_goma"] = args.get("use_goma", False)
-  if config_args["use_goma"]:
-    config_args["goma_dir"] = args.get("goma_dir")
-  config_args["use_nacl"] = args.get("mojo_use_nacl", False)
-  config_args["mojo_use_go"] = args.get("mojo_use_go", False)
-  if config_args["mojo_use_go"]:
-    config_args["go_build_tool"] = args.get("go_build_tool")
-  config_args["target_os"] = args.get("target_os")
-  config_args["target_cpu"] = args.get("target_cpu")
-  config_args["dcheck_always_on"] = args.get("dcheck_always_on")
-  config_args["is_simulator"] = args.get("use_ios_simulator", False)
-  return Config(**config_args)
-
-
-def ParseGNConfig(build_dir):
-  """
-  Parse the gn config file present in |build_dir|. This function returns a
-  dictionary with boolean values as boolean.
-  """
-  TRANSLATIONS = {
-      "true": "True",
-      "false": "False",
-  }
-  gn_file = os.path.join(build_dir, "args.gn")
-  values = {}
-  with open(gn_file, "r") as f:
-    for line in f.readlines():
-      line = re.sub("\s*#.*", "", line)
-      result = re.match("^\s*(\w+)\s*=\s*(.*)\s*$", line)
-      if result:
-        key = result.group(1)
-        value = result.group(2)
-        values[key] = ast.literal_eval(TRANSLATIONS.get(value, value))
-  return values
diff --git a/mojo/tools/mopy/gn_unittest.py b/mojo/tools/mopy/gn_unittest.py
deleted file mode 100644
index b1b29a7..0000000
--- a/mojo/tools/mopy/gn_unittest.py
+++ /dev/null
@@ -1,76 +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.
-
-import itertools
-import sys
-import unittest
-
-import mopy.gn as gn
-
-from mopy.config import Config
-
-
-class GTestListTestsTest(unittest.TestCase):
-  """Tests mopy.gn."""
-
-  def testConfigToGNToConfig(self):
-    """Tests that config to gn to config is the identity"""
-    configs_to_test = {
-      "target_os": [None, "android", "linux", "ios"],
-      "target_cpu": [None, "x86", "x64", "arm"],
-      "is_simulator": [False, True],
-      "is_debug": [False, True],
-      "is_official_build": [False, True],
-      "is_clang": [False, True],
-      "sanitizer": [None, Config.SANITIZER_ASAN],
-      "use_goma": [False],
-      "use_nacl": [False, True],
-      "mojo_use_go": [False],
-      "dcheck_always_on": [False, True],
-    }
-    if sys.platform == "darwin":
-      configs_to_test["target_os"].remove("linux")
-
-    for args in _iterate_over_config(configs_to_test):
-      if args.get("target_os") != "ios" and args["is_simulator"]:
-        continue
-      config = Config(**args)
-      gn_args = gn.GNArgsForConfig(config)
-      new_config = gn.ConfigForGNArgs(gn_args)
-      self.assertDictEqual(config.values, new_config.values)
-
-  def testGNToConfigToGN(self):
-    """Tests that gn to config to gn is the identity"""
-    # TODO(vtl): Test OSes other than None (== host?) and "android".
-    configs_to_test = {
-      "target_os": [None, "android"],
-      "target_cpu": ["x86", "x64", "arm"],
-      "is_debug": [False, True],
-      "is_official_build": [False, True],
-      "is_clang": [False, True],
-      "is_asan": [False, True],
-      "use_goma": [False],
-      "mojo_use_nacl": [False, True],
-      "mojo_use_go": [False],
-      "dcheck_always_on": [False, True],
-    }
-
-    for args in _iterate_over_config(configs_to_test):
-      if args.get("target_os", None) is None and sys.platform[:5] == "linux":
-        args["use_aura"] = False
-        args["use_glib"] = False
-        args["use_system_harfbuzz"] = False
-      config = gn.ConfigForGNArgs(args)
-      new_args = gn.GNArgsForConfig(config)
-      self.assertDictEqual(args, new_args)
-
-
-def _iterate_over_config(config):
-  def product_to_dict(p):
-    return dict(filter(lambda x: x[1] is not None, zip(config.keys(), p)))
-  return itertools.imap(product_to_dict, itertools.product(*config.values()))
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/tools/mopy/gtest.py b/mojo/tools/mopy/gtest.py
deleted file mode 100644
index e557937..0000000
--- a/mojo/tools/mopy/gtest.py
+++ /dev/null
@@ -1,17 +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.
-
-import os
-import sys
-import logging
-
-_logger = logging.getLogger()
-
-
-def set_color():
-  """Run gtests with color if we're on a TTY (and we're not being told
-  explicitly what to do)."""
-  if sys.stdout.isatty() and "GTEST_COLOR" not in os.environ:
-    _logger.debug("Setting GTEST_COLOR=yes")
-    os.environ["GTEST_COLOR"] = "yes"
diff --git a/mojo/tools/mopy/log.py b/mojo/tools/mopy/log.py
deleted file mode 100644
index af57232..0000000
--- a/mojo/tools/mopy/log.py
+++ /dev/null
@@ -1,29 +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.
-
-"""Logging utilities, for use with the standard logging module."""
-
-
-import logging
-
-
-def InitLogging(verbose_count):
-  """Ensures that the logger (obtained via logging.getLogger(), as usual) is
-  initialized, with the log level set as appropriate for |verbose_count|
-  instances of --verbose on the command line."""
-
-  assert(verbose_count >= 0)
-  if verbose_count == 0:
-    level = logging.WARNING
-  elif verbose_count == 1:
-    level = logging.INFO
-  else:  # verbose_count >= 2
-    level = logging.DEBUG
-
-  logging.basicConfig(format="%(relativeCreated).3f:%(levelname)s:%(message)s")
-  logger = logging.getLogger()
-  logger.setLevel(level)
-
-  logger.debug("Initialized logging: verbose_count=%d, level=%d" %
-               (verbose_count, level))
diff --git a/mojo/tools/mopy/memoize.py b/mojo/tools/mopy/memoize.py
deleted file mode 100644
index 765b8a9..0000000
--- a/mojo/tools/mopy/memoize.py
+++ /dev/null
@@ -1,17 +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.
-
-
-# pylint: disable=C0301
-# Based on/taken from
-#   http://code.activestate.com/recipes/578231-probably-the-fastest-memoization-decorator-in-the-/
-# (with cosmetic changes).
-# pylint: enable=C0301
-def memoize(f):
-  """Memoization decorator for a function taking a single argument."""
-  class Memoize(dict):
-    def __missing__(self, key):
-      rv = self[key] = f(key)
-      return rv
-  return Memoize().__getitem__
diff --git a/mojo/tools/mopy/mojo_python_tests_runner.py b/mojo/tools/mopy/mojo_python_tests_runner.py
deleted file mode 100644
index ef9a6b2..0000000
--- a/mojo/tools/mopy/mojo_python_tests_runner.py
+++ /dev/null
@@ -1,52 +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.
-
-import argparse
-import os
-import sys
-import unittest
-
-import mopy.paths
-
-
-class MojoPythonTestRunner(object):
-  """Helper class to run python tests on the bots."""
-
-  def __init__(self, test_dir):
-    self._test_dir = test_dir
-
-  def run(self):
-    parser = argparse.ArgumentParser()
-    parser.add_argument('-v', '--verbose', action='count', default=0)
-    parser.add_argument('tests', nargs='*')
-
-    self.add_custom_commandline_options(parser)
-    args = parser.parse_args()
-    self.apply_customization(args)
-
-    loader = unittest.loader.TestLoader()
-    print "Running Python unit tests under %s..." % self._test_dir
-
-    src_root = mopy.paths.Paths().src_root
-    pylib_dir = os.path.abspath(os.path.join(src_root, self._test_dir))
-    if args.tests:
-      if pylib_dir not in sys.path:
-        sys.path.append(pylib_dir)
-      suite = unittest.TestSuite()
-      for test_name in args.tests:
-        suite.addTests(loader.loadTestsFromName(test_name))
-    else:
-      suite = loader.discover(pylib_dir, pattern='*_unittest.py')
-
-    runner = unittest.runner.TextTestRunner(verbosity=(args.verbose + 1))
-    result = runner.run(suite)
-    return 0 if result.wasSuccessful() else 1
-
-  def add_custom_commandline_options(self, parser):
-    """Allow to add custom option to the runner script."""
-    pass
-
-  def apply_customization(self, args):
-    """Allow to apply any customization to the runner."""
-    pass
diff --git a/mojo/tools/mopy/paths.py b/mojo/tools/mopy/paths.py
deleted file mode 100644
index 2ba8ec8..0000000
--- a/mojo/tools/mopy/paths.py
+++ /dev/null
@@ -1,77 +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.
-
-import os
-
-from .config import Config
-from .gn import BuildDirectoryForConfig
-
-class Paths(object):
-  """Provides commonly used paths"""
-
-  def __init__(self, config=None, build_dir=None):
-    """Specify either a config or a build_dir to generate paths to binary
-    artifacts."""
-    self.src_root = os.path.abspath(os.path.join(__file__,
-      os.pardir, os.pardir, os.pardir, os.pardir))
-    self.mojo_dir = os.path.join(self.src_root, "mojo")
-    self.adb_path = os.path.join(self.src_root, 'third_party', 'android_tools',
-                                 'sdk', 'platform-tools', 'adb')
-
-    if config:
-      self.build_dir = BuildDirectoryForConfig(config, self.src_root)
-    elif build_dir is not None:
-      self.build_dir = os.path.abspath(build_dir)
-    else:
-      self.build_dir = None
-
-    if self.build_dir is not None:
-      self.mojo_shell_path = os.path.join(self.build_dir, "mojo_shell")
-      self.sky_shell_path = os.path.join(self.build_dir, "sky_shell")
-      # TODO(vtl): Use the host OS here, since |config| may not be available.
-      # In any case, if the target is Windows, but the host isn't, using
-      # |os.path| isn't correct....
-      if Config.GetHostOS() == Config.OS_WINDOWS:
-        self.mojo_shell_path += ".exe"
-        self.sky_shell_path += ".exe"
-      if config and config.target_os == Config.OS_ANDROID:
-        self.target_mojo_shell_path = os.path.join(self.build_dir,
-                                                   "apks",
-                                                   "MojoShell.apk")
-        self.target_sky_shell_path = os.path.join(self.build_dir,
-                                                  "apks",
-                                                  "SkyDemo.apk")
-      else:
-        self.target_mojo_shell_path = self.mojo_shell_path
-        self.target_sky_shell_path = self.sky_shell_path
-    else:
-      self.mojo_shell_path = None
-      self.sky_shell_path = None
-      self.target_mojo_shell_path = None
-      self.target_sky_shell_path = None
-
-  def RelPath(self, path):
-    """Returns the given path, relative to the current directory."""
-    return os.path.relpath(path)
-
-  def SrcRelPath(self, path):
-    """Returns the given path, relative to self.src_root."""
-    return os.path.relpath(path, self.src_root)
-
-  def FileFromUrl(self, url):
-    """Given an app URL (<scheme>:<appname>), return 'build_dir/appname.mojo'.
-    If self.build_dir is None, just return appname.mojo
-    """
-    (_, name) = url.split(':')
-    if self.build_dir:
-      return os.path.join(self.build_dir, name + '.mojo')
-    return name + '.mojo'
-
-  @staticmethod
-  def IsValidAppUrl(url):
-    """Returns False if url is malformed, True otherwise."""
-    try:
-      return len(url.split(':')) == 2
-    except ValueError:
-      return False
diff --git a/mojo/tools/mopy/perf_data_uploader.py b/mojo/tools/mopy/perf_data_uploader.py
deleted file mode 100755
index 84e5280..0000000
--- a/mojo/tools/mopy/perf_data_uploader.py
+++ /dev/null
@@ -1,200 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""A tool that uploads data to the performance dashboard."""
-
-import argparse
-import httplib
-import json
-import pprint
-import re
-import sys
-import urllib
-import urllib2
-
-# TODO(yzshen): The following are missing currently:
-#     (1) CL range on the dashboard;
-#     (2) improvement direction on the dashboard;
-#     (3) a link from the build step pointing to the dashboard page.
-
-
-_PERF_LINE_FORMAT = r"""^\s*([^\s/]+)  # chart name
-                        (/([^\s/]+))?  # trace name (optional, separated with
-                                       # the chart name by a '/')
-                        \s+(\S+)       # value
-                        \s+(\S+)       # units
-                        \s*$"""
-
-_PRODUCTION_SERVER = "https://chromeperf.appspot.com"
-_TESTING_SERVER = "https://chrome-perf.googleplex.com"
-
-
-def UploadPerfData(master_name, perf_id, test_name, builder_name, build_number,
-                   revision, perf_data, point_id, dry_run=False,
-                   testing_dashboard=True):
-  """Uploads perf data.
-
-  Args:
-    Please see the help for command-line args.
-
-  Returns:
-    A boolean value indicating whether the operation succeeded or not.
-  """
-
-  def _ConvertToUploadFormat():
-    """Converts perf data to the format that the server understands.
-
-    Returns:
-      A dictionary that (after being converted to JSON) conforms to the server
-      format.
-    """
-    charts = {}
-    line_format = re.compile(_PERF_LINE_FORMAT, re.VERBOSE)
-    for line in perf_data:
-      match = re.match(line_format, line)
-      assert match, "Unable to parse the following input: %s" % line
-
-      chart_name = match.group(1)
-      trace_name = match.group(3) if match.group(3) else "summary"
-
-      if chart_name not in charts:
-        charts[chart_name] = {}
-      charts[chart_name][trace_name] = {
-          "type": "scalar",
-          "value": float(match.group(4)),
-          "units": match.group(5)
-      }
-
-    return {
-        "master": master_name,
-        "bot": perf_id,
-        "masterid": master_name,
-        "buildername": builder_name,
-        "buildnumber": build_number,
-        "versions": {
-            "mojo": revision
-        },
-        "point_id": point_id,
-        "supplemental": {},
-        "chart_data": {
-            "format_version": "1.0",
-            "benchmark_name": test_name,
-            "charts": charts
-        }
-    }
-
-  class _UploadException(Exception):
-    pass
-
-  def _Upload(server_url, json_data):
-    """Make an HTTP POST with the given data to the performance dashboard.
-
-    Args:
-      server_url: URL of the performance dashboard instance.
-      json_data: JSON string that contains the data to be sent.
-
-    Raises:
-      _UploadException: An error occurred during uploading.
-    """
-    # When data is provided to urllib2.Request, a POST is sent instead of GET.
-    # The data must be in the application/x-www-form-urlencoded format.
-    data = urllib.urlencode({"data": json_data})
-    req = urllib2.Request("%s/add_point" % server_url, data)
-    try:
-      urllib2.urlopen(req)
-    except urllib2.HTTPError as e:
-      raise _UploadException("HTTPError: %d. Response: %s\n"
-                             "JSON: %s\n" % (e.code, e.read(), json_data))
-    except urllib2.URLError as e:
-      raise _UploadException("URLError: %s for JSON %s\n" %
-                             (str(e.reason), json_data))
-    except httplib.HTTPException as e:
-      raise _UploadException("HTTPException for JSON %s\n" % json_data)
-
-  formatted_data = _ConvertToUploadFormat()
-
-  server_url = _TESTING_SERVER if testing_dashboard else _PRODUCTION_SERVER
-
-  if dry_run:
-    print "Won't upload because --dry-run is specified."
-    print "Server: %s" % server_url
-    print "Data:"
-    pprint.pprint(formatted_data)
-  else:
-    print "Uploading data to %s ..." % server_url
-    try:
-      _Upload(server_url, json.dumps(formatted_data))
-    except _UploadException as e:
-      print e
-      return False
-
-    print "Done."
-
-    dashboard_params = urllib.urlencode({
-        "masters": master_name,
-        "bots": perf_id,
-        "tests": test_name,
-        "rev": point_id
-    })
-    print "Results Dashboard: %s/report?%s" % (server_url, dashboard_params)
-
-  return True
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description="A tool that uploads data to the performance dashboard.")
-
-  parser.add_argument(
-      "--master-name", required=True,
-      help="Buildbot master name, used to construct link to buildbot log by "
-           "the dashboard, and also as the top-level category for the data.")
-  parser.add_argument(
-      "--perf-id", required=True,
-      help="Used as the second-level category for the data, usually the "
-           "platform type.")
-  parser.add_argument(
-      "--test-name", required=True,
-      help="Name of the test that the perf data was generated from.")
-  parser.add_argument(
-      "--builder-name", required=True,
-      help="Buildbot builder name, used to construct link to buildbot log by "
-           "the dashboard.")
-  parser.add_argument(
-      "--build-number", required=True, type=int,
-      help="Build number, used to construct link to buildbot log by the "
-           "dashboard.")
-  parser.add_argument(
-      "--revision", required=True, help="The mojo git commit hash.")
-  parser.add_argument(
-      "--perf-data", required=True, metavar="foo_perf.log",
-      type=argparse.FileType("r"),
-      help="A text file containing the perf data. Each line is a data point in "
-           "the following format: chart_name[/trace_name] value units")
-  parser.add_argument(
-      "--point-id", required=True, type=int,
-      help="The x coordinate for the data points.")
-  parser.add_argument(
-      "--dry-run", action="store_true",
-      help="Display the server URL and the data to upload, but not actually "
-           "upload the data.")
-  server_group = parser.add_mutually_exclusive_group()
-  server_group.add_argument(
-      "--testing-dashboard", action="store_true", default=True,
-      help="Upload the data to the testing dashboard (default).")
-  server_group.add_argument(
-      "--production-dashboard", dest="testing_dashboard", action="store_false",
-      default=False, help="Upload the data to the production dashboard.")
-  args = parser.parse_args()
-
-  result = UploadPerfData(args.master_name, args.perf_id, args.test_name,
-                          args.builder_name, args.build_number, args.revision,
-                          args.perf_data, args.point_id, args.dry_run,
-                          args.testing_dashboard)
-  return 0 if result else 1
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/tools/mopy/print_process_error.py b/mojo/tools/mopy/print_process_error.py
deleted file mode 100644
index ec565d1..0000000
--- a/mojo/tools/mopy/print_process_error.py
+++ /dev/null
@@ -1,22 +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.
-
-def print_process_error(command_line, error):
-  """Properly format an exception raised from a failed command execution."""
-
-  if command_line:
-    print 'Failed command: %r' % command_line
-  else:
-    print 'Failed command:'
-  print 72 * '-'
-
-  if hasattr(error, 'returncode'):
-    print '  with exit code %d' % error.returncode
-    print 72 * '-'
-
-  if hasattr(error, 'output'):
-    print error.output
-  else:
-    print error
-  print 72 * '-'
diff --git a/mojo/tools/mopy/transitive_hash.py b/mojo/tools/mopy/transitive_hash.py
deleted file mode 100644
index 740892b..0000000
--- a/mojo/tools/mopy/transitive_hash.py
+++ /dev/null
@@ -1,80 +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.
-
-import logging
-import platform
-import subprocess
-import sys
-
-# pylint: disable=E0611
-from hashlib import sha256
-# pylint: enable=E0611
-from os.path import basename, realpath
-
-from mopy.file_hash import file_hash
-from mopy.memoize import memoize
-
-_logging = logging.getLogger()
-
-@memoize
-def _get_dependencies(filename):
-  """Returns a list of filenames for files that the given file depends on."""
-  if platform.system() == 'Windows':
-    # There's no ldd on Windows. We can try to bundle or require depends, but
-    # given that we're not supporting component build this seems low priority.
-    return []
-  _logging.debug("Getting dependencies for %s ...", filename)
-  lines = subprocess.check_output(['ldd', filename]).splitlines()
-  rv = []
-  for line in lines:
-    i = line.find('/')
-    if i < 0:
-      _logging.debug("  => no file found in line: %s", line)
-      continue
-    rv.append(line[i:].split(None, 1)[0])
-  _logging.debug("  => %s", rv)
-  return rv
-
-def transitive_hash(filename):
-  """Returns a string that represents the "transitive" hash of the given
-  file. The transitive hash is a hash of the file and all the shared libraries
-  on which it depends (done in an order-independent way)."""
-  hashes = set()
-  to_hash = [filename]
-  while to_hash:
-    current_filename = realpath(to_hash.pop())
-    current_hash = file_hash(current_filename)
-    if current_hash in hashes:
-      _logging.debug("Already seen %s (%s) ...", current_filename, current_hash)
-      continue
-    _logging.debug("Haven't seen %s (%s) ...", current_filename, current_hash)
-    hashes.add(current_hash)
-    to_hash.extend(_get_dependencies(current_filename))
-  return sha256('|'.join(sorted(hashes))).hexdigest()
-
-def main(argv):
-  logging.basicConfig()
-  # Uncomment to debug:
-  # _logging.setLevel(logging.DEBUG)
-
-  if len(argv) < 2:
-    print """\
-Usage: %s [file] ...
-
-Prints the \"transitive\" hash of each (executable) file. The transitive
-hash is a hash of the file and all the shared libraries on which it
-depends (done in an order-independent way).""" % basename(argv[0])
-    return 0
-
-  rv = 0
-  for filename in argv[1:]:
-    try:
-      print transitive_hash(filename), filename
-    except subprocess.CalledProcessError:
-      print "ERROR", filename
-      rv = 1
-  return rv
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/mojo/tools/mopy/version.py b/mojo/tools/mopy/version.py
deleted file mode 100644
index 8f8e132..0000000
--- a/mojo/tools/mopy/version.py
+++ /dev/null
@@ -1,14 +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.
-
-import subprocess
-
-import mopy.paths
-
-class Version(object):
-  """Computes the version (git committish) of the mojo repo"""
-
-  def __init__(self):
-    self.version = subprocess.check_output(["git", "rev-parse", "HEAD"],
-        cwd=mopy.paths.Paths().src_root).strip()
diff --git a/mojo/tools/perf_test_runner.py b/mojo/tools/perf_test_runner.py
deleted file mode 100755
index dff6b2d..0000000
--- a/mojo/tools/perf_test_runner.py
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""A tool that runs a perf test and uploads the resulting data to the
-performance dashboard.
-"""
-
-import argparse
-from mopy import perf_data_uploader
-from mopy.version import Version
-import subprocess
-import sys
-
-
-def _GetCurrentCommitCount():
-  return subprocess.check_output(
-      ["git", "rev-list", "HEAD", "--count"]).strip()
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description="A tool that runs a perf test and uploads the resulting data "
-                  "to the performance dashboard.")
-
-  parser.add_argument(
-      "--master-name",
-      help="Buildbot master name, used to construct link to buildbot log by "
-           "the dashboard, and also as the top-level category for the data.")
-  parser.add_argument(
-      "--perf-id",
-      help="Used as the second-level category for the data, usually the "
-           "platform type.")
-  parser.add_argument(
-      "--test-name",
-      help="Name of the test that the perf data was generated from.")
-  parser.add_argument(
-      "--builder-name",
-      help="Buildbot builder name, used to construct link to buildbot log by "
-           "the dashboard.")
-  parser.add_argument(
-      "--build-number", type=int,
-      help="Build number, used to construct link to buildbot log by the "
-           "dashboard.")
-  parser.add_argument(
-      "--perf-data-path",
-      help="The path to the perf data that the perf test generates.")
-  server_group = parser.add_mutually_exclusive_group()
-  server_group.add_argument(
-      "--testing-dashboard", action="store_true", default=True,
-      help="Upload the data to the testing dashboard (default).")
-  server_group.add_argument(
-      "--production-dashboard", dest="testing_dashboard", action="store_false",
-      default=False, help="Upload the data to the production dashboard.")
-  parser.add_argument("command", nargs=argparse.REMAINDER)
-  args = parser.parse_args()
-
-  subprocess.check_call(args.command)
-
-  if args.master_name is None or \
-     args.perf_id is None or \
-     args.test_name is None or \
-     args.builder_name is None or \
-     args.build_number is None or \
-     args.perf_data_path is None:
-    print "Won't upload perf data to the dashboard because not all of the " \
-          "following values are specified: master-name, perf-id, test-name, " \
-          "builder-name, build-number, perf-data-path."
-    return 0
-
-  revision = Version().version
-  perf_data = open(args.perf_data_path, "r")
-  point_id = _GetCurrentCommitCount()
-
-  result = perf_data_uploader.UploadPerfData(
-      args.master_name, args.perf_id, args.test_name, args.builder_name,
-      args.build_number, revision, perf_data, point_id, False,
-      args.testing_dashboard)
-
-  return 0 if result else 1
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/tools/prepare_pub_packages.py b/mojo/tools/prepare_pub_packages.py
deleted file mode 100755
index e53b0c9..0000000
--- a/mojo/tools/prepare_pub_packages.py
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Prepares pub packages for upload."""
-
-# NOTE: Requires the following build artifacts:
-# *) out/Config/gen/dart-pkg
-# *) out/Config/apks/
-# By default Config is 'android_Release'
-
-import argparse
-import os
-import shutil
-import tempfile
-
-
-def remove_empty_dirs(root_dir):
-    for root, dirs, _ in os.walk(root_dir):
-         for name in dirs:
-             fname = os.path.join(root, name)
-             if not os.listdir(fname):
-                 os.removedirs(fname)
-
-
-def copy_package(src_dir, dst_dir, ignore=None):
-    # Remove existing destination directory.
-    shutil.rmtree(dst_dir, True)
-    shutil.copytree(src_dir, dst_dir, symlinks=False, ignore=ignore)
-
-
-def install_mojo_license_and_authors_files(src_root, dst_dir):
-    shutil.copy(os.path.join(src_root, 'LICENSE'), dst_dir)
-    shutil.copy(os.path.join(src_root, 'AUTHORS'), dst_dir)
-
-
-def main():
-    parser = argparse.ArgumentParser(
-        description='Prepare pub packages for upload')
-    parser.add_argument('--config',
-                        type=str,
-                        default='android_Release')
-    parser.add_argument('--src-root',
-                        type=str,
-                        default='.')
-    parser.add_argument('--packages',
-                        default=['mojo', 'mojom', 'mojo_services'])
-    parser.add_argument('--out-dir',
-                        default=None)
-    parser.add_argument('build_dir',
-                        type=str)
-    args = parser.parse_args()
-
-    rel_build_dir = os.path.join(args.build_dir, args.config)
-    build_dir = os.path.abspath(rel_build_dir)
-    sdk_dir = os.path.abspath(args.src_root)
-    print('Using SDK in %s' % sdk_dir)
-    print('Using build in %s' % build_dir)
-
-    temp_dir = args.out_dir
-    if temp_dir:
-        try:
-            shutil.rmtree(temp_dir)
-        except OSError:
-            pass
-        os.makedirs(temp_dir)
-    else:
-        # Create a temporary directory to copy files into.
-        temp_dir = tempfile.mkdtemp(prefix='pub_packages-')
-
-    print('Packages ready to be uploaded in %s' % temp_dir)
-
-    # Copy packages
-    dart_pkg_dir = os.path.join(build_dir, 'gen', 'dart-pkg')
-    for package in args.packages:
-        print('Preparing package %s' % package)
-        src_dir = os.path.join(dart_pkg_dir, package)
-        dst_dir = os.path.join(temp_dir, package)
-        ignore = None
-        # Special case 'mojom' package to not copy generated mojom.dart files.
-        if package == 'mojom':
-            ignore = shutil.ignore_patterns('*.mojom.dart')
-        copy_package(src_dir, dst_dir, ignore)
-        # Special case 'mojom' package to remove empty directories.
-        if package == 'mojom':
-            remove_empty_dirs(dst_dir)
-        install_mojo_license_and_authors_files(sdk_dir, dst_dir)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/mojo/tools/publish_pub_packages.py b/mojo/tools/publish_pub_packages.py
deleted file mode 100755
index fcfbeea..0000000
--- a/mojo/tools/publish_pub_packages.py
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-# See https://github.com/domokit/mojo/wiki/Release-process
-
-import argparse
-import distutils.util
-import os
-import subprocess
-import sys
-import tempfile
-
-MOJO_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__))
-SRC_ROOT = os.path.dirname(os.path.dirname(MOJO_TOOLS_DIR))
-DART_SDK = os.path.join(SRC_ROOT, 'third_party', 'dart-sdk', 'dart-sdk', 'bin')
-PUB = os.path.join(DART_SDK, 'pub')
-
-PACKAGES = [
-  'mojo',
-  'mojom',
-  'mojo_services',
-]
-
-CONFIRM = """This tool is destructive and will revert your current branch to
-origin/master among other things.  Are you sure you wish to continue?"""
-
-
-def run(cwd, args):
-    print 'RUNNING:', ' '.join(args), 'IN:', cwd
-    subprocess.check_call(args, cwd=cwd)
-
-
-def confirm(prompt):
-    user_input = raw_input("%s (y/N) " % prompt)
-    try:
-        return distutils.util.strtobool(user_input) == 1
-    except ValueError:
-        return False
-
-
-def main():
-    parser = argparse.ArgumentParser(description='Deploy!')
-    parser.parse_args()
-
-    if not confirm(CONFIRM):
-        print "Aborted."
-        return 1
-
-    run(SRC_ROOT, ['git', 'fetch', 'origin'])
-    run(SRC_ROOT, ['git', 'reset', 'origin/master', '--hard'])
-    run(SRC_ROOT, ['gclient', 'sync'])
-
-    run(SRC_ROOT, ['mojo/tools/mojob.py', 'gn', '--android', '--release'])
-    run(SRC_ROOT, ['ninja', '-C', 'out/android_Release'])
-
-    package_root = tempfile.mkdtemp(prefix='pub_packages-')
-
-    run(SRC_ROOT, [
-        'mojo/tools/prepare_pub_packages.py',
-        '--out-dir',
-        package_root,
-        'out',
-    ])
-
-    for package in PACKAGES:
-        package_dir = os.path.join(package_root, package)
-        print "PACKAGE", package_dir, "PUB", PUB
-        run(package_dir, [PUB, 'publish', '--force'])
-
-
-if __name__ == '__main__':
-    sys.exit(main())
diff --git a/mojo/tools/remote_file_reader.cc b/mojo/tools/remote_file_reader.cc
deleted file mode 100644
index c12132a..0000000
--- a/mojo/tools/remote_file_reader.cc
+++ /dev/null
@@ -1,325 +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.
-
-#include <fcntl.h>
-#include <inttypes.h>
-#include <netinet/in.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <vector>
-
-// This utility allows to read a file from the local file system through a
-// network protocol. The protocol is the following request response protocol:
-//
-// Opening a new file:
-// Request: O path_to_file\n
-// Success: O
-// Error: E
-//
-// Seeking on the last opened file:
-// Request: S offset whence\n
-// Success: 0
-// Error: E
-//
-// Reading the last opened file at the current position:
-// Request: R size\n
-// Success: 0{size encoded on 4 bytes in network order}{content}
-// Error: E
-
-namespace {
-
-// Display an error message and exit.
-void error(const char* msg) {
-  perror(msg);
-  exit(1);
-}
-
-// Keep track of an active connection with a client.
-class Connection {
- public:
-  // Takes ownership of the given fd which is an opened socket to the client.
-  explicit Connection(int fd)
-      : fd_(fd), file_fd_(-1), buffer_size_(0), buffer_(nullptr, free) {}
-  ~Connection() { Close(); }
-
-  int fd() { return fd_; };
-
-  void Close() {
-    if (fd_ != -1) {
-      close(fd_);
-      fd_ = -1;
-    }
-    if (file_fd_ != -1) {
-      close(file_fd_);
-      file_fd_ = -1;
-    }
-  }
-
-  // Returns whether this connection has some data to write to the client.
-  bool NeedsWriting() { return write_buffer_.size() > 0; }
-
-  // Try to write buffered data to the client. This should only be called when
-  // the socket is writeable, otherwise this method may block.
-  bool Write() {
-    int nb_written = write(fd_, write_buffer_.data(), write_buffer_.size());
-    if (nb_written <= 0) {
-      Close();
-      return false;
-    }
-    write_buffer_ = std::string(write_buffer_, nb_written);
-    return true;
-  }
-
-  // Read any data available from the client, and send any responses if a full
-  // request has been read. This should only be called when the socket is
-  // readable, otherwise this method may block.
-  bool Read() {
-    char buffer[4096];
-    int nb_read = read(fd_, buffer, sizeof(buffer));
-    if (nb_read <= 0) {
-      Close();
-      return false;
-    }
-    read_buffer_ += std::string(buffer, nb_read);
-    Respond();
-    return true;
-  }
-
- private:
-  // Success message.
-  const char kSuccess = 'O';
-  // Error message.
-  const char kError = 'E';
-
-  // Read any available request in the read buffer and write the responses in
-  // the write buffer.
-  void Respond() {
-    std::string::size_type eol_position = read_buffer_.find('\n');
-    while (eol_position != std::string::npos) {
-      std::string command(read_buffer_, 0, eol_position);
-      read_buffer_ = std::string(read_buffer_, eol_position + 1);
-      std::string argument(command, 2);
-      switch (command[0]) {
-        case 'O':
-          OpenCommand(argument);
-          break;
-        case 'S':
-          SeekCommand(argument);
-          break;
-        case 'R':
-          ReadCommand(argument);
-          break;
-        default:
-          write_buffer_ += kError;
-      }
-      eol_position = read_buffer_.find('\n');
-    }
-  }
-
-  // Handle the open command.
-  void OpenCommand(const std::string& file) {
-    if (file_fd_ != -1) {
-      close(file_fd_);
-      file_fd_ = -1;
-    }
-    file_fd_ = open(file.c_str(), O_RDONLY);
-    if (file_fd_ == -1) {
-      perror("Unable to open file");
-      write_buffer_ += kError;
-      return;
-    }
-    write_buffer_ += kSuccess;
-  }
-
-  // Handle the seek command.
-  void SeekCommand(const std::string& parameters) {
-    if (file_fd_ == -1) {
-      write_buffer_ += kError;
-      return;
-    }
-    int32_t offset;
-    int32_t whence;
-    if (sscanf(parameters.c_str(), "%" SCNd32 " %" SCNd32, &offset, &whence) !=
-        2) {
-      write_buffer_ += kError;
-      return;
-    }
-    if (lseek(file_fd_, offset, whence) == -1) {
-      perror("Unable to seek");
-      write_buffer_ += kError;
-      return;
-    }
-    write_buffer_ += kSuccess;
-  }
-
-  // Handle the read command.
-  void ReadCommand(const std::string& parameters) {
-    if (file_fd_ == -1) {
-      write_buffer_ += kError;
-      return;
-    }
-    int32_t size;
-    if (sscanf(parameters.c_str(), "%" SCNd32, &size) != 1) {
-      write_buffer_ += kError;
-      return;
-    }
-    if (size <= 0) {
-      write_buffer_ += kError;
-      return;
-    }
-    EnsureBufferCapacity(size);
-    int32_t result = read(file_fd_, buffer_.get(), size);
-    if (result < 0) {
-      perror("Unable to read");
-      close(file_fd_);
-      file_fd_ = -1;
-      write_buffer_ += kError;
-      return;
-    }
-    write_buffer_ += kSuccess;
-    int32_t size_to_send = htonl(result);
-    static_assert(sizeof(size_to_send) == 4, "Must send size with 4 byte.");
-    write_buffer_ += std::string(reinterpret_cast<char*>(&size_to_send), 4);
-    write_buffer_ += std::string(buffer_.get(), result);
-  }
-
-  // Ensure that |buffer_| has the capacity needed to read from the local file.
-  void EnsureBufferCapacity(size_t capacity) {
-    if (buffer_size_ >= capacity) {
-      return;
-    }
-    if (buffer_size_ == 0) {
-      buffer_.reset(static_cast<char*>(malloc(capacity)));
-      buffer_size_ = capacity;
-      return;
-    }
-    buffer_.reset(static_cast<char*>(realloc(buffer_.release(), capacity)));
-    buffer_size_ = capacity;
-  }
-
-  // File descriptor of the socket connected to the client.
-  int fd_;
-  // File descriptor of the current read file.
-  int file_fd_;
-  size_t buffer_size_;
-  std::unique_ptr<char, decltype(free)*> buffer_;
-  std::string write_buffer_;
-  std::string read_buffer_;
-};
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  // The port to bind to.
-  int port = 0;
-  if (argc > 1) {
-    port = atoi(argv[1]);
-  }
-  // Setup the server socket.
-  int server_socket, connected_socket;
-  struct sockaddr_in server_address, client_address;
-  server_socket = socket(AF_INET, SOCK_STREAM, 0);
-  if (server_socket < 0) {
-    error("Unable to open socket");
-  }
-  bzero(&server_address, sizeof(server_address));
-  server_address.sin_family = AF_INET;
-  server_address.sin_addr.s_addr = INADDR_ANY;
-  server_address.sin_port = port;
-  if (bind(server_socket, reinterpret_cast<struct sockaddr*>(&server_address),
-           sizeof(server_address)) < 0) {
-    error("Unable to bind socket");
-  }
-  socklen_t socket_size = sizeof(server_address);
-  if (getsockname(server_socket,
-                  reinterpret_cast<struct sockaddr*>(&server_address),
-                  &socket_size) < 0) {
-    perror("Unable to retrieve socket information");
-  }
-  // Print the port on the bound port on the standard output.
-  printf("%d\n", ntohs(server_address.sin_port));
-
-  // Start listening for client.
-  listen(server_socket, 5);
-
-  // Wait for the first client to connect.
-  socket_size = sizeof(client_address);
-  connected_socket =
-      accept(server_socket, reinterpret_cast<struct sockaddr*>(&client_address),
-             &socket_size);
-  if (connected_socket < 0) {
-    error("Unable to accept the intiial client");
-  }
-
-  // Keep track of active connections.
-  std::vector<std::unique_ptr<Connection>> connections;
-  connections.push_back(
-      std::unique_ptr<Connection>(new Connection(connected_socket)));
-
-  // Stop when all clients have disconnected.
-  while (connections.size()) {
-    // Prepate data to wait for any I/O to be ready.
-    fd_set rset;
-    fd_set wset;
-    FD_ZERO(&rset);
-    FD_ZERO(&wset);
-    // Always wait for a new connection.
-    FD_SET(server_socket, &rset);
-    int max_fd = server_socket + 1;
-    for (auto& c : connections) {
-      // Always wait for a client sending data.
-      FD_SET(c->fd(), &rset);
-      // Wait for a client to be ready to receive data only if some data needs
-      // to be sent.
-      if (c->NeedsWriting()) {
-        FD_SET(c->fd(), &wset);
-      }
-      max_fd = std::max(max_fd, c->fd() + 1);
-    }
-    // Wait for any I/O to be ready.
-    select(max_fd, &rset, &wset, nullptr, nullptr);
-
-    // Check if a client a connected.
-    if (FD_ISSET(server_socket, &rset)) {
-      int fd = accept(server_socket,
-                      reinterpret_cast<struct sockaddr*>(&client_address),
-                      &socket_size);
-      if (fd >= 0) {
-        connections.push_back(std::unique_ptr<Connection>(new Connection(fd)));
-      }
-    }
-
-    // Check each connection.
-    for (auto& c : connections) {
-      if (FD_ISSET(c->fd(), &rset)) {
-        if (!c->Read()) {
-          // If a fatal error happen, delete the connection.
-          c.reset();
-        }
-      }
-      if (c && FD_ISSET(c->fd(), &wset)) {
-        if (!c->Write()) {
-          // If a fatal error happen, delete the connection.
-          c.reset();
-        }
-      }
-    }
-
-    // Remove any deleted connection from the list of active connections.
-    connections.erase(
-        std::remove_if(connections.begin(), connections.end(),
-                       [](const std::unique_ptr<Connection>& c) { return !c; }),
-        connections.end());
-  }
-  return 0;
-}
diff --git a/mojo/tools/roll/android_build.patch b/mojo/tools/roll/android_build.patch
deleted file mode 100644
index bd73b9e..0000000
--- a/mojo/tools/roll/android_build.patch
+++ /dev/null
@@ -1,33 +0,0 @@
---- a/build/android/pylib/constants/__init__.py
-+++ b/build/android/pylib/constants/__init__.py
-@@ -184,7 +184,7 @@ class ANDROID_SDK_VERSION_CODES(object):
-   LOLLIPOP_MR1 = 22
- 
- ANDROID_SDK_VERSION = ANDROID_SDK_VERSION_CODES.LOLLIPOP_MR1
--ANDROID_SDK_BUILD_TOOLS_VERSION = '22.0.0'
-+ANDROID_SDK_BUILD_TOOLS_VERSION = '22.0.1'
- ANDROID_SDK_ROOT = os.path.join(DIR_SOURCE_ROOT,
-                                 'third_party/android_tools/sdk')
- ANDROID_SDK_TOOLS = os.path.join(ANDROID_SDK_ROOT,
---- a/build/common.gypi
-+++ b/build/common.gypi
-@@ -1682,7 +1682,7 @@
-             'android_host_arch%': '<!(uname -m)',
-             # Android API-level of the SDK used for compilation.
-             'android_sdk_version%': '22',
--            'android_sdk_build_tools_version%': '22.0.0',
-+            'android_sdk_build_tools_version%': '22.0.1',
-             'host_os%': "<!(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')",
-           },
-           # Copy conditionally-set variables out one scope.
---- a/build/config/android/config.gni
-+++ b/build/config/android/config.gni
-@@ -17,7 +17,7 @@ if (is_android) {
-   if (!defined(default_android_sdk_root)) {
-     default_android_sdk_root = "//third_party/android_tools/sdk"
-     default_android_sdk_version = "22"
--    default_android_sdk_build_tools_version = "22.0.0"
-+    default_android_sdk_build_tools_version = "22.0.1"
-   }
- 
-   if (!defined(google_play_services_library)) {
diff --git a/mojo/tools/roll/build_v8.patch b/mojo/tools/roll/build_v8.patch
deleted file mode 100644
index 7f0083b..0000000
--- a/mojo/tools/roll/build_v8.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff --git a/build/module_args/v8.gni b/build/module_args/v8.gni
-index 8b5204c..aa2848c 100644
---- a/build/module_args/v8.gni
-+++ b/build/module_args/v8.gni
-@@ -9,5 +9,5 @@ if (is_android) {
- # TODO(sky): nuke this. Temporary while sorting out http://crbug.com/465456.
- enable_correct_v8_arch = false
- 
--v8_use_external_startup_data = !(is_chromeos || is_win)
-+v8_use_external_startup_data = false
- v8_extra_library_files = []
diff --git a/mojo/tools/roll/compare_deps.py b/mojo/tools/roll/compare_deps.py
deleted file mode 100755
index db4e20c..0000000
--- a/mojo/tools/roll/compare_deps.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import os
-import re
-import sys
-import utils
-
-if len(sys.argv) != 2:
-  print "usage: compare_deps.py <chromium DEPS file>"
-  sys.exit(1)
-
-chromium_deps_path = sys.argv[1]
-mojo_deps_path = os.path.join(utils.mojo_root_dir, "DEPS")
-
-chromium_deps = ""
-
-with open(chromium_deps_path) as chromium_deps_file:
-  chromium_deps = chromium_deps_file.read()
-
-found_mismatch = False
-
-with open(mojo_deps_path) as mojo_deps_file:
-  for line in mojo_deps_file:
-    m = re.search("[0-9a-f]{32}", line)
-    if m:
-      git_hash = m.group(0)
-      if not git_hash in chromium_deps:
-        print "%s in mojo DEPS but not in chromium DEPS" % git_hash
-        print "line %s" % line.strip()
-        found_mismatch = True
-
-if found_mismatch:
-  sys.exit(1)
diff --git a/mojo/tools/roll/patch.py b/mojo/tools/roll/patch.py
deleted file mode 100755
index 4147b24..0000000
--- a/mojo/tools/roll/patch.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import os
-import subprocess
-import utils
-
-def patch_and_filter():
-  """Applies the *.patch files in the current dir and some hardcoded filters."""
-  os.chdir(utils.mojo_root_dir)
-
-  utils.filter_file("build/landmines.py",
-      lambda line: not "gyp_environment" in line)
-  utils.commit("filter gyp_environment out of build/landmines.py")
-
-  utils.filter_file("gpu/BUILD.gn", lambda line: not "//gpu/ipc" in line)
-  utils.commit("filter //gpu/ipc out of gpu/BUILD.gn")
-
-  utils.filter_file("cc/BUILD.gn", lambda line: not "//media" in line)
-  utils.commit("filter //media out of cc/BUILD.gn")
-
-  patch()
-
-
-def patch(relative_patches_dir=os.curdir):
-  """Applies the *.patch files in |relative_patches_dir|.
-
-  Args:
-    relative_patches_dir: A directory path relative to the current directory.
-        Defaults to the directory of this file.
-
-  Raises:
-    subprocess.CalledProcessError if the patch couldn't be applied.
-  """
-  patches_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                             relative_patches_dir)
-  assert os.path.isdir(patches_dir)
-
-  os.chdir(utils.mojo_root_dir)
-  for p in utils.find(["*.patch"], patches_dir):
-    print "applying patch %s" % os.path.basename(p)
-    try:
-      utils.system(["git", "apply", p])
-      utils.commit("applied patch %s" % os.path.basename(p))
-    except subprocess.CalledProcessError:
-      print "ERROR: patch %s failed to apply" % os.path.basename(p)
-      raise
diff --git a/mojo/tools/roll/sanitizers_build.patch b/mojo/tools/roll/sanitizers_build.patch
deleted file mode 100644
index 9f9e8b8..0000000
--- a/mojo/tools/roll/sanitizers_build.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-diff --git a/build/config/sanitizers/BUILD.gn b/build/config/sanitizers/BUILD.gn
-index 8996951..023315f 100644
---- a/build/config/sanitizers/BUILD.gn
-+++ b/build/config/sanitizers/BUILD.gn
-@@ -8,9 +8,12 @@ import("//build/config/sanitizers/sanitizers.gni")
- # shared_libraries. Unconditionally depend upon this target as it is empty if
- # |is_asan|, |is_lsan|, |is_tsan|, |is_msan| and |use_custom_libcxx| are false.
- group("deps") {
--  deps = [
--    "//third_party/instrumented_libraries:deps",
--  ]
-+  # TODO(vtl): Chromium has the following (but we don't have
-+  # instrumented_libraries).
-+  # deps = [
-+  #   "//third_party/instrumented_libraries:deps",
-+  # ]
-+  deps = []
-   if (is_asan || is_lsan || is_tsan || is_msan) {
-     public_configs = [ ":sanitizer_options_link_helper" ]
-     deps += [ ":options_sources" ]
-diff --git a/build/config/sanitizers/sanitizers.gni b/build/config/sanitizers/sanitizers.gni
-index a7b9658..0edc144 100644
---- a/build/config/sanitizers/sanitizers.gni
-+++ b/build/config/sanitizers/sanitizers.gni
-@@ -6,7 +6,9 @@ declare_args() {
-   # Use libc++ (buildtools/third_party/libc++ and
-   # buildtools/third_party/libc++abi) instead of stdlibc++ as standard library.
-   # This is intended to be used for instrumented builds.
--  use_custom_libcxx = (is_asan && is_linux) || is_tsan || is_msan
-+  # TODO(vtl): We don't use this, since building fails, for some reason.
-+  use_custom_libcxx = false
-+  # use_custom_libcxx = (is_asan && is_linux) || is_tsan || is_msan
- 
-   # Track where uninitialized memory originates from. From fastest to slowest:
-   # 0 - no tracking, 1 - track only the initial allocation site, 2 - track the
diff --git a/mojo/tools/roll/update_from_chromium.py b/mojo/tools/roll/update_from_chromium.py
deleted file mode 100755
index d9ae68d..0000000
--- a/mojo/tools/roll/update_from_chromium.py
+++ /dev/null
@@ -1,121 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import argparse
-import json
-import os
-import subprocess
-import sys
-import urllib2
-from utils import commit
-from utils import mojo_root_dir
-from utils import system
-
-import patch
-
-# //base and its dependencies
-base_deps = [
-    "base",
-    "testing",
-    "third_party/ashmem",
-    "third_party/libevent",
-    "third_party/libxml", # via //base/test
-    "third_party/modp_b64",
-    "third_party/tcmalloc",
-]
-
-# //build and its dependencies
-build_deps = [
-    "build",
-    "third_party/android_testrunner",
-    "third_party/binutils",
-    "third_party/pymock",
-    "tools/android",
-    "tools/clang",
-    "tools/generate_library_loader",
-    "tools/gritsettings",
-    "tools/relocation_packer",
-    "tools/valgrind",
-]
-
-# //sandbox/linux and its dependencies
-sandbox_deps = [
-    "sandbox/linux",
-]
-
-# things used from //mojo/public
-mojo_sdk_deps = [
-    "third_party/cython",
-]
-
-# These directories are snapshotted from chromium without modifications.
-dirs_to_snapshot = base_deps + build_deps + sandbox_deps + mojo_sdk_deps
-
-files_to_copy = [ "sandbox/sandbox_export.h" ]
-
-# The contents of these files before the roll will be preserved after the roll,
-# even though they live in directories rolled in from Chromium.
-files_not_to_roll = [
-    "build/config/ui.gni",
-    "build/ls.py",
-    "build/module_args/mojo.gni",
-]
-
-dirs = dirs_to_snapshot
-
-def chromium_rev_number(src_commit):
-  base_url = "https://cr-rev.appspot.com/_ah/api/crrev/v1/commit/"
-  commit_info = json.load(urllib2.urlopen(base_url + src_commit))
-  return commit_info["numberings"][0]["number"]
-
-def rev(source_dir):
-  for d in dirs:
-    print "removing directory %s" % d
-    try:
-      system(["git", "rm", "-r", d], cwd=mojo_root_dir)
-    except subprocess.CalledProcessError:
-      print "Could not remove %s" % d
-    print "cloning directory %s" % d
-    files = system(["git", "ls-files", d], cwd=source_dir)
-    for f in files.splitlines():
-      dest_path = os.path.join(mojo_root_dir, f)
-      system(["mkdir", "-p", os.path.dirname(dest_path)], cwd=source_dir)
-      system(["cp", os.path.join(source_dir, f), dest_path], cwd=source_dir)
-    system(["git", "add", d], cwd=mojo_root_dir)
-
-  for f in files_to_copy:
-    system(["cp", os.path.join(source_dir, f), os.path.join(mojo_root_dir, f)])
-
-  system(["git", "add", "."], cwd=mojo_root_dir)
-  src_commit = system(["git", "rev-parse", "HEAD"], cwd=source_dir).strip()
-  src_rev = chromium_rev_number(src_commit)
-  commit("Update from https://crrev.com/" + src_rev, cwd=mojo_root_dir)
-
-def main():
-  parser = argparse.ArgumentParser(description="Update the mojo repo's " +
-      "snapshot of things imported from chromium.")
-  parser.add_argument("chromium_dir", help="chromium source dir")
-  args = parser.parse_args()
-  pre_roll_commit = system(
-      ["git", "rev-parse", "HEAD"], cwd=mojo_root_dir).strip()
-
-  rev(args.chromium_dir)
-
-  try:
-    patch.patch_and_filter()
-  except subprocess.CalledProcessError:
-    print "ERROR: Roll failed due to a patch not applying"
-    print "Fix the patch to apply, commit the result, and re-run this script"
-    return 1
-
-  print "Restoring files whose contents don't track Chromium"
-  for f in files_not_to_roll:
-    system(["git", "checkout", pre_roll_commit, "--", f], cwd=mojo_root_dir)
-  if files_not_to_roll:
-    commit("Restored pre-roll versions of files that don't get rolled")
-  return 0
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/mojo/tools/roll/utils.py b/mojo/tools/roll/utils.py
deleted file mode 100755
index dcdfc35..0000000
--- a/mojo/tools/roll/utils.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import fnmatch
-import os
-import subprocess
-
-mojo_root_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                             os.pardir, os.pardir, os.pardir)
-
-def commit(message, cwd=None):
-  subprocess.call(['git', 'commit', '-a', '-m', message], cwd=cwd)
-
-def system(command, cwd=None):
-  return subprocess.check_output(command, cwd=cwd)
-
-def find(patterns, start='.'):
-  for path, dirs, files in os.walk(start):
-    for basename in files + dirs:
-      if any([fnmatch.fnmatch(basename, pattern) for pattern in patterns]):
-        filename = os.path.join(path, basename)
-        yield filename
-
-def filter_file(path, predicate):
-  with open(path, 'r+') as f:
-    lines = f.readlines()
-    new_lines = [line for line in lines if predicate(line)]
-    f.seek(0)
-    f.truncate()
-    f.write(''.join(new_lines))
diff --git a/mojo/tools/roll_services.py b/mojo/tools/roll_services.py
deleted file mode 100755
index 5f9a94d..0000000
--- a/mojo/tools/roll_services.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Roll services version in the cdn."""
-
-import argparse
-import os
-import subprocess
-import sys
-import tempfile
-
-from mopy.config import Config
-from mopy.paths import Paths
-
-def target(config):
-  target_name = config.target_os + "-" + config.target_cpu
-  if config.is_official_build:
-    target_name += "-official"
-  return target_name
-
-
-def get_gsutil():
-  paths = Paths()
-  sys.path.insert(0, os.path.join(paths.src_root, "tools"))
-  # pylint: disable=F0401
-  import find_depot_tools
-
-  depot_tools_path = find_depot_tools.add_depot_tools_to_path()
-  return os.path.join(depot_tools_path, "third_party", "gsutil", "gsutil")
-
-
-def upload(gsutil_exe, source, dest):
-  subprocess.check_call([gsutil_exe, "cp", source, dest])
-
-
-def write_file_to_gs(gsutil_exe, file_contents, dest):
-  with tempfile.NamedTemporaryFile() as temp_version_file:
-    temp_version_file.write(file_contents)
-    temp_version_file.flush()
-    upload(gsutil_exe, temp_version_file.name, dest)
-
-
-def roll_version(gsutil_exe, config, version):
-  service_dir = 'gs://mojo/services/%s/%s' % (target(config), version)
-  services = subprocess.check_output(
-      [gsutil_exe, 'ls', service_dir]).strip().split('\n')
-  for service in services:
-    service_binary_name = service.split('/')[-1]
-    service_location_file = ("gs://mojo/services/" + target(config) + "/" +
-        service_binary_name + "_location")
-    service_location_in_gs = service[len('gs://'):]
-    write_file_to_gs(gsutil_exe, service_location_in_gs, service_location_file)
-
-
-def main():
-  parser = argparse.ArgumentParser(description="Change the version of the mojo "
-      "services on the cdn.")
-  parser.add_argument("-v", "--verbose", help="Verbose mode",
-      action="store_true")
-  parser.add_argument("version",
-                      help="New version of the mojo services.")
-  args = parser.parse_args()
-
-  gsutil_exe = get_gsutil()
-
-  for target_os in [Config.OS_LINUX, Config.OS_ANDROID]:
-    config = Config(target_os=target_os)
-    roll_version(gsutil_exe, config, args.version)
-
-  return 0
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/mojo/tools/run_command_through_symbolizer.py b/mojo/tools/run_command_through_symbolizer.py
deleted file mode 100755
index 1110eee..0000000
--- a/mojo/tools/run_command_through_symbolizer.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-# Simple script that executes the command supplied as arguments and pipes
-# stderr/out through asan_symbolize.py.
-
-import os
-import subprocess
-import sys
-
-def main():
-  p1 = subprocess.Popen(sys.argv[1:], stdout=subprocess.PIPE,
-                        stderr=sys.stdout)
-  p2 = subprocess.Popen([os.path.join('tools', 'valgrind', 'asan',
-                                      'asan_symbolize.py')],
-                        stdin=p1.stdout)
-  p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
-  p1.wait()
-  p2.wait()
-  return p1.returncode
-
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/mojo/tools/run_mojo_python_bindings_tests.py b/mojo/tools/run_mojo_python_bindings_tests.py
deleted file mode 100755
index d64f49c..0000000
--- a/mojo/tools/run_mojo_python_bindings_tests.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import os
-import sys
-
-from mopy.mojo_python_tests_runner import MojoPythonTestRunner
-
-
-class PythonBindingsTestRunner(MojoPythonTestRunner):
-  def add_custom_commandline_options(self, parser):
-    parser.add_argument('--build-dir', action='store',
-                        help='path to the build output directory')
-
-  def apply_customization(self, args):
-    if args.build_dir:
-      python_build_dir = os.path.join(args.build_dir, 'python')
-      if python_build_dir not in sys.path:
-        sys.path.append(python_build_dir)
-      python_gen_dir = os.path.join(
-          args.build_dir,
-          'gen', 'mojo', 'public', 'interfaces', 'bindings', 'tests')
-      if python_gen_dir not in sys.path:
-        sys.path.append(python_gen_dir)
-
-
-def main():
-  runner = PythonBindingsTestRunner(os.path.join('mojo', 'python', 'tests'))
-  sys.exit(runner.run())
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/tools/run_mojo_python_tests.py b/mojo/tools/run_mojo_python_tests.py
deleted file mode 100755
index d18baf4..0000000
--- a/mojo/tools/run_mojo_python_tests.py
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import os
-import sys
-
-from mopy.mojo_python_tests_runner import MojoPythonTestRunner
-
-
-def main():
-  test_dir_list = [
-      # Tests of pylib bindings.
-      os.path.join('mojo', 'public', 'tools', 'bindings', 'pylib'),
-      # Tests of "mopy" python tools code.
-      os.path.join('mojo', 'tools', 'mopy'),
-      # Tests of python code in devtools.
-      os.path.join('mojo', 'devtools', 'common', 'devtoolslib')
-  ]
-
-  for test_dir in test_dir_list:
-    runner = MojoPythonTestRunner(test_dir)
-    exit_code = runner.run()
-    if exit_code:
-      return exit_code
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/tools/test_runner.py b/mojo/tools/test_runner.py
deleted file mode 100755
index fe564a9..0000000
--- a/mojo/tools/test_runner.py
+++ /dev/null
@@ -1,152 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""A "smart" test runner for gtest unit tests (that caches successes)."""
-
-import argparse
-import logging
-import os
-import subprocess
-import sys
-
-from mopy import gtest
-from mopy.config import Config
-from mopy.gn import ConfigForGNArgs, ParseGNConfig
-from mopy.log import InitLogging
-from mopy.paths import Paths
-from mopy.transitive_hash import file_hash, transitive_hash
-
-
-_logger = logging.getLogger()
-_paths = Paths()
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description="A 'smart' test runner for gtest unit tests (that caches "
-                  "successes).")
-
-  parser.add_argument("--verbose", help="be verbose (multiple times for more)",
-                      default=0, dest="verbose_count", action="count")
-  parser.add_argument("--successes-cache",
-                      help="the file caching test results (empty to not cache)",
-                      default="mojob_test_successes")
-  parser.add_argument("test_list_file",
-                      help="the file containing the tests to run", type=file)
-  parser.add_argument("root_dir", help="the build directory")
-  args = parser.parse_args()
-
-  InitLogging(args.verbose_count)
-  config = ConfigForGNArgs(ParseGNConfig(args.root_dir))
-
-  _logger.debug("Test list file: %s", args.test_list_file)
-  execution_globals = {"config": config}
-  exec args.test_list_file in execution_globals
-  test_list = execution_globals["tests"]
-  _logger.debug("Test list: %s" % test_list)
-
-  print "Running tests in directory: %s" % args.root_dir
-  os.chdir(args.root_dir)
-
-  if args.successes_cache:
-    print "Successes cache file: %s" % args.successes_cache
-  else:
-    print "No successes cache file (will run all tests unconditionally)"
-
-  if args.successes_cache:
-    # This file simply contains a list of transitive hashes of tests that
-    # succeeded.
-    try:
-      _logger.debug("Trying to read successes cache file: %s",
-                     args.successes_cache)
-      with open(args.successes_cache, 'rb') as f:
-        successes = set([x.strip() for x in f.readlines()])
-      _logger.debug("Successes: %s", successes)
-    except IOError:
-      # Just assume that it didn't exist, or whatever.
-      print ("Failed to read successes cache file %s (will create)" %
-             args.successes_cache)
-      successes = set()
-
-  gtest.set_color()
-
-  exit_code = 0
-  successes_cache_file = (open(args.successes_cache, "ab")
-      if args.successes_cache else None)
-  for test_dict in test_list:
-    test = test_dict["test"]
-    test_name = test_dict.get("name", test)
-    # TODO(vtl): Add type.
-    cacheable = test_dict.get("cacheable", True)
-    if not cacheable:
-      _logger.debug("%s is marked as non-cacheable" % test_name)
-
-    gtest_file = test
-    if config.target_os == Config.OS_ANDROID:
-      gtest_file = test + "_apk/" + test + "-debug.apk"
-
-    if successes_cache_file and cacheable:
-      _logger.debug("Getting transitive hash for %s ... " % test_name)
-      try:
-        if config.target_os == Config.OS_ANDROID:
-          gtest_hash = file_hash(gtest_file)
-        else:
-          gtest_hash = transitive_hash(gtest_file)
-      except subprocess.CalledProcessError:
-        print "Failed to get transitive hash for %s" % test_name
-        exit_code = 1
-        continue
-      _logger.debug("  Transitive hash: %s" % gtest_hash)
-
-      if gtest_hash in successes:
-        print "Skipping %s (previously succeeded)" % test_name
-        continue
-
-    _logger.info("Will start: %s" % test_name)
-    print "Running %s...." % test_name,
-    sys.stdout.flush()
-    try:
-      if config.target_os == Config.OS_ANDROID:
-        command = [
-            "python",
-            os.path.join(_paths.src_root, "build", "android", "test_runner.py"),
-            "gtest",
-            "--output-directory",
-            args.root_dir,
-            "-s",
-            test,
-        ]
-      else:
-        command = ["./" + test]
-      _logger.debug("Command: %s" % command)
-      subprocess.check_output(command, stderr=subprocess.STDOUT)
-      print "Succeeded"
-      # Record success.
-      if args.successes_cache and cacheable:
-        successes.add(gtest_hash)
-        successes_cache_file.write(gtest_hash + "\n")
-        successes_cache_file.flush()
-    except subprocess.CalledProcessError as e:
-      print "Failed with exit code %d and output:" % e.returncode
-      print 72 * "-"
-      print e.output
-      print 72 * "-"
-      exit_code = 1
-      continue
-    except OSError as e:
-      print "  Failed to start test"
-      exit_code = 1
-      continue
-    _logger.info("Completed: %s" % test_name)
-  if exit_code == 0:
-    print "All tests succeeded"
-  if successes_cache_file:
-    successes_cache_file.close()
-
-  return exit_code
-
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/mojo/tools/testing/mojom_fetcher/dependency_tests.py b/mojo/tools/testing/mojom_fetcher/dependency_tests.py
deleted file mode 100644
index 68f0ed8..0000000
--- a/mojo/tools/testing/mojom_fetcher/dependency_tests.py
+++ /dev/null
@@ -1,110 +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.
-
-import unittest
-
-from fetcher.dependency import Dependency
-
-class FakeRepository(object):
-  def get_repo_root_directory(self):
-    return "/base/repo"
-
-  def get_external_directory(self):
-    return "/base/repo/third_party/external"
-
-class TestDependency(unittest.TestCase):
-  def test_importer_imported(self):
-    dep = Dependency(FakeRepository(),
-                     "/base/repo/services/foo/../bar/bar.mojom",
-                     "mojo/public/./../public/baz.mojom")
-
-    self.assertEqual("/base/repo/services/bar/bar.mojom", dep.get_importer())
-    self.assertEqual("mojo/public/baz.mojom", dep.get_imported())
-
-  def test_is_sdk_dep(self):
-    # Not in SDK
-    dep = Dependency(FakeRepository(),
-                     "/base/repo/services/bar/bar.mojom",
-                     "mojo/public/../foo/baz.mojom")
-    self.assertFalse(dep.is_sdk_dep())
-
-    # In SDK
-    dep = Dependency(FakeRepository(),
-                     "/base/repo/services/bar/bar.mojom",
-                     "mojo/public/baz.mojom")
-    self.assertTrue(dep.is_sdk_dep())
-
-  def test_maybe_is_a_url(self):
-    # Not a URL
-    dep = Dependency(FakeRepository(),
-                     "/base/repo/services/bar/bar.mojom",
-                     "mojo/foo/baz.mojom")
-    self.assertFalse(dep.maybe_is_a_url())
-
-    # URL import from non-external mojom
-    dep = Dependency(FakeRepository(),
-                     "/base/repo/services/bar/bar.mojom",
-                     "foo.bar.com/foo/baz.mojom")
-    self.assertTrue(dep.maybe_is_a_url())
-
-    # URL import from an external mojom
-    dep = Dependency(FakeRepository(),
-                     "/base/repo/third_party/external/" +
-                     "services.bar.com/bar/bar.mojom",
-                     "foo.bar.com/foo/baz.mojom")
-    self.assertTrue(dep.maybe_is_a_url())
-
-    # relative import from an external mojom
-    dep = Dependency(
-        FakeRepository(),
-        "/base/repo/third_party/external/services.bar.com/bar/bar.mojom",
-        "foo/baz.mojom")
-    self.assertTrue(dep.maybe_is_a_url())
-
-    # external mojom importing SDK dep
-    dep = Dependency(
-        FakeRepository(),
-        "/base/repo/third_party/external/services.bar.com/bar/bar.mojom",
-        "mojo/public/foo/baz.mojom")
-    self.assertFalse(dep.maybe_is_a_url())
-
-  def test_generate_candidate_urls_relative(self):
-    dep = Dependency(
-        FakeRepository(),
-        "/base/repo/third_party/external/" +
-            "services.bar.com/bar/interfaces/bar.mojom",
-        "foo/baz.mojom")
-    self.assertTrue(dep.maybe_is_a_url())
-    candidate_urls = dep.generate_candidate_urls()
-    self.assertEqual(["services.bar.com/bar/interfaces/foo/baz.mojom",
-                       "services.bar.com/bar/foo/baz.mojom",
-                       "services.bar.com/foo/baz.mojom"], candidate_urls)
-
-  def test_generate_candidate_urls_absolute(self):
-    dep = Dependency(FakeRepository(),
-                     "/base/repo/services/bar/interfaces/bar.mojom",
-                     "services.foo.com/foo/baz.mojom")
-    self.assertTrue(dep.maybe_is_a_url())
-    candidate_urls = dep.generate_candidate_urls()
-    self.assertEqual(["services.foo.com/foo/baz.mojom"], candidate_urls)
-
-  def test_get_search_path_for_dependency(self):
-    # Absolute
-    dep = Dependency(FakeRepository(),
-                     "/base/repo/services/bar/interfaces/bar.mojom",
-                     "services.foo.com/foo/baz.mojom")
-    self.assertEqual(set(["/base/repo/services/bar/interfaces",
-                          "/base/repo", "/base/repo/third_party/external"]),
-                     dep.get_search_path_for_dependency())
-
-    # Relative
-    dep = Dependency(
-        FakeRepository(),
-        "/base/repo/third_party/external/services.foo.com/bar/bar.mojom",
-        "baz/baz.mojom")
-    self.assertEqual(set([
-        "/base/repo", "/base/repo/third_party/external",
-        "/base/repo/third_party/external/services.foo.com/bar",
-        "/base/repo/third_party/external/services.foo.com"]),
-                     dep.get_search_path_for_dependency())
diff --git a/mojo/tools/testing/mojom_fetcher/fakes.py b/mojo/tools/testing/mojom_fetcher/fakes.py
deleted file mode 100644
index 699d306..0000000
--- a/mojo/tools/testing/mojom_fetcher/fakes.py
+++ /dev/null
@@ -1,113 +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.
-
-import io
-import os.path
-
-from fetcher.dependency import Dependency
-from fetcher.mojom_file import MojomFile
-from fetcher.repository import Repository
-
-class FakeRepository(Repository):
-  data1 = """module test;
-import "bar/baz.mojom";
-interface Foo {};"""
-  data2 = """module test;
-import "services.domokit.org/foo/fiz.mojom";
-interface Baz {};"""
-  data3 = """module test;
-import "services.fiz.org/foo/bar.mojom";
-interface Fiz {};"""
-  data4 = """module test;
-interface SomeInterface {};"""
-
-  def __init__(self, *args, **kwargs):
-    self.files_opened = []
-    self.directories_walked = []
-    self.all_files_available = False
-
-    Repository.__init__(self, *args, **kwargs)
-
-  def get_walk_base(self, directory):
-    data_base = [
-        (directory, ["foo", "third_party"], []),
-        (os.path.join(directory, "foo"), ["bar"], ["foo.mojom"]),
-        (os.path.join(directory, "foo/bar"), [], ["baz.mojom"]),
-        (os.path.join(directory, "third_party"), ["external"], []),
-        (os.path.join(directory, "third_party/external"),
-         ["services.domokit.org"], []),
-        (os.path.join(directory,
-                      "third_party/external/services.domokit.org"),
-         ["foo"], []),
-        (os.path.join(directory,
-                      "third_party/external/services.domokit.org/foo"),
-         [], ["fiz.mojom"])]
-    if self.all_files_available:
-      data_base.extend([
-          (os.path.join(directory,
-                      "third_party/external/services.fiz.org"),
-           ["foo"], []),
-          (os.path.join(directory,
-                        "third_party/external/services.fiz.org/foo"),
-           [], ["bar.mojom"])])
-    return data_base
-
-  def get_walk_external(self, directory):
-    data_external = [
-        (directory, ["services.domokit.org"], []),
-        (os.path.join(directory, "services.domokit.org"),
-         ["foo"], []),
-        (os.path.join(directory, "services.domokit.org/foo"),
-         [], ["fiz.mojom"])]
-    if self.all_files_available:
-      data_external.extend([
-          (os.path.join(directory, "services.fiz.org"),
-           ["foo"], []),
-          (os.path.join(directory, "services.fiz.org/foo"),
-           [], ["bar.mojom"])])
-    return data_external
-
-
-  def _open(self, f):
-    self.files_opened.append(f)
-
-    if "foo.mojom" in f:
-      val = io.BytesIO(self.data1)
-    elif "baz.mojom" in f:
-      val = io.BytesIO(self.data2)
-    elif "fiz.mojom" in f:
-      val = io.BytesIO(self.data3)
-    else:
-      val = io.BytesIO(self.data4)
-    return val
-
-  def _os_walk(self, directory):
-    self.directories_walked.append(directory)
-    if directory == self._root_dir:
-      return iter(self.get_walk_base(directory))
-    else:
-      return iter(self.get_walk_external(directory))
-
-
-class FakeDependency(Dependency):
-  IN_FILESYSTEM = [
-      "/base/repo/third_party/external/example.com/dir/example.mojom",
-      "/base/repo/third_party/external/example.com/dir/dir.mojom",
-      "/base/repo/third_party/external/domokit.org/bar/baz/buzz.mojom",
-      "/base/repo/third_party/external/domokit.org/bar/foo/bar.mojom",
-      ]
-
-  def _os_path_exists(self, path):
-    if path in self.IN_FILESYSTEM:
-      return True
-    elif os.path.join("/base/repo", path) in self.IN_FILESYSTEM:
-      return True
-    else:
-      return False
-
-
-class FakeMojomFile(MojomFile):
-  def add_dependency(self, dependency):
-    """Declare a new dependency of this mojom."""
-    self.deps.append(FakeDependency(self._repository, self.name, dependency))
diff --git a/mojo/tools/testing/mojom_fetcher/mojom_directory_tests.py b/mojo/tools/testing/mojom_fetcher/mojom_directory_tests.py
deleted file mode 100644
index 0b2f5dd..0000000
--- a/mojo/tools/testing/mojom_fetcher/mojom_directory_tests.py
+++ /dev/null
@@ -1,50 +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.
-
-import os.path
-import unittest
-
-from fakes import FakeMojomFile
-from fetcher.dependency import Dependency
-from fetcher.mojom_directory import MojomDirectory
-from fetcher.mojom_file import MojomFile
-from fetcher.repository import Repository
-
-
-class TestMojomDirectory(unittest.TestCase):
-  def test_build_gn_path(self):
-    directory = MojomDirectory(
-        "/base/repo/third_party/external/domokit.org/bar/baz")
-    self.assertEquals(
-        "/base/repo/third_party/external/domokit.org/bar/baz/BUILD.gn",
-        directory.get_build_gn_path())
-
-  def test_jinja_parameters(self):
-    mojom = FakeMojomFile(
-        Repository("/base/repo", "third_party/external"),
-        "/base/repo/third_party/external/domokit.org/bar/baz/foo.mojom")
-    mojom.add_dependency("example.com/dir/example.mojom")
-    mojom.add_dependency("example.com/dir/dir.mojom")
-    mojom.add_dependency("buzz.mojom")
-    mojom.add_dependency("foo/bar.mojom")
-    mojom.add_dependency(
-        "mojo/public/interfaces/application/shell.mojom")
-    directory = MojomDirectory(
-        "/base/repo/third_party/external/domokit.org/bar/baz")
-    directory.add_mojom(mojom)
-    params = directory.get_jinja_parameters([])
-    self.assertEquals(
-        {"group_name": "baz",
-         "mojoms": [{
-             "target_name": "foo",
-             "filename": "foo.mojom",
-             "import_dirs": [".."],
-             "mojo_sdk_deps": ["mojo/public/interfaces/application"],
-             "deps": [
-                 '//third_party/external/example.com/dir:example',
-                 '//third_party/external/example.com/dir:dir_mojom',
-                 ':buzz',
-                 '../foo:bar']
-             }]}, params)
-
diff --git a/mojo/tools/testing/mojom_fetcher/mojom_fetcher_tests.py b/mojo/tools/testing/mojom_fetcher/mojom_fetcher_tests.py
deleted file mode 100755
index 8781ffe..0000000
--- a/mojo/tools/testing/mojom_fetcher/mojom_fetcher_tests.py
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import io
-import os
-import sys
-import unittest
-
-sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                "..", "..", "..", "public", "tools",
-                                "mojom_fetcher"))
-sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                "..", "..", "..", "public", "tools",
-                                "mojom_fetcher", "pylib"))
-sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                "..", "..", "..", "public", "tools",
-                                "bindings", "pylib"))
-
-from mojom_fetcher import UrlRewriter, UrlRewriterException, MojomFetcher
-
-# Fake repository for testing
-from fakes import FakeRepository
-
-
-class TestUrlRewriter(unittest.TestCase):
-  def test_no_transitive(self):
-    rules = {"foo.com": "bar.com/foo", "bar.com": "baz.com"}
-    try:
-      UrlRewriter(rules)
-      self.fail()
-    except UrlRewriterException:
-      # This is expected
-      pass
-
-  def test_rewrite(self):
-    rules = {"foo.com": "bar.com/foo", "baz.com": "bar.com/baz"}
-    rewriter = UrlRewriter(rules)
-    self.assertEquals("bar.com/foo/foo_file",
-                      rewriter.rewrite("foo.com/foo_file"))
-    self.assertEquals("bar.com/baz/foo_file",
-                      rewriter.rewrite("baz.com/foo_file"))
-    self.assertEquals("example.com/file",
-                      rewriter.rewrite("example.com/file"))
-
-
-class FakeRequest(object):
-  def __init__(self, content, ok):
-    self.content = content
-    self.ok = ok
-
-
-class FakeMojomFetcher(MojomFetcher):
-  data = """module test;
-interface Fiz {};"""
-
-  def __init__(self, repository, rewriter):
-    self.count = 1
-    self.opened_files = {}
-    self.downloaded_urls = []
-    MojomFetcher.__init__(self, repository, rewriter)
-
-  def _requests_get(self, url):
-    self.downloaded_urls.append(url)
-    return FakeRequest(self.data, True)
-
-  def _os_makedirs(self, _):
-    return
-
-  def _open(self, f, _):
-    fake_file = io.BytesIO()
-    self.opened_files[f] = fake_file
-    if "services.fiz.org/foo/bar.mojom" in f:
-      self._repository.all_files_available = True
-    return fake_file
-
-
-class TestMojomFetcher(unittest.TestCase):
-  def setUp(self):
-    self.rules = {"foo.com": "bar.com/foo", "baz.com": "bar.com/baz"}
-    self.rewriter = UrlRewriter(self.rules)
-    self.repository = FakeRepository("/path/to/repo", "third_party/external")
-    self.fetcher = FakeMojomFetcher(self.repository, self.rewriter)
-
-  def test_get(self):
-    self.fetcher.get("foo.com/bar.mojom")
-    self.assertEquals(["https://bar.com/foo/bar.mojom",
-                       "https://services.fiz.org/foo/bar.mojom"],
-                      self.fetcher.downloaded_urls)
-
-  def test_update(self):
-    self.fetcher.update()
-    self.assertEquals(["https://services.domokit.org/foo/fiz.mojom",
-                       "https://services.fiz.org/foo/bar.mojom"],
-                      self.fetcher.downloaded_urls)
-
-  def test_discover(self):
-    self.fetcher.update()
-    self.assertEquals(["https://services.domokit.org/foo/fiz.mojom",
-                       "https://services.fiz.org/foo/bar.mojom"],
-                      self.fetcher.downloaded_urls)
-
-if __name__ == '__main__':
-  loader = unittest.defaultTestLoader
-  runner = unittest.TextTestRunner()
-  directory = os.path.dirname(os.path.abspath(__file__))
-  suite = loader.discover(directory, '*_tests.py')
-  runner.run(suite)
diff --git a/mojo/tools/testing/mojom_fetcher/mojom_file_tests.py b/mojo/tools/testing/mojom_fetcher/mojom_file_tests.py
deleted file mode 100644
index cb5558d..0000000
--- a/mojo/tools/testing/mojom_fetcher/mojom_file_tests.py
+++ /dev/null
@@ -1,44 +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.
-
-import os.path
-import unittest
-
-from fetcher.mojom_file import MojomFile
-from fetcher.dependency import Dependency
-from fetcher.repository import Repository
-from fakes import FakeDependency, FakeMojomFile
-
-
-class TestMojomFile(unittest.TestCase):
-  def test_add_dependency(self):
-    mojom = MojomFile(Repository("/base/repo", "third_party/external"),
-                      "mojom_name")
-    mojom.add_dependency("dependency_name")
-    self.assertEqual(1, len(mojom.deps))
-    self.assertEqual("mojom_name", mojom.deps[0].get_importer())
-    self.assertEqual("dependency_name", mojom.deps[0].get_imported())
-
-  def test_jinja_parameters(self):
-    mojom = FakeMojomFile(
-        Repository("/base/repo", "third_party/external"),
-        "/base/repo/third_party/external/domokit.org/bar/baz/foo.mojom")
-    mojom.add_dependency("example.com/dir/example.mojom")
-    mojom.add_dependency("example.com/dir/dir.mojom")
-    mojom.add_dependency("buzz.mojom")
-    mojom.add_dependency("foo/bar.mojom")
-    mojom.add_dependency(
-        "mojo/public/interfaces/application/shell.mojom")
-    params = mojom.get_jinja_parameters([])
-    self.assertEquals({
-        "target_name": "foo",
-        "filename": "foo.mojom",
-        "import_dirs": [".."],
-        "mojo_sdk_deps": ["mojo/public/interfaces/application"],
-        "deps": [
-            '//third_party/external/example.com/dir:example',
-            '//third_party/external/example.com/dir:dir_mojom',
-            ':buzz',
-            '../foo:bar']
-        }, params)
diff --git a/mojo/tools/testing/mojom_fetcher/mojom_gn_tests.py b/mojo/tools/testing/mojom_fetcher/mojom_gn_tests.py
deleted file mode 100644
index 11e61b3..0000000
--- a/mojo/tools/testing/mojom_fetcher/mojom_gn_tests.py
+++ /dev/null
@@ -1,88 +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.
-
-import io
-import os.path
-import unittest
-
-from fakes import FakeMojomFile
-from fetcher.mojom_directory import MojomDirectory
-from fetcher.repository import Repository
-from mojom_gn import BuildGNGenerator
-
-class FakeRepository(Repository):
-  def get_all_external_mojom_directories(self):
-    mojom = FakeMojomFile(
-        self, os.path.join(self.get_external_directory(),
-                           "domokit.org/bar/baz/foo.mojom"))
-    mojom.add_dependency("example.com/dir/example.mojom")
-    mojom.add_dependency("example.com/dir/dir.mojom")
-    mojom.add_dependency("buzz.mojom")
-    mojom.add_dependency("foo/bar.mojom")
-    mojom.add_dependency(
-        "mojo/public/interfaces/application/shell.mojom")
-    directory = MojomDirectory(
-        os.path.join(self.get_external_directory(),
-                     "domokit.org/bar/baz"))
-    directory.add_mojom(mojom)
-    return [directory]
-
-
-class FakeBuildGNGenerator(BuildGNGenerator):
-  def __init__(self, *args, **kwargs):
-    self.opened_files = {}
-    BuildGNGenerator.__init__(self, *args, **kwargs)
-
-  def _open(self, filepath, mode):
-    if mode != "w":
-      raise Exception("Invalid mode " + str(mode))
-    self.opened_files[filepath] = io.StringIO()
-    return self.opened_files[filepath]
-
-
-class TestBuildGNGenerator(unittest.TestCase):
-  BAZ_BUILD_GN = u"""import("//build/module_args/mojo.gni")
-import("$mojo_sdk_root/mojo/public/tools/bindings/mojom.gni")
-
-mojom("baz") {
-  deps = [
-    ":foo",
-  ]
-}
-
-mojom("foo") {
-  sources = [
-    "foo.mojom",
-  ]
-  import_dirs = [
-    get_path_info("..", "abspath"),
-  ]
-  mojo_sdk_deps = [
-    "mojo/public/interfaces/application",
-  ]
-  deps = [
-    "//third_party/external/example.com/dir:example",
-    "//third_party/external/example.com/dir:dir_mojom",
-    ":buzz",
-    "../foo:bar",
-  ]
-}"""
-  def test_generate(self):
-    self.maxDiff = None
-    repository = FakeRepository("/base/repo", "third_party/external")
-    gn_generator = FakeBuildGNGenerator(repository, os.path.abspath(
-        os.path.join(os.path.dirname(__file__),
-                     "../../../public/tools/mojom_fetcher")))
-    gn_generator.generate()
-    output_stream = gn_generator.opened_files[
-        "/base/repo/third_party/external/domokit.org/bar/baz/BUILD.gn"]
-    self.assertEquals(prepare_string(self.BAZ_BUILD_GN),
-                      prepare_string(output_stream.getvalue()))
-
-def prepare_string(value):
-  lines = value.split("\n")
-  lines = map(lambda l: l.strip().replace(" ", ""), lines)
-  lines = filter(lambda l: not l.startswith("#"), lines)
-  return ''.join(lines)
-
diff --git a/mojo/tools/testing/mojom_fetcher/repository_tests.py b/mojo/tools/testing/mojom_fetcher/repository_tests.py
deleted file mode 100644
index 46724d1..0000000
--- a/mojo/tools/testing/mojom_fetcher/repository_tests.py
+++ /dev/null
@@ -1,43 +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.
-
-import io
-import os.path
-import unittest
-
-from fetcher.dependency import Dependency
-
-# Fake repository for testing
-from fakes import FakeRepository
-
-
-class TestRepository(unittest.TestCase):
-  def test_init(self):
-    repository = FakeRepository("/path/to/repo", "third_party/external")
-    self.assertEqual("/path/to/repo", repository.get_repo_root_directory())
-    self.assertEqual("/path/to/repo/third_party/external",
-                     repository.get_external_directory())
-
-  def test_get_missing_dependencies(self):
-    repository = FakeRepository("/path/to/repo", "third_party/external")
-    missing_deps = repository.get_missing_dependencies()
-    self.assertEquals(["/path/to/repo"], repository.directories_walked)
-    # Order is not important
-    self.assertIn("/path/to/repo/foo/foo.mojom", repository.files_opened)
-    self.assertIn("/path/to/repo/foo/bar/baz.mojom", repository.files_opened)
-    self.assertIn(
-        "/path/to/repo/third_party/external/services.domokit.org/foo/fiz.mojom",
-        repository.files_opened)
-    self.assertEquals(3, len(repository.files_opened))
-
-    self.assertEquals([Dependency(repository,
-        "/path/to/repo/third_party/external/services.domokit.org/foo/fiz.mojom",
-        "services.fiz.org/foo/bar.mojom")], missing_deps)
-
-  def test_get_external_urls(self):
-    repository = FakeRepository("/path/to/repo", "third_party/external")
-    urls = repository.get_external_urls()
-    self.assertEquals(["/path/to/repo/third_party/external"],
-                      repository.directories_walked)
-    self.assertEquals(["services.domokit.org/foo/fiz.mojom"], urls)
diff --git a/mojo/tools/upload_binaries.py b/mojo/tools/upload_binaries.py
deleted file mode 100755
index d1c25cc..0000000
--- a/mojo/tools/upload_binaries.py
+++ /dev/null
@@ -1,234 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Tool to roll Chromium into Mojo. See:
-https://github.com/domokit/mojo/wiki/Rolling-code-between-chromium-and-mojo#chromium---mojo-updates
-"""
-
-import argparse
-import glob
-import itertools
-import os
-import subprocess
-import sys
-import tempfile
-import time
-import zipfile
-
-import mopy.gn as gn
-from mopy.config import Config
-from mopy.paths import Paths
-from mopy.version import Version
-
-sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir,
-                             "third_party", "pyelftools"))
-import elftools.elf.elffile as elffile
-
-sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir,
-                             'devtools', 'common'))
-import android_gdb.signatures as signatures
-
-
-BLACKLISTED_APPS = [
-  # The network service apps are not produced out of the Mojo repo, but may
-  # be present in the build dir.
-  "network_service.mojo",
-  "network_service_apptests.mojo",
-]
-
-ARCHITECTURE_INDEPENDENT_FILES = [
-  # These are files other than *.mojo files which are part of our binary
-  # artifact scheme. These files must be architecture independent.
-  "obj/mojo/dart/apptest/apptest.dartzip",
-]
-
-
-def target(config):
-  target_name = config.target_os + "-" + config.target_cpu
-  if config.is_official_build:
-    target_name += "-official"
-  return target_name
-
-def find_apps_to_upload(build_dir):
-  apps = []
-  for path in glob.glob(build_dir + "/*"):
-    if not os.path.isfile(path):
-      continue
-    _, ext = os.path.splitext(path)
-    if ext != '.mojo':
-      continue
-    if os.path.basename(path) in BLACKLISTED_APPS:
-      continue
-    apps.append(path)
-  return apps
-
-
-def find_architecture_independent_files(build_dir):
-  existing_files = []
-  for path in ARCHITECTURE_INDEPENDENT_FILES:
-    joined_path = os.path.join(build_dir, path)
-    if os.path.isfile(joined_path):
-      existing_files.append(joined_path)
-  return existing_files
-
-
-def check_call(command_line, dry_run, **kwargs):
-  if dry_run:
-    print command_line
-  else:
-    subprocess.check_call(command_line, **kwargs)
-
-
-def upload(config, source, dest, dry_run, gzip=False):
-  paths = Paths(config)
-  sys.path.insert(0, os.path.join(paths.src_root, "tools"))
-  # pylint: disable=F0401
-  import find_depot_tools
-
-  depot_tools_path = find_depot_tools.add_depot_tools_to_path()
-  gsutil_exe = os.path.join(depot_tools_path, "third_party", "gsutil", "gsutil")
-
-  command_line = [gsutil_exe, "cp"]
-  if gzip and "." in source:
-    extension = source.split(".")[-1]
-    command_line.extend(["-z", extension])
-  command_line.extend([source, dest])
-
-  check_call(command_line, dry_run)
-
-
-def upload_symbols(config, build_dir, breakpad_upload_urls, dry_run):
-  dump_syms_exe = os.path.join(Paths().src_root,
-                               "mojo", "tools", "linux64", "dump_syms")
-  symupload_exe = os.path.join(Paths().src_root,
-                               "mojo", "tools", "linux64", "symupload")
-  dest_dir = "gs://mojo/symbols/"
-  symbols_dir = os.path.join(build_dir, "symbols")
-  with open(os.devnull, "w") as devnull:
-    for name in os.listdir(symbols_dir):
-      path = os.path.join(symbols_dir, name)
-      with open(path) as f:
-        signature = signatures.get_signature(f, elffile)
-        if signature is not None:
-          dest = dest_dir + signature
-          upload(config, path, dest, dry_run)
-      if breakpad_upload_urls:
-        with tempfile.NamedTemporaryFile() as temp:
-          check_call([dump_syms_exe, path], dry_run,
-                     stdout=temp, stderr=devnull)
-          temp.flush()
-          for upload_url in breakpad_upload_urls:
-            check_call([symupload_exe, temp.name, upload_url], dry_run)
-
-def upload_shell(config, dry_run, verbose):
-  paths = Paths(config)
-  zipfile_name = target(config)
-  version = Version().version
-
-  # Upload the binary.
-  # TODO(blundell): Change this to be in the same structure as the LATEST files,
-  # e.g., gs://mojo/shell/linux-x64/<version>/shell.zip.
-  dest = "gs://mojo/shell/" + version + "/" + zipfile_name + ".zip"
-  with tempfile.NamedTemporaryFile() as zip_file:
-    with zipfile.ZipFile(zip_file, 'w') as z:
-      shell_path = paths.target_mojo_shell_path
-      with open(shell_path) as shell_binary:
-        shell_filename = os.path.basename(shell_path)
-        zipinfo = zipfile.ZipInfo(shell_filename)
-        zipinfo.external_attr = 0777 << 16L
-        compress_type = zipfile.ZIP_DEFLATED
-        if config.target_os == Config.OS_ANDROID:
-          # The APK is already compressed.
-          compress_type = zipfile.ZIP_STORED
-        zipinfo.compress_type = compress_type
-        zipinfo.date_time = time.gmtime(os.path.getmtime(shell_path))
-        if verbose:
-          print "zipping %s" % shell_path
-        z.writestr(zipinfo, shell_binary.read())
-    upload(config, zip_file.name, dest, dry_run, gzip=False)
-
-  # Update the LATEST file to contain the version of the new binary.
-  latest_file = "gs://mojo/shell/%s/LATEST" % target(config)
-  write_file_to_gs(version, latest_file, config, dry_run)
-
-
-def upload_app(app_binary_path, config, dry_run):
-  app_binary_name = os.path.basename(app_binary_path)
-  version = Version().version
-  gsutil_app_location = ("gs://mojo/services/%s/%s/%s" %
-                         (target(config), version, app_binary_name))
-
-  # Upload the new binary.
-  upload(config, app_binary_path, gsutil_app_location, dry_run)
-
-
-def upload_file(file_path, config, dry_run):
-  file_binary_name = os.path.basename(file_path)
-  version = Version().version
-  gsutil_file_location = "gs://mojo/file/%s/%s" % (version, file_binary_name)
-
-  # Upload the new binary.
-  upload(config, file_path, gsutil_file_location, dry_run)
-
-
-def write_file_to_gs(file_contents, dest, config, dry_run):
-  with tempfile.NamedTemporaryFile() as temp_version_file:
-    temp_version_file.write(file_contents)
-    temp_version_file.flush()
-    upload(config, temp_version_file.name, dest, dry_run)
-
-
-def main():
-  parser = argparse.ArgumentParser(description="Upload binaries for apps and "
-      "the Mojo shell to google storage (by default on Linux, but this can be "
-      "changed via options).")
-  parser.add_argument("-n", "--dry_run", help="Dry run, do not actually "+
-      "upload", action="store_true")
-  parser.add_argument("-v", "--verbose", help="Verbose mode",
-      action="store_true")
-  parser.add_argument("--android",
-                      action="store_true",
-                      help="Upload the shell and apps for Android")
-  parser.add_argument("--official",
-                      action="store_true",
-                      help="Upload the official build of the Android shell")
-  parser.add_argument("--symbols-upload-url",
-                      action="append", default=[],
-                      help="URL of the server to upload breakpad symbols to")
-  args = parser.parse_args()
-
-  is_official_build = args.official
-  target_os = Config.OS_LINUX
-  if args.android:
-    target_os = Config.OS_ANDROID
-  elif is_official_build:
-    print "Uploading official builds is only supported for android."
-    return 1
-
-  config = Config(target_os=target_os, is_debug=False,
-                  is_official_build=is_official_build)
-
-  upload_shell(config, args.dry_run, args.verbose)
-
-  if is_official_build:
-    print "Skipping uploading apps (official apk build)."
-    return 0
-
-  build_directory = gn.BuildDirectoryForConfig(config, Paths(config).src_root)
-  apps_to_upload = find_apps_to_upload(build_directory)
-  for app in apps_to_upload:
-    upload_app(app, config, args.dry_run)
-
-  files_to_upload = find_architecture_independent_files(build_directory)
-  for file_to_upload in files_to_upload:
-    upload_file(file_to_upload, config, args.dry_run)
-
-  upload_symbols(config, build_directory,
-                 args.symbols_upload_url, args.dry_run)
-
-  return 0
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/services/asset_bundle/BUILD.gn b/services/asset_bundle/BUILD.gn
index 8d98859..7c38a37 100644
--- a/services/asset_bundle/BUILD.gn
+++ b/services/asset_bundle/BUILD.gn
@@ -16,7 +16,7 @@
 
   deps = [
     "//base",
-    "//mojo/common",
+    "//mojo/data_pipe_utils",
     "//mojo/public/cpp/bindings:callback",
     "//mojo/public/cpp/system",
     "//mojo/services/asset_bundle/public/interfaces",
@@ -32,7 +32,6 @@
   deps = [
     "//base",
     "//mojo/application",
-    "//mojo/common",
     "//mojo/public/cpp/application",
     "//mojo/public/cpp/bindings:callback",
     "//mojo/public/cpp/system",
@@ -54,7 +53,7 @@
     "//base",
     "//mojo/application",
     "//mojo/application:test_support",
-    "//mojo/common",
+    "//mojo/data_pipe_utils",
     "//mojo/public/cpp/bindings",
     "//mojo/services/asset_bundle/public/interfaces",
     "//third_party/zlib:zip",
diff --git a/services/asset_bundle/asset_bundle_apptest.cc b/services/asset_bundle/asset_bundle_apptest.cc
index 4fd9849..c449796 100644
--- a/services/asset_bundle/asset_bundle_apptest.cc
+++ b/services/asset_bundle/asset_bundle_apptest.cc
@@ -7,8 +7,7 @@
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
-#include "mojo/common/common_type_converters.h"
-#include "mojo/common/data_pipe_utils.h"
+#include "mojo/data_pipe_utils/data_pipe_utils.h"
 #include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/services/asset_bundle/public/interfaces/asset_bundle.mojom.h"
diff --git a/services/asset_bundle/asset_bundle_impl.cc b/services/asset_bundle/asset_bundle_impl.cc
index 0c3bd34..8776641 100644
--- a/services/asset_bundle/asset_bundle_impl.cc
+++ b/services/asset_bundle/asset_bundle_impl.cc
@@ -8,7 +8,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
-#include "mojo/common/data_pipe_utils.h"
+#include "mojo/data_pipe_utils/data_pipe_utils.h"
 
 namespace mojo {
 namespace asset_bundle {
diff --git a/services/asset_bundle/asset_unpacker_job.h b/services/asset_bundle/asset_unpacker_job.h
index 66c2b33..ed7cddc 100644
--- a/services/asset_bundle/asset_unpacker_job.h
+++ b/services/asset_bundle/asset_unpacker_job.h
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/task_runner.h"
-#include "mojo/common/data_pipe_utils.h"
+#include "mojo/data_pipe_utils/data_pipe_utils.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/services/asset_bundle/public/interfaces/asset_bundle.mojom.h"
 
diff --git a/services/sky/BUILD.gn b/services/sky/BUILD.gn
index 90ee461..4b15f98 100644
--- a/services/sky/BUILD.gn
+++ b/services/sky/BUILD.gn
@@ -30,7 +30,6 @@
 
   deps = [
     "//mojo/application",
-    "//mojo/common",
     "//mojo/common:tracing_impl",
     "//mojo/converters/geometry",
     "//mojo/converters/input_events",
diff --git a/sky/engine/bindings/BUILD.gn b/sky/engine/bindings/BUILD.gn
index 03a4299..509a207 100644
--- a/sky/engine/bindings/BUILD.gn
+++ b/sky/engine/bindings/BUILD.gn
@@ -376,7 +376,6 @@
     "//dart/runtime:libdart",
     "//dart/runtime/vm:libdart_platform",
     "//mojo/application",
-    "//mojo/common",
     "//mojo/public/c/system",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
diff --git a/sky/engine/core/BUILD.gn b/sky/engine/core/BUILD.gn
index e655074..45103f2 100644
--- a/sky/engine/core/BUILD.gn
+++ b/sky/engine/core/BUILD.gn
@@ -14,7 +14,7 @@
   public_deps = [
     "//base",
     "//mojo/application",
-    "//mojo/common",
+    "//mojo/data_pipe_utils",
     "//mojo/public/c/system",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
diff --git a/sky/engine/core/loader/CanvasImageDecoder.h b/sky/engine/core/loader/CanvasImageDecoder.h
index 8d545db..020a548 100644
--- a/sky/engine/core/loader/CanvasImageDecoder.h
+++ b/sky/engine/core/loader/CanvasImageDecoder.h
@@ -7,7 +7,7 @@
 #define SKY_ENGINE_CORE_LOADER_CANVASIMAGELOADER_H_
 
 #include "base/memory/weak_ptr.h"
-#include "mojo/common/data_pipe_drainer.h"
+#include "mojo/data_pipe_utils/data_pipe_drainer.h"
 #include "sky/engine/core/loader/ImageDecoderCallback.h"
 #include "sky/engine/platform/SharedBuffer.h"
 #include "sky/engine/tonic/dart_wrappable.h"
diff --git a/sky/engine/core/script/dart_controller.cc b/sky/engine/core/script/dart_controller.cc
index 8f9bb0a..eca1102 100644
--- a/sky/engine/core/script/dart_controller.cc
+++ b/sky/engine/core/script/dart_controller.cc
@@ -9,7 +9,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/trace_event/trace_event.h"
 #include "dart/runtime/include/dart_tools_api.h"
-#include "mojo/common/data_pipe_utils.h"
+#include "mojo/data_pipe_utils/data_pipe_utils.h"
 #include "mojo/public/cpp/system/data_pipe.h"
 #include "sky/engine/bindings/builtin.h"
 #include "sky/engine/bindings/builtin_natives.h"
diff --git a/sky/engine/platform/BUILD.gn b/sky/engine/platform/BUILD.gn
index db9d9cb..281a3f5 100644
--- a/sky/engine/platform/BUILD.gn
+++ b/sky/engine/platform/BUILD.gn
@@ -542,7 +542,6 @@
     ":make_platform_generated",
     "//base:base",
     "//mojo/application",
-    "//mojo/common",
     "//mojo/environment:chromium",
     "//mojo/public/c/system",
     "//mojo/public/cpp/bindings",
diff --git a/sky/engine/tonic/BUILD.gn b/sky/engine/tonic/BUILD.gn
index 4f37841..cbcc08c 100644
--- a/sky/engine/tonic/BUILD.gn
+++ b/sky/engine/tonic/BUILD.gn
@@ -57,7 +57,7 @@
 
   deps = [
     "//base",
-    "//mojo/common",
+    "//mojo/data_pipe_utils",
     "//mojo/public/cpp/system",
     "//sky/engine/wtf",
   ]
diff --git a/sky/engine/tonic/dart_library_loader.cc b/sky/engine/tonic/dart_library_loader.cc
index 93c4587..0b65fd6 100644
--- a/sky/engine/tonic/dart_library_loader.cc
+++ b/sky/engine/tonic/dart_library_loader.cc
@@ -6,7 +6,7 @@
 
 #include "base/callback.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/common/data_pipe_drainer.h"
+#include "mojo/data_pipe_utils/data_pipe_drainer.h"
 #include "sky/engine/tonic/dart_api_scope.h"
 #include "sky/engine/tonic/dart_converter.h"
 #include "sky/engine/tonic/dart_dependency_catcher.h"
diff --git a/sky/engine/tonic/dart_snapshot_loader.h b/sky/engine/tonic/dart_snapshot_loader.h
index 53edb04..a1f7356 100644
--- a/sky/engine/tonic/dart_snapshot_loader.h
+++ b/sky/engine/tonic/dart_snapshot_loader.h
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "dart/runtime/include/dart_api.h"
-#include "mojo/common/data_pipe_drainer.h"
+#include "mojo/data_pipe_utils/data_pipe_drainer.h"
 
 namespace blink {
 class DartState;
diff --git a/sky/engine/web/BUILD.gn b/sky/engine/web/BUILD.gn
index 5d21211..57185be 100644
--- a/sky/engine/web/BUILD.gn
+++ b/sky/engine/web/BUILD.gn
@@ -2,10 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-component("web") {
-  output_name = "sky_web"
-
+source_set("web") {
   deps = [
+    "//mojo/message_pump",
     "//sky/engine/core",
     "//sky/engine/platform",
   ]
diff --git a/sky/engine/web/Sky.cpp b/sky/engine/web/Sky.cpp
index c06612b..4abd634 100644
--- a/sky/engine/web/Sky.cpp
+++ b/sky/engine/web/Sky.cpp
@@ -33,7 +33,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/rand_util.h"
 #include "gen/sky/platform/RuntimeEnabledFeatures.h"
-#include "mojo/common/message_pump_mojo.h"
+#include "mojo/message_pump/message_pump_mojo.h"
 #include "sky/engine/core/dom/Microtask.h"
 #include "sky/engine/core/frame/Settings.h"
 #include "sky/engine/core/Init.h"
diff --git a/sky/services/keyboard/BUILD.gn b/sky/services/keyboard/BUILD.gn
index c7320c1..7b6fd1a 100644
--- a/sky/services/keyboard/BUILD.gn
+++ b/sky/services/keyboard/BUILD.gn
@@ -10,7 +10,6 @@
     ]
     deps = [
       "//base:base",
-      "//mojo/common",
       "//mojo/public/cpp/application",
       "//mojo/services/keyboard/public/interfaces",
     ]
diff --git a/sky/services/media/BUILD.gn b/sky/services/media/BUILD.gn
index f149bc2..af7ad39 100644
--- a/sky/services/media/BUILD.gn
+++ b/sky/services/media/BUILD.gn
@@ -50,7 +50,7 @@
     deps = [
       ":interfaces",
       "//base:base",
-      "//mojo/common",
+      "//mojo/data_pipe_utils",
       "//mojo/public/cpp/application",
     ]
   }
diff --git a/sky/services/media/ios/media_player_impl.mm b/sky/services/media/ios/media_player_impl.mm
index 718dfa4..0250a93 100644
--- a/sky/services/media/ios/media_player_impl.mm
+++ b/sky/services/media/ios/media_player_impl.mm
@@ -4,7 +4,7 @@
 
 #include "base/bind.h"
 #include "base/message_loop/message_loop.h"
-#include "mojo/common/data_pipe_utils.h"
+#include "mojo/data_pipe_utils/data_pipe_utils.h"
 #include "sky/services/media/ios/media_player_impl.h"
 
 #import <Foundation/Foundation.h>
diff --git a/sky/services/ns_net/BUILD.gn b/sky/services/ns_net/BUILD.gn
index ab7a5eb..6905604 100644
--- a/sky/services/ns_net/BUILD.gn
+++ b/sky/services/ns_net/BUILD.gn
@@ -12,7 +12,6 @@
 
   deps = [
     "//base:base",
-    "//mojo/common",
     "//mojo/public/cpp/application",
     "//mojo/services/network/public/interfaces",
   ]
diff --git a/sky/shell/BUILD.gn b/sky/shell/BUILD.gn
index 5939a85..196b28d 100644
--- a/sky/shell/BUILD.gn
+++ b/sky/shell/BUILD.gn
@@ -7,8 +7,9 @@
   "//base:i18n",
   "//build/config/sanitizers:deps",
   "//dart/runtime:libdart",
-  "//mojo/common",
+  "//mojo/data_pipe_utils",
   "//mojo/edk/system",
+  "//mojo/message_pump",
   "//mojo/public/cpp/application",
   "//mojo/public/interfaces/application",
   "//mojo/services/asset_bundle/public/interfaces",
@@ -244,6 +245,7 @@
 
     deps = common_deps + [
              ":common",
+             "//mojo/common",
              "//sky/services/testing:interfaces",
            ]
   }
diff --git a/sky/shell/dart/BUILD.gn b/sky/shell/dart/BUILD.gn
index b4a1cf5..06d83f1 100644
--- a/sky/shell/dart/BUILD.gn
+++ b/sky/shell/dart/BUILD.gn
@@ -14,7 +14,7 @@
     "//base",
     "//build/config/sanitizers:deps",
     "//dart/runtime:libdart",
-    "//mojo/common",
+    "//mojo/data_pipe_utils",
     "//mojo/public/cpp/application",
     "//mojo/services/network/public/interfaces",
     "//sky/engine/tonic",
diff --git a/sky/shell/dart/dart_library_provider_files.cc b/sky/shell/dart/dart_library_provider_files.cc
index 948e083..1b5e78c 100644
--- a/sky/shell/dart/dart_library_provider_files.cc
+++ b/sky/shell/dart/dart_library_provider_files.cc
@@ -8,7 +8,7 @@
 #include "base/files/file_util.h"
 #include "base/strings/string_util.h"
 #include "base/threading/worker_pool.h"
-#include "mojo/common/data_pipe_utils.h"
+#include "mojo/data_pipe_utils/data_pipe_utils.h"
 #include "sky/engine/tonic/dart_converter.h"
 
 namespace sky {
diff --git a/sky/shell/shell.cc b/sky/shell/shell.cc
index 07658ad..78e4960 100644
--- a/sky/shell/shell.cc
+++ b/sky/shell/shell.cc
@@ -10,7 +10,7 @@
 #include "base/memory/discardable_memory.h"
 #include "base/memory/discardable_memory_allocator.h"
 #include "base/single_thread_task_runner.h"
-#include "mojo/common/message_pump_mojo.h"
+#include "mojo/message_pump/message_pump_mojo.h"
 #include "mojo/edk/embedder/embedder.h"
 #include "mojo/edk/embedder/simple_platform_support.h"
 #include "sky/shell/ui/engine.h"
diff --git a/sky/shell/tracing_controller.h b/sky/shell/tracing_controller.h
index 0c6a8bc..4514cc8 100644
--- a/sky/shell/tracing_controller.h
+++ b/sky/shell/tracing_controller.h
@@ -8,7 +8,7 @@
 #include "base/files/file.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted_memory.h"
-#include "mojo/common/data_pipe_drainer.h"
+#include "mojo/data_pipe_utils/data_pipe_drainer.h"
 #include "mojo/public/cpp/system/data_pipe.h"
 #include "sky/shell/shell_view.h"
 
diff --git a/sky/shell/ui/engine.cc b/sky/shell/ui/engine.cc
index 058efdc..8c31cae 100644
--- a/sky/shell/ui/engine.cc
+++ b/sky/shell/ui/engine.cc
@@ -9,7 +9,7 @@
 #include "base/files/file_path.h"
 #include "base/threading/worker_pool.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/common/data_pipe_utils.h"
+#include "mojo/data_pipe_utils/data_pipe_utils.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "services/asset_bundle/asset_unpacker_job.h"
 #include "sky/engine/public/platform/WebInputEvent.h"
diff --git a/sky/tools/roll/patches/mojo/mojo_converters_input_events.patch b/sky/tools/roll/patches/mojo/mojo_converters_input_events.patch
new file mode 100644
index 0000000..8434aca
--- /dev/null
+++ b/sky/tools/roll/patches/mojo/mojo_converters_input_events.patch
@@ -0,0 +1,20 @@
+diff --git b/mojo/converters/input_events/input_events_type_converters.cc a/mojo/converters/input_events/input_events_type_converters.cc
+index a4f6e73..a7d6a97 100644
+--- b/mojo/converters/input_events/input_events_type_converters.cc
++++ a/mojo/converters/input_events/input_events_type_converters.cc
+@@ -11,7 +11,6 @@
+ #include <X11/Xlib.h>
+ #endif
+ 
+-#include "base/time/time.h"
+ #include "mojo/converters/geometry/geometry_type_converters.h"
+ #include "mojo/converters/input_events/mojo_extended_key_event_data.h"
+ #include "mojo/services/input_events/public/interfaces/input_events.mojom.h"
+@@ -278,7 +277,6 @@ scoped_ptr<ui::Event> TypeConverter<scoped_ptr<ui::Event>, EventPtr>::Convert(
+         // TODO: last flags isn't right. Need to send changed_flags.
+         scoped_ptr<ui::MouseEvent> event(new ui::MouseEvent(
+             MojoMouseEventTypeToUIEvent(input), location, screen_location,
+-            base::TimeDelta::FromMilliseconds(input->time_stamp),
+             ui::EventFlags(input->flags), ui::EventFlags(input->flags)));
+         if (event->IsMouseWheelEvent()) {
+           // This conversion assumes we're using the mojo meaning of these
diff --git a/sky/tools/roll/patches/mojo/services_keyboard.patch b/sky/tools/roll/patches/mojo/services_keyboard.patch
new file mode 100644
index 0000000..d1180aa
--- /dev/null
+++ b/sky/tools/roll/patches/mojo/services_keyboard.patch
@@ -0,0 +1,30 @@
+diff --git a/services/keyboard/src/org/chromium/mojo/keyboard/InputConnectionAdaptor.java b/services/keyboard/src/org/chromium/mojo/keyboard/InputConnectionAdaptor.java
+index 42bdd57..a3cdc61 100644
+--- a/services/keyboard/src/org/chromium/mojo/keyboard/InputConnectionAdaptor.java
++++ b/services/keyboard/src/org/chromium/mojo/keyboard/InputConnectionAdaptor.java
+@@ -4,7 +4,10 @@
+ 
+ package org.chromium.mojo.keyboard;
+ 
++import java.lang.StringBuilder;
++
+ import android.view.View;
++import android.view.KeyEvent;
+ import android.view.inputmethod.BaseInputConnection;
+ import android.view.inputmethod.CompletionInfo;
+ import android.view.inputmethod.CorrectionInfo;
+@@ -71,4 +74,14 @@ public class InputConnectionAdaptor extends BaseInputConnection {
+         mClient.setSelection(start, end);
+         return super.setSelection(start, end);
+     }
++
++    // Number keys come through as key events instead of commitText!?
++    @Override
++    public boolean sendKeyEvent(KeyEvent event) {
++        if (event.getAction() == KeyEvent.ACTION_UP) {
++            // 1 appears to always be the value for newCursorPosition?
++            mClient.commitText(String.valueOf(event.getNumber()), 1);
++        }
++        return super.sendKeyEvent(event);
++    }
+ }
diff --git a/sky/tools/roll/roll.py b/sky/tools/roll/roll.py
index a066a7f..c66fb7b 100755
--- a/sky/tools/roll/roll.py
+++ b/sky/tools/roll/roll.py
@@ -72,7 +72,21 @@
 
 dirs_from_mojo = [
     'gpu',
-    'mojo',
+    'mojo/android',
+    'mojo/application',
+    'mojo/common',
+    'mojo/converters',
+    'mojo/dart',
+    'mojo/data_pipe_utils',
+    'mojo/edk',
+    'mojo/environment',
+    'mojo/gles2',
+    'mojo/gpu',
+    'mojo/icu',
+    'mojo/java',
+    'mojo/message_pump',
+    'mojo/services',
+    'mojo/skia',
     'services/asset_bundle',
     'services/keyboard',
     'services/sensors',
