diff --git a/mojo/BUILD.gn b/mojo/BUILD.gn
index 55410e6..7d8f179 100644
--- a/mojo/BUILD.gn
+++ b/mojo/BUILD.gn
@@ -22,7 +22,6 @@
     "//mojo/dart/apptest",
     "//mojo/public",
     "//mojo/services",
-    "//mojo/tools/package_manager",
     "//services",
   ]
 
diff --git a/mojo/tools/package_manager/BUILD.gn b/mojo/tools/package_manager/BUILD.gn
deleted file mode 100644
index e8be3ae..0000000
--- a/mojo/tools/package_manager/BUILD.gn
+++ /dev/null
@@ -1,32 +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/mojo_application.gni")
-
-mojo_native_application("package_manager") {
-  output_name = "mojo_package_manager"
-
-  sources = [
-    "manifest.cc",
-    "manifest.h",
-    "package_fetcher.cc",
-    "package_fetcher.h",
-    "package_manager.cc",
-    "package_manager_application.cc",
-    "package_manager_application.h",
-    "unpacker.cc",
-    "unpacker.h",
-  ]
-
-  deps = [
-    "//base",
-    "//mojo/application",
-    "//mojo/common",
-    "//mojo/public/cpp/system",
-    "//mojo/public/cpp/utility",
-    "//mojo/services/network/public/interfaces",
-    "//third_party/zlib:zip",
-    "//url",
-  ]
-}
diff --git a/mojo/tools/package_manager/manifest.cc b/mojo/tools/package_manager/manifest.cc
deleted file mode 100644
index 5a0e346..0000000
--- a/mojo/tools/package_manager/manifest.cc
+++ /dev/null
@@ -1,83 +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/tools/package_manager/manifest.h"
-
-#include "base/files/file_util.h"
-#include "base/json/json_reader.h"
-#include "base/values.h"
-#include "url/gurl.h"
-
-namespace mojo {
-
-Manifest::Manifest() {
-}
-
-Manifest::~Manifest() {
-}
-
-bool Manifest::Parse(const std::string& str, std::string* err_msg) {
-  int err_code = base::JSONReader::JSON_NO_ERROR;
-  scoped_ptr<base::Value> root(base::JSONReader::ReadAndReturnError(
-      str,
-      base::JSON_ALLOW_TRAILING_COMMAS,
-      &err_code, err_msg));
-  if (err_code != base::JSONReader::JSON_NO_ERROR)
-    return false;
-
-  const base::DictionaryValue* root_dict;
-  if (!root->GetAsDictionary(&root_dict)) {
-    *err_msg = "Manifest is not a dictionary.";
-    return false;
-  }
-
-  if (!PopulateDeps(root_dict, err_msg))
-    return false;
-
-  return true;
-}
-
-bool Manifest::ParseFromFile(const base::FilePath& file_name,
-                             std::string* err_msg) {
-  std::string data;
-  if (!base::ReadFileToString(file_name, &data)) {
-    *err_msg = "Couldn't read manifest file " + file_name.AsUTF8Unsafe();
-    return false;
-  }
-  return Parse(data, err_msg);
-}
-
-bool Manifest::PopulateDeps(const base::DictionaryValue* root,
-                            std::string* err_msg) {
-  const base::Value* deps_value;
-  if (!root->Get("deps", &deps_value))
-    return true;  // No deps, that's OK.
-
-  const base::ListValue* deps;
-  if (!deps_value->GetAsList(&deps)) {
-    *err_msg = "Deps is not a list. Should be \"deps\": [ \"...\", \"...\" ]";
-    return false;
-  }
-
-  deps_.reserve(deps->GetSize());
-  for (size_t i = 0; i < deps->GetSize(); i++) {
-    std::string cur_dep;
-    if (!deps->GetString(i, &cur_dep)) {
-      *err_msg = "Dependency list item wasn't a string.";
-      return false;
-    }
-
-    GURL cur_url(cur_dep);
-    if (!cur_url.is_valid()) {
-      *err_msg = "Dependency entry isn't a valid URL: " + cur_dep;
-      return false;
-    }
-
-    deps_.push_back(cur_url);
-  }
-
-  return true;
-}
-
-}  // namespace mojo
diff --git a/mojo/tools/package_manager/manifest.h b/mojo/tools/package_manager/manifest.h
deleted file mode 100644
index f87040d..0000000
--- a/mojo/tools/package_manager/manifest.h
+++ /dev/null
@@ -1,46 +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_TOOLS_PACKAGE_MANAGER_MANIFEST_H_
-#define MOJO_TOOLS_PACKAGE_MANAGER_MANIFEST_H_
-
-#include <string>
-#include <vector>
-
-#include "mojo/public/cpp/system/macros.h"
-
-class GURL;
-
-namespace base {
-class DictionaryValue;
-class FilePath;
-}
-
-namespace mojo {
-
-class Manifest {
- public:
-  Manifest();
-  ~Manifest();
-
-  // Parses the manifest from raw data. Returns true on success. On failure,
-  // populates the "err_msg" string with an error.
-  bool Parse(const std::string& str, std::string* err_msg);
-
-  // Like Parse but reads the data from a file.
-  bool ParseFromFile(const base::FilePath& file_name, std::string* err_msg);
-
-  const std::vector<GURL>& deps() const { return deps_; }
-
- private:
-  bool PopulateDeps(const base::DictionaryValue* root, std::string* err_msg);
-
-  std::vector<GURL> deps_;
-
-  MOJO_DISALLOW_COPY_AND_ASSIGN(Manifest);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_TOOLS_PACKAGE_MANAGER_MANIFEST_H_
diff --git a/mojo/tools/package_manager/package_fetcher.cc b/mojo/tools/package_manager/package_fetcher.cc
deleted file mode 100644
index a2ad522..0000000
--- a/mojo/tools/package_manager/package_fetcher.cc
+++ /dev/null
@@ -1,96 +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/tools/package_manager/package_fetcher.h"
-
-#include "base/bind.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "mojo/services/network/public/interfaces/url_loader.mojom.h"
-
-namespace mojo {
-
-PackageFetcher::PackageFetcher(NetworkService* network_service,
-                               PackageFetcherDelegate* delegate,
-                               const GURL& url)
-    : delegate_(delegate),
-      url_(url) {
-  network_service->CreateURLLoader(GetProxy(&loader_));
-
-  URLRequestPtr request(URLRequest::New());
-  request->url = url.spec();
-  request->auto_follow_redirects = true;
-
-  loader_->Start(request.Pass(),
-                 base::Bind(&PackageFetcher::OnReceivedResponse,
-                            base::Unretained(this)));
-}
-
-PackageFetcher::~PackageFetcher() {
-}
-
-void PackageFetcher::OnReceivedResponse(URLResponsePtr response) {
-  if (response->error) {
-    printf("Got error %d (%s) for %s\n",
-           response->error->code,
-           response->error->description.get().c_str(),
-           url_.spec().c_str());
-    delegate_->FetchFailed(url_);
-    return;
-  }
-
-  if (!base::CreateTemporaryFile(&output_file_name_)) {
-    delegate_->FetchFailed(url_);
-    return;
-  }
-  output_file_.Initialize(output_file_name_,
-      base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-  if (!output_file_.IsValid()) {
-    base::DeleteFile(output_file_name_, false);
-    delegate_->FetchFailed(url_);
-    // Danger: may be deleted now.
-    return;
-  }
-
-  body_ = response->body.Pass();
-  ReadData(MOJO_RESULT_OK);
-  // Danger: may be deleted now.
-}
-
-void PackageFetcher::ReadData(MojoResult) {
-  char buf[4096];
-  uint32_t num_bytes = sizeof(buf);
-  MojoResult result = ReadDataRaw(body_.get(), buf, &num_bytes,
-                                  MOJO_READ_DATA_FLAG_NONE);
-  if (result == MOJO_RESULT_SHOULD_WAIT) {
-    WaitToReadMore();
-  } else if (result == MOJO_RESULT_OK) {
-    if (output_file_.WriteAtCurrentPos(buf, num_bytes) !=
-        static_cast<int>(num_bytes)) {
-      // Clean up the output file.
-      output_file_.Close();
-      base::DeleteFile(output_file_name_, false);
-
-      delegate_->FetchFailed(url_);
-      // Danger: may be deleted now.
-      return;
-    }
-    WaitToReadMore();
-  } else if (result == MOJO_RESULT_FAILED_PRECONDITION) {
-    // Done.
-    output_file_.Close();
-    delegate_->FetchSucceeded(url_, output_file_name_);
-    // Danger: may be deleted now.
-  }
-}
-
-void PackageFetcher::WaitToReadMore() {
-  handle_watcher_.Start(
-      body_.get(),
-      MOJO_HANDLE_SIGNAL_READABLE,
-      MOJO_DEADLINE_INDEFINITE,
-      base::Bind(&PackageFetcher::ReadData, base::Unretained(this)));
-}
-
-}  // namespace mojo
diff --git a/mojo/tools/package_manager/package_fetcher.h b/mojo/tools/package_manager/package_fetcher.h
deleted file mode 100644
index ac7580a..0000000
--- a/mojo/tools/package_manager/package_fetcher.h
+++ /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.
-
-#ifndef MOJO_TOOLS_PACKAGE_MANAGER_FETCHER_H_
-#define MOJO_TOOLS_PACKAGE_MANAGER_FETCHER_H_
-
-#include "base/files/file.h"
-#include "base/files/file_path.h"
-#include "mojo/common/handle_watcher.h"
-#include "mojo/public/cpp/system/macros.h"
-#include "mojo/services/network/public/interfaces/network_service.mojom.h"
-#include "mojo/services/network/public/interfaces/url_loader.mojom.h"
-#include "url/gurl.h"
-
-namespace base {
-class FilePath;
-}  // namespace base
-
-namespace mojo {
-
-class PackageFetcherDelegate;
-
-class PackageFetcher {
- public:
-  PackageFetcher(NetworkService* network_service,
-                 PackageFetcherDelegate* delegate,
-                 const GURL& url);
-  virtual ~PackageFetcher();
-
- private:
-  void OnReceivedResponse(URLResponsePtr response);
-
-  void ReadData(MojoResult);
-  void WaitToReadMore();
-
-  PackageFetcherDelegate* delegate_;
-
-  // URL of the package.
-  GURL url_;
-
-  URLLoaderPtr loader_;
-
-  // Valid once file has started streaming.
-  ScopedDataPipeConsumerHandle body_;
-  common::HandleWatcher handle_watcher_;
-
-  base::FilePath output_file_name_;
-  base::File output_file_;
-
-  MOJO_DISALLOW_COPY_AND_ASSIGN(PackageFetcher);
-};
-
-class PackageFetcherDelegate {
- public:
-  virtual void FetchSucceeded(const GURL& url, const base::FilePath& name) = 0;
-
-  virtual void FetchFailed(const GURL& url) = 0;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_TOOLS_PACKAGE_MANAGER_FETCHER_H_
diff --git a/mojo/tools/package_manager/package_manager.cc b/mojo/tools/package_manager/package_manager.cc
deleted file mode 100644
index ab50f80..0000000
--- a/mojo/tools/package_manager/package_manager.cc
+++ /dev/null
@@ -1,12 +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/application/application_runner_chromium.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/tools/package_manager/package_manager_application.h"
-
-MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new mojo::PackageManagerApplication);
-  return runner.Run(application_request);
-}
diff --git a/mojo/tools/package_manager/package_manager_application.cc b/mojo/tools/package_manager/package_manager_application.cc
deleted file mode 100644
index 4c08de9..0000000
--- a/mojo/tools/package_manager/package_manager_application.cc
+++ /dev/null
@@ -1,113 +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/tools/package_manager/package_manager_application.h"
-
-#include "base/files/file_util.h"
-#include "mojo/tools/package_manager/manifest.h"
-#include "mojo/tools/package_manager/unpacker.h"
-#include "base/message_loop/message_loop.h"
-#include "base/stl_util.h"
-#include "mojo/public/cpp/application/application_impl.h"
-
-namespace mojo {
-
-namespace {
-
-const base::FilePath::CharType kManifestFileName[] =
-    FILE_PATH_LITERAL("manifest.json");
-
-}  // namespace
-
-PackageManagerApplication::PendingLoad::PendingLoad() {
-}
-
-PackageManagerApplication::PendingLoad::~PendingLoad() {
-}
-
-PackageManagerApplication::PackageManagerApplication() {
-}
-
-PackageManagerApplication::~PackageManagerApplication() {
-  STLDeleteContainerPairSecondPointers(pending_.begin(), pending_.end());
-}
-
-void PackageManagerApplication::Initialize(ApplicationImpl* app) {
-  app->ConnectToService("mojo:network_service", &network_service_);
-
-  printf("Enter URL> ");
-  char buf[1024];
-  if (scanf("%1023s", buf) != 1) {
-    printf("No input, exiting\n");
-    base::MessageLoop::current()->Quit();
-    return;
-  }
-  GURL url(buf);
-  if (!url.is_valid()) {
-    printf("Invalid URL\n");
-    base::MessageLoop::current()->Quit();
-    return;
-  }
-
-  StartLoad(url);
-}
-
-void PackageManagerApplication::StartLoad(const GURL& url) {
-  if (completed_.find(url) != completed_.end() ||
-      pending_.find(url) != pending_.end())
-    return;  // Already loaded or are loading this one.
-
-  PendingLoad* load = new PendingLoad;
-  load->fetcher.reset(new mojo::PackageFetcher(
-      network_service_.get(), this, url));
-  pending_[url] = load;
-}
-
-void PackageManagerApplication::LoadDeps(const Manifest& manifest) {
-  for (size_t i = 0; i < manifest.deps().size(); i++)
-    StartLoad(manifest.deps()[i]);
-}
-
-void PackageManagerApplication::PendingLoadComplete(const GURL& url) {
-  pending_.erase(pending_.find(url));
-  completed_.insert(url);
-  if (pending_.empty())
-    base::MessageLoop::current()->Quit();
-}
-
-void PackageManagerApplication::FetchSucceeded(
-    const GURL& url,
-    const base::FilePath& name) {
-  Unpacker unpacker;
-  if (!unpacker.Unpack(name)) {
-    base::DeleteFile(name, false);
-    printf("Failed to unpack\n");
-    PendingLoadComplete(url);
-    return;
-  }
-  // The downloaded .zip file is no longer necessary.
-  base::DeleteFile(name, false);
-
-  // Load the manifest.
-  base::FilePath manifest_path = unpacker.dir().Append(kManifestFileName);
-  Manifest manifest;
-  std::string err_msg;
-  if (!manifest.ParseFromFile(manifest_path, &err_msg)) {
-    printf("%s\n", err_msg.c_str());
-    PendingLoadComplete(url);
-    return;
-  }
-
-  // Enqueue loads for any deps.
-  LoadDeps(manifest);
-
-  printf("Loaded %s\n", url.spec().c_str());
-  PendingLoadComplete(url);
-}
-
-void PackageManagerApplication::FetchFailed(const GURL& url) {
-  PendingLoadComplete(url);
-}
-
-}  // namespace mojo
diff --git a/mojo/tools/package_manager/package_manager_application.h b/mojo/tools/package_manager/package_manager_application.h
deleted file mode 100644
index d50e11c..0000000
--- a/mojo/tools/package_manager/package_manager_application.h
+++ /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.
-
-#ifndef MOJO_PACKAGE_MANAGER_PACKAGE_MANAGER_APPLICATION_H_
-#define MOJO_PACKAGE_MANAGER_PACKAGE_MANAGER_APPLICATION_H_
-
-#include <map>
-#include <set>
-
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/interface_factory.h"
-#include "mojo/public/cpp/system/macros.h"
-#include "mojo/services/network/public/interfaces/network_service.mojom.h"
-#include "mojo/tools/package_manager/package_fetcher.h"
-
-namespace mojo {
-
-class Manifest;
-
-class PackageManagerApplication
-    : public ApplicationDelegate,
-      public PackageFetcherDelegate {
- public:
-  PackageManagerApplication();
-  ~PackageManagerApplication() override;
-
- private:
-  struct PendingLoad {
-    PendingLoad();
-    ~PendingLoad();
-
-    scoped_ptr<PackageFetcher> fetcher;
-  };
-  typedef std::map<GURL, PendingLoad*> PendingLoadMap;
-
-  void StartLoad(const GURL& url);
-
-  void LoadDeps(const Manifest& manifest);
-
-  // Deletes the pending load entry for the given URL and possibly exits the
-  // message loop if all loads are done.
-  void PendingLoadComplete(const GURL& url);
-
-  // ApplicationDelegate implementation.
-  void Initialize(ApplicationImpl* app) override;
-
-  // PackageFetcher.
-  void FetchSucceeded(const GURL& url,
-                      const base::FilePath& name) override;
-  void FetchFailed(const GURL& url) override;
-
-  mojo::NetworkServicePtr network_service_;
-
-  PendingLoadMap pending_;  // Owning pointers.
-  std::set<GURL> completed_;
-
-  MOJO_DISALLOW_COPY_AND_ASSIGN(PackageManagerApplication);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PACKAGE_MANAGER_PACKAGE_MANAGER_APPLICATION_H
diff --git a/mojo/tools/package_manager/unpacker.cc b/mojo/tools/package_manager/unpacker.cc
deleted file mode 100644
index 8ed34d5..0000000
--- a/mojo/tools/package_manager/unpacker.cc
+++ /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.
-
-#include "mojo/tools/package_manager/unpacker.h"
-
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "third_party/zlib/google/zip.h"
-
-namespace mojo {
-
-Unpacker::Unpacker() {
-}
-
-Unpacker::~Unpacker() {
-  if (!dir_.empty())
-    DeleteFile(dir_, true);
-}
-
-bool Unpacker::Unpack(const base::FilePath& zip_file) {
-  DCHECK(zip_file_.empty());
-  zip_file_ = zip_file;
-
-  DCHECK(dir_.empty());
-  if (!CreateNewTempDirectory(base::FilePath::StringType(), &dir_))
-    return false;
-  if (!zip::Unzip(zip_file, dir_)) {
-    dir_ = base::FilePath();
-    return false;
-  }
-  return true;
-}
-
-}  // namespace mojo
diff --git a/mojo/tools/package_manager/unpacker.h b/mojo/tools/package_manager/unpacker.h
deleted file mode 100644
index 2f7acc5..0000000
--- a/mojo/tools/package_manager/unpacker.h
+++ /dev/null
@@ -1,40 +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_TOOLS_PACKAGE_MANAGER_UNPACKER_H_
-#define MOJO_TOOLS_PACKAGE_MANAGER_UNPACKER_H_
-
-#include "base/files/file_path.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/public/cpp/system/macros.h"
-
-namespace mojo {
-
-// Unzips a package into a temporary folder. The temporary folder will be
-// deleted when the object is destroyed.
-//
-// In the future, this class would probably manage doing the unzip operation on
-// a background thread.
-class Unpacker {
- public:
-  Unpacker();
-  ~Unpacker();
-
-  // Actually does the unpacking, returns true on success.
-  bool Unpack(const base::FilePath& zip_file);
-
-  // The root directory where the package has been unpacked.
-  const base::FilePath& dir() const { return dir_; }
-
- private:
-  base::FilePath zip_file_;
-
-  base::FilePath dir_;
-
-  MOJO_DISALLOW_COPY_AND_ASSIGN(Unpacker);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_TOOLS_PACKAGE_MANAGER_UNPACKER_H_
