diff --git a/.clang-format b/.clang-format
deleted file mode 100644
index 4bdf247..0000000
--- a/.clang-format
+++ /dev/null
@@ -1,10 +0,0 @@
-# http://clang.llvm.org/docs/ClangFormatStyleOptions.html
-BasedOnStyle: Google
-# This defaults to 'Auto'. Explicitly set it for a while, so that
-# 'vector<vector<int> >' in existing files gets formatted to
-# 'vector<vector<int>>'. ('Auto' means that clang-format will only use
-# 'int>>' if the file already contains at least one such instance.)
-Standard: Cpp11
-SortIncludes: true
-AllowShortIfStatementsOnASingleLine: false
-AllowShortLoopsOnASingleLine: false
diff --git a/.clang-tidy b/.clang-tidy
deleted file mode 100644
index b7bb616..0000000
--- a/.clang-tidy
+++ /dev/null
@@ -1,32 +0,0 @@
----
-Checks:          'clang-diagnostic-*,-clang-diagnostic-unused-command-line-argument,clang-analyzer-*,-clang-analyzer-core.NullDereference,-clang-analyzer-unix.Malloc,google-*,misc-*,-misc-noexcept*,modernize-*,-modernize-deprecated-headers,-modernize-raw-string-literal,-modernize-return-braced-init-list,-modernize-use-auto,-modernize-use-equals-delete,-modernize-use-equals-default,performance-*,-performance-unnecessary-value-param,readability-*,-readability-implicit-bool-conversion'
-WarningsAsErrors: false
-HeaderFilterRegex: '\.\./peridot/([^t].*|t[^h].*|th[^i].*)'
-AnalyzeTemporaryDtors: false
-FormatStyle:     file
-CheckOptions:
-  - key:             google-readability-braces-around-statements.ShortStatementLines
-    value:           '2'
-  - key:             google-readability-function-size.StatementThreshold
-    value:           '800'
-  - key:             google-readability-namespace-comments.ShortNamespaceLines
-    value:           '10'
-  - key:             google-readability-namespace-comments.SpacesBeforeComments
-    value:           '2'
-  - key:             modernize-loop-convert.MaxCopySize
-    value:           '16'
-  - key:             modernize-loop-convert.MinConfidence
-    value:           reasonable
-  - key:             modernize-loop-convert.NamingStyle
-    value:           CamelCase
-  - key:             modernize-pass-by-value.IncludeStyle
-    value:           llvm
-  - key:             modernize-replace-auto-ptr.IncludeStyle
-    value:           llvm
-  - key:             modernize-use-default-member-init.UseAssignment
-    value:           '1'
-  - key:             modernize-use-nullptr.NullMacros
-    value:           'NULL'
-  - key:             readability-braces-around-statements.ShortStatementLines
-    value:           '2'
-...
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 3bbc38f..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,22 +0,0 @@
-*.iml
-*.pyc
-*~
-.*.sw?
-.DS_Store
-.checkstyle
-.clang_complete
-.classpath
-.cproject
-.gdb_history
-.gdbinit
-.landmines
-.project
-.pub
-.pydevproject
-*.sublime-project
-*.sublime-workspace
-.vscode
-.packages
-**/.atom/
-**/.idea/
-/cloud/third_party
diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644
index c2a4eac..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,8 +0,0 @@
-# This is the list of Fuchsia Authors.
-
-# Names should be added to this file as one of
-#     Organization's name
-#     Individual's name <submission email address>
-#     Individual's name <submission email address> <email2> <emailN>
-
-Google Inc.
diff --git a/BUILD.gn b/BUILD.gn
deleted file mode 100644
index cbac971..0000000
--- a/BUILD.gn
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/package.gni")
-import("//peridot/build/tests_package.gni")
-
-config("internal") {
-  include_dirs = [
-    ".",
-    "$root_gen_dir/peridot",
-  ]
-}
-
-# All peridot tests that can run as test binaries in a package, and are not
-# associated with the package of a binary already anyway.
-tests_package("peridot_tests") {
-  deps = [
-    "//peridot/lib:peridot_lib_unittests",
-    "//peridot/public/lib:peridot_public_lib_unittests",
-  ]
-}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index 81e2938..0000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,9 +0,0 @@
-This repository accepts contributions using Gerrit.
-
-Instructions for using Gerrit:
-
- * https://gerrit-review.googlesource.com/Documentation/
-
-Before we can land your change, you need to sign the Google CLA:
-
- * https://cla.developers.google.com/
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index ac6402f..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/PATENTS b/PATENTS
deleted file mode 100644
index 2746e78..0000000
--- a/PATENTS
+++ /dev/null
@@ -1,22 +0,0 @@
-Additional IP Rights Grant (Patents)
-
-"This implementation" means the copyrightable works distributed by
-Google as part of the Fuchsia project.
-
-Google hereby grants to you a perpetual, worldwide, non-exclusive,
-no-charge, royalty-free, irrevocable (except as stated in this
-section) patent license to make, have made, use, offer to sell, sell,
-import, transfer, and otherwise run, modify and propagate the contents
-of this implementation of Fuchsia, where such license applies only to
-those patent claims, both currently owned by Google and acquired in
-the future, licensable by Google that are necessarily infringed by
-this implementation. This grant does not include claims that would be
-infringed only as a consequence of further modification of this
-implementation. If you or your agent or exclusive licensee institute
-or order or agree to the institution of patent litigation or any other
-patent enforcement activity against any entity (including a
-cross-claim or counterclaim in a lawsuit) alleging that this
-implementation of Fuchsia constitutes direct or contributory patent
-infringement, or inducement of patent infringement, then any patent
-rights granted to you under this License for this implementation of
-Fuchsia shall terminate as of the date such litigation is filed.
diff --git a/README.md b/README.md
index 711a46a..3cc8b3b 100644
--- a/README.md
+++ b/README.md
@@ -1,28 +1,5 @@
-# Peridot
+# Obsolete
 
-Peridot is a framework for composed, intelligent and distributed user
-experiences.
-
-Applications not explicitly designed to interoperate (and possibly implemented
-in different programming languages) are ephemerally downloaded and dynamically
-composed to run in a shared context. The framework manages application
-lifecycle, resources and view hierarchy; and well as context and suggestion
-infrastructure.
-
-State of Peridot experiences is transparently synchronized across user devices
-using a distributed offline-first storage system.
-
-
-## Read more
-
- - [bin](bin) - implementation of Peridot components
- - docs
-   - [Modular](docs/modular)
-   - [Ledger](docs/ledger)
- - developer workflow:
-   - [Conventions](docs/conventions.md)
-   - [Lint](docs/lint.md)
-   - [Repository structure](docs/repository_structure.md)
- - [examples](examples) - examples of applications that use Peridot components
- - [public](public) - public FIDL APIs of Peridot components
+This repository has moved into Fuchsia's main repository:
+https://fuchsia.googlesource.com/fuchsia/
 
diff --git a/bin/MAINTAINERS b/bin/MAINTAINERS
deleted file mode 100644
index b31f2a9..0000000
--- a/bin/MAINTAINERS
+++ /dev/null
@@ -1,4 +0,0 @@
-mesch@google.com
-ppi@google.com
-qsr@google.com
-thatguy@google.com
diff --git a/bin/acquirers/BUILD.gn b/bin/acquirers/BUILD.gn
deleted file mode 100644
index f849e2c..0000000
--- a/bin/acquirers/BUILD.gn
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-group("acquirers") {
-  public_deps = [
-    "story_info",
-  ]
-}
diff --git a/bin/acquirers/story_info/BUILD.gn b/bin/acquirers/story_info/BUILD.gn
deleted file mode 100644
index 2b7b203..0000000
--- a/bin/acquirers/story_info/BUILD.gn
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-import("//peridot/build/executable_package.gni")
-
-executable_package("story_info") {
-  meta = [
-    {
-      path = "meta/story_info.cmx"
-      dest = "story_info.cmx"
-    },
-  ]
-
-  sources = [
-    "link_watcher_impl.cc",
-    "link_watcher_impl.h",
-    "story_info.cc",
-    "story_info.h",
-    "story_info_main.cc",
-    "story_watcher_impl.cc",
-    "story_watcher_impl.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/svc/cpp",
-
-    # TODO(thatguy): Do not depend on constants_and_utils.
-    "//peridot/bin/sessionmgr/storage:constants_and_utils",
-    "//peridot/lib:maxwell_internal",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/rapidjson",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:agent_driver",
-    "//peridot/public/lib/context/cpp:context_metadata_builder",
-    "//peridot/public/lib/entity/cpp",
-    "//peridot/public/lib/entity/cpp:json",
-    "//third_party/rapidjson",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
diff --git a/bin/acquirers/story_info/link_watcher_impl.cc b/bin/acquirers/story_info/link_watcher_impl.cc
deleted file mode 100644
index 62b5f5c..0000000
--- a/bin/acquirers/story_info/link_watcher_impl.cc
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/acquirers/story_info/link_watcher_impl.h"
-
-#include <set>
-#include <sstream>
-
-#include <lib/context/cpp/context_metadata_builder.h>
-#include <lib/entity/cpp/json.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-#include "peridot/bin/acquirers/story_info/story_watcher_impl.h"
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"  // MakeLinkKey
-#include "peridot/lib/fidl/json_xdr.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-
-namespace maxwell {
-
-LinkWatcherImpl::LinkWatcherImpl(
-    StoryWatcherImpl* const owner,
-    fuchsia::modular::StoryController* const story_controller,
-    const std::string& story_id,
-    fuchsia::modular::ContextValueWriter* const story_value,
-    fuchsia::modular::LinkPath link_path)
-    : owner_(owner),
-      story_controller_(story_controller),
-      story_id_(story_id),
-      link_path_(std::move(link_path)),
-      link_watcher_binding_(this) {
-  // We hold onto a LinkPtr for the lifetime of this LinkWatcherImpl so that
-  // our watcher handle stays alive. Incidentally, this also means that the
-  // observed link remains "active" in the FW forever.
-  // TODO(thatguy): Use the new PuppetMaster observation API. MI4-1084
-  story_controller_->GetLink(fidl::Clone(link_path_), link_ptr_.NewRequest());
-
-  story_value->CreateChildValue(link_node_writer_.NewRequest(),
-                                fuchsia::modular::ContextValueType::LINK);
-  link_node_writer_->Set(
-      nullptr, fidl::MakeOptional(ContextMetadataBuilder()
-                                      .SetLinkPath(link_path_.module_path,
-                                                   link_path_.link_name)
-                                      .Build()));
-
-  link_ptr_->Watch(link_watcher_binding_.NewBinding());
-
-  // If the link becomes inactive, we stop watching it. It might still receive
-  // updates from other devices, but nothing can tell us as it isn't kept in
-  // memory on the current device.
-  //
-  // The fuchsia::modular::Link itself is not kept here, because otherwise it
-  // never becomes inactive (i.e. loses all its fuchsia::modular::Link
-  // connections).
-  link_watcher_binding_.set_error_handler([this](zx_status_t status) {
-    owner_->DropLink(modular::MakeLinkKey(link_path_));
-  });
-}
-
-LinkWatcherImpl::~LinkWatcherImpl() = default;
-
-void LinkWatcherImpl::Notify(fuchsia::mem::Buffer json) {
-  std::string json_string;
-  FXL_CHECK(fsl::StringFromVmo(json, &json_string));
-  ProcessNewValue(json_string);
-}
-
-void LinkWatcherImpl::ProcessNewValue(const fidl::StringPtr& value) {
-  // We are looking for the following |value| structures:
-  //
-  // 1) |value| contains a JSON-style entity:
-  //   { "@type": ..., ... }
-  // 2) |value| contains a JSON-encoded fuchsia::modular::Entity reference
-  // (EntityReferenceFromJson() will return true).
-  // 3) |value| is a JSON dictionary, and any of the members satisfies either
-  // (1) or (2).
-  //
-  // TODO(thatguy): Moving to Bundles allows us to ignore (3), and using
-  // Entities everywhere allows us to ignore (1).
-  modular::JsonDoc doc;
-  doc.Parse(value);
-  FXL_CHECK(!doc.HasParseError());
-
-  if (!doc.IsObject()) {
-    return;
-  }
-
-  // (1) & (2)
-  std::vector<std::string> types;
-  std::string ref;
-  if (modular::ExtractEntityTypesFromJson(doc, &types) ||
-      modular::EntityReferenceFromJson(doc, &ref)) {
-    // There is only *one* fuchsia::modular::Entity in this
-    // fuchsia::modular::Link.
-    entity_node_writers_.clear();
-    if (!single_entity_node_writer_.is_bound()) {
-      link_node_writer_->CreateChildValue(
-          single_entity_node_writer_.NewRequest(),
-          fuchsia::modular::ContextValueType::ENTITY);
-    }
-    // TODO(thatguy): The context engine expects an fuchsia::modular::Entity
-    // reference to be written directly as the content, versus the way Links
-    // wrap the reference in JSON. It'd be good to normalize on one encoded
-    // representation for fuchsia::modular::Entity references in the context
-    // engine.
-    if (ref.empty()) {
-      single_entity_node_writer_->Set(value, nullptr);
-    } else {
-      single_entity_node_writer_->Set(ref, nullptr);
-    }
-    return;
-  } else {
-    // There is not simply a *single* fuchsia::modular::Entity in this
-    // fuchsia::modular::Link. There may be multiple Entities (see below).
-    single_entity_node_writer_.Unbind();
-  }
-
-  // (3)
-  std::set<std::string> keys_that_have_entities;
-  for (auto it = doc.MemberBegin(); it != doc.MemberEnd(); ++it) {
-    if (modular::ExtractEntityTypesFromJson(it->value, &types) ||
-        modular::EntityReferenceFromJson(it->value, &ref)) {
-      keys_that_have_entities.insert(it->name.GetString());
-
-      auto value_it = entity_node_writers_.find(it->name.GetString());
-      if (value_it == entity_node_writers_.end()) {
-        fuchsia::modular::ContextValueWriterPtr writer;
-        link_node_writer_->CreateChildValue(
-            writer.NewRequest(), fuchsia::modular::ContextValueType::ENTITY);
-        value_it = entity_node_writers_
-                       .emplace(it->name.GetString(), std::move(writer))
-                       .first;
-      }
-      value_it->second->Set(modular::JsonValueToString(it->value), nullptr);
-    }
-  }
-
-  // Clean up any old entries in |entity_node_writers_|.
-  std::set<std::string> to_remove;
-  for (const auto& entry : entity_node_writers_) {
-    if (keys_that_have_entities.count(entry.first) == 0) {
-      to_remove.insert(entry.first);
-    }
-  }
-  for (const auto& key : to_remove) {
-    entity_node_writers_.erase(key);
-  }
-}
-
-}  // namespace maxwell
diff --git a/bin/acquirers/story_info/link_watcher_impl.h b/bin/acquirers/story_info/link_watcher_impl.h
deleted file mode 100644
index 39379d4..0000000
--- a/bin/acquirers/story_info/link_watcher_impl.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_ACQUIRERS_STORY_INFO_LINK_WATCHER_IMPL_H_
-#define PERIDOT_BIN_ACQUIRERS_STORY_INFO_LINK_WATCHER_IMPL_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-
-namespace maxwell {
-
-class StoryWatcherImpl;
-
-class LinkWatcherImpl : fuchsia::modular::LinkWatcher {
- public:
-  LinkWatcherImpl(StoryWatcherImpl* const owner,
-                  fuchsia::modular::StoryController* const story_controller,
-                  const std::string& story_id,
-                  fuchsia::modular::ContextValueWriter* story_value,
-                  fuchsia::modular::LinkPath link_path);
-
-  ~LinkWatcherImpl() override;
-
- private:
-  // |LinkWatcher|
-  void Notify(fuchsia::mem::Buffer json) override;
-
-  void ProcessNewValue(const fidl::StringPtr& value);
-  void MaybeProcessContextLink(const fidl::StringPtr& value);
-
-  StoryWatcherImpl* const owner_;
-  fuchsia::modular::StoryController* const story_controller_;
-
-  const std::string story_id_;
-  const fuchsia::modular::LinkPath link_path_;
-
-  // Allows us to write the initial fuchsia::modular::Link node in the Context
-  // engine, and then create child nodes for each fuchsia::modular::Entity we
-  // see in the fuchsia::modular::Link.
-  fuchsia::modular::ContextValueWriterPtr link_node_writer_;
-
-  // When applicable: Per top-level JSON member key in the
-  // fuchsia::modular::Link value, a value writer that allows us to store the
-  // contained fuchsia::modular::Entity.
-  //
-  // See the documentation in ProcessNewValue() for more details.
-  std::map<std::string, fuchsia::modular::ContextValueWriterPtr>
-      entity_node_writers_;
-  // TODO(thatguy): When Bundles come online, remove |entity_values_| in favor
-  // of this. Rename to |entity_value_|.
-  fuchsia::modular::ContextValueWriterPtr single_entity_node_writer_;
-
-  // Per context link topic, the context value.
-  // TODO(thatguy): Deprecate this usage in favor of Links.
-  std::map<fidl::StringPtr, fuchsia::modular::ContextValueWriterPtr>
-      topic_node_writers_;
-
-  fuchsia::modular::LinkPtr link_ptr_;
-  fidl::Binding<fuchsia::modular::LinkWatcher> link_watcher_binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LinkWatcherImpl);
-};
-
-}  // namespace maxwell
-
-#endif  // PERIDOT_BIN_ACQUIRERS_STORY_INFO_LINK_WATCHER_IMPL_H_
diff --git a/bin/acquirers/story_info/meta/story_info.cmx b/bin/acquirers/story_info/meta/story_info.cmx
deleted file mode 100644
index 27ee011..0000000
--- a/bin/acquirers/story_info/meta/story_info.cmx
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.modular.AgentContext",
-            "fuchsia.modular.FocusProvider",
-            "fuchsia.modular.IntelligenceServices",
-            "fuchsia.modular.StoryProvider",
-            "fuchsia.modular.VisibleStoriesProvider"
-        ]
-    }
-}
diff --git a/bin/acquirers/story_info/story_info.cc b/bin/acquirers/story_info/story_info.cc
deleted file mode 100644
index a295905..0000000
--- a/bin/acquirers/story_info/story_info.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/acquirers/story_info/story_info.h"
-
-#include <sstream>
-
-#include "peridot/bin/acquirers/story_info/story_watcher_impl.h"
-#include "peridot/lib/fidl/json_xdr.h"
-#include "rapidjson/document.h"
-#include "rapidjson/stringbuffer.h"
-#include "rapidjson/writer.h"
-
-namespace maxwell {
-
-StoryInfoAcquirer::StoryInfoAcquirer(modular::AgentHost* const agent_host)
-    : visible_stories_watcher_binding_(this),
-      story_provider_watcher_binding_(this),
-      focus_watcher_binding_(this) {
-  // Initialize fuchsia::modular::IntelligenceServices.
-  fuchsia::modular::IntelligenceServicesPtr intelligence_services;
-  agent_host->startup_context()->ConnectToEnvironmentService(
-      intelligence_services.NewRequest());
-  intelligence_services->GetContextWriter(context_writer_.NewRequest());
-  intelligence_services->GetContextReader(context_reader_.NewRequest());
-
-  // Watch for changes to what Stories are visible.
-  agent_host->startup_context()->ConnectToEnvironmentService(
-      visible_stories_provider_.NewRequest());
-  visible_stories_provider_->Watch(
-      visible_stories_watcher_binding_.NewBinding());
-
-  // Watch for changes in Story state.
-  agent_host->startup_context()->ConnectToEnvironmentService(
-      story_provider_.NewRequest());
-  story_provider_->GetStories(
-      story_provider_watcher_binding_.NewBinding(),
-      [this](std::vector<fuchsia::modular::StoryInfo> stories) {
-        for (const auto& story : stories) {
-          stories_.emplace(
-              std::make_pair(story.id, std::make_unique<StoryWatcherImpl>(
-                                           this, context_writer_.get(),
-                                           story_provider_.get(), story.id)));
-        }
-      });
-
-  // Watch for changes in the focused Story.
-  agent_host->startup_context()->ConnectToEnvironmentService(
-      focus_provider_.NewRequest());
-  focus_provider_->Watch(focus_watcher_binding_.NewBinding());
-
-  // Write initial values for visible stories.
-  OnVisibleStoriesChange({});
-}
-
-StoryInfoAcquirer::~StoryInfoAcquirer() = default;
-
-void StoryInfoAcquirer::DropStoryWatcher(const std::string& story_id) {
-  stories_.erase(story_id);
-}
-
-void StoryInfoAcquirer::Connect(
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services) {
-  agent_services_.AddBinding(std::move(services));
-}
-
-void StoryInfoAcquirer::RunTask(
-    const fidl::StringPtr& task_id,
-    const fuchsia::modular::Agent::RunTaskCallback& callback) {
-  FXL_LOG(FATAL) << "Not implemented.";
-}
-
-void StoryInfoAcquirer::Terminate(const std::function<void()>& done) { done(); }
-
-void StoryInfoAcquirer::OnFocusChange(fuchsia::modular::FocusInfoPtr info) {
-  // Set all stories to *not* focused, then set the one that's focused to
-  // "focused".
-  for (const auto& e : stories_) {
-    if (!info->focused_story_id || e.first != info->focused_story_id) {
-      e.second->OnFocusChange(false);
-    }
-  }
-  if (info->focused_story_id) {
-    auto it = stories_.find(info->focused_story_id);
-    if (it == stories_.end()) {
-      FXL_LOG(ERROR)
-          << "RACE CONDITION: I was notified that story "
-          << info->focused_story_id
-          << " was focused before being notified it exists in the first place.";
-      return;
-    }
-    it->second->OnFocusChange(true);
-  }
-}
-
-void StoryInfoAcquirer::OnVisibleStoriesChange(
-    fidl::VectorPtr<std::string> ids) {
-  // TODO(thatguy)
-}
-
-void StoryInfoAcquirer::OnChange(fuchsia::modular::StoryInfo info,
-                                 fuchsia::modular::StoryState state,
-                                 fuchsia::modular::StoryVisibilityState) {
-  // Here we only check if a story is new, and if so create a StoryWatcherImpl.
-  // We proxy all future change events to it.
-  auto it = stories_.find(info.id);
-  if (it == stories_.end()) {
-    auto ret = stories_.emplace(std::make_pair(
-        info.id,
-        std::make_unique<StoryWatcherImpl>(this, context_writer_.get(),
-                                           story_provider_.get(), info.id)));
-    it = ret.first;
-  }
-  it->second->OnStoryStateChange(std::move(info), state);
-}
-
-void StoryInfoAcquirer::OnDelete(std::string story_id) {
-  const std::string id = story_id;
-  // TODO(thatguy)
-}
-
-}  // namespace maxwell
diff --git a/bin/acquirers/story_info/story_info.h b/bin/acquirers/story_info/story_info.h
deleted file mode 100644
index 6e4589b..0000000
--- a/bin/acquirers/story_info/story_info.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_ACQUIRERS_STORY_INFO_STORY_INFO_H_
-#define PERIDOT_BIN_ACQUIRERS_STORY_INFO_STORY_INFO_H_
-
-#include <map>
-#include <set>
-
-#include <fuchsia/maxwell/internal/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/agent_driver.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-#include <lib/svc/cpp/service_namespace.h>
-
-namespace maxwell {
-
-class StoryWatcherImpl;
-
-// This class pulls info about Stories from Framework and stores it in
-// the Context service.
-//
-// It maintains a hierarchy of context values to represent:
-// Stories -> Modules
-//         -> Link Entities
-//
-// TODO(thatguy): Add Link value types to the Context engine and use them
-// here. Then update the resulting published value to remove its added JSON
-// structure, since it will all be represented in the metadata of the value.
-class StoryInfoAcquirer : public fuchsia::modular::VisibleStoriesWatcher,
-                          public fuchsia::modular::StoryProviderWatcher,
-                          public fuchsia::modular::FocusWatcher {
- public:
-  StoryInfoAcquirer(modular::AgentHost* agent_host);
-  ~StoryInfoAcquirer() override;
-
-  // Called by AgentDriver.
-  void Connect(fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services);
-
-  // Called by AgentDriver.
-  void RunTask(const fidl::StringPtr& task_id,
-               const fuchsia::modular::Agent::RunTaskCallback& callback);
-
-  // Called by AgentDriver.
-  void Terminate(const std::function<void()>& done);
-
-  // Used by StoryWatcherImpl.
-  void DropStoryWatcher(const std::string& story_id);
-
- private:
-  // |fuchsia::modular::FocusWatcher|
-  void OnFocusChange(fuchsia::modular::FocusInfoPtr info) override;
-
-  // |fuchsia::modular::VisibleStoriesWatcher|
-  void OnVisibleStoriesChange(fidl::VectorPtr<std::string> ids) override;
-
-  // |fuchsia::modular::StoryProviderWatcher|
-  void OnChange(
-      fuchsia::modular::StoryInfo info, fuchsia::modular::StoryState state,
-      fuchsia::modular::StoryVisibilityState visibility_state) override;
-  void OnDelete(std::string story_id) override;
-
-  fuchsia::modular::ContextWriterPtr context_writer_;
-  fuchsia::modular::ContextReaderPtr context_reader_;
-  fuchsia::modular::StoryProviderPtr story_provider_;
-  fuchsia::modular::FocusProviderPtr focus_provider_;
-  fuchsia::modular::VisibleStoriesProviderPtr visible_stories_provider_;
-
-  fidl::Binding<fuchsia::modular::VisibleStoriesWatcher>
-      visible_stories_watcher_binding_;
-  fidl::Binding<fuchsia::modular::StoryProviderWatcher>
-      story_provider_watcher_binding_;
-  fidl::Binding<fuchsia::modular::FocusWatcher> focus_watcher_binding_;
-
-  // Local state.
-  // story id -> context value id
-  std::map<fidl::StringPtr, fidl::StringPtr> story_value_ids_;
-  fidl::StringPtr focused_story_id_;
-  std::set<fidl::StringPtr> visible_story_ids_;
-
-  // A collection of all active stories we watch. Keys are story IDs, Values are
-  // the fuchsia::modular::StoryWatcher instances.
-  std::map<std::string, std::unique_ptr<StoryWatcherImpl>> stories_;
-
-  component::ServiceNamespace agent_services_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryInfoAcquirer);
-};
-
-}  // namespace maxwell
-
-#endif  // PERIDOT_BIN_ACQUIRERS_STORY_INFO_STORY_INFO_H_
diff --git a/bin/acquirers/story_info/story_info_main.cc b/bin/acquirers/story_info/story_info_main.cc
deleted file mode 100644
index c8eafb5..0000000
--- a/bin/acquirers/story_info/story_info_main.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/app_driver/cpp/agent_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-
-#include "peridot/bin/acquirers/story_info/story_info.h"
-
-int main(int argc, const char** argv) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AgentDriver<maxwell::StoryInfoAcquirer> driver(
-      context.get(), [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/bin/acquirers/story_info/story_watcher_impl.cc b/bin/acquirers/story_info/story_watcher_impl.cc
deleted file mode 100644
index 9a1b6d6..0000000
--- a/bin/acquirers/story_info/story_watcher_impl.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/acquirers/story_info/story_watcher_impl.h"
-
-#include <lib/context/cpp/context_metadata_builder.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-#include "peridot/bin/acquirers/story_info/link_watcher_impl.h"
-#include "peridot/bin/acquirers/story_info/story_info.h"
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"  // MakeLinkKey, EncodeModulePath
-
-namespace maxwell {
-
-StoryWatcherImpl::StoryWatcherImpl(
-    StoryInfoAcquirer* const owner,
-    fuchsia::modular::ContextWriter* const writer,
-    fuchsia::modular::StoryProvider* const story_provider,
-    const std::string& story_id)
-    : owner_(owner),
-      writer_(writer),
-      story_id_(story_id),
-      story_watcher_binding_(this),
-      story_links_watcher_binding_(this) {
-  story_provider->GetController(story_id, story_controller_.NewRequest());
-
-  story_controller_.set_error_handler(
-      [this](zx_status_t status) { owner_->DropStoryWatcher(story_id_); });
-
-  story_controller_->Watch(story_watcher_binding_.NewBinding());
-
-  story_watcher_binding_.set_error_handler(
-      [this](zx_status_t status) { owner_->DropStoryWatcher(story_id_); });
-
-  context_metadata_ = ContextMetadataBuilder()
-                          .SetStoryId(story_id)
-                          .SetStoryFocused(false)
-                          .Build();
-  // TODO(thatguy): Add StoryState.
-  // TODO(thatguy): Add visible state.
-
-  writer_->CreateValue(context_value_.NewRequest(),
-                       fuchsia::modular::ContextValueType::STORY);
-  fuchsia::modular::ContextMetadata metadata;
-  fidl::Clone(context_metadata_, &metadata);
-  context_value_->Set(nullptr /* content */,
-                      fidl::MakeOptional(std::move(metadata)));
-
-  story_controller_->GetActiveLinks(
-      story_links_watcher_binding_.NewBinding(),
-      [this](std::vector<fuchsia::modular::LinkPath> links) mutable {
-        for (fuchsia::modular::LinkPath& link_path : links) {
-          WatchLink(std::move(link_path));
-        }
-      });
-}
-
-StoryWatcherImpl::~StoryWatcherImpl() = default;
-
-void StoryWatcherImpl::OnStateChange(fuchsia::modular::StoryState new_state) {
-  // TODO(thatguy): Add recording of state to fuchsia::modular::StoryMetadata.
-}
-
-void StoryWatcherImpl::OnModuleAdded(fuchsia::modular::ModuleData module_data) {
-  ContextModuleMetadata data;
-  context_value_->CreateChildValue(data.value_writer.NewRequest(),
-                                   fuchsia::modular::ContextValueType::MODULE);
-  auto metadata = ContextMetadataBuilder()
-                      .SetModuleUrl(module_data.module_url)
-                      .SetModulePath(module_data.module_path)
-                      .Build();
-  fidl::Clone(metadata, &data.metadata);
-  data.value_writer->Set(nullptr /* content */,
-                         fidl::MakeOptional(std::move(metadata)));
-  auto path = modular::EncodeModulePath(module_data.module_path);
-  module_values_.emplace(path, std::move(data));
-}
-
-void StoryWatcherImpl::OnModuleFocused(
-    std::vector<std::string> module_path) {
-  auto key = modular::EncodeModulePath(module_path);
-  auto it = module_values_.find(key);
-  if (it == module_values_.end()) {
-    return;
-  }
-  if (!last_module_focus_key_.empty()) {
-    auto it_last = module_values_.find(last_module_focus_key_);
-    if (it_last != module_values_.end()) {
-      UpdateModuleFocus(&it_last->second, false);
-    }
-  }
-  UpdateModuleFocus(&it->second, true);
-  last_module_focus_key_ = key;
-}
-
-void StoryWatcherImpl::OnNewLink(fuchsia::modular::LinkPath link_path) {
-  WatchLink(std::move(link_path));
-}
-
-void StoryWatcherImpl::WatchLink(fuchsia::modular::LinkPath link_path) {
-  links_.emplace(std::make_pair(
-      modular::MakeLinkKey(link_path),
-      std::make_unique<LinkWatcherImpl>(this, story_controller_.get(),
-                                        story_id_, context_value_.get(),
-                                        std::move(link_path))));
-}
-
-void StoryWatcherImpl::OnFocusChange(bool focused) {
-  context_metadata_ = ContextMetadataBuilder(std::move(context_metadata_))
-                          .SetStoryFocused(focused)
-                          .Build();
-  fuchsia::modular::ContextMetadata metadata;
-  fidl::Clone(context_metadata_, &metadata);
-  context_value_->Set(nullptr /* content */,
-                      fidl::MakeOptional(std::move(metadata)));
-}
-
-void StoryWatcherImpl::OnStoryStateChange(fuchsia::modular::StoryInfo info,
-                                          fuchsia::modular::StoryState state) {
-  // TODO(thatguy): Record this state too.
-}
-
-void StoryWatcherImpl::DropLink(const std::string& link_key) {
-  links_.erase(link_key);
-}
-
-void StoryWatcherImpl::UpdateModuleFocus(ContextModuleMetadata* data,
-                                         bool focused) {
-  auto metadata = ContextMetadataBuilder(std::move(data->metadata))
-                      .SetModuleFocused(focused)
-                      .Build();
-  fidl::Clone(metadata, &data->metadata);
-  data->value_writer->Set(nullptr /* content */,
-                          fidl::MakeOptional(std::move(metadata)));
-}
-
-}  // namespace maxwell
diff --git a/bin/acquirers/story_info/story_watcher_impl.h b/bin/acquirers/story_info/story_watcher_impl.h
deleted file mode 100644
index 09f4049..0000000
--- a/bin/acquirers/story_info/story_watcher_impl.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_ACQUIRERS_STORY_INFO_STORY_WATCHER_IMPL_H_
-#define PERIDOT_BIN_ACQUIRERS_STORY_INFO_STORY_WATCHER_IMPL_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-
-namespace maxwell {
-
-class StoryInfoAcquirer;
-class LinkWatcherImpl;
-
-class StoryWatcherImpl : fuchsia::modular::StoryWatcher,
-                         fuchsia::modular::StoryLinksWatcher {
- public:
-  StoryWatcherImpl(StoryInfoAcquirer* const owner,
-                   fuchsia::modular::ContextWriter* const writer,
-                   fuchsia::modular::StoryProvider* const story_provider,
-                   const std::string& story_id);
-
-  ~StoryWatcherImpl() override;
-
-  // Used by LinkWatcherImpl.
-  void DropLink(const std::string& link_key);
-
-  // Used by |owner_|.
-  void OnStoryStateChange(fuchsia::modular::StoryInfo info,
-                          fuchsia::modular::StoryState state);
-  void OnFocusChange(bool focused);
-
- private:
-  struct ContextModuleMetadata {
-    fuchsia::modular::ContextMetadata metadata;
-    fuchsia::modular::ContextValueWriterPtr value_writer;
-  };
-
-  // |fuchsia::modular::StoryWatcher|
-  void OnStateChange(fuchsia::modular::StoryState new_state) override;
-
-  // |fuchsia::modular::StoryWatcher|
-  void OnModuleAdded(fuchsia::modular::ModuleData module_data) override;
-
-  // |fuchsia::modular::StoryWatcher|
-  void OnModuleFocused(std::vector<std::string> module_path) override;
-
-  // |fuchsia::modular::StoryLinksWatcher|
-  void OnNewLink(fuchsia::modular::LinkPath link_path) override;
-
-  void WatchLink(fuchsia::modular::LinkPath link_path);
-
-  void UpdateModuleFocus(ContextModuleMetadata* data, bool focused);
-
-  StoryInfoAcquirer* const owner_;
-  fuchsia::modular::ContextWriter* const writer_;
-  fuchsia::modular::StoryControllerPtr story_controller_;
-  const std::string story_id_;
-  fuchsia::modular::ContextValueWriterPtr context_value_;
-  fuchsia::modular::ContextMetadata context_metadata_;
-
-  fidl::Binding<fuchsia::modular::StoryWatcher> story_watcher_binding_;
-  fidl::Binding<fuchsia::modular::StoryLinksWatcher>
-      story_links_watcher_binding_;
-
-  std::map<std::string, std::unique_ptr<LinkWatcherImpl>> links_;
-  // serialized module path -> context value.
-  std::map<std::string, ContextModuleMetadata> module_values_;
-
-  std::string last_module_focus_key_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryWatcherImpl);
-};
-
-}  // namespace maxwell
-
-#endif  // PERIDOT_BIN_ACQUIRERS_STORY_INFO_STORY_WATCHER_IMPL_H_
diff --git a/bin/agents/clipboard/BUILD.gn b/bin/agents/clipboard/BUILD.gn
deleted file mode 100644
index 5aa75de..0000000
--- a/bin/agents/clipboard/BUILD.gn
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-import("//peridot/build/tests_package.gni")
-
-executable_package("clipboard_agent") {
-
-  meta = [
-    {
-      path = "meta/clipboard_agent.cmx"
-      dest = "clipboard_agent.cmx"
-    },
-  ]
-
-  sources = [
-    "clipboard_agent.cc",
-  ]
-
-  deps = [
-    ":clipboard_sources",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/public/lib/app_driver/cpp:agent_driver",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-source_set("clipboard_sources") {
-  sources = [
-    "clipboard_impl.cc",
-    "clipboard_impl.h",
-    "clipboard_storage.cc",
-    "clipboard_storage.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-executable("clipboard_impl_unittest") {
-  testonly = true
-
-  sources = [
-    "clipboard_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":clipboard_sources",
-    "//garnet/public/lib/gtest",
-    "//peridot/lib/testing:test_with_ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-tests_package("clipboard_unittests") {
-  deps = [
-    ":clipboard_impl_unittest",
-  ]
-}
diff --git a/bin/agents/clipboard/clipboard_agent.cc b/bin/agents/clipboard/clipboard_agent.cc
deleted file mode 100644
index 168ec57..0000000
--- a/bin/agents/clipboard/clipboard_agent.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/app_driver/cpp/agent_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-
-#include "peridot/bin/agents/clipboard/clipboard_impl.h"
-#include "peridot/bin/agents/clipboard/clipboard_storage.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-
-namespace modular {
-
-// An agent responsible for providing the fuchsia::modular::Clipboard service.
-class ClipboardAgent {
- public:
-  ClipboardAgent(AgentHost* const agent_host) {
-    fuchsia::modular::ComponentContextPtr component_context;
-    agent_host->agent_context()->GetComponentContext(
-        component_context.NewRequest());
-
-    fuchsia::ledger::LedgerPtr ledger;
-    ledger.set_error_handler([](zx_status_t status) {
-      FXL_LOG(ERROR) << "Ledger connection died: " << status;
-    });
-    component_context->GetLedger(ledger.NewRequest());
-
-    ledger_client_ = std::make_unique<LedgerClient>(std::move(ledger));
-
-    clipboard_ = std::make_unique<ClipboardImpl>(ledger_client_.get());
-
-    services_.AddService<fuchsia::modular::Clipboard>(
-        [this](fidl::InterfaceRequest<fuchsia::modular::Clipboard> request) {
-          clipboard_->Connect(std::move(request));
-        });
-  }
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> outgoing_services) {
-    services_.AddBinding(std::move(outgoing_services));
-  }
-
-  void RunTask(const fidl::StringPtr& task_id,
-               const std::function<void()>& done) {
-    done();
-  }
-
-  void Terminate(const std::function<void()>& done) { done(); }
-
- private:
-  // The ledger client that is provided to the ClipboardImpl.
-  std::unique_ptr<LedgerClient> ledger_client_;
-
-  std::unique_ptr<ClipboardImpl> clipboard_;
-
-  // The service namespace that the fuchsia::modular::Clipboard is added to.
-  component::ServiceNamespace services_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ClipboardAgent);
-};
-
-}  // namespace modular
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AgentDriver<modular::ClipboardAgent> driver(
-      context.get(), [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/bin/agents/clipboard/clipboard_impl.cc b/bin/agents/clipboard/clipboard_impl.cc
deleted file mode 100644
index 33eb1a8..0000000
--- a/bin/agents/clipboard/clipboard_impl.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/agents/clipboard/clipboard_impl.h"
-
-#include <string>
-
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/ledger_client/page_id.h"
-
-namespace modular {
-namespace {
-constexpr char kClipboardImplPageId[] = "ClipboardPage___";  // 16 chars
-}  // namespace
-
-ClipboardImpl::ClipboardImpl(LedgerClient* ledger_client)
-    : storage_(ledger_client, MakePageId(kClipboardImplPageId)) {}
-
-ClipboardImpl::~ClipboardImpl() = default;
-
-void ClipboardImpl::Push(std::string text) { storage_.Push(text); }
-
-void ClipboardImpl::Peek(PeekCallback callback) { storage_.Peek(callback); }
-
-void ClipboardImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::Clipboard> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-}  // namespace modular
diff --git a/bin/agents/clipboard/clipboard_impl.h b/bin/agents/clipboard/clipboard_impl.h
deleted file mode 100644
index 9f3b605..0000000
--- a/bin/agents/clipboard/clipboard_impl.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_AGENTS_CLIPBOARD_CLIPBOARD_IMPL_H_
-#define PERIDOT_BIN_AGENTS_CLIPBOARD_CLIPBOARD_IMPL_H_
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/agents/clipboard/clipboard_storage.h"
-
-namespace modular {
-
-// An agent responsible for providing the fuchsia::modular::Clipboard service.
-class ClipboardImpl : fuchsia::modular::Clipboard {
- public:
-  explicit ClipboardImpl(LedgerClient* ledger_client);
-  ~ClipboardImpl() override;
-
-  void Connect(fidl::InterfaceRequest<fuchsia::modular::Clipboard> request);
-
- private:
-  // |fuchsia::modular::Clipboard|
-  void Push(std::string text) override;
-
-  // |fuchsia::modular::Clipboard|
-  void Peek(PeekCallback callback) override;
-
-  // The storage instance that manages interactions with the Ledger.
-  ClipboardStorage storage_;
-
-  // The bindings set containing the outgoing services request from the agent
-  // driver.
-  fidl::BindingSet<fuchsia::modular::Clipboard> bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ClipboardImpl);
-  friend class ClipboardImplTest;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_AGENTS_CLIPBOARD_CLIPBOARD_IMPL_H_
diff --git a/bin/agents/clipboard/clipboard_impl_unittest.cc b/bin/agents/clipboard/clipboard_impl_unittest.cc
deleted file mode 100644
index 65ed49f..0000000
--- a/bin/agents/clipboard/clipboard_impl_unittest.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/agents/clipboard/clipboard_impl.h"
-
-#include <string>
-
-#include "peridot/lib/testing/test_with_ledger.h"
-
-namespace modular {
-
-class ClipboardImplTest : public testing::TestWithLedger {
- public:
-  ClipboardImplTest() = default;
-
-  void SetUp() override {
-    TestWithLedger::SetUp();
-
-    clipboard_ = std::make_unique<ClipboardImpl>(ledger_client());
-  }
-
-  void TearDown() override {
-    clipboard_.reset();
-
-    TestWithLedger::TearDown();
-  }
-
- protected:
-  void Push(const std::string& text) { clipboard_->Push(text); }
-
-  void Peek(const fuchsia::modular::Clipboard::PeekCallback& callback) {
-    clipboard_->Peek(callback);
-  }
-
-  std::unique_ptr<ClipboardImpl> clipboard_;
-};
-
-namespace {
-
-TEST_F(ClipboardImplTest, FirstPeek) {
-  bool callback_called = false;
-  Peek([&callback_called](const fidl::StringPtr& text) {
-    EXPECT_EQ("", text);
-    callback_called = true;
-  });
-
-  RunLoopWithTimeoutOrUntil([&callback_called] { return callback_called; });
-}
-
-TEST_F(ClipboardImplTest, PushAndPeek) {
-  bool callback_called = false;
-  std::string expected_value = "a test string";
-  Push(expected_value);
-  Peek([&callback_called, expected_value](const fidl::StringPtr& text) {
-    EXPECT_EQ(expected_value, text);
-    callback_called = true;
-  });
-
-  RunLoopWithTimeoutOrUntil([&callback_called] { return callback_called; });
-}
-
-TEST_F(ClipboardImplTest, PushAndPeekTwice) {
-  int callback_called = 0;
-  std::string expected_value = "a test string";
-  Push(expected_value);
-  Peek([&callback_called, expected_value](const fidl::StringPtr& text) {
-    EXPECT_EQ(expected_value, text);
-    callback_called++;
-  });
-  Peek([&callback_called, expected_value](const fidl::StringPtr& text) {
-    EXPECT_EQ(expected_value, text);
-    callback_called++;
-  });
-
-  RunLoopWithTimeoutOrUntil(
-      [&callback_called] { return callback_called == 2; });
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/agents/clipboard/clipboard_storage.cc b/bin/agents/clipboard/clipboard_storage.cc
deleted file mode 100644
index d65a90e..0000000
--- a/bin/agents/clipboard/clipboard_storage.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/agents/clipboard/clipboard_storage.h"
-
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-namespace modular {
-namespace {
-
-fidl::VectorPtr<uint8_t> ToArray(const std::string& str) {
-  auto array = fidl::VectorPtr<uint8_t>::New(str.size());
-  memcpy(array->data(), str.data(), str.size());
-  return array;
-}
-
-std::string ToString(fuchsia::mem::Buffer value) {
-  fsl::SizedVmo vmo;
-  std::string parsed_string;
-  if (!fsl::SizedVmo::FromTransport(std::move(value), &vmo)) {
-    FXL_LOG(ERROR) << "Could not decode clipboard value.";
-    return "";
-  }
-  if (!fsl::StringFromVmo(vmo, &parsed_string)) {
-    FXL_LOG(ERROR)
-        << "fuchsia::modular::Clipboard vmo could not be decoded to string.";
-    return "";
-  }
-  return parsed_string;
-}
-
-// The Ledger key that is used to store the current value.
-constexpr char kCurrentValueKey[] = "current_value";
-
-}  // namespace
-
-class ClipboardStorage::PushCall : public Operation<> {
- public:
-  PushCall(ClipboardStorage* const impl, const fidl::StringPtr& text)
-      : Operation("ClipboardStorage::PushCall", [] {}),
-        impl_(impl),
-        text_(text) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-    impl_->page()->Put(ToArray(kCurrentValueKey), ToArray(text_),
-                       [this, flow](fuchsia::ledger::Status status) {
-                         if (status != fuchsia::ledger::Status::OK) {
-                           FXL_LOG(ERROR) << "Failed to put text: " << text_;
-                         }
-                       });
-  }
-
-  ClipboardStorage* const impl_;  // not owned
-  const fidl::StringPtr text_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PushCall);
-};
-
-class ClipboardStorage::PeekCall : public Operation<fidl::StringPtr> {
- public:
-  PeekCall(ClipboardStorage* const impl,
-           std::function<void(fidl::StringPtr)> result)
-      : Operation("ClipboardStorage::PeekCall", std::move(result)),
-        impl_(impl) {
-    // No error checking: Absent ledger value yields "", not
-    // null. TODO(mesch): Once we support types, distinction of
-    // null may make sense.
-    text_.reset("");
-  }
-
- private:
-  void Run() override {
-    FlowToken flow{this, &text_};
-    impl_->page()->GetSnapshot(
-        snapshot_.NewRequest(), fidl::VectorPtr<uint8_t>::New(0), nullptr,
-        [](fuchsia::ledger::Status status) {
-          if (status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << "Failed to get page snapshot";
-          }
-        });
-
-    snapshot_->Get(ToArray(kCurrentValueKey),
-                   [this, flow](fuchsia::ledger::Status status,
-                                fuchsia::mem::BufferPtr value) {
-                     if (value) {
-                       text_ = ToString(std::move(*value));
-                     }
-                   });
-  }
-
-  ClipboardStorage* const impl_;  // not owned
-  fuchsia::ledger::PageSnapshotPtr snapshot_;
-  fidl::StringPtr text_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PeekCall);
-};
-
-ClipboardStorage::ClipboardStorage(LedgerClient* ledger_client,
-                                   LedgerPageId page_id)
-    : PageClient("ClipboardStorage", ledger_client, std::move(page_id)) {}
-
-ClipboardStorage::~ClipboardStorage() = default;
-
-void ClipboardStorage::Push(const fidl::StringPtr& text) {
-  operation_queue_.Add(new PushCall(this, text));
-}
-
-void ClipboardStorage::Peek(
-    const std::function<void(fidl::StringPtr)>& callback) {
-  operation_queue_.Add(new PeekCall(this, callback));
-}
-
-}  // namespace modular
diff --git a/bin/agents/clipboard/clipboard_storage.h b/bin/agents/clipboard/clipboard_storage.h
deleted file mode 100644
index c42e34a..0000000
--- a/bin/agents/clipboard/clipboard_storage.h
+++ /dev/null
@@ -1,47 +0,0 @@
-
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_AGENTS_CLIPBOARD_CLIPBOARD_STORAGE_H_
-#define PERIDOT_BIN_AGENTS_CLIPBOARD_CLIPBOARD_STORAGE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_client.h"
-
-namespace modular {
-
-// |ClipboardStorage| manages serialization of clipboard data to and from the
-// Ledger.
-//
-// A Ledger is scoped to a single user, so each user has their own clipboard.
-// Using the Ledger for the clipboard means that the same clipboard is shared
-// across all of a user's devices. The clipboard will also persist across
-// reboots.
-class ClipboardStorage : public PageClient {
- public:
-  ClipboardStorage(LedgerClient* ledger_client, LedgerPageId page_id);
-  ~ClipboardStorage() override;
-
-  // Stores the provided text.
-  void Push(const fidl::StringPtr& text);
-
-  // Returns the most recent value that was passed to |Push()|, or "" if nothing
-  // has been pushed yet.
-  void Peek(const std::function<void(fidl::StringPtr)>& callback);
-
- private:
-  OperationQueue operation_queue_;
-
-  class PushCall;
-  class PeekCall;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ClipboardStorage);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_AGENTS_CLIPBOARD_CLIPBOARD_STORAGE_H_
diff --git a/bin/agents/clipboard/meta/clipboard_agent.cmx b/bin/agents/clipboard/meta/clipboard_agent.cmx
deleted file mode 100644
index fdcd999..0000000
--- a/bin/agents/clipboard/meta/clipboard_agent.cmx
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.AgentContext",
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.netconnector.NetConnector",
-            "fuchsia.sys.Launcher",
-            "fuchsia.tracelink.Registry"
-        ]
-    }
-}
diff --git a/bin/basemgr/BUILD.gn b/bin/basemgr/BUILD.gn
deleted file mode 100644
index 049f6f6..0000000
--- a/bin/basemgr/BUILD.gn
+++ /dev/null
@@ -1,170 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/package.gni")
-import("//peridot/build/executable_package.gni")
-import("//peridot/build/tests_package.gni")
-import("//third_party/flatbuffers/flatbuffer.gni")
-
-declare_args() {
-  # Whether basemgr should automatically login as a guest user.
-  auto_login_to_guest = false
-}
-
-flatbuffer("users") {
-  sources = [
-    "users.fbs",
-  ]
-}
-
-executable_package("basemgr") {
-  meta = [
-    {
-      path = "meta/basemgr.cmx"
-      dest = "basemgr.cmx"
-    },
-  ]
-
-  sources = [
-    "basemgr_impl.cc",
-    "basemgr_impl.h",
-    "basemgr_settings.cc",
-    "basemgr_settings.h",
-    "main.cc",
-  ]
-
-  deps = [
-    ":lib",
-    "//garnet/public/fidl/fuchsia.auth",
-    "//garnet/public/fidl/fuchsia.devicesettings",
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/fidl/fuchsia.ui.policy",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/basemgr/cobalt",
-    "//peridot/lib/common:async_holder",
-    "//peridot/lib/common:names",
-    "//peridot/lib/common:teardown",
-    "//peridot/lib/fidl:app_client",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:clone",
-    "//peridot/lib/fidl:environment",
-    "//peridot/lib/ledger_client:constants",
-    "//peridot/lib/session_shell_settings",
-    "//peridot/lib/util:filesystem",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-    "//peridot/public/lib/async/cpp:future",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  public_deps = [
-    "//peridot/bin/basemgr/cobalt:basemgr_metrics_registry",
-  ]
-
-  resources = [
-    {
-      path = rebase_path(
-              get_label_info(
-                  "//peridot/bin/basemgr/cobalt:basemgr_metrics_registry",
-                  "target_gen_dir") + "/basemgr_metrics_registry.pb")
-      dest = "basemgr_metrics_registry.pb"
-    },
-  ]
-}
-
-tests_package("basemgr_unittests") {
-  deps = [
-    ":user_controller_impl_unittest",
-  ]
-}
-
-source_set("lib") {
-  sources = [
-    "user_controller_impl.cc",
-    "user_controller_impl.h",
-    "user_provider_impl.cc",
-    "user_provider_impl.h",
-  ]
-
-  deps = [
-    ":users",
-    "//garnet/public/fidl/fuchsia.auth",
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/fidl/fuchsia.ui.policy",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/common:async_holder",
-    "//peridot/lib/common:names",
-    "//peridot/lib/common:teardown",
-    "//peridot/lib/common:xdr",
-    "//peridot/lib/fidl:app_client",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:clone",
-    "//peridot/lib/fidl:environment",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/util:filesystem",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-    "//zircon/public/lib/trace",
-  ]
-
-  if (auto_login_to_guest) {
-    public_configs = [ ":auto_login_to_guest" ]
-  }
-}
-
-executable_package("dev_base_shell") {
-
-  meta = [
-    {
-      path = "meta/dev_base_shell.cmx"
-      dest = "dev_base_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "dev_base_shell.cc",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:single_service_app",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable("user_controller_impl_unittest") {
-  testonly = true
-
-  sources = [
-    "user_controller_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":lib",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/component/cpp/testing:fake_launcher",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//peridot/lib/fidl:clone",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-config("auto_login_to_guest") {
-  defines = [ "AUTO_LOGIN_TO_GUEST" ]
-}
diff --git a/bin/basemgr/basemgr_impl.cc b/bin/basemgr/basemgr_impl.cc
deleted file mode 100644
index faa5a8e..0000000
--- a/bin/basemgr/basemgr_impl.cc
+++ /dev/null
@@ -1,551 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/basemgr/basemgr_impl.h"
-
-#include <memory>
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <fuchsia/modular/auth/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/policy/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/async/cpp/future.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/basemgr/basemgr_settings.h"
-#include "peridot/bin/basemgr/user_provider_impl.h"
-#include "peridot/lib/common/async_holder.h"
-#include "peridot/lib/common/names.h"
-#include "peridot/lib/common/teardown.h"
-#include "peridot/lib/fidl/app_client.h"
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/session_shell_settings/session_shell_settings.h"
-#include "peridot/lib/util/filesystem.h"
-
-namespace modular {
-
-namespace {
-#ifdef AUTO_LOGIN_TO_GUEST
-constexpr bool kAutoLoginToGuest = true;
-#else
-constexpr bool kAutoLoginToGuest = false;
-#endif
-}  // namespace
-
-BasemgrImpl::BasemgrImpl(
-    const modular::BasemgrSettings& settings,
-    const std::vector<SessionShellSettings>& session_shell_settings,
-    fuchsia::sys::Launcher* const launcher,
-    fuchsia::ui::policy::PresenterPtr presenter,
-    fuchsia::devicesettings::DeviceSettingsManagerPtr device_settings_manager,
-    std::function<void()> on_shutdown)
-    : settings_(settings),
-      session_shell_settings_(session_shell_settings),
-      launcher_(launcher),
-      presenter_(std::move(presenter)),
-      device_settings_manager_(std::move(device_settings_manager)),
-      on_shutdown_(std::move(on_shutdown)),
-      user_provider_impl_("UserProviderImpl"),
-      base_shell_context_binding_(this),
-      authentication_context_provider_binding_(this) {
-  UpdateSessionShellConfig();
-
-  // TODO(SCN-595): Presentation is now discoverable, so we don't need
-  // kPresentationService anymore.
-  service_namespace_.AddService(presentation_state_.bindings.GetHandler(
-                                    presentation_state_.presentation.get()),
-                                kPresentationService);
-
-  Start();
-}
-
-BasemgrImpl::~BasemgrImpl() = default;
-
-void BasemgrImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::internal::BasemgrDebug> request) {
-  basemgr_bindings_.AddBinding(this, std::move(request));
-}
-
-void BasemgrImpl::InitializePresentation(
-    fidl::InterfaceHandle<fuchsia::ui::viewsv1token::ViewOwner> view_owner) {
-  if (settings_.test && !settings_.enable_presenter) {
-    return;
-  }
-
-  auto presentation_request =
-      presentation_state_.presentation.is_bound()
-          ? presentation_state_.presentation.Unbind().NewRequest()
-          : presentation_state_.presentation.NewRequest();
-
-  presenter_->Present2(zx::eventpair(view_owner.TakeChannel().release()),
-                       std::move(presentation_request));
-
-  AddGlobalKeyboardShortcuts(presentation_state_.presentation);
-
-  SetShadowTechnique(presentation_state_.shadow_technique);
-
-  // Set the presentation of the given view to the settings of the active
-  // session shell.
-  if (active_session_shell_settings_index_ >= session_shell_settings_.size()) {
-    FXL_LOG(ERROR) << "Active session shell index is "
-                   << active_session_shell_settings_index_ << ", but only "
-                   << session_shell_settings_.size()
-                   << " session shell settings exist.";
-    return;
-  }
-
-  auto active_session_shell_settings =
-      session_shell_settings_[active_session_shell_settings_index_];
-  if (active_session_shell_settings.display_usage !=
-      fuchsia::ui::policy::DisplayUsage::kUnknown) {
-    FXL_DLOG(INFO) << "Setting display usage: "
-                   << fidl::ToUnderlying(
-                          active_session_shell_settings.display_usage);
-    presentation_state_.presentation->SetDisplayUsage(
-        active_session_shell_settings.display_usage);
-  }
-
-  if (!std::isnan(active_session_shell_settings.screen_width) &&
-      !std::isnan(active_session_shell_settings.screen_height)) {
-    FXL_DLOG(INFO) << "Setting display size: "
-                   << active_session_shell_settings.screen_width << " x "
-                   << active_session_shell_settings.screen_height;
-    presentation_state_.presentation->SetDisplaySizeInMm(
-        active_session_shell_settings.screen_width,
-        active_session_shell_settings.screen_height);
-  }
-}
-
-void BasemgrImpl::StartBaseShell() {
-  if (base_shell_running_) {
-    FXL_DLOG(INFO) << "StartBaseShell() called when already running";
-
-    return;
-  }
-
-  base_shell_app_ = std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
-      launcher_, CloneStruct(settings_.base_shell));
-  base_shell_app_->services().ConnectToService(base_shell_.NewRequest());
-
-  fuchsia::ui::viewsv1::ViewProviderPtr base_shell_view_provider;
-  base_shell_app_->services().ConnectToService(
-      base_shell_view_provider.NewRequest());
-
-  // We still need to pass a request for root view to base shell since
-  // dev_base_shell (which mimics flutter behavior) blocks until it receives
-  // the root view request.
-  fidl::InterfaceHandle<fuchsia::ui::viewsv1token::ViewOwner> root_view;
-  base_shell_view_provider->CreateView(root_view.NewRequest(), nullptr);
-
-  InitializePresentation(std::move(root_view));
-
-  // Populate parameters and initialize the base shell.
-  fuchsia::modular::BaseShellParams params;
-  params.presentation = std::move(presentation_state_.presentation);
-  base_shell_->Initialize(base_shell_context_binding_.NewBinding(),
-                          std::move(params));
-
-  base_shell_running_ = true;
-}
-
-FuturePtr<> BasemgrImpl::StopBaseShell() {
-  if (!base_shell_running_) {
-    FXL_DLOG(INFO) << "StopBaseShell() called when already stopped";
-
-    return Future<>::CreateCompleted("StopBaseShell::Completed");
-  }
-
-  auto did_stop = Future<>::Create("StopBaseShell");
-
-  base_shell_app_->Teardown(kBasicTimeout, [did_stop, this] {
-    FXL_DLOG(INFO) << "- fuchsia::modular::BaseShell down";
-
-    base_shell_running_ = false;
-    did_stop->Complete();
-  });
-
-  return did_stop;
-}
-
-FuturePtr<> BasemgrImpl::StopTokenManagerFactoryApp() {
-  if (!token_manager_factory_app_) {
-    FXL_DLOG(INFO)
-        << "StopTokenManagerFactoryApp() called when already stopped";
-
-    return Future<>::CreateCompleted("StopTokenManagerFactoryApp::Completed");
-  }
-
-  auto did_stop = Future<>::Create("StopTokenManagerFactoryApp");
-
-  token_manager_factory_app_->Teardown(kBasicTimeout, [did_stop, this] {
-    FXL_DLOG(INFO) << "- fuchsia::auth::TokenManagerFactory down";
-
-    token_manager_factory_app_.release();
-    did_stop->Complete();
-  });
-
-  return did_stop;
-}
-
-void BasemgrImpl::Start() {
-  if (settings_.test) {
-    // 0. Print test banner.
-    FXL_LOG(INFO)
-        << std::endl
-        << std::endl
-        << "======================== Starting Test [" << settings_.test_name
-        << "]" << std::endl
-        << "============================================================"
-        << std::endl;
-  }
-
-  // Wait for persistent data to come up.
-  if (!settings_.no_minfs) {
-    WaitForMinfs();
-  }
-
-  // Start OAuth Token Manager App.
-  token_manager_factory_app_.release();
-  fuchsia::modular::AppConfig token_manager_config;
-  token_manager_config.url = settings_.account_provider.url;
-  token_manager_factory_app_ =
-      std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
-          launcher_, CloneStruct(token_manager_config));
-  token_manager_factory_app_->services().ConnectToService(
-      token_manager_factory_.NewRequest());
-
-  user_provider_impl_.reset(new UserProviderImpl(
-      launcher_, settings_.sessionmgr, session_shell_config_,
-      settings_.story_shell, token_manager_factory_.get(),
-      authentication_context_provider_binding_.NewBinding().Bind(), this));
-
-  ShowSetupOrLogin();
-
-  ReportEvent(ModularEvent::BOOTED_TO_BASEMGR);
-}
-
-void BasemgrImpl::GetUserProvider(
-    fidl::InterfaceRequest<fuchsia::modular::UserProvider> request) {
-  user_provider_impl_->Connect(std::move(request));
-}
-
-void BasemgrImpl::Shutdown() {
-  // Prevent the shutdown sequence from running twice.
-  if (state_ == State::SHUTTING_DOWN) {
-    return;
-  }
-
-  state_ = State::SHUTTING_DOWN;
-
-  FXL_DLOG(INFO) << "fuchsia::modular::BaseShellContext::Shutdown()";
-
-  if (settings_.test) {
-    FXL_LOG(INFO)
-        << std::endl
-        << "============================================================"
-        << std::endl
-        << "======================== [" << settings_.test_name << "] Done";
-  }
-
-  // TODO(mesch): Some of these could be done in parallel too.
-  // fuchsia::modular::UserProvider must go first, but the order after user
-  // provider is for now rather arbitrary. We terminate base shell last so
-  // that in tests testing::Teardown() is invoked at the latest possible time.
-  // Right now it just demonstrates that AppTerminate() works as we like it
-  // to.
-  user_provider_impl_.Teardown(kUserProviderTimeout, [this] {
-    FXL_DLOG(INFO) << "- fuchsia::modular::UserProvider down";
-    StopTokenManagerFactoryApp()->Then([this] {
-      FXL_DLOG(INFO) << "- fuchsia::auth::TokenManagerFactory down";
-      StopBaseShell()->Then([this] {
-        FXL_LOG(INFO) << "Clean Shutdown";
-        on_shutdown_();
-      });
-    });
-  });
-}
-
-void BasemgrImpl::GetAuthenticationUIContext(
-    fidl::InterfaceRequest<fuchsia::auth::AuthenticationUIContext> request) {
-  // TODO(MI4-1107): Basemgr needs to implement AuthenticationUIContext
-  // itself, and proxy calls for StartOverlay & StopOverlay to BaseShell,
-  // starting it if it's not running yet.
-  FXL_CHECK(base_shell_);
-  base_shell_->GetAuthenticationUIContext(std::move(request));
-}
-
-void BasemgrImpl::DidLogin() {
-  // Continues if `enable_presenter` is set to true during testing, as
-  // ownership of the Presenter should still be moved to the session shell.
-  if (settings_.test && !settings_.enable_presenter) {
-    // TODO(MI4-1117): Integration tests currently expect base shell to
-    // always be running. So, if we're running under a test, do not shut down
-    // the base shell after login.
-    return;
-  }
-
-  // TODO(MI4-1117): See above. The base shell shouldn't be shut down.
-  if (!settings_.test) {
-    FXL_DLOG(INFO) << "Stopping base shell due to login";
-    StopBaseShell();
-  }
-
-  InitializePresentation(session_shell_view_owner_);
-}
-
-void BasemgrImpl::DidLogout() {
-  if (settings_.test) {
-    // TODO(MI4-1117): Integration tests currently expect base shell to
-    // always be running. So, if we're running under a test, DidLogin() will
-    // not shut down the base shell after login; thus this method doesn't
-    // need to re-start the base shell after a logout.
-    return;
-  }
-
-  FXL_DLOG(INFO) << "Re-starting base shell due to logout";
-
-  StartBaseShell();
-}
-
-fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-BasemgrImpl::GetSessionShellViewOwner(
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>) {
-  return session_shell_view_owner_.is_bound()
-             ? session_shell_view_owner_.Unbind().NewRequest()
-             : session_shell_view_owner_.NewRequest();
-}
-
-fidl::InterfaceHandle<fuchsia::sys::ServiceProvider>
-BasemgrImpl::GetSessionShellServiceProvider(
-    fidl::InterfaceHandle<fuchsia::sys::ServiceProvider>) {
-  fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> handle;
-  service_namespace_.AddBinding(handle.NewRequest());
-  return handle;
-}
-
-void BasemgrImpl::OnEvent(fuchsia::ui::input::KeyboardEvent event) {
-  switch (event.code_point) {
-    case ' ': {
-      SwapSessionShell();
-      break;
-    }
-    case 's': {
-      SetNextShadowTechnique();
-      break;
-    }
-    case 'l':
-      ToggleClipping();
-      break;
-    default:
-      FXL_DLOG(INFO) << "Unknown keyboard event: codepoint=" << event.code_point
-                     << ", modifiers=" << event.modifiers;
-      break;
-  }
-}
-
-void BasemgrImpl::AddGlobalKeyboardShortcuts(
-    fuchsia::ui::policy::PresentationPtr& presentation) {
-  presentation->CaptureKeyboardEventHACK(
-      {
-          .code_point = ' ',  // spacebar
-          .modifiers = fuchsia::ui::input::kModifierLeftControl,
-      },
-      keyboard_capture_listener_bindings_.AddBinding(this));
-  presentation->CaptureKeyboardEventHACK(
-      {
-          .code_point = 's',
-          .modifiers = fuchsia::ui::input::kModifierLeftControl,
-      },
-      keyboard_capture_listener_bindings_.AddBinding(this));
-  presentation->CaptureKeyboardEventHACK(
-      {
-          .code_point = 'l',
-          .modifiers = fuchsia::ui::input::kModifierRightAlt,
-      },
-      keyboard_capture_listener_bindings_.AddBinding(this));
-}
-
-void BasemgrImpl::SwapSessionShell() {
-  if (session_shell_settings_.empty()) {
-    FXL_DLOG(INFO) << "No session shells has been defined";
-    return;
-  }
-  auto shell_count = session_shell_settings_.size();
-  if (shell_count <= 1) {
-    FXL_DLOG(INFO)
-        << "Only one session shell has been defined so switch is disabled";
-    return;
-  }
-  active_session_shell_settings_index_ =
-      (active_session_shell_settings_index_ + 1) % shell_count;
-
-  UpdateSessionShellConfig();
-
-  user_provider_impl_->SwapSessionShell(CloneStruct(session_shell_config_))
-      ->Then([] { FXL_DLOG(INFO) << "Swapped session shell"; });
-}
-
-void BasemgrImpl::SetNextShadowTechnique() {
-  using ShadowTechnique = fuchsia::ui::gfx::ShadowTechnique;
-
-  auto next_shadow_technique =
-      [](ShadowTechnique shadow_technique) -> ShadowTechnique {
-    switch (shadow_technique) {
-      case ShadowTechnique::UNSHADOWED:
-        return ShadowTechnique::SCREEN_SPACE;
-      case ShadowTechnique::SCREEN_SPACE:
-        return ShadowTechnique::SHADOW_MAP;
-      default:
-        FXL_LOG(ERROR) << "Unknown shadow technique: "
-                       << fidl::ToUnderlying(shadow_technique);
-        // Fallthrough
-      case ShadowTechnique::SHADOW_MAP:
-      case ShadowTechnique::MOMENT_SHADOW_MAP:
-        return ShadowTechnique::UNSHADOWED;
-    }
-  };
-
-  SetShadowTechnique(
-      next_shadow_technique(presentation_state_.shadow_technique));
-}
-
-void BasemgrImpl::SetShadowTechnique(
-    fuchsia::ui::gfx::ShadowTechnique shadow_technique) {
-  if (!presentation_state_.presentation)
-    return;
-
-  presentation_state_.shadow_technique = shadow_technique;
-
-  FXL_LOG(INFO) << "Setting shadow technique to "
-                << fidl::ToUnderlying(presentation_state_.shadow_technique);
-
-  fuchsia::ui::gfx::RendererParam param;
-  param.set_shadow_technique(presentation_state_.shadow_technique);
-
-  std::vector<fuchsia::ui::gfx::RendererParam> renderer_params;
-  renderer_params.push_back(std::move(param));
-
-  presentation_state_.presentation->SetRendererParams(
-      std::move(renderer_params));
-}
-
-void BasemgrImpl::ToggleClipping() {
-  if (!presentation_state_.presentation)
-    return;
-
-  FXL_DLOG(INFO) << "Toggling clipping";
-
-  presentation_state_.clipping_enabled = !presentation_state_.clipping_enabled;
-  presentation_state_.presentation->EnableClipping(
-      presentation_state_.clipping_enabled);
-}
-
-void BasemgrImpl::UpdateSessionShellConfig() {
-  // The session shell settings overrides the session_shell flag passed via
-  // command line, except in integration tests. TODO(MF-113): Consolidate
-  // the session shell settings.
-  fuchsia::modular::AppConfig session_shell_config;
-  if (settings_.test || session_shell_settings_.empty()) {
-    session_shell_config = CloneStruct(settings_.session_shell);
-  } else {
-    const auto& settings =
-        session_shell_settings_[active_session_shell_settings_index_];
-    session_shell_config.url = settings.name;
-  }
-
-  session_shell_config_ = std::move(session_shell_config);
-}
-
-void BasemgrImpl::ShowSetupOrLogin() {
-  auto show_setup_or_login = [this] {
-    // If there are no session shell settings specified, default to showing
-    // setup.
-    if (active_session_shell_settings_index_ >=
-        session_shell_settings_.size()) {
-      StartBaseShell();
-      return;
-    }
-
-    if (kAutoLoginToGuest) {
-      user_provider_impl_->Login(fuchsia::modular::UserLoginParams());
-    } else {
-      user_provider_impl_->PreviousUsers(
-          [this](std::vector<fuchsia::modular::auth::Account> accounts) {
-            if (accounts.empty()) {
-              StartBaseShell();
-            } else {
-              fuchsia::modular::UserLoginParams params;
-              params.account_id = accounts.at(0).id;
-              user_provider_impl_->Login(std::move(params));
-            }
-          });
-    }
-  };
-
-  // TODO(MF-134): Improve the factory reset logic by deleting more than just
-  // the user data.
-  // If the device needs factory reset, remove all the users before proceeding
-  // with setup.
-  device_settings_manager_.set_error_handler(
-      [show_setup_or_login](zx_status_t status) { show_setup_or_login(); });
-  device_settings_manager_->GetInteger(
-      kFactoryResetKey,
-      [this, show_setup_or_login](int factory_reset_value,
-                                  fuchsia::devicesettings::Status status) {
-        if (status == fuchsia::devicesettings::Status::ok &&
-            factory_reset_value > 0) {
-          // Unset the factory reset flag.
-          device_settings_manager_->SetInteger(
-              kFactoryResetKey, 0, [](bool result) {
-                if (!result) {
-                  FXL_LOG(WARNING) << "Factory reset flag was not updated.";
-                }
-              });
-
-          user_provider_impl_->PreviousUsers(
-              [this](std::vector<fuchsia::modular::auth::Account> accounts) {
-                std::vector<FuturePtr<>> did_remove_users;
-                did_remove_users.reserve(accounts.size());
-
-                for (const auto& account : accounts) {
-                  auto did_remove_user = Future<>::Create(
-                      "BasemgrImpl.ShowSetupOrLogin.did_remove_user");
-                  user_provider_impl_->RemoveUser(
-                      account.id,
-                      [did_remove_user](fidl::StringPtr error_code) {
-                        if (error_code) {
-                          FXL_LOG(WARNING) << "Account was not removed during "
-                                              "factory reset. Error code: "
-                                           << error_code;
-                        }
-                        did_remove_user->Complete();
-                      });
-                  did_remove_users.emplace_back(did_remove_user);
-                }
-
-                Wait("BasemgrImpl.ShowSetupOrLogin.Wait", did_remove_users)
-                    ->Then([this] { StartBaseShell(); });
-              });
-        } else {
-          show_setup_or_login();
-        }
-      });
-}
-
-void BasemgrImpl::RestartSession() { user_provider_impl_->RestartSession(); }
-
-void BasemgrImpl::LoginAsGuest() {
-  fuchsia::modular::UserLoginParams params;
-  user_provider_impl_->Login(std::move(params));
-}
-
-}  // namespace modular
diff --git a/bin/basemgr/basemgr_impl.h b/bin/basemgr/basemgr_impl.h
deleted file mode 100644
index 5ed6d84..0000000
--- a/bin/basemgr/basemgr_impl.h
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_BASEMGR_BASEMGR_IMPL_H_
-#define PERIDOT_BIN_BASEMGR_BASEMGR_IMPL_H_
-
-#include <memory>
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <fuchsia/devicesettings/cpp/fidl.h>
-#include <fuchsia/modular/auth/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/policy/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/async/cpp/future.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/basemgr/basemgr_settings.h"
-#include "peridot/bin/basemgr/cobalt/cobalt.h"
-#include "peridot/bin/basemgr/user_provider_impl.h"
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/session_shell_settings/session_shell_settings.h"
-
-namespace modular {
-
-// Basemgr is the parent process of the modular framework, and it is started by
-// the sysmgr as part of the boot sequence.
-//
-// It has several high-level responsibilites:
-// 1) Initializes and owns the system's root view and presentation.
-// 2) Sets up the interactive flow for user authentication and login.
-// 3) Manages the lifecycle of sessions, represented as |sessionmgr| processes.
-class BasemgrImpl : fuchsia::modular::BaseShellContext,
-                    fuchsia::auth::AuthenticationContextProvider,
-                    fuchsia::modular::internal::BasemgrDebug,
-                    fuchsia::ui::policy::KeyboardCaptureListenerHACK,
-                    modular::UserProviderImpl::Delegate {
- public:
-  // Initializes as BasemgrImpl instance with the given parameters:
-  //
-  // |settings| Settings that are parsed from command line. Used to configure
-  // the modular framework environment.
-  // |session_shell_settings| Settings relevant to session shells. Used to
-  // configure session shells that are launched.
-  // |launcher| Environment service for creating component instances.
-  // |presenter| Service to initialize the presentation.
-  // |device_settings_manager| Service to look-up whether device needs factory
-  // reset.
-  // |on_shutdown| Callback invoked when this basemgr instance is shutdown.
-  explicit BasemgrImpl(
-      const modular::BasemgrSettings& settings,
-      const std::vector<modular::SessionShellSettings>& session_shell_settings,
-      fuchsia::sys::Launcher* const launcher,
-      fuchsia::ui::policy::PresenterPtr presenter,
-      fuchsia::devicesettings::DeviceSettingsManagerPtr device_settings_manager,
-      std::function<void()> on_shutdown);
-
-  ~BasemgrImpl() override;
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::internal::BasemgrDebug> request);
-
- private:
-  void InitializePresentation(
-      fidl::InterfaceHandle<fuchsia::ui::viewsv1token::ViewOwner> view_owner);
-
-  void StartBaseShell();
-
-  FuturePtr<> StopBaseShell();
-
-  FuturePtr<> StopTokenManagerFactoryApp();
-
-  void Start();
-
-  // |fuchsia::modular::BaseShellContext|
-  void GetUserProvider(
-      fidl::InterfaceRequest<fuchsia::modular::UserProvider> request) override;
-
-  // |fuchsia::modular::BaseShellContext|
-  void Shutdown() override;
-
-  // |AuthenticationContextProvider|
-  void GetAuthenticationUIContext(
-      fidl::InterfaceRequest<fuchsia::auth::AuthenticationUIContext> request)
-      override;
-
-  // |UserProviderImpl::Delegate|
-  void DidLogin() override;
-
-  // |UserProviderImpl::Delegate|
-  void DidLogout() override;
-
-  // |UserProviderImpl::Delegate|
-  fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-      GetSessionShellViewOwner(
-          fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>)
-          override;
-
-  // |UserProviderImpl::Delegate|
-  fidl::InterfaceHandle<fuchsia::sys::ServiceProvider>
-      GetSessionShellServiceProvider(
-          fidl::InterfaceHandle<fuchsia::sys::ServiceProvider>) override;
-
-  // |KeyboardCaptureListenerHACK|
-  void OnEvent(fuchsia::ui::input::KeyboardEvent event) override;
-
-  void AddGlobalKeyboardShortcuts(
-      fuchsia::ui::policy::PresentationPtr& presentation);
-
-  void UpdatePresentation(const SessionShellSettings& settings);
-
-  void SwapSessionShell();
-
-  void SetNextShadowTechnique();
-
-  void SetShadowTechnique(fuchsia::ui::gfx::ShadowTechnique shadow_technique);
-
-  void ToggleClipping();
-
-  void ShowSetupOrLogin();
-
-  // Updates the session shell app config to the active session shell. Done once
-  // on initialization and every time the session shells are swapped.
-  void UpdateSessionShellConfig();
-
-  // |BasemgrDebug|
-  void RestartSession() override;
-
-  // |BasemgrDebug|
-  void LoginAsGuest() override;
-
-  const modular::BasemgrSettings& settings_;  // Not owned nor copied.
-  const std::vector<SessionShellSettings>& session_shell_settings_;
-  fuchsia::modular::AppConfig session_shell_config_;
-  // Used to indicate which settings in |session_shell_settings_| is currently
-  // active.
-  std::vector<SessionShellSettings>::size_type
-      active_session_shell_settings_index_{};
-
-  // Used to launch component instances, such as the base shell.
-  fuchsia::sys::Launcher* const launcher_;  // Not owned.
-  // Used to initialize the presentation.
-  fuchsia::ui::policy::PresenterPtr presenter_;
-  // Used to look-up whether device needs a factory reset.
-  fuchsia::devicesettings::DeviceSettingsManagerPtr device_settings_manager_;
-  std::function<void()> on_shutdown_;
-
-  AsyncHolder<UserProviderImpl> user_provider_impl_;
-
-  fidl::BindingSet<fuchsia::modular::internal::BasemgrDebug> basemgr_bindings_;
-  fidl::Binding<fuchsia::modular::BaseShellContext> base_shell_context_binding_;
-  fidl::Binding<fuchsia::auth::AuthenticationContextProvider>
-      authentication_context_provider_binding_;
-
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>>
-      token_manager_factory_app_;
-  fuchsia::auth::TokenManagerFactoryPtr token_manager_factory_;
-
-  bool base_shell_running_{};
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> base_shell_app_;
-  fuchsia::modular::BaseShellPtr base_shell_;
-
-  fidl::BindingSet<fuchsia::ui::policy::KeyboardCaptureListenerHACK>
-      keyboard_capture_listener_bindings_;
-
-  fuchsia::ui::viewsv1token::ViewOwnerPtr session_shell_view_owner_;
-
-  struct {
-    fuchsia::ui::policy::PresentationPtr presentation;
-    fidl::BindingSet<fuchsia::ui::policy::Presentation> bindings;
-
-    fuchsia::ui::gfx::ShadowTechnique shadow_technique =
-        fuchsia::ui::gfx::ShadowTechnique::UNSHADOWED;
-    bool clipping_enabled{};
-  } presentation_state_;
-
-  component::ServiceNamespace service_namespace_;
-
-  enum class State {
-    // normal mode of operation
-    RUNNING,
-    // basemgr is shutting down.
-    SHUTTING_DOWN
-  };
-
-  State state_ = State::RUNNING;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(BasemgrImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_BASEMGR_BASEMGR_IMPL_H_
diff --git a/bin/basemgr/basemgr_settings.cc b/bin/basemgr/basemgr_settings.cc
deleted file mode 100644
index 87472e4..0000000
--- a/bin/basemgr/basemgr_settings.cc
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/basemgr/basemgr_settings.h"
-
-#include <string>
-
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-BasemgrSettings::BasemgrSettings(const fxl::CommandLine& command_line) {
-  base_shell.url = command_line.GetOptionValueWithDefault(
-      "base_shell",
-      "fuchsia-pkg://fuchsia.com/userpicker_base_shell#meta/"
-      "userpicker_base_shell.cmx");
-  story_shell.url = command_line.GetOptionValueWithDefault(
-      "story_shell", "fuchsia-pkg://fuchsia.com/mondrian#meta/mondrian.cmx");
-  sessionmgr.url = command_line.GetOptionValueWithDefault(
-      "sessionmgr", "fuchsia-pkg://fuchsia.com/sessionmgr#meta/sessionmgr.cmx");
-  session_shell.url = command_line.GetOptionValueWithDefault(
-      "session_shell",
-      "fuchsia-pkg://fuchsia.com/ermine_session_shell#meta/"
-      "ermine_session_shell.cmx");
-  account_provider.url = command_line.GetOptionValueWithDefault(
-      "account_provider",
-      "fuchsia-pkg://fuchsia.com/token_manager_factory#meta/"
-      "token_manager_factory.cmx");
-
-  disable_statistics = command_line.HasOption("disable_statistics");
-  no_minfs = command_line.HasOption("no_minfs");
-  test = command_line.HasOption("test");
-  run_base_shell_with_test_runner =
-      command_line.GetOptionValueWithDefault("run_base_shell_with_test_runner",
-                                             "true") == "true"
-          ? true
-          : false;
-  enable_presenter = command_line.HasOption("enable_presenter");
-
-  ParseShellArgs(command_line.GetOptionValueWithDefault("base_shell_args", ""),
-                 &base_shell.args);
-
-  ParseShellArgs(command_line.GetOptionValueWithDefault("story_shell_args", ""),
-                 &story_shell.args);
-
-  ParseShellArgs(command_line.GetOptionValueWithDefault("sessionmgr_args", ""),
-                 &sessionmgr.args);
-
-  ParseShellArgs(
-      command_line.GetOptionValueWithDefault("session_shell_args", ""),
-      &session_shell.args);
-
-  if (test) {
-    if (run_base_shell_with_test_runner) {
-      base_shell.args.push_back("--test");
-    }
-    story_shell.args.push_back("--test");
-    sessionmgr.args.push_back("--test");
-    session_shell.args.push_back("--test");
-    test_name = FindTestName(session_shell.url, session_shell.args);
-    disable_statistics = true;
-    no_minfs = true;
-  }
-}
-
-std::string BasemgrSettings::GetUsage() {
-  return R"USAGE(basemgr
-      --base_shell=BASE_SHELL
-      --base_shell_args=SHELL_ARGS
-      --session_shell=SESSION_SHELL
-      --session_shell_args=SHELL_ARGS
-      --story_shell=STORY_SHELL
-      --story_shell_args=SHELL_ARGS
-      --account_provider=ACCOUNT_PROVIDER
-      --disable_statistics
-      --no_minfs
-      --test
-      --enable_presenter
-    DEVICE_NAME: Name which session shell uses to identify this device.
-    BASE_SHELL:  URL of the base shell to run.
-                Defaults to "userpicker_base_shell".
-                For integration testing use "dev_base_shell".
-    SESSIONMGR: URL of the sessionmgr to run.
-                Defaults to "sessionmgr".
-    SESSION_SHELL: URL of the session shell to run.
-                Defaults to "ermine_session_shell".
-                For integration testing use "dev_session_shell".
-    STORY_SHELL: URL of the story shell to run.
-                Defaults to "mondrian".
-                For integration testing use "dev_story_shell".
-    SHELL_ARGS: Comma separated list of arguments. Backslash escapes comma.
-    ACCOUNT_PROVIDER: URL of the account provider to use.
-                Defaults to "oauth_token_manager".
-                For integration tests use "dev_token_manager".)USAGE";
-}
-
-void BasemgrSettings::ParseShellArgs(const std::string& value,
-                                     fidl::VectorPtr<std::string>* args) {
-  bool escape = false;
-  std::string arg;
-  for (char i : value) {
-    if (escape) {
-      arg.push_back(i);
-      escape = false;
-      continue;
-    }
-
-    if (i == '\\') {
-      escape = true;
-      continue;
-    }
-
-    if (i == ',') {
-      args->push_back(arg);
-      arg.clear();
-      continue;
-    }
-
-    arg.push_back(i);
-  }
-
-  if (!arg.empty()) {
-    args->push_back(arg);
-  }
-}
-
-std::string BasemgrSettings::FindTestName(
-    const fidl::StringPtr& session_shell,
-    const fidl::VectorPtr<std::string>& session_shell_args) {
-  const std::string kRootModule = "--root_module";
-  std::string result = session_shell;
-
-  for (const auto& arg : *session_shell_args) {
-    if (arg.substr(0, kRootModule.size()) == kRootModule) {
-      result = arg.substr(kRootModule.size());
-    }
-  }
-
-  const auto index = result.find_last_of('/');
-  if (index == std::string::npos) {
-    return result;
-  }
-
-  return result.substr(index + 1);
-}
-
-}  // namespace modular
diff --git a/bin/basemgr/basemgr_settings.h b/bin/basemgr/basemgr_settings.h
deleted file mode 100644
index 45333c7..0000000
--- a/bin/basemgr/basemgr_settings.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_BASEMGR_BASEMGR_SETTINGS_H_
-#define PERIDOT_BIN_BASEMGR_BASEMGR_SETTINGS_H_
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-class BasemgrSettings {
- public:
-  explicit BasemgrSettings(const fxl::CommandLine& command_line);
-
-  static std::string GetUsage();
-
-  fuchsia::modular::AppConfig base_shell;
-  fuchsia::modular::AppConfig story_shell;
-  fuchsia::modular::AppConfig sessionmgr;
-  fuchsia::modular::AppConfig session_shell;
-  fuchsia::modular::AppConfig account_provider;
-
-  std::string test_name;
-  bool disable_statistics;
-  bool no_minfs;
-  bool test;
-  bool run_base_shell_with_test_runner;
-  bool enable_presenter;
-
- private:
-  void ParseShellArgs(const std::string& value,
-                      fidl::VectorPtr<std::string>* args);
-
-  // Extract the test name using knowledge of how Modular structures its
-  // command lines for testing.
-  static std::string FindTestName(
-      const fidl::StringPtr& session_shell,
-      const fidl::VectorPtr<std::string>& session_shell_args);
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(BasemgrSettings);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_BASEMGR_BASEMGR_SETTINGS_H_
diff --git a/bin/basemgr/cobalt/BUILD.gn b/bin/basemgr/cobalt/BUILD.gn
deleted file mode 100644
index c1fedf6..0000000
--- a/bin/basemgr/cobalt/BUILD.gn
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/cobalt_config/metrics_registry.gni")
-
-visibility = [
-  "//peridot/bin/basemgr/*",
-  "//peridot/bin/sessionmgr/*",
-]
-
-metrics_registry("basemgr_metrics_registry") {
-  project_id = 101
-}
-
-source_set("cobalt") {
-  sources = [
-    "cobalt.cc",
-    "cobalt.h",
-  ]
-
-  public_deps = [
-    ":basemgr_metrics_registry",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fxl",
-  ]
-
-  deps = [
-    "//garnet/public/lib/backoff",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/cobalt/cpp:cobalt_logger",
-    "//zircon/public/fidl/fuchsia-cobalt",
-  ]
-}
diff --git a/bin/basemgr/cobalt/cobalt.cc b/bin/basemgr/cobalt/cobalt.cc
deleted file mode 100644
index 08c950a..0000000
--- a/bin/basemgr/cobalt/cobalt.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/basemgr/cobalt/cobalt.h"
-
-#include <fuchsia/cobalt/cpp/fidl.h>
-#include <lib/cobalt/cpp/cobalt_logger.h>
-
-namespace modular {
-namespace {
-constexpr char kConfigBinProtoPath[] = "/pkg/data/basemgr_metrics_registry.pb";
-
-cobalt::CobaltLogger* g_cobalt_logger = nullptr;
-
-}  // namespace
-
-fit::deferred_action<fit::closure> InitializeCobalt(
-    async_dispatcher_t* dispatcher, component::StartupContext* context) {
-  FXL_DCHECK(!g_cobalt_logger) << "Cobalt has already been initialized.";
-
-  std::unique_ptr<cobalt::CobaltLogger> cobalt_logger =
-      cobalt::NewCobaltLogger(dispatcher, context, kConfigBinProtoPath);
-
-  g_cobalt_logger = cobalt_logger.get();
-  return fit::defer<fit::closure>([cobalt_logger = std::move(cobalt_logger)] {
-    g_cobalt_logger = nullptr;
-  });
-}
-
-void ReportEvent(ModularEvent event) {
-  if (g_cobalt_logger) {
-    g_cobalt_logger->LogEvent(
-        static_cast<uint32_t>(CobaltMetric::MODULAR_EVENTS),
-        static_cast<uint32_t>(event));
-  }
-}
-
-void ReportModuleLaunchTime(std::string module_url, zx::duration time) {
-  if (g_cobalt_logger) {
-    g_cobalt_logger->LogElapsedTime(
-        static_cast<uint32_t>(CobaltMetric::MODULE_LAUNCH_LATENCY), 0,
-        module_url, time);
-  }
-}
-
-void ReportStoryLaunchTime(zx::duration time) {
-  if (g_cobalt_logger) {
-    g_cobalt_logger->LogElapsedTime(
-        static_cast<uint32_t>(CobaltMetric::STORY_LAUNCH_LATENCY), 0, "", time);
-  }
-}
-
-void ReportSessionAgentEvent(const std::string& url, SessionAgentEvent event) {
-  if (g_cobalt_logger) {
-    g_cobalt_logger->LogEventCount(
-        static_cast<uint32_t>(CobaltMetric::SESSION_AGENT_EVENT),
-        static_cast<uint32_t>(event), url /* component */,
-        zx::duration(0) /* period_duration_micros */, 1 /* count */);
-  }
-}
-
-}  // namespace modular
diff --git a/bin/basemgr/cobalt/cobalt.h b/bin/basemgr/cobalt/cobalt.h
deleted file mode 100644
index b83e934..0000000
--- a/bin/basemgr/cobalt/cobalt.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_BASEMGR_COBALT_COBALT_H_
-#define PERIDOT_BIN_BASEMGR_COBALT_COBALT_H_
-
-#include <lib/async/dispatcher.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-namespace modular {
-
-// Metric IDs that Cobalt requires to identify the data we are logging.
-// These are not events (events are tracked through ModularEvents index metric).
-// For information on datatypes and structure of each of these metrics, see
-// https://cobalt-analytics.googlesource.com/config/+/master/fuchsia/module_usage_tracking/config.yaml
-// Next enum value: 6
-enum class CobaltMetric : uint32_t {
-  MODULE_LAUNCHED = 1,
-  MODULE_PAIRS_IN_STORY = 2,
-  MODULAR_EVENTS = 3,
-  MODULE_LAUNCH_LATENCY = 4,
-  STORY_LAUNCH_LATENCY = 5,
-  SESSION_AGENT_EVENT = 6,
-};
-
-// The events to report.
-// Next enum value: 2
-enum class ModularEvent : uint32_t {
-  BOOTED_TO_BASEMGR = 0,
-  BOOTED_TO_SESSIONMGR = 1,
-};
-
-// The sesssion agent events to report.
-// Next enum value: 2
-enum class SessionAgentEvent : uint32_t {
-  CRASH = 0,
-  CRASH_LIMIT = 1,
-};
-
-// Cobalt initialization. When cobalt is not needed, the returned object must be
-// deleted. This method must not be called again until then.
-fit::deferred_action<fit::closure> InitializeCobalt(
-    async_dispatcher_t* dispatcher, component::StartupContext* context);
-
-// Report a modular event to Cobalt.
-void ReportEvent(ModularEvent event);
-
-// Report a module launch time duration to Cobalt.
-void ReportModuleLaunchTime(std::string module_url, zx::duration time);
-
-// Report a story launch time duration to Cobalt.
-void ReportStoryLaunchTime(zx::duration time);
-
-void ReportSessionAgentEvent(const std::string& url, SessionAgentEvent event);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_BASEMGR_COBALT_COBALT_H_
diff --git a/bin/basemgr/dev_base_shell.cc b/bin/basemgr/dev_base_shell.cc
deleted file mode 100644
index 107ae11..0000000
--- a/bin/basemgr/dev_base_shell.cc
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Implementation of the fuchsia::modular::BaseShell service that passes a
-// command line configurable user name to its fuchsia::modular::UserProvider,
-// and is able to run a story with a single module through its life cycle.
-
-#include <memory>
-#include <utility>
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include "lib/fxl/strings/string_number_conversions.h"
-
-#include "peridot/lib/fidl/single_service_app.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-
-namespace modular {
-
-class Settings {
- public:
-  explicit Settings(const fxl::CommandLine& command_line) {
-    // device_name will be set to the device's hostname if it is empty or null
-    device_name = command_line.GetOptionValueWithDefault("device_name", "");
-
-    // default user is incognito
-    user = command_line.GetOptionValueWithDefault("user", "");
-
-    // If passed, runs as a test harness.
-    test = command_line.HasOption("test");
-
-    test_timeout_ms = testing::kTestTimeoutMilliseconds;
-
-    if (command_line.HasOption("test_timeout_ms")) {
-      std::string test_timeout_ms_string;
-      command_line.GetOptionValue("test_timeout_ms", &test_timeout_ms_string);
-      if (!fxl::StringToNumberWithError<uint64_t>(test_timeout_ms_string,
-                                                  &test_timeout_ms)) {
-        FXL_LOG(WARNING) << "Unable to parse timeout from '"
-                         << test_timeout_ms_string << "'. Setting to default.";
-      }
-    }
-  }
-
-  std::string device_name;
-  std::string user;
-  uint64_t test_timeout_ms;
-  bool test{};
-};
-
-class DevBaseShellApp : modular::SingleServiceApp<fuchsia::modular::BaseShell>,
-                        fuchsia::modular::UserWatcher {
- public:
-  explicit DevBaseShellApp(component::StartupContext* const startup_context,
-                           Settings settings)
-      : SingleServiceApp(startup_context),
-        settings_(std::move(settings)),
-        user_watcher_binding_(this),
-        weak_ptr_factory_(this) {
-    if (settings_.test) {
-      testing::Init(this->startup_context(), __FILE__);
-      testing::Await(testing::kTestShutdown,
-                     [this] { base_shell_context_->Shutdown(); });
-
-      // Start a timer to quit in case a test component misbehaves and hangs. If
-      // we hit the timeout, this is a test failure.
-      async::PostDelayedTask(
-          async_get_default_dispatcher(),
-          callback::MakeScoped(weak_ptr_factory_.GetWeakPtr(),
-                               [this] {
-                                 FXL_LOG(WARNING) << "DevBaseShell timed out";
-                                 testing::Fail("DevBaseShell timed out");
-                                 base_shell_context_->Shutdown();
-                               }),
-          zx::msec(settings_.test_timeout_ms));
-    }
-  }
-
-  ~DevBaseShellApp() override = default;
-
-  // |SingleServiceApp|
-  void Terminate(std::function<void()> done) override {
-    if (settings_.test) {
-      testing::Teardown(done);
-    } else {
-      done();
-    }
-  }
-
- private:
-  // |SingleServiceApp|
-  void CreateView(
-      zx::eventpair view_token,
-      fidl::InterfaceRequest<
-          fuchsia::sys::ServiceProvider> /*incoming_services*/,
-      fidl::InterfaceHandle<
-          fuchsia::sys::ServiceProvider> /*outgoing_services*/) override {
-    view_owner_request_ =
-        fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>(
-            zx::channel(view_token.release()));
-    Connect();
-  }
-
-  // |fuchsia::modular::BaseShell|
-  void Initialize(
-      fidl::InterfaceHandle<fuchsia::modular::BaseShellContext>
-          base_shell_context,
-      fuchsia::modular::BaseShellParams base_shell_params) override {
-    base_shell_context_.Bind(std::move(base_shell_context));
-    base_shell_context_->GetUserProvider(user_provider_.NewRequest());
-
-    Connect();
-  }
-
-  // |fuchsia::modular::BaseShell|
-  void GetAuthenticationUIContext(
-      fidl::InterfaceRequest<
-          fuchsia::auth::AuthenticationUIContext> /*request*/) override {
-    FXL_LOG(INFO)
-        << "fuchsia::modular::BaseShell::GetAuthenticationUIContext() is"
-           " unimplemented.";
-  }
-
-  // |fuchsia::modular::UserWatcher|
-  void OnLogout() override {
-    FXL_LOG(INFO) << "fuchsia::modular::UserWatcher::OnLogout()";
-    base_shell_context_->Shutdown();
-  }
-
-  void Login(const std::string& account_id) {
-    fuchsia::modular::UserLoginParams params;
-    params.account_id = account_id;
-    params.view_owner = std::move(view_owner_request_);
-    params.user_controller = user_controller_.NewRequest();
-    user_provider_->Login(std::move(params));
-    user_controller_->Watch(user_watcher_binding_.NewBinding());
-  }
-
-  void Connect() {
-    if (user_provider_ && view_owner_request_) {
-      if (settings_.user.empty()) {
-        // Incognito mode.
-        Login("");
-        return;
-      }
-
-      user_provider_->PreviousUsers(
-          [this](std::vector<fuchsia::modular::auth::Account> accounts) {
-            FXL_LOG(INFO) << "Found " << accounts.size()
-                          << " users in the user "
-                          << "database";
-
-            // Not running in incognito mode. Add the user if not already
-            // added.
-            std::string account_id;
-            for (const auto& account : accounts) {
-              FXL_LOG(INFO) << "Found user " << account.display_name;
-              if (account.display_name.size() >= settings_.user.size() &&
-                  account.display_name.substr(0, settings_.user.size()) ==
-                      settings_.user) {
-                account_id = account.id;
-                break;
-              }
-            }
-            if (account_id.empty()) {
-              user_provider_->AddUser(
-                  fuchsia::modular::auth::IdentityProvider::DEV,
-                  [this](fuchsia::modular::auth::AccountPtr account,
-                         fidl::StringPtr status) { Login(account->id); });
-            } else {
-              Login(account_id);
-            }
-          });
-    }
-  }
-
-  const Settings settings_;
-  fidl::Binding<fuchsia::modular::UserWatcher> user_watcher_binding_;
-  fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-      view_owner_request_;
-  fuchsia::modular::BaseShellContextPtr base_shell_context_;
-  fuchsia::modular::UserControllerPtr user_controller_;
-  fuchsia::modular::UserProviderPtr user_provider_;
-  fxl::WeakPtrFactory<DevBaseShellApp> weak_ptr_factory_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(DevBaseShellApp);
-};
-
-}  // namespace modular
-
-int main(int argc, const char** argv) {
-  auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  modular::Settings settings(command_line);
-
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AppDriver<modular::DevBaseShellApp> driver(
-      context->outgoing().deprecated_services(),
-      std::make_unique<modular::DevBaseShellApp>(context.get(), settings),
-      [&loop] { loop.Quit(); });
-
-  loop.Run();
-  return 0;
-}
diff --git a/bin/basemgr/main.cc b/bin/basemgr/main.cc
deleted file mode 100644
index f90c384..0000000
--- a/bin/basemgr/main.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-#include <memory>
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/macros.h>
-#include <trace-provider/provider.h>
-
-#include "peridot/bin/basemgr/basemgr_impl.h"
-#include "peridot/bin/basemgr/basemgr_settings.h"
-#include "peridot/bin/basemgr/cobalt/cobalt.h"
-#include "peridot/lib/session_shell_settings/session_shell_settings.h"
-
-fit::deferred_action<fit::closure> SetupCobalt(
-    modular::BasemgrSettings& settings, async_dispatcher_t* dispatcher,
-    component::StartupContext* context) {
-  if (settings.disable_statistics) {
-    return fit::defer<fit::closure>([] {});
-  }
-  return modular::InitializeCobalt(dispatcher, context);
-};
-
-constexpr char kBasemgrDir[] = "basemgr";
-
-int main(int argc, const char** argv) {
-  auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  if (command_line.HasOption("help")) {
-    std::cout << modular::BasemgrSettings::GetUsage() << std::endl;
-    return 0;
-  }
-
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  trace::TraceProvider trace_provider(loop.dispatcher());
-  auto context = std::shared_ptr<component::StartupContext>(
-      component::StartupContext::CreateFromStartupInfo());
-  modular::BasemgrSettings settings(command_line);
-  auto session_shell_settings =
-      modular::SessionShellSettings::GetSystemSettings();
-
-  fit::deferred_action<fit::closure> cobalt_cleanup =
-      SetupCobalt(settings, std::move(loop.dispatcher()), context.get());
-
-  fuchsia::ui::policy::PresenterPtr presenter;
-  context->ConnectToEnvironmentService(presenter.NewRequest());
-  fuchsia::devicesettings::DeviceSettingsManagerPtr device_settings_manager;
-  context->ConnectToEnvironmentService(device_settings_manager.NewRequest());
-
-  modular::BasemgrImpl basemgr(
-      settings, session_shell_settings, context->launcher().get(),
-      std::move(presenter), std::move(device_settings_manager),
-      [&loop, &cobalt_cleanup, &context] {
-        cobalt_cleanup.call();
-        context->outgoing().debug_dir()->RemoveEntry(kBasemgrDir);
-        loop.Quit();
-      });
-  context->outgoing().debug_dir()->AddEntry(
-      kBasemgrDir,
-      fbl::AdoptRef(new fs::Service([&basemgr](zx::channel channel) {
-        fidl::InterfaceRequest<fuchsia::modular::internal::BasemgrDebug>
-            request(std::move(channel));
-        basemgr.Connect(std::move(request));
-        return ZX_OK;
-      })));
-
-  loop.Run();
-
-  return 0;
-}
diff --git a/bin/basemgr/meta/basemgr.cmx b/bin/basemgr/meta/basemgr.cmx
deleted file mode 100644
index 445be71..0000000
--- a/bin/basemgr/meta/basemgr.cmx
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [
-            "persistent-storage"
-        ],
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.devicesettings.DeviceSettingsManager",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.sys.Launcher",
-            "fuchsia.tracelink.Registry"
-        ],
-        "system": [
-            "data/sysui"
-        ]
-    }
-}
diff --git a/bin/basemgr/meta/dev_base_shell.cmx b/bin/basemgr/meta/dev_base_shell.cmx
deleted file mode 100644
index 3861977..0000000
--- a/bin/basemgr/meta/dev_base_shell.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [
-            "persistent-storage"
-        ],
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.sys.Launcher",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager"
-        ],
-        "system": [
-            "data/sysui"
-        ]
-    }
-}
diff --git a/bin/basemgr/user_controller_impl.cc b/bin/basemgr/user_controller_impl.cc
deleted file mode 100644
index 1dc48d9..0000000
--- a/bin/basemgr/user_controller_impl.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/basemgr/user_controller_impl.h"
-
-#include <memory>
-#include <utility>
-
-#include <lib/fidl/cpp/synchronous_interface_ptr.h>
-
-#include "peridot/lib/common/async_holder.h"
-#include "peridot/lib/common/names.h"
-#include "peridot/lib/common/teardown.h"
-#include "peridot/lib/fidl/array_to_string.h"
-
-namespace modular {
-
-UserControllerImpl::UserControllerImpl(
-    fuchsia::sys::Launcher* const launcher,
-    fuchsia::modular::AppConfig sessionmgr,
-    fuchsia::modular::AppConfig session_shell,
-    fuchsia::modular::AppConfig story_shell,
-    fidl::InterfaceHandle<fuchsia::auth::TokenManager> ledger_token_manager,
-    fidl::InterfaceHandle<fuchsia::auth::TokenManager> agent_token_manager,
-    fuchsia::modular::auth::AccountPtr account,
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-        view_owner_request,
-    fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> base_shell_services,
-    fidl::InterfaceRequest<fuchsia::modular::UserController>
-        user_controller_request,
-    DoneCallback done)
-    : user_context_binding_(this),
-      user_controller_binding_(this, std::move(user_controller_request)),
-      base_shell_services_(base_shell_services ? base_shell_services.Bind()
-                                               : nullptr),
-      done_(std::move(done)) {
-  // 0. Generate the path to map '/data' for the sessionmgr we are starting.
-  std::string data_origin;
-  if (!account) {
-    // Guest user.
-    // Generate a random number to be used in this case.
-    uint32_t random_number = 0;
-    zx_cprng_draw(&random_number, sizeof random_number);
-    data_origin = std::string("/data/modular/USER_GUEST_") +
-                  std::to_string(random_number);
-  } else {
-    // Non-guest user.
-    data_origin = std::string("/data/modular/USER_") + std::string(account->id);
-  }
-
-  FXL_LOG(INFO) << "SESSIONMGR DATA ORIGIN IS " << data_origin;
-
-  // 1. Launch Sessionmgr in the current environment.
-  sessionmgr_app_ = std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
-      launcher, std::move(sessionmgr), data_origin);
-
-  // 2. Initialize the Sessionmgr service.
-  sessionmgr_app_->services().ConnectToService(sessionmgr_.NewRequest());
-  sessionmgr_->Initialize(
-      std::move(account), std::move(session_shell), std::move(story_shell),
-      std::move(ledger_token_manager), std::move(agent_token_manager),
-      user_context_binding_.NewBinding(), std::move(view_owner_request));
-
-  sessionmgr_app_->SetAppErrorHandler([this] {
-    FXL_LOG(ERROR) << "Sessionmgr seems to have crashed unexpectedly. "
-                   << "Calling done_().";
-    // This prevents us from receiving any further requests.
-    user_controller_binding_.Unbind();
-    user_context_binding_.Unbind();
-    // Logout(), which expects a graceful shutdown of sessionmgr, does not
-    // apply here because sessionmgr crashed. Just run |done_| directly.
-    done_(this);
-  });
-}
-
-// |fuchsia::modular::UserController|
-void UserControllerImpl::Logout(LogoutCallback done) {
-  FXL_LOG(INFO) << "fuchsia::modular::UserController::Logout()";
-  logout_response_callbacks_.push_back(done);
-  if (logout_response_callbacks_.size() > 1) {
-    return;
-  }
-
-  // This should prevent us from receiving any further requests.
-  user_controller_binding_.Unbind();
-  user_context_binding_.Unbind();
-
-  sessionmgr_app_->Teardown(kSessionmgrTimeout, [this] {
-    for (const auto& done : logout_response_callbacks_) {
-      done();
-    }
-    // We announce |OnLogout| only at point just before deleting ourselves,
-    // so we can avoid any race conditions that may be triggered by |Shutdown|
-    // (which in-turn will call this |Logout| since we have not completed yet).
-    for (auto& watcher : user_watchers_.ptrs()) {
-      (*watcher)->OnLogout();
-    }
-    done_(this);
-  });
-}
-
-// |UserContext|
-void UserControllerImpl::GetPresentation(
-    fidl::InterfaceRequest<fuchsia::ui::policy::Presentation> request) {
-  if (base_shell_services_) {
-    base_shell_services_->ConnectToService(kPresentationService,
-                                           request.TakeChannel());
-  }
-}
-
-FuturePtr<> UserControllerImpl::SwapSessionShell(
-    fuchsia::modular::AppConfig session_shell_config) {
-  auto future = Future<>::Create("SwapSessionShell");
-  SwapSessionShell(std::move(session_shell_config), future->Completer());
-  return future;
-}
-
-// |fuchsia::modular::UserController|
-void UserControllerImpl::SwapSessionShell(
-    fuchsia::modular::AppConfig session_shell_config,
-    SwapSessionShellCallback callback) {
-  sessionmgr_->SwapSessionShell(std::move(session_shell_config), callback);
-}
-
-// |fuchsia::modular::UserController|
-void UserControllerImpl::Watch(
-    fidl::InterfaceHandle<fuchsia::modular::UserWatcher> watcher) {
-  user_watchers_.AddInterfacePtr(watcher.Bind());
-}
-
-// |UserContext|
-// TODO(alhaad): Reconcile UserContext.Logout() and UserControllerImpl.Logout().
-void UserControllerImpl::Logout() {
-  FXL_LOG(INFO) << "UserContext::Logout()";
-  Logout([] {});
-}
-
-}  // namespace modular
diff --git a/bin/basemgr/user_controller_impl.h b/bin/basemgr/user_controller_impl.h
deleted file mode 100644
index 1af0f6a..0000000
--- a/bin/basemgr/user_controller_impl.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_BASEMGR_USER_CONTROLLER_IMPL_H_
-#define PERIDOT_BIN_BASEMGR_USER_CONTROLLER_IMPL_H_
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <fuchsia/modular/auth/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/modular/internal/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/policy/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/async/cpp/future.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/fidl/app_client.h"
-#include "peridot/lib/fidl/environment.h"
-
-namespace modular {
-
-// |UserControllerImpl| starts and manages a Sessionmgr. The life time of a
-// Sessionmgr is bound to this class.  |UserControllerImpl| is not self-owned,
-// but still drives its own deletion: On logout, it signals its
-// owner (BasemgrImpl) to delete it.
-class UserControllerImpl : fuchsia::modular::UserController,
-                           fuchsia::modular::internal::UserContext {
- public:
-  // After perfoming logout, to signal our completion (and deletion of our
-  // instance) to our owner, we do it using a callback supplied to us in our
-  // constructor. (The alternative is to take in a BasemgrImpl*, which seems
-  // a little specific and overscoped).
-  using DoneCallback = std::function<void(UserControllerImpl*)>;
-
-  UserControllerImpl(
-      fuchsia::sys::Launcher* const launcher,
-      fuchsia::modular::AppConfig sessionmgr,
-      fuchsia::modular::AppConfig session_shell,
-      fuchsia::modular::AppConfig story_shell,
-      fidl::InterfaceHandle<fuchsia::auth::TokenManager> ledger_token_manager,
-      fidl::InterfaceHandle<fuchsia::auth::TokenManager> agent_token_manager,
-      fuchsia::modular::auth::AccountPtr account,
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-          view_owner_request,
-      fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> base_shell_services,
-      fidl::InterfaceRequest<fuchsia::modular::UserController>
-          user_controller_request,
-      DoneCallback done);
-
-  // This will effectively tear down the entire instance by calling |done|.
-  // |fuchsia::modular::UserController|
-  void Logout(LogoutCallback done) override;
-
-  // Stops the active session shell, and starts the session shell specified in
-  // |session_shell_config|.
-  FuturePtr<> SwapSessionShell(
-      fuchsia::modular::AppConfig session_shell_config);
-
- private:
-  // |fuchsia::modular::UserController|
-  void SwapSessionShell(fuchsia::modular::AppConfig session_shell_config,
-                        SwapSessionShellCallback callback) override;
-
-  // |fuchsia::modular::UserController|
-  void Watch(
-      fidl::InterfaceHandle<fuchsia::modular::UserWatcher> watcher) override;
-
-  // |UserContext|
-  void Logout() override;
-
-  // |UserContext|
-  void GetPresentation(fidl::InterfaceRequest<fuchsia::ui::policy::Presentation>
-                           request) override;
-
-  std::unique_ptr<Environment> sessionmgr_environment_;
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> sessionmgr_app_;
-  fuchsia::modular::internal::SessionmgrPtr sessionmgr_;
-
-  fidl::Binding<fuchsia::modular::internal::UserContext> user_context_binding_;
-  fidl::Binding<fuchsia::modular::UserController> user_controller_binding_;
-
-  fidl::InterfacePtrSet<fuchsia::modular::UserWatcher> user_watchers_;
-
-  std::vector<LogoutCallback> logout_response_callbacks_;
-
-  fuchsia::sys::ServiceProviderPtr base_shell_services_;
-
-  DoneCallback done_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(UserControllerImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_BASEMGR_USER_CONTROLLER_IMPL_H_
diff --git a/bin/basemgr/user_controller_impl_unittest.cc b/bin/basemgr/user_controller_impl_unittest.cc
deleted file mode 100644
index ff99304..0000000
--- a/bin/basemgr/user_controller_impl_unittest.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/basemgr/user_controller_impl.h"
-
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/component/cpp/testing/fake_launcher.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/lib/fidl/clone.h"
-
-namespace modular {
-namespace testing {
-namespace {
-
-using ::component::testing::FakeLauncher;
-using UserControllerImplTest = gtest::TestLoopFixture;
-
-TEST_F(UserControllerImplTest, StartSessionmgrWithTokenManagers) {
-  FakeLauncher launcher;
-  std::string url = "test_url_string";
-  fuchsia::modular::AppConfig app_config;
-  app_config.url = url;
-
-  bool callback_called = false;
-  launcher.RegisterComponent(
-      url, [&callback_called](
-               fuchsia::sys::LaunchInfo launch_info,
-               fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl) {
-        callback_called = true;
-      });
-
-  fuchsia::auth::TokenManagerPtr ledger_token_manager;
-  fuchsia::auth::TokenManagerPtr agent_token_manager;
-  fuchsia::modular::UserControllerPtr user_controller;
-
-  UserControllerImpl impl(
-      &launcher, CloneStruct(app_config), CloneStruct(app_config),
-      CloneStruct(app_config), std::move(ledger_token_manager),
-      std::move(agent_token_manager), nullptr /* account */,
-      nullptr /* view_owner_request */, nullptr /* base_shell_services */,
-      user_controller.NewRequest(), nullptr /* done_callback */);
-
-  EXPECT_TRUE(callback_called);
-}
-
-TEST_F(UserControllerImplTest, SessionmgrCrashInvokesDoneCallback) {
-  // Program the fake launcher to drop the CreateComponent request such that
-  // the error handler of the sessionmgr_app is invoked. This should invoke the
-  // done_callback.
-  FakeLauncher launcher;
-  std::string url = "test_url_string";
-  fuchsia::modular::AppConfig app_config;
-  app_config.url = url;
-
-  launcher.RegisterComponent(
-      url, [](fuchsia::sys::LaunchInfo launch_info,
-              fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl) {
-        return;
-      });
-
-  fuchsia::auth::TokenManagerPtr ledger_token_manager;
-  fuchsia::auth::TokenManagerPtr agent_token_manager;
-  fuchsia::modular::UserControllerPtr user_controller;
-
-  bool done_callback_called = false;
-  UserControllerImpl impl(
-      &launcher, CloneStruct(app_config), CloneStruct(app_config),
-      CloneStruct(app_config), std::move(ledger_token_manager),
-      std::move(agent_token_manager), nullptr /* account */,
-      nullptr /* view_owner_request */, nullptr /* base_shell_services */,
-      user_controller.NewRequest(),
-      /* done_callback = */ [&done_callback_called](UserControllerImpl*) {
-        done_callback_called = true;
-      });
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(done_callback_called);
-}
-}  // namespace
-}  // namespace testing
-}  // namespace modular
diff --git a/bin/basemgr/user_provider_impl.cc b/bin/basemgr/user_provider_impl.cc
deleted file mode 100644
index af311fd..0000000
--- a/bin/basemgr/user_provider_impl.cc
+++ /dev/null
@@ -1,556 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/basemgr/user_provider_impl.h"
-
-#include <utility>
-
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/files/path.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "peridot/bin/basemgr/users_generated.h"
-#include "peridot/lib/common/xdr.h"
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/fidl/json_xdr.h"
-
-namespace modular {
-
-namespace {
-
-constexpr char kUsersConfigurationFile[] = "/data/modular/users-v5.db";
-
-// Url of the application launching token manager
-constexpr char kUserProviderAppUrl[] = "user_provider_url";
-
-// Dev auth provider configuration
-constexpr char kDevAuthProviderType[] = "dev";
-constexpr char kDevAuthProviderUrl[] =
-    "fuchsia-pkg://fuchsia.com/dev_auth_provider#meta/"
-    "dev_auth_provider.cmx";
-
-// Google auth provider configuration
-constexpr char kGoogleAuthProviderType[] = "google";
-constexpr char kGoogleAuthProviderUrl[] =
-    "fuchsia-pkg://fuchsia.com/google_auth_provider#meta/"
-    "google_auth_provider.cmx";
-
-fuchsia::modular::auth::AccountPtr Convert(
-    const fuchsia::modular::UserStorage* const user) {
-  FXL_DCHECK(user);
-  auto account = fuchsia::modular::auth::Account::New();
-  account->id = user->id()->str();
-  switch (user->identity_provider()) {
-    case fuchsia::modular::IdentityProvider_DEV:
-      account->identity_provider =
-          fuchsia::modular::auth::IdentityProvider::DEV;
-      break;
-    case fuchsia::modular::IdentityProvider_GOOGLE:
-      account->identity_provider =
-          fuchsia::modular::auth::IdentityProvider::GOOGLE;
-      break;
-    default:
-      FXL_DCHECK(false) << "Unrecognized IdentityProvider"
-                        << user->identity_provider();
-  }
-
-  account->display_name = user->display_name()->str();
-  account->url = user->profile_url()->str();
-  account->image_url = user->image_url()->str();
-
-  if (flatbuffers::IsFieldPresent(
-          user, fuchsia::modular::UserStorage::VT_PROFILE_ID)) {
-    account->profile_id = user->profile_id()->str();
-  } else {
-    account->profile_id = "";
-  }
-  return account;
-}
-
-std::string GetRandomId() {
-  uint32_t random_number = 0;
-  zx_cprng_draw(&random_number, sizeof random_number);
-  return std::to_string(random_number);
-}
-
-// Returns the corresponding |auth_provider_type| string that maps to
-// |fuchsia::modular::auth::IdentityProvider| value.
-// TODO(ukode): Convert enum |fuchsia::modular::auth::IdentityProvider| to
-// fidl::String datatype to make it consistent in the future.
-std::string MapIdentityProviderToAuthProviderType(
-    const fuchsia::modular::auth::IdentityProvider idp) {
-  switch (idp) {
-    case fuchsia::modular::auth::IdentityProvider::DEV:
-      return kDevAuthProviderType;
-    case fuchsia::modular::auth::IdentityProvider::GOOGLE:
-      return kGoogleAuthProviderType;
-  }
-  FXL_DCHECK(false) << "Unrecognized IDP.";
-}
-
-// Returns a list of supported auth provider configurations that includes the
-// type, startup parameters and the url of the auth provider component.
-// TODO(ukode): This list will be derived from a config package in the future.
-std::vector<fuchsia::auth::AuthProviderConfig> GetAuthProviderConfigs() {
-  fuchsia::auth::AuthProviderConfig dev_auth_provider_config;
-  dev_auth_provider_config.auth_provider_type = kDevAuthProviderType;
-  dev_auth_provider_config.url = kDevAuthProviderUrl;
-
-  fuchsia::auth::AuthProviderConfig google_auth_provider_config;
-  google_auth_provider_config.auth_provider_type = kGoogleAuthProviderType;
-  google_auth_provider_config.url = kGoogleAuthProviderUrl;
-
-  std::vector<fuchsia::auth::AuthProviderConfig> auth_provider_configs;
-  auth_provider_configs.push_back(std::move(google_auth_provider_config));
-  auth_provider_configs.push_back(std::move(dev_auth_provider_config));
-
-  return auth_provider_configs;
-}
-
-}  // namespace
-
-UserProviderImpl::UserProviderImpl(
-    fuchsia::sys::Launcher* const launcher,
-    const fuchsia::modular::AppConfig& sessionmgr,
-    const fuchsia::modular::AppConfig& session_shell,
-    const fuchsia::modular::AppConfig& story_shell,
-    fuchsia::auth::TokenManagerFactory* token_manager_factory,
-    fuchsia::auth::AuthenticationContextProviderPtr
-        authentication_context_provider,
-    Delegate* const delegate)
-    : launcher_(launcher),
-      sessionmgr_(sessionmgr),
-      session_shell_(session_shell),
-      story_shell_(story_shell),
-      token_manager_factory_(token_manager_factory),
-      authentication_context_provider_(
-          std::move(authentication_context_provider)),
-      delegate_(delegate),
-      authentication_context_provider_binding_(this) {
-  FXL_DCHECK(delegate);
-  FXL_DCHECK(authentication_context_provider_);
-
-  authentication_context_provider_binding_.set_error_handler(
-      [this](zx_status_t status) {
-        FXL_LOG(WARNING) << "AuthenticationContextProvider disconnected.";
-        authentication_context_provider_binding_.Unbind();
-      });
-
-  // There might not be a file of users persisted. If config file doesn't
-  // exist, move forward with no previous users.
-  // TODO(alhaad): Use JSON instead of flatbuffers for better inspectablity.
-  if (files::IsFile(kUsersConfigurationFile)) {
-    std::string serialized_users;
-    if (!files::ReadFileToString(kUsersConfigurationFile, &serialized_users)) {
-      // Unable to read file. Bailing out.
-      FXL_LOG(ERROR) << "Unable to read user configuration file at: "
-                     << kUsersConfigurationFile;
-      return;
-    }
-
-    if (!Parse(serialized_users)) {
-      return;
-    }
-  }
-}
-
-void UserProviderImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::UserProvider> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void UserProviderImpl::Teardown(const std::function<void()>& callback) {
-  if (user_controllers_.empty()) {
-    callback();
-    return;
-  }
-
-  for (auto& it : user_controllers_) {
-    auto cont = [this, ptr = it.first, callback] {
-      // This is okay because during teardown, |cont| is never invoked
-      // asynchronously.
-      user_controllers_.erase(ptr);
-
-      if (!user_controllers_.empty()) {
-        // Not the last callback.
-        return;
-      }
-
-      callback();
-    };
-
-    it.second->Logout(cont);
-  }
-}
-
-void UserProviderImpl::Login(fuchsia::modular::UserLoginParams params) {
-  // If requested, run in incognito mode.
-  if (params.account_id.is_null() || params.account_id == "") {
-    FXL_LOG(INFO) << "fuchsia::modular::UserProvider::Login() Incognito mode";
-    LoginInternal(nullptr /* account */, std::move(params));
-    return;
-  }
-
-  // If not running in incognito mode, a corresponding entry must be present
-  // in the users database.
-  const fuchsia::modular::UserStorage* found_user = nullptr;
-  if (users_storage_) {
-    for (const auto* user : *users_storage_->users()) {
-      if (user->id()->str() == params.account_id) {
-        found_user = user;
-        break;
-      }
-    }
-  }
-
-  // If an entry is not found, we drop the incoming requests on the floor.
-  if (!found_user) {
-    FXL_LOG(INFO) << "The requested user was not found in the users database"
-                  << "It needs to be added first via "
-                     "fuchsia::modular::UserProvider::AddUser().";
-    return;
-  }
-
-  LoginInternal(Convert(found_user), std::move(params));
-}
-
-void UserProviderImpl::PreviousUsers(PreviousUsersCallback callback) {
-  fidl::VectorPtr<fuchsia::modular::auth::Account> accounts;
-  accounts.resize(0);
-  if (users_storage_) {
-    for (const auto* user : *users_storage_->users()) {
-      accounts.push_back(*Convert(user));
-    }
-  }
-  callback(std::move(accounts));
-}
-
-void UserProviderImpl::AddUser(
-    fuchsia::modular::auth::IdentityProvider identity_provider,
-    AddUserCallback callback) {
-  FXL_DCHECK(token_manager_factory_);
-
-  // Creating a new user, the initial bootstrapping will be done by
-  // AccountManager in the future. For now, create an account_id that
-  // uniquely maps to a token manager instance at runtime.
-  const std::string& account_id = GetRandomId();
-  fuchsia::auth::TokenManagerPtr token_manager;
-  token_manager = CreateTokenManager(account_id);
-
-  // TODO(ukode): Fuchsia mod configuration that is requesting OAuth tokens.
-  // This includes OAuth client specific details such as client id, secret,
-  // list of scopes etc. These could be supplied by a config package in the
-  // future.
-  fuchsia::auth::AppConfig fuchsia_app_config;
-  fuchsia_app_config.auth_provider_type =
-      MapIdentityProviderToAuthProviderType(identity_provider);
-  std::vector<std::string> scopes;
-  token_manager->Authorize(
-      std::move(fuchsia_app_config), nullptr, std::move(scopes), "", "",
-      [this, identity_provider, account_id,
-       token_manager = std::move(token_manager),
-       callback](fuchsia::auth::Status status,
-                 fuchsia::auth::UserProfileInfoPtr user_profile_info) {
-        if (status != fuchsia::auth::Status::OK) {
-          FXL_LOG(ERROR) << "Authorize() call returned error for user: "
-                         << account_id;
-          callback(nullptr, "Failed to authorize user");
-          return;
-        }
-
-        if (!user_profile_info) {
-          FXL_LOG(ERROR) << "Authorize() call returned empty user profile";
-          callback(nullptr,
-                   "Empty user profile info returned by auth_provider");
-          return;
-        }
-
-        auto account = fuchsia::modular::auth::Account::New();
-        account->id = account_id;
-        account->identity_provider = identity_provider;
-        account->profile_id = user_profile_info->id;
-        account->display_name = user_profile_info->display_name.is_null()
-                                    ? ""
-                                    : user_profile_info->display_name;
-        account->url =
-            user_profile_info->url.is_null() ? "" : user_profile_info->url;
-        account->image_url = user_profile_info->image_url.is_null()
-                                 ? ""
-                                 : user_profile_info->image_url;
-
-        std::string error;
-        if (!AddUserToAccountsDB(account.get(), &error)) {
-          FXL_LOG(ERROR) << "Failed to add user: " << account_id
-                         << ", to the accounts database:" << error;
-          callback(nullptr, error);
-          return;
-        }
-
-        FXL_DLOG(INFO) << "Successfully added user: " << account_id;
-        callback(std::move(account), "");
-      });
-}
-
-void UserProviderImpl::RemoveUser(std::string account_id,
-                                  RemoveUserCallback callback) {
-  fuchsia::modular::auth::AccountPtr account;
-  if (users_storage_) {
-    for (const auto* user : *users_storage_->users()) {
-      if (user->id()->str() == account_id) {
-        account = Convert(user);
-      }
-    }
-  }
-
-  if (!account) {
-    callback("User not found.");
-    return;
-  }
-
-  RemoveUserInternal(std::move(account), std::move(callback));
-}
-
-bool UserProviderImpl::AddUserToAccountsDB(
-    const fuchsia::modular::auth::Account* account, std::string* error) {
-  FXL_DCHECK(account);
-
-  flatbuffers::FlatBufferBuilder builder;
-  std::vector<flatbuffers::Offset<fuchsia::modular::UserStorage>> users;
-
-  // Reserialize existing users.
-  if (users_storage_) {
-    for (const auto* user : *(users_storage_->users())) {
-      users.push_back(fuchsia::modular::CreateUserStorage(
-          builder, builder.CreateString(user->id()), user->identity_provider(),
-          builder.CreateString(user->display_name()),
-          builder.CreateString(user->profile_url()),
-          builder.CreateString(user->image_url()),
-          builder.CreateString(user->profile_id())));
-    }
-  }
-
-  auto account_identity_provider = account->identity_provider;
-  auto flatbuffer_identity_provider = [account_identity_provider]() {
-    switch (account_identity_provider) {
-      case fuchsia::modular::auth::IdentityProvider::DEV:
-        return fuchsia::modular::IdentityProvider::IdentityProvider_DEV;
-      case fuchsia::modular::auth::IdentityProvider::GOOGLE:
-        return fuchsia::modular::IdentityProvider::IdentityProvider_GOOGLE;
-    }
-    FXL_DCHECK(false) << "Unrecognized IDP.";
-    // TODO(ukode): Move |UserStorage::identity_provider| to string
-    // datatype. Use DEV identity provider as default in the interim.
-    return fuchsia::modular::IdentityProvider::IdentityProvider_DEV;
-  }();
-
-  // Add new user
-  users.push_back(fuchsia::modular::CreateUserStorage(
-      builder, builder.CreateString(account->id), flatbuffer_identity_provider,
-      builder.CreateString(account->display_name),
-      builder.CreateString(account->url),
-      builder.CreateString(account->image_url),
-      builder.CreateString(account->profile_id)));
-
-  // Write user info to disk
-  builder.Finish(fuchsia::modular::CreateUsersStorage(
-      builder, builder.CreateVector(users)));
-  std::string new_serialized_users = std::string(
-      reinterpret_cast<const char*>(builder.GetCurrentBufferPointer()),
-      builder.GetSize());
-
-  return WriteUsersDb(new_serialized_users, error);
-}
-
-void UserProviderImpl::RemoveUserInternal(
-    fuchsia::modular::auth::AccountPtr account, RemoveUserCallback callback) {
-  FXL_DCHECK(account);
-  auto account_id = account->id;
-
-  FXL_DLOG(INFO) << "Invoking DeleteAllTokens() for user:" << account_id;
-
-  auto token_manager = CreateTokenManager(account_id);
-
-  // TODO(ukode): Delete tokens for all the supported auth provider configs just
-  // not Google. This will be replaced by AccountManager::RemoveUser api in the
-  // future.
-  fuchsia::auth::AppConfig fuchsia_app_config;
-  fuchsia_app_config.auth_provider_type = kGoogleAuthProviderType;
-  token_manager->DeleteAllTokens(
-      fuchsia_app_config, account->profile_id,
-      [this, account_id, token_manager = std::move(token_manager),
-       callback](fuchsia::auth::Status status) {
-        if (status != fuchsia::auth::Status::OK) {
-          FXL_LOG(ERROR) << "Token Manager Authorize() call returned error";
-          callback("Unable to remove user");
-          return;
-        }
-
-        std::string error;
-        if (!RemoveUserFromAccountsDB(account_id, &error)) {
-          FXL_LOG(ERROR) << "Error in updating user database: " << error;
-          callback(error);
-          return;
-        }
-
-        callback("");  // success
-      });
-}
-
-// Update user storage after deleting user credentials.
-bool UserProviderImpl::RemoveUserFromAccountsDB(fidl::StringPtr account_id,
-                                                std::string* error) {
-  FXL_DCHECK(account_id);
-  FXL_DCHECK(error);
-
-  flatbuffers::FlatBufferBuilder builder;
-  std::vector<flatbuffers::Offset<fuchsia::modular::UserStorage>> users;
-  for (const auto* user : *(users_storage_->users())) {
-    if (user->id()->str() == account_id) {
-      // TODO(alhaad): We need to delete the local ledger data for a user
-      // who has been removed. Re-visit this when sandboxing the user
-      // runner.
-      continue;
-    }
-
-    users.push_back(fuchsia::modular::CreateUserStorage(
-        builder, builder.CreateString(user->id()), user->identity_provider(),
-        builder.CreateString(user->display_name()),
-        builder.CreateString(user->profile_url()),
-        builder.CreateString(user->image_url()),
-        builder.CreateString(user->profile_id())));
-  }
-
-  builder.Finish(fuchsia::modular::CreateUsersStorage(
-      builder, builder.CreateVector(users)));
-  std::string new_serialized_users = std::string(
-      reinterpret_cast<const char*>(builder.GetCurrentBufferPointer()),
-      builder.GetSize());
-
-  return WriteUsersDb(new_serialized_users, error);
-}
-
-void UserProviderImpl::GetAuthenticationUIContext(
-    fidl::InterfaceRequest<fuchsia::auth::AuthenticationUIContext> request) {
-  authentication_context_provider_->GetAuthenticationUIContext(
-      std::move(request));
-}
-
-fuchsia::auth::TokenManagerPtr UserProviderImpl::CreateTokenManager(
-    std::string account_id) {
-  FXL_DCHECK(token_manager_factory_);
-
-  fuchsia::auth::TokenManagerPtr token_mgr;
-  token_manager_factory_->GetTokenManager(
-      account_id, kUserProviderAppUrl, GetAuthProviderConfigs(),
-      authentication_context_provider_binding_.NewBinding(),
-      token_mgr.NewRequest());
-
-  token_mgr.set_error_handler([this, account_id](zx_status_t status) {
-    FXL_LOG(INFO) << "Token Manager for account:" << account_id
-                  << " disconnected";
-  });
-
-  return token_mgr;
-}
-
-bool UserProviderImpl::WriteUsersDb(const std::string& serialized_users,
-                                    std::string* const error) {
-  if (!Parse(serialized_users)) {
-    *error = "The user database seems corrupted.";
-    return false;
-  }
-
-  // Save users to disk.
-  if (!files::CreateDirectory(
-          files::GetDirectoryName(kUsersConfigurationFile))) {
-    *error = "Unable to create directory.";
-    return false;
-  }
-  if (!files::WriteFile(kUsersConfigurationFile, serialized_users.data(),
-                        serialized_users.size())) {
-    *error = "Unable to write file.";
-    return false;
-  }
-  return true;
-}
-
-bool UserProviderImpl::Parse(const std::string& serialized_users) {
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(serialized_users.data()),
-      serialized_users.size());
-  if (!fuchsia::modular::VerifyUsersStorageBuffer(verifier)) {
-    FXL_LOG(ERROR) << "Unable to verify storage buffer.";
-    return false;
-  }
-  serialized_users_ = serialized_users;
-  users_storage_ = fuchsia::modular::GetUsersStorage(serialized_users_.data());
-  return true;
-}
-
-void UserProviderImpl::LoginInternal(fuchsia::modular::auth::AccountPtr account,
-                                     fuchsia::modular::UserLoginParams params) {
-  auto account_id = account ? account->id : GetRandomId();
-  FXL_DLOG(INFO) << "Login() User:" << account_id;
-
-  // Instead of passing token_manager_factory all the way to agents and
-  // runners with all auth provider configurations, send two
-  // |fuchsia::auth::TokenManager| handles, one for ledger and one for agents
-  // for the given user account |account_id|.
-  fuchsia::auth::TokenManagerPtr ledger_token_manager =
-      CreateTokenManager(account_id);
-  fuchsia::auth::TokenManagerPtr agent_token_manager =
-      CreateTokenManager(account_id);
-
-  auto view_owner =
-      delegate_->GetSessionShellViewOwner(std::move(params.view_owner));
-  auto service_provider =
-      delegate_->GetSessionShellServiceProvider(std::move(params.services));
-
-  auto controller = std::make_unique<UserControllerImpl>(
-      launcher_, CloneStruct(sessionmgr_), CloneStruct(session_shell_),
-      CloneStruct(story_shell_), std::move(ledger_token_manager),
-      std::move(agent_token_manager), std::move(account), std::move(view_owner),
-      std::move(service_provider), std::move(params.user_controller),
-      [this](UserControllerImpl* c) {
-        user_controllers_.erase(c);
-        delegate_->DidLogout();
-      });
-  auto controller_ptr = controller.get();
-  user_controllers_[controller_ptr] = std::move(controller);
-
-  delegate_->DidLogin();
-}
-
-FuturePtr<> UserProviderImpl::SwapSessionShell(
-    fuchsia::modular::AppConfig session_shell_config) {
-  if (user_controllers_.size() == 0)
-    return Future<>::CreateCompleted("SwapSessionShell(Completed)");
-
-  FXL_CHECK(user_controllers_.size() == 1)
-      << user_controllers_.size()
-      << " user controllers exist, which should be impossible.";
-
-  auto user_controller = user_controllers_.begin()->first;
-  return user_controller->SwapSessionShell(std::move(session_shell_config));
-}
-
-void UserProviderImpl::RestartSession() {
-  // Callback to log the user back in if login is not automatic
-  auto login = [this] {
-    if (user_controllers_.size() < 1 && users_storage_) {
-      auto account = Convert(users_storage_->users()->Get(0));
-
-      fuchsia::modular::UserLoginParams params;
-      params.account_id = account->id;
-      Login(std::move(params));
-    }
-  };
-
-  // Log the user out to shut down sessionmgr
-  user_controllers_.begin()->first->Logout(login);
-}
-
-}  // namespace modular
diff --git a/bin/basemgr/user_provider_impl.h b/bin/basemgr/user_provider_impl.h
deleted file mode 100644
index 11b31b3..0000000
--- a/bin/basemgr/user_provider_impl.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_BASEMGR_USER_PROVIDER_IMPL_H_
-#define PERIDOT_BIN_BASEMGR_USER_PROVIDER_IMPL_H_
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <fuchsia/modular/auth/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/future.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-
-#include "peridot/bin/basemgr/user_controller_impl.h"
-
-namespace fuchsia {
-namespace modular {
-struct UsersStorage;
-}
-}  // namespace fuchsia
-
-namespace modular {
-
-class UserProviderImpl : fuchsia::auth::AuthenticationContextProvider,
-                         fuchsia::modular::UserProvider {
- public:
-  // Users of UserProviderImpl must register a Delegate object.
-  class Delegate {
-   public:
-    // Called after UserProviderImpl successfully logs in a user.
-    virtual void DidLogin() = 0;
-
-    // Called after UserProviderImpl successfully logs out a user.
-    virtual void DidLogout() = 0;
-
-    // Enables the delegate to intercept the session shell's view owner, so that
-    // e.g. the delegate can embed it in a parent view or present it.
-    // |default_view_owner| is the view owner request that's passed to
-    // UserProviderImpl from base shell. If you don't need to intercept the
-    // view owner, return it without modifying it.
-    virtual fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-    GetSessionShellViewOwner(
-        fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-            default_view_owner) = 0;
-
-    // Enables the delegate to supply a different service provider to the user
-    // shell. |default_service_provider| is the service provider passed to the
-    // session shell by the base shell. If you don't need to replace it, return
-    // it without modifying it.
-    virtual fidl::InterfaceHandle<fuchsia::sys::ServiceProvider>
-    GetSessionShellServiceProvider(
-        fidl::InterfaceHandle<fuchsia::sys::ServiceProvider>
-            default_service_provider) = 0;
-  };
-
-  // |account_provider| and |delegate| must outlive UserProviderImpl.
-  UserProviderImpl(
-      fuchsia::sys::Launcher* const launcher,
-      const fuchsia::modular::AppConfig& sessionmgr,
-      const fuchsia::modular::AppConfig& session_shell,
-      const fuchsia::modular::AppConfig& story_shell,
-      fuchsia::auth::TokenManagerFactory* token_manager_factory,
-      fuchsia::auth::AuthenticationContextProviderPtr auth_context_provider,
-      Delegate* const delegate);
-
-  void Connect(fidl::InterfaceRequest<fuchsia::modular::UserProvider> request);
-
-  void Teardown(const std::function<void()>& callback);
-
-  // Stops the active session shell, and starts the session shell specified in
-  // |session_shell_config|. This has no effect, and will return an
-  // immediately-completed future, if no session shells are running.
-  FuturePtr<> SwapSessionShell(
-      fuchsia::modular::AppConfig session_shell_config);
-
-  // Restarts the current session by logging out the current user and logging
-  // that user back in.
-  void RestartSession();
-
-  // |fuchsia::modular::UserProvider|, also called by |basemgr_impl|.
-  void Login(fuchsia::modular::UserLoginParams params) override;
-
-  // |fuchsia::modular::UserProvider|, also called by |basemgr_impl|.
-  void PreviousUsers(PreviousUsersCallback callback) override;
-
-  // |fuchsia::modular::UserProvider|, also called by |basemgr_impl|.
-  void RemoveUser(std::string account_id,
-                  RemoveUserCallback callback) override;
-
- private:
-  // |fuchsia::modular::UserProvider|
-  void AddUser(fuchsia::modular::auth::IdentityProvider identity_provider,
-               AddUserCallback callback) override;
-
-  // |fuchsia::auth::AuthenticationContextProvider|
-  void GetAuthenticationUIContext(
-      fidl::InterfaceRequest<fuchsia::auth::AuthenticationUIContext> request)
-      override;
-
-  // Returns a new |fuchsia::auth::TokenManager| handle for the given user
-  // account |account_id|.
-  fuchsia::auth::TokenManagerPtr CreateTokenManager(std::string account_id);
-
-  bool AddUserToAccountsDB(const fuchsia::modular::auth::Account* account,
-                           std::string* error);
-  bool RemoveUserFromAccountsDB(fidl::StringPtr account_id, std::string* error);
-  bool WriteUsersDb(const std::string& serialized_users, std::string* error);
-  bool Parse(const std::string& serialized_users);
-  void RemoveUserInternal(fuchsia::modular::auth::AccountPtr account,
-                          RemoveUserCallback callback);
-  void LoginInternal(fuchsia::modular::auth::AccountPtr account,
-                     fuchsia::modular::UserLoginParams params);
-
-  fidl::BindingSet<fuchsia::modular::UserProvider> bindings_;
-
-  fuchsia::sys::Launcher* const launcher_;         // Not owned.
-  const fuchsia::modular::AppConfig& sessionmgr_;  // Neither owned nor copied.
-  const fuchsia::modular::AppConfig&
-      session_shell_;                               // Neither owned nor copied.
-  const fuchsia::modular::AppConfig& story_shell_;  // Neither owned nor copied.
-  fuchsia::auth::TokenManagerFactory* const
-      token_manager_factory_;  // Neither owned nor copied.
-  fuchsia::auth::AuthenticationContextProviderPtr
-      authentication_context_provider_;
-  Delegate* const delegate_;  // Neither owned nor copied.
-
-  fidl::Binding<fuchsia::auth::AuthenticationContextProvider>
-      authentication_context_provider_binding_;
-  std::string serialized_users_;
-  const fuchsia::modular::UsersStorage* users_storage_ = nullptr;
-
-  std::map<UserControllerImpl*, std::unique_ptr<UserControllerImpl>>
-      user_controllers_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(UserProviderImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_BASEMGR_USER_PROVIDER_IMPL_H_
diff --git a/bin/basemgr/users.fbs b/bin/basemgr/users.fbs
deleted file mode 100644
index f1017f4..0000000
--- a/bin/basemgr/users.fbs
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-namespace fuchsia.modular;
-
-// See public/fidl/fuchsia.modular.auth/account/account.fidl for detailed
-// documentation about these fields.
-
-enum IdentityProvider : byte { DEV, GOOGLE }
-
-table UserStorage {
-  id: string;
-  identity_provider: IdentityProvider;
-  display_name: string;
-  profile_url: string;
-  image_url: string;
-  profile_id: string;
-}
-
-table UsersStorage {
-  users: [UserStorage];
-}
-
-root_type UsersStorage;
diff --git a/bin/cloud_provider_firestore/BUILD.gn b/bin/cloud_provider_firestore/BUILD.gn
deleted file mode 100644
index 4438f6a..0000000
--- a/bin/cloud_provider_firestore/BUILD.gn
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/package.gni")
-
-package("cloud_provider_firestore") {
-  deps = [
-    "app",
-    "//peridot/bin/ledger/cobalt:ledger_metrics_registry",
-  ]
-
-  resources = [
-    {
-      path =
-          rebase_path(get_label_info(
-                          "//peridot/bin/ledger/cobalt:ledger_metrics_registry",
-                          "target_gen_dir") + "/ledger_metrics_registry.pb")
-      dest = "firebase_auth_ledger_metrics_config.pb"
-    },
-  ]
-
-  binary = "cloud_provider_firestore"
-
-  meta = [
-    {
-      path = rebase_path("app/meta/cloud_provider_firestore.cmx")
-      dest = "cloud_provider_firestore.cmx"
-    },
-  ]
-}
-
-executable("unittests") {
-  testonly = true
-
-  output_name = "cloud_provider_firestore_unittests"
-
-  deps = [
-    "//peridot/bin/cloud_provider_firestore/app:unittests",
-    "//peridot/bin/cloud_provider_firestore/firestore:unittests",
-    "//peridot/bin/cloud_provider_firestore/grpc:unittests",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-group("tests") {
-  testonly = true
-
-  public_deps = [
-    ":unittests",
-    "//peridot/bin/cloud_provider_firestore/validation",
-  ]
-}
diff --git a/bin/cloud_provider_firestore/README.md b/bin/cloud_provider_firestore/README.md
deleted file mode 100644
index eed929c..0000000
--- a/bin/cloud_provider_firestore/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Firestore-based cloud provider
-
-This directory contains a Firestore-based implementation of the [cloud provider]
-interface.
-
-[TOC]
-
-## Testing
-
-The tests are packaged with Ledger tests.
-
-In order to run the unit tests:
-
-```sh
-fx run-test -t cloud_provider_firestore_unittests ledger_tests
-```
-
-In order to run the [validation tests], follow the [cloud sync set-up
-instructions] to set up a Firestore instance, configure the build environment
-and obtain the sync parameters.
-
-Then, run the validation tests as follows:
-
-```sh
-fx run-test -t validation_firestore ledger_tests
-```
-
-Note that `validation_firestore` is only a launcher for the actual tests,
-`cloud_provider_validation_tests`. As a result, you will need to look at `fx
-log` output to see if the tests passed.
-
-## Documentation
-
- - [configuration](docs/configuration.md) of server instances
-
-[cloud provider]: /public/fidl/fuchsia.ledger.cloud/cloud_provider.fidl
-[cloud sync set-up instructions]: /docs/ledger/testing.md#cloud-sync
-[validation tests]: /public/lib/cloud_provider/validation/README.md
diff --git a/bin/cloud_provider_firestore/app/BUILD.gn b/bin/cloud_provider_firestore/app/BUILD.gn
deleted file mode 100644
index 2203654..0000000
--- a/bin/cloud_provider_firestore/app/BUILD.gn
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/cloud_provider_firestore/*" ]
-
-executable("app") {
-  output_name = "cloud_provider_firestore"
-
-  sources = [
-    "app.cc",
-  ]
-
-  deps = [
-    ":lib",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/rng:system",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/trace-provider",
-  ]
-}
-
-source_set("lib") {
-  sources = [
-    "cloud_provider_impl.cc",
-    "cloud_provider_impl.h",
-    "credentials_provider.h",
-    "credentials_provider_impl.cc",
-    "credentials_provider_impl.h",
-    "device_set_impl.cc",
-    "device_set_impl.h",
-    "factory_impl.cc",
-    "factory_impl.h",
-    "grpc_status.cc",
-    "grpc_status.h",
-    "page_cloud_impl.cc",
-    "page_cloud_impl.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/cloud_provider_firestore/fidl",
-    "//peridot/bin/cloud_provider_firestore/firestore",
-    "//peridot/bin/cloud_provider_firestore/include",
-    "//peridot/lib/firebase_auth",
-    "//peridot/lib/rng",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//third_party/grpc:grpc++",
-  ]
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fsl",
-    "//peridot/bin/ledger/app:serialization_version",
-    "//peridot/lib/commit_pack",
-    "//peridot/lib/convert",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "cloud_provider_impl_unittest.cc",
-    "credentials_provider_impl_unittest.cc",
-    "device_set_impl_unittest.cc",
-    "factory_impl_unittest.cc",
-    "page_cloud_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":lib",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl:fxl_printers",
-    "//garnet/public/lib/gtest",
-    "//peridot/bin/cloud_provider_firestore/app/testing",
-    "//peridot/bin/cloud_provider_firestore/firestore/testing",
-    "//peridot/lib/convert",
-    "//peridot/lib/firebase_auth/testing",
-    "//peridot/lib/rng:testing",
-    "//third_party/protobuf:protobuf_full",
-  ]
-}
diff --git a/bin/cloud_provider_firestore/app/app.cc b/bin/cloud_provider_firestore/app/app.cc
deleted file mode 100644
index 5550748..0000000
--- a/bin/cloud_provider_firestore/app/app.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/log_settings_command_line.h>
-#include <trace-provider/provider.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/factory_impl.h"
-#include "peridot/lib/rng/system_random.h"
-
-namespace cloud_provider_firestore {
-namespace {
-
-constexpr fxl::StringView kCobaltClientName = "cloud_provider_firestore";
-constexpr fxl::StringView kNoStatisticsReporting = "disable_reporting";
-
-struct AppParams {
-  bool disable_statistics = false;
-};
-
-class App : public fuchsia::modular::Lifecycle {
- public:
-  explicit App(AppParams app_params)
-      : loop_(&kAsyncLoopConfigAttachToThread),
-        startup_context_(component::StartupContext::CreateFromStartupInfo()),
-        trace_provider_(loop_.dispatcher()),
-        factory_impl_(
-            loop_.dispatcher(), &random_, startup_context_.get(),
-            app_params.disable_statistics ? "" : kCobaltClientName.ToString()) {
-    FXL_DCHECK(startup_context_);
-  }
-
-  void Run() {
-    startup_context_->outgoing().AddPublicService<fuchsia::modular::Lifecycle>(
-        [this](fidl::InterfaceRequest<fuchsia::modular::Lifecycle> request) {
-          lifecycle_bindings_.AddBinding(this, std::move(request));
-        });
-    startup_context_->outgoing().AddPublicService<Factory>(
-        [this](fidl::InterfaceRequest<Factory> request) {
-          factory_bindings_.AddBinding(&factory_impl_, std::move(request));
-        });
-    loop_.Run();
-  }
-
-  void Terminate() override {
-    factory_impl_.ShutDown([this] { loop_.Quit(); });
-  }
-
- private:
-  async::Loop loop_;
-  rng::SystemRandom random_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  trace::TraceProvider trace_provider_;
-
-  FactoryImpl factory_impl_;
-  fidl::BindingSet<fuchsia::modular::Lifecycle> lifecycle_bindings_;
-  fidl::BindingSet<Factory> factory_bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(App);
-};
-}  // namespace
-
-}  // namespace cloud_provider_firestore
-
-int main(int argc, const char** argv) {
-  // The trust root file is made available by the sandbox feature
-  // "root-ssl-certificates"
-  setenv("GRPC_DEFAULT_SSL_ROOTS_FILE_PATH", "/config/ssl/cert.pem", 1);
-
-  const auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  fxl::SetLogSettingsFromCommandLine(command_line);
-
-  cloud_provider_firestore::AppParams app_params;
-  app_params.disable_statistics =
-      command_line.HasOption(cloud_provider_firestore::kNoStatisticsReporting);
-
-  cloud_provider_firestore::App app(app_params);
-  app.Run();
-
-  return 0;
-}
diff --git a/bin/cloud_provider_firestore/app/cloud_provider_impl.cc b/bin/cloud_provider_firestore/app/cloud_provider_impl.cc
deleted file mode 100644
index 2aa6297..0000000
--- a/bin/cloud_provider_firestore/app/cloud_provider_impl.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/cloud_provider_impl.h"
-
-#include <utility>
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/concatenate.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/credentials_provider_impl.h"
-#include "peridot/bin/cloud_provider_firestore/app/grpc_status.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/encoding.h"
-#include "peridot/bin/ledger/app/serialization_version.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace cloud_provider_firestore {
-
-constexpr char kSeparator[] = "/";
-constexpr char kUsersCollection[] = "users";
-constexpr char kVersionsCollection[] = "versions";
-constexpr char kPageCollection[] = "pages";
-constexpr char kNamespaceCollection[] = "namespaces";
-constexpr char kExistsKey[] = "exists";
-
-std::string GetUserPath(fxl::StringView root_path, fxl::StringView user_id) {
-  return fxl::Concatenate({
-      root_path,
-      kSeparator,
-      kUsersCollection,
-      kSeparator,
-      user_id,
-  });
-}
-
-std::string GetVersionPath(fxl::StringView user_path) {
-  return fxl::Concatenate({
-      user_path,
-      kSeparator,
-      kVersionsCollection,
-      kSeparator,
-      ledger::kSerializationVersion,
-  });
-}
-
-std::string GetNamespacePath(fxl::StringView version_path,
-                             fxl::StringView namespace_id) {
-  std::string encoded_namespace_id = EncodeKey(namespace_id);
-  return fxl::Concatenate({version_path, kSeparator, kNamespaceCollection,
-                           kSeparator, encoded_namespace_id});
-}
-
-std::string GetPagePath(fxl::StringView namespace_path,
-                        fxl::StringView page_id) {
-  std::string encoded_page_id = EncodeKey(page_id);
-  return fxl::Concatenate({namespace_path, kSeparator, kPageCollection,
-                           kSeparator, encoded_page_id});
-}
-
-CloudProviderImpl::CloudProviderImpl(
-    rng::Random* random, std::string user_id,
-    std::unique_ptr<firebase_auth::FirebaseAuth> firebase_auth,
-    std::unique_ptr<FirestoreService> firestore_service,
-    fidl::InterfaceRequest<cloud_provider::CloudProvider> request)
-    : random_(random),
-      user_id_(std::move(user_id)),
-      firestore_service_(std::move(firestore_service)),
-      binding_(this, std::move(request)),
-      weak_ptr_factory_(this) {
-  // The class shuts down when the client connection is disconnected.
-  binding_.set_error_handler(
-      [this](zx_status_t status) { ShutDownAndReportEmpty(); });
-  // The class also shuts down when the auth provider is disconnected.
-  firebase_auth->set_error_handler([this] {
-    FXL_LOG(ERROR) << "Lost connection to the token provider, "
-                   << "shutting down the cloud provider.";
-    ShutDownAndReportEmpty();
-  });
-
-  credentials_provider_ =
-      std::make_unique<CredentialsProviderImpl>(std::move(firebase_auth));
-}
-
-CloudProviderImpl::~CloudProviderImpl() {}
-
-void CloudProviderImpl::ShutDownAndReportEmpty() {
-  if (binding_.is_bound()) {
-    binding_.Unbind();
-  }
-
-  fit::closure shut_down = [this] {
-    firestore_service_->ShutDown([this] {
-      if (on_empty_) {
-        on_empty_();
-      }
-    });
-  };
-
-  if (pending_placeholder_requests_.empty()) {
-    shut_down();
-    return;
-  }
-
-  pending_placeholder_requests_.set_on_empty(std::move(shut_down));
-}
-
-void CloudProviderImpl::ScopedGetCredentials(
-    fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback) {
-  credentials_provider_->GetCredentials(callback::MakeScoped(
-      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
-}
-
-void CloudProviderImpl::GetDeviceSet(
-    fidl::InterfaceRequest<cloud_provider::DeviceSet> device_set,
-    GetDeviceSetCallback callback) {
-  const std::string user_path =
-      GetUserPath(firestore_service_->GetRootPath(), user_id_);
-  const std::string version_path = GetVersionPath(user_path);
-  device_sets_.emplace(version_path, credentials_provider_.get(),
-                       firestore_service_.get(), std::move(device_set));
-  callback(cloud_provider::Status::OK);
-
-  // Create a placeholder document for the root of the serialization version.
-  CreatePlaceholderDocument(user_path, kVersionsCollection,
-                            ledger::kSerializationVersion.ToString());
-}
-
-void CloudProviderImpl::GetPageCloud(
-    std::vector<uint8_t> app_id, std::vector<uint8_t> page_id,
-    fidl::InterfaceRequest<cloud_provider::PageCloud> page_cloud,
-    GetPageCloudCallback callback) {
-  const std::string user_path =
-      GetUserPath(firestore_service_->GetRootPath(), user_id_);
-  const std::string version_path = GetVersionPath(user_path);
-  const std::string app_id_str = convert::ToString(app_id);
-  const std::string namespace_path = GetNamespacePath(version_path, app_id_str);
-  const std::string page_id_str = convert::ToString(page_id);
-  const std::string page_path = GetPagePath(namespace_path, page_id_str);
-  page_clouds_.emplace(page_path, random_, credentials_provider_.get(),
-                       firestore_service_.get(), std::move(page_cloud));
-  callback(cloud_provider::Status::OK);
-
-  // Create a placeholder document for the root of the serialization version.
-  CreatePlaceholderDocument(user_path, kVersionsCollection,
-                            ledger::kSerializationVersion.ToString());
-  // Create a placeholder document for the root of the app namespace.
-  CreatePlaceholderDocument(version_path, kNamespaceCollection,
-                            EncodeKey(app_id_str));
-  // Create a placeholder document for the root of the page.
-  CreatePlaceholderDocument(namespace_path, kPageCollection,
-                            EncodeKey(page_id_str));
-}
-
-void CloudProviderImpl::CreatePlaceholderDocument(
-    std::string parent_document_path, std::string collection_id,
-    std::string document_id) {
-  auto request = google::firestore::v1beta1::CreateDocumentRequest();
-  request.set_parent(std::move(parent_document_path));
-  request.set_collection_id(std::move(collection_id));
-  request.set_document_id(std::move(document_id));
-  google::firestore::v1beta1::Value exists;
-  exists.set_boolean_value(true);
-  (*(request.mutable_document()->mutable_fields()))[kExistsKey] = exists;
-
-  // Create an object that tracks the request in progress, so that we don't shut
-  // down between requesting and receiving the credentials (see
-  // ShutDownAndReportEmoty()). The value |true| is not meaningful.
-  auto pending_request_marker = pending_placeholder_requests_.Manage(true);
-  ScopedGetCredentials(
-      [this, request = std::move(request),
-       pending_request_marker =
-           std::move(pending_request_marker)](auto call_credentials) mutable {
-        firestore_service_->CreateDocument(
-            std::move(request), std::move(call_credentials),
-            [](auto status, auto result) {
-              if (status.error_code() != grpc::OK &&
-                  status.error_code() != grpc::ALREADY_EXISTS) {
-                LogGrpcRequestError(status);
-              }
-            });
-      });
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/cloud_provider_impl.h b/bin/cloud_provider_firestore/app/cloud_provider_impl.h
deleted file mode 100644
index a056be3..0000000
--- a/bin/cloud_provider_firestore/app/cloud_provider_impl.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_CLOUD_PROVIDER_IMPL_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_CLOUD_PROVIDER_IMPL_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <fuchsia/ledger/cloud/firestore/cpp/fidl.h>
-#include <lib/callback/managed_container.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/device_set_impl.h"
-#include "peridot/bin/cloud_provider_firestore/app/page_cloud_impl.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/firestore_service.h"
-#include "peridot/lib/firebase_auth/firebase_auth_impl.h"
-#include "peridot/lib/rng/random.h"
-
-namespace cloud_provider_firestore {
-
-// Implementation of cloud_provider::CloudProvider.
-//
-// If the |on_empty| callback is set, it is called when the client connection is
-// closed.
-class CloudProviderImpl : public cloud_provider::CloudProvider {
- public:
-  CloudProviderImpl(
-      rng::Random* random, std::string user_id,
-      std::unique_ptr<firebase_auth::FirebaseAuth> firebase_auth,
-      std::unique_ptr<FirestoreService> firestore_service,
-      fidl::InterfaceRequest<cloud_provider::CloudProvider> request);
-  ~CloudProviderImpl() override;
-
-  void set_on_empty(fit::closure on_empty) { on_empty_ = std::move(on_empty); }
-
-  // Shuts the class down and calls the on_empty callback, if set.
-  //
-  // It is only valid to delete the class after the on_empty callback is called.
-  void ShutDownAndReportEmpty();
-
- private:
-  void GetDeviceSet(
-      fidl::InterfaceRequest<cloud_provider::DeviceSet> device_set,
-      GetDeviceSetCallback callback) override;
-
-  void GetPageCloud(
-      std::vector<uint8_t> app_id, std::vector<uint8_t> page_id,
-      fidl::InterfaceRequest<cloud_provider::PageCloud> page_cloud,
-      GetPageCloudCallback callback) override;
-
-  // Makes a best-effort attempt to create a placeholder document at the given
-  // location.
-  //
-  // Placeholder documents have a single field "exists: true" and ensure that
-  // data under this path is visible when querying the parent collection. This
-  // works around limitations of the web client API for purposes of the
-  // development cloud dashboard, see LE-522.
-  void CreatePlaceholderDocument(std::string parent_document_path,
-                                 std::string collection_id,
-                                 std::string document_id);
-
-  void ScopedGetCredentials(
-      fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback);
-
-  rng::Random* const random_;
-  const std::string user_id_;
-
-  std::unique_ptr<CredentialsProvider> credentials_provider_;
-  std::unique_ptr<FirestoreService> firestore_service_;
-  fidl::Binding<cloud_provider::CloudProvider> binding_;
-  fit::closure on_empty_;
-
-  callback::AutoCleanableSet<DeviceSetImpl> device_sets_;
-  callback::AutoCleanableSet<PageCloudImpl> page_clouds_;
-
-  // Tracks pending requests to create placeholder documents.
-  callback::ManagedContainer pending_placeholder_requests_;
-
-  // Must be the last member.
-  fxl::WeakPtrFactory<CloudProviderImpl> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(CloudProviderImpl);
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_CLOUD_PROVIDER_IMPL_H_
diff --git a/bin/cloud_provider_firestore/app/cloud_provider_impl_unittest.cc b/bin/cloud_provider_firestore/app/cloud_provider_impl_unittest.cc
deleted file mode 100644
index 1ebe583..0000000
--- a/bin/cloud_provider_firestore/app/cloud_provider_impl_unittest.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/cloud_provider_impl.h"
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/bin/cloud_provider_firestore/firestore/testing/test_firestore_service.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/firebase_auth/testing/test_firebase_auth.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace cloud_provider_firestore {
-
-class CloudProviderImplTest : public gtest::TestLoopFixture {
- public:
-  CloudProviderImplTest() : random_(test_loop().initial_state()) {
-    auto firebase_auth =
-        std::make_unique<firebase_auth::TestFirebaseAuth>(dispatcher());
-    firebase_auth_ = firebase_auth.get();
-    auto firestore_service = std::make_unique<TestFirestoreService>();
-    firestore_service_ = firestore_service.get();
-    cloud_provider_impl_ = std::make_unique<CloudProviderImpl>(
-        &random_, "some user id", std::move(firebase_auth),
-        std::move(firestore_service), cloud_provider_.NewRequest());
-  }
-  ~CloudProviderImplTest() override {}
-
- protected:
-  rng::TestRandom random_;
-  firebase_auth::TestFirebaseAuth* firebase_auth_ = nullptr;
-
-  TestFirestoreService* firestore_service_;
-  cloud_provider::CloudProviderPtr cloud_provider_;
-  std::unique_ptr<CloudProviderImpl> cloud_provider_impl_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(CloudProviderImplTest);
-};
-
-TEST_F(CloudProviderImplTest, EmptyWhenClientDisconnected) {
-  bool on_empty_called = false;
-  cloud_provider_impl_->set_on_empty(
-      [this, &on_empty_called] { on_empty_called = true; });
-  EXPECT_FALSE(firestore_service_->shutdown_callback);
-  cloud_provider_.Unbind();
-  RunLoopUntilIdle();
-
-  // Verify that shutdown was started, but on_empty wasn't called yet.
-  EXPECT_TRUE(firestore_service_->shutdown_callback);
-  EXPECT_FALSE(on_empty_called);
-
-  // Verify that on_empty is called when the shutdown callback is executed.
-  firestore_service_->shutdown_callback();
-  EXPECT_TRUE(on_empty_called);
-}
-
-TEST_F(CloudProviderImplTest, EmptyWhenFirebaseAuthDisconnected) {
-  bool on_empty_called = false;
-  cloud_provider_impl_->set_on_empty(
-      [this, &on_empty_called] { on_empty_called = true; });
-  firebase_auth_->TriggerConnectionErrorHandler();
-  RunLoopUntilIdle();
-
-  // Verify that shutdown was started, but on_empty wasn't called yet.
-  EXPECT_TRUE(firestore_service_->shutdown_callback);
-  EXPECT_FALSE(on_empty_called);
-
-  // Verify that on_empty is called when the shutdown callback is executed.
-  firestore_service_->shutdown_callback();
-  EXPECT_TRUE(on_empty_called);
-}
-
-TEST_F(CloudProviderImplTest, GetDeviceSet) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  cloud_provider::DeviceSetPtr device_set;
-  cloud_provider_->GetDeviceSet(
-      device_set.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-
-  // Expect one placeholder document creation request: root document of the
-  // serialization version.
-  EXPECT_EQ(1u, firestore_service_->create_document_records.size());
-}
-
-TEST_F(CloudProviderImplTest, GetPageCloud) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  cloud_provider::PageCloudPtr page_cloud;
-  cloud_provider_->GetPageCloud(
-      convert::ToArray("app_id"), convert::ToArray("page_id"),
-      page_cloud.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-
-  // Expect three placeholder document creation request: root document of the
-  // serialization version, root document of the app namespace, root document of
-  // the page.
-  EXPECT_EQ(3u, firestore_service_->create_document_records.size());
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/credentials_provider.h b/bin/cloud_provider_firestore/app/credentials_provider.h
deleted file mode 100644
index d954193..0000000
--- a/bin/cloud_provider_firestore/app/credentials_provider.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_CREDENTIALS_PROVIDER_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_CREDENTIALS_PROVIDER_H_
-
-#include <functional>
-#include <memory>
-
-#include <grpc++/grpc++.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-namespace cloud_provider_firestore {
-
-// Interface for a provider of gRPC call credentials that can be used to make
-// Firestore requests.
-class CredentialsProvider {
- public:
-  CredentialsProvider() {}
-  virtual ~CredentialsProvider() {}
-
-  // Retrieves call credentials.
-  virtual void GetCredentials(
-      fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(CredentialsProvider);
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_CREDENTIALS_PROVIDER_H_
diff --git a/bin/cloud_provider_firestore/app/credentials_provider_impl.cc b/bin/cloud_provider_firestore/app/credentials_provider_impl.cc
deleted file mode 100644
index 73217b2..0000000
--- a/bin/cloud_provider_firestore/app/credentials_provider_impl.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/credentials_provider_impl.h"
-
-#include <lib/fit/function.h>
-
-namespace cloud_provider_firestore {
-
-namespace {
-
-class FirebaseAuthPlugin : public grpc::MetadataCredentialsPlugin {
- public:
-  explicit FirebaseAuthPlugin(std::string token)
-      : header_value_("Bearer " + token) {}
-
-  grpc::Status GetMetadata(
-      grpc::string_ref /*service_url*/, grpc::string_ref /*method_name*/,
-      const grpc::AuthContext& /*channel_auth_context*/,
-      std::multimap<grpc::string, grpc::string>* metadata) override {
-    // note: grpc seems to insist on lowercase "authorization", otherwise we get
-    // "Illegal header key" from "src/core/lib/surface/validate_metadata.c".
-    metadata->insert(std::make_pair("authorization", header_value_));
-    return grpc::Status::OK;
-  }
-
- private:
-  const std::string header_value_;
-};
-
-std::shared_ptr<grpc::CallCredentials> MakeCredentials(std::string token) {
-  return grpc::MetadataCredentialsFromPlugin(
-      std::make_unique<FirebaseAuthPlugin>(std::move(token)));
-}
-
-}  // namespace
-
-CredentialsProviderImpl::CredentialsProviderImpl(
-    std::unique_ptr<firebase_auth::FirebaseAuth> firebase_auth)
-    : firebase_auth_(std::move(firebase_auth)) {}
-
-CredentialsProviderImpl::~CredentialsProviderImpl() {}
-
-void CredentialsProviderImpl::GetCredentials(
-    fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback) {
-  auto request = firebase_auth_->GetFirebaseToken(
-      [this, callback = std::move(callback)](
-          firebase_auth::AuthStatus auth_status, std::string auth_token) {
-        switch (auth_status) {
-          case firebase_auth::AuthStatus::OK:
-            callback(MakeCredentials(auth_token));
-            return;
-          case firebase_auth::AuthStatus::ERROR:
-            callback(nullptr);
-            return;
-        }
-      });
-  auth_token_requests_.emplace(request);
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/credentials_provider_impl.h b/bin/cloud_provider_firestore/app/credentials_provider_impl.h
deleted file mode 100644
index a78225f..0000000
--- a/bin/cloud_provider_firestore/app/credentials_provider_impl.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_CREDENTIALS_PROVIDER_IMPL_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_CREDENTIALS_PROVIDER_IMPL_H_
-
-#include <functional>
-#include <memory>
-
-#include <grpc++/grpc++.h>
-#include <lib/callback/cancellable.h>
-#include <lib/fit/function.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/credentials_provider.h"
-#include "peridot/lib/firebase_auth/firebase_auth.h"
-
-namespace cloud_provider_firestore {
-
-class CredentialsProviderImpl : public CredentialsProvider {
- public:
-  explicit CredentialsProviderImpl(
-      std::unique_ptr<firebase_auth::FirebaseAuth> firebase_auth);
-  ~CredentialsProviderImpl() override;
-
-  void GetCredentials(
-      fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback)
-      override;
-
- private:
-  std::unique_ptr<firebase_auth::FirebaseAuth> firebase_auth_;
-
-  // Pending auth token requests to be cancelled when this class goes away.
-  callback::CancellableContainer auth_token_requests_;
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_CREDENTIALS_PROVIDER_IMPL_H_
diff --git a/bin/cloud_provider_firestore/app/credentials_provider_impl_unittest.cc b/bin/cloud_provider_firestore/app/credentials_provider_impl_unittest.cc
deleted file mode 100644
index 53e8402..0000000
--- a/bin/cloud_provider_firestore/app/credentials_provider_impl_unittest.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/credentials_provider_impl.h"
-
-#include <gtest/gtest.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/lib/firebase_auth/testing/test_firebase_auth.h"
-
-namespace cloud_provider_firestore {
-
-namespace {
-
-class CredentialsProviderImplTest : public gtest::TestLoopFixture {
- public:
-  CredentialsProviderImplTest() {
-    auto firebase_auth =
-        std::make_unique<firebase_auth::TestFirebaseAuth>(dispatcher());
-    firebase_auth_ = firebase_auth.get();
-    credentials_provider_ =
-        std::make_unique<CredentialsProviderImpl>(std::move(firebase_auth));
-  }
-
- protected:
-  firebase_auth::TestFirebaseAuth* firebase_auth_ = nullptr;
-  std::unique_ptr<CredentialsProviderImpl> credentials_provider_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(CredentialsProviderImplTest);
-};
-
-TEST_F(CredentialsProviderImplTest, Ok) {
-  std::shared_ptr<grpc::CallCredentials> call_credentials;
-  bool called;
-  credentials_provider_->GetCredentials(
-      callback::Capture(callback::SetWhenCalled(&called), &call_credentials));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_TRUE(call_credentials);
-}
-
-TEST_F(CredentialsProviderImplTest, Error) {
-  firebase_auth_->status_to_return = firebase_auth::AuthStatus::ERROR;
-  bool called;
-  std::shared_ptr<grpc::CallCredentials> call_credentials;
-  credentials_provider_->GetCredentials(
-      callback::Capture(callback::SetWhenCalled(&called), &call_credentials));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_FALSE(call_credentials);
-}
-
-}  // namespace
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/device_set_impl.cc b/bin/cloud_provider_firestore/app/device_set_impl.cc
deleted file mode 100644
index ddcc4bf..0000000
--- a/bin/cloud_provider_firestore/app/device_set_impl.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/device_set_impl.h"
-
-#include <google/firestore/v1beta1/firestore.pb.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/concatenate.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/grpc_status.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/encoding.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace cloud_provider_firestore {
-
-namespace {
-constexpr char kSeparator[] = "/";
-constexpr char kDeviceCollection[] = "devices";
-constexpr char kExistsKey[] = "exists";
-
-std::string GetDevicePath(fxl::StringView user_path,
-                          fxl::StringView fingerprint) {
-  std::string encoded_fingerprint = EncodeKey(fingerprint);
-  return fxl::Concatenate({user_path, kSeparator, kDeviceCollection, kSeparator,
-                           encoded_fingerprint});
-}
-
-class GrpcStatusAccumulator {
- public:
-  bool PrepareCall() { return true; }
-
-  bool Update(bool /*token*/, grpc::Status status) {
-    result_status_ = status;
-    return result_status_.ok();
-  }
-
-  grpc::Status Result() { return result_status_; }
-
- private:
-  grpc::Status result_status_ = grpc::Status::OK;
-};
-
-class GrpcStatusWaiter
-    : public callback::BaseWaiter<GrpcStatusAccumulator, grpc::Status,
-                                  grpc::Status> {
- private:
-  GrpcStatusWaiter()
-      : callback::BaseWaiter<GrpcStatusAccumulator, grpc::Status, grpc::Status>(
-            GrpcStatusAccumulator()) {}
-  FRIEND_REF_COUNTED_THREAD_SAFE(GrpcStatusWaiter);
-  FRIEND_MAKE_REF_COUNTED(GrpcStatusWaiter);
-};
-}  // namespace
-
-DeviceSetImpl::DeviceSetImpl(
-    std::string user_path, CredentialsProvider* credentials_provider,
-    FirestoreService* firestore_service,
-    fidl::InterfaceRequest<cloud_provider::DeviceSet> request)
-    : user_path_(std::move(user_path)),
-      credentials_provider_(credentials_provider),
-      firestore_service_(firestore_service),
-      binding_(this, std::move(request)),
-      weak_ptr_factory_(this) {
-  FXL_DCHECK(!user_path_.empty());
-  FXL_DCHECK(credentials_provider_);
-  FXL_DCHECK(firestore_service_);
-
-  // The class shuts down when the client connection is disconnected.
-  binding_.set_error_handler([this](zx_status_t status) {
-    if (on_empty_) {
-      on_empty_();
-    }
-  });
-}
-
-DeviceSetImpl::~DeviceSetImpl() {}
-
-void DeviceSetImpl::ScopedGetCredentials(
-    fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback) {
-  credentials_provider_->GetCredentials(callback::MakeScoped(
-      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
-}
-
-void DeviceSetImpl::CheckFingerprint(std::vector<uint8_t> fingerprint,
-                                     CheckFingerprintCallback callback) {
-  auto request = google::firestore::v1beta1::GetDocumentRequest();
-  request.set_name(
-      GetDevicePath(user_path_, convert::ToStringView(fingerprint)));
-
-  ScopedGetCredentials(
-      [this, request = std::move(request),
-       callback = std::move(callback)](auto call_credentials) mutable {
-        firestore_service_->GetDocument(
-            std::move(request), std::move(call_credentials),
-            [callback = std::move(callback)](auto status, auto result) {
-              if (LogGrpcRequestError(status)) {
-                callback(ConvertGrpcStatus(status.error_code()));
-                return;
-              }
-
-              callback(cloud_provider::Status::OK);
-            });
-      });
-}
-
-void DeviceSetImpl::SetFingerprint(std::vector<uint8_t> fingerprint,
-                                   SetFingerprintCallback callback) {
-  auto request = google::firestore::v1beta1::CreateDocumentRequest();
-  request.set_parent(user_path_);
-  request.set_collection_id(kDeviceCollection);
-  request.set_document_id(EncodeKey(convert::ToString(fingerprint)));
-  google::firestore::v1beta1::Value exists;
-  // TODO(ppi): store a timestamp of the last connection rather than a boolean
-  // flag.
-  exists.set_boolean_value(true);
-  (*(request.mutable_document()->mutable_fields()))[kExistsKey] = exists;
-
-  ScopedGetCredentials(
-      [this, request = std::move(request),
-       callback = std::move(callback)](auto call_credentials) mutable {
-        firestore_service_->CreateDocument(
-            std::move(request), std::move(call_credentials),
-            [callback = std::move(callback)](auto status, auto result) {
-              if (LogGrpcRequestError(status)) {
-                callback(ConvertGrpcStatus(status.error_code()));
-                return;
-              }
-              callback(cloud_provider::Status::OK);
-            });
-      });
-}
-
-void DeviceSetImpl::SetWatcher(
-    std::vector<uint8_t> fingerprint,
-    fidl::InterfaceHandle<cloud_provider::DeviceSetWatcher> watcher,
-    SetWatcherCallback callback) {
-  watcher_ = watcher.Bind();
-  watched_fingerprint_ = convert::ToString(fingerprint);
-  set_watcher_callback_ = std::move(callback);
-
-  ScopedGetCredentials([this](auto call_credentials) mutable {
-    // Initiate the listen RPC. We will receive a call on OnConnected() when the
-    // watcher is ready.
-    listen_call_handler_ =
-        firestore_service_->Listen(std::move(call_credentials), this);
-  });
-}
-
-void DeviceSetImpl::Erase(EraseCallback callback) {
-  auto request = google::firestore::v1beta1::ListDocumentsRequest();
-  request.set_parent(user_path_);
-  request.set_collection_id(kDeviceCollection);
-
-  ScopedGetCredentials(
-      [this, request = std::move(request),
-       callback = std::move(callback)](auto call_credentials) mutable {
-        firestore_service_->ListDocuments(
-            std::move(request), call_credentials,
-            [this, call_credentials, callback = std::move(callback)](
-                auto status, auto result) mutable {
-              if (LogGrpcRequestError(status)) {
-                callback(ConvertGrpcStatus(status.error_code()));
-                return;
-              }
-              OnGotDocumentsToErase(std::move(call_credentials),
-                                    std::move(result), std::move(callback));
-            });
-      });
-}
-
-void DeviceSetImpl::OnGotDocumentsToErase(
-    std::shared_ptr<grpc::CallCredentials> call_credentials,
-    google::firestore::v1beta1::ListDocumentsResponse documents_response,
-    EraseCallback callback) {
-  if (!documents_response.next_page_token().empty()) {
-    // TODO(ppi): handle paginated response.
-    FXL_LOG(ERROR)
-        << "Failed to erase the device map - too many devices in the map.";
-    callback(cloud_provider::Status::INTERNAL_ERROR);
-    return;
-  }
-
-  auto waiter = fxl::MakeRefCounted<GrpcStatusWaiter>();
-  for (const auto& document : documents_response.documents()) {
-    auto request = google::firestore::v1beta1::DeleteDocumentRequest();
-    request.set_name(document.name());
-    firestore_service_->DeleteDocument(std::move(request), call_credentials,
-                                       waiter->NewCallback());
-  }
-  waiter->Finalize(callback::MakeScoped(
-      weak_ptr_factory_.GetWeakPtr(),
-      [callback = std::move(callback)](grpc::Status status) {
-        if (LogGrpcRequestError(status)) {
-          callback(ConvertGrpcStatus(status.error_code()));
-          return;
-        }
-        callback(cloud_provider::Status::OK);
-      }));
-}
-
-void DeviceSetImpl::OnConnected() {
-  auto request = google::firestore::v1beta1::ListenRequest();
-  request.set_database(firestore_service_->GetDatabasePath());
-  request.mutable_add_target()->mutable_documents()->add_documents(
-      GetDevicePath(user_path_, watched_fingerprint_));
-  listen_call_handler_->Write(std::move(request));
-}
-
-void DeviceSetImpl::OnResponse(
-    google::firestore::v1beta1::ListenResponse response) {
-  if (response.has_target_change()) {
-    if (response.target_change().target_change_type() ==
-        google::firestore::v1beta1::TargetChange_TargetChangeType_CURRENT) {
-      if (set_watcher_callback_) {
-        set_watcher_callback_(cloud_provider::Status::OK);
-        set_watcher_callback_ = nullptr;
-      }
-    }
-    return;
-  }
-  if (response.has_document_delete()) {
-    if (set_watcher_callback_) {
-      set_watcher_callback_(cloud_provider::Status::NOT_FOUND);
-      set_watcher_callback_ = nullptr;
-    }
-    watcher_->OnCloudErased();
-    return;
-  }
-}
-
-void DeviceSetImpl::OnFinished(grpc::Status status) {
-  if (status.error_code() == grpc::UNAVAILABLE ||
-      status.error_code() == grpc::UNAUTHENTICATED) {
-    if (watcher_) {
-      watcher_->OnNetworkError();
-    }
-    return;
-  }
-  LogGrpcConnectionError(status);
-  watcher_.Unbind();
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/device_set_impl.h b/bin/cloud_provider_firestore/app/device_set_impl.h
deleted file mode 100644
index b41d64c..0000000
--- a/bin/cloud_provider_firestore/app/device_set_impl.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_DEVICE_SET_IMPL_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_DEVICE_SET_IMPL_H_
-
-#include <memory>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/vector.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/credentials_provider.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/firestore_service.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/listen_call_client.h"
-#include "peridot/bin/cloud_provider_firestore/include/types.h"
-
-namespace cloud_provider_firestore {
-
-// Implementation of cloud_provider::DeviceSet.
-//
-// If the |on_empty| callback is set, it is called when the client connection is
-// closed.
-class DeviceSetImpl : public cloud_provider::DeviceSet, ListenCallClient {
- public:
-  DeviceSetImpl(std::string user_path,
-                CredentialsProvider* credentials_provider,
-                FirestoreService* firestore_service,
-                fidl::InterfaceRequest<cloud_provider::DeviceSet> request);
-  ~DeviceSetImpl() override;
-
-  void set_on_empty(fit::closure on_empty) { on_empty_ = std::move(on_empty); }
-
- private:
-  void ScopedGetCredentials(
-      fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback);
-
-  // cloud_provider::DeviceSet:
-  void CheckFingerprint(std::vector<uint8_t> fingerprint,
-                        CheckFingerprintCallback callback) override;
-
-  void SetFingerprint(std::vector<uint8_t> fingerprint,
-                      SetFingerprintCallback callback) override;
-
-  void SetWatcher(
-      std::vector<uint8_t> fingerprint,
-      fidl::InterfaceHandle<cloud_provider::DeviceSetWatcher> watcher,
-      SetWatcherCallback callback) override;
-
-  void Erase(EraseCallback callback) override;
-
-  void OnGotDocumentsToErase(
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      google::firestore::v1beta1::ListDocumentsResponse documents_response,
-      EraseCallback callback);
-
-  // ListenCallClient:
-  void OnConnected() override;
-
-  void OnResponse(google::firestore::v1beta1::ListenResponse response) override;
-
-  void OnFinished(grpc::Status status) override;
-
-  const std::string user_path_;
-  CredentialsProvider* const credentials_provider_;
-  FirestoreService* const firestore_service_;
-
-  fidl::Binding<cloud_provider::DeviceSet> binding_;
-  fit::closure on_empty_;
-
-  // Watcher set by the client.
-  cloud_provider::DeviceSetWatcherPtr watcher_;
-  std::string watched_fingerprint_;
-  SetWatcherCallback set_watcher_callback_;
-  std::unique_ptr<ListenCallHandler> listen_call_handler_;
-
-  // Must be the last member.
-  fxl::WeakPtrFactory<DeviceSetImpl> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DeviceSetImpl);
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_DEVICE_SET_IMPL_H_
diff --git a/bin/cloud_provider_firestore/app/device_set_impl_unittest.cc b/bin/cloud_provider_firestore/app/device_set_impl_unittest.cc
deleted file mode 100644
index 67289d4..0000000
--- a/bin/cloud_provider_firestore/app/device_set_impl_unittest.cc
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/device_set_impl.h"
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/testing/test_credentials_provider.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/testing/test_firestore_service.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace cloud_provider_firestore {
-namespace {
-
-class DeviceSetImplTest : public gtest::TestLoopFixture,
-                          public cloud_provider::DeviceSetWatcher {
- public:
-  DeviceSetImplTest()
-      : test_credentials_provider_(dispatcher()),
-        device_set_impl_("user_path", &test_credentials_provider_,
-                         &firestore_service_, device_set_.NewRequest()),
-        watcher_binding_(this) {}
-
-  // cloud_provider::DeviceSetWatcher:
-  void OnCloudErased() override { on_cloud_erased_calls_++; }
-
-  void OnNetworkError() override { on_network_error_calls_++; }
-
- protected:
-  cloud_provider::DeviceSetPtr device_set_;
-  TestCredentialsProvider test_credentials_provider_;
-  TestFirestoreService firestore_service_;
-  DeviceSetImpl device_set_impl_;
-
-  fidl::Binding<cloud_provider::DeviceSetWatcher> watcher_binding_;
-  int on_cloud_erased_calls_ = 0;
-  int on_network_error_calls_ = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(DeviceSetImplTest);
-};
-
-TEST_F(DeviceSetImplTest, EmptyWhenDisconnected) {
-  bool on_empty_called = false;
-  device_set_impl_.set_on_empty(callback::SetWhenCalled(&on_empty_called));
-  device_set_.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(on_empty_called);
-}
-
-TEST_F(DeviceSetImplTest, CheckFingerprintOk) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  device_set_->CheckFingerprint(
-      convert::ToArray("abc"),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1u, firestore_service_.get_document_records.size());
-
-  firestore_service_.get_document_records.front().callback(
-      grpc::Status(), google::firestore::v1beta1::Document());
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-}
-
-TEST_F(DeviceSetImplTest, CheckFingerprintNotFound) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  device_set_->CheckFingerprint(
-      convert::ToArray("abc"),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1u, firestore_service_.get_document_records.size());
-
-  firestore_service_.get_document_records.front().callback(
-      grpc::Status(grpc::NOT_FOUND, ""),
-      google::firestore::v1beta1::Document());
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::NOT_FOUND, status);
-}
-
-TEST_F(DeviceSetImplTest, SetFingerprint) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  device_set_->SetFingerprint(
-      convert::ToArray("abc"),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1u, firestore_service_.create_document_records.size());
-
-  firestore_service_.create_document_records.front().callback(
-      grpc::Status(), google::firestore::v1beta1::Document());
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-}
-
-TEST_F(DeviceSetImplTest, SetWatcherResultOk) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  cloud_provider::DeviceSetWatcherPtr watcher;
-  watcher_binding_.Bind(watcher.NewRequest());
-  device_set_->SetWatcher(
-      convert::ToArray("abc"), std::move(watcher),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, firestore_service_.listen_clients.size());
-  EXPECT_FALSE(callback_called);
-
-  auto response = google::firestore::v1beta1::ListenResponse();
-  response.mutable_target_change()->set_target_change_type(
-      google::firestore::v1beta1::TargetChange_TargetChangeType_CURRENT);
-  firestore_service_.listen_clients[0]->OnResponse(std::move(response));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-  EXPECT_EQ(0, on_cloud_erased_calls_);
-}
-
-TEST_F(DeviceSetImplTest, SetWatcherResultCloudErased) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  cloud_provider::DeviceSetWatcherPtr watcher;
-  watcher_binding_.Bind(watcher.NewRequest());
-  device_set_->SetWatcher(
-      convert::ToArray("abc"), std::move(watcher),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, firestore_service_.listen_clients.size());
-  EXPECT_FALSE(callback_called);
-
-  auto response = google::firestore::v1beta1::ListenResponse();
-  response.mutable_document_delete();
-  firestore_service_.listen_clients[0]->OnResponse(std::move(response));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::NOT_FOUND, status);
-  EXPECT_EQ(1, on_cloud_erased_calls_);
-}
-
-TEST_F(DeviceSetImplTest, Erase) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  device_set_->Erase(
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1u, firestore_service_.list_documents_records.size());
-
-  auto response = google::firestore::v1beta1::ListDocumentsResponse();
-  response.add_documents()->set_name("some/document/name");
-  response.add_documents()->set_name("some/other/name");
-  firestore_service_.list_documents_records[0].callback(grpc::Status::OK,
-                                                        std::move(response));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(2u, firestore_service_.delete_document_records.size());
-  EXPECT_EQ("some/document/name",
-            firestore_service_.delete_document_records[0].request.name());
-  EXPECT_EQ("some/other/name",
-            firestore_service_.delete_document_records[1].request.name());
-
-  firestore_service_.delete_document_records[0].callback(grpc::Status::OK);
-  firestore_service_.delete_document_records[1].callback(grpc::Status::OK);
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-}
-
-// Paginated response from the device map list is not currently handled - we
-// give up and return INTERNAL_ERROR. When we add support for pagination, this
-// test should be edited to verify the correct behavior.
-TEST_F(DeviceSetImplTest, EraseWithPaginatedDeviceListResponse) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::OK;
-  device_set_->Erase(
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1u, firestore_service_.list_documents_records.size());
-
-  auto response = google::firestore::v1beta1::ListDocumentsResponse();
-  response.add_documents()->set_name("some/document/name");
-  response.add_documents()->set_name("some/other/name");
-  response.set_next_page_token("token");
-  firestore_service_.list_documents_records[0].callback(grpc::Status::OK,
-                                                        std::move(response));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::INTERNAL_ERROR, status);
-}
-
-}  // namespace
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/factory_impl.cc b/bin/cloud_provider_firestore/app/factory_impl.cc
deleted file mode 100644
index 46fb4e4..0000000
--- a/bin/cloud_provider_firestore/app/factory_impl.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/factory_impl.h"
-
-#include <grpc++/grpc++.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/cloud_provider_firestore/firestore/firestore_service_impl.h"
-
-namespace cloud_provider_firestore {
-
-namespace {
-std::shared_ptr<grpc::Channel> MakeChannel() {
-  auto opts = grpc::SslCredentialsOptions();
-  auto credentials = grpc::SslCredentials(opts);
-  return grpc::CreateChannel("firestore.googleapis.com:443", credentials);
-}
-
-firebase_auth::FirebaseAuthImpl::Config GetFirebaseAuthConfig(
-    const std::string& api_key, const std::string& cobalt_client_name) {
-  firebase_auth::FirebaseAuthImpl::Config config;
-  config.api_key = api_key;
-  config.cobalt_client_name = cobalt_client_name;
-
-  return config;
-}
-
-}  // namespace
-
-FactoryImpl::FactoryImpl(async_dispatcher_t* dispatcher, rng::Random* random,
-                         component::StartupContext* startup_context,
-                         std::string cobalt_client_name)
-    : dispatcher_(dispatcher),
-      random_(random),
-      startup_context_(startup_context),
-      cobalt_client_name_(std::move(cobalt_client_name)) {}
-
-FactoryImpl::~FactoryImpl() {}
-
-void FactoryImpl::ShutDown(fit::closure callback) {
-  if (providers_.empty()) {
-    callback();
-    return;
-  }
-
-  providers_.set_on_empty(std::move(callback));
-  for (auto& cloud_provider : providers_) {
-    cloud_provider.ShutDownAndReportEmpty();
-  }
-}
-
-void FactoryImpl::GetCloudProvider(
-    Config config,
-    fidl::InterfaceHandle<fuchsia::auth::TokenManager> token_manager,
-    fidl::InterfaceRequest<cloud_provider::CloudProvider>
-        cloud_provider_request,
-    GetCloudProviderCallback callback) {
-  auto firebase_auth = std::make_unique<firebase_auth::FirebaseAuthImpl>(
-      GetFirebaseAuthConfig(config.api_key, cobalt_client_name_), dispatcher_,
-      random_, token_manager.Bind(), startup_context_);
-
-  GetFirebaseCloudProvider(std::move(config), std::move(firebase_auth),
-                           std::move(cloud_provider_request),
-                           std::move(callback));
-}
-
-void FactoryImpl::GetFirebaseCloudProvider(
-    Config config,
-    std::unique_ptr<firebase_auth::FirebaseAuthImpl> firebase_auth,
-    fidl::InterfaceRequest<cloud_provider::CloudProvider>
-        cloud_provider_request,
-    fit::function<void(cloud_provider::Status)> callback) {
-  FXL_DCHECK(firebase_auth);
-
-  auto token_request =
-      firebase_auth->GetFirebaseUserId(fxl::MakeCopyable(
-          [this, config = std::move(config),
-           firebase_auth = std::move(firebase_auth),
-           cloud_provider_request = std::move(cloud_provider_request),
-           callback = std::move(callback)](firebase_auth::AuthStatus status,
-                                           std::string user_id) mutable {
-            if (status != firebase_auth::AuthStatus::OK) {
-              FXL_LOG(ERROR)
-                  << "Failed to retrieve the user ID from auth token provider";
-              callback(cloud_provider::Status::AUTH_ERROR);
-              return;
-            }
-
-            auto firestore_service = std::make_unique<FirestoreServiceImpl>(
-                config.server_id, dispatcher_, MakeChannel());
-
-            providers_.emplace(random_, user_id, std::move(firebase_auth),
-                               std::move(firestore_service),
-                               std::move(cloud_provider_request));
-            callback(cloud_provider::Status::OK);
-          }));
-  token_requests_.emplace(token_request);
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/factory_impl.h b/bin/cloud_provider_firestore/app/factory_impl.h
deleted file mode 100644
index df8ffb4..0000000
--- a/bin/cloud_provider_firestore/app/factory_impl.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_FACTORY_IMPL_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_FACTORY_IMPL_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <fuchsia/ledger/cloud/firestore/cpp/fidl.h>
-#include <lib/async/dispatcher.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/callback/cancellable.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/cloud_provider_impl.h"
-#include "peridot/lib/rng/random.h"
-
-namespace cloud_provider_firestore {
-
-class FactoryImpl : public Factory {
- public:
-  explicit FactoryImpl(async_dispatcher_t* dispatcher, rng::Random* random,
-                       component::StartupContext* startup_context,
-                       std::string cobalt_client_name);
-
-  ~FactoryImpl() override;
-
-  // Shuts down all cloud providers owned by the class.
-  //
-  // It is only valid to delete the factory after the completion callback is
-  // called.
-  void ShutDown(fit::closure callback);
-
- private:
-  // Factory:
-  void GetCloudProvider(
-      Config config,
-      fidl::InterfaceHandle<fuchsia::auth::TokenManager> token_manager,
-      fidl::InterfaceRequest<cloud_provider::CloudProvider>
-          cloud_provider_request,
-      GetCloudProviderCallback callback) override;
-
-  void GetFirebaseCloudProvider(
-      Config config,
-      std::unique_ptr<firebase_auth::FirebaseAuthImpl> firebase_auth,
-      fidl::InterfaceRequest<cloud_provider::CloudProvider>
-          cloud_provider_request,
-      fit::function<void(cloud_provider::Status)> callback);
-
-  async_dispatcher_t* const dispatcher_;
-  rng::Random* random_;
-  component::StartupContext* const startup_context_;
-  const std::string cobalt_client_name_;
-  callback::CancellableContainer token_requests_;
-  callback::AutoCleanableSet<CloudProviderImpl> providers_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FactoryImpl);
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_FACTORY_IMPL_H_
diff --git a/bin/cloud_provider_firestore/app/factory_impl_unittest.cc b/bin/cloud_provider_firestore/app/factory_impl_unittest.cc
deleted file mode 100644
index 42c88a8..0000000
--- a/bin/cloud_provider_firestore/app/factory_impl_unittest.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/factory_impl.h"
-
-#include <fuchsia/ledger/cloud/firestore/cpp/fidl.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/lib/firebase_auth/testing/test_token_manager.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace cloud_provider_firestore {
-
-class FactoryImplTest : public gtest::TestLoopFixture {
- public:
-  FactoryImplTest()
-      : random_(test_loop().initial_state()),
-        factory_impl_(dispatcher(), &random_, /*startup_context=*/nullptr,
-                      /*cobalt_client_name=*/""),
-        factory_binding_(&factory_impl_, factory_.NewRequest()),
-        token_manager_(dispatcher()),
-        token_manager_binding_(&token_manager_) {}
-  ~FactoryImplTest() override {}
-
- protected:
-  rng::TestRandom random_;
-  FactoryImpl factory_impl_;
-  FactoryPtr factory_;
-  fidl::Binding<Factory> factory_binding_;
-
-  firebase_auth::TestTokenManager token_manager_;
-  fidl::Binding<fuchsia::auth::TokenManager> token_manager_binding_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(FactoryImplTest);
-};
-
-TEST_F(FactoryImplTest, GetCloudProvider) {
-  bool callback_called = false;
-  token_manager_.Set("this is a token", "some id", "me@example.com");
-
-  cloud_provider::Status status = cloud_provider::Status::INTERNAL_ERROR;
-  cloud_provider::CloudProviderPtr cloud_provider;
-  Config config;
-  config.server_id = "some server id";
-  config.api_key = "some api key";
-  factory_->GetCloudProvider(
-      std::move(config), token_manager_binding_.NewBinding(),
-      cloud_provider.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-
-  callback_called = false;
-  factory_impl_.ShutDown(callback::SetWhenCalled(&callback_called));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/grpc_status.cc b/bin/cloud_provider_firestore/app/grpc_status.cc
deleted file mode 100644
index ac54e5f..0000000
--- a/bin/cloud_provider_firestore/app/grpc_status.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/grpc_status.h"
-
-#include <lib/fxl/logging.h>
-
-namespace cloud_provider_firestore {
-
-cloud_provider::Status ConvertGrpcStatus(grpc::StatusCode status) {
-  switch (status) {
-    case grpc::OK:
-      return cloud_provider::Status::OK;
-    case grpc::UNAUTHENTICATED:
-      return cloud_provider::Status::AUTH_ERROR;
-    case grpc::NOT_FOUND:
-      return cloud_provider::Status::NOT_FOUND;
-    case grpc::UNAVAILABLE:
-      return cloud_provider::Status::NETWORK_ERROR;
-    default:
-      return cloud_provider::Status::SERVER_ERROR;
-  }
-}
-
-bool LogGrpcRequestError(const grpc::Status& status) {
-  if (!status.ok()) {
-    FXL_LOG(ERROR) << "Server request failed, "
-                   << "error message: " << status.error_message()
-                   << ", error details: " << status.error_details()
-                   << ", error code: " << status.error_code();
-    return true;
-  }
-
-  return false;
-}
-
-bool LogGrpcConnectionError(const grpc::Status& status) {
-  if (!status.ok()) {
-    FXL_LOG(ERROR) << "Server unexpectedly closed the connection "
-                   << "with status: " << status.error_message()
-                   << ", error details: " << status.error_details()
-                   << ", error code: " << status.error_code();
-    return true;
-    return true;
-  }
-
-  return false;
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/grpc_status.h b/bin/cloud_provider_firestore/app/grpc_status.h
deleted file mode 100644
index 6e78ab6..0000000
--- a/bin/cloud_provider_firestore/app/grpc_status.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_GRPC_STATUS_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_GRPC_STATUS_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <grpc++/grpc++.h>
-
-#include "peridot/bin/cloud_provider_firestore/include/types.h"
-
-namespace cloud_provider_firestore {
-
-cloud_provider::Status ConvertGrpcStatus(grpc::StatusCode status);
-
-// If |status| is not OK, logs an error and returns true. Otherwise, returns
-// false.
-bool LogGrpcRequestError(const grpc::Status& status);
-
-// If |status| is not OK, logs an error and returns true. Otherwise, returns
-// false.
-bool LogGrpcConnectionError(const grpc::Status& status);
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_GRPC_STATUS_H_
diff --git a/bin/cloud_provider_firestore/app/meta/cloud_provider_firestore.cmx b/bin/cloud_provider_firestore/app/meta/cloud_provider_firestore.cmx
deleted file mode 100644
index c4027f6..0000000
--- a/bin/cloud_provider_firestore/app/meta/cloud_provider_firestore.cmx
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [
-            "root-ssl-certificates"
-        ],
-        "services": [
-            "fuchsia.tracelink.Registry",
-            "fuchsia.net.LegacySocketProvider",
-            "fuchsia.net.SocketProvider",
-            "fuchsia.cobalt.LoggerFactory"
-        ]
-    }
-}
diff --git a/bin/cloud_provider_firestore/app/page_cloud_impl.cc b/bin/cloud_provider_firestore/app/page_cloud_impl.cc
deleted file mode 100644
index 4265eef..0000000
--- a/bin/cloud_provider_firestore/app/page_cloud_impl.cc
+++ /dev/null
@@ -1,423 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/page_cloud_impl.h"
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fsl/vmo/sized_vmo.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/strings/concatenate.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/grpc_status.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/encoding.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace cloud_provider_firestore {
-namespace {
-
-constexpr char kSeparator[] = "/";
-constexpr char kObjectCollection[] = "objects";
-constexpr char kCommitLogCollection[] = "commit-log";
-constexpr char kDataKey[] = "data";
-constexpr char kTimestampField[] = "timestamp";
-constexpr size_t kFirestoreMaxDocumentSize = 1'000'000;
-// Ledger stores objects chunked to ~64k, so even 500kB is more than should ever
-// be needed.
-constexpr size_t kMaxObjectSize = kFirestoreMaxDocumentSize / 2;
-
-std::string GetObjectPath(fxl::StringView page_path,
-                          fxl::StringView object_id) {
-  std::string encoded_object_id = EncodeKey(object_id);
-  return fxl::Concatenate({page_path, kSeparator, kObjectCollection, kSeparator,
-                           encoded_object_id});
-}
-
-std::string GetCommitBatchPath(fxl::StringView page_path,
-                               fxl::StringView batch_id) {
-  std::string encoded_batch_id = EncodeKey(batch_id);
-  return fxl::Concatenate({page_path, kSeparator, kCommitLogCollection,
-                           kSeparator, encoded_batch_id});
-}
-
-google::firestore::v1beta1::StructuredQuery MakeCommitQuery(
-    std::unique_ptr<google::protobuf::Timestamp> timestamp_or_null) {
-  google::firestore::v1beta1::StructuredQuery query;
-
-  // Sub-collections to be queried.
-  google::firestore::v1beta1::StructuredQuery::CollectionSelector& selector =
-      *query.add_from();
-  selector.set_collection_id(kCommitLogCollection);
-  selector.set_all_descendants(false);
-
-  // Ordering.
-  google::firestore::v1beta1::StructuredQuery::Order& order_by =
-      *query.add_order_by();
-  order_by.mutable_field()->set_field_path(kTimestampField);
-
-  // Filtering.
-  if (timestamp_or_null) {
-    google::firestore::v1beta1::StructuredQuery::Filter& filter =
-        *query.mutable_where();
-    google::firestore::v1beta1::StructuredQuery::FieldFilter& field_filter =
-        *filter.mutable_field_filter();
-
-    field_filter.mutable_field()->set_field_path(kTimestampField);
-    field_filter.set_op(
-        google::firestore::v1beta1::
-            StructuredQuery_FieldFilter_Operator_GREATER_THAN_OR_EQUAL);
-    field_filter.mutable_value()->mutable_timestamp_value()->Swap(
-        timestamp_or_null.get());
-  }
-  return query;
-}
-
-}  // namespace
-
-PageCloudImpl::PageCloudImpl(
-    std::string page_path, rng::Random* random,
-    CredentialsProvider* credentials_provider,
-    FirestoreService* firestore_service,
-    fidl::InterfaceRequest<cloud_provider::PageCloud> request)
-    : page_path_(std::move(page_path)),
-      random_(random),
-      credentials_provider_(credentials_provider),
-      firestore_service_(firestore_service),
-      binding_(this, std::move(request)),
-      weak_ptr_factory_(this) {
-  // The class shuts down when the client connection is disconnected.
-  binding_.set_error_handler([this](zx_status_t status) {
-    if (on_empty_) {
-      on_empty_();
-    }
-  });
-}
-
-PageCloudImpl::~PageCloudImpl() {}
-
-void PageCloudImpl::ScopedGetCredentials(
-    fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback) {
-  credentials_provider_->GetCredentials(callback::MakeScoped(
-      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
-}
-
-void PageCloudImpl::AddCommits(cloud_provider::CommitPack commits,
-                               AddCommitsCallback callback) {
-  std::vector<cloud_provider::CommitPackEntry> commit_pack_entries;
-  if (!cloud_provider::DecodeCommitPack(commits, &commit_pack_entries)) {
-    callback(cloud_provider::Status::ARGUMENT_ERROR);
-    return;
-  }
-
-  auto request = google::firestore::v1beta1::CommitRequest();
-  request.set_database(firestore_service_->GetDatabasePath());
-
-  // Set the document name to a new UUID. Firestore Commit() API doesn't allow
-  // to request the ID to be assigned by the server.
-  const std::string document_name = GetCommitBatchPath(
-      page_path_, convert::ToHex(random_->RandomUniqueBytes()));
-
-  // The commit batch is added in a single commit containing multiple writes.
-  //
-  // First write adds the document containing the encoded commit batch.
-  google::firestore::v1beta1::Write& add_batch_write = *(request.add_writes());
-  EncodeCommitBatch(commits, add_batch_write.mutable_update());
-  (*add_batch_write.mutable_update()->mutable_name()) = document_name;
-  // Ensure that the write doesn't overwrite an existing document.
-  add_batch_write.mutable_current_document()->set_exists(false);
-
-  // The second write sets the timestamp field to the server-side request
-  // timestamp.
-  google::firestore::v1beta1::Write& set_timestamp_write =
-      *(request.add_writes());
-  (*set_timestamp_write.mutable_transform()->mutable_document()) =
-      document_name;
-
-  google::firestore::v1beta1::DocumentTransform_FieldTransform& transform =
-      *(set_timestamp_write.mutable_transform()->add_field_transforms());
-  *(transform.mutable_field_path()) = kTimestampField;
-  transform.set_set_to_server_value(
-      google::firestore::v1beta1::
-          DocumentTransform_FieldTransform_ServerValue_REQUEST_TIME);
-
-  ScopedGetCredentials(
-      [this, request = std::move(request),
-       callback = std::move(callback)](auto call_credentials) mutable {
-        firestore_service_->Commit(
-            std::move(request), std::move(call_credentials),
-            [callback = std::move(callback)](auto status, auto result) {
-              if (LogGrpcRequestError(status)) {
-                callback(ConvertGrpcStatus(status.error_code()));
-                return;
-              }
-              callback(cloud_provider::Status::OK);
-            });
-      });
-}
-
-void PageCloudImpl::GetCommits(
-    std::unique_ptr<cloud_provider::Token> min_position_token,
-    GetCommitsCallback callback) {
-  std::unique_ptr<google::protobuf::Timestamp> timestamp_or_null;
-  if (min_position_token) {
-    timestamp_or_null = std::make_unique<google::protobuf::Timestamp>();
-    if (!timestamp_or_null->ParseFromString(
-            convert::ToString(min_position_token->opaque_id))) {
-      callback(cloud_provider::Status::ARGUMENT_ERROR, nullptr, nullptr);
-      return;
-    }
-  }
-
-  auto request = google::firestore::v1beta1::RunQueryRequest();
-  request.set_parent(page_path_);
-  auto query = MakeCommitQuery(std::move(timestamp_or_null));
-  request.mutable_structured_query()->Swap(&query);
-
-  ScopedGetCredentials([this, request = std::move(request),
-                        callback = std::move(callback)](
-                           auto call_credentials) mutable {
-    firestore_service_->RunQuery(
-        std::move(request), std::move(call_credentials),
-        [callback = std::move(callback)](auto status, auto result) {
-          if (LogGrpcRequestError(status)) {
-            callback(ConvertGrpcStatus(status.error_code()), nullptr, nullptr);
-            return;
-          }
-
-          std::vector<cloud_provider::CommitPackEntry> commit_entries;
-          std::string timestamp;
-
-          for (const auto& response : result) {
-            if (!response.has_document()) {
-              continue;
-            }
-
-            std::vector<cloud_provider::CommitPackEntry> batch_entries;
-            if (!DecodeCommitBatch(response.document(), &batch_entries,
-                                   &timestamp)) {
-              callback(cloud_provider::Status::PARSE_ERROR, nullptr, nullptr);
-              return;
-            }
-
-            std::move(batch_entries.begin(), batch_entries.end(),
-                      std::back_inserter(commit_entries));
-          }
-
-          cloud_provider::CommitPack commit_pack;
-          if (!cloud_provider::EncodeCommitPack(commit_entries, &commit_pack)) {
-            callback(cloud_provider::Status::INTERNAL_ERROR, nullptr, nullptr);
-            return;
-          }
-
-          std::unique_ptr<cloud_provider::Token> token;
-          if (!commit_entries.empty()) {
-            token = std::make_unique<cloud_provider::Token>();
-            token->opaque_id = convert::ToArray(timestamp);
-          }
-          callback(cloud_provider::Status::OK,
-                   fidl::MakeOptional(std::move(commit_pack)),
-                   std::move(token));
-        });
-  });
-}
-
-void PageCloudImpl::AddObject(std::vector<uint8_t> id,
-                              fuchsia::mem::Buffer data,
-                              AddObjectCallback callback) {
-  std::string data_str;
-  fsl::SizedVmo vmo;
-  if (!fsl::StringFromVmo(data, &data_str) ||
-      data_str.size() > kMaxObjectSize) {
-    callback(cloud_provider::Status::ARGUMENT_ERROR);
-    return;
-  }
-
-  auto request = google::firestore::v1beta1::CreateDocumentRequest();
-  request.set_parent(page_path_);
-  request.set_collection_id(kObjectCollection);
-  google::firestore::v1beta1::Document* document = request.mutable_document();
-  request.set_document_id(EncodeKey(convert::ToString(id)));
-  *((*document->mutable_fields())[kDataKey].mutable_bytes_value()) =
-      std::move(data_str);
-
-  ScopedGetCredentials(
-      [this, request = std::move(request),
-       callback = std::move(callback)](auto call_credentials) mutable {
-        firestore_service_->CreateDocument(
-            std::move(request), std::move(call_credentials),
-            [callback = std::move(callback)](auto status, auto result) {
-              if (status.error_code() == grpc::ALREADY_EXISTS) {
-                callback(cloud_provider::Status::OK);
-                return;
-              }
-              if (LogGrpcRequestError(status)) {
-                callback(ConvertGrpcStatus(status.error_code()));
-                return;
-              }
-              callback(cloud_provider::Status::OK);
-            });
-      });
-}
-
-void PageCloudImpl::GetObject(std::vector<uint8_t> id,
-                              GetObjectCallback callback) {
-  auto request = google::firestore::v1beta1::GetDocumentRequest();
-  request.set_name(GetObjectPath(page_path_, convert::ToString(id)));
-
-  ScopedGetCredentials(
-      [this, request = std::move(request),
-       callback = std::move(callback)](auto call_credentials) mutable {
-        firestore_service_->GetDocument(
-            std::move(request), std::move(call_credentials),
-            [callback = std::move(callback)](auto status, auto result) {
-              if (LogGrpcRequestError(status)) {
-                callback(ConvertGrpcStatus(status.error_code()), nullptr);
-                return;
-              }
-
-              if (result.fields().count(kDataKey) != 1) {
-                FXL_LOG(ERROR)
-                    << "Incorrect format of the retrieved object document";
-                callback(cloud_provider::Status::PARSE_ERROR, nullptr);
-                return;
-              }
-
-              const std::string& bytes =
-                  result.fields().at(kDataKey).bytes_value();
-              ::fuchsia::mem::Buffer buffer;
-              if (!fsl::VmoFromString(bytes, &buffer)) {
-                callback(cloud_provider::Status::INTERNAL_ERROR, nullptr);
-                return;
-              }
-              callback(cloud_provider::Status::OK,
-                       fidl::MakeOptional(std::move(buffer)));
-            });
-      });
-}
-
-void PageCloudImpl::SetWatcher(
-    std::unique_ptr<cloud_provider::Token> min_position_token,
-    fidl::InterfaceHandle<cloud_provider::PageCloudWatcher> watcher,
-    SetWatcherCallback callback) {
-  std::unique_ptr<google::protobuf::Timestamp> timestamp_or_null;
-  if (min_position_token) {
-    timestamp_or_null = std::make_unique<google::protobuf::Timestamp>();
-    if (!timestamp_or_null->ParseFromString(
-            convert::ToString(min_position_token->opaque_id))) {
-      callback(cloud_provider::Status::ARGUMENT_ERROR);
-      return;
-    }
-  }
-
-  watcher_ = watcher.Bind();
-  watcher_.set_error_handler([this](zx_status_t status) { ShutDownWatcher(); });
-  watcher_timestamp_or_null_ = std::move(timestamp_or_null);
-  set_watcher_callback_ = std::move(callback);
-
-  ScopedGetCredentials([this](auto call_credentials) mutable {
-    // Initiate the listen RPC. We will receive a call on OnConnected() when the
-    // listen stream is ready.
-    listen_call_handler_ =
-        firestore_service_->Listen(std::move(call_credentials), this);
-  });
-}
-
-void PageCloudImpl::OnConnected() {
-  auto request = google::firestore::v1beta1::ListenRequest();
-  request.set_database(firestore_service_->GetDatabasePath());
-  google::firestore::v1beta1::Target::QueryTarget& query_target =
-      *request.mutable_add_target()->mutable_query();
-  query_target.set_parent(page_path_);
-  auto query = MakeCommitQuery(std::move(watcher_timestamp_or_null_));
-  query_target.mutable_structured_query()->Swap(&query);
-  listen_call_handler_->Write(std::move(request));
-}
-
-void PageCloudImpl::OnResponse(
-    google::firestore::v1beta1::ListenResponse response) {
-  if (response.has_target_change()) {
-    if (response.target_change().target_change_type() ==
-        google::firestore::v1beta1::TargetChange_TargetChangeType_CURRENT) {
-      if (set_watcher_callback_) {
-        set_watcher_callback_(cloud_provider::Status::OK);
-        set_watcher_callback_ = nullptr;
-      }
-    }
-    return;
-  }
-
-  if (response.has_document_change()) {
-    std::string timestamp;
-
-    std::vector<cloud_provider::CommitPackEntry> commit_entries;
-    if (!DecodeCommitBatch(response.document_change().document(),
-                           &commit_entries, &timestamp)) {
-      watcher_->OnError(cloud_provider::Status::PARSE_ERROR);
-      ShutDownWatcher();
-    }
-
-    cloud_provider::Token token;
-    token.opaque_id = convert::ToArray(timestamp);
-    HandleCommits(std::move(commit_entries), std::move(token));
-  }
-}
-
-void PageCloudImpl::OnFinished(grpc::Status status) {
-  if (status.error_code() == grpc::UNAVAILABLE ||
-      status.error_code() == grpc::UNAUTHENTICATED) {
-    if (watcher_) {
-      watcher_->OnError(cloud_provider::Status::NETWORK_ERROR);
-    }
-    return;
-  }
-  LogGrpcConnectionError(status);
-  watcher_.Unbind();
-}
-
-void PageCloudImpl::HandleCommits(
-    std::vector<cloud_provider::CommitPackEntry> commit_entries,
-    cloud_provider::Token token) {
-  std::move(commit_entries.begin(), commit_entries.end(),
-            std::back_inserter(commits_waiting_for_ack_));
-  token_for_waiting_commits_ = std::move(token);
-
-  if (!waiting_for_watcher_to_ack_commits_) {
-    SendWaitingCommits();
-  }
-}
-
-void PageCloudImpl::SendWaitingCommits() {
-  FXL_DCHECK(watcher_);
-  FXL_DCHECK(!commits_waiting_for_ack_.empty());
-  cloud_provider::Token token = std::move(token_for_waiting_commits_);
-  cloud_provider::CommitPack commit_pack;
-  if (!cloud_provider::EncodeCommitPack(commits_waiting_for_ack_,
-                                        &commit_pack)) {
-    watcher_->OnError(cloud_provider::Status::INTERNAL_ERROR);
-    ShutDownWatcher();
-    return;
-  }
-  watcher_->OnNewCommits(std::move(commit_pack), std::move(token), [this] {
-    waiting_for_watcher_to_ack_commits_ = false;
-    if (!commits_waiting_for_ack_.empty()) {
-      SendWaitingCommits();
-    }
-  });
-  waiting_for_watcher_to_ack_commits_ = true;
-  commits_waiting_for_ack_.clear();
-}
-
-void PageCloudImpl::ShutDownWatcher() {
-  if (watcher_) {
-    watcher_.Unbind();
-  }
-  if (listen_call_handler_) {
-    listen_call_handler_.reset();
-  }
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/page_cloud_impl.h b/bin/cloud_provider_firestore/app/page_cloud_impl.h
deleted file mode 100644
index 4eb5ad1..0000000
--- a/bin/cloud_provider_firestore/app/page_cloud_impl.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_PAGE_CLOUD_IMPL_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_PAGE_CLOUD_IMPL_H_
-
-#include <memory>
-#include <utility>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/vector.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/credentials_provider.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/firestore_service.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/listen_call_client.h"
-#include "peridot/bin/cloud_provider_firestore/include/types.h"
-#include "peridot/lib/commit_pack/commit_pack.h"
-#include "peridot/lib/rng/random.h"
-
-namespace cloud_provider_firestore {
-
-class PageCloudImpl : public cloud_provider::PageCloud,
-                      public ListenCallClient {
- public:
-  explicit PageCloudImpl(
-      std::string page_path, rng::Random* random,
-      CredentialsProvider* credentials_provider,
-      FirestoreService* firestore_service,
-      fidl::InterfaceRequest<cloud_provider::PageCloud> request);
-  ~PageCloudImpl() override;
-
-  void set_on_empty(fit::closure on_empty) { on_empty_ = std::move(on_empty); }
-
- private:
-  void ScopedGetCredentials(
-      fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback);
-
-  // cloud_provider::PageCloud:
-  void AddCommits(cloud_provider::CommitPack commits,
-                  AddCommitsCallback callback) override;
-  void GetCommits(std::unique_ptr<cloud_provider::Token> min_position_token,
-                  GetCommitsCallback callback) override;
-  void AddObject(std::vector<uint8_t> id, fuchsia::mem::Buffer data,
-                 AddObjectCallback callback) override;
-  void GetObject(std::vector<uint8_t> id,
-                 GetObjectCallback callback) override;
-  void SetWatcher(
-      std::unique_ptr<cloud_provider::Token> min_position_token,
-      fidl::InterfaceHandle<cloud_provider::PageCloudWatcher> watcher,
-      SetWatcherCallback callback) override;
-
-  // ListenCallClient:
-  void OnConnected() override;
-
-  void OnResponse(google::firestore::v1beta1::ListenResponse response) override;
-
-  void OnFinished(grpc::Status status) override;
-
-  // Handles new commits delivered from the cloud watcher.
-  //
-  // This will either send over the commits immediately or queue them if we're
-  // waiting the the watcher to ack the previous call.
-  void HandleCommits(
-      std::vector<cloud_provider::CommitPackEntry> commit_entries,
-      cloud_provider::Token token);
-
-  void SendWaitingCommits();
-
-  // Brings down the cloud watcher.
-  //
-  // This can be called either because of an error, or because the client is
-  // gone.
-  void ShutDownWatcher();
-
-  const std::string page_path_;
-  rng::Random* const random_;
-  CredentialsProvider* const credentials_provider_;
-  FirestoreService* const firestore_service_;
-
-  fidl::Binding<cloud_provider::PageCloud> binding_;
-  fit::closure on_empty_;
-
-  // Watcher set by the client.
-  cloud_provider::PageCloudWatcherPtr watcher_;
-  std::unique_ptr<google::protobuf::Timestamp> watcher_timestamp_or_null_;
-  SetWatcherCallback set_watcher_callback_;
-  std::unique_ptr<ListenCallHandler> listen_call_handler_;
-
-  // We will only call OnNewCommits() on the watcher when the callback of the
-  // previous OnNewCommits() call is already called. Any commits delivered
-  // between an OnNewCommits() call and its callback executing are queued in
-  // |commits_waiting_for_ack_|.
-  bool waiting_for_watcher_to_ack_commits_ = false;
-  std::vector<cloud_provider::CommitPackEntry> commits_waiting_for_ack_;
-  cloud_provider::Token token_for_waiting_commits_;
-
-  // Must be the last member.
-  fxl::WeakPtrFactory<PageCloudImpl> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageCloudImpl);
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_PAGE_CLOUD_IMPL_H_
diff --git a/bin/cloud_provider_firestore/app/page_cloud_impl_unittest.cc b/bin/cloud_provider_firestore/app/page_cloud_impl_unittest.cc
deleted file mode 100644
index f22eae4..0000000
--- a/bin/cloud_provider_firestore/app/page_cloud_impl_unittest.cc
+++ /dev/null
@@ -1,456 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/page_cloud_impl.h"
-
-#include <iterator>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <google/protobuf/util/time_util.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/vector.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fsl/vmo/sized_vmo.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/testing/test_credentials_provider.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/encoding.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/testing/encoding.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/testing/test_firestore_service.h"
-#include "peridot/lib/commit_pack/commit_pack.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace cloud_provider_firestore {
-namespace {
-
-void SetTimestamp(google::firestore::v1beta1::Document* document,
-                  int64_t seconds, int32_t nanos) {
-  google::protobuf::Timestamp& timestamp =
-      *((*document->mutable_fields())["timestamp"].mutable_timestamp_value());
-  timestamp.set_seconds(seconds);
-  timestamp.set_nanos(nanos);
-}
-
-class TestPageCloudWatcher : public cloud_provider::PageCloudWatcher {
- public:
-  TestPageCloudWatcher() {}
-  ~TestPageCloudWatcher() override {}
-
-  std::vector<cloud_provider::CommitPackEntry> received_commits;
-  std::vector<cloud_provider::Token> received_tokens;
-  OnNewCommitsCallback pending_on_new_commit_callback = nullptr;
-
- private:
-  // cloud_provider::PageCloudWatcher:
-  void OnNewCommits(cloud_provider::CommitPack commit_pack,
-                    cloud_provider::Token position_token,
-                    OnNewCommitsCallback callback) override {
-    std::vector<cloud_provider::CommitPackEntry> entries;
-    EXPECT_TRUE(cloud_provider::DecodeCommitPack(commit_pack, &entries));
-    std::move(entries.begin(), entries.end(),
-              std::back_inserter(received_commits));
-    received_tokens.push_back(std::move(position_token));
-
-    EXPECT_FALSE(pending_on_new_commit_callback);
-    pending_on_new_commit_callback = std::move(callback);
-  }
-
-  void OnNewObject(std::vector<uint8_t> /*id*/,
-                   fuchsia::mem::Buffer /*buffer*/,
-                   OnNewObjectCallback /*callback*/) override {
-    FXL_NOTIMPLEMENTED();
-  }
-
-  void OnError(cloud_provider::Status /*status*/) override {
-    FXL_NOTIMPLEMENTED();
-  }
-};
-
-class PageCloudImplTest : public gtest::TestLoopFixture {
- public:
-  PageCloudImplTest()
-      : random_(test_loop().initial_state()),
-        test_credentials_provider_(dispatcher()),
-        page_cloud_impl_("page_path", &random_, &test_credentials_provider_,
-                         &firestore_service_, page_cloud_.NewRequest()) {}
-  ~PageCloudImplTest() override {}
-
- protected:
-  rng::TestRandom random_;
-  cloud_provider::PageCloudPtr page_cloud_;
-  TestCredentialsProvider test_credentials_provider_;
-  TestFirestoreService firestore_service_;
-  PageCloudImpl page_cloud_impl_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageCloudImplTest);
-};
-
-TEST_F(PageCloudImplTest, EmptyWhenDisconnected) {
-  bool on_empty_called = false;
-  page_cloud_impl_.set_on_empty(callback::SetWhenCalled(&on_empty_called));
-  page_cloud_.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(on_empty_called);
-}
-
-TEST_F(PageCloudImplTest, AddCommits) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  std::vector<cloud_provider::CommitPackEntry> entries{{"id0", "data0"}};
-  cloud_provider::CommitPack commit_pack;
-  ASSERT_TRUE(cloud_provider::EncodeCommitPack(entries, &commit_pack));
-  page_cloud_->AddCommits(
-      std::move(commit_pack),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1u, firestore_service_.commit_records.size());
-  const google::firestore::v1beta1::CommitRequest& request =
-      firestore_service_.commit_records.front().request;
-  EXPECT_EQ(2, request.writes_size());
-  EXPECT_TRUE(request.writes(0).has_update());
-  EXPECT_TRUE(request.writes(1).has_transform());
-  EXPECT_EQ(request.writes(0).update().name(),
-            request.writes(1).transform().document());
-
-  auto response = google::firestore::v1beta1::CommitResponse();
-  firestore_service_.commit_records.front().callback(grpc::Status::OK,
-                                                     std::move(response));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-}
-
-TEST_F(PageCloudImplTest, GetCommits) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  std::unique_ptr<cloud_provider::CommitPack> commit_pack;
-  std::unique_ptr<cloud_provider::Token> position_token;
-  page_cloud_->GetCommits(
-      nullptr, callback::Capture(callback::SetWhenCalled(&callback_called),
-                                 &status, &commit_pack, &position_token));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1u, firestore_service_.run_query_records.size());
-
-  std::vector<google::firestore::v1beta1::RunQueryResponse> responses;
-  {
-    // First batch contains one commit.
-    std::vector<cloud_provider::CommitPackEntry> entries{{"id0", "data0"}};
-    cloud_provider::CommitPack commit_pack;
-    ASSERT_TRUE(cloud_provider::EncodeCommitPack(entries, &commit_pack));
-    google::firestore::v1beta1::RunQueryResponse response;
-    ASSERT_TRUE(EncodeCommitBatch(commit_pack, response.mutable_document()));
-    SetTimestamp(response.mutable_document(), 100, 1);
-    responses.push_back(std::move(response));
-  }
-  {
-    // The second batch contains two commits.
-    std::vector<cloud_provider::CommitPackEntry> entries{{"id1", "data1"},
-                                                         {"id2", "data2"}};
-    cloud_provider::CommitPack commit_pack;
-    ASSERT_TRUE(cloud_provider::EncodeCommitPack(entries, &commit_pack));
-    google::firestore::v1beta1::RunQueryResponse response;
-    ASSERT_TRUE(EncodeCommitBatch(commit_pack, response.mutable_document()));
-    SetTimestamp(response.mutable_document(), 100, 2);
-    responses.push_back(std::move(response));
-  }
-
-  firestore_service_.run_query_records.front().callback(grpc::Status::OK,
-                                                        std::move(responses));
-  RunLoopUntilIdle();
-
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-  ASSERT_TRUE(commit_pack);
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  ASSERT_TRUE(cloud_provider::DecodeCommitPack(*commit_pack, &entries));
-  // The result should be a flat vector of all three commits.
-  EXPECT_EQ(3u, entries.size());
-
-  EXPECT_TRUE(position_token);
-  google::protobuf::Timestamp decoded_timestamp;
-  ASSERT_TRUE(decoded_timestamp.ParseFromString(
-      convert::ToString(position_token->opaque_id)));
-  EXPECT_EQ(100, decoded_timestamp.seconds());
-  EXPECT_EQ(2, decoded_timestamp.nanos());
-}
-
-TEST_F(PageCloudImplTest, GetCommitsQueryPositionToken) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  std::unique_ptr<cloud_provider::CommitPack> commit_pack;
-  google::protobuf::Timestamp timestamp;
-  timestamp.set_seconds(42);
-  timestamp.set_nanos(1);
-  std::string position_token_str;
-  ASSERT_TRUE(timestamp.SerializeToString(&position_token_str));
-  auto position_token = std::make_unique<cloud_provider::Token>();
-  position_token->opaque_id = convert::ToArray(position_token_str);
-  page_cloud_->GetCommits(
-      std::move(position_token),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status,
-                        &commit_pack, &position_token));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1u, firestore_service_.run_query_records.size());
-
-  const google::firestore::v1beta1::RunQueryRequest& request =
-      firestore_service_.run_query_records.front().request;
-  EXPECT_TRUE(request.has_structured_query());
-  EXPECT_TRUE(request.structured_query().has_where());
-
-  const google::firestore::v1beta1::StructuredQuery::Filter& filter =
-      request.structured_query().where();
-  EXPECT_TRUE(filter.has_field_filter());
-  EXPECT_EQ("timestamp", filter.field_filter().field().field_path());
-  EXPECT_EQ(google::firestore::v1beta1::
-                StructuredQuery_FieldFilter_Operator_GREATER_THAN_OR_EQUAL,
-            filter.field_filter().op());
-  EXPECT_EQ(42, filter.field_filter().value().timestamp_value().seconds());
-  EXPECT_EQ(1, filter.field_filter().value().timestamp_value().nanos());
-}
-
-TEST_F(PageCloudImplTest, AddObject) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  fsl::SizedVmo data;
-  ASSERT_TRUE(fsl::VmoFromString("some_data", &data));
-  page_cloud_->AddObject(
-      convert::ToArray("some_id"), std::move(data).ToTransport(),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1u, firestore_service_.create_document_records.size());
-
-  firestore_service_.create_document_records.front().callback(
-      grpc::Status::OK, google::firestore::v1beta1::Document());
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-}
-
-TEST_F(PageCloudImplTest, GetObject) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  ::fuchsia::mem::BufferPtr data;
-  page_cloud_->GetObject(
-      convert::ToArray("some_id"),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status,
-                        &data));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1u, firestore_service_.get_document_records.size());
-
-  const std::string response_data = "some_data";
-  google::firestore::v1beta1::Document response;
-  *((*response.mutable_fields())["data"].mutable_bytes_value()) = response_data;
-  firestore_service_.get_document_records.front().callback(grpc::Status(),
-                                                           response);
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-
-  std::string read_data;
-  ASSERT_TRUE(fsl::StringFromVmo(*data, &read_data));
-  EXPECT_EQ("some_data", read_data);
-}
-
-TEST_F(PageCloudImplTest, GetObjectParseError) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  ::fuchsia::mem::BufferPtr data;
-  page_cloud_->GetObject(
-      convert::ToArray("some_id"),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status,
-                        &data));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1u, firestore_service_.get_document_records.size());
-
-  // Create empty response with no data field.
-  google::firestore::v1beta1::Document response;
-  firestore_service_.get_document_records.front().callback(grpc::Status(),
-                                                           response);
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::PARSE_ERROR, status);
-}
-
-TEST_F(PageCloudImplTest, SetWatcherResultOk) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  TestPageCloudWatcher watcher_impl;
-  cloud_provider::PageCloudWatcherPtr watcher;
-  fidl::Binding<cloud_provider::PageCloudWatcher> watcher_binding(
-      &watcher_impl, watcher.NewRequest());
-  page_cloud_->SetWatcher(
-      nullptr, std::move(watcher),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, firestore_service_.listen_clients.size());
-  EXPECT_FALSE(callback_called);
-
-  auto response = google::firestore::v1beta1::ListenResponse();
-  response.mutable_target_change()->set_target_change_type(
-      google::firestore::v1beta1::TargetChange_TargetChangeType_CURRENT);
-  firestore_service_.listen_clients[0]->OnResponse(std::move(response));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-}
-
-TEST_F(PageCloudImplTest, SetWatcherGetCommits) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  TestPageCloudWatcher watcher_impl;
-  cloud_provider::PageCloudWatcherPtr watcher;
-  fidl::Binding<cloud_provider::PageCloudWatcher> watcher_binding(
-      &watcher_impl, watcher.NewRequest());
-  page_cloud_->SetWatcher(
-      nullptr, std::move(watcher),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, firestore_service_.listen_clients.size());
-  EXPECT_FALSE(callback_called);
-
-  {
-    auto response = google::firestore::v1beta1::ListenResponse();
-    response.mutable_target_change()->set_target_change_type(
-        google::firestore::v1beta1::TargetChange_TargetChangeType_CURRENT);
-    firestore_service_.listen_clients[0]->OnResponse(std::move(response));
-  }
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-
-  std::vector<cloud_provider::CommitPackEntry> entries{{"id0", "data0"}};
-  google::protobuf::Timestamp protobuf_timestamp;
-  ASSERT_TRUE(google::protobuf::util::TimeUtil::FromString(
-      "2018-06-26T14:39:22+00:00", &protobuf_timestamp));
-  std::string original_timestamp;
-  ASSERT_TRUE(protobuf_timestamp.SerializeToString(&original_timestamp));
-
-  cloud_provider::CommitPack commit_pack;
-  ASSERT_TRUE(cloud_provider::EncodeCommitPack(entries, &commit_pack));
-  auto response = google::firestore::v1beta1::ListenResponse();
-  ASSERT_TRUE(EncodeCommitBatchWithTimestamp(
-      commit_pack, original_timestamp,
-      response.mutable_document_change()->mutable_document()));
-  firestore_service_.listen_clients[0]->OnResponse(std::move(response));
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, watcher_impl.received_commits.size());
-  EXPECT_EQ("id0", convert::ToString(watcher_impl.received_commits.front().id));
-  EXPECT_EQ("data0",
-            convert::ToString(watcher_impl.received_commits.front().data));
-  EXPECT_EQ(1u, watcher_impl.received_tokens.size());
-  EXPECT_EQ(original_timestamp,
-            convert::ToString(watcher_impl.received_tokens.front().opaque_id));
-  EXPECT_TRUE(watcher_impl.pending_on_new_commit_callback);
-}
-
-TEST_F(PageCloudImplTest, SetWatcherNotificationOneAtATime) {
-  bool callback_called = false;
-  auto status = cloud_provider::Status::INTERNAL_ERROR;
-  TestPageCloudWatcher watcher_impl;
-  cloud_provider::PageCloudWatcherPtr watcher;
-  fidl::Binding<cloud_provider::PageCloudWatcher> watcher_binding(
-      &watcher_impl, watcher.NewRequest());
-  page_cloud_->SetWatcher(
-      nullptr, std::move(watcher),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  RunLoopUntilIdle();
-
-  {
-    auto response = google::firestore::v1beta1::ListenResponse();
-    response.mutable_target_change()->set_target_change_type(
-        google::firestore::v1beta1::TargetChange_TargetChangeType_CURRENT);
-    firestore_service_.listen_clients[0]->OnResponse(std::move(response));
-  }
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(cloud_provider::Status::OK, status);
-
-  // Deliver a commit notificiation from the cloud.
-  {
-    std::vector<cloud_provider::CommitPackEntry> entries{{"id0", "data0"}};
-    google::protobuf::Timestamp protobuf_timestamp;
-    ASSERT_TRUE(google::protobuf::util::TimeUtil::FromString(
-        "2018-06-26T14:39:22+00:00", &protobuf_timestamp));
-    std::string timestamp;
-    ASSERT_TRUE(protobuf_timestamp.SerializeToString(&timestamp));
-
-    cloud_provider::CommitPack commit_pack;
-    ASSERT_TRUE(cloud_provider::EncodeCommitPack(entries, &commit_pack));
-    auto response = google::firestore::v1beta1::ListenResponse();
-    ASSERT_TRUE(EncodeCommitBatchWithTimestamp(
-        commit_pack, timestamp,
-        response.mutable_document_change()->mutable_document()));
-    firestore_service_.listen_clients[0]->OnResponse(std::move(response));
-  }
-
-  // Verify that the notification was delivered to the watcher.
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, watcher_impl.received_commits.size());
-  EXPECT_TRUE(watcher_impl.pending_on_new_commit_callback);
-
-  // Deliver another commit notificiation from the cloud without calling the
-  // watcher pending callback.
-  {
-    std::vector<cloud_provider::CommitPackEntry> entries{{"id1", "data1"}};
-    google::protobuf::Timestamp protobuf_timestamp;
-    ASSERT_TRUE(google::protobuf::util::TimeUtil::FromString(
-        "2018-06-26T14:39:24+00:00", &protobuf_timestamp));
-    std::string timestamp;
-    ASSERT_TRUE(protobuf_timestamp.SerializeToString(&timestamp));
-
-    cloud_provider::CommitPack commit_pack;
-    ASSERT_TRUE(cloud_provider::EncodeCommitPack(entries, &commit_pack));
-    auto response = google::firestore::v1beta1::ListenResponse();
-    ASSERT_TRUE(EncodeCommitBatchWithTimestamp(
-        commit_pack, timestamp,
-        response.mutable_document_change()->mutable_document()));
-    firestore_service_.listen_clients[0]->OnResponse(std::move(response));
-  }
-
-  // Verify that another commit notification was not delivered.
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, watcher_impl.received_commits.size());
-  EXPECT_TRUE(watcher_impl.pending_on_new_commit_callback);
-
-  // Call the pending callback and verify that the new commit notification was
-  // delivered.
-  watcher_impl.pending_on_new_commit_callback();
-  watcher_impl.pending_on_new_commit_callback = nullptr;
-  RunLoopUntilIdle();
-  EXPECT_EQ(2u, watcher_impl.received_commits.size());
-  EXPECT_EQ("id0", convert::ToString(watcher_impl.received_commits[0].id));
-  EXPECT_EQ("id1", convert::ToString(watcher_impl.received_commits[1].id));
-  EXPECT_TRUE(watcher_impl.pending_on_new_commit_callback);
-}
-
-}  // namespace
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/testing/BUILD.gn b/bin/cloud_provider_firestore/app/testing/BUILD.gn
deleted file mode 100644
index 7e16ac0..0000000
--- a/bin/cloud_provider_firestore/app/testing/BUILD.gn
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/cloud_provider_firestore/*" ]
-
-source_set("testing") {
-  testonly = true
-
-  sources = [
-    "test_credentials_provider.cc",
-    "test_credentials_provider.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/callback",
-    "//peridot/bin/cloud_provider_firestore/app:lib",
-    "//third_party/grpc:grpc++",
-  ]
-}
diff --git a/bin/cloud_provider_firestore/app/testing/test_credentials_provider.cc b/bin/cloud_provider_firestore/app/testing/test_credentials_provider.cc
deleted file mode 100644
index 6a6a334..0000000
--- a/bin/cloud_provider_firestore/app/testing/test_credentials_provider.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/app/testing/test_credentials_provider.h"
-
-#include <lib/fit/function.h>
-
-namespace cloud_provider_firestore {
-
-TestCredentialsProvider::TestCredentialsProvider(async_dispatcher_t* dispatcher)
-    : task_runner_(dispatcher) {}
-
-TestCredentialsProvider::~TestCredentialsProvider() {}
-
-void TestCredentialsProvider::GetCredentials(
-    fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback) {
-  task_runner_.PostTask(
-      [callback = std::move(callback)] { callback(nullptr); });
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/app/testing/test_credentials_provider.h b/bin/cloud_provider_firestore/app/testing/test_credentials_provider.h
deleted file mode 100644
index fa52603..0000000
--- a/bin/cloud_provider_firestore/app/testing/test_credentials_provider.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_TESTING_TEST_CREDENTIALS_PROVIDER_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_TESTING_TEST_CREDENTIALS_PROVIDER_H_
-
-#include <functional>
-#include <memory>
-
-#include <grpc++/grpc++.h>
-#include <lib/callback/scoped_task_runner.h>
-#include <lib/fit/function.h>
-
-#include "peridot/bin/cloud_provider_firestore/app/credentials_provider.h"
-
-namespace cloud_provider_firestore {
-
-class TestCredentialsProvider : public CredentialsProvider {
- public:
-  explicit TestCredentialsProvider(async_dispatcher_t* dispatcher);
-  ~TestCredentialsProvider() override;
-
-  void GetCredentials(
-      fit::function<void(std::shared_ptr<grpc::CallCredentials>)> callback)
-      override;
-
- private:
-  // Must be the last member.
-  callback::ScopedTaskRunner task_runner_;
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_APP_TESTING_TEST_CREDENTIALS_PROVIDER_H_
diff --git a/bin/cloud_provider_firestore/cloud_provider_firestore_unittests.cmx b/bin/cloud_provider_firestore/cloud_provider_firestore_unittests.cmx
deleted file mode 100644
index 6b4cc0f..0000000
--- a/bin/cloud_provider_firestore/cloud_provider_firestore_unittests.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "program": {
-        "binary": "test/cloud_provider_firestore_unittests"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-        ]
-    }
-}
diff --git a/bin/cloud_provider_firestore/docs/configuration.md b/bin/cloud_provider_firestore/docs/configuration.md
deleted file mode 100644
index 8318f72..0000000
--- a/bin/cloud_provider_firestore/docs/configuration.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Configuration
-
-This document describes the configuration required for a Firestore Database
-project to be used with `cloud_provider_firestore`.
-
-*** note
-These instructions are relevant only when setting up one's own server instance,
-and not needed to use an existing server instance.
-***
-
-## Rules
-
-In the [Firebase Console], under `Database > Cloud Firestore > Rules`, set the
-rules to:
-
-```
-service cloud.firestore {
-  match /databases/{database}/documents {
-    match /users/{uid}/{everything=**} {
-      allow read, write: if request.auth.uid == uid;
-    }
-  }
-}
-```
-
-[Firebase Console]: https://console.firebase.google.com/
-
-## Credentials
-
-In order to run tests (end-to-end sync tests, sync benchmarks, validation tests)
-against a Firestore instance, you need the following:
-
- - **API key** - available in `Project Settings / General`
- - **credentials file** for a service account - available in `Project Settings /
-     Service accounts`. Click on "Generate new private key".
-
-See [cloud sync set-up instructions] for instructions on how to use this
-information to run these tests.
-
-[cloud sync set-up instructions]: /docs/ledger/testing.md#cloud-sync
diff --git a/bin/cloud_provider_firestore/fidl/BUILD.gn b/bin/cloud_provider_firestore/fidl/BUILD.gn
deleted file mode 100644
index 0808e1b..0000000
--- a/bin/cloud_provider_firestore/fidl/BUILD.gn
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-fidl("fidl") {
-  name = "fuchsia.ledger.cloud.firestore"
-
-  sources = [
-    "factory.fidl",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.auth",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-  ]
-}
diff --git a/bin/cloud_provider_firestore/fidl/factory.fidl b/bin/cloud_provider_firestore/fidl/factory.fidl
deleted file mode 100644
index fc0f740..0000000
--- a/bin/cloud_provider_firestore/fidl/factory.fidl
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.ledger.cloud.firestore;
-
-using fuchsia.auth;
-using fuchsia.ledger.cloud;
-
-// Configuration to use when connecting to the Firestore server.
-struct Config {
-    // ID of the Firestore instance.
-    string server_id;
-
-    // API key to use when authenticating with Firebase Auth.
-    string api_key;
-};
-
-[Discoverable]
-interface Factory {
-  // Creates a cloud provider instance using the given |config|.
-  //
-  // Parameters:
-  // |config| configuration
-  // |token_manager| is used to get the appropriate auth tokens
-  //     associated with user for whom the cloud provider is running.
-  1: GetCloudProvider(
-                Config config,
-                fuchsia.auth.TokenManager? token_manager,
-                request<fuchsia.ledger.cloud.CloudProvider> cloud_provider)
-      -> (fuchsia.ledger.cloud.Status status);
-};
diff --git a/bin/cloud_provider_firestore/firestore/BUILD.gn b/bin/cloud_provider_firestore/firestore/BUILD.gn
deleted file mode 100644
index b5cde06..0000000
--- a/bin/cloud_provider_firestore/firestore/BUILD.gn
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/cloud_provider_firestore/*" ]
-
-source_set("firestore") {
-  sources = [
-    "encoding.cc",
-    "encoding.h",
-    "firestore_service.h",
-    "firestore_service_impl.cc",
-    "firestore_service_impl.h",
-    "listen_call.cc",
-    "listen_call.h",
-    "listen_call_client.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/cloud_provider_firestore/grpc",
-    "//peridot/bin/cloud_provider_firestore/include",
-    "//peridot/lib/commit_pack",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-    "//third_party/googleapis/google/firestore/v1beta1",
-    "//third_party/googleapis/google/firestore/v1beta1:service",
-    "//third_party/grpc:grpc++",
-  ]
-
-  deps = [
-    "//peridot/lib/base64url",
-    "//peridot/lib/convert",
-  ]
-
-  public_configs = [ "//third_party/googleapis:googleapis_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "encoding_unittest.cc",
-    "listen_call_unittest.cc",
-  ]
-
-  deps = [
-    ":firestore",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl:fxl_printers",
-    "//garnet/public/lib/gtest",
-    "//peridot/bin/cloud_provider_firestore/firestore/testing",
-    "//peridot/lib/convert",
-    "//third_party/protobuf:protobuf_full",
-  ]
-}
diff --git a/bin/cloud_provider_firestore/firestore/encoding.cc b/bin/cloud_provider_firestore/firestore/encoding.cc
deleted file mode 100644
index cb278ea..0000000
--- a/bin/cloud_provider_firestore/firestore/encoding.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/firestore/encoding.h"
-
-#include "peridot/lib/base64url/base64url.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace cloud_provider_firestore {
-namespace {
-constexpr char kCommitsKey[] = "commits";
-constexpr char kTimestampKey[] = "timestamp";
-constexpr char kIdKey[] = "id";
-constexpr char kDataKey[] = "data";
-}  // namespace
-
-std::string EncodeKey(fxl::StringView input) {
-  std::string encoded = base64url::Base64UrlEncode(input);
-  encoded.append(1u, '+');
-  return encoded;
-}
-
-bool DecodeKey(fxl::StringView input, std::string* output) {
-  if (input.empty() || input.back() != '+') {
-    return false;
-  }
-
-  input.remove_suffix(1u);
-  return base64url::Base64UrlDecode(input, output);
-}
-
-bool EncodeCommitBatch(const cloud_provider::CommitPack& commits,
-                       google::firestore::v1beta1::Document* document) {
-  FXL_DCHECK(document);
-
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  if (!cloud_provider::DecodeCommitPack(commits, &entries)) {
-    return false;
-  }
-
-  // TODO(ppi): fail and return false if the resulting batch exceeds max
-  // Firestore document size.
-  google::firestore::v1beta1::Document result;
-  google::firestore::v1beta1::ArrayValue* commit_array =
-      (*result.mutable_fields())[kCommitsKey].mutable_array_value();
-  for (const auto& entry : entries) {
-    google::firestore::v1beta1::MapValue* commit_value =
-        commit_array->add_values()->mutable_map_value();
-    *((*commit_value->mutable_fields())[kIdKey].mutable_bytes_value()) =
-        convert::ToString(entry.id);
-    *((*commit_value->mutable_fields())[kDataKey].mutable_bytes_value()) =
-        convert::ToString(entry.data);
-  }
-
-  document->Swap(&result);
-  return true;
-}
-
-bool DecodeCommitBatch(
-    const google::firestore::v1beta1::Document& document,
-    std::vector<cloud_provider::CommitPackEntry>* commit_entries,
-    std::string* timestamp) {
-  FXL_DCHECK(commit_entries);
-  FXL_DCHECK(timestamp);
-
-  std::vector<cloud_provider::CommitPackEntry> result;
-  if (document.fields().count(kCommitsKey) != 1) {
-    return false;
-  }
-
-  const google::firestore::v1beta1::Value& commits_value =
-      document.fields().at(kCommitsKey);
-  if (!commits_value.has_array_value()) {
-    return false;
-  }
-
-  const google::firestore::v1beta1::ArrayValue& commits_array_value =
-      commits_value.array_value();
-  for (const auto& commit_value : commits_array_value.values()) {
-    if (!commit_value.has_map_value()) {
-      return false;
-    }
-
-    const google::firestore::v1beta1::MapValue& commit_map_value =
-        commit_value.map_value();
-    cloud_provider::CommitPackEntry entry;
-    if (commit_map_value.fields().count(kIdKey) != 1) {
-      return false;
-    }
-    entry.id =
-        convert::ToString(commit_map_value.fields().at(kIdKey).bytes_value());
-    if (commit_map_value.fields().count(kDataKey) != 1) {
-      return false;
-    }
-    entry.data =
-        convert::ToString(commit_map_value.fields().at(kDataKey).bytes_value());
-    result.push_back(std::move(entry));
-  }
-
-  // Read the timestamp field.
-  if (document.fields().count(kTimestampKey) == 1) {
-    const google::firestore::v1beta1::Value& timestamp_value =
-        document.fields().at(kTimestampKey);
-    if (!timestamp_value.has_timestamp_value()) {
-      return false;
-    }
-
-    if (!timestamp_value.timestamp_value().SerializeToString(timestamp)) {
-      return false;
-    }
-  } else if (document.fields().count(kTimestampKey) != 0) {
-    // The timestamp field should appear only 0 or 1 time.
-    return false;
-  }
-
-  commit_entries->swap(result);
-  return true;
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/firestore/encoding.h b/bin/cloud_provider_firestore/firestore/encoding.h
deleted file mode 100644
index 3efbfcd..0000000
--- a/bin/cloud_provider_firestore/firestore/encoding.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_ENCODING_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_ENCODING_H_
-
-#include <string>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <google/firestore/v1beta1/document.pb.h>
-#include <lib/fidl/cpp/vector.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/cloud_provider_firestore/include/types.h"
-#include "peridot/lib/commit_pack/commit_pack.h"
-
-namespace cloud_provider_firestore {
-
-// Encodes the data so that it can be used as a Firestore key.
-//
-// The resulting encoding is base64url with a single '+' character appended at
-// the end. This is because Firestore disallows keys matching the regular
-// expression `__.*__` which would otherwise be possible to produce.
-//
-// See https://cloud.google.com/firestore/quotas#limits.
-std::string EncodeKey(fxl::StringView input);
-
-// Decodes a Firestore key encoded using |EncodeKey|.
-bool DecodeKey(fxl::StringView input, std::string* output);
-
-// Encodes a batch of commits in the cloud provider FIDL format as a Firestore
-// document.
-bool EncodeCommitBatch(const cloud_provider::CommitPack& commits,
-                       google::firestore::v1beta1::Document* document);
-
-// Decodes a Firestore document representing a commit batch.
-bool DecodeCommitBatch(
-    const google::firestore::v1beta1::Document& document,
-    std::vector<cloud_provider::CommitPackEntry>* commit_entries,
-    std::string* timestamp);
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_ENCODING_H_
diff --git a/bin/cloud_provider_firestore/firestore/encoding_unittest.cc b/bin/cloud_provider_firestore/firestore/encoding_unittest.cc
deleted file mode 100644
index 7426894..0000000
--- a/bin/cloud_provider_firestore/firestore/encoding_unittest.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/firestore/encoding.h"
-
-#include <string>
-
-#include <google/protobuf/util/time_util.h>
-#include <gtest/gtest.h>
-
-#include "peridot/bin/cloud_provider_firestore/firestore/testing/encoding.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace cloud_provider_firestore {
-
-namespace {
-
-// Creates correct std::strings with \0 bytes inside from C-style string
-// constants.
-std::string operator"" _s(const char* str, size_t size) {
-  return std::string(str, size);
-}
-
-using StringEncodingTest = ::testing::TestWithParam<std::string>;
-
-TEST_P(StringEncodingTest, BackAndForth) {
-  std::string data = GetParam();
-  std::string encoded;
-  std::string decoded;
-
-  encoded = EncodeKey(data);
-  EXPECT_EQ('+', encoded.back());
-  EXPECT_TRUE(DecodeKey(encoded, &decoded));
-  EXPECT_EQ(data, decoded);
-}
-
-INSTANTIATE_TEST_CASE_P(ExampleData, StringEncodingTest,
-                        ::testing::Values(""_s, "abcdef"_s, "\x02\x7F"_s,
-                                          "~!@#$%^&*()_+-="_s, "\0"_s,
-                                          "bazinga\0\0\0"_s));
-
-TEST(BatchEncodingTest, Empty) {
-  cloud_provider::CommitPack commits;
-  ASSERT_TRUE(cloud_provider::EncodeCommitPack({}, &commits));
-  google::firestore::v1beta1::Document document;
-  ASSERT_TRUE(EncodeCommitBatch(commits, &document));
-
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  std::string timestamp;
-  ASSERT_TRUE(DecodeCommitBatch(document, &entries, &timestamp));
-  EXPECT_EQ(0u, entries.size());
-}
-
-TEST(BatchEncodingTest, TwoCommits) {
-  cloud_provider::CommitPack commits;
-  ASSERT_TRUE(cloud_provider::EncodeCommitPack(
-      {{"id0", "data0"}, {"id1", "data1"}}, &commits));
-  google::firestore::v1beta1::Document document;
-  ASSERT_TRUE(EncodeCommitBatch(commits, &document));
-
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  std::string timestamp;
-  ASSERT_TRUE(DecodeCommitBatch(document, &entries, &timestamp));
-  EXPECT_EQ(2u, entries.size());
-  EXPECT_EQ("id0", entries[0].id);
-  EXPECT_EQ("data0", entries[0].data);
-  EXPECT_EQ("id1", entries[1].id);
-  EXPECT_EQ("data1", entries[1].data);
-}
-
-TEST(BatchEncodingTest, Timestamp) {
-  cloud_provider::CommitPack commits;
-  ASSERT_TRUE(cloud_provider::EncodeCommitPack({{"id0", "data0"}}, &commits));
-  google::firestore::v1beta1::Document document;
-  google::protobuf::Timestamp protobuf_timestamp;
-  ASSERT_TRUE(google::protobuf::util::TimeUtil::FromString(
-      "2018-06-26T14:39:22+00:00", &protobuf_timestamp));
-  std::string original_timestamp;
-  ASSERT_TRUE(protobuf_timestamp.SerializeToString(&original_timestamp));
-  EncodeCommitBatchWithTimestamp(commits, original_timestamp, &document);
-
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  std::string decoded_timestamp;
-  EXPECT_TRUE(DecodeCommitBatch(document, &entries, &decoded_timestamp));
-  EXPECT_EQ(original_timestamp, decoded_timestamp);
-}
-
-TEST(BatchEncodingTest, DecodingErrors) {
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  std::string timestamp;
-
-  {
-    // Empty document.
-    google::firestore::v1beta1::Document document;
-    EXPECT_FALSE(DecodeCommitBatch(document, &entries, &timestamp));
-  }
-
-  {
-    // Non-empty but the commit key is missing.
-    google::firestore::v1beta1::Document document;
-    (*document.mutable_fields())["some_field"].set_integer_value(3);
-    EXPECT_FALSE(DecodeCommitBatch(document, &entries, &timestamp));
-  }
-
-  {
-    // Commits field is not an array.
-    google::firestore::v1beta1::Document document;
-    (*document.mutable_fields())["commits"].set_integer_value(3);
-    EXPECT_FALSE(DecodeCommitBatch(document, &entries, &timestamp));
-  }
-
-  {
-    // Commits contains a commit that is not a map.
-    google::firestore::v1beta1::Document document;
-    google::firestore::v1beta1::ArrayValue* commit_array =
-        (*document.mutable_fields())["commits"].mutable_array_value();
-    commit_array->add_values()->set_integer_value(3);
-    EXPECT_FALSE(DecodeCommitBatch(document, &entries, &timestamp));
-  }
-
-  {
-    // Commits contains a commit that misses the "data" field.
-    google::firestore::v1beta1::Document document;
-    google::firestore::v1beta1::ArrayValue* commit_array =
-        (*document.mutable_fields())["commits"].mutable_array_value();
-    google::firestore::v1beta1::MapValue* commit_value =
-        commit_array->add_values()->mutable_map_value();
-    *((*commit_value->mutable_fields())["id"].mutable_bytes_value()) =
-        "some_id";
-    EXPECT_FALSE(DecodeCommitBatch(document, &entries, &timestamp));
-  }
-
-  {
-    // Commits contains a commit that misses the "id" field.
-    google::firestore::v1beta1::Document document;
-    google::firestore::v1beta1::ArrayValue* commit_array =
-        (*document.mutable_fields())["commits"].mutable_array_value();
-    google::firestore::v1beta1::MapValue* commit_value =
-        commit_array->add_values()->mutable_map_value();
-    *((*commit_value->mutable_fields())["data"].mutable_bytes_value()) =
-        "some_data";
-    EXPECT_FALSE(DecodeCommitBatch(document, &entries, &timestamp));
-  }
-
-  {
-    // Correct batch (sanity check).
-    google::firestore::v1beta1::Document document;
-    google::firestore::v1beta1::ArrayValue* commit_array =
-        (*document.mutable_fields())["commits"].mutable_array_value();
-    google::firestore::v1beta1::MapValue* commit_value =
-        commit_array->add_values()->mutable_map_value();
-    *((*commit_value->mutable_fields())["id"].mutable_bytes_value()) =
-        "some_id";
-    *((*commit_value->mutable_fields())["data"].mutable_bytes_value()) =
-        "some_data";
-    EXPECT_TRUE(DecodeCommitBatch(document, &entries, &timestamp));
-  }
-}
-
-}  // namespace
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/firestore/firestore_service.h b/bin/cloud_provider_firestore/firestore/firestore_service.h
deleted file mode 100644
index 4f4fa3c..0000000
--- a/bin/cloud_provider_firestore/firestore/firestore_service.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_FIRESTORE_SERVICE_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_FIRESTORE_SERVICE_H_
-
-#include <functional>
-
-#include <google/firestore/v1beta1/document.pb.h>
-#include <google/firestore/v1beta1/firestore.grpc.pb.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/cloud_provider_firestore/firestore/listen_call_client.h"
-
-namespace cloud_provider_firestore {
-
-// Client library for Firestore.
-//
-// Manages access to a particular Firestore database.
-//
-// Requests methods are assumed to be called on the |main_runner| thread. All
-// client callbacks are called on the |main_runner|.
-class FirestoreService {
- public:
-  FirestoreService() {}
-  virtual ~FirestoreService() {}
-
-  // Returns the Firestore path to the managed database.
-  //
-  // The returned value is in the format:
-  // `projects/{project_id}/databases/{database_id}`.
-  virtual const std::string& GetDatabasePath() = 0;
-
-  // Returns the Firestore path to the root of the resource tree of the managed
-  // database.
-  //
-  // The returned value is in the format:
-  // `projects/{project_id}/databases/{database_id}/documents`.
-  virtual const std::string& GetRootPath() = 0;
-
-  // Gets a single document.
-  virtual void GetDocument(
-      google::firestore::v1beta1::GetDocumentRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-          callback) = 0;
-
-  // Lists documents.
-  virtual void ListDocuments(
-      google::firestore::v1beta1::ListDocumentsRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<void(grpc::Status,
-                         google::firestore::v1beta1::ListDocumentsResponse)>
-          callback) = 0;
-
-  // Creates a new document.
-  virtual void CreateDocument(
-      google::firestore::v1beta1::CreateDocumentRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-          callback) = 0;
-
-  // Deletes a document.
-  virtual void DeleteDocument(
-      google::firestore::v1beta1::DeleteDocumentRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<void(grpc::Status)> callback) = 0;
-
-  // Commits a transaction, while optionally updating documents.
-  virtual void Commit(
-      google::firestore::v1beta1::CommitRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<void(grpc::Status,
-                         google::firestore::v1beta1::CommitResponse)>
-          callback) = 0;
-
-  // Runs a query.
-  virtual void RunQuery(
-      google::firestore::v1beta1::RunQueryRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<
-          void(grpc::Status,
-               std::vector<google::firestore::v1beta1::RunQueryResponse>)>
-          callback) = 0;
-
-  // Initiates a stream to watch for change notifications.
-  virtual std::unique_ptr<ListenCallHandler> Listen(
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      ListenCallClient* client) = 0;
-
-  // Shuts the client down.
-  //
-  // It is not allowed to make any calls on FirestoreService after ShutDown()
-  // was called.
-  //
-  // It is only safe to delete the class after the callback is called.
-  virtual void ShutDown(fit::closure callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(FirestoreService);
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_FIRESTORE_SERVICE_H_
diff --git a/bin/cloud_provider_firestore/firestore/firestore_service_impl.cc b/bin/cloud_provider_firestore/firestore/firestore_service_impl.cc
deleted file mode 100644
index 1d6eb6b..0000000
--- a/bin/cloud_provider_firestore/firestore/firestore_service_impl.cc
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/firestore/firestore_service_impl.h"
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/strings/string_view.h>
-
-namespace cloud_provider_firestore {
-
-namespace {
-
-constexpr fxl::StringView kGoogleCloudResourcePrefixHeader =
-    "google-cloud-resource-prefix";
-
-// Handles the general case of call response that returns a status and a
-// response value.
-template <typename ResponseType>
-struct ResponseVariant {
-  using CallbackType = fit::function<void(grpc::Status, ResponseType)>;
-
-  static void Call(const CallbackType& callback, grpc::Status status,
-                   ResponseType response) {
-    callback(std::move(status), std::move(response));
-  }
-};
-
-// Handles a special case of response type being empty, in which case we skip
-// the google::protobuf::Empty value and only pass the status to the caller.
-template <>
-struct ResponseVariant<google::protobuf::Empty> {
-  using CallbackType = fit::function<void(grpc::Status)>;
-
-  static void Call(const CallbackType& callback, grpc::Status status,
-                   google::protobuf::Empty /*response*/) {
-    callback(std::move(status));
-  }
-};
-
-template <typename ResponseType>
-void MakeCall(
-    SingleResponseCall<ResponseType>* call,
-    std::unique_ptr<SingleResponseReader<ResponseType>> response_reader,
-    typename ResponseVariant<ResponseType>::CallbackType callback) {
-  call->response_reader = std::move(response_reader);
-
-  call->on_complete = [call, callback = std::move(callback)](bool ok) {
-    ResponseVariant<ResponseType>::Call(callback, std::move(call->status),
-                                        std::move(call->response));
-    if (call->on_empty) {
-      call->on_empty();
-    }
-  };
-  call->response_reader->Finish(&call->response, &call->status,
-                                &call->on_complete);
-}
-
-}  // namespace
-
-FirestoreServiceImpl::FirestoreServiceImpl(
-    std::string server_id, async_dispatcher_t* dispatcher,
-    std::shared_ptr<grpc::Channel> channel)
-    : server_id_(std::move(server_id)),
-      database_path_("projects/" + server_id_ + "/databases/(default)"),
-      root_path_(database_path_ + "/documents"),
-      dispatcher_(dispatcher),
-      firestore_(google::firestore::v1beta1::Firestore::NewStub(channel)) {
-  polling_thread_ = std::thread(&FirestoreServiceImpl::Poll, this);
-}
-
-FirestoreServiceImpl::~FirestoreServiceImpl() {}
-
-void FirestoreServiceImpl::GetDocument(
-    google::firestore::v1beta1::GetDocumentRequest request,
-    std::shared_ptr<grpc::CallCredentials> call_credentials,
-    fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-        callback) {
-  FXL_DCHECK(dispatcher_ == async_get_default_dispatcher());
-  DocumentResponseCall& call = document_response_calls_.emplace();
-  SetUpContext(&call.context, call_credentials);
-  auto response_reader =
-      firestore_->AsyncGetDocument(&call.context, request, &cq_);
-  MakeCall<google::firestore::v1beta1::Document>(
-      &call, std::move(response_reader), std::move(callback));
-}
-
-void FirestoreServiceImpl::ListDocuments(
-    google::firestore::v1beta1::ListDocumentsRequest request,
-    std::shared_ptr<grpc::CallCredentials> call_credentials,
-    fit::function<void(grpc::Status,
-                       google::firestore::v1beta1::ListDocumentsResponse)>
-        callback) {
-  FXL_DCHECK(dispatcher_ == async_get_default_dispatcher());
-  ListDocumentsResponseCall& call = list_documents_response_calls_.emplace();
-  SetUpContext(&call.context, call_credentials);
-  auto response_reader =
-      firestore_->AsyncListDocuments(&call.context, request, &cq_);
-  MakeCall<google::firestore::v1beta1::ListDocumentsResponse>(
-      &call, std::move(response_reader), std::move(callback));
-}
-
-void FirestoreServiceImpl::CreateDocument(
-    google::firestore::v1beta1::CreateDocumentRequest request,
-    std::shared_ptr<grpc::CallCredentials> call_credentials,
-    fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-        callback) {
-  FXL_DCHECK(dispatcher_ == async_get_default_dispatcher());
-  DocumentResponseCall& call = document_response_calls_.emplace();
-  SetUpContext(&call.context, call_credentials);
-  auto response_reader =
-      firestore_->AsyncCreateDocument(&call.context, request, &cq_);
-
-  MakeCall<google::firestore::v1beta1::Document>(
-      &call, std::move(response_reader), std::move(callback));
-}
-
-void FirestoreServiceImpl::DeleteDocument(
-    google::firestore::v1beta1::DeleteDocumentRequest request,
-    std::shared_ptr<grpc::CallCredentials> call_credentials,
-    fit::function<void(grpc::Status)> callback) {
-  FXL_DCHECK(dispatcher_ == async_get_default_dispatcher());
-  EmptyResponseCall& call = empty_response_calls_.emplace();
-  SetUpContext(&call.context, call_credentials);
-  auto response_reader =
-      firestore_->AsyncDeleteDocument(&call.context, request, &cq_);
-
-  MakeCall<google::protobuf::Empty>(&call, std::move(response_reader),
-                                    std::move(callback));
-}
-
-void FirestoreServiceImpl::Commit(
-    google::firestore::v1beta1::CommitRequest request,
-    std::shared_ptr<grpc::CallCredentials> call_credentials,
-    fit::function<void(grpc::Status,
-                       google::firestore::v1beta1::CommitResponse)>
-        callback) {
-  FXL_DCHECK(dispatcher_ == async_get_default_dispatcher());
-  CommitResponseCall& call = commit_response_calls_.emplace();
-  SetUpContext(&call.context, call_credentials);
-  auto response_reader = firestore_->AsyncCommit(&call.context, request, &cq_);
-
-  MakeCall<google::firestore::v1beta1::CommitResponse>(
-      &call, std::move(response_reader), std::move(callback));
-}
-
-void FirestoreServiceImpl::RunQuery(
-    google::firestore::v1beta1::RunQueryRequest request,
-    std::shared_ptr<grpc::CallCredentials> call_credentials,
-    fit::function<
-        void(grpc::Status,
-             std::vector<google::firestore::v1beta1::RunQueryResponse>)>
-        callback) {
-  FXL_DCHECK(dispatcher_ == async_get_default_dispatcher());
-  auto context = std::make_unique<grpc::ClientContext>();
-  SetUpContext(context.get(), call_credentials);
-
-  auto stream = firestore_->PrepareAsyncRunQuery(context.get(), request, &cq_);
-  auto& call = run_query_calls_.emplace(std::move(context), std::move(stream));
-  call.Drain(std::move(callback));
-}
-
-std::unique_ptr<ListenCallHandler> FirestoreServiceImpl::Listen(
-    std::shared_ptr<grpc::CallCredentials> call_credentials,
-    ListenCallClient* client) {
-  FXL_DCHECK(dispatcher_ == async_get_default_dispatcher());
-  auto context = std::make_unique<grpc::ClientContext>();
-  SetUpContext(context.get(), call_credentials);
-
-  auto stream = firestore_->PrepareAsyncListen(context.get(), &cq_);
-  auto& call =
-      listen_calls_.emplace(client, std::move(context), std::move(stream));
-  return call.MakeHandler();
-}
-
-void FirestoreServiceImpl::ShutDown(fit::closure callback) {
-  // Ask the CompletionQueue to shut down. This makes cq_.Next() to start
-  // returning false once the pending operations are drained.
-  cq_.Shutdown();
-
-  // Wait for the polling thread to exit.
-  polling_thread_.join();
-
-  // The CQ polling thread might have posted new tasks on the main thread before
-  // exiting, completing the calls that were active when we initated the
-  // CompletionQueue shut down. These must be processed before we call the
-  // client callback, so post the client callback on the main thread too.
-  async::PostTask(dispatcher_, std::move(callback));
-}
-
-void FirestoreServiceImpl::SetUpContext(
-    grpc::ClientContext* context,
-    std::shared_ptr<grpc::CallCredentials> call_credentials) {
-  context->AddMetadata(kGoogleCloudResourcePrefixHeader.ToString(),
-                       database_path_);
-  context->set_credentials(call_credentials);
-}
-
-void FirestoreServiceImpl::Poll() {
-  void* tag;
-  bool ok = false;
-  while (cq_.Next(&tag, &ok)) {
-    FXL_DCHECK(tag);
-    auto callable = reinterpret_cast<fit::function<void(bool)>*>(tag);
-    async::PostTask(dispatcher_, [callable, ok] { (*callable)(ok); });
-  }
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/firestore/firestore_service_impl.h b/bin/cloud_provider_firestore/firestore/firestore_service_impl.h
deleted file mode 100644
index 2ac2641..0000000
--- a/bin/cloud_provider_firestore/firestore/firestore_service_impl.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_FIRESTORE_SERVICE_IMPL_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_FIRESTORE_SERVICE_IMPL_H_
-
-#include <memory>
-#include <thread>
-
-#include <lib/async/dispatcher.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/fit/function.h>
-
-#include "peridot/bin/cloud_provider_firestore/firestore/firestore_service.h"
-#include "peridot/bin/cloud_provider_firestore/firestore/listen_call.h"
-#include "peridot/bin/cloud_provider_firestore/grpc/read_stream_drainer.h"
-
-namespace cloud_provider_firestore {
-
-template <typename ResponseType>
-using SingleResponseReader = grpc::ClientAsyncResponseReader<ResponseType>;
-
-template <typename ResponseType>
-struct SingleResponseCall {
-  void set_on_empty(fit::closure on_empty) {
-    this->on_empty = std::move(on_empty);
-  }
-
-  // Context used to make the remote call.
-  grpc::ClientContext context;
-
-  // Reader used to retrieve the result of the remote call.
-  std::unique_ptr<SingleResponseReader<ResponseType>> response_reader;
-
-  // Response of the remote call.
-  ResponseType response;
-
-  // Response status of the remote call.
-  grpc::Status status;
-
-  // Callback to be called upon completing the remote call.
-  fit::function<void(bool)> on_complete;
-
-  // Callback to be called when the call object can be deleted.
-  fit::closure on_empty;
-};
-
-using DocumentResponseCall =
-    SingleResponseCall<google::firestore::v1beta1::Document>;
-
-using CommitResponseCall =
-    SingleResponseCall<google::firestore::v1beta1::CommitResponse>;
-
-using ListDocumentsResponseCall =
-    SingleResponseCall<google::firestore::v1beta1::ListDocumentsResponse>;
-
-using EmptyResponseCall = SingleResponseCall<google::protobuf::Empty>;
-
-using RunQueryCall =
-    ReadStreamDrainer<grpc::ClientAsyncReaderInterface<
-                          google::firestore::v1beta1::RunQueryResponse>,
-                      google::firestore::v1beta1::RunQueryResponse>;
-
-// Implementation of the FirestoreService interface.
-//
-// This class is implemented as a wrapper over the Firestore connection. We use
-// a polling thread to wait for request completion on the completion queue and
-// expose a callback-based API to the client.
-class FirestoreServiceImpl : public FirestoreService {
- public:
-  FirestoreServiceImpl(std::string server_id, async_dispatcher_t* dispatcher,
-                       std::shared_ptr<grpc::Channel> channel);
-
-  ~FirestoreServiceImpl() override;
-
-  // FirestoreService:
-  const std::string& GetDatabasePath() override { return database_path_; }
-
-  const std::string& GetRootPath() override { return root_path_; }
-
-  void GetDocument(
-      google::firestore::v1beta1::GetDocumentRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-          callback) override;
-
-  void ListDocuments(
-      google::firestore::v1beta1::ListDocumentsRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<void(grpc::Status,
-                         google::firestore::v1beta1::ListDocumentsResponse)>
-          callback) override;
-
-  void CreateDocument(
-      google::firestore::v1beta1::CreateDocumentRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-          callback) override;
-
-  void DeleteDocument(google::firestore::v1beta1::DeleteDocumentRequest request,
-                      std::shared_ptr<grpc::CallCredentials> call_credentials,
-                      fit::function<void(grpc::Status)> callback) override;
-
-  void Commit(google::firestore::v1beta1::CommitRequest request,
-              std::shared_ptr<grpc::CallCredentials> call_credentials,
-              fit::function<void(grpc::Status,
-                                 google::firestore::v1beta1::CommitResponse)>
-                  callback) override;
-
-  void RunQuery(google::firestore::v1beta1::RunQueryRequest request,
-                std::shared_ptr<grpc::CallCredentials> call_credentials,
-                fit::function<void(
-                    grpc::Status,
-                    std::vector<google::firestore::v1beta1::RunQueryResponse>)>
-                    callback) override;
-
-  std::unique_ptr<ListenCallHandler> Listen(
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      ListenCallClient* client) override;
-
-  void ShutDown(fit::closure callback) override;
-
- private:
-  void SetUpContext(grpc::ClientContext* context,
-                    std::shared_ptr<grpc::CallCredentials> call_credentials);
-
-  void Poll();
-
-  const std::string server_id_;
-  const std::string database_path_;
-  const std::string root_path_;
-
-  async_dispatcher_t* const dispatcher_;
-  std::thread polling_thread_;
-
-  std::unique_ptr<google::firestore::v1beta1::Firestore::Stub> firestore_;
-  grpc::CompletionQueue cq_;
-
-  // Single-request single-response calls.
-  callback::AutoCleanableSet<DocumentResponseCall> document_response_calls_;
-  callback::AutoCleanableSet<CommitResponseCall> commit_response_calls_;
-  callback::AutoCleanableSet<ListDocumentsResponseCall>
-      list_documents_response_calls_;
-  callback::AutoCleanableSet<EmptyResponseCall> empty_response_calls_;
-
-  // Single-request stream-response calls.
-  callback::AutoCleanableSet<RunQueryCall> run_query_calls_;
-
-  // Stream-request stream-response calls.
-  callback::AutoCleanableSet<ListenCall> listen_calls_;
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_FIRESTORE_SERVICE_IMPL_H_
diff --git a/bin/cloud_provider_firestore/firestore/listen_call.cc b/bin/cloud_provider_firestore/firestore/listen_call.cc
deleted file mode 100644
index 1899617..0000000
--- a/bin/cloud_provider_firestore/firestore/listen_call.cc
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/firestore/listen_call.h"
-
-namespace cloud_provider_firestore {
-
-namespace {
-
-class ListenCallHandlerImpl : public ListenCallHandler {
- public:
-  explicit ListenCallHandlerImpl(fxl::WeakPtr<ListenCall> call) : call_(call) {}
-
-  ~ListenCallHandlerImpl() override {
-    if (!call_) {
-      return;
-    }
-    call_->OnHandlerGone();
-  }
-
-  void Write(google::firestore::v1beta1::ListenRequest request) override {
-    // It's an arror to call Write() after OnFinished() is delivered to the
-    // client (which happens before |call_| is deleted).
-    FXL_DCHECK(call_);
-    call_->Write(std::move(request));
-  }
-
- private:
-  fxl::WeakPtr<ListenCall> const call_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ListenCallHandlerImpl);
-};
-
-}  // namespace
-
-ListenCall::ListenCall(ListenCallClient* client,
-                       std::unique_ptr<grpc::ClientContext> context,
-                       std::unique_ptr<ListenStream> stream)
-    : client_(client),
-      context_(std::move(context)),
-      stream_(std::move(stream)),
-      stream_controller_(stream_.get()),
-      stream_reader_(stream_.get()),
-      stream_writer_(stream_.get()),
-      weak_ptr_factory_(this) {
-  // Configure reading from the stream.
-  stream_reader_.SetOnError([this] { FinishIfNeeded(); });
-  stream_reader_.SetOnMessage(
-      [this](google::firestore::v1beta1::ListenResponse response) {
-        if (CheckEmpty()) {
-          return;
-        }
-
-        client_->OnResponse(std::move(response));
-        if (finish_requested_) {
-          return;
-        }
-        stream_reader_.Read();
-      });
-
-  // Configure writing to the stream.
-  stream_writer_.SetOnError([this] { FinishIfNeeded(); });
-  stream_writer_.SetOnSuccess([this] { CheckEmpty(); });
-
-  // Finally, start the stream.
-  stream_controller_.StartCall([this](bool ok) {
-    if (!ok) {
-      FXL_LOG(ERROR) << "Failed to establish the stream.";
-      HandleFinished(grpc::Status(grpc::StatusCode::UNKNOWN, "unknown"));
-      return;
-    }
-
-    if (CheckEmpty()) {
-      return;
-    }
-
-    // Notify the client that the connection is now established and start
-    // reading the server stream.
-    connected_ = true;
-    client_->OnConnected();
-    stream_reader_.Read();
-  });
-}
-
-ListenCall::~ListenCall() { FXL_DCHECK(IsEmpty()); }
-
-void ListenCall::Write(google::firestore::v1beta1::ListenRequest request) {
-  // It's only valid to perform a write after the connection was established,
-  // and before the Finish() call was made.
-  FXL_DCHECK(connected_);
-  FXL_DCHECK(!finish_requested_);
-  stream_writer_.Write(std::move(request));
-}
-
-void ListenCall::OnHandlerGone() {
-  // Unset the |client_| pointer, so that no client notifications are made
-  // after the handler is deleted.
-  client_ = nullptr;
-
-  context_->TryCancel();
-  CheckEmpty();
-}
-
-std::unique_ptr<ListenCallHandler> ListenCall::MakeHandler() {
-  return std::make_unique<ListenCallHandlerImpl>(
-      weak_ptr_factory_.GetWeakPtr());
-}
-
-void ListenCall::FinishIfNeeded() {
-  if (!finish_requested_ && client_) {
-    Finish();
-    return;
-  }
-
-  CheckEmpty();
-}
-
-void ListenCall::Finish() {
-  FXL_DCHECK(!finish_requested_);
-  finish_requested_ = true;
-
-  stream_controller_.Finish([this](bool ok, grpc::Status status) {
-    if (!client_) {
-      CheckEmpty();
-      return;
-    }
-
-    if (!ok) {
-      FXL_LOG(ERROR) << "Failed to retrieve the final status of the stream";
-      HandleFinished(grpc::Status(grpc::StatusCode::UNKNOWN, "unknown"));
-      return;
-    }
-
-    HandleFinished(status);
-  });
-}
-
-void ListenCall::HandleFinished(grpc::Status status) {
-  if (client_) {
-    client_->OnFinished(status);
-    // No client notifications can be delivered after |OnFinished|.
-    client_ = nullptr;
-  }
-  CheckEmpty();
-}
-
-bool ListenCall::IsEmpty() {
-  return client_ == nullptr && stream_controller_.IsEmpty() &&
-         stream_reader_.IsEmpty() && stream_writer_.IsEmpty();
-}
-
-bool ListenCall::CheckEmpty() {
-  if (!IsEmpty()) {
-    return false;
-  }
-
-  if (on_empty_) {
-    on_empty_();
-  }
-  return true;
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/firestore/listen_call.h b/bin/cloud_provider_firestore/firestore/listen_call.h
deleted file mode 100644
index c8e4e6e..0000000
--- a/bin/cloud_provider_firestore/firestore/listen_call.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_LISTEN_CALL_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_LISTEN_CALL_H_
-
-#include <memory>
-
-#include <google/firestore/v1beta1/firestore.grpc.pb.h>
-#include <grpc++/grpc++.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/cloud_provider_firestore/firestore/listen_call_client.h"
-#include "peridot/bin/cloud_provider_firestore/grpc/stream_controller.h"
-#include "peridot/bin/cloud_provider_firestore/grpc/stream_reader.h"
-#include "peridot/bin/cloud_provider_firestore/grpc/stream_writer.h"
-
-namespace cloud_provider_firestore {
-
-using ListenStream = grpc::ClientAsyncReaderWriterInterface<
-    google::firestore::v1beta1::ListenRequest,
-    google::firestore::v1beta1::ListenResponse>;
-
-class ListenCall {
- public:
-  // Creates a new instance.
-  ListenCall(ListenCallClient* client,
-             std::unique_ptr<grpc::ClientContext> context,
-             std::unique_ptr<ListenStream> stream);
-  ~ListenCall();
-
-  void set_on_empty(fit::closure on_empty) { on_empty_ = std::move(on_empty); }
-
-  void Write(google::firestore::v1beta1::ListenRequest request);
-
-  void OnHandlerGone();
-
-  std::unique_ptr<ListenCallHandler> MakeHandler();
-
- private:
-  void FinishIfNeeded();
-
-  void Finish();
-
-  void HandleFinished(grpc::Status status);
-
-  bool IsEmpty();
-
-  bool CheckEmpty();
-
-  // Pointer to the client of the call. It is unset when the call handler is
-  // deleted.
-  ListenCallClient* client_;
-
-  // Context used to make the remote call.
-  std::unique_ptr<grpc::ClientContext> context_;
-
-  // gRPC stream handler.
-  std::unique_ptr<ListenStream> stream_;
-
-  StreamController<ListenStream> stream_controller_;
-  StreamReader<ListenStream, google::firestore::v1beta1::ListenResponse>
-      stream_reader_;
-  StreamWriter<ListenStream, google::firestore::v1beta1::ListenRequest>
-      stream_writer_;
-
-  fit::closure on_empty_;
-
-  bool connected_ = false;
-  bool finish_requested_ = false;
-
-  // Must be the last member.
-  fxl::WeakPtrFactory<ListenCall> weak_ptr_factory_;
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_LISTEN_CALL_H_
diff --git a/bin/cloud_provider_firestore/firestore/listen_call_client.h b/bin/cloud_provider_firestore/firestore/listen_call_client.h
deleted file mode 100644
index 7ddf917..0000000
--- a/bin/cloud_provider_firestore/firestore/listen_call_client.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_LISTEN_CALL_CLIENT_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_LISTEN_CALL_CLIENT_H_
-
-#include <functional>
-#include <memory>
-
-#include <google/firestore/v1beta1/firestore.grpc.pb.h>
-#include <grpc++/grpc++.h>
-#include <lib/fxl/functional/closure.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-namespace cloud_provider_firestore {
-
-// Client interface for the Listen call.
-//
-// No methods will be called after the associated ListenCallHandler is deleted.
-class ListenCallClient {
- public:
-  ListenCallClient() {}
-  virtual ~ListenCallClient() {}
-
-  // Called when the connection is established.
-  //
-  // It is only after receiving this call that any methods on the associated
-  // ListenCallHandler can be called.
-  virtual void OnConnected() = 0;
-
-  // Called when a response is received.
-  //
-  // Can be called multiple times.
-  virtual void OnResponse(
-      google::firestore::v1beta1::ListenResponse response) = 0;
-
-  // Called when the stream is closed.
-  //
-  // Might be called at any time before or after the OnConnected() call, when
-  // an error shuts down the stream.
-  //
-  // This method will be called exactly once. No other methods will be called
-  // after this one. No methods on the associated ListenCallHandler can be
-  // called after this call is received.
-  virtual void OnFinished(grpc::Status status) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(ListenCallClient);
-};
-
-// Handler for the listen call.
-//
-// The client can delete this at any point, causing the underlying RPC to
-// correctly terminate if needed.
-class ListenCallHandler {
- public:
-  ListenCallHandler() {}
-
-  virtual ~ListenCallHandler() {}
-
-  // Writes the given |request| into the outgoing stream.
-  //
-  // Can be only called after the |OnConnected()| notification on the associated
-  // ListenCallClient.
-  virtual void Write(google::firestore::v1beta1::ListenRequest request) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(ListenCallHandler);
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_LISTEN_CALL_CLIENT_H_
diff --git a/bin/cloud_provider_firestore/firestore/listen_call_unittest.cc b/bin/cloud_provider_firestore/firestore/listen_call_unittest.cc
deleted file mode 100644
index 61e9f45..0000000
--- a/bin/cloud_provider_firestore/firestore/listen_call_unittest.cc
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/firestore/listen_call.h"
-
-#include <lib/fit/function.h>
-
-#include "gtest/gtest.h"
-
-namespace cloud_provider_firestore {
-
-class TestListenStream : public ListenStream {
- public:
-  TestListenStream() {}
-  ~TestListenStream() override {}
-
-  // ListenStream:
-  void StartCall(void* tag) override {
-    connect_tag = static_cast<fit::function<void(bool)>*>(tag);
-  }
-  void ReadInitialMetadata(void* /*tag*/) override {}
-  void Read(google::firestore::v1beta1::ListenResponse* /*response*/,
-            void* tag) override {
-    read_tag = static_cast<fit::function<void(bool)>*>(tag);
-  }
-  void Write(const google::firestore::v1beta1::ListenRequest& /*request*/,
-             void* tag) override {
-    write_tag = static_cast<fit::function<void(bool)>*>(tag);
-  }
-  void Write(const google::firestore::v1beta1::ListenRequest& /*request*/,
-             grpc::WriteOptions /*options*/, void* /*tag*/) override {}
-  void WritesDone(void* /*tag*/) override {}
-  void Finish(grpc::Status* /*status*/, void* tag) override {
-    finish_tag = static_cast<fit::function<void(bool)>*>(tag);
-  }
-
-  fit::function<void(bool)>* connect_tag = nullptr;
-  fit::function<void(bool)>* read_tag = nullptr;
-  fit::function<void(bool)>* write_tag = nullptr;
-  fit::function<void(bool)>* finish_tag = nullptr;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestListenStream);
-};
-
-class ListenCallTest : public ::testing::Test, public ListenCallClient {
- public:
-  ListenCallTest() {
-    auto stream = std::make_unique<TestListenStream>();
-    auto context = std::make_unique<grpc::ClientContext>();
-    stream_ = stream.get();
-    call_ = std::make_unique<ListenCall>(this, std::move(context),
-                                         std::move(stream));
-    call_->set_on_empty([this] { on_empty_calls_++; });
-  }
-  ~ListenCallTest() override {}
-
-  // ListenCallClient:
-  void OnConnected() override { on_connected_calls_++; }
-
-  void OnResponse(
-      google::firestore::v1beta1::ListenResponse /*response*/) override {
-    on_response_calls_++;
-  }
-
-  void OnFinished(grpc::Status status) override {
-    on_finished_calls_++;
-    status_ = status;
-  }
-
- protected:
-  TestListenStream* stream_;
-  std::unique_ptr<ListenCall> call_;
-
-  int on_connected_calls_ = 0;
-  int on_response_calls_ = 0;
-  int on_finished_calls_ = 0;
-  grpc::Status status_;
-
-  int on_empty_calls_ = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(ListenCallTest);
-};
-
-TEST_F(ListenCallTest, DeleteHandlerBeforeConnect) {
-  auto handler = call_->MakeHandler();
-  handler.reset();
-
-  // Simulate the connection response arriving.
-  (*stream_->connect_tag)(true);
-
-  // Verify that on_empty was called.
-  EXPECT_EQ(1, on_empty_calls_);
-
-  // Verify that no client calls were made (because the handler was deleted at
-  // the very beginning and no client calls should be made after it goes away).
-  EXPECT_EQ(0, on_connected_calls_);
-  EXPECT_EQ(0, on_response_calls_);
-  EXPECT_EQ(0, on_finished_calls_);
-}
-
-TEST_F(ListenCallTest, ConnectionError) {
-  auto handler = call_->MakeHandler();
-  (*stream_->connect_tag)(false);
-  EXPECT_EQ(0, on_connected_calls_);
-  EXPECT_EQ(0, on_response_calls_);
-  EXPECT_EQ(1, on_finished_calls_);
-  EXPECT_FALSE(status_.ok());
-}
-
-TEST_F(ListenCallTest, DeleteHandlerAfterConnect) {
-  auto handler = call_->MakeHandler();
-  (*stream_->connect_tag)(true);
-  EXPECT_EQ(1, on_connected_calls_);
-
-  // Delete the handler and simulate the pending read call failing due to being
-  // interrupted.
-  handler.reset();
-  (*stream_->read_tag)(false);
-
-  // Verify that on_empty was called.
-  EXPECT_EQ(1, on_empty_calls_);
-
-  // Verify that no further client calls were made after the handler is deleted.
-  EXPECT_EQ(1, on_connected_calls_);
-  EXPECT_EQ(0, on_response_calls_);
-  EXPECT_EQ(0, on_finished_calls_);
-}
-
-TEST_F(ListenCallTest, WriteAndDeleteHandler) {
-  auto handler = call_->MakeHandler();
-  (*stream_->connect_tag)(true);
-  EXPECT_EQ(1, on_connected_calls_);
-
-  handler->Write(google::firestore::v1beta1::ListenRequest());
-  (*stream_->write_tag)(true);
-
-  handler.reset();
-  (*stream_->read_tag)(false);
-  EXPECT_EQ(1, on_empty_calls_);
-  EXPECT_EQ(1, on_connected_calls_);
-  EXPECT_EQ(0, on_response_calls_);
-  EXPECT_EQ(0, on_finished_calls_);
-}
-
-TEST_F(ListenCallTest, ReadAndDeleteHandler) {
-  auto handler = call_->MakeHandler();
-  (*stream_->connect_tag)(true);
-  EXPECT_EQ(1, on_connected_calls_);
-
-  (*stream_->read_tag)(true);
-  (*stream_->read_tag)(true);
-  (*stream_->read_tag)(true);
-
-  handler.reset();
-  (*stream_->read_tag)(false);
-  EXPECT_EQ(1, on_empty_calls_);
-  EXPECT_EQ(1, on_connected_calls_);
-  EXPECT_EQ(3, on_response_calls_);
-  EXPECT_EQ(0, on_finished_calls_);
-}
-
-TEST_F(ListenCallTest, ReadError) {
-  auto handler = call_->MakeHandler();
-  (*stream_->connect_tag)(true);
-  EXPECT_EQ(1, on_connected_calls_);
-
-  (*stream_->read_tag)(true);
-  EXPECT_EQ(1, on_response_calls_);
-  EXPECT_FALSE(stream_->finish_tag);
-
-  // Simulate read error, verify that we attempt to finish the stream to
-  // retrieve the error status.
-  (*stream_->read_tag)(false);
-  EXPECT_TRUE(stream_->finish_tag);
-
-  (*stream_->finish_tag)(true);
-  EXPECT_EQ(1, on_finished_calls_);
-}
-
-// Verifies that we don't crash when the handler outlives the call object, see
-// LE-584.
-TEST_F(ListenCallTest, DeleteCallObjectBeforeHandler) {
-  auto handler = call_->MakeHandler();
-  (*stream_->connect_tag)(true);
-  EXPECT_EQ(1, on_connected_calls_);
-
-  (*stream_->read_tag)(true);
-  EXPECT_EQ(1, on_response_calls_);
-  EXPECT_FALSE(stream_->finish_tag);
-
-  // Simulate read error which will close the stream.
-  (*stream_->read_tag)(false);
-  EXPECT_TRUE(stream_->finish_tag);
-  (*stream_->finish_tag)(true);
-  EXPECT_EQ(1, on_finished_calls_);
-
-  // Verify that on_empty was called.
-  EXPECT_EQ(1, on_empty_calls_);
-
-  // Delete the call object.
-  call_.reset();
-
-  // Delete the handler.
-  handler.reset();
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/firestore/testing/BUILD.gn b/bin/cloud_provider_firestore/firestore/testing/BUILD.gn
deleted file mode 100644
index a3b3220..0000000
--- a/bin/cloud_provider_firestore/firestore/testing/BUILD.gn
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/cloud_provider_firestore/*" ]
-
-source_set("testing") {
-  testonly = true
-
-  sources = [
-    "encoding.cc",
-    "encoding.h",
-    "test_firestore_service.cc",
-    "test_firestore_service.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//peridot/bin/cloud_provider_firestore/firestore",
-    "//peridot/bin/cloud_provider_firestore/include",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-  ]
-
-  deps = [
-    "//third_party/googleapis/google/firestore/v1beta1",
-    "//third_party/googleapis/google/firestore/v1beta1:service",
-    "//third_party/grpc:grpc++",
-  ]
-}
diff --git a/bin/cloud_provider_firestore/firestore/testing/encoding.cc b/bin/cloud_provider_firestore/firestore/testing/encoding.cc
deleted file mode 100644
index 5962257..0000000
--- a/bin/cloud_provider_firestore/firestore/testing/encoding.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/firestore/testing/encoding.h"
-
-#include "peridot/bin/cloud_provider_firestore/firestore/encoding.h"
-
-namespace cloud_provider_firestore {
-
-namespace {
-// Must match |kTimestampKey| in
-// peridot/bin/cloud_provider_firestore/firestore/encoding.cc.
-constexpr char kTimestampKey[] = "timestamp";
-}  // namespace
-
-bool EncodeCommitBatchWithTimestamp(
-    const cloud_provider::CommitPack& commits, std::string timestamp,
-    google::firestore::v1beta1::Document* document) {
-  google::firestore::v1beta1::Document result;
-  if (!EncodeCommitBatch(commits, &result)) {
-    return false;
-  }
-
-  google::protobuf::Timestamp protobuf_timestamp;
-  if (!protobuf_timestamp.ParseFromString(timestamp)) {
-    return false;
-  }
-  google::firestore::v1beta1::Value& timestamp_value =
-      (*result.mutable_fields())[kTimestampKey];
-  *(timestamp_value.mutable_timestamp_value()) = std::move(protobuf_timestamp);
-
-  document->Swap(&result);
-  return true;
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/firestore/testing/encoding.h b/bin/cloud_provider_firestore/firestore/testing/encoding.h
deleted file mode 100644
index e33b265..0000000
--- a/bin/cloud_provider_firestore/firestore/testing/encoding.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_TESTING_ENCODING_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_TESTING_ENCODING_H_
-
-#include <string>
-
-#include <google/firestore/v1beta1/document.pb.h>
-#include <lib/fidl/cpp/vector.h>
-
-#include "peridot/bin/cloud_provider_firestore/include/types.h"
-
-namespace cloud_provider_firestore {
-
-// Encodes a batch of commits along with the givem timestamp.
-//
-// The resulting Document matches what the server returns from queries: the
-// given timestamp appears as the server-set timestamp.
-//
-// |timestamp| must be a valid serialized protobuf::Timestamp.
-bool EncodeCommitBatchWithTimestamp(
-    const cloud_provider::CommitPack& commits, std::string timestamp,
-    google::firestore::v1beta1::Document* document);
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_TESTING_ENCODING_H_
diff --git a/bin/cloud_provider_firestore/firestore/testing/test_firestore_service.cc b/bin/cloud_provider_firestore/firestore/testing/test_firestore_service.cc
deleted file mode 100644
index 982e9bc..0000000
--- a/bin/cloud_provider_firestore/firestore/testing/test_firestore_service.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/firestore/testing/test_firestore_service.h"
-
-#include <lib/fit/function.h>
-
-namespace cloud_provider_firestore {
-
-namespace {
-class TestListenCallHandler : public ListenCallHandler {
- public:
-  TestListenCallHandler() {}
-
-  ~TestListenCallHandler() override {}
-
-  void Write(google::firestore::v1beta1::ListenRequest /*request*/) override {
-    // do nothing
-  }
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestListenCallHandler);
-};
-
-}  // namespace
-
-TestFirestoreService::TestFirestoreService() : db_path_(), root_path_() {}
-TestFirestoreService::~TestFirestoreService() {}
-
-const std::string& TestFirestoreService::GetDatabasePath() { return db_path_; }
-
-const std::string& TestFirestoreService::GetRootPath() { return root_path_; }
-
-void TestFirestoreService::GetDocument(
-    google::firestore::v1beta1::GetDocumentRequest request,
-    std::shared_ptr<grpc::CallCredentials> /*call_credentials*/,
-    fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-        callback) {
-  FXL_DCHECK(!shutdown_callback);
-  get_document_records.push_back({std::move(request), std::move(callback)});
-}
-
-void TestFirestoreService::ListDocuments(
-    google::firestore::v1beta1::ListDocumentsRequest request,
-    std::shared_ptr<grpc::CallCredentials> /*call_credentials*/,
-    fit::function<void(grpc::Status,
-                       google::firestore::v1beta1::ListDocumentsResponse)>
-        callback) {
-  FXL_DCHECK(!shutdown_callback);
-  list_documents_records.push_back({std::move(request), std::move(callback)});
-}
-
-void TestFirestoreService::CreateDocument(
-    google::firestore::v1beta1::CreateDocumentRequest request,
-    std::shared_ptr<grpc::CallCredentials> /*call_credentials*/,
-    fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-        callback) {
-  FXL_DCHECK(!shutdown_callback);
-  create_document_records.push_back({std::move(request), std::move(callback)});
-}
-
-void TestFirestoreService::DeleteDocument(
-    google::firestore::v1beta1::DeleteDocumentRequest request,
-    std::shared_ptr<grpc::CallCredentials> /*call_credentials*/,
-    fit::function<void(grpc::Status)> callback) {
-  FXL_DCHECK(!shutdown_callback);
-  delete_document_records.push_back({std::move(request), std::move(callback)});
-}
-
-void TestFirestoreService::RunQuery(
-    google::firestore::v1beta1::RunQueryRequest request,
-    std::shared_ptr<grpc::CallCredentials> call_credentials,
-    fit::function<
-        void(grpc::Status,
-             std::vector<google::firestore::v1beta1::RunQueryResponse>)>
-        callback) {
-  FXL_DCHECK(!shutdown_callback);
-  run_query_records.push_back({std::move(request), std::move(callback)});
-}
-
-void TestFirestoreService::Commit(
-    google::firestore::v1beta1::CommitRequest request,
-    std::shared_ptr<grpc::CallCredentials> /*call_credentials*/,
-    fit::function<void(grpc::Status,
-                       google::firestore::v1beta1::CommitResponse)>
-        callback) {
-  FXL_DCHECK(!shutdown_callback);
-  commit_records.push_back({std::move(request), std::move(callback)});
-}
-
-std::unique_ptr<ListenCallHandler> TestFirestoreService::Listen(
-    std::shared_ptr<grpc::CallCredentials> /*call_credentials*/,
-    ListenCallClient* client) {
-  FXL_DCHECK(!shutdown_callback);
-  listen_clients.push_back(client);
-  return std::make_unique<TestListenCallHandler>();
-}
-
-void TestFirestoreService::ShutDown(fit::closure callback) {
-  FXL_DCHECK(!shutdown_callback);
-  shutdown_callback = std::move(callback);
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/firestore/testing/test_firestore_service.h b/bin/cloud_provider_firestore/firestore/testing/test_firestore_service.h
deleted file mode 100644
index 977d32d..0000000
--- a/bin/cloud_provider_firestore/firestore/testing/test_firestore_service.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_TESTING_TEST_FIRESTORE_SERVICE_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_TESTING_TEST_FIRESTORE_SERVICE_H_
-
-#include <string>
-
-#include <google/firestore/v1beta1/document.pb.h>
-#include <google/firestore/v1beta1/firestore.grpc.pb.h>
-#include <lib/fit/function.h>
-
-#include "peridot/bin/cloud_provider_firestore/firestore/firestore_service.h"
-
-namespace cloud_provider_firestore {
-
-struct GetDocumentRecord {
-  google::firestore::v1beta1::GetDocumentRequest request;
-  fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-      callback;
-};
-
-struct ListDocumentsRecord {
-  google::firestore::v1beta1::ListDocumentsRequest request;
-  fit::function<void(grpc::Status,
-                     google::firestore::v1beta1::ListDocumentsResponse)>
-      callback;
-};
-
-struct CreateDocumentRecord {
-  google::firestore::v1beta1::CreateDocumentRequest request;
-  fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-      callback;
-};
-
-struct DeleteDocumentRecord {
-  google::firestore::v1beta1::DeleteDocumentRequest request;
-  fit::function<void(grpc::Status)> callback;
-};
-
-struct CommitRecord {
-  google::firestore::v1beta1::CommitRequest request;
-  fit::function<void(grpc::Status, google::firestore::v1beta1::CommitResponse)>
-      callback;
-};
-
-struct RunQueryRecord {
-  google::firestore::v1beta1::RunQueryRequest request;
-  fit::function<void(grpc::Status,
-                     std::vector<google::firestore::v1beta1::RunQueryResponse>)>
-      callback;
-};
-
-class TestFirestoreService : public FirestoreService {
- public:
-  TestFirestoreService();
-  ~TestFirestoreService() override;
-
-  // FirestoreService:
-  const std::string& GetDatabasePath() override;
-
-  const std::string& GetRootPath() override;
-
-  void GetDocument(
-      google::firestore::v1beta1::GetDocumentRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-          callback) override;
-
-  void ListDocuments(
-      google::firestore::v1beta1::ListDocumentsRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<void(grpc::Status,
-                         google::firestore::v1beta1::ListDocumentsResponse)>
-          callback) override;
-
-  void CreateDocument(
-      google::firestore::v1beta1::CreateDocumentRequest request,
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      fit::function<void(grpc::Status, google::firestore::v1beta1::Document)>
-          callback) override;
-
-  void DeleteDocument(google::firestore::v1beta1::DeleteDocumentRequest request,
-                      std::shared_ptr<grpc::CallCredentials> call_credentials,
-                      fit::function<void(grpc::Status)> callback) override;
-
-  void RunQuery(google::firestore::v1beta1::RunQueryRequest request,
-                std::shared_ptr<grpc::CallCredentials> call_credentials,
-                fit::function<void(
-                    grpc::Status,
-                    std::vector<google::firestore::v1beta1::RunQueryResponse>)>
-                    callback) override;
-
-  void Commit(google::firestore::v1beta1::CommitRequest request,
-              std::shared_ptr<grpc::CallCredentials> call_credentials,
-              fit::function<void(grpc::Status,
-                                 google::firestore::v1beta1::CommitResponse)>
-                  callback) override;
-
-  std::unique_ptr<ListenCallHandler> Listen(
-      std::shared_ptr<grpc::CallCredentials> call_credentials,
-      ListenCallClient* client) override;
-
-  void ShutDown(fit::closure callback) override;
-
-  std::vector<GetDocumentRecord> get_document_records;
-  std::vector<ListDocumentsRecord> list_documents_records;
-  std::vector<CreateDocumentRecord> create_document_records;
-  std::vector<DeleteDocumentRecord> delete_document_records;
-  std::vector<CommitRecord> commit_records;
-  std::vector<RunQueryRecord> run_query_records;
-  std::vector<ListenCallClient*> listen_clients;
-
-  fit::closure shutdown_callback;
-
- private:
-  const std::string db_path_;
-  const std::string root_path_;
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_FIRESTORE_TESTING_TEST_FIRESTORE_SERVICE_H_
diff --git a/bin/cloud_provider_firestore/grpc/BUILD.gn b/bin/cloud_provider_firestore/grpc/BUILD.gn
deleted file mode 100644
index 2e5c5cd..0000000
--- a/bin/cloud_provider_firestore/grpc/BUILD.gn
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/cloud_provider_firestore/*" ]
-
-source_set("grpc") {
-  sources = [
-    "read_stream_drainer.h",
-    "stream_controller.h",
-    "stream_reader.h",
-    "stream_writer.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//third_party/grpc:grpc++",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "read_stream_drainer_unittest.cc",
-  ]
-
-  deps = [
-    ":grpc",
-    "//garnet/public/lib/callback",
-    "//third_party/googletest:gtest",
-    "//third_party/grpc:grpc++",
-  ]
-}
diff --git a/bin/cloud_provider_firestore/grpc/read_stream_drainer.h b/bin/cloud_provider_firestore/grpc/read_stream_drainer.h
deleted file mode 100644
index 190a6df..0000000
--- a/bin/cloud_provider_firestore/grpc/read_stream_drainer.h
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_READ_STREAM_DRAINER_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_READ_STREAM_DRAINER_H_
-
-#include <functional>
-#include <memory>
-#include <vector>
-
-#include <grpc++/grpc++.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/cloud_provider_firestore/grpc/stream_controller.h"
-#include "peridot/bin/cloud_provider_firestore/grpc/stream_reader.h"
-
-namespace cloud_provider_firestore {
-
-// Utility which can drain a read-only grpc::Stream and return the messages.
-//
-// |GrpcStream| template type can be any class inheriting from
-// grpc::internal::AsyncReaderInterface.
-template <typename GrpcStream, typename Message>
-class ReadStreamDrainer {
- public:
-  // Creates a new instance.
-  ReadStreamDrainer(std::unique_ptr<grpc::ClientContext> context,
-                    std::unique_ptr<GrpcStream> stream)
-      : context_(std::move(context)),
-        stream_(std::move(stream)),
-        stream_controller_(stream_.get()),
-        stream_reader_(stream_.get()) {}
-  ~ReadStreamDrainer() {}
-
-  void set_on_empty(fit::closure on_empty) { on_empty_ = std::move(on_empty); }
-
-  // Reads messages from the stream until there is no more messages to read and
-  // returns all the messages to the caller.
-  //
-  // Can be called at most once.
-  void Drain(fit::function<void(grpc::Status, std::vector<Message>)> callback) {
-    FXL_DCHECK(!callback_);
-    callback_ = std::move(callback);
-    stream_controller_.StartCall([this](bool ok) {
-      if (!ok) {
-        Finish();
-        return;
-      }
-
-      OnConnected();
-    });
-  }
-
- private:
-  void OnConnected() {
-    // Configure the stream reader.
-    stream_reader_.SetOnError([this] { Finish(); });
-    stream_reader_.SetOnMessage([this](Message message) {
-      messages_.push_back(std::move(message));
-      stream_reader_.Read();
-    });
-
-    // Start reading.
-    stream_reader_.Read();
-  }
-
-  void Finish() {
-    stream_controller_.Finish([this](bool ok, grpc::Status status) {
-      if (status.ok()) {
-        callback_(status, std::move(messages_));
-      } else {
-        callback_(status, std::vector<Message>{});
-      }
-
-      if (on_empty_) {
-        on_empty_();
-      }
-    });
-  }
-
-  // Context used to make the remote call.
-  std::unique_ptr<grpc::ClientContext> context_;
-
-  // gRPC stream handler.
-  std::unique_ptr<GrpcStream> stream_;
-
-  StreamController<GrpcStream> stream_controller_;
-  StreamReader<GrpcStream, Message> stream_reader_;
-
-  fit::closure on_empty_;
-  std::vector<Message> messages_;
-  fit::function<void(grpc::Status, std::vector<Message>)> callback_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(ReadStreamDrainer);
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_READ_STREAM_DRAINER_H_
diff --git a/bin/cloud_provider_firestore/grpc/read_stream_drainer_unittest.cc b/bin/cloud_provider_firestore/grpc/read_stream_drainer_unittest.cc
deleted file mode 100644
index 2543904..0000000
--- a/bin/cloud_provider_firestore/grpc/read_stream_drainer_unittest.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/grpc/read_stream_drainer.h"
-
-#include <functional>
-#include <vector>
-
-#include <grpc++/grpc++.h>
-#include <grpc++/support/async_stream.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fit/function.h>
-
-#include "gtest/gtest.h"
-
-namespace cloud_provider_firestore {
-namespace {
-
-using IntegerStream = grpc::ClientAsyncReaderInterface<int>;
-
-class TestIntegerStream : public IntegerStream {
- public:
-  TestIntegerStream() {}
-  ~TestIntegerStream() override {}
-
-  // IntegerStream:
-  void StartCall(void* tag) override {
-    connect_tag = static_cast<fit::function<void(bool)>*>(tag);
-  }
-  void ReadInitialMetadata(void* /*tag*/) override {}
-  void Read(int* message, void* tag) override {
-    message_ptr = message;
-    read_tag = static_cast<fit::function<void(bool)>*>(tag);
-  }
-  void Finish(grpc::Status* status, void* tag) override {
-    status_ptr = status;
-    finish_tag = static_cast<fit::function<void(bool)>*>(tag);
-  }
-
-  fit::function<void(bool)>* connect_tag = nullptr;
-  fit::function<void(bool)>* read_tag = nullptr;
-  fit::function<void(bool)>* finish_tag = nullptr;
-
-  int* message_ptr = nullptr;
-  grpc::Status* status_ptr = nullptr;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestIntegerStream);
-};
-
-class ReadStreamDrainerTest : public ::testing::Test {
- public:
-  ReadStreamDrainerTest() {
-    auto stream = std::make_unique<TestIntegerStream>();
-    auto context = std::make_unique<grpc::ClientContext>();
-    stream_ = stream.get();
-    drainer_ = std::make_unique<ReadStreamDrainer<IntegerStream, int>>(
-        std::move(context), std::move(stream));
-    drainer_->set_on_empty([this] { on_empty_calls_++; });
-  }
-  ~ReadStreamDrainerTest() override {}
-
- protected:
-  TestIntegerStream* stream_;
-  std::unique_ptr<ReadStreamDrainer<IntegerStream, int>> drainer_;
-
-  int on_empty_calls_ = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(ReadStreamDrainerTest);
-};
-
-TEST_F(ReadStreamDrainerTest, ConnectionError) {
-  bool called = false;
-  grpc::Status status;
-  std::vector<int> result;
-  drainer_->Drain(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &result));
-  (*stream_->connect_tag)(false);
-  (*stream_->status_ptr) = grpc::Status(grpc::StatusCode::INTERNAL, "");
-  EXPECT_FALSE(called);
-  (*stream_->finish_tag)(true);
-
-  EXPECT_TRUE(called);
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(grpc::StatusCode::INTERNAL, status.error_code());
-  EXPECT_TRUE(result.empty());
-}
-
-TEST_F(ReadStreamDrainerTest, Ok) {
-  bool called = false;
-  grpc::Status status;
-  std::vector<int> result;
-  drainer_->Drain(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &result));
-  (*stream_->connect_tag)(true);
-  (*stream_->message_ptr) = 1;
-  (*stream_->read_tag)(true);
-  (*stream_->message_ptr) = 2;
-  (*stream_->read_tag)(true);
-  // Signal that there is no more messages to read.
-  (*stream_->read_tag)(false);
-  (*stream_->status_ptr) = grpc::Status::OK;
-  EXPECT_FALSE(called);
-  (*stream_->finish_tag)(true);
-
-  EXPECT_TRUE(called);
-  EXPECT_TRUE(status.ok());
-  EXPECT_EQ((std::vector<int>{1, 2}), result);
-}
-
-}  // namespace
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/grpc/stream_controller.h b/bin/cloud_provider_firestore/grpc/stream_controller.h
deleted file mode 100644
index eaab227..0000000
--- a/bin/cloud_provider_firestore/grpc/stream_controller.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_STREAM_CONTROLLER_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_STREAM_CONTROLLER_H_
-
-#include <functional>
-
-#include <grpc++/grpc++.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-namespace cloud_provider_firestore {
-
-// Handler common for all gRPC streams.
-//
-// |GrpcStream| template type can be any class inheriting from
-// grpc::internal::ClientAsyncStreamingInterface.
-template <typename GrpcStream>
-class StreamController {
- public:
-  StreamController(GrpcStream* grpc_stream) : grpc_stream_(grpc_stream) {
-    FXL_DCHECK(grpc_stream_);
-  }
-
-  ~StreamController() {
-    // The class cannot go away while completion queue operations are pending,
-    // as they reference member function objects as operation tags.
-    FXL_DCHECK(pending_cq_operations_ == 0);
-  }
-
-  bool IsEmpty() const { return pending_cq_operations_ == 0; }
-
-  // Attempts to start the stream.
-  void StartCall(fit::function<void(bool)> callback) {
-    on_connected_ = [this, callback = std::move(callback)](bool ok) {
-      pending_cq_operations_--;
-      callback(ok);
-    };
-
-    pending_cq_operations_++;
-    grpc_stream_->StartCall(&on_connected_);
-  }
-
-  // Attempts to finish the stream and read the final status.
-  //
-  // Note that calling Finish() by itself does *not* make any pending read/write
-  // operations fail early. For that, call TryCancel() on the associated client
-  // context.
-  void Finish(fit::function<void(bool, grpc::Status)> callback) {
-    on_finish_ = [this, callback = std::move(callback)](bool ok) {
-      pending_cq_operations_--;
-      callback(ok, status_);
-    };
-
-    pending_cq_operations_++;
-    grpc_stream_->Finish(&status_, &on_finish_);
-  }
-
- private:
-  // gRPC stream handler.
-  GrpcStream* const grpc_stream_;
-
-  // Count of pending async tasks posted on the completion queue.
-  int pending_cq_operations_ = 0;
-
-  // Callables posted as CompletionQueue tags:
-  fit::function<void(bool)> on_connected_;
-  fit::function<void(bool)> on_finish_;
-
-  // Final status of the stream set by the server.
-  grpc::Status status_;
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_STREAM_CONTROLLER_H_
diff --git a/bin/cloud_provider_firestore/grpc/stream_reader.h b/bin/cloud_provider_firestore/grpc/stream_reader.h
deleted file mode 100644
index 83a620f..0000000
--- a/bin/cloud_provider_firestore/grpc/stream_reader.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_STREAM_READER_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_STREAM_READER_H_
-
-#include <functional>
-
-#include <grpc++/grpc++.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-namespace cloud_provider_firestore {
-
-// Handler for gRPC read streams.
-//
-// |GrpcStream| template type can be any class inheriting from
-// grpc::internal::AsyncReaderInterface.
-template <typename GrpcStream, typename Message>
-class StreamReader {
- public:
-  StreamReader(GrpcStream* grpc_stream) : grpc_stream_(grpc_stream) {
-    FXL_DCHECK(grpc_stream_);
-
-    on_read_ = [this](bool ok) {
-      read_is_pending_ = false;
-      OnRead(ok);
-    };
-  }
-
-  ~StreamReader() {
-    // The class cannot go away while completion queue operations are pending,
-    // as they reference member function objects as operation tags.
-    FXL_DCHECK(!read_is_pending_);
-  }
-
-  bool IsEmpty() const { return !read_is_pending_; }
-
-  // Sets a callback which is called when a read operation fails.
-  //
-  // This error is unrecoverable and means that there is no more messages to
-  // read or that the connection is broken.
-  void SetOnError(fit::function<void()> on_error) {
-    FXL_DCHECK(on_error);
-    on_error_ = std::move(on_error);
-  }
-
-  // Sets a callback which is called each time a message is read.
-  void SetOnMessage(fit::function<void(Message)> on_message) {
-    FXL_DCHECK(on_message);
-    on_message_ = std::move(on_message);
-  }
-
-  // Attempts to read a message from the stream.
-  //
-  // SetOnError() and SetOnMessage() must be called before calling Read() for
-  // the first time.
-  //
-  // Cannot be called while another read is already pending.
-  void Read() {
-    FXL_DCHECK(on_error_);
-    FXL_DCHECK(on_message_);
-
-    FXL_DCHECK(!read_is_pending_);
-    read_is_pending_ = true;
-    grpc_stream_->Read(&message_, &on_read_);
-  }
-
- private:
-  void OnRead(bool ok) {
-    if (!ok) {
-      // This can mean an unrecoverable connection error or be part of a regular
-      // shutdown sequence: OnRead with ok = false is called after the client
-      // calls TryCancel() to abort the RPC.
-      on_error_();
-      return;
-    }
-
-    on_message_(std::move(message_));
-  }
-
-  // gRPC stream handler.
-  GrpcStream* const grpc_stream_;
-
-  // Whether a read operation is currently in progress.
-  bool read_is_pending_ = false;
-
-  // Callables posted as CompletionQueue tags:
-  fit::function<void(bool)> on_read_;
-
-  // Internal callables not posted on CompletionQueue:
-  fit::function<void()> on_error_;
-  fit::function<void(Message)> on_message_;
-
-  Message message_;
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_STREAM_READER_H_
diff --git a/bin/cloud_provider_firestore/grpc/stream_writer.h b/bin/cloud_provider_firestore/grpc/stream_writer.h
deleted file mode 100644
index 087791a..0000000
--- a/bin/cloud_provider_firestore/grpc/stream_writer.h
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_STREAM_WRITER_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_STREAM_WRITER_H_
-
-#include <functional>
-
-#include <grpc++/grpc++.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-namespace cloud_provider_firestore {
-
-// Handler for gRPC write streams.
-//
-// |GrpcStream| template type can be any class inheriting from
-// grpc::internal::AsyncWriterInterface<Message>.
-template <typename GrpcStream, typename Message>
-class StreamWriter {
- public:
-  StreamWriter(GrpcStream* grpc_stream) : grpc_stream_(grpc_stream) {
-    FXL_DCHECK(grpc_stream_);
-
-    on_write_ = [this](bool ok) {
-      write_is_pending_ = false;
-      OnWrite(ok);
-    };
-  }
-
-  ~StreamWriter() {
-    // The class cannot go away while completion queue operations are pending,
-    // as they reference member function objects as operation tags.
-    FXL_DCHECK(!write_is_pending_);
-  }
-
-  bool IsEmpty() const { return !write_is_pending_; }
-
-  // Sets a callback which is called when a write operation fails.
-  //
-  // This error is unrecoverable and means that the write call cannot be made
-  // because the connection is broken.
-  void SetOnError(fit::function<void()> on_error) {
-    on_error_ = std::move(on_error);
-  }
-
-  // Sets a callback which is called when a write operation succeeds.
-  void SetOnSuccess(fit::function<void()> on_success) {
-    on_success_ = std::move(on_success);
-  }
-
-  // Attempts to write a message to the stream.
-  //
-  // SetOnError() and SetOnSuccess() must be called before calling Read() for
-  // the first time.
-  //
-  // Cannot be called while another write is already pending.
-  void Write(Message message) {
-    FXL_DCHECK(on_error_);
-    FXL_DCHECK(on_success_);
-
-    FXL_DCHECK(!write_is_pending_);
-    write_is_pending_ = true;
-    grpc_stream_->Write(message, &on_write_);
-  }
-
- private:
-  void OnWrite(bool ok) {
-    if (!ok) {
-      // This can mean an unrecoverable connection error or be part of a regular
-      // shutdown sequence: OnWrite with ok = false is called if the client
-      // calls TryCancel() to abort the RPC after a Write request was made.
-      on_error_();
-      return;
-    }
-
-    on_success_();
-  }
-
-  // gRPC stream handler.
-  GrpcStream* const grpc_stream_;
-
-  // Whether a write operation is currently in progress.
-  bool write_is_pending_ = false;
-
-  // Callables posted as CompletionQueue tags:
-  fit::function<void(bool)> on_write_;
-
-  // Internal callables not posted on CompletionQueue:
-  fit::function<void()> on_error_;
-  fit::function<void()> on_success_;
-
-  // Final status of the stream set by the server.
-  grpc::Status status_;
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_GRPC_STREAM_WRITER_H_
diff --git a/bin/cloud_provider_firestore/include/BUILD.gn b/bin/cloud_provider_firestore/include/BUILD.gn
deleted file mode 100644
index 313ce1a..0000000
--- a/bin/cloud_provider_firestore/include/BUILD.gn
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/cloud_provider_firestore/*" ]
-
-source_set("include") {
-  sources = [
-    "types.h",
-  ]
-
-  public_deps = [
-    "//peridot/bin/cloud_provider_firestore/fidl",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-  ]
-}
diff --git a/bin/cloud_provider_firestore/include/types.h b/bin/cloud_provider_firestore/include/types.h
deleted file mode 100644
index 2d4f23b..0000000
--- a/bin/cloud_provider_firestore/include/types.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_INCLUDE_TYPES_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_INCLUDE_TYPES_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <fuchsia/ledger/cloud/firestore/cpp/fidl.h>
-
-// More convenient aliases for FIDL types.
-
-namespace cloud_provider {
-using CloudProvider = fuchsia::ledger::cloud::CloudProvider;
-using CloudProviderPtr = fuchsia::ledger::cloud::CloudProviderPtr;
-using CommitPack = fuchsia::ledger::cloud::CommitPack;
-using DeviceSet = fuchsia::ledger::cloud::DeviceSet;
-using DeviceSetPtr = fuchsia::ledger::cloud::DeviceSetPtr;
-using DeviceSetWatcher = fuchsia::ledger::cloud::DeviceSetWatcher;
-using DeviceSetWatcherPtr = fuchsia::ledger::cloud::DeviceSetWatcherPtr;
-using PageCloud = fuchsia::ledger::cloud::PageCloud;
-using PageCloudPtr = fuchsia::ledger::cloud::PageCloudPtr;
-using PageCloudWatcher = fuchsia::ledger::cloud::PageCloudWatcher;
-using PageCloudWatcherPtr = fuchsia::ledger::cloud::PageCloudWatcherPtr;
-using Status = fuchsia::ledger::cloud::Status;
-using Token = fuchsia::ledger::cloud::Token;
-}  // namespace cloud_provider
-
-namespace cloud_provider_firestore {
-using Config = fuchsia::ledger::cloud::firestore::Config;
-using Factory = fuchsia::ledger::cloud::firestore::Factory;
-using FactoryPtr = fuchsia::ledger::cloud::firestore::FactoryPtr;
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_INCLUDE_TYPES_H_
diff --git a/bin/cloud_provider_firestore/testing/BUILD.gn b/bin/cloud_provider_firestore/testing/BUILD.gn
deleted file mode 100644
index d97f2a4..0000000
--- a/bin/cloud_provider_firestore/testing/BUILD.gn
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [
-  "//peridot/bin/*",
-  "//peridot/lib/*",
-]
-
-source_set("testing") {
-  testonly = true
-
-  sources = [
-    "cloud_provider_factory.cc",
-    "cloud_provider_factory.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-    "//peridot/bin/cloud_provider_firestore/fidl",
-    "//peridot/bin/cloud_provider_firestore/include",
-    "//peridot/lib/convert",
-    "//peridot/lib/firebase_auth/testing:service_account_provider",
-    "//peridot/lib/rng",
-    "//peridot/lib/rng:system",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-  ]
-}
diff --git a/bin/cloud_provider_firestore/testing/cloud_provider_factory.cc b/bin/cloud_provider_firestore/testing/cloud_provider_factory.cc
deleted file mode 100644
index 0fc71fa..0000000
--- a/bin/cloud_provider_firestore/testing/cloud_provider_factory.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/cloud_provider_firestore/testing/cloud_provider_factory.h"
-
-#include <utility>
-
-#include <fuchsia/net/oldhttp/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/backoff/exponential_backoff.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/svc/cpp/services.h>
-
-#include "peridot/lib/convert/convert.h"
-
-namespace cloud_provider_firestore {
-namespace {
-namespace http = ::fuchsia::net::oldhttp;
-
-constexpr char kAppUrl[] =
-    "fuchsia-pkg://fuchsia.com/cloud_provider_firestore"
-    "#meta/cloud_provider_firestore.cmx";
-
-std::string GenerateUserId() {
-  // Always use a real random generator for user ids.
-  rng::SystemRandom system_random;
-  return convert::ToHex(system_random.RandomUniqueBytes());
-}
-
-}  // namespace
-
-CloudProviderFactory::UserId::UserId(const UserId& user_id) = default;
-
-CloudProviderFactory::UserId::UserId(UserId&& user_id) = default;
-
-CloudProviderFactory::UserId& CloudProviderFactory::UserId::operator=(
-    const UserId& user_id) = default;
-
-CloudProviderFactory::UserId& CloudProviderFactory::UserId::operator=(
-    UserId&& user_id) = default;
-
-CloudProviderFactory::UserId CloudProviderFactory::UserId::New() {
-  return UserId();
-}
-
-CloudProviderFactory::UserId::UserId() : user_id_(GenerateUserId()) {}
-
-class CloudProviderFactory::TokenManagerContainer {
- public:
-  TokenManagerContainer(
-      component::StartupContext* startup_context,
-      async_dispatcher_t* dispatcher, rng::Random* random,
-      std::unique_ptr<service_account::Credentials> credentials,
-      std::string user_id,
-      fidl::InterfaceRequest<fuchsia::auth::TokenManager> request)
-      : startup_context_(startup_context),
-        network_wrapper_(
-            dispatcher,
-            std::make_unique<backoff::ExponentialBackoff>(
-                random->NewBitGenerator<uint64_t>()),
-            [this] {
-              return startup_context_
-                  ->ConnectToEnvironmentService<http::HttpService>();
-            }),
-        token_manager_(&network_wrapper_, std::move(credentials),
-                       std::move(user_id)),
-        binding_(&token_manager_, std::move(request)) {}
-
-  void set_on_empty(fit::closure on_empty) {
-    binding_.set_error_handler(
-        [on_empty = std::move(on_empty)](zx_status_t status) { on_empty(); });
-  }
-
- private:
-  component::StartupContext* const startup_context_;
-  network_wrapper::NetworkWrapperImpl network_wrapper_;
-  service_account::ServiceAccountTokenManager token_manager_;
-  fidl::Binding<fuchsia::auth::TokenManager> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TokenManagerContainer);
-};
-
-CloudProviderFactory::CloudProviderFactory(
-    component::StartupContext* startup_context, rng::Random* random,
-    std::string api_key,
-    std::unique_ptr<service_account::Credentials> credentials)
-    : startup_context_(startup_context),
-      random_(random),
-      api_key_(std::move(api_key)),
-      credentials_(std::move(credentials)),
-      services_loop_(&kAsyncLoopConfigNoAttachToThread) {
-  FXL_DCHECK(startup_context);
-  FXL_DCHECK(!api_key_.empty());
-}
-
-CloudProviderFactory::~CloudProviderFactory() { services_loop_.Shutdown(); }
-
-void CloudProviderFactory::Init() {
-  services_loop_.StartThread();
-  component::Services child_services;
-  fuchsia::sys::LaunchInfo launch_info;
-  launch_info.url = kAppUrl;
-  launch_info.directory_request = child_services.NewRequest();
-  startup_context_->launcher()->CreateComponent(
-      std::move(launch_info), cloud_provider_controller_.NewRequest());
-  child_services.ConnectToService(cloud_provider_factory_.NewRequest());
-}
-
-void CloudProviderFactory::MakeCloudProvider(
-    UserId user_id,
-    fidl::InterfaceRequest<cloud_provider::CloudProvider> request) {
-  fuchsia::auth::TokenManagerPtr token_manager;
-  MakeTokenManager(std::move(user_id), token_manager.NewRequest());
-
-  cloud_provider_firestore::Config firebase_config;
-  firebase_config.server_id = credentials_->project_id();
-  firebase_config.api_key = api_key_;
-
-  cloud_provider_factory_->GetCloudProvider(
-      std::move(firebase_config), std::move(token_manager), std::move(request),
-      [](cloud_provider::Status status) {
-        if (status != cloud_provider::Status::OK) {
-          FXL_LOG(ERROR) << "Failed to create a cloud provider: "
-                         << fidl::ToUnderlying(status);
-        }
-      });
-}
-
-void CloudProviderFactory::MakeTokenManager(
-    UserId user_id,
-    fidl::InterfaceRequest<fuchsia::auth::TokenManager> request) {
-  async::PostTask(services_loop_.dispatcher(),
-                  fxl::MakeCopyable([this, user_id = std::move(user_id),
-                                     request = std::move(request)]() mutable {
-                    token_managers_.emplace(
-                        startup_context_, services_loop_.dispatcher(), random_,
-                        credentials_->Clone(), std::move(user_id.user_id()),
-                        std::move(request));
-                  }));
-}
-
-}  // namespace cloud_provider_firestore
diff --git a/bin/cloud_provider_firestore/testing/cloud_provider_factory.h b/bin/cloud_provider_firestore/testing/cloud_provider_factory.h
deleted file mode 100644
index eab1814..0000000
--- a/bin/cloud_provider_firestore/testing/cloud_provider_factory.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_TESTING_CLOUD_PROVIDER_FACTORY_H_
-#define PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_TESTING_CLOUD_PROVIDER_FACTORY_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <fuchsia/ledger/cloud/firestore/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/network_wrapper/network_wrapper_impl.h>
-
-#include "peridot/bin/cloud_provider_firestore/include/types.h"
-#include "peridot/lib/firebase_auth/testing/credentials.h"
-#include "peridot/lib/firebase_auth/testing/service_account_token_manager.h"
-#include "peridot/lib/rng/random.h"
-#include "peridot/lib/rng/system_random.h"
-
-namespace cloud_provider_firestore {
-
-// Factory for real Firestore cloud provider binaries backed by fake token
-// provider.
-//
-// This is used for end-to-end testing, including the validation test suite for
-// the cloud provider.
-class CloudProviderFactory {
- public:
-  // Opaque container for user id.
-  class UserId {
-   public:
-    UserId(const UserId& user_id);
-    UserId(UserId&& user_id);
-    UserId& operator=(const UserId& user_id);
-    UserId& operator=(UserId&& user_id);
-
-    static UserId New();
-
-    const std::string& user_id() const { return user_id_; }
-
-   private:
-    UserId();
-
-    std::string user_id_;
-  };
-
-  CloudProviderFactory(
-      component::StartupContext* startup_context, rng::Random* random,
-      std::string api_key,
-      std::unique_ptr<service_account::Credentials> credentials);
-  ~CloudProviderFactory();
-
-  void Init();
-
-  void MakeCloudProvider(
-      UserId user_id,
-      fidl::InterfaceRequest<cloud_provider::CloudProvider> request);
-
-  void MakeTokenManager(
-      UserId user_id,
-      fidl::InterfaceRequest<fuchsia::auth::TokenManager> request);
-
- private:
-  class TokenManagerContainer;
-  component::StartupContext* const startup_context_;
-  rng::Random* const random_;
-  const std::string api_key_;
-  std::unique_ptr<service_account::Credentials> credentials_;
-
-  // Loop on which the token manager runs.
-  async::Loop services_loop_;
-
-  callback::AutoCleanableSet<TokenManagerContainer> token_managers_;
-
-  fuchsia::sys::ComponentControllerPtr cloud_provider_controller_;
-  FactoryPtr cloud_provider_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(CloudProviderFactory);
-};
-
-}  // namespace cloud_provider_firestore
-
-#endif  // PERIDOT_BIN_CLOUD_PROVIDER_FIRESTORE_TESTING_CLOUD_PROVIDER_FACTORY_H_
diff --git a/bin/cloud_provider_firestore/validation/BUILD.gn b/bin/cloud_provider_firestore/validation/BUILD.gn
deleted file mode 100644
index 3f7b059..0000000
--- a/bin/cloud_provider_firestore/validation/BUILD.gn
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/cloud_provider_firestore/*" ]
-
-executable("validation") {
-  output_name = "launch_validation_tests_firestore"
-  testonly = true
-
-  sources = [
-    "app.cc",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/cloud_provider_firestore/include",
-    "//peridot/bin/cloud_provider_firestore/testing",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/bin/ledger/tests/cloud_provider/launcher",
-    "//peridot/lib/rng:system",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
diff --git a/bin/cloud_provider_firestore/validation/app.cc b/bin/cloud_provider_firestore/validation/app.cc
deleted file mode 100644
index 82c90d0..0000000
--- a/bin/cloud_provider_firestore/validation/app.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/concatenate.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/cloud_provider_firestore/include/types.h"
-#include "peridot/bin/cloud_provider_firestore/testing/cloud_provider_factory.h"
-#include "peridot/bin/ledger/testing/sync_params.h"
-#include "peridot/bin/ledger/tests/cloud_provider/launcher/validation_tests_launcher.h"
-#include "peridot/lib/rng/system_random.h"
-
-namespace cloud_provider_firestore {
-void PrintUsage(const char* executable_name) {
-  std::cerr << "Usage: "
-            << executable_name
-            // Comment to make clang format not break formatting.
-            << ledger::GetSyncParamsUsage();
-}
-
-}  // namespace cloud_provider_firestore
-
-int main(int argc, char** argv) {
-  fxl::CommandLine command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  std::unique_ptr<component::StartupContext> startup_context =
-      component::StartupContext::CreateFromStartupInfo();
-
-  ledger::SyncParams sync_params;
-  if (!ledger::ParseSyncParamsFromCommandLine(
-          command_line, startup_context.get(), &sync_params)) {
-    cloud_provider_firestore::PrintUsage(argv[0]);
-    return -1;
-  }
-
-  const std::set<std::string> known_options = ledger::GetSyncParamFlags();
-  std::vector<std::string> arguments;
-  for (auto& option : command_line.options()) {
-    if (known_options.count(option.name) == 0u) {
-      arguments.push_back(
-          fxl::Concatenate({"--", option.name, "=", option.value}));
-    }
-  }
-
-  rng::SystemRandom random;
-
-  cloud_provider_firestore::CloudProviderFactory factory(
-      startup_context.get(), &random, sync_params.api_key,
-      sync_params.credentials->Clone());
-
-  cloud_provider::ValidationTestsLauncher launcher(
-      startup_context.get(), [&factory](auto request) {
-        factory.MakeCloudProvider(
-            cloud_provider_firestore::CloudProviderFactory::UserId::New(),
-            std::move(request));
-      });
-
-  int32_t return_code = -1;
-  async::PostTask(loop.dispatcher(), [&factory, &launcher, &return_code, &loop,
-                                      arguments = std::move(arguments)] {
-    factory.Init();
-
-    launcher.Run(arguments, [&return_code, &loop](int32_t result) {
-      return_code = result;
-      loop.Quit();
-    });
-  });
-  loop.Run();
-  return return_code;
-}
diff --git a/bin/cloud_provider_firestore/validation/validation_firestore.cmx b/bin/cloud_provider_firestore/validation/validation_firestore.cmx
deleted file mode 100644
index 845e193..0000000
--- a/bin/cloud_provider_firestore/validation/validation_firestore.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "facets": {
-        "fuchsia.test": {
-            "injected-services": {
-                "fuchsia.net.oldhttp.HttpService": "http"
-            },
-            "system-services": [
-                "fuchsia.net.LegacySocketProvider",
-                "fuchsia.netstack.Netstack",
-                "fuchsia.net.stack.Stack"
-            ]
-        }
-    },
-    "program": {
-        "binary": "test/disabled/launch_validation_tests_firestore"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/context_engine/BUILD.gn b/bin/context_engine/BUILD.gn
deleted file mode 100644
index 93cc674..0000000
--- a/bin/context_engine/BUILD.gn
+++ /dev/null
@@ -1,164 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-import("//peridot/build/tests_package.gni")
-
-executable_package("context_engine") {
-  meta = [
-    {
-      path = "meta/context_engine.cmx"
-      dest = "context_engine.cmx"
-    },
-  ]
-
-  sources = [
-    "context_engine_main.cc",
-  ]
-
-  deps = [
-    ":context_engine_impl",
-    "//garnet/public/lib/component/cpp",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-hermetic_tests_package("context_engine_unittests") {
-  deps = [
-    ":context_index_unittest",
-    ":context_repository_unittest",
-  ]
-}
-
-source_set("context_index") {
-  sources = [
-    "index.cc",
-    "index.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-executable("context_index_unittest") {
-  testonly = true
-
-  sources = [
-    "index_unittest.cc",
-  ]
-
-  deps = [
-    ":context_index",
-    "//garnet/public/lib/fsl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/context/cpp:context_helper",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("context_reader_impl") {
-  sources = [
-    "context_reader_impl.cc",
-    "context_reader_impl.h",
-  ]
-
-  deps = [
-    ":context_repository",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("context_repository") {
-  sources = [
-    "context_repository.cc",
-    "context_repository.h",
-    "debug.cc",
-    "debug.h",
-  ]
-
-  public_deps = [
-    "//peridot/lib/util:idle_waiter",
-  ]
-
-  deps = [
-    ":context_index",
-    "//garnet/public/lib/fsl",
-    "//peridot/lib/bound_set",
-    "//peridot/lib/rapidjson",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/fostr/fidl/fuchsia.modular",
-    "//third_party/rapidjson",
-  ]
-}
-
-executable("context_repository_unittest") {
-  testonly = true
-
-  sources = [
-    "context_repository_unittest.cc",
-  ]
-
-  deps = [
-    ":context_repository",
-    "//garnet/public/lib/fsl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/context/cpp:context_helper",
-    "//peridot/public/lib/context/cpp:context_metadata_builder",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("context_writer_impl") {
-  sources = [
-    "context_writer_impl.cc",
-    "context_writer_impl.h",
-  ]
-
-  deps = [
-    ":context_repository",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/bound_set",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:future",
-    "//peridot/public/lib/entity/cpp",
-    "//peridot/public/lib/entity/cpp:json",
-    "//third_party/rapidjson",
-  ]
-}
-
-source_set("context_engine_impl") {
-  sources = [
-    "context_engine_impl.cc",
-    "context_engine_impl.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-  ]
-
-  deps = [
-    ":context_reader_impl",
-    ":context_repository",
-    ":context_writer_impl",
-    "//garnet/public/lib/fidl/cpp",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("scope_utils") {
-  sources = [
-    "scope_utils.cc",
-    "scope_utils.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//third_party/boringssl",  # for sha256
-  ]
-}
diff --git a/bin/context_engine/context_engine_impl.cc b/bin/context_engine/context_engine_impl.cc
deleted file mode 100644
index 21a6b5b..0000000
--- a/bin/context_engine/context_engine_impl.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/context_engine/context_engine_impl.h"
-
-#include <lib/component/cpp/startup_context.h>
-
-#include "peridot/bin/context_engine/context_reader_impl.h"
-#include "peridot/bin/context_engine/context_repository.h"
-#include "peridot/bin/context_engine/context_writer_impl.h"
-
-namespace modular {
-
-ContextEngineImpl::ContextEngineImpl(
-    fuchsia::modular::EntityResolver* const entity_resolver)
-    : entity_resolver_(entity_resolver) {}
-ContextEngineImpl::~ContextEngineImpl() = default;
-
-fxl::WeakPtr<ContextDebugImpl> ContextEngineImpl::debug() {
-  return repository_.debug()->GetWeakPtr();
-}
-
-void ContextEngineImpl::AddBinding(
-    fidl::InterfaceRequest<fuchsia::modular::ContextEngine> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void ContextEngineImpl::GetWriter(
-    fuchsia::modular::ComponentScope client_info,
-    fidl::InterfaceRequest<fuchsia::modular::ContextWriter> request) {
-  writers_.emplace_back(std::make_unique<ContextWriterImpl>(
-      std::move(client_info), &repository_, entity_resolver_,
-      std::move(request)));
-}
-
-void ContextEngineImpl::GetReader(
-    fuchsia::modular::ComponentScope client_info,
-    fidl::InterfaceRequest<fuchsia::modular::ContextReader> request) {
-  readers_.emplace_back(std::make_unique<ContextReaderImpl>(
-      std::move(client_info), &repository_, std::move(request)));
-}
-
-void ContextEngineImpl::GetContextDebug(
-    fidl::InterfaceRequest<fuchsia::modular::ContextDebug> request) {
-  repository_.AddDebugBinding(std::move(request));
-}
-
-}  // namespace modular
diff --git a/bin/context_engine/context_engine_impl.h b/bin/context_engine/context_engine_impl.h
deleted file mode 100644
index f07d99a..0000000
--- a/bin/context_engine/context_engine_impl.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_ENGINE_IMPL_H_
-#define PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_ENGINE_IMPL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-
-#include "peridot/bin/context_engine/context_repository.h"
-#include "peridot/bin/context_engine/debug.h"
-
-namespace modular {
-
-class EntityResolver;
-
-class ContextReaderImpl;
-class ContextWriterImpl;
-
-class ContextEngineImpl : fuchsia::modular::ContextEngine {
- public:
-  // Does not take ownership of |entity_resolver|.
-  ContextEngineImpl(fuchsia::modular::EntityResolver* entity_resolver);
-  ~ContextEngineImpl() override;
-
-  void AddBinding(
-      fidl::InterfaceRequest<fuchsia::modular::ContextEngine> request);
-
-  fxl::WeakPtr<ContextDebugImpl> debug();
-
- private:
-  // |fuchsia::modular::ContextEngine|
-  void GetWriter(
-      fuchsia::modular::ComponentScope client_info,
-      fidl::InterfaceRequest<fuchsia::modular::ContextWriter> request) override;
-
-  // |fuchsia::modular::ContextEngine|
-  void GetReader(
-      fuchsia::modular::ComponentScope client_info,
-      fidl::InterfaceRequest<fuchsia::modular::ContextReader> request) override;
-
-  // |fuchsia::modular::ContextEngine|
-  void GetContextDebug(
-      fidl::InterfaceRequest<fuchsia::modular::ContextDebug> request) override;
-
-  fuchsia::modular::EntityResolver* const entity_resolver_;
-
-  ContextRepository repository_;
-
-  fidl::BindingSet<fuchsia::modular::ContextEngine> bindings_;
-
-  std::vector<std::unique_ptr<ContextReaderImpl>> readers_;
-  std::vector<std::unique_ptr<ContextWriterImpl>> writers_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ContextEngineImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_ENGINE_IMPL_H_
diff --git a/bin/context_engine/context_engine_main.cc b/bin/context_engine/context_engine_main.cc
deleted file mode 100644
index 279aaef..0000000
--- a/bin/context_engine/context_engine_main.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding_set.h>
-
-#include "peridot/bin/context_engine/context_engine_impl.h"
-
-namespace modular {
-
-class ContextEngineApp {
- public:
-  ContextEngineApp(component::StartupContext* const context) {
-    auto component_context =
-        context
-            ->ConnectToEnvironmentService<fuchsia::modular::ComponentContext>();
-    component_context->GetEntityResolver(entity_resolver_.NewRequest());
-    context_engine_impl_ =
-        std::make_unique<ContextEngineImpl>(entity_resolver_.get());
-
-    context->outgoing().AddPublicService<fuchsia::modular::ContextEngine>(
-        [this](
-            fidl::InterfaceRequest<fuchsia::modular::ContextEngine> request) {
-          context_engine_impl_->AddBinding(std::move(request));
-        });
-  }
-
-  void Terminate(std::function<void()> done) { done(); }
-
-  fxl::WeakPtr<ContextDebugImpl> debug() {
-    return context_engine_impl_->debug();
-  }
-
- private:
-  fuchsia::modular::EntityResolverPtr entity_resolver_;
-  std::unique_ptr<ContextEngineImpl> context_engine_impl_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ContextEngineApp);
-};
-
-}  // namespace modular
-
-int main(int argc, const char** argv) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  auto context_engine_app =
-      std::make_unique<modular::ContextEngineApp>(context.get());
-  fxl::WeakPtr<modular::ContextDebugImpl> debug = context_engine_app->debug();
-  debug->GetIdleWaiter()->SetLoop(&loop);
-
-  modular::AppDriver<modular::ContextEngineApp> driver(
-      context->outgoing().deprecated_services(), std::move(context_engine_app),
-      [&loop] { loop.Quit(); });
-
-  // The |WaitUntilIdle| debug functionality escapes the main message loop to
-  // perform its test.
-  do {
-    loop.Run();
-    loop.ResetQuit();
-  } while (debug && debug->GetIdleWaiter()->FinishIdleCheck());
-
-  return 0;
-}
diff --git a/bin/context_engine/context_reader_impl.cc b/bin/context_engine/context_reader_impl.cc
deleted file mode 100644
index 6056fe1..0000000
--- a/bin/context_engine/context_reader_impl.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/context_engine/context_reader_impl.h"
-
-#include <lib/fidl/cpp/clone.h>
-
-#include "peridot/bin/context_engine/context_repository.h"
-
-namespace modular {
-
-ContextReaderImpl::ContextReaderImpl(
-    fuchsia::modular::ComponentScope client_info, ContextRepository* repository,
-    fidl::InterfaceRequest<fuchsia::modular::ContextReader> request)
-    : binding_(this, std::move(request)), repository_(repository) {
-  debug_.client_info = std::move(client_info);
-}
-
-ContextReaderImpl::~ContextReaderImpl() = default;
-
-void ContextReaderImpl::Subscribe(
-    fuchsia::modular::ContextQuery query,
-    fidl::InterfaceHandle<fuchsia::modular::ContextListener> listener) {
-  auto listener_ptr = listener.Bind();
-  fuchsia::modular::SubscriptionDebugInfo debug_info;
-  fidl::Clone(debug_, &debug_info);
-  repository_->AddSubscription(std::move(query), std::move(listener_ptr),
-                               std::move(debug_info));
-}
-
-void ContextReaderImpl::Get(fuchsia::modular::ContextQuery query,
-                            GetCallback callback) {
-  callback(repository_->Query(query));
-}
-
-}  // namespace modular
diff --git a/bin/context_engine/context_reader_impl.h b/bin/context_engine/context_reader_impl.h
deleted file mode 100644
index ba29626..0000000
--- a/bin/context_engine/context_reader_impl.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be //
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_READER_IMPL_H_
-#define PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_READER_IMPL_H_
-
-#include <list>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-
-#include "peridot/bin/context_engine/context_repository.h"
-
-namespace modular {
-
-class ContextReaderImpl : fuchsia::modular::ContextReader {
- public:
-  ContextReaderImpl(
-      fuchsia::modular::ComponentScope client_info,
-      ContextRepository* repository,
-      fidl::InterfaceRequest<fuchsia::modular::ContextReader> request);
-  ~ContextReaderImpl() override;
-
- private:
-  // |fuchsia::modular::ContextReader|
-  void Subscribe(fuchsia::modular::ContextQuery query,
-                 fidl::InterfaceHandle<fuchsia::modular::ContextListener>
-                     listener) override;
-
-  // |fuchsia::modular::ContextReader|
-  void Get(fuchsia::modular::ContextQuery query,
-           fuchsia::modular::ContextReader::GetCallback callback) override;
-
-  fidl::Binding<fuchsia::modular::ContextReader> binding_;
-
-  fuchsia::modular::SubscriptionDebugInfo debug_;
-  ContextRepository* const repository_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ContextReaderImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_READER_IMPL_H_
diff --git a/bin/context_engine/context_repository.cc b/bin/context_engine/context_repository.cc
deleted file mode 100644
index fb524f1..0000000
--- a/bin/context_engine/context_repository.cc
+++ /dev/null
@@ -1,400 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/context_engine/context_repository.h"
-
-#include <list>
-#include <memory>
-#include <set>
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fostr/fidl/fuchsia/modular/formatting.h>
-
-#include "peridot/bin/context_engine/debug.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "rapidjson/document.h"
-
-namespace modular {
-
-ContextGraph::ContextGraph() = default;
-
-ContextGraph::~ContextGraph() = default;
-
-void ContextGraph::AddEdge(const Id& from, const Id& to) {
-  parents_[to].insert(from);
-  children_[from].insert(to);
-}
-void ContextGraph::Remove(const Id& id) {
-  auto parents = GetParents(id);
-  for (const auto& parent : parents) {
-    children_[parent].erase(id);
-  }
-  for (const auto& child : children_[id]) {
-    parents_[child].erase(id);
-  }
-  // TODO(thatguy): Decide what to do about orphaned children.
-  children_.erase(id);
-  parents_.erase(id);
-}
-
-std::set<ContextGraph::Id> ContextGraph::GetParents(const Id& id) const {
-  auto it = parents_.find(id);
-  if (it == parents_.end())
-    return {};
-  return it->second;
-}
-
-std::set<ContextGraph::Id> ContextGraph::GetChildrenRecursive(
-    const Id& id) const {
-  std::set<Id> children;
-  std::list<Id> to_visit{id};
-
-  while (!to_visit.empty()) {
-    auto cur = to_visit.front();
-    to_visit.pop_front();
-
-    auto it = children_.find(cur);
-    if (it != children_.end()) {
-      children.insert(it->second.begin(), it->second.end());
-      to_visit.insert(to_visit.begin(), it->second.begin(), it->second.end());
-    }
-  }
-
-  return children;
-}
-
-std::vector<ContextGraph::Id> ContextGraph::GetAncestors(const Id& id) const {
-  std::vector<Id> ancestors;
-  std::set<Id> visited;
-  std::list<Id> to_visit;
-
-  auto it = parents_.find(id);
-  if (it == parents_.end())
-    return ancestors;
-  to_visit.insert(to_visit.begin(), it->second.begin(), it->second.end());
-  while (!to_visit.empty()) {
-    auto cur = to_visit.front();
-    to_visit.pop_front();
-    if (!visited.insert(cur).second)
-      continue;
-    ancestors.insert(ancestors.begin(), cur);
-    it = parents_.find(cur);
-    if (it != parents_.end()) {
-      to_visit.insert(to_visit.end(), it->second.begin(), it->second.end());
-    }
-  }
-  return ancestors;
-}
-
-namespace {
-
-ContextRepository::Id CreateValueId() {
-  // TODO(thatguy): Prefer to use a string UUID.
-  static uint32_t next_id = 0;
-  return std::to_string(next_id++);
-}
-
-ContextRepository::Id CreateSubscriptionId() {
-  static uint32_t next_id = 0;
-  return std::to_string(next_id++);
-}
-
-void LogInvalidAncestorMetadata(const fuchsia::modular::ContextMetadata& from,
-                                fuchsia::modular::ContextMetadata* to,
-                                const char* type) {
-  FXL_LOG(WARNING) << "Context value and ancestor both have metadata type ("
-                   << type
-                   << "), which is not allowed. Ignoring value metadata.";
-  FXL_LOG(WARNING) << "Value metadata: " << *to;
-  FXL_LOG(WARNING) << "Ancestor metadata: " << from;
-}
-
-void MergeMetadata(const fuchsia::modular::ContextMetadata& from,
-                   fuchsia::modular::ContextMetadata* to) {
-#define MERGE(type)                                \
-  if (from.type) {                                 \
-    if (to->type) {                                \
-      LogInvalidAncestorMetadata(from, to, #type); \
-    } else {                                       \
-      fidl::Clone(from.type, &(*to).type);         \
-    }                                              \
-  }
-  // Go through each type of metadata on |from|, and copy it to
-  // |*to|. However, if anything in |from| already exists in |*to|,
-  // that's an error, since a value's ancestors can only have one
-  // node of each type (story, module, entity, etc).
-  MERGE(story);
-  MERGE(mod);
-  MERGE(link);
-  MERGE(entity);
-#undef MERGE
-}
-
-}  // namespace
-
-ContextRepository::ContextRepository() : debug_(new ContextDebugImpl(this)) {}
-ContextRepository::~ContextRepository() = default;
-
-bool ContextRepository::Contains(const Id& id) const {
-  return values_.find(id) != values_.end();
-}
-
-ContextRepository::Id ContextRepository::Add(
-    const Id& parent_id, fuchsia::modular::ContextValue value) {
-  FXL_DCHECK(values_.find(parent_id) != values_.end()) << parent_id;
-  return AddInternal(parent_id, std::move(value));
-}
-
-ContextRepository::Id ContextRepository::Add(
-    fuchsia::modular::ContextValue value) {
-  return AddInternal("", std::move(value));
-}
-
-void ContextRepository::Update(const Id& id,
-                               fuchsia::modular::ContextValue value) {
-  // TODO(thatguy): Short-circuit if |value| isn't changing anything to avoid
-  // spurious update computation.
-
-  auto it = values_.find(id);
-  FXL_DCHECK(it != values_.end()) << id;
-  it->second.value = std::move(value);
-  it->second.version++;
-
-  InProgressUpdate update;
-  update.updated_values.push_back(&it->second);
-  // Updating a value can affect all of its children, so we need to re-process
-  // and reindex them.
-  auto children = graph_.GetChildrenRecursive(id);
-  for (const auto& child : children) {
-    auto child_it = values_.find(child);
-    FXL_DCHECK(child_it != values_.end()) << child;
-    update.updated_values.push_back(&child_it->second);
-  }
-  ReindexAndNotify(std::move(update));
-  debug_->OnValueChanged(graph_.GetParents(id), id, it->second.value);
-}
-
-ContextRepository::Id ContextRepository::AddInternal(
-    const Id& parent_id, fuchsia::modular::ContextValue value) {
-  const auto new_id = CreateValueId();
-
-  // Add the new value to |values_|.
-  ValueInternal value_internal;
-  value_internal.id = new_id;
-  value_internal.version = 0;
-
-  value_internal.value = std::move(value);
-  auto it = values_.emplace(new_id, std::move(value_internal));
-
-  if (!parent_id.empty()) {
-    // Update the graph.
-    graph_.AddEdge(parent_id, new_id);
-  }
-
-  InProgressUpdate update;
-  update.updated_values.push_back(&it.first->second);
-  ReindexAndNotify(std::move(update));
-
-  if (parent_id.empty()) {
-    debug_->OnValueChanged({}, new_id, it.first->second.value);
-  } else {
-    debug_->OnValueChanged({parent_id}, new_id, it.first->second.value);
-  }
-  return new_id;
-}
-
-void ContextRepository::Remove(const Id& id) {
-  auto it = values_.find(id);
-  if (it == values_.end()) {
-    FXL_LOG(WARNING) << "Attempting to remove non-existent value: " << id;
-    return;
-  }
-  InProgressUpdate update;
-  update.removed_values.push_back(std::move(it->second));
-  // Removing a value can affect all of its children, so we need to re-process
-  // and reindex them.
-  auto children = graph_.GetChildrenRecursive(id);
-  for (const auto& child : children) {
-    auto child_it = values_.find(child);
-    FXL_DCHECK(child_it != values_.end()) << child;
-    update.updated_values.push_back(&child_it->second);
-  }
-  values_.erase(it);
-  graph_.Remove(id);
-
-  debug_->OnValueRemoved(id);
-  ReindexAndNotify(std::move(update));
-}
-
-fuchsia::modular::ContextValuePtr ContextRepository::Get(const Id& id) const {
-  auto it = values_.find(id);
-  if (it == values_.end())
-    return fuchsia::modular::ContextValuePtr();
-
-  fuchsia::modular::ContextValue value;
-  fidl::Clone(it->second.value, &value);
-  return fidl::MakeOptional(std::move(value));
-}
-
-fuchsia::modular::ContextValuePtr ContextRepository::GetMerged(
-    const Id& id) const {
-  auto it = values_.find(id);
-  if (it == values_.end())
-    return fuchsia::modular::ContextValuePtr();
-
-  fuchsia::modular::ContextValue merged_value;
-  fidl::Clone(it->second.value, &merged_value);
-  // Copy the merged metadata (includes ancestor metadata).
-  fidl::Clone(it->second.merged_metadata, &merged_value.meta);
-  return fidl::MakeOptional(std::move(merged_value));
-}
-
-fuchsia::modular::ContextUpdate ContextRepository::Query(
-    const fuchsia::modular::ContextQuery& query) {
-  return QueryInternal(query).first;
-}
-
-ContextRepository::Id ContextRepository::AddSubscription(
-    fuchsia::modular::ContextQuery query,
-    fuchsia::modular::ContextListener* const listener,
-    fuchsia::modular::SubscriptionDebugInfo debug_info) {
-  // Add the subscription to our list.
-  Subscription subscription;
-  subscription.query = std::move(query);
-  subscription.listener = listener;
-  subscription.debug_info = std::move(debug_info);
-  const auto id = CreateSubscriptionId();
-  auto it = subscriptions_.emplace(id, std::move(subscription));
-  FXL_DCHECK(it.second);
-
-  // Notify the listener immediately of our current state.
-  QueryAndMaybeNotify(&it.first->second, true /* force */);
-
-  // TODO(thatguy): Add a client identifier parameter to AddSubscription().
-  debug_->OnSubscriptionAdded(id, it.first->second.query,
-                              it.first->second.debug_info);
-  return id;
-}
-
-void ContextRepository::AddSubscription(
-    fuchsia::modular::ContextQuery query,
-    fuchsia::modular::ContextListenerPtr listener,
-    fuchsia::modular::SubscriptionDebugInfo debug_info) {
-  auto id =
-      AddSubscription(std::move(query), listener.get(), std::move(debug_info));
-  listener.set_error_handler(
-      [this, id](zx_status_t status) { RemoveSubscription(id); });
-  // RemoveSubscription() above is responsible for freeing this memory.
-  subscriptions_[id].listener_storage = std::move(listener);
-}
-
-ContextDebugImpl* ContextRepository::debug() { return debug_.get(); }
-
-void ContextRepository::AddDebugBinding(
-    fidl::InterfaceRequest<fuchsia::modular::ContextDebug> request) {
-  debug_bindings_.AddBinding(debug_.get(), std::move(request));
-}
-
-void ContextRepository::RemoveSubscription(Id id) {
-  auto it = subscriptions_.find(id);
-  FXL_DCHECK(it != subscriptions_.end());
-  subscriptions_.erase(it);
-
-  debug_->OnSubscriptionRemoved(id);
-}
-
-std::pair<fuchsia::modular::ContextUpdate, ContextRepository::IdAndVersionSet>
-ContextRepository::QueryInternal(const fuchsia::modular::ContextQuery& query) {
-  // For each entry in |query->selector|, query the index for matching values.
-  IdAndVersionSet matching_id_version;
-  fuchsia::modular::ContextUpdate update;
-  for (const auto& entry : query.selector) {
-    const auto& key = entry.key;
-    const auto& selector = entry.value;
-
-    std::set<ContextIndex::Id> values = Select(selector);
-
-    fuchsia::modular::ContextUpdateEntry update_entry;
-    update_entry.key = key;
-    update.values.push_back(std::move(update_entry));
-    for (const auto& id : values) {
-      auto it = values_.find(id);
-      FXL_DCHECK(it != values_.end()) << id;
-      matching_id_version.insert(std::make_pair(id, it->second.version));
-      for (auto& it : update.values) {
-        if (it.key == key) {
-          it.value.push_back(std::move(*GetMerged(id)));
-        }
-      }
-    }
-  }
-  return std::make_pair(std::move(update), std::move(matching_id_version));
-}
-
-void ContextRepository::QueryAndMaybeNotify(Subscription* const subscription,
-                                            bool force) {
-  std::pair<fuchsia::modular::ContextUpdate, IdAndVersionSet> result =
-      QueryInternal(subscription->query);
-  if (!force) {
-    // Check if this update contains any new values.
-    IdAndVersionSet diff;
-    std::set_symmetric_difference(result.second.begin(), result.second.end(),
-                                  subscription->last_update.begin(),
-                                  subscription->last_update.end(),
-                                  std::inserter(diff, diff.begin()));
-    if (diff.empty()) {
-      return;
-    }
-  }
-  subscription->last_update = result.second;
-
-  subscription->listener->OnContextUpdate(std::move(result.first));
-}
-
-void ContextRepository::ReindexAndNotify(
-    ContextRepository::InProgressUpdate update) {
-  for (auto& value : update.removed_values) {
-    index_.Remove(value.id, value.value.type, value.merged_metadata);
-  }
-  for (auto* value : update.updated_values) {
-    // Step 1: reindex the value.
-
-    // Before we add the newest metadata values to the index, we need to remove
-    // the old values from the index. |value.merged_metadata| contains whatever
-    // we added to the index last time.
-    index_.Remove(value->id, value->value.type, value->merged_metadata);
-    RecomputeMergedMetadata(value);
-    index_.Add(value->id, value->value.type, value->merged_metadata);
-  }
-
-  // Step 2: recompute the output for each subscription and notify its
-  // listeners.
-  for (auto& it : subscriptions_) {
-    QueryAndMaybeNotify(&it.second, false /* force */);
-  }
-}
-
-void ContextRepository::RecomputeMergedMetadata(ValueInternal* const value) {
-  value->merged_metadata = fuchsia::modular::ContextMetadata();
-  // It doesn't matter what order we merge the ancestor values, because there
-  // should always only be one of each type, and thus no collisions.
-  std::vector<Id> ancestors = graph_.GetAncestors(value->id);
-  for (const auto& ancestor_id : ancestors) {
-    const auto& it = values_.find(ancestor_id);
-    FXL_DCHECK(it != values_.end());
-    const auto& ancestor_value = it->second;
-    MergeMetadata(ancestor_value.value.meta, &value->merged_metadata);
-  }
-  MergeMetadata(value->value.meta, &value->merged_metadata);
-}
-
-std::set<ContextRepository::Id> ContextRepository::Select(
-    const fuchsia::modular::ContextSelector& selector) {
-  std::set<ContextIndex::Id> values;
-  index_.Query(selector.type, selector.meta, &values);
-  return values;
-}
-
-}  // namespace modular
diff --git a/bin/context_engine/context_repository.h b/bin/context_engine/context_repository.h
deleted file mode 100644
index 74aaacf..0000000
--- a/bin/context_engine/context_repository.h
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_REPOSITORY_H_
-#define PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_REPOSITORY_H_
-
-#include <map>
-#include <set>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/context_engine/index.h"
-
-namespace modular {
-
-class ContextDebug;
-class ContextDebugImpl;
-
-// This class represents a "multiparent hierarchy", which is another way
-// of saying a directed graph that cannot have any cycles.
-// TODO(thatguy): Actually enforce the no cycles constraint :).
-class ContextGraph {
- public:
-  using Id = std::string;
-
-  ContextGraph();
-  virtual ~ContextGraph();
-
-  // Adds a graph edge from |from| to |to|.
-  void AddEdge(const Id& from, const Id& to);
-
-  // Removes the node |id| and removes any incoming or outgoing edges.
-  // TODO(thatguy): Decide what to do about orphaned children.
-  void Remove(const Id& id);
-
-  std::set<Id> GetParents(const Id& id) const;
-
-  // Returns all |id|'s children and their children, recursively.
-  std::set<Id> GetChildrenRecursive(const Id& id) const;
-
-  // Returns all ancestors for |id|, guaranteeing that all node ids appear in
-  // the return value before their children (ie, in order of seniority).
-  std::vector<Id> GetAncestors(const Id& id) const;
-
- private:
-  // From node to its parents.
-  std::map<Id, std::set<Id>> parents_;
-  // From parent to its immediate children.
-  std::map<Id, std::set<Id>> children_;
-};
-
-// Stores a graph of fuchsia::modular::ContextValue structs (values). Supports
-// fetching lists of values based on a) the value's type and b)
-// fuchsia::modular::ContextMetadata fields.
-//
-// The graph structure is used to represent value namespaces or scope, although
-// the exact meaning or what concepts are represented is up to the client. When
-// a value is queried against and returned, its metadata is "flattened" with
-// its ancestors' metadata. For example, if an ENTITY value is a child of a
-// MODULE value, the ENTITY value will inherit the MODULE value's metadata (ie,
-// the |mod| field of the fuchsia::modular::ContextMetadata struct).
-class ContextRepository {
-  struct ValueInternal;
-  struct Subscription;
-  struct InProgressUpdate;
-
- public:
-  using Id = ContextIndex::Id;
-  using IdAndVersionSet = std::set<std::pair<Id, uint32_t>>;
-
-  ContextRepository();
-  ~ContextRepository();
-
-  bool Contains(const Id& id) const;
-  Id Add(fuchsia::modular::ContextValue value);
-  Id Add(const Id& parent_id, fuchsia::modular::ContextValue value);
-  void Update(const Id& id, fuchsia::modular::ContextValue value);
-  void Remove(const Id& id);
-
-  // Returns a copy of the fuchsia::modular::ContextValue for |id|. Returns a
-  // null |fuchsia::modular::ContextValuePtr| if |id| is not valid.
-  fuchsia::modular::ContextValuePtr Get(const Id& id) const;
-
-  // Returns a copy of the fuchsia::modular::ContextValue for |id|, with
-  // metadata merged from ancestors. Returns a null
-  // |fuchsia::modular::ContextValuePtr| if |id| is not valid.
-  fuchsia::modular::ContextValuePtr GetMerged(const Id& id) const;
-
-  std::set<Id> Select(const fuchsia::modular::ContextSelector& selector);
-
-  // Returns the current requested values for the given query as a context
-  // update.
-  fuchsia::modular::ContextUpdate Query(
-      const fuchsia::modular::ContextQuery& query);
-
-  // Does not take ownership of |listener|. |listener| must remain valid until
-  // RemoveSubscription() is called with the returned Id.
-  Id AddSubscription(fuchsia::modular::ContextQuery query,
-                     fuchsia::modular::ContextListener* listener,
-                     fuchsia::modular::SubscriptionDebugInfo debug_info);
-  void RemoveSubscription(Id id);
-
-  // Like AddSubscription above, but takes ownership of the FIDL service proxy
-  // object, |listener|. The subscription is automatically removed when
-  // |listener| experiences a connection error.
-  void AddSubscription(fuchsia::modular::ContextQuery query,
-                       fuchsia::modular::ContextListenerPtr listener,
-                       fuchsia::modular::SubscriptionDebugInfo debug_info);
-
-  ContextDebugImpl* debug();
-  void AddDebugBinding(
-      fidl::InterfaceRequest<fuchsia::modular::ContextDebug> request);
-
- private:
-  Id AddInternal(const Id& parent_id, fuchsia::modular::ContextValue value);
-  void RecomputeMergedMetadata(ValueInternal* value);
-  void ReindexAndNotify(InProgressUpdate update);
-  void QueryAndMaybeNotify(Subscription* subscription, bool force);
-  std::pair<fuchsia::modular::ContextUpdate, IdAndVersionSet> QueryInternal(
-      const fuchsia::modular::ContextQuery& query);
-
-  // Keyed by internal id.
-  std::map<Id, ValueInternal> values_;
-  ContextGraph graph_;
-
-  // A map of Id (int) to Subscription.
-  std::map<Id, Subscription> subscriptions_;
-
-  ContextIndex index_;
-
-  friend class ContextDebugImpl;
-  std::unique_ptr<ContextDebugImpl> debug_;
-  fidl::BindingSet<fuchsia::modular::ContextDebug> debug_bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ContextRepository);
-};
-
-struct ContextRepository::ValueInternal {
-  // The contents of |value.meta| merged with metadata from all
-  // of this value's ancestors.
-  Id id;
-  fuchsia::modular::ContextMetadata merged_metadata;
-  fuchsia::modular::ContextValue value;
-  uint32_t version;  // Incremented on change.
-};
-
-struct ContextRepository::Subscription {
-  fuchsia::modular::ContextQuery query;
-  fuchsia::modular::ContextListener*
-      listener;  // Optionally owned by |listener_storage|.
-  fuchsia::modular::ContextListenerPtr listener_storage;
-  fuchsia::modular::SubscriptionDebugInfo debug_info;
-  // The set of value id and version we sent the last time we notified
-  // |listener|. Used to calculate if a new update is different.
-  IdAndVersionSet last_update;
-};
-
-// Holds interim values necessary for processing an update to at least one
-// context value.
-struct ContextRepository::InProgressUpdate {
-  // These values are having their values added or updated.
-  std::vector<ValueInternal*> updated_values;
-  // These values are being removed.
-  std::vector<ValueInternal> removed_values;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_REPOSITORY_H_
diff --git a/bin/context_engine/context_repository_unittest.cc b/bin/context_engine/context_repository_unittest.cc
deleted file mode 100644
index df3b463..0000000
--- a/bin/context_engine/context_repository_unittest.cc
+++ /dev/null
@@ -1,379 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/context_engine/context_repository.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/context/cpp/context_helper.h>
-#include <lib/context/cpp/context_metadata_builder.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/optional.h>
-
-#include "gtest/gtest.h"
-
-using maxwell::ContextMetadataBuilder;
-
-namespace modular {
-namespace {
-
-TEST(ContextGraph, GetChildrenRecursive_GetAncestors) {
-  ContextGraph graph;
-
-  graph.AddEdge("a", "b");
-  graph.AddEdge("b", "c");
-  graph.AddEdge("b", "d");
-
-  auto children = graph.GetChildrenRecursive("b");
-  EXPECT_EQ(2lu, children.size());
-  EXPECT_TRUE(children.find("c") != children.end());
-  EXPECT_TRUE(children.find("d") != children.end());
-
-  children = graph.GetChildrenRecursive("a");
-  EXPECT_EQ(3lu, children.size());
-  EXPECT_TRUE(children.find("b") != children.end());
-  EXPECT_TRUE(children.find("c") != children.end());
-  EXPECT_TRUE(children.find("d") != children.end());
-
-  auto ancestors = graph.GetAncestors("c");
-  EXPECT_EQ(2lu, ancestors.size());
-  EXPECT_EQ("a", ancestors[0]);
-  EXPECT_EQ("b", ancestors[1]);
-}
-
-class ContextRepositoryTest : public ::testing::Test {
- public:
-  ContextRepositoryTest() {}
-
- protected:
-  ContextRepository repository_;
-};
-
-class TestListener : public fuchsia::modular::ContextListener {
- public:
-  fuchsia::modular::ContextUpdatePtr last_update;
-
-  void OnContextUpdate(fuchsia::modular::ContextUpdate update) override {
-    last_update = fidl::MakeOptional(std::move(update));
-  }
-
-  void reset() { last_update.reset(); }
-};
-
-fuchsia::modular::ContextValue CreateValue(
-    fuchsia::modular::ContextValueType type, const std::string& content) {
-  fuchsia::modular::ContextValue value;
-  value.type = type;
-  value.content = content;
-  return value;
-}
-
-fuchsia::modular::ContextValue CreateValue(
-    fuchsia::modular::ContextValueType type, const std::string& content,
-    fuchsia::modular::ContextMetadata meta) {
-  fuchsia::modular::ContextValue value;
-  value.type = type;
-  value.content = content;
-  value.meta = std::move(meta);
-  return value;
-}
-
-}  // namespace
-
-TEST_F(ContextRepositoryTest, GetAddUpdateRemove) {
-  // This test ensures that we can do basic, synchronous add/update/remove/get
-  // operations.
-
-  // Show that when we set values, we can get them back.
-  auto id1 = repository_.Add(
-      CreateValue(fuchsia::modular::ContextValueType::ENTITY, "content"));
-  auto value1 = repository_.Get(id1);
-  ASSERT_TRUE(value1);
-  EXPECT_EQ(fuchsia::modular::ContextValueType::ENTITY, value1->type);
-  EXPECT_EQ("content", value1->content);
-
-  // Setting another value doesn't affect the original value.
-  auto id2 = repository_.Add(
-      CreateValue(fuchsia::modular::ContextValueType::ENTITY, "content2"));
-  auto value2 = repository_.Get(id2);
-  ASSERT_TRUE(value2);
-  EXPECT_EQ("content2", value2->content);
-  value1 = repository_.Get(id1);
-  ASSERT_TRUE(value1);
-  EXPECT_EQ(fuchsia::modular::ContextValueType::ENTITY, value1->type);
-  EXPECT_EQ("content", value1->content);
-
-  // Let's create metadata.
-  auto id3 = repository_.Add(
-      CreateValue(fuchsia::modular::ContextValueType::ENTITY, "content3",
-                  ContextMetadataBuilder().SetStoryId("id3story").Build()));
-  auto value3 = repository_.Get(id3);
-  ASSERT_TRUE(value3);
-  EXPECT_EQ("content3", value3->content);
-  ASSERT_TRUE(value3->meta.story);
-  EXPECT_EQ("id3story", value3->meta.story->id);
-
-  // Update one of the previous values.
-  repository_.Update(
-      id2,
-      CreateValue(fuchsia::modular::ContextValueType::ENTITY, "new content2",
-                  ContextMetadataBuilder().SetStoryId("id2story").Build()));
-  value2 = repository_.Get(id2);
-  ASSERT_TRUE(value2);
-  ASSERT_TRUE(value2->meta.story);
-  EXPECT_EQ("id2story", value2->meta.story->id);
-  EXPECT_EQ("new content2", value2->content);
-
-  // Now remove id3.
-  repository_.Remove(id3);
-  EXPECT_FALSE(repository_.Get(id3));
-  EXPECT_TRUE(repository_.Get(id1));
-  EXPECT_TRUE(repository_.Get(id2));
-
-  // And the others.
-  repository_.Remove(id1);
-  repository_.Remove(id2);
-  EXPECT_FALSE(repository_.Get(id1));
-  EXPECT_FALSE(repository_.Get(id2));
-}
-
-TEST_F(ContextRepositoryTest, ValuesInheritMetadata) {
-  // When a value is added as a child of another value, the child inherits the
-  // metadata of its parent.
-  auto meta1 = ContextMetadataBuilder().SetStoryId("id").Build();
-  auto id1 = repository_.Add(CreateValue(
-      fuchsia::modular::ContextValueType::STORY, "s", std::move(meta1)));
-
-  auto meta2 = ContextMetadataBuilder().SetModuleUrl("url").Build();
-  auto id2 = repository_.Add(
-      id1, CreateValue(fuchsia::modular::ContextValueType::MODULE, "m",
-                       std::move(meta2)));
-
-  auto value1 = repository_.GetMerged(id1);
-  ASSERT_TRUE(value1);
-  // value1's metadata shouldn't have changed.
-  ASSERT_TRUE(value1->meta.story);
-  EXPECT_EQ("id", value1->meta.story->id);
-  ASSERT_FALSE(value1->meta.mod);
-
-  auto value2 = repository_.GetMerged(id2);
-  ASSERT_TRUE(value2);
-  // value2's metadata should combine both value1's and value2's.
-  ASSERT_TRUE(value2->meta.story);
-  EXPECT_EQ("id", value2->meta.story->id);
-  ASSERT_TRUE(value2->meta.mod);
-  ASSERT_TRUE(value2->meta.mod->url);
-  EXPECT_EQ("url", value2->meta.mod->url);
-
-  // Changing the parent's metadata value should update the child's also.
-  meta1 = fuchsia::modular::ContextMetadata();
-  meta1.story = fuchsia::modular::StoryMetadata::New();
-  meta1.story->id = "newid";
-  repository_.Update(id1, CreateValue(fuchsia::modular::ContextValueType::STORY,
-                                      "s", std::move(meta1)));
-  value2 = repository_.GetMerged(id2);
-  ASSERT_TRUE(value2);
-  ASSERT_TRUE(value2->meta.story);
-  EXPECT_EQ("newid", value2->meta.story->id);
-  ASSERT_TRUE(value2->meta.mod);
-  ASSERT_TRUE(value2->meta.mod->url);
-  EXPECT_EQ("url", value2->meta.mod->url);
-
-  // If a parent contains metadata that the child also contains (they both have
-  // 'mod' metadata), the parent's takes precendence.
-  meta1 =
-      ContextMetadataBuilder(std::move(meta1)).SetModuleUrl("override").Build();
-  repository_.Update(id1, CreateValue(fuchsia::modular::ContextValueType::STORY,
-                                      "s", std::move(meta1)));
-  value2 = repository_.GetMerged(id2);
-  ASSERT_TRUE(value2);
-  ASSERT_FALSE(value2->meta.story);
-  ASSERT_TRUE(value2->meta.mod);
-  ASSERT_EQ("override", value2->meta.mod->url);
-}
-
-TEST_F(ContextRepositoryTest, ListenersGetUpdates) {
-  // We want to test these subscription behaviors.
-  // 1) A value is added but doesn't match our subscription.
-  //    a) It's the wrong type (ie, STORY vs ENTITY)
-  //    b) Its metadata doesn't match.
-  // 2) A value is added that matches our existing subscription.
-  // 3) A value is updated that newly matches our subscription.
-  // 4) When a value is removed, it is no longer returned.
-
-  // (1)
-  fuchsia::modular::ContextQuery query;
-  fuchsia::modular::ContextSelector selector;
-  selector.type = fuchsia::modular::ContextValueType::ENTITY;
-  selector.meta = ContextMetadataBuilder().SetEntityTopic("topic").BuildPtr();
-  AddToContextQuery(&query, "a", std::move(selector));
-
-  TestListener listener;
-  repository_.AddSubscription(std::move(query), &listener,
-                              fuchsia::modular::SubscriptionDebugInfo());
-  auto maybe_result = TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_result.has_value());
-  EXPECT_TRUE(maybe_result.value().empty());
-  listener.reset();
-
-  // (a)
-  fuchsia::modular::ContextValue value;
-  value.type = fuchsia::modular::ContextValueType::STORY;
-  value.content = "no match";
-  value.meta = ContextMetadataBuilder().SetEntityTopic("topic").Build();
-  repository_.Add(std::move(value));
-  // No new update because nothing changed for our subscription.
-  EXPECT_FALSE(listener.last_update);
-  listener.reset();
-
-  // (b)
-  value = fuchsia::modular::ContextValue();
-  value.type = fuchsia::modular::ContextValueType::ENTITY;
-  value.content = "no match yet";
-  value.meta = ContextMetadataBuilder().SetEntityTopic("not the topic").Build();
-  auto id = repository_.Add(std::move(value));  // Save id for later.
-  // No new update because nothing changed for our subscription.
-  EXPECT_FALSE(listener.last_update);
-  listener.reset();
-
-  // (2)
-  value = fuchsia::modular::ContextValue();
-  value.type = fuchsia::modular::ContextValueType::ENTITY;
-  value.content = "match";
-  value.meta = ContextMetadataBuilder().SetEntityTopic("topic").Build();
-  repository_.Add(std::move(value));
-  maybe_result = TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_result.has_value());
-  {
-    auto& result = maybe_result.value();
-    EXPECT_EQ(1lu, result.size());
-    EXPECT_EQ("match", result.at(0).content);
-  }
-  listener.reset();
-
-  // (3)
-  value = fuchsia::modular::ContextValue();
-  value.type = fuchsia::modular::ContextValueType::ENTITY;
-  value.content = "now it matches";
-  // Add more metadata than the query is looking for. It shouldn't affect
-  // the query, because it doesn't express any constraint on 'type'.
-  value.meta = ContextMetadataBuilder()
-                   .SetEntityTopic("topic")
-                   .AddEntityType("type1")
-                   .AddEntityType("type2")
-                   .Build();
-  repository_.Update(id, std::move(value));
-  ASSERT_TRUE(listener.last_update);
-  maybe_result = TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_result.has_value());
-  {
-    auto& result = maybe_result.value();
-    EXPECT_EQ(2lu, result.size());
-    EXPECT_EQ("now it matches", result.at(0).content);
-    EXPECT_EQ("match", result.at(1).content);
-  }
-  listener.reset();
-
-  // (4)
-  repository_.Remove(id);
-  ASSERT_TRUE(listener.last_update);
-  maybe_result = TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_result.has_value());
-  {
-    auto& result = maybe_result.value();
-    EXPECT_EQ(1lu, result.size());
-    EXPECT_EQ("match", result.at(0).content);
-  }
-  listener.reset();
-}
-
-TEST_F(ContextRepositoryTest, ListenersGetUpdates_WhenParentsUpdated) {
-  // We should see updates to listeners when an update to a node's
-  // parent causes that node to be matched by a query.
-  fuchsia::modular::ContextQuery query;
-  fuchsia::modular::ContextSelector selector;
-  selector.type = fuchsia::modular::ContextValueType::ENTITY;
-  selector.meta = ContextMetadataBuilder().SetStoryId("match").BuildPtr();
-  AddToContextQuery(&query, "a", std::move(selector));
-
-  TestListener listener;
-  repository_.AddSubscription(std::move(query), &listener,
-                              fuchsia::modular::SubscriptionDebugInfo());
-  ASSERT_TRUE(listener.last_update);
-  auto maybe_result = TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_result.has_value());
-  {
-    auto& result = maybe_result.value();
-    EXPECT_EQ(0lu, result.size());
-    listener.reset();
-  }
-
-  // Add a Story value.
-  fuchsia::modular::ContextValue story_value;
-  story_value.type = fuchsia::modular::ContextValueType::STORY;
-  story_value.meta = ContextMetadataBuilder().SetStoryId("no match").Build();
-  fuchsia::modular::ContextValue first_story_value;
-  fidl::Clone(story_value, &first_story_value);  // Save for later.
-  auto story_value_id = repository_.Add(std::move(story_value));
-
-  // Expect no update.
-  EXPECT_FALSE(listener.last_update);
-
-  // Add an fuchsia::modular::Entity node, but it still shouldn't match.
-  fuchsia::modular::ContextValue entity_value;
-  entity_value.type = fuchsia::modular::ContextValueType::ENTITY;
-  entity_value.content = "content";
-  repository_.Add(story_value_id, std::move(entity_value));
-
-  // Still expect no update.
-  EXPECT_FALSE(listener.last_update);
-
-  // Update the story value so its metadata matches the query, and we should
-  // see the entity value returned in our update.
-  story_value = fuchsia::modular::ContextValue();
-  story_value.type = fuchsia::modular::ContextValueType::STORY;
-  story_value.meta = ContextMetadataBuilder().SetStoryId("match").Build();
-  fuchsia::modular::ContextValue matching_story_value;
-  fidl::Clone(story_value, &matching_story_value);  // Save for later.
-  repository_.Update(story_value_id, std::move(story_value));
-
-  ASSERT_TRUE(listener.last_update);
-  maybe_result = TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_result.has_value());
-  {
-    auto& result = maybe_result.value();
-    EXPECT_EQ(1lu, result.size());
-    EXPECT_EQ("content", result.at(0).content);
-    // Make sure we adopted the parent metadata from the story node.
-    ASSERT_TRUE(result.at(0).meta.story);
-    EXPECT_EQ("match", result.at(0).meta.story->id);
-  }
-  listener.reset();
-
-  // Set the value back to something that doesn't match, and we should get an
-  // empty update.
-  repository_.Update(story_value_id, std::move(first_story_value));
-  ASSERT_TRUE(listener.last_update);
-  maybe_result = TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_result.has_value());
-  EXPECT_EQ(0lu, maybe_result.value().size());
-  listener.reset();
-
-  // Set it back to something that matched, and this time remove the value
-  // entirely. We should observe it go away.
-  repository_.Update(story_value_id, std::move(matching_story_value));
-  ASSERT_TRUE(listener.last_update);
-  maybe_result = TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_result.has_value());
-  EXPECT_EQ(1lu, maybe_result.value().size());
-  listener.reset();
-
-  repository_.Remove(story_value_id);
-  ASSERT_TRUE(listener.last_update);
-  maybe_result = TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_result.has_value());
-  EXPECT_TRUE(maybe_result.value().empty());
-  listener.reset();
-}
-
-}  // namespace modular
diff --git a/bin/context_engine/context_writer_impl.cc b/bin/context_engine/context_writer_impl.cc
deleted file mode 100644
index e8d3044..0000000
--- a/bin/context_engine/context_writer_impl.cc
+++ /dev/null
@@ -1,311 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/context_engine/context_writer_impl.h"
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/entity/cpp/json.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fit/defer.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-#include "peridot/bin/context_engine/debug.h"
-#include "rapidjson/document.h"
-
-namespace modular {
-
-ContextWriterImpl::ContextWriterImpl(
-    const fuchsia::modular::ComponentScope& client_info,
-    ContextRepository* const repository,
-    fuchsia::modular::EntityResolver* const entity_resolver,
-    fidl::InterfaceRequest<fuchsia::modular::ContextWriter> request)
-    : binding_(this, std::move(request)),
-      repository_(repository),
-      entity_resolver_(entity_resolver),
-      weak_factory_(this) {
-  FXL_DCHECK(repository != nullptr);
-
-  // Set up a query to the repository to get our parent id.
-  if (client_info.is_module_scope()) {
-    parent_value_selector_.type = fuchsia::modular::ContextValueType::MODULE;
-    parent_value_selector_.meta = fuchsia::modular::ContextMetadata::New();
-    parent_value_selector_.meta->story = fuchsia::modular::StoryMetadata::New();
-    parent_value_selector_.meta->story->id =
-        client_info.module_scope().story_id;
-    parent_value_selector_.meta->mod = fuchsia::modular::ModuleMetadata::New();
-    std::vector<std::string> module_path;
-    fidl::Clone(client_info.module_scope().module_path, &module_path);
-    parent_value_selector_.meta->mod->path = fidl::VectorPtr(std::move(module_path));
-  }
-}
-
-ContextWriterImpl::~ContextWriterImpl() {}
-
-namespace {
-
-fidl::VectorPtr<std::string> Deprecated_GetTypesFromJsonEntity(
-    const fidl::StringPtr& content) {
-  // If the content has the @type attribute, take its contents and populate the
-  // fuchsia::modular::EntityMetadata appropriately, overriding whatever is
-  // there.
-  std::vector<std::string> types;
-  if (!ExtractEntityTypesFromJson(content, &types)) {
-    FXL_LOG(WARNING) << "Invalid entity metadata in JSON value: " << content;
-    return {};
-  }
-
-  return fidl::VectorPtr(types);
-}
-
-void MaybeFillEntityTypeMetadata(const std::vector<std::string>& types,
-                                 fuchsia::modular::ContextValue& value) {
-  if (value.type != fuchsia::modular::ContextValueType::ENTITY)
-    return;
-
-  if (!value.meta.entity) {
-    value.meta.entity = fuchsia::modular::EntityMetadata::New();
-  }
-  value.meta.entity->type = fidl::VectorPtr(types);
-}
-
-bool MaybeFindParentValueId(ContextRepository* repository,
-                            const fuchsia::modular::ContextSelector& selector,
-                            ContextRepository::Id* out) {
-  // There is technically a race condition here, since on construction, we
-  // are given a fuchsia::modular::ComponentScope, which contains some metadata
-  // to find a value in the context engine. It is the responsibility of the
-  // story_info acquierer to actually create that value, so we query at
-  // CreateValue()-time because it makes it less likely to hit the race
-  // condition.
-  //
-  // This is only exercised when a Module publishes context explicitly,
-  // something that we plan to disallow once Links speak in Entities, as then
-  // Modules that wish to store context can simply write Entities into a new
-  // link.
-  auto ids = repository->Select(selector);
-  if (ids.size() == 1) {
-    *out = *ids.begin();
-    return true;
-  }
-  return false;
-}
-
-}  // namespace
-
-void ContextWriterImpl::CreateValue(
-    fidl::InterfaceRequest<fuchsia::modular::ContextValueWriter> request,
-    fuchsia::modular::ContextValueType type) {
-  ContextRepository::Id parent_id;
-  // We ignore the return value - if it returns false |parent_id| will stay
-  // default-initialized.
-  MaybeFindParentValueId(repository_, parent_value_selector_, &parent_id);
-  auto ptr =
-      new ContextValueWriterImpl(this, parent_id, type, std::move(request));
-  AddContextValueWriter(ptr);
-}
-
-void ContextWriterImpl::AddContextValueWriter(ContextValueWriterImpl* ptr) {
-  value_writer_storage_.emplace_back(ptr);
-}
-
-void ContextWriterImpl::DestroyContextValueWriter(ContextValueWriterImpl* ptr) {
-  auto it = std::remove_if(
-      value_writer_storage_.begin(), value_writer_storage_.end(),
-      [ptr](const std::unique_ptr<ContextValueWriterImpl>& u_ptr) {
-        return u_ptr.get() == ptr;
-      });
-  value_writer_storage_.erase(it, value_writer_storage_.end());
-}
-
-void ContextWriterImpl::WriteEntityTopic(std::string topic,
-                                         fidl::StringPtr value) {
-  auto activity =
-      repository_->debug()->GetIdleWaiter()->RegisterOngoingActivity();
-
-  if (!value) {
-    // Remove this value.
-    auto it = topic_value_ids_.find(topic);
-    if (it != topic_value_ids_.end()) {
-      repository_->Remove(it->second);
-    }
-    return;
-  }
-
-  GetEntityTypesFromEntityReference(
-      value, [this, activity, topic,
-              value](const std::vector<std::string>& types) {
-        fuchsia::modular::ContextValue context_value;
-        context_value.type = fuchsia::modular::ContextValueType::ENTITY;
-        context_value.content = value;
-        context_value.meta.entity = fuchsia::modular::EntityMetadata::New();
-        context_value.meta.entity->topic = topic;
-        context_value.meta.entity->type = fidl::VectorPtr(types);
-
-        auto it = topic_value_ids_.find(topic);
-        if (it == topic_value_ids_.end()) {
-          ContextRepository::Id parent_id;
-          ContextRepository::Id id;
-          if (MaybeFindParentValueId(repository_, parent_value_selector_,
-                                     &parent_id)) {
-            id = repository_->Add(parent_id, std::move(context_value));
-          } else {
-            id = repository_->Add(std::move(context_value));
-          }
-          topic_value_ids_[topic] = id;
-        } else {
-          repository_->Update(it->second, std::move(context_value));
-        }
-      });
-}
-
-void ContextWriterImpl::GetEntityTypesFromEntityReference(
-    const fidl::StringPtr& reference,
-    std::function<void(const std::vector<std::string>&)> done) {
-  auto activity =
-      repository_->debug()->GetIdleWaiter()->RegisterOngoingActivity();
-
-  // TODO(thatguy): This function could be re-used in multiple places. Move it
-  // somewhere other places can reach it.
-  std::unique_ptr<fuchsia::modular::EntityPtr> entity =
-      std::make_unique<fuchsia::modular::EntityPtr>();
-  entity_resolver_->ResolveEntity(reference, entity->NewRequest());
-
-  auto fallback = fit::defer([done, reference] {
-    // The contents of the fuchsia::modular::Entity value could be a deprecated
-    // JSON fuchsia::modular::Entity, not an fuchsia::modular::Entity reference.
-    done(Deprecated_GetTypesFromJsonEntity(reference));
-  });
-
-  (*entity)->GetTypes(fxl::MakeCopyable(
-      [this, activity, id = entities_.GetId(&entity), done = std::move(done),
-       fallback = std::move(fallback)](
-          const std::vector<std::string>& types) mutable {
-        done(types);
-        fallback.cancel();
-        entities_.erase(id);
-      }));
-
-  entities_.emplace(std::move(entity));
-}
-
-ContextValueWriterImpl::ContextValueWriterImpl(
-    ContextWriterImpl* writer, const ContextRepository::Id& parent_id,
-    fuchsia::modular::ContextValueType type,
-    fidl::InterfaceRequest<fuchsia::modular::ContextValueWriter> request)
-    : binding_(this, std::move(request)),
-      writer_(writer),
-      parent_id_(parent_id),
-      type_(type),
-      value_id_(Future<ContextRepository::Id>::Create(
-          "ContextValueWriterImpl.value_id_")),
-      weak_factory_(this) {
-  binding_.set_error_handler(
-      [this](zx_status_t status) { writer_->DestroyContextValueWriter(this); });
-
-  // When |value_id_| completes, we want to remember it so that we know what
-  // branch to execute in Set().
-  value_id_->WeakConstThen(
-      weak_factory_.GetWeakPtr(),
-      [this](const ContextRepository::Id& id) { have_value_id_ = true; });
-}
-
-ContextValueWriterImpl::~ContextValueWriterImpl() {
-  // It's possible we haven't actually created a value in |repository_| yet.
-  // Either we have, and |value_id_| is complete and this callback will be
-  // called synchronously, or we haven't and |value_id_| will go out of scope
-  // with *this goes out of scope.
-  value_id_->WeakConstThen(weak_factory_.GetWeakPtr(),
-                           [this](const ContextRepository::Id& id) {
-                             // Remove the value.
-                             writer_->repository()->Remove(id);
-                           });
-}
-
-void ContextValueWriterImpl::CreateChildValue(
-    fidl::InterfaceRequest<fuchsia::modular::ContextValueWriter> request,
-    fuchsia::modular::ContextValueType type) {
-  // We can't create a child value until this value has an ID.
-  value_id_->WeakConstThen(
-      weak_factory_.GetWeakPtr(),
-      fxl::MakeCopyable([this, request = std::move(request),
-                         type](const ContextRepository::Id& value_id) mutable {
-        auto ptr = new ContextValueWriterImpl(writer_, value_id, type,
-                                              std::move(request));
-        writer_->AddContextValueWriter(ptr);
-      }));
-}
-
-void ContextValueWriterImpl::Set(
-    fidl::StringPtr content, fuchsia::modular::ContextMetadataPtr metadata) {
-  auto activity = writer_->repository()
-                      ->debug()
-                      ->GetIdleWaiter()
-                      ->RegisterOngoingActivity();
-
-  auto done_getting_types =
-      [weak_this = weak_factory_.GetWeakPtr(), activity, content,
-       metadata = std::move(metadata)](
-          const std::vector<std::string>& entity_types) mutable {
-        if (!weak_this)
-          return;
-
-        if (!weak_this->have_value_id_) {
-          // We're creating this value for the first time.
-          fuchsia::modular::ContextValue value;
-          value.type = weak_this->type_;
-          value.content = content;
-          if (metadata) {
-            fidl::Clone(*metadata, &value.meta);
-          }
-          MaybeFillEntityTypeMetadata(entity_types, value);
-
-          if (weak_this->parent_id_.empty()) {
-            weak_this->value_id_->Complete(
-                weak_this->writer_->repository()->Add(std::move(value)));
-          } else {
-            weak_this->value_id_->Complete(
-                weak_this->writer_->repository()->Add(weak_this->parent_id_,
-                                                      std::move(value)));
-          }
-        } else {
-          // We can safely capture everything by reference because we know
-          // |weak_this->value_id_| has been completed, which means this
-          // callback will be executed immediately.
-          weak_this->value_id_->ConstThen(
-              [weak_this, &content, &metadata,
-               &entity_types](const ContextRepository::Id& value_id) {
-                if (!weak_this->writer_->repository()->Contains(value_id)) {
-                  FXL_LOG(FATAL)
-                      << "Trying to update non-existent context value ("
-                      << value_id << "). New content: " << content
-                      << ", new metadata: " << metadata;
-                }
-
-                auto value = weak_this->writer_->repository()->Get(value_id);
-                if (content) {
-                  value->content = content;
-                }
-                if (metadata) {
-                  fidl::Clone(*metadata, &value->meta);
-                }
-                MaybeFillEntityTypeMetadata(entity_types, *value);
-                weak_this->writer_->repository()->Update(value_id,
-                                                         std::move(*value));
-              });
-        }
-      };
-
-  if (type_ != fuchsia::modular::ContextValueType::ENTITY || !content) {
-    // Avoid an extra round-trip to fuchsia::modular::EntityResolver that won't
-    // get us anything.
-    done_getting_types({});
-  } else {
-    writer_->GetEntityTypesFromEntityReference(
-        content, fxl::MakeCopyable(std::move(done_getting_types)));
-  }
-}
-
-}  // namespace modular
diff --git a/bin/context_engine/context_writer_impl.h b/bin/context_engine/context_writer_impl.h
deleted file mode 100644
index 5ccb9dd..0000000
--- a/bin/context_engine/context_writer_impl.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_WRITER_IMPL_H_
-#define PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_WRITER_IMPL_H_
-
-#include <map>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/future.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/context_engine/context_repository.h"
-#include "peridot/lib/bound_set/bound_set.h"
-
-namespace modular {
-
-class ContextRepository;
-class ContextValueWriterImpl;
-class EntityResolver;
-
-class ContextWriterImpl : fuchsia::modular::ContextWriter {
- public:
-  ContextWriterImpl(
-      const fuchsia::modular::ComponentScope& client_info,
-      ContextRepository* repository,
-      fuchsia::modular::EntityResolver* entity_resolver,
-      fidl::InterfaceRequest<fuchsia::modular::ContextWriter> request);
-  ~ContextWriterImpl() override;
-
-  // Takes ownership of |ptr|. Used by ContextWriterImpl and
-  // ContextValueWriterImpl.
-  void AddContextValueWriter(ContextValueWriterImpl* ptr);
-
-  // Destroys |ptr| and removes it from |value_writer_storage_|. Used by
-  // ContextValueWriterImpl on connection error.
-  void DestroyContextValueWriter(ContextValueWriterImpl* ptr);
-
-  // Used by ContextValueWriterImpl.
-  ContextRepository* repository() const { return repository_; }
-
-  // Used by ContextValueWriterImpl.
-  void GetEntityTypesFromEntityReference(
-      const fidl::StringPtr& reference,
-      std::function<void(const std::vector<std::string>&)> done);
-
- private:
-  // |fuchsia::modular::ContextWriter|
-  void CreateValue(
-      fidl::InterfaceRequest<fuchsia::modular::ContextValueWriter> request,
-      fuchsia::modular::ContextValueType type) override;
-
-  // |fuchsia::modular::ContextWriter|
-  void WriteEntityTopic(std::string topic, fidl::StringPtr value) override;
-
-  fidl::Binding<fuchsia::modular::ContextWriter> binding_;
-
-  fuchsia::modular::ContextSelector parent_value_selector_;
-  ContextRepository* const repository_;
-  fuchsia::modular::EntityResolver* const entity_resolver_;
-
-  // Supports WriteEntityTopic.
-  std::map<fidl::StringPtr, ContextRepository::Id> topic_value_ids_;
-
-  // Supports CreateValue().
-  std::vector<std::unique_ptr<ContextValueWriterImpl>> value_writer_storage_;
-
-  // Supports GetEntityTypesFromEntityReference
-  //
-  // TODO(rosswang): consider adding removal capability to |InterfacePtrSet|
-  // instead.
-  BoundPtrSet<fuchsia::modular::Entity> entities_;
-
-  fxl::WeakPtrFactory<ContextWriterImpl> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ContextWriterImpl);
-};
-
-class ContextValueWriterImpl : fuchsia::modular::ContextValueWriter {
- public:
-  // Binds |request| to |this|, and configures it to call
-  // |writer->DestroyContextValueWriter(this)| when a connection error occurs.
-  // Assumes that |writer->AddContextValueWriter(this)| has already been
-  // called. If |parent_id| is set, the new value will have |parent_id| as its
-  // parent value.
-  //
-  // Does not take ownership of |writer|.
-  ContextValueWriterImpl(
-      ContextWriterImpl* writer, const ContextRepository::Id& parent_id,
-      fuchsia::modular::ContextValueType type,
-      fidl::InterfaceRequest<fuchsia::modular::ContextValueWriter> request);
-  ~ContextValueWriterImpl() override;
-
- private:
-  // |fuchsia::modular::ContextValueWriter|
-  void CreateChildValue(
-      fidl::InterfaceRequest<fuchsia::modular::ContextValueWriter> request,
-      fuchsia::modular::ContextValueType type) override;
-
-  // |fuchsia::modular::ContextValueWriter|
-  void Set(fidl::StringPtr content,
-           fuchsia::modular::ContextMetadataPtr metadata) override;
-
-  fidl::Binding<fuchsia::modular::ContextValueWriter> binding_;
-
-  ContextWriterImpl* const writer_;
-  const ContextRepository::Id parent_id_;
-  fuchsia::modular::ContextValueType type_;
-  FuturePtr<ContextRepository::Id> value_id_;
-  bool have_value_id_{};
-
-  fxl::WeakPtrFactory<ContextValueWriterImpl> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ContextValueWriterImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_CONTEXT_ENGINE_CONTEXT_WRITER_IMPL_H_
diff --git a/bin/context_engine/debug.cc b/bin/context_engine/debug.cc
deleted file mode 100644
index 8ddb375..0000000
--- a/bin/context_engine/debug.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/context_engine/debug.h"
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/optional.h>
-
-#include "peridot/bin/context_engine/context_repository.h"
-
-namespace modular {
-
-ContextDebugImpl::ContextDebugImpl(const ContextRepository* const repository)
-    : repository_(repository), weak_ptr_factory_(this) {}
-ContextDebugImpl::~ContextDebugImpl() = default;
-
-fxl::WeakPtr<ContextDebugImpl> ContextDebugImpl::GetWeakPtr() {
-  return weak_ptr_factory_.GetWeakPtr();
-}
-
-void ContextDebugImpl::OnValueChanged(
-    const std::set<Id>& parent_ids, const Id& id,
-    const fuchsia::modular::ContextValue& value) {
-  fuchsia::modular::ContextDebugValue update;
-  update.parent_ids.resize(0);
-  for (const auto& it : parent_ids) {
-    update.parent_ids.push_back(it);
-  }
-  update.id = id;
-  fuchsia::modular::ContextValue value_clone;
-  fidl::Clone(value, &value_clone);
-  update.value = fidl::MakeOptional(std::move(value_clone));
-  DispatchOneValue(std::move(update));
-}
-
-void ContextDebugImpl::OnValueRemoved(const Id& id) {
-  fuchsia::modular::ContextDebugValue update;
-  update.id = id;
-  update.parent_ids.resize(0);
-  DispatchOneValue(std::move(update));
-}
-
-void ContextDebugImpl::OnSubscriptionAdded(
-    const Id& id, const fuchsia::modular::ContextQuery& query,
-    const fuchsia::modular::SubscriptionDebugInfo& debug_info) {
-  fuchsia::modular::ContextDebugSubscription update;
-  update.id = id;
-  fuchsia::modular::ContextQuery query_clone;
-  fidl::Clone(query, &query_clone);
-  update.query = fidl::MakeOptional(std::move(query_clone));
-  fuchsia::modular::SubscriptionDebugInfo debug_info_clone;
-  fidl::Clone(debug_info, &debug_info_clone);
-  update.debug_info = fidl::MakeOptional(std::move(debug_info_clone));
-  DispatchOneSubscription(std::move(update));
-}
-
-void ContextDebugImpl::OnSubscriptionRemoved(const Id& id) {
-  fuchsia::modular::ContextDebugSubscription update;
-  update.id = id;
-  DispatchOneSubscription(std::move(update));
-}
-
-util::IdleWaiter* ContextDebugImpl::GetIdleWaiter() { return &idle_waiter_; }
-
-void ContextDebugImpl::Watch(
-    fidl::InterfaceHandle<fuchsia::modular::ContextDebugListener> listener) {
-  FXL_LOG(INFO) << "Watch(): entered";
-  auto listener_ptr = listener.Bind();
-  // Build a complete state snapshot and send it to |listener|.
-  std::vector<fuchsia::modular::ContextDebugValue> all_values;
-  for (const auto& entry : repository_->values_) {
-    fuchsia::modular::ContextDebugValue update;
-    update.id = entry.first;
-    fuchsia::modular::ContextValue value_clone;
-    fidl::Clone(entry.second.value, &value_clone);
-    update.value = fidl::MakeOptional(std::move(value_clone));
-    update.parent_ids.resize(0);
-    for (const auto& it : repository_->graph_.GetParents(entry.first)) {
-      update.parent_ids.push_back(it);
-    }
-    all_values.push_back(std::move(update));
-  }
-  listener_ptr->OnValuesChanged(std::move(all_values));
-  // TODO(thatguy): Add subscriptions.
-
-  listeners_.AddInterfacePtr(std::move(listener_ptr));
-}
-
-void ContextDebugImpl::WaitUntilIdle(WaitUntilIdleCallback callback) {
-  idle_waiter_.WaitUntilIdle(callback);
-}
-
-void ContextDebugImpl::DispatchOneValue(
-    fuchsia::modular::ContextDebugValue value) {
-  fidl::VectorPtr<fuchsia::modular::ContextDebugValue> values;
-  values.push_back(std::move(value));
-  DispatchValues(std::move(values));
-}
-
-void ContextDebugImpl::DispatchValues(
-    fidl::VectorPtr<fuchsia::modular::ContextDebugValue> values) {
-  for (const auto& listener : listeners_.ptrs()) {
-    fidl::VectorPtr<fuchsia::modular::ContextDebugValue> values_clone;
-    fidl::Clone(values, &values_clone);
-    (*listener)->OnValuesChanged(values_clone.take());
-  }
-}
-
-void ContextDebugImpl::DispatchOneSubscription(
-    fuchsia::modular::ContextDebugSubscription value) {
-  fidl::VectorPtr<fuchsia::modular::ContextDebugSubscription> values;
-  values.push_back(std::move(value));
-  DispatchSubscriptions(std::move(values));
-}
-
-void ContextDebugImpl::DispatchSubscriptions(
-    fidl::VectorPtr<fuchsia::modular::ContextDebugSubscription> subscriptions) {
-  for (const auto& listener : listeners_.ptrs()) {
-    fidl::VectorPtr<fuchsia::modular::ContextDebugSubscription>
-        subscriptions_clone;
-    fidl::Clone(subscriptions, &subscriptions_clone);
-    (*listener)->OnSubscriptionsChanged(subscriptions_clone.take());
-  }
-}
-
-}  // namespace modular
diff --git a/bin/context_engine/debug.h b/bin/context_engine/debug.h
deleted file mode 100644
index 48e2db7..0000000
--- a/bin/context_engine/debug.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CONTEXT_ENGINE_DEBUG_H_
-#define PERIDOT_BIN_CONTEXT_ENGINE_DEBUG_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-
-#include "peridot/bin/context_engine/index.h"
-#include "peridot/lib/util/idle_waiter.h"
-
-namespace modular {
-
-class ContextRepository;
-
-class ContextDebugImpl : public fuchsia::modular::ContextDebug {
-  using Id = ContextIndex::Id;
-
- public:
-  ContextDebugImpl(const ContextRepository* repository);
-  ~ContextDebugImpl() override;
-
-  fxl::WeakPtr<ContextDebugImpl> GetWeakPtr();
-
-  void OnValueChanged(const std::set<Id>& parent_ids, const Id& id,
-                      const fuchsia::modular::ContextValue& value);
-  void OnValueRemoved(const Id& id);
-
-  void OnSubscriptionAdded(
-      const Id& id, const fuchsia::modular::ContextQuery& query,
-      const fuchsia::modular::SubscriptionDebugInfo& debug_info);
-  void OnSubscriptionRemoved(const Id& id);
-
-  util::IdleWaiter* GetIdleWaiter();
-
- private:
-  // |fuchsia::modular::ContextDebug|
-  void Watch(fidl::InterfaceHandle<fuchsia::modular::ContextDebugListener>
-                 listener) override;
-  // |fuchsia::modular::ContextDebug|
-  void WaitUntilIdle(WaitUntilIdleCallback callback) override;
-
-  void DispatchOneValue(fuchsia::modular::ContextDebugValue value);
-  void DispatchValues(
-      fidl::VectorPtr<fuchsia::modular::ContextDebugValue> values);
-  void DispatchOneSubscription(
-      fuchsia::modular::ContextDebugSubscription value);
-  void DispatchSubscriptions(
-      fidl::VectorPtr<fuchsia::modular::ContextDebugSubscription>
-          subscriptions);
-
-  // Used in order to get a complete state snapshot when Watch() is called.
-  const ContextRepository* const repository_;
-  fidl::InterfacePtrSet<fuchsia::modular::ContextDebugListener> listeners_;
-
-  util::IdleWaiter idle_waiter_;
-
-  fxl::WeakPtrFactory<ContextDebugImpl> weak_ptr_factory_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_CONTEXT_ENGINE_DEBUG_H_
diff --git a/bin/context_engine/index.cc b/bin/context_engine/index.cc
deleted file mode 100644
index 12aeeb8..0000000
--- a/bin/context_engine/index.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/context_engine/index.h"
-
-#include <algorithm>
-#include <sstream>
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-ContextIndex::ContextIndex() = default;
-ContextIndex::~ContextIndex() = default;
-
-namespace internal {
-// Keys for fields within fuchsia::modular::ContextMetadata.story:
-const char kStoryIdKey[] = "si";
-const char kStoryFocusedKey[] = "sf";
-
-// Keys for fields within fuchsia::modular::ContextMetadata.mod:
-const char kModPathKey[] = "mp";
-const char kModUrlKey[] = "mu";
-const char kModuleFocusedKey[] = "mf";
-
-// Keys for fields within fuchsia::modular::ContextMetadata.entity:
-const char kEntityTopicKey[] = "et";
-const char kEntityTypeKey[] = "ey";
-// We don't index |ctime|.
-
-// Key for fuchsia::modular::ContextValueType.
-const char kContextValueTypeKey[] = "t";
-
-std::set<std::string> EncodeMetadataAndType(
-    fuchsia::modular::ContextValueType node_type,
-    const fuchsia::modular::ContextMetadata& metadata) {
-  fuchsia::modular::ContextMetadata meta_clone;
-  fidl::Clone(metadata, &meta_clone);
-  return EncodeMetadataAndType(node_type,
-                               fidl::MakeOptional(std::move(meta_clone)));
-}
-
-std::string EncodeFocus(const std::string& key,
-                        fuchsia::modular::FocusedStateState focused_state) {
-  std::ostringstream str;
-  str << key;
-  if (focused_state == fuchsia::modular::FocusedStateState::FOCUSED) {
-    str << "1";
-  } else {
-    str << "0";
-  }
-  return str.str();
-}
-
-std::set<std::string> EncodeMetadataAndType(
-    fuchsia::modular::ContextValueType node_type,
-    const fuchsia::modular::ContextMetadataPtr& metadata) {
-  std::set<std::string> ret;
-
-  if (metadata) {
-    if (metadata->story) {
-      if (metadata->story->id) {
-        std::ostringstream str;
-        str << kStoryIdKey << metadata->story->id;
-        ret.insert(str.str());
-      }
-      if (metadata->story->focused) {
-        ret.insert(
-            EncodeFocus(kStoryFocusedKey, metadata->story->focused->state));
-      }
-    }
-
-    if (metadata->mod) {
-      if (metadata->mod->url) {
-        std::ostringstream str;
-        str << kModUrlKey << metadata->mod->url;
-        ret.insert(str.str());
-      }
-      if (metadata->mod->path) {
-        std::ostringstream str;
-        str << kModPathKey;
-        for (const auto& part : *metadata->mod->path) {
-          str << '\0' << part;
-        }
-        ret.insert(str.str());
-      }
-      if (metadata->mod->focused) {
-        ret.insert(
-            EncodeFocus(kModuleFocusedKey, metadata->mod->focused->state));
-      }
-    }
-
-    if (metadata->entity) {
-      if (metadata->entity->topic) {
-        std::ostringstream str;
-        str << kEntityTopicKey << metadata->entity->topic;
-        ret.insert(str.str());
-      }
-      if (metadata->entity->type) {
-        for (const auto& type : *metadata->entity->type) {
-          std::ostringstream str;
-          str << kEntityTypeKey << type;
-          ret.insert(str.str());
-        }
-      }
-    }
-  }
-
-  std::ostringstream str;
-  str << kContextValueTypeKey << fidl::ToUnderlying(node_type);
-  ret.insert(str.str());
-
-  return ret;
-}
-
-}  // namespace internal
-
-void ContextIndex::Add(Id id, fuchsia::modular::ContextValueType type,
-                       const fuchsia::modular::ContextMetadata& metadata) {
-  auto keys = internal::EncodeMetadataAndType(type, metadata);
-  for (const auto& key : keys) {
-    index_[key].insert(id);
-  }
-}
-
-void ContextIndex::Remove(Id id, fuchsia::modular::ContextValueType type,
-                          const fuchsia::modular::ContextMetadata& metadata) {
-  auto keys = internal::EncodeMetadataAndType(type, metadata);
-  for (const auto& key : keys) {
-    index_[key].erase(id);
-  }
-}
-
-void ContextIndex::Query(fuchsia::modular::ContextValueType type,
-                         const fuchsia::modular::ContextMetadataPtr& metadata,
-                         std::set<ContextIndex::Id>* out) {
-  FXL_DCHECK(out != nullptr);
-
-  auto keys = internal::EncodeMetadataAndType(type, metadata);
-  std::set<ContextIndex::Id> ret;
-  if (keys.empty())
-    return;
-  const auto& first = index_[*keys.begin()];
-  ret.insert(first.begin(), first.end());
-  keys.erase(keys.begin());
-
-  for (const auto& key : keys) {
-    std::set<ContextIndex::Id> intersection;
-    const auto& posting_list = index_[key];
-    std::set_intersection(ret.begin(), ret.end(), posting_list.begin(),
-                          posting_list.end(),
-                          std::inserter(intersection, intersection.begin()));
-    ret.swap(intersection);
-  }
-
-  out->insert(ret.begin(), ret.end());
-}
-
-}  // namespace modular
diff --git a/bin/context_engine/index.h b/bin/context_engine/index.h
deleted file mode 100644
index 528bd70..0000000
--- a/bin/context_engine/index.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This class maintains an inverted index for fuchsia::modular::ContextMetadata
-// structs. It helps answer the question "what objects have metadata that
-// matches these key/value pairs" very efficiently.
-
-#ifndef PERIDOT_BIN_CONTEXT_ENGINE_INDEX_H_
-#define PERIDOT_BIN_CONTEXT_ENGINE_INDEX_H_
-
-#include <map>
-#include <set>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-namespace modular {
-
-namespace internal {
-
-// Returns a set of strings which encode both the keys and values in |metadata|
-// and |type| for use in an inverted index.
-std::set<std::string> EncodeMetadataAndType(
-    fuchsia::modular::ContextValueType node_type,
-    const fuchsia::modular::ContextMetadataPtr& metadata);
-std::set<std::string> EncodeMetadataAndType(
-    fuchsia::modular::ContextValueType node_type,
-    const fuchsia::modular::ContextMetadata& metadata);
-}  // namespace internal
-
-class ContextIndex {
- public:
-  // TODO(thatguy): Move this enum into context_repository.cc.
-  using Id = std::string;
-
-  ContextIndex();
-  ~ContextIndex();
-
-  void Add(Id id, fuchsia::modular::ContextValueType type,
-           const fuchsia::modular::ContextMetadata& metadata);
-  void Remove(Id id, fuchsia::modular::ContextValueType type,
-              const fuchsia::modular::ContextMetadata& metadata);
-
-  // Intersects the ids in |out| with those of type |type| and match every
-  // field in |metadata|.
-  void Query(fuchsia::modular::ContextValueType type,
-             const fuchsia::modular::ContextMetadataPtr& metadata,
-             std::set<Id>* out);
-
- private:
-  // A posting list from encoded value list to ids.
-  std::map<std::string, std::set<Id>> index_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_CONTEXT_ENGINE_INDEX_H_
diff --git a/bin/context_engine/index_unittest.cc b/bin/context_engine/index_unittest.cc
deleted file mode 100644
index 6a14523..0000000
--- a/bin/context_engine/index_unittest.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/context_engine/index.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/clone.h>
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-TEST(IndexTest, Encode_Basic) {
-  // Basic encoding correctness:
-  //  * null case(s)
-  //  * values are indexed along with their key
-  auto type = fuchsia::modular::ContextValueType::ENTITY;
-  EXPECT_EQ(1lu, internal::EncodeMetadataAndType(type, nullptr).size());
-  EXPECT_EQ(1lu, internal::EncodeMetadataAndType(
-                     type, fuchsia::modular::ContextMetadata::New())
-                     .size());
-
-  auto meta = fuchsia::modular::ContextMetadata::New();
-  meta->story = fuchsia::modular::StoryMetadata::New();
-  EXPECT_EQ(1lu, internal::EncodeMetadataAndType(type, meta).size());
-
-  meta->story->id = "value";
-  auto out = internal::EncodeMetadataAndType(type, meta);
-  EXPECT_EQ(2lu, out.size());
-
-  meta->mod = fuchsia::modular::ModuleMetadata::New();
-  meta->mod->url = "value";
-  out = internal::EncodeMetadataAndType(type, meta);
-  // Even though we use "value" as the value for both fields above, we should
-  // see them encoded differently since they are for different fields.
-  EXPECT_EQ(3lu, out.size());
-}
-
-TEST(IndexTest, Encode_Differences) {
-  auto kEntity = fuchsia::modular::ContextValueType::ENTITY;
-  auto kStory = fuchsia::modular::ContextValueType::STORY;
-  // Encoding two entirely different fuchsia::modular::ContextMetadata structs
-  // should produce two non-intersecting sets of encodings.
-  fuchsia::modular::ContextMetadata meta1;
-  meta1.story = fuchsia::modular::StoryMetadata::New();
-  meta1.story->id = "story1";
-  meta1.story->focused = fuchsia::modular::FocusedState::New();
-  meta1.story->focused->state = fuchsia::modular::FocusedStateState::FOCUSED;
-  meta1.mod = fuchsia::modular::ModuleMetadata::New();
-  meta1.mod->url = "url1";
-  meta1.mod->path = fidl::VectorPtr<std::string>::New(0);
-  meta1.mod->path.push_back("1");
-  meta1.mod->path.push_back("2");
-  meta1.mod->focused = fuchsia::modular::FocusedState::New();
-  meta1.mod->focused->state = fuchsia::modular::FocusedStateState::FOCUSED;
-  meta1.entity = fuchsia::modular::EntityMetadata::New();
-  meta1.entity->topic = "topic1";
-  meta1.entity->type = fidl::VectorPtr<std::string>::New(0);
-  meta1.entity->type.push_back("type1");
-  meta1.entity->type.push_back("type2");
-
-  auto meta2 = fuchsia::modular::ContextMetadata::New();
-  meta2->story = fuchsia::modular::StoryMetadata::New();
-  meta2->story->id = "story2";
-  meta2->story->focused = fuchsia::modular::FocusedState::New();
-  meta2->story->focused->state =
-      fuchsia::modular::FocusedStateState::NOT_FOCUSED;
-  meta2->mod = fuchsia::modular::ModuleMetadata::New();
-  meta2->mod->url = "url2";
-  meta2->mod->path = fidl::VectorPtr<std::string>::New(0);
-  meta2->mod->path.push_back("2");
-  meta2->mod->focused = fuchsia::modular::FocusedState::New();
-  meta2->mod->focused->state = fuchsia::modular::FocusedStateState::NOT_FOCUSED;
-  meta2->entity = fuchsia::modular::EntityMetadata::New();
-  meta2->entity->topic = "topic2";
-  meta2->entity->type = fidl::VectorPtr<std::string>::New(0);
-  meta2->entity->type.push_back("type3");
-  meta2->entity->type.push_back("type4");
-  meta2->entity->type.push_back("type5");
-
-  auto encoded1 = internal::EncodeMetadataAndType(kEntity, meta1);
-  auto encoded2 = internal::EncodeMetadataAndType(kStory, meta2);
-
-  // Every field we set has a value here. entity->type fields each get their
-  // own.
-  EXPECT_EQ(9lu, encoded1.size());
-  EXPECT_EQ(10lu, encoded2.size());
-
-  std::set<std::string> intersection;
-  std::set_intersection(encoded1.begin(), encoded1.end(), encoded2.begin(),
-                        encoded2.end(),
-                        std::inserter(intersection, intersection.begin()));
-  EXPECT_TRUE(intersection.empty());
-
-  // If we start changing some values to be equal, we should see encoded values
-  // included.
-  meta2->story->focused->state = fuchsia::modular::FocusedStateState::FOCUSED;
-  meta2->entity->type->at(1) = "type2";
-
-  encoded1 = internal::EncodeMetadataAndType(kEntity, meta1);
-  encoded2 = internal::EncodeMetadataAndType(kEntity, meta2);
-  intersection.clear();
-  std::set_intersection(encoded1.begin(), encoded1.end(), encoded2.begin(),
-                        encoded2.end(),
-                        std::inserter(intersection, intersection.begin()));
-  EXPECT_EQ(3lu, intersection.size());
-}
-
-TEST(IndexTest, AddRemoveQuery) {
-  auto kEntity = fuchsia::modular::ContextValueType::ENTITY;
-  auto kStory = fuchsia::modular::ContextValueType::STORY;
-  // We do not need to test that querying works for every single field in
-  // fuchsia::modular::ContextMetadata: between the Encode tests above, and the
-  // knowledge that Encode is used internally by ContextIndex, we can test here
-  // for correct query results for a subset of fields, and infer that the same
-  // behavior would happen for other fields.
-  ContextIndex index;
-  fuchsia::modular::ContextMetadata meta1;
-  meta1.story = fuchsia::modular::StoryMetadata::New();
-  meta1.story->id = "story1";
-  meta1.entity = fuchsia::modular::EntityMetadata::New();
-  meta1.entity->topic = "topic1";
-  meta1.entity->type = fidl::VectorPtr<std::string>::New(0);
-  meta1.entity->type.push_back("type1");
-  meta1.entity->type.push_back("type2");
-
-  index.Add("e1", kEntity, meta1);
-
-  // This query won't match because story->id != "s".
-  auto query1 = fuchsia::modular::ContextMetadata::New();
-  query1->story = fuchsia::modular::StoryMetadata::New();
-  query1->story->id = "s";  // Won't match.
-  std::set<std::string> res;
-  index.Query(kEntity, query1, &res);
-  EXPECT_TRUE(res.empty());
-
-  // This one still won't because kStory != kEntity.
-  query1->story->id = "story1";
-  res.clear();
-  index.Query(kStory, query1, &res);
-  EXPECT_TRUE(res.empty());
-
-  // This one will.
-  query1->story->id = "story1";
-  res.clear();
-  index.Query(kEntity, query1, &res);
-  EXPECT_EQ(1ul, res.size());
-  EXPECT_TRUE(res.find("e1") != res.end());
-
-  // Add more to the query that we know will match.
-  query1->entity = fuchsia::modular::EntityMetadata::New();
-  query1->entity->type.push_back("type1");
-  res.clear();
-  index.Query(kEntity, query1, &res);
-  EXPECT_EQ(1ul, res.size());
-  EXPECT_TRUE(res.find("e1") != res.end());
-
-  // Add a new entity.
-  auto meta2 = fidl::Clone(meta1);
-  meta2.entity->type.push_back("type3");
-  index.Add("e2", kEntity, meta2);
-
-  res.clear();
-  index.Query(kEntity, query1, &res);
-  EXPECT_EQ(2ul, res.size());
-  EXPECT_TRUE(res.find("e1") != res.end());
-  EXPECT_TRUE(res.find("e2") != res.end());
-
-  // Changing the query's type param to "type3" should only return "e2".
-  query1->entity->type->at(0) = "type3";
-  res.clear();
-  index.Query(kEntity, query1, &res);
-  EXPECT_EQ(1ul, res.size());
-  EXPECT_TRUE(res.find("e2") != res.end());
-
-  // And removing "e2" from the index makes it no longer appear in
-  // query results.
-  index.Remove("e2", kEntity, meta2);
-  res.clear();
-  index.Query(kEntity, query1, &res);
-  EXPECT_TRUE(res.empty());
-
-  // But "e1" is still there.
-  query1->entity->type->at(0) = "type2";
-  res.clear();
-  index.Query(kEntity, query1, &res);
-  EXPECT_EQ(1ul, res.size());
-  EXPECT_TRUE(res.find("e1") != res.end());
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/context_engine/meta/context_engine.cmx b/bin/context_engine/meta/context_engine.cmx
deleted file mode 100644
index 46ad68e..0000000
--- a/bin/context_engine/meta/context_engine.cmx
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.sys.Launcher",
-            "fuchsia.tracelink.Registry"
-        ]
-    }
-}
diff --git a/bin/context_engine/meta/context_index_unittest.cmx b/bin/context_engine/meta/context_index_unittest.cmx
deleted file mode 100644
index a77ae85..0000000
--- a/bin/context_engine/meta/context_index_unittest.cmx
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "program": {
-    "binary": "test/context_index_unittest"
-  },
-  "sandbox": {
-    "services": []
-  }
-}
diff --git a/bin/context_engine/meta/context_repository_unittest.cmx b/bin/context_engine/meta/context_repository_unittest.cmx
deleted file mode 100644
index 8b35548..0000000
--- a/bin/context_engine/meta/context_repository_unittest.cmx
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "program": {
-    "binary": "test/context_repository_unittest"
-  },
-  "sandbox": {
-    "services": []
-  }
-}
diff --git a/bin/context_engine/scope_utils.cc b/bin/context_engine/scope_utils.cc
deleted file mode 100644
index 2338c33..0000000
--- a/bin/context_engine/scope_utils.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/context_engine/scope_utils.h"
-
-#include <regex>
-#include <sstream>
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/vector.h>
-#include <lib/fxl/logging.h>
-#include <openssl/sha.h>
-
-namespace maxwell {
-
-fuchsia::modular::ContextSelectorPtr ComponentScopeToContextSelector(
-    const fuchsia::modular::ComponentScopePtr& scope) {
-  fuchsia::modular::ContextSelectorPtr selector;
-  if (!scope || scope->is_global_scope())
-    return selector;
-  selector = fuchsia::modular::ContextSelector::New();
-  if (scope->is_module_scope()) {
-    selector->type = fuchsia::modular::ContextValueType::MODULE;
-    selector->meta = fuchsia::modular::ContextMetadata::New();
-    selector->meta->story = fuchsia::modular::StoryMetadata::New();
-    selector->meta->story->id = scope->module_scope().story_id;
-    selector->meta->mod = fuchsia::modular::ModuleMetadata::New();
-    selector->meta->mod->path = fidl::VectorPtr(scope->module_scope().module_path);
-  } else if (scope->is_agent_scope()) {
-    // TODO(thatguy): do.
-  } else if (scope->is_story_scope()) {
-    selector->type = fuchsia::modular::ContextValueType::STORY;
-    selector->meta = fuchsia::modular::ContextMetadata::New();
-    selector->meta->story = fuchsia::modular::StoryMetadata::New();
-    selector->meta->story->id = scope->story_scope().story_id;
-  }
-
-  return selector;
-}
-
-}  // namespace maxwell
diff --git a/bin/context_engine/scope_utils.h b/bin/context_engine/scope_utils.h
deleted file mode 100644
index 287f91d..0000000
--- a/bin/context_engine/scope_utils.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_CONTEXT_ENGINE_SCOPE_UTILS_H_
-#define PERIDOT_BIN_CONTEXT_ENGINE_SCOPE_UTILS_H_
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-namespace maxwell {
-
-fuchsia::modular::ContextSelectorPtr ComponentScopeToContextSelector(
-    const fuchsia::modular::ComponentScopePtr& scope);
-
-}  // namespace maxwell
-
-#endif  // PERIDOT_BIN_CONTEXT_ENGINE_SCOPE_UTILS_H_
diff --git a/bin/ledger/BUILD.gn b/bin/ledger/BUILD.gn
deleted file mode 100644
index dc487b6..0000000
--- a/bin/ledger/BUILD.gn
+++ /dev/null
@@ -1,205 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fuzzing/fuzzer.gni")
-import("//build/package.gni")
-import("//build/testing/secret_spec.gni")
-import("//peridot/bin/ledger/testing/sync_params.gni")
-
-visibility = [ "//peridot/*" ]
-
-package("ledger") {
-  deps = [
-    "app",
-    "cobalt:ledger_metrics_registry",
-  ]
-
-  binary = "ledger"
-
-  meta = [
-    {
-      path = rebase_path("meta/ledger.cmx")
-      dest = "ledger.cmx"
-    },
-  ]
-
-  resources = [
-    {
-      path = rebase_path(
-              get_label_info("cobalt:ledger_metrics_registry",
-                             "target_gen_dir") + "/ledger_metrics_registry.pb")
-      dest = "ledger_cobalt_config.pb"
-    },
-    {
-      path = rebase_path(
-              get_label_info("cobalt:ledger_metrics_registry",
-                             "target_gen_dir") + "/ledger_metrics_registry.pb")
-      dest = "firebase_auth_cobalt_config.pb"
-    },
-  ]
-}
-
-package("ledger_tests") {
-  testonly = true
-
-  deps = [
-    ":ledger_e2e_sync_credentials",
-    ":ledger_unittests",
-    "//peridot/bin/cloud_provider_firestore:tests",
-    "//peridot/bin/ledger/tests/cloud_provider",
-    "//peridot/bin/ledger/tests/e2e_local",
-    "//peridot/bin/ledger/tests/e2e_sync",
-    "//peridot/bin/ledger/tests/integration",
-  ]
-
-  meta = [
-    {
-      path = rebase_path("tests/ledger_unittests.cmx")
-      dest = "ledger_unittests.cmx"
-    },
-    {
-      path = rebase_path("tests/integration/ledger_integration_tests.cmx")
-      dest = "ledger_integration_tests.cmx"
-    },
-    {
-      path = rebase_path("tests/e2e_local/ledger_e2e_local.cmx")
-      dest = "ledger_e2e_local.cmx"
-    },
-    {
-      path = rebase_path("tests/e2e_sync/ledger_e2e_sync.cmx")
-      dest = "ledger_e2e_sync.cmx"
-    },
-    {
-      path = rebase_path(
-              "//peridot/bin/cloud_provider_firestore/cloud_provider_firestore_unittests.cmx")
-      dest = "cloud_provider_firestore_unittests.cmx"
-    },
-    {
-      path = rebase_path(
-              "//peridot/bin/cloud_provider_firestore/validation/validation_firestore.cmx")
-      dest = "validation_firestore.cmx"
-    },
-    {
-      # This test must be started by validation_firestore and will fail if started on its own.
-      path = rebase_path(
-              "tests/cloud_provider/cloud_provider_validation_tests.cmx")
-      dest = "cloud_provider_validation_tests.cmx"
-    },
-  ]
-
-  tests = [
-    {
-      name = "ledger_unittests"
-    },
-    {
-      name = "ledger_integration_tests"
-    },
-    {
-      name = "ledger_e2e_local"
-    },
-    {
-      name = "cloud_provider_firestore_unittests"
-    },
-
-    {
-      name = "ledger_e2e_sync"
-
-      # This test needs additional configuration and should not run by default.
-      # Marking it as disabled puts the binary in `test/disabled/` under the
-      # package directory.
-      disabled = true
-    },
-    {
-      name = "launch_validation_tests_firestore"
-
-      # This test needs additional configuration and should not run by default.
-      # Marking it as disabled puts the binary in `test/disabled/` under the
-      # package directory.
-      disabled = true
-    },
-    {
-      name = "cloud_provider_validation_tests"
-
-      # This test must be started by validation_firestore and will fail if started on its own.
-      # Marking it as disabled puts the binary in `test/disabled/` under the
-      # package directory.
-      disabled = true
-    },
-  ]
-
-  resources = []
-  if (ledger_sync_credentials_file != "") {
-    resources += [
-      {
-        path = ledger_sync_credentials_file
-        dest = "sync_credentials.json"
-      },
-    ]
-  }
-}
-
-secret_spec("ledger_e2e_sync_credentials") {
-  key_name = "ledger-tests-remote"
-
-  ciphertext_file = "ledger_e2e_sync_credentials.ciphertext"
-}
-
-config("ledger_config") {
-  asmflags = []
-
-  cflags = [
-    # Remove when enabled globally by TO-99.
-    "-Wunused-lambda-capture",
-
-    # Remove when enabled globally by TO-100.
-    "-Wuser-defined-warnings",
-
-    # Warn about unreachable code.
-    "-Wunreachable-code",
-  ]
-
-  ldflags = [
-    # Use a 1M stack.
-    "-Wl,-z,stack-size=0x100000",
-  ]
-}
-
-executable("ledger_unittests") {
-  testonly = true
-
-  deps = [
-    "//garnet/public/lib/fxl:fxl_printers",
-    "//peridot/bin/ledger/app:unittests",
-    "//peridot/bin/ledger/cache:unittests",
-    "//peridot/bin/ledger/cloud_sync/impl:unittests",
-    "//peridot/bin/ledger/coroutine:unittests",
-    "//peridot/bin/ledger/coroutine/context:unittests",
-    "//peridot/bin/ledger/encryption/impl:unittests",
-    "//peridot/bin/ledger/encryption/primitives:unittests",
-    "//peridot/bin/ledger/environment:unittests",
-    "//peridot/bin/ledger/fidl/error_notifier:unittests",
-    "//peridot/bin/ledger/filesystem:unittests",
-    "//peridot/bin/ledger/lock:unittests",
-    "//peridot/bin/ledger/p2p_provider/impl:unittests",
-    "//peridot/bin/ledger/p2p_sync/impl:unittests",
-    "//peridot/bin/ledger/storage/impl:unittests",
-    "//peridot/bin/ledger/storage/impl/btree:unittests",
-    "//peridot/bin/ledger/storage/public:unittests",
-    "//peridot/bin/ledger/storage/testing:unittests",
-    "//peridot/bin/ledger/sync_helper:unittests",
-    "//peridot/bin/ledger/testing:unittests",
-    "//peridot/bin/ledger/testing/netconnector:unittests",
-    "//third_party/googletest:gtest_main",
-  ]
-
-  configs += [ ":ledger_config" ]
-}
-
-fuzz_package("ledger_fuzzers") {
-  targets = [ "//peridot/bin/ledger/storage/impl/btree:encoding_fuzzer" ]
-  sanitizers = [
-    "asan",
-    "ubsan",
-  ]
-}
diff --git a/bin/ledger/README.md b/bin/ledger/README.md
deleted file mode 100644
index aed8e87..0000000
--- a/bin/ledger/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Ledger
-
-Implementation of Ledger.
-
-## Contents
-
- - [app](app) implements Ledger fidl API
- - [cache](cache)
- - [cloud_sync](cloud_sync) implements Ledger synchronisation via cloud
- - [cobalt](cobalt) contains helper methods for reporting Cobalt events
- - [coroutine](coroutine) coroutine library
- - [encryption](encryption) implements encryption service for Ledger
- - [environment](environment)
- - [fidl](fidl) FIDL interfaces internal to Ledger and peridot framework (not exposed to upper layers)
- - [fidl_helpers](fidl_helpers)
- - [lock](lock)
- - [filesystem](filesystem) contains filesystem-related helper functions
- - [p2p_provider](p2p_provider) implements P2P primitives powering the P2P sync
- - [p2p_sync](p2p_sync) implements Ledger synchronisation via P2P
- - [storage](storage) implements persistent representation of data held in
-   Ledger
- - [testing](testing) contains helper functions used for testing Ledger
- - [tests](tests) contains tests and benchmarks for Ledger
diff --git a/bin/ledger/app/BUILD.gn b/bin/ledger/app/BUILD.gn
deleted file mode 100644
index 41a3aba..0000000
--- a/bin/ledger/app/BUILD.gn
+++ /dev/null
@@ -1,203 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [
-  # needed to access the serialization version constant
-  # TODO(ppi): extract the serialization version constant to a separate library
-  "//peridot/bin/cloud_provider_firestore/*",
-  "//peridot/bin/ledger/*",
-]
-
-executable("app") {
-  output_name = "ledger"
-  sources = [
-    "app.cc",
-  ]
-
-  deps = [
-    ":lib",
-    "//garnet/public/fidl/fuchsia.net.oldhttp",
-    "//garnet/public/fidl/fuchsia.netconnector",
-    "//garnet/public/lib/backoff",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/cobalt",
-    "//peridot/bin/ledger/environment",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/bin/ledger/fidl:error_notifier",
-    "//peridot/bin/ledger/fidl/include",
-    "//peridot/bin/ledger/p2p_sync/impl",
-    "//peridot/bin/ledger/storage/impl:lib",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("lib") {
-  sources = [
-    "branch_tracker.cc",
-    "branch_tracker.h",
-    "constants.cc",
-    "constants.h",
-    "delaying_facade.h",
-    "diff_utils.cc",
-    "diff_utils.h",
-    "disk_cleanup_manager.h",
-    "disk_cleanup_manager_impl.cc",
-    "disk_cleanup_manager_impl.h",
-    "fidl/serialization_size.cc",
-    "fidl/serialization_size.h",
-    "ledger_impl.cc",
-    "ledger_impl.h",
-    "ledger_manager.cc",
-    "ledger_manager.h",
-    "ledger_repository_factory_impl.cc",
-    "ledger_repository_factory_impl.h",
-    "ledger_repository_impl.cc",
-    "ledger_repository_impl.h",
-    "merging/auto_merge_strategy.cc",
-    "merging/auto_merge_strategy.h",
-    "merging/common_ancestor.cc",
-    "merging/common_ancestor.h",
-    "merging/conflict_resolver_client.cc",
-    "merging/conflict_resolver_client.h",
-    "merging/custom_merge_strategy.cc",
-    "merging/custom_merge_strategy.h",
-    "merging/last_one_wins_merge_strategy.cc",
-    "merging/last_one_wins_merge_strategy.h",
-    "merging/ledger_merge_manager.cc",
-    "merging/ledger_merge_manager.h",
-    "merging/merge_resolver.cc",
-    "merging/merge_resolver.h",
-    "merging/merge_strategy.h",
-    "page_delaying_facade.cc",
-    "page_delaying_facade.h",
-    "page_delegate.cc",
-    "page_delegate.h",
-    "page_eviction_manager.h",
-    "page_eviction_manager_impl.cc",
-    "page_eviction_manager_impl.h",
-    "page_eviction_policies.cc",
-    "page_eviction_policies.h",
-    "page_impl.cc",
-    "page_impl.h",
-    "page_manager.cc",
-    "page_manager.h",
-    "page_snapshot_impl.cc",
-    "page_snapshot_impl.h",
-    "page_usage_db.cc",
-    "page_usage_db.h",
-    "page_usage_listener.h",
-    "page_utils.cc",
-    "page_utils.h",
-    "sync_watcher_set.cc",
-    "sync_watcher_set.h",
-    "types.h",
-  ]
-
-  deps = [
-    ":serialization_version",
-    "//garnet/public/fidl/fuchsia.netconnector",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/cloud_sync/impl",
-    "//peridot/bin/ledger/cloud_sync/public",
-    "//peridot/bin/ledger/cobalt",
-    "//peridot/bin/ledger/encryption/primitives",
-    "//peridot/bin/ledger/environment",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/bin/ledger/fidl:error_notifier",
-    "//peridot/bin/ledger/fidl/include",
-    "//peridot/bin/ledger/fidl_helpers",
-    "//peridot/bin/ledger/filesystem",
-    "//peridot/bin/ledger/lock",
-    "//peridot/bin/ledger/p2p_provider/impl",
-    "//peridot/bin/ledger/p2p_sync/impl",
-    "//peridot/bin/ledger/p2p_sync/public",
-    "//peridot/bin/ledger/storage/impl:lib",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/bin/ledger/sync_coordinator/impl",
-    "//peridot/bin/ledger/sync_coordinator/public",
-    "//peridot/lib/base64url:base64url",
-    "//peridot/lib/convert",
-    "//peridot/lib/socket",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//zircon/public/lib/trace",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("serialization_version") {
-  sources = [
-    "serialization_version.h",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "delaying_facade_unittest.cc",
-    "disk_cleanup_manager_unittest.cc",
-    "fidl/serialization_size_unittest.cc",
-    "ledger_manager_unittest.cc",
-    "ledger_repository_factory_impl_unittest.cc",
-    "ledger_repository_impl_unittest.cc",
-    "merging/common_ancestor_unittest.cc",
-    "merging/conflict_resolver_client_unittest.cc",
-    "merging/merge_resolver_unittest.cc",
-    "merging/test_utils.cc",
-    "merging/test_utils.h",
-    "page_eviction_manager_impl_unittest.cc",
-    "page_eviction_policies_unittest.cc",
-    "page_impl_unittest.cc",
-    "page_manager_unittest.cc",
-    "page_usage_db_unittest.cc",
-    "sync_watcher_set_unittest.cc",
-  ]
-
-  deps = [
-    ":lib",
-    "//garnet/public/lib/backoff/testing",
-    "//garnet/public/lib/component/cpp:cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/cloud_sync/impl",
-    "//peridot/bin/ledger/cloud_sync/testing",
-    "//peridot/bin/ledger/encryption/fake",
-    "//peridot/bin/ledger/encryption/primitives",
-    "//peridot/bin/ledger/fidl/include:include",
-    "//peridot/bin/ledger/storage/fake:lib",
-    "//peridot/bin/ledger/storage/impl:lib",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/bin/ledger/storage/testing",
-    "//peridot/bin/ledger/sync_coordinator/public",
-    "//peridot/bin/ledger/sync_coordinator/testing",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/convert",
-    "//peridot/lib/scoped_tmpfs",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//third_party/googletest:gmock",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/app/app.cc b/bin/ledger/app/app.cc
deleted file mode 100644
index 864ae37..0000000
--- a/bin/ledger/app/app.cc
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <memory>
-#include <utility>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/backoff/exponential_backoff.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/unique_fd.h>
-#include <lib/fxl/log_settings_command_line.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <trace-provider/provider.h>
-#include <zircon/device/vfs.h>
-
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/ledger_repository_factory_impl.h"
-#include "peridot/bin/ledger/cobalt/cobalt.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/fidl/error_notifier.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/p2p_sync/impl/user_communicator_factory_impl.h"
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kNoStatisticsReportingFlag = "disable_reporting";
-constexpr fxl::StringView kFirebaseApiKeyFlag = "firebase_api_key";
-
-struct AppParams {
-  bool disable_statistics = false;
-  std::string firebase_api_key = "";
-};
-
-fit::deferred_action<fit::closure> SetupCobalt(
-    bool disable_statistics, async_dispatcher_t* dispatcher,
-    component::StartupContext* startup_context) {
-  if (disable_statistics) {
-    return fit::defer<fit::closure>([] {});
-  }
-  return InitializeCobalt(dispatcher, startup_context);
-};
-
-// App is the main entry point of the Ledger application.
-//
-// It is responsible for setting up the LedgerRepositoryFactory, which connects
-// clients to individual Ledger instances. It should not however hold long-lived
-// objects shared between Ledger instances, as we need to be able to put them in
-// separate processes when the app becomes multi-instance.
-class App : public ledger_internal::LedgerController {
- public:
-  explicit App(AppParams app_params)
-      : app_params_(app_params),
-        loop_(&kAsyncLoopConfigAttachToThread),
-        io_loop_(&kAsyncLoopConfigNoAttachToThread),
-        trace_provider_(loop_.dispatcher()),
-        startup_context_(component::StartupContext::CreateFromStartupInfo()),
-        cobalt_cleaner_(SetupCobalt(app_params_.disable_statistics,
-                                    loop_.dispatcher(),
-                                    startup_context_.get())) {
-    FXL_DCHECK(startup_context_);
-
-    ReportEvent(CobaltEvent::LEDGER_STARTED);
-  }
-  ~App() override {}
-
-  bool Start() {
-    io_loop_.StartThread("io thread");
-
-    EnvironmentBuilder builder;
-
-    if (!app_params_.firebase_api_key.empty()) {
-      builder.SetFirebaseApiKey(app_params_.firebase_api_key);
-    }
-
-    environment_ = std::make_unique<Environment>(
-        builder.SetDisableStatistics(app_params_.disable_statistics)
-            .SetAsync(loop_.dispatcher())
-            .SetIOAsync(io_loop_.dispatcher())
-            .SetStartupContext(startup_context_.get())
-            .Build());
-    auto user_communicator_factory =
-        std::make_unique<p2p_sync::UserCommunicatorFactoryImpl>(
-            environment_.get());
-
-    factory_impl_ = std::make_unique<LedgerRepositoryFactoryImpl>(
-        environment_.get(), std::move(user_communicator_factory),
-        *startup_context_->outgoing().object_dir());
-
-    startup_context_->outgoing()
-        .AddPublicService<ledger_internal::LedgerRepositoryFactory>(
-            [this](
-                fidl::InterfaceRequest<ledger_internal::LedgerRepositoryFactory>
-                    request) {
-              factory_bindings_.emplace(factory_impl_.get(),
-                                        std::move(request));
-            });
-    startup_context_->outgoing().AddPublicService<LedgerController>(
-        [this](fidl::InterfaceRequest<LedgerController> request) {
-          controller_bindings_.AddBinding(this, std::move(request));
-        });
-
-    startup_context_->outgoing().object_dir()->set_prop(
-        "statistic_gathering", app_params_.disable_statistics ? "off" : "on");
-
-    startup_context_->outgoing().object_dir()->set_children_callback(
-        {kRepositoriesInspectPathComponent},
-        [this](component::Object::ObjectVector* out) {
-          factory_impl_->GetChildren(out);
-        });
-
-    loop_.Run();
-
-    startup_context_->outgoing().object_dir()->set_children_callback(
-        {kRepositoriesInspectPathComponent}, nullptr);
-
-    return true;
-  }
-
- private:
-  // LedgerController:
-  void Terminate() override { loop_.Quit(); }
-
-  const AppParams app_params_;
-  async::Loop loop_;
-  async::Loop io_loop_;
-  trace::TraceProvider trace_provider_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  fit::deferred_action<fit::closure> cobalt_cleaner_;
-  std::unique_ptr<Environment> environment_;
-  std::unique_ptr<LedgerRepositoryFactoryImpl> factory_impl_;
-  callback::AutoCleanableSet<ErrorNotifierBinding<
-      fuchsia::ledger::internal::LedgerRepositoryFactoryErrorNotifierDelegate>>
-      factory_bindings_;
-  fidl::BindingSet<LedgerController> controller_bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(App);
-};
-
-int Main(int argc, const char** argv) {
-  const auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  fxl::SetLogSettingsFromCommandLine(command_line);
-
-  AppParams app_params;
-  app_params.disable_statistics =
-      command_line.HasOption(kNoStatisticsReportingFlag);
-  if (command_line.HasOption(kFirebaseApiKeyFlag)) {
-    if (!command_line.GetOptionValue(kFirebaseApiKeyFlag,
-                                     &app_params.firebase_api_key)) {
-      FXL_LOG(ERROR) << "Unable to retrieve the firebase api key.";
-      return 1;
-    }
-  }
-
-  App app(app_params);
-  if (!app.Start()) {
-    return 1;
-  }
-
-  return 0;
-}
-
-}  // namespace
-}  // namespace ledger
-
-int main(int argc, const char** argv) { return ledger::Main(argc, argv); }
diff --git a/bin/ledger/app/branch_tracker.cc b/bin/ledger/app/branch_tracker.cc
deleted file mode 100644
index 7695096..0000000
--- a/bin/ledger/app/branch_tracker.cc
+++ /dev/null
@@ -1,398 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/branch_tracker.h"
-
-#include <vector>
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/app/diff_utils.h"
-#include "peridot/bin/ledger/app/fidl/serialization_size.h"
-#include "peridot/bin/ledger/app/page_manager.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-
-namespace ledger {
-class BranchTracker::PageWatcherContainer {
- public:
-  PageWatcherContainer(coroutine::CoroutineService* coroutine_service,
-                       PageWatcherPtr watcher, PageManager* page_manager,
-                       storage::PageStorage* storage,
-                       std::unique_ptr<const storage::Commit> base_commit,
-                       std::string key_prefix)
-      : change_in_flight_(false),
-        last_commit_(std::move(base_commit)),
-        coroutine_service_(coroutine_service),
-        key_prefix_(std::move(key_prefix)),
-        manager_(page_manager),
-        storage_(storage),
-        interface_(std::move(watcher)),
-        weak_factory_(this) {
-    interface_.set_error_handler([this](zx_status_t status) {
-      if (handler_) {
-        handler_->Resume(coroutine::ContinuationStatus::INTERRUPTED);
-      }
-      FXL_DCHECK(!handler_);
-      if (on_empty_callback_) {
-        on_empty_callback_();
-      }
-    });
-  }
-
-  ~PageWatcherContainer() {
-    if (on_drained_) {
-      on_drained_();
-    }
-    if (handler_) {
-      handler_->Resume(coroutine::ContinuationStatus::INTERRUPTED);
-    }
-    FXL_DCHECK(!handler_);
-  }
-
-  void set_on_empty(fit::closure on_empty_callback) {
-    on_empty_callback_ = std::move(on_empty_callback);
-  }
-
-  void UpdateCommit(std::unique_ptr<const storage::Commit> commit) {
-    current_commit_ = std::move(commit);
-    SendCommit();
-  }
-
-  // Sets a callback to be called when all pending updates are sent. If all
-  // updates are already sent, the callback will be called immediately. This
-  // callback will only be called once; |SetOnDrainedCallback| should be called
-  // again to set a new callback after the first one is called. Setting a
-  // callback while a previous one is still active will execute the previous
-  // callback.
-  void SetOnDrainedCallback(fit::closure on_drained) {
-    // If a transaction is committed or rolled back before all watchers have
-    // been drained, we do not want to continue blocking until they drain. Thus,
-    // we declare them drained right away and proceed.
-    if (on_drained_) {
-      on_drained_();
-      on_drained_ = nullptr;
-    }
-    on_drained_ = std::move(on_drained);
-    if (Drained() && on_drained_) {
-      on_drained_();
-      on_drained_ = nullptr;
-    }
-  }
-
- private:
-  // Returns true if all changes have been sent to the watcher client, false
-  // otherwise.
-  bool Drained() {
-    return !current_commit_ ||
-           last_commit_->GetId() == current_commit_->GetId();
-  }
-
-  std::vector<PageChange> PaginateChanges(PageChangePtr change) {
-    std::vector<PageChange> changes;
-
-    // These are initialized to valid values in the first run of the loop.
-    size_t fidl_size = -1;
-    size_t handle_count = -1;
-    size_t timestamp = change->timestamp;
-    auto entries = std::move(change->changed_entries);
-    auto deletions = std::move(change->deleted_keys);
-    for (size_t i = 0, j = 0; i < entries.size() || j < deletions.size();) {
-      bool add_entry = i < entries.size() &&
-                       (j == deletions.size() ||
-                        convert::ExtendedStringView(entries.at(i).key) <
-                            convert::ExtendedStringView(deletions.at(j)));
-      size_t entry_size =
-          add_entry
-              ? fidl_serialization::GetEntrySize(entries.at(i).key.size())
-              : fidl_serialization::GetByteVectorSize(deletions.at(j).size());
-      size_t entry_handle_count = add_entry ? 1 : 0;
-
-      if (changes.empty() ||
-          fidl_size + entry_size > fidl_serialization::kMaxInlineDataSize ||
-          handle_count + entry_handle_count >
-              fidl_serialization::kMaxMessageHandles) {
-        PageChange change;
-        change.timestamp = timestamp;
-        change.changed_entries.resize(0);
-        change.deleted_keys.resize(0);
-        changes.push_back(std::move(change));
-        fidl_size = fidl_serialization::kPageChangeHeaderSize;
-        handle_count = 0u;
-      }
-      fidl_size += entry_size;
-      handle_count += entry_handle_count;
-      if (add_entry) {
-        changes.back().changed_entries.push_back(std::move(entries.at(i)));
-        ++i;
-      } else {
-        changes.back().deleted_keys.push_back(std::move(deletions.at(j)));
-        ++j;
-      }
-    }
-    return changes;
-  }
-
-  void SendChange(PageChange page_change, ResultState state,
-                  std::unique_ptr<const storage::Commit> new_commit,
-                  fit::closure on_done) {
-    interface_->OnChange(
-        std::move(page_change), state,
-        [this, state, new_commit = std::move(new_commit),
-         on_done = std::move(on_done)](
-            fidl::InterfaceRequest<PageSnapshot> snapshot_request) mutable {
-          if (snapshot_request) {
-            manager_->BindPageSnapshot(
-                new_commit->Clone(), std::move(snapshot_request), key_prefix_);
-          }
-          if (state != ResultState::COMPLETED &&
-              state != ResultState::PARTIAL_COMPLETED) {
-            on_done();
-            return;
-          }
-          change_in_flight_ = false;
-          last_commit_.swap(new_commit);
-          // SendCommit will start handling the following commit, so we need
-          // to make sure on_done() is called before that.
-          on_done();
-          SendCommit();
-        });
-  }
-
-  // Sends a commit to the watcher if needed.
-  void SendCommit() {
-    if (change_in_flight_) {
-      return;
-    }
-
-    if (Drained()) {
-      if (on_drained_) {
-        on_drained_();
-        on_drained_ = nullptr;
-      }
-      return;
-    }
-
-    change_in_flight_ = true;
-
-    // TODO(etiennej): See LE-74: clean object ownership
-    diff_utils::ComputePageChange(
-        storage_, *last_commit_, *current_commit_, key_prefix_, key_prefix_,
-        diff_utils::PaginationBehavior::NO_PAGINATION,
-        callback::MakeScoped(
-            weak_factory_.GetWeakPtr(),
-            [this, new_commit = std::move(current_commit_)](
-                Status status,
-                std::pair<PageChangePtr, std::string> page_change_ptr) mutable {
-              if (status != Status::OK) {
-                // This change notification is abandonned. At the next commit,
-                // we will try again (but not before). The next notification
-                // will cover both this change and the next.
-                FXL_LOG(ERROR)
-                    << "Unable to compute PageChange for Watch update.";
-                change_in_flight_ = false;
-                return;
-              }
-
-              if (!page_change_ptr.first) {
-                change_in_flight_ = false;
-                last_commit_.swap(new_commit);
-                SendCommit();
-                return;
-              }
-              std::vector<PageChange> paginated_changes =
-                  PaginateChanges(std::move(page_change_ptr.first));
-              if (paginated_changes.size() == 1) {
-                SendChange(std::move(paginated_changes[0]),
-                           ResultState::COMPLETED, std::move(new_commit),
-                           [] {});
-                return;
-              }
-              coroutine_service_->StartCoroutine(
-                  [this, new_commit = std::move(new_commit),
-                   paginated_changes = std::move(paginated_changes)](
-                      coroutine::CoroutineHandler* handler) mutable {
-                    auto guard = fit::defer([this] { handler_ = nullptr; });
-                    FXL_DCHECK(!handler_);
-                    handler_ = handler;
-                    for (size_t i = 0; i < paginated_changes.size(); ++i) {
-                      ResultState state;
-                      if (i == 0) {
-                        state = ResultState::PARTIAL_STARTED;
-                      } else if (i == paginated_changes.size() - 1) {
-                        state = ResultState::PARTIAL_COMPLETED;
-                      } else {
-                        state = ResultState::PARTIAL_CONTINUED;
-                      }
-                      if (coroutine::SyncCall(
-                              handler,
-                              [this, change = std::move(paginated_changes[i]),
-                               state, new_commit = new_commit->Clone()](
-                                  fit::closure on_done) mutable {
-                                SendChange(std::move(change), state,
-                                           std::move(new_commit),
-                                           std::move(on_done));
-                              }) ==
-                          coroutine::ContinuationStatus::INTERRUPTED) {
-                        return;
-                      }
-                    }
-                  });
-            }));
-  }
-
-  fit::closure on_drained_ = nullptr;
-  fit::closure on_empty_callback_ = nullptr;
-  bool change_in_flight_;
-  std::unique_ptr<const storage::Commit> last_commit_;
-  std::unique_ptr<const storage::Commit> current_commit_;
-  coroutine::CoroutineService* coroutine_service_;
-  coroutine::CoroutineHandler* handler_ = nullptr;
-  const std::string key_prefix_;
-  PageManager* manager_;
-  storage::PageStorage* storage_;
-  PageWatcherPtr interface_;
-
-  // This must be the last member of the class.
-  fxl::WeakPtrFactory<PageWatcherContainer> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageWatcherContainer);
-};
-
-BranchTracker::BranchTracker(coroutine::CoroutineService* coroutine_service,
-                             PageManager* manager,
-                             storage::PageStorage* storage)
-    : coroutine_service_(coroutine_service),
-      manager_(manager),
-      storage_(storage),
-      transaction_in_progress_(false),
-      current_commit_(nullptr),
-      weak_factory_(this) {
-  watchers_.set_on_empty([this] { CheckEmpty(); });
-}
-
-BranchTracker::~BranchTracker() { storage_->RemoveCommitWatcher(this); }
-
-void BranchTracker::Init(fit::function<void(Status)> on_done) {
-  storage_->GetHeadCommitIds(callback::MakeScoped(
-      weak_factory_.GetWeakPtr(),
-      [this, on_done = std::move(on_done)](
-          storage::Status status, std::vector<storage::CommitId> commit_ids) {
-        if (status != storage::Status::OK) {
-          on_done(PageUtils::ConvertStatus(status));
-          return;
-        }
-
-        FXL_DCHECK(!commit_ids.empty());
-        InitCommitAndSetWatcher(std::move(commit_ids[0]));
-
-        on_done(Status::OK);
-      }));
-}
-
-void BranchTracker::set_on_empty(fit::closure on_empty_callback) {
-  on_empty_callback_ = std::move(on_empty_callback);
-}
-
-const storage::CommitId& BranchTracker::GetBranchHeadId() {
-  return current_commit_id_;
-}
-
-void BranchTracker::OnNewCommits(
-    const std::vector<std::unique_ptr<const storage::Commit>>& commits,
-    storage::ChangeSource /*source*/) {
-  bool changed = false;
-  const std::unique_ptr<const storage::Commit>* new_current_commit = nullptr;
-  for (const auto& commit : commits) {
-    if (commit->GetId() == current_commit_id_) {
-      continue;
-    }
-    // This assumes commits are received in (partial) order. If the commit
-    // doesn't have current_commit_id_ as a parent it is not part of this branch
-    // and should be ignored.
-    std::vector<storage::CommitIdView> parent_ids = commit->GetParentIds();
-    if (std::find(parent_ids.begin(), parent_ids.end(), current_commit_id_) ==
-        parent_ids.end()) {
-      continue;
-    }
-    changed = true;
-    current_commit_id_ = commit->GetId();
-    new_current_commit = &commit;
-  }
-  if (changed) {
-    current_commit_ = (*new_current_commit)->Clone();
-  }
-
-  if (!changed || transaction_in_progress_) {
-    return;
-  }
-  for (auto& watcher : watchers_) {
-    watcher.UpdateCommit(current_commit_->Clone());
-  }
-}
-
-void BranchTracker::StartTransaction(fit::closure watchers_drained_callback) {
-  FXL_DCHECK(!transaction_in_progress_);
-  transaction_in_progress_ = true;
-  auto waiter = fxl::MakeRefCounted<callback::CompletionWaiter>();
-  for (auto& watcher : watchers_) {
-    watcher.SetOnDrainedCallback(waiter->NewCallback());
-  }
-  waiter->Finalize(std::move(watchers_drained_callback));
-}
-
-void BranchTracker::StopTransaction(
-    std::unique_ptr<const storage::Commit> commit) {
-  FXL_DCHECK(transaction_in_progress_ || !commit);
-
-  if (!transaction_in_progress_) {
-    return;
-  }
-  transaction_in_progress_ = false;
-
-  if (commit) {
-    current_commit_id_ = commit->GetId();
-    current_commit_ = std::move(commit);
-  }
-
-  if (!current_commit_) {
-    // current_commit_ has a null value only if OnNewCommits has neven been
-    // called. Here we are in the case where a transaction stops, but no new
-    // commits have arrived in between: there is no need to update the watchers.
-    return;
-  }
-
-  for (auto& watcher : watchers_) {
-    watcher.SetOnDrainedCallback(nullptr);
-    watcher.UpdateCommit(current_commit_->Clone());
-  }
-}
-
-void BranchTracker::RegisterPageWatcher(
-    PageWatcherPtr page_watcher_ptr,
-    std::unique_ptr<const storage::Commit> base_commit,
-    std::string key_prefix) {
-  watchers_.emplace(coroutine_service_, std::move(page_watcher_ptr), manager_,
-                    storage_, std::move(base_commit), std::move(key_prefix));
-}
-
-bool BranchTracker::IsEmpty() { return watchers_.empty(); }
-
-void BranchTracker::InitCommitAndSetWatcher(storage::CommitId commit_id) {
-  // current_commit_ will be updated to have a correct value after the first
-  // Commit received in OnNewCommits or StopTransaction.
-  FXL_DCHECK(!current_commit_);
-  current_commit_id_ = std::move(commit_id);
-  storage_->AddCommitWatcher(this);
-}
-
-void BranchTracker::CheckEmpty() {
-  if (on_empty_callback_ && IsEmpty())
-    on_empty_callback_();
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/branch_tracker.h b/bin/ledger/app/branch_tracker.h
deleted file mode 100644
index fc1707c..0000000
--- a/bin/ledger/app/branch_tracker.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_BRANCH_TRACKER_H_
-#define PERIDOT_BIN_LEDGER_APP_BRANCH_TRACKER_H_
-
-#include <memory>
-
-#include <lib/callback/auto_cleanable.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/app/page_snapshot_impl.h"
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/storage/public/commit_watcher.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-class PageManager;
-
-// Tracks the head of a commit "branch". A commit is chosen arbitrarily from the
-// page's head commits at construction. Subsequently, this object will track the
-// head of this commit branch, unless reset by |SetBranchHead|. If two commits
-// have the same parent, the first one to be received will be tracked.
-class BranchTracker : public storage::CommitWatcher {
- public:
-  BranchTracker(coroutine::CoroutineService* coroutine_service,
-                PageManager* manager, storage::PageStorage* storage);
-  ~BranchTracker() override;
-
-  void Init(fit::function<void(Status)> on_done);
-
-  void set_on_empty(fit::closure on_empty_callback);
-
-  // Returns the head commit of the currently tracked branch.
-  const storage::CommitId& GetBranchHeadId();
-
-  // Registers a new PageWatcher interface.
-  void RegisterPageWatcher(PageWatcherPtr page_watcher_ptr,
-                           std::unique_ptr<const storage::Commit> base_commit,
-                           std::string key_prefix);
-
-  // Informs the BranchTracker that a transaction is in progress. It first
-  // drains all pending Watcher updates, then stops sending them until
-  // |StopTransaction| is called. |watchers_drained_callback| is called when all
-  // watcher updates have been processed by the clients. This should be used by
-  // |PageDelegate| when a transaction is in progress.
-  void StartTransaction(fit::closure watchers_drained_callback);
-
-  // Informs the BranchTracker that a transaction is no longer in progress.
-  // Resumes sending updates to registered watchers. This should be used by
-  // |PageDelegate| when a transaction is committed or rolled back.
-  // |commit| must be the one created by the transaction if it was committed, or
-  // nullptr otherwise.
-  void StopTransaction(std::unique_ptr<const storage::Commit> commit);
-
-  // Returns true if there are no watchers registered.
-  bool IsEmpty();
-
- private:
-  class PageWatcherContainer;
-
-  // storage::CommitWatcher:
-  void OnNewCommits(
-      const std::vector<std::unique_ptr<const storage::Commit>>& commits,
-      storage::ChangeSource source) override;
-
-  void InitCommitAndSetWatcher(storage::CommitId commit_id);
-
-  void CheckEmpty();
-
-  coroutine::CoroutineService* coroutine_service_;
-  PageManager* manager_;
-  storage::PageStorage* storage_;
-  callback::AutoCleanableSet<PageWatcherContainer> watchers_;
-  fit::closure on_empty_callback_;
-
-  bool transaction_in_progress_;
-  // The following two variables hold the commit object and id correspondingly
-  // of the commit tracked by this BranchTracker. |current_commit_| is used
-  // for notifying the watchers. On initialization, |current_commit_id_| is set
-  // to track the first head as returned from PageStorage. |current_commit_| at
-  // that point equals nullptr and is only updated with a valid Commit,
-  // corresponding to the tracked id, after the first call to OnNewCommits or
-  // StopTransaction. Since the notifications are sent to the watchers only
-  // after updating the tracked commit, the value of the |current_commit_| at
-  // initialization (which is set to nullptr) is not necessary.
-  std::unique_ptr<const storage::Commit> current_commit_;
-  storage::CommitId current_commit_id_;
-
-  // This must be the last member of the class.
-  fxl::WeakPtrFactory<BranchTracker> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(BranchTracker);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_BRANCH_TRACKER_H_
diff --git a/bin/ledger/app/constants.cc b/bin/ledger/app/constants.cc
deleted file mode 100644
index 194ad95..0000000
--- a/bin/ledger/app/constants.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/constants.h"
-
-#include <string>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-
-namespace ledger {
-
-namespace {
-const char kNullPageId[::fuchsia::ledger::kPageIdSize] = {};
-}  // namespace
-
-// The zero-initialized root id.
-constexpr fxl::StringView kRootPageId(kNullPageId,
-                                      ::fuchsia::ledger::kPageIdSize);
-
-}  // namespace ledger
diff --git a/bin/ledger/app/constants.h b/bin/ledger/app/constants.h
deleted file mode 100644
index cc84c4c..0000000
--- a/bin/ledger/app/constants.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_CONSTANTS_H_
-#define PERIDOT_BIN_LEDGER_APP_CONSTANTS_H_
-
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-
-// The maximum key size.
-inline constexpr size_t kMaxKeySize = 256;
-
-// The root Page ID.
-extern const fxl::StringView kRootPageId;
-
-// Filename under which the server id used to sync a given user is stored within
-// the repository dir of that user.
-inline constexpr fxl::StringView kServerIdFilename = "server_id";
-
-// The serialization version of PageUsage DB.
-inline constexpr fxl::StringView kPageUsageDbSerializationVersion = "1";
-
-inline constexpr char kRepositoriesInspectPathComponent[] = "repositories";
-inline constexpr char kRequestsInspectPathComponent[] = "requests";
-inline constexpr char kLedgersInspectPathComponent[] = "ledgers";
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_CONSTANTS_H_
diff --git a/bin/ledger/app/delaying_facade.h b/bin/ledger/app/delaying_facade.h
deleted file mode 100644
index 4da1d0c..0000000
--- a/bin/ledger/app/delaying_facade.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_DELAYING_FACADE_H_
-#define PERIDOT_BIN_LEDGER_APP_DELAYING_FACADE_H_
-
-#include <tuple>
-#include <vector>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/functional/apply.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-
-namespace ledger {
-
-// A delaying facade.
-//
-// Stores the methods to be called on an object, together with their arguments,
-// once that object becomes available. An example of usage is the following:
-//
-// For an object of type SomeClass:
-//     class SomeClass {
-//       void doSomething(int a, string b);
-//     };
-//
-// We would declare a DelayingFacade:
-//    DelayingFacade<SomeClass> df;
-//    df.EnqueueCall(&SomeClass::doSomething, 100, "foo");
-//    df.EnqueueCall(&SomeClass::doSomething, 200, "bar");
-//    // None of the above is executed, yet.
-//
-//    SomeClass object;
-//    df.SetTargetObject(&object); // All previous operations are now executed.
-//
-//    // The operations following a SetTargetObject are executed immediately.
-//    df.EnqueueCall(&SomeClass::doSomething, 300, "baz");
-template <typename A>
-class DelayingFacade {
- public:
-  // Adds a method to be called on an object, with the given arguments, once
-  // that object becomes available. If the target object was previously set, the
-  // method will be called directly.
-  template <typename... Args>
-  void EnqueueCall(void (A::*function_pointer)(Args...), Args... args) {
-    if (object_) {
-      (object_->*function_pointer)(std::forward<Args>(args)...);
-      return;
-    }
-    delayed_calls_.push_back(
-        [function_pointer,
-         tuple = std::make_tuple(std::forward<Args>(args)...)](A* a) mutable {
-          fxl::Apply(
-              [&](auto... args) {
-                (a->*function_pointer)(std::forward<Args>(args)...);
-              },
-              std::move(tuple));
-        });
-  }
-
-  // Sets the target object on which all methods will be executed. This includes
-  // methods added from previous calls to Front, and also all future ones.
-  void SetTargetObject(A* object) {
-    // Check that the object was not set before.
-    FXL_DCHECK(!object_);
-    FXL_DCHECK(object);
-    object_ = object;
-    auto calls = std::move(delayed_calls_);
-    for (auto& f : calls) {
-      f(object);
-    }
-  }
-
- private:
-  std::vector<fit::function<void(A*)>> delayed_calls_;
-  A* object_ = nullptr;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_DELAYING_FACADE_H_
diff --git a/bin/ledger/app/delaying_facade_unittest.cc b/bin/ledger/app/delaying_facade_unittest.cc
deleted file mode 100644
index 9714aad..0000000
--- a/bin/ledger/app/delaying_facade_unittest.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/delaying_facade.h"
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-
-namespace ledger {
-namespace {
-
-using ::testing::ElementsAre;
-using ::testing::IsEmpty;
-using ::testing::SizeIs;
-
-class Foo {
- public:
-  void AddNumber(int i) { numbers.push_back(i); }
-
-  void AddUniqueNumber(std::unique_ptr<int> i) {
-    unique_numbers.push_back(std::move(i));
-  }
-
-  std::vector<int> numbers;
-  std::vector<std::unique_ptr<int>> unique_numbers;
-};
-
-TEST(DelayingFacadeTest, CallOrder) {
-  Foo foo;
-  DelayingFacade<Foo> delayed_foo;
-
-  // None of the operations should be executed before the object is set.
-  delayed_foo.EnqueueCall(&Foo::AddNumber, 0);
-  EXPECT_THAT(foo.numbers, IsEmpty());
-  foo.AddNumber(1);
-  EXPECT_THAT(foo.numbers, ElementsAre(1));
-
-  delayed_foo.EnqueueCall(&Foo::AddNumber, 2);
-  EXPECT_THAT(foo.numbers, ElementsAre(1));
-  foo.AddNumber(3);
-  EXPECT_THAT(foo.numbers, ElementsAre(1, 3));
-
-  // Set foo as the object, and expect that the previous delayed operations are
-  // executed.
-  delayed_foo.SetTargetObject(&foo);
-  EXPECT_THAT(foo.numbers, ElementsAre(1, 3, 0, 2));
-
-  // All following operations on delayed_foo should be executed immediately.
-  delayed_foo.EnqueueCall(&Foo::AddNumber, 4);
-  EXPECT_THAT(foo.numbers, ElementsAre(1, 3, 0, 2, 4));
-  foo.AddNumber(5);
-  EXPECT_THAT(foo.numbers, ElementsAre(1, 3, 0, 2, 4, 5));
-  delayed_foo.EnqueueCall(&Foo::AddNumber, 6);
-  EXPECT_THAT(foo.numbers, ElementsAre(1, 3, 0, 2, 4, 5, 6));
-}
-
-TEST(DelayingFacadeTest, CallWithNotCopyableObjects) {
-  Foo foo;
-  DelayingFacade<Foo> delayed_foo;
-
-  delayed_foo.EnqueueCall(&Foo::AddUniqueNumber, std::make_unique<int>(0));
-  EXPECT_THAT(foo.unique_numbers, IsEmpty());
-
-  delayed_foo.SetTargetObject(&foo);
-
-  EXPECT_THAT(foo.unique_numbers, SizeIs(1));
-  EXPECT_EQ(*foo.unique_numbers[0], 0);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/diff_utils.cc b/bin/ledger/app/diff_utils.cc
deleted file mode 100644
index d30e46e..0000000
--- a/bin/ledger/app/diff_utils.cc
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/diff_utils.h"
-
-#include <limits>
-#include <memory>
-#include <vector>
-
-#include <lib/callback/waiter.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/app/fidl/serialization_size.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/bin/ledger/storage/public/object.h"
-#include "peridot/lib/util/ptr.h"
-
-namespace ledger {
-namespace diff_utils {
-namespace {
-// Returns the key of a storage::ThreeWayChange object. This key is guaranteed
-// to be unique.
-const std::string& GetKey(const storage::ThreeWayChange& change) {
-  if (change.base) {
-    return change.base->key;
-  }
-  if (change.left) {
-    return change.left->key;
-  }
-  return change.right->key;
-}
-
-// Constructs a ValuePtr object from an entry. The contents of the ValuePtr will
-// be provided through the |waiter|.
-ValuePtr GetValueFromEntry(
-    storage::PageStorage* const storage,
-    const std::unique_ptr<storage::Entry>& entry,
-    fit::function<void(Status, fsl::SizedVmo)> callback) {
-  if (!entry) {
-    callback(Status::OK, fsl::SizedVmo());
-    return nullptr;
-  }
-  ValuePtr value = Value::New();
-  switch (entry->priority) {
-    case storage::KeyPriority::EAGER:
-      value->priority = Priority::EAGER;
-      break;
-    case storage::KeyPriority::LAZY:
-      value->priority = Priority::LAZY;
-      break;
-  }
-  PageUtils::ResolveObjectIdentifierAsBuffer(
-      storage, entry->object_identifier, 0u,
-      std::numeric_limits<int64_t>::max(),
-      storage::PageStorage::Location::LOCAL, Status::OK, std::move(callback));
-  return value;
-}
-
-// Returns true if the change is automatically mergeable, ie. is not
-// conflicting.
-bool IsMergeable(const storage::ThreeWayChange& change) {
-  return util::EqualPtr(change.base, change.left) ||
-         util::EqualPtr(change.base, change.right) ||
-         util::EqualPtr(change.left, change.right);
-}
-}  // namespace
-
-void ComputePageChange(
-    storage::PageStorage* storage, const storage::Commit& base,
-    const storage::Commit& other, std::string prefix_key, std::string min_key,
-    PaginationBehavior pagination_behavior,
-    fit::function<void(Status, std::pair<PageChangePtr, std::string>)>
-        callback) {
-  struct Context {
-    // The PageChangePtr to be returned through the callback.
-    PageChangePtr page_change = PageChange::New();
-    // The serialization size of all entries.
-    size_t fidl_size = fidl_serialization::kPageChangeHeaderSize;
-    // The number of handles.
-    size_t handles_count = 0u;
-    // The next token to be returned through the callback.
-    std::string next_token = "";
-  };
-
-  auto waiter =
-      fxl::MakeRefCounted<callback::Waiter<Status, fsl::SizedVmo>>(Status::OK);
-
-  auto context = std::make_unique<Context>();
-  context->page_change->timestamp = other.GetTimestamp().get();
-  context->page_change->changed_entries.resize(0);
-  context->page_change->deleted_keys.resize(0);
-
-  if (min_key < prefix_key) {
-    min_key = prefix_key;
-  }
-
-  // |on_next| is called for each change on the diff
-  auto on_next = [storage, waiter, prefix_key = std::move(prefix_key),
-                  context = context.get(),
-                  pagination_behavior](storage::EntryChange change) {
-    if (!PageUtils::MatchesPrefix(change.entry.key, prefix_key)) {
-      return false;
-    }
-    size_t entry_size =
-        change.deleted
-            ? fidl_serialization::GetByteVectorSize(change.entry.key.size())
-            : fidl_serialization::GetEntrySize(change.entry.key.size());
-    size_t entry_handle_count = change.deleted ? 0 : 1;
-    if (pagination_behavior == PaginationBehavior::BY_SIZE &&
-        (context->fidl_size + entry_size >
-             fidl_serialization::kMaxInlineDataSize ||
-         context->handles_count + entry_handle_count >
-             fidl_serialization::kMaxMessageHandles
-
-         )) {
-      context->next_token = change.entry.key;
-      return false;
-    }
-    context->fidl_size += entry_size;
-    context->handles_count += entry_handle_count;
-    if (change.deleted) {
-      context->page_change->deleted_keys.push_back(
-          convert::ToArray(change.entry.key));
-      return true;
-    }
-
-    Entry entry;
-    entry.key = convert::ToArray(change.entry.key);
-    entry.priority = change.entry.priority == storage::KeyPriority::EAGER
-                         ? Priority::EAGER
-                         : Priority::LAZY;
-    context->page_change->changed_entries.push_back(std::move(entry));
-    PageUtils::ResolveObjectIdentifierAsBuffer(
-        storage, change.entry.object_identifier, 0u,
-        std::numeric_limits<int64_t>::max(),
-        storage::PageStorage::Location::LOCAL, Status::OK,
-        waiter->NewCallback());
-    return true;
-  };
-
-  // |on_done| is called when the full diff is computed.
-  auto on_done = [waiter = std::move(waiter), context = std::move(context),
-                  callback =
-                      std::move(callback)](storage::Status status) mutable {
-    if (status != storage::Status::OK) {
-      FXL_LOG(ERROR) << "Unable to compute diff for PageChange: "
-                     << fidl::ToUnderlying(status);
-      callback(PageUtils::ConvertStatus(status), std::make_pair(nullptr, ""));
-      return;
-    }
-    if (context->page_change->changed_entries.empty()) {
-      if (context->page_change->deleted_keys.empty()) {
-        callback(Status::OK, std::make_pair(nullptr, ""));
-      } else {
-        callback(Status::OK,
-                 std::make_pair(std::move(context->page_change), ""));
-      }
-      return;
-    }
-
-    // We need to retrieve the values for each changed key/value pair in order
-    // to send it inside the PageChange object. |waiter| collates these
-    // asynchronous calls and |result_callback| processes them.
-    auto result_callback = [context = std::move(context),
-                            callback = std::move(callback)](
-                               Status status,
-                               std::vector<fsl::SizedVmo> results) mutable {
-      if (status != Status::OK) {
-        FXL_LOG(ERROR)
-            << "Error while reading changed values when computing PageChange: "
-            << fidl::ToUnderlying(status);
-        callback(status, std::make_pair(nullptr, ""));
-        return;
-      }
-      FXL_DCHECK(results.size() ==
-                 context->page_change->changed_entries.size());
-      for (size_t i = 0; i < results.size(); i++) {
-        FXL_DCHECK(results[i].vmo());
-        context->page_change->changed_entries.at(i).value =
-            fidl::MakeOptional(std::move(results[i]).ToTransport());
-      }
-      callback(Status::OK, std::make_pair(std::move(context->page_change),
-                                          std::move(context->next_token)));
-    };
-    waiter->Finalize(std::move(result_callback));
-  };
-  storage->GetCommitContentsDiff(base, other, std::move(min_key),
-                                 std::move(on_next), std::move(on_done));
-}
-
-void ComputeThreeWayDiff(
-    storage::PageStorage* storage, const storage::Commit& base,
-    const storage::Commit& left, const storage::Commit& right,
-    std::string prefix_key, std::string min_key, DiffType diff_type,
-    fit::function<void(Status,
-                       std::pair<std::vector<DiffEntry>, std::string>)>
-        callback) {
-  struct Context {
-    // The array to be returned through the callback.
-    std::vector<DiffEntry> changes;
-    // The serialization size of all entries.
-    size_t fidl_size = fidl_serialization::kVectorHeaderSize;
-    // The number of handles.
-    size_t handles_count = 0u;
-    // The next token to be returned through the callback.
-    std::string next_token = "";
-  };
-
-  // This waiter collects the values (as VMOs) for all changes that will be
-  // returned. As each |DiffEntry| struct has three values, we ensure that
-  // values are always returned in a specific order (base, left, right). Some
-  // values may be empty, to denote a lack of diff.
-  auto waiter =
-      fxl::MakeRefCounted<callback::Waiter<Status, fsl::SizedVmo>>(Status::OK);
-
-  auto context = std::make_unique<Context>();
-
-  if (min_key < prefix_key) {
-    min_key = prefix_key;
-  }
-
-  // |on_next| is called for each change on the diff
-  auto on_next = [storage, waiter, prefix_key = std::move(prefix_key),
-                  context = context.get(),
-                  diff_type](storage::ThreeWayChange change) mutable {
-    const std::string& key = GetKey(change);
-    if (!PageUtils::MatchesPrefix(key, prefix_key)) {
-      return false;
-    }
-    int number_of_values =
-        bool(change.base) + bool(change.left) + bool(change.right);
-    size_t diffentry_size =
-        fidl_serialization::GetDiffEntrySize(key.size(), number_of_values);
-    if (context->fidl_size + diffentry_size >
-            fidl_serialization::kMaxInlineDataSize ||
-        context->handles_count + number_of_values >
-            fidl_serialization::kMaxMessageHandles) {
-      context->next_token = key;
-      // Stop the iteration as we are over the message capacity.
-      return false;
-    }
-
-    if (diff_type == DiffType::CONFLICTING && IsMergeable(change)) {
-      // We are not interested in this change, continue to the next one.
-      return true;
-    }
-
-    context->fidl_size += diffentry_size;
-    context->handles_count += number_of_values;
-
-    DiffEntry diff_entry;
-    diff_entry.key = convert::ToArray(key);
-    diff_entry.base =
-        GetValueFromEntry(storage, change.base, waiter->NewCallback());
-    diff_entry.left =
-        GetValueFromEntry(storage, change.left, waiter->NewCallback());
-    diff_entry.right =
-        GetValueFromEntry(storage, change.right, waiter->NewCallback());
-    context->changes.push_back(std::move(diff_entry));
-    return true;
-  };
-
-  // |on_done| is called when the full diff is computed.
-  auto on_done = [waiter = std::move(waiter), context = std::move(context),
-                  callback =
-                      std::move(callback)](storage::Status status) mutable {
-    if (status != storage::Status::OK) {
-      FXL_LOG(ERROR) << "Unable to compute diff for PageChange: "
-                     << fidl::ToUnderlying(status);
-      callback(PageUtils::ConvertStatus(status),
-               std::make_pair(std::vector<DiffEntry>(), ""));
-      return;
-    }
-    if (context->changes.empty()) {
-      callback(Status::OK,
-               std::make_pair(std::vector<DiffEntry>(), ""));
-      return;
-    }
-
-    // We need to retrieve the values for each changed key/value pair in order
-    // to send it inside the PageChange object. |waiter| collates these
-    // asynchronous calls and |result_callback| processes them.
-    auto result_callback = [context = std::move(context),
-                            callback = std::move(callback)](
-                               Status status,
-                               std::vector<fsl::SizedVmo> results) mutable {
-      if (status != Status::OK) {
-        FXL_LOG(ERROR)
-            << "Error while reading changed values when computing PageChange: "
-            << fidl::ToUnderlying(status);
-        callback(status,
-                 std::make_pair(std::vector<DiffEntry>(), ""));
-        return;
-      }
-      FXL_DCHECK(results.size() == 3 * context->changes.size());
-      for (size_t i = 0; i < context->changes.size(); i++) {
-        if (results[3 * i]) {
-          context->changes.at(i).base->value =
-              fidl::MakeOptional(std::move(results[3 * i]).ToTransport());
-        }
-        if (results[3 * i + 1]) {
-          context->changes.at(i).left->value =
-              fidl::MakeOptional(std::move(results[3 * i + 1]).ToTransport());
-        }
-        if (results[3 * i + 2]) {
-          context->changes.at(i).right->value =
-              fidl::MakeOptional(std::move(results[3 * i + 2]).ToTransport());
-        }
-      }
-      callback(Status::OK, std::make_pair(std::move(context->changes),
-                                          std::move(context->next_token)));
-    };
-    waiter->Finalize(std::move(result_callback));
-  };
-  storage->GetThreeWayContentsDiff(base, left, right, std::move(min_key),
-                                   std::move(on_next), std::move(on_done));
-}
-
-}  // namespace diff_utils
-}  // namespace ledger
diff --git a/bin/ledger/app/diff_utils.h b/bin/ledger/app/diff_utils.h
deleted file mode 100644
index 9101239..0000000
--- a/bin/ledger/app/diff_utils.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_DIFF_UTILS_H_
-#define PERIDOT_BIN_LEDGER_APP_DIFF_UTILS_H_
-
-#include <functional>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-namespace diff_utils {
-
-// Configure the pagination behavior of |ComputePageChange|.
-enum class PaginationBehavior {
-  NO_PAGINATION,
-  BY_SIZE,
-};
-
-// Type of three-way diff performed. If |CONFLICTING| is selected, only
-// conflicting keys are returned.
-enum class DiffType {
-  FULL,
-  CONFLICTING,
-};
-
-// Asynchronously creates a PageChange representing the diff of the two provided
-// commits, starting from the given |min_key|. If |pagination_behavior| is
-// |NO_PAGINATION|, it provides all results. If |pagination_behavior| is
-// |BY_SIZE| it will provide a number of results that fit in a fidl message.
-// The result, or an error, will be provided in |callback| status. The second
-// argument of the callback is either a pair of the PageChangePtr, containing
-// the diff result and the string representation of the next token if the
-// result is paginated, or empty if there are no more results to return. Note
-// that the PageChangePtr in the callback will be nullptr if the diff is empty.
-void ComputePageChange(
-    storage::PageStorage* storage, const storage::Commit& base,
-    const storage::Commit& other, std::string prefix_key, std::string min_key,
-    PaginationBehavior pagination_behavior,
-    fit::function<void(Status, std::pair<PageChangePtr, std::string>)>
-        callback);
-
-// Asynchronously computes the three-way diff between a base commit and two
-// other commits, starting from the given |min_key|.
-void ComputeThreeWayDiff(
-    storage::PageStorage* storage, const storage::Commit& base,
-    const storage::Commit& left, const storage::Commit& right,
-    std::string prefix_key, std::string min_key, DiffType diff_type,
-    fit::function<void(Status,
-                       std::pair<std::vector<DiffEntry>, std::string>)>
-        callback);
-
-}  // namespace diff_utils
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_DIFF_UTILS_H_
diff --git a/bin/ledger/app/disk_cleanup_manager.h b/bin/ledger/app/disk_cleanup_manager.h
deleted file mode 100644
index 8469dfb..0000000
--- a/bin/ledger/app/disk_cleanup_manager.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_DISK_CLEANUP_MANAGER_H_
-#define PERIDOT_BIN_LEDGER_APP_DISK_CLEANUP_MANAGER_H_
-
-#include <lib/fxl/functional/closure.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/app/page_usage_listener.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-
-// Manages cleanup operations in Ledger.
-//
-// Implementations of DiskCleanupManager define the policies about when and how
-// each cleanup operation is executed in Ledger.
-class DiskCleanupManager {
- public:
-  DiskCleanupManager() {}
-  virtual ~DiskCleanupManager() {}
-
-  // Sets the callback to be called every time the DiskCleanupManager is empty.
-  virtual void set_on_empty(fit::closure on_empty_callback) = 0;
-
-  // Returns whether the DiskCleanupManager is empty, i.e. whether there are no
-  // pending operations.
-  virtual bool IsEmpty() = 0;
-
-  // Tries to free up disk space.
-  virtual void TryCleanUp(fit::function<void(Status)> callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(DiskCleanupManager);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_DISK_CLEANUP_MANAGER_H_
diff --git a/bin/ledger/app/disk_cleanup_manager_impl.cc b/bin/ledger/app/disk_cleanup_manager_impl.cc
deleted file mode 100644
index 0baecf4..0000000
--- a/bin/ledger/app/disk_cleanup_manager_impl.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/disk_cleanup_manager_impl.h"
-
-namespace ledger {
-
-DiskCleanupManagerImpl::DiskCleanupManagerImpl(Environment* environment,
-                                               storage::DbFactory* db_factory,
-                                               DetachedPath db_path)
-    : page_eviction_manager_(environment, db_factory, std::move(db_path)),
-      policy_(NewLeastRecentyUsedPolicy(environment->coroutine_service(),
-                                        &page_eviction_manager_)) {}
-
-DiskCleanupManagerImpl::~DiskCleanupManagerImpl() {}
-
-Status DiskCleanupManagerImpl::Init() { return page_eviction_manager_.Init(); }
-
-void DiskCleanupManagerImpl::SetPageEvictionDelegate(
-    PageEvictionManager::Delegate* delegate) {
-  page_eviction_manager_.SetDelegate(delegate);
-}
-
-void DiskCleanupManagerImpl::set_on_empty(fit::closure on_empty_callback) {
-  page_eviction_manager_.set_on_empty(std::move(on_empty_callback));
-}
-
-bool DiskCleanupManagerImpl::IsEmpty() {
-  return page_eviction_manager_.IsEmpty();
-}
-
-void DiskCleanupManagerImpl::TryCleanUp(fit::function<void(Status)> callback) {
-  page_eviction_manager_.TryEvictPages(policy_.get(), std::move(callback));
-}
-
-void DiskCleanupManagerImpl::OnPageOpened(fxl::StringView ledger_name,
-                                          storage::PageIdView page_id) {
-  page_eviction_manager_.MarkPageOpened(ledger_name, page_id);
-}
-
-void DiskCleanupManagerImpl::OnPageClosed(fxl::StringView ledger_name,
-                                          storage::PageIdView page_id) {
-  page_eviction_manager_.MarkPageClosed(ledger_name, page_id);
-}
-
-void DiskCleanupManagerImpl::OnPageUnused(fxl::StringView ledger_name,
-                                          storage::PageIdView page_id) {
-  page_eviction_manager_.TryEvictPage(
-      ledger_name, page_id, PageEvictionCondition::IF_EMPTY,
-      [ledger_name = ledger_name.ToString(), page_id = page_id.ToString()](
-          Status status, PageWasEvicted) {
-        if (status != Status::OK && status != Status::INTERNAL_ERROR) {
-          FXL_LOG(ERROR)
-              << "Failed to check if page is empty and/or evict it. Status: "
-              << fidl::ToUnderlying(status) << ". Ledger name: " << ledger_name
-              << ". Page ID: " << convert::ToHex(page_id);
-        }
-      });
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/disk_cleanup_manager_impl.h b/bin/ledger/app/disk_cleanup_manager_impl.h
deleted file mode 100644
index 17ff3e3..0000000
--- a/bin/ledger/app/disk_cleanup_manager_impl.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_DISK_CLEANUP_MANAGER_IMPL_H_
-#define PERIDOT_BIN_LEDGER_APP_DISK_CLEANUP_MANAGER_IMPL_H_
-
-#include "peridot/bin/ledger/app/disk_cleanup_manager.h"
-#include "peridot/bin/ledger/app/page_eviction_manager_impl.h"
-#include "peridot/bin/ledger/app/page_usage_listener.h"
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-#include "peridot/bin/ledger/storage/public/db_factory.h"
-
-namespace ledger {
-
-class DiskCleanupManagerImpl : public DiskCleanupManager,
-                               public PageUsageListener {
- public:
-  DiskCleanupManagerImpl(Environment* environment,
-                         storage::DbFactory* db_factory, DetachedPath db_path);
-  ~DiskCleanupManagerImpl() override;
-
-  // Initializes this DiskCleanupManagerImpl.
-  Status Init();
-
-  // Sets the delegate for PageEvictionManager owned by DiskCleanupManagerImpl.
-  // The delegate should outlive this object.
-  void SetPageEvictionDelegate(PageEvictionManager::Delegate* delegate);
-
-  // DiskCleanupManager:
-  void set_on_empty(fit::closure on_empty_callback) override;
-  bool IsEmpty() override;
-  void TryCleanUp(fit::function<void(Status)> callback) override;
-
-  // PageUsageListener:
-  void OnPageOpened(fxl::StringView ledger_name,
-                    storage::PageIdView page_id) override;
-  void OnPageClosed(fxl::StringView ledger_name,
-                    storage::PageIdView page_id) override;
-  void OnPageUnused(fxl::StringView ledger_name,
-                    storage::PageIdView page_id) override;
-
- private:
-  PageEvictionManagerImpl page_eviction_manager_;
-  std::unique_ptr<PageEvictionPolicy> policy_;
-
-  // TODO(nellyv): Add OnLowResources and OnPeriodicCleanUp to handle cleanup
-  // opeations on the corresponding cases.
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DiskCleanupManagerImpl);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_DISK_CLEANUP_MANAGER_IMPL_H_
diff --git a/bin/ledger/app/disk_cleanup_manager_unittest.cc b/bin/ledger/app/disk_cleanup_manager_unittest.cc
deleted file mode 100644
index a525448..0000000
--- a/bin/ledger/app/disk_cleanup_manager_unittest.cc
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/disk_cleanup_manager_impl.h"
-
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/storage/fake/fake_db_factory.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace ledger {
-namespace {
-
-using ::testing::ElementsAre;
-using ::testing::IsEmpty;
-
-class FakeDelegate : public PageEvictionManager::Delegate {
- public:
-  void PageIsClosedAndSynced(
-      fxl::StringView /*ledger_name*/, storage::PageIdView /*page_id*/,
-      fit::function<void(Status, PagePredicateResult)> callback) override {
-    callback(Status::OK, PagePredicateResult::YES);
-  }
-
-  void PageIsClosedOfflineAndEmpty(
-      fxl::StringView ledger_name, storage::PageIdView page_id,
-      fit::function<void(Status, PagePredicateResult)> callback) override {
-    callback(Status::OK, closed_offline_empty);
-  }
-
-  void DeletePageStorage(fxl::StringView /*ledger_name*/,
-                         storage::PageIdView page_id,
-                         fit::function<void(Status)> callback) override {
-    deleted_pages.push_back(page_id.ToString());
-    callback(Status::OK);
-  }
-
-  std::vector<storage::PageId> deleted_pages;
-
-  PagePredicateResult closed_offline_empty = PagePredicateResult::YES;
-};
-
-class DiskCleanupManagerTest : public TestWithEnvironment {
- public:
-  DiskCleanupManagerTest()
-      : db_factory_(environment_.dispatcher()),
-        disk_cleanup_manager_(&environment_, &db_factory_,
-                              DetachedPath(tmpfs_.root_fd())) {}
-
-  // gtest::TestLoopFixture:
-  void SetUp() override {
-    EXPECT_EQ(Status::OK, disk_cleanup_manager_.Init());
-    RunLoopUntilIdle();
-    disk_cleanup_manager_.SetPageEvictionDelegate(&delegate_);
-  }
-
- private:
-  scoped_tmpfs::ScopedTmpFS tmpfs_;
-  coroutine::CoroutineServiceImpl coroutine_service_;
-  storage::fake::FakeDbFactory db_factory_;
-
- protected:
-  FakeDelegate delegate_;
-  DiskCleanupManagerImpl disk_cleanup_manager_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DiskCleanupManagerTest);
-};
-
-TEST_F(DiskCleanupManagerTest, DontEvictNonEmptyPagesOnPageUnused) {
-  std::string ledger_name = "ledger";
-  storage::PageId page = std::string(::fuchsia::ledger::kPageIdSize, '1');
-
-  // The page cannot be evicted if its not empty and offline.
-  disk_cleanup_manager_.OnPageOpened(ledger_name, page);
-  delegate_.closed_offline_empty = PagePredicateResult::NO;
-  disk_cleanup_manager_.OnPageUnused(ledger_name, page);
-  RunLoopUntilIdle();
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-}
-
-TEST_F(DiskCleanupManagerTest, DontEvictUnknownEmptyPagesOnPageUnused) {
-  std::string ledger_name = "ledger";
-  storage::PageId page = std::string(::fuchsia::ledger::kPageIdSize, '1');
-
-  // The page cannot be evicted if we can't determine whether it is empty and
-  // offline.
-  disk_cleanup_manager_.OnPageOpened(ledger_name, page);
-  delegate_.closed_offline_empty = PagePredicateResult::PAGE_OPENED;
-  disk_cleanup_manager_.OnPageUnused(ledger_name, page);
-  RunLoopUntilIdle();
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-}
-
-TEST_F(DiskCleanupManagerTest, EvictEmptyOfflinePagesOnPageUnused) {
-  std::string ledger_name = "ledger";
-  storage::PageId page = std::string(::fuchsia::ledger::kPageIdSize, '1');
-
-  // The page should be evicted is it is empty and offline.
-  disk_cleanup_manager_.OnPageOpened(ledger_name, page);
-  delegate_.closed_offline_empty = PagePredicateResult::YES;
-  disk_cleanup_manager_.OnPageUnused(ledger_name, page);
-  RunLoopUntilIdle();
-  EXPECT_THAT(delegate_.deleted_pages, ElementsAre(page));
-}
-
-TEST_F(DiskCleanupManagerTest, DontEvictPagesOnPageClosed) {
-  std::string ledger_name = "ledger";
-  storage::PageId page = std::string(::fuchsia::ledger::kPageIdSize, '1');
-
-  disk_cleanup_manager_.OnPageOpened(ledger_name, page);
-  delegate_.closed_offline_empty = PagePredicateResult::YES;
-  disk_cleanup_manager_.OnPageClosed(ledger_name, page);
-  RunLoopUntilIdle();
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/fidl/serialization_size.cc b/bin/ledger/app/fidl/serialization_size.cc
deleted file mode 100644
index ca660a5..0000000
--- a/bin/ledger/app/fidl/serialization_size.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/fidl/serialization_size.h"
-
-namespace ledger {
-namespace fidl_serialization {
-
-size_t GetByteVectorSize(size_t vector_length) {
-  return Align(vector_length) + kVectorHeaderSize;
-}
-
-size_t GetEntrySize(size_t key_length) {
-  size_t key_size = GetByteVectorSize(key_length);
-  size_t object_size = Align(kMemoryObjectSize);
-  return key_size + object_size + Align(kPriorityEnumSize);
-}
-
-size_t GetInlinedEntrySize(const InlinedEntry& entry) {
-  size_t key_size = GetByteVectorSize(entry.key.size());
-  size_t object_size = kPointerSize;
-  if (entry.inlined_value) {
-    object_size += GetByteVectorSize(entry.inlined_value->value.size());
-  }
-  return key_size + object_size + Align(kPriorityEnumSize);
-}
-
-size_t GetDiffEntrySize(size_t key_length, int number_of_values) {
-  size_t key_size = GetByteVectorSize(key_length);
-  return key_size + number_of_values *
-                        (Align(kMemoryObjectSize) + Align(kPriorityEnumSize));
-}
-
-}  // namespace fidl_serialization
-}  //  namespace ledger
diff --git a/bin/ledger/app/fidl/serialization_size.h b/bin/ledger/app/fidl/serialization_size.h
deleted file mode 100644
index 165a205..0000000
--- a/bin/ledger/app/fidl/serialization_size.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_FIDL_SERIALIZATION_SIZE_H_
-#define PERIDOT_BIN_LEDGER_APP_FIDL_SERIALIZATION_SIZE_H_
-
-#include <stddef.h>
-
-#include <zircon/fidl.h>
-#include <zircon/types.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-
-namespace ledger {
-namespace fidl_serialization {
-
-// Maximal size of data that will be returned inline.
-inline constexpr size_t kMaxInlineDataSize = ZX_CHANNEL_MAX_MSG_BYTES * 9 / 10;
-inline constexpr size_t kMaxMessageHandles = ZX_CHANNEL_MAX_MSG_HANDLES;
-
-// TODO(mariagl): Remove dependency on FIDL internal structure layout, see
-// LE-449.
-inline constexpr size_t kPointerSize = sizeof(uintptr_t);
-inline constexpr size_t kStatusEnumSize = sizeof(int32_t);
-inline constexpr size_t kHandleSize = sizeof(zx_handle_t);
-inline constexpr size_t kVectorHeaderSize = sizeof(fidl_vector_t);
-inline constexpr size_t kPriorityEnumSize = sizeof(int32_t);
-inline constexpr size_t kMessageHeaderSize = sizeof(fidl_message_header_t);
-
-inline size_t Align(size_t n) { return FIDL_ALIGN(n); }
-
-// The overhead for storing the pointer, the timestamp (int64) and the two
-// arrays.
-inline constexpr size_t kPageChangeHeaderSize =
-    kPointerSize + sizeof(int64_t) + 2 * kVectorHeaderSize;
-
-// Returns the fidl size of a byte vector with the given length.
-size_t GetByteVectorSize(size_t vector_length);
-
-// Returns the fidl size of an Entry holding a key with the given length.
-size_t GetEntrySize(size_t key_length);
-
-// Returns the fidl size of an InlinedEntry.
-size_t GetInlinedEntrySize(const InlinedEntry& entry);
-
-// Size of an object stored in memory (and accessed by a handle).
-inline constexpr size_t kMemoryObjectSize = 2 * kPointerSize + kHandleSize;
-
-// Returns the size of a DiffEntry object
-size_t GetDiffEntrySize(size_t key_length, int number_of_values);
-
-}  // namespace fidl_serialization
-}  //  namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_FIDL_SERIALIZATION_SIZE_H_
diff --git a/bin/ledger/app/fidl/serialization_size_unittest.cc b/bin/ledger/app/fidl/serialization_size_unittest.cc
deleted file mode 100644
index a8002f7..0000000
--- a/bin/ledger/app/fidl/serialization_size_unittest.cc
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/fidl/serialization_size.h"
-
-#include <memory>
-
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/strings/string_printf.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace fidl_serialization {
-namespace {
-std::vector<uint8_t> GetKey(size_t index, size_t min_key_size = 0u) {
-  std::string result = fxl::StringPrintf("key %04" PRIuMAX, index);
-  result.resize(std::max(result.size(), min_key_size));
-  return convert::ToArray(result);
-}
-
-std::string GetValue(size_t index, size_t min_value_size = 0u) {
-  std::string result = fxl::StringPrintf("val %zu", index);
-  result.resize(std::max(result.size(), min_value_size));
-  return result;
-}
-
-::testing::AssertionResult CheckMessageSize(zx::channel channel,
-                                            size_t expected_bytes,
-                                            size_t expected_handles) {
-  uint32_t actual_bytes, actual_handles;
-  zx_status_t status =
-      channel.read(0, nullptr, 0, &actual_bytes, nullptr, 0, &actual_handles);
-  if (status != ZX_ERR_BUFFER_TOO_SMALL) {
-    return ::testing::AssertionFailure()
-           << "Channel read status = " << status
-           << ", expected ZX_ERR_BUFFER_TOO_SMALL (" << ZX_ERR_BUFFER_TOO_SMALL
-           << ").";
-  }
-  EXPECT_EQ(expected_bytes, actual_bytes);
-  EXPECT_EQ(expected_handles, actual_handles);
-  if ((expected_bytes != actual_bytes) ||
-      (expected_handles != actual_handles)) {
-    return ::testing::AssertionFailure() << "Unexpected message size.";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-using SerializationSizeTest = gtest::TestLoopFixture;
-
-class FakeSnapshotImpl : public PageSnapshot {
- public:
-  FakeSnapshotImpl() {}
-  ~FakeSnapshotImpl() override {}
-
-  GetEntriesInlineCallback get_entries_inline_callback;
-  GetEntriesCallback get_entries_callback;
-  GetCallback get_callback;
-  GetInlineCallback get_inline_callback;
-
-  // PageSnapshot:
-  void GetEntriesInline(std::vector<uint8_t> /*key_start*/,
-                        std::unique_ptr<Token> /*token*/,
-                        GetEntriesInlineCallback callback) override {
-    get_entries_inline_callback = std::move(callback);
-  }
-
-  void GetEntries(std::vector<uint8_t> /*key_start*/,
-                  std::unique_ptr<Token> /*token*/,
-                  GetEntriesCallback callback) override {
-    get_entries_callback = std::move(callback);
-  }
-
-  void GetKeys(std::vector<uint8_t> /*key_start*/,
-               std::unique_ptr<Token> /*token*/,
-               GetKeysCallback /*callback*/) override {}
-
-  void Get(std::vector<uint8_t> /*key*/, GetCallback callback) override {
-    get_callback = std::move(callback);
-  }
-
-  void GetInline(std::vector<uint8_t> /*key*/,
-                 GetInlineCallback callback) override {
-    get_inline_callback = std::move(callback);
-  }
-
-  void Fetch(std::vector<uint8_t> /*key*/,
-             FetchCallback /*callback*/) override {
-    FXL_NOTIMPLEMENTED();
-  }
-
-  void FetchPartial(std::vector<uint8_t> /*key*/, int64_t /*offset*/,
-                    int64_t /*max_size*/,
-                    FetchPartialCallback /*callback*/) override {
-    FXL_NOTIMPLEMENTED();
-  }
-};
-
-TEST_F(SerializationSizeTest, GetInline) {
-  PageSnapshotPtr snapshot_proxy;
-  FakeSnapshotImpl snapshot_impl;
-
-  zx::channel writer, reader;
-  ASSERT_EQ(ZX_OK, zx::channel::create(0, &writer, &reader));
-
-  snapshot_proxy.Bind(std::move(reader));
-  fidl::Binding<PageSnapshot> binding(&snapshot_impl);
-  binding.Bind(std::move(writer));
-
-  const size_t key_size = 125;
-  const size_t value_size = 125;
-  std::vector<uint8_t> key = GetKey(0, key_size);
-  std::vector<uint8_t> value = convert::ToArray(GetValue(0, value_size));
-
-  auto client_callback = [](Status /*status*/,
-                            std::unique_ptr<InlinedValue> /*value*/) {};
-
-  // FakeSnapshot saves the callback instead of running it.
-  snapshot_proxy->GetInline(std::move(key), std::move(client_callback));
-  RunLoopUntilIdle();
-
-  fidl::InterfaceHandle<PageSnapshot> handle = snapshot_proxy.Unbind();
-  reader = handle.TakeChannel();
-
-  // Run the callback directly.
-  auto inlined_value = std::make_unique<InlinedValue>();
-  inlined_value->value = std::move(value);
-  snapshot_impl.get_inline_callback(Status::OK, std::move(inlined_value));
-
-  const size_t expected_bytes =
-      Align(kMessageHeaderSize + kPointerSize + GetByteVectorSize(value_size) +
-            kStatusEnumSize);
-  const size_t expected_handles = 0;
-  EXPECT_TRUE(
-      CheckMessageSize(std::move(reader), expected_bytes, expected_handles));
-}
-
-TEST_F(SerializationSizeTest, Get) {
-  PageSnapshotPtr snapshot_proxy;
-  FakeSnapshotImpl snapshot_impl;
-
-  zx::channel writer, reader;
-  ASSERT_EQ(ZX_OK, zx::channel::create(0, &writer, &reader));
-
-  snapshot_proxy.Bind(std::move(reader));
-  fidl::Binding<PageSnapshot> binding(&snapshot_impl);
-  binding.Bind(std::move(writer));
-
-  const size_t key_size = 8;
-  const size_t value_size = 125;
-  std::vector<uint8_t> key = GetKey(0, key_size);
-  std::string object_data = GetValue(0, value_size);
-  fsl::SizedVmo vmo;
-  ASSERT_TRUE(fsl::VmoFromString(object_data, &vmo));
-  fuchsia::mem::BufferPtr value =
-      fidl::MakeOptional(std::move(vmo).ToTransport());
-
-  auto client_callback = [](Status /*status*/,
-                            fuchsia::mem::BufferPtr /*value*/) {};
-  // FakeSnapshot saves the callback instead of running it.
-  snapshot_proxy->Get(std::move(key), std::move(client_callback));
-  RunLoopUntilIdle();
-
-  fidl::InterfaceHandle<PageSnapshot> handle = snapshot_proxy.Unbind();
-  reader = handle.TakeChannel();
-
-  // Run the callback directly.
-  snapshot_impl.get_callback(Status::OK, std::move(value));
-
-  const size_t expected_bytes =
-      Align(kMessageHeaderSize +  // Header.
-            kPointerSize +        // BufferPtr.
-            kPointerSize +        // Size.
-            Align(kHandleSize) +  // FIDL_HANDLE_PRESENT.
-            kStatusEnumSize       // Status.
-      );
-  const size_t expected_handles = 1;
-  EXPECT_TRUE(
-      CheckMessageSize(std::move(reader), expected_bytes, expected_handles));
-}
-
-TEST_F(SerializationSizeTest, GetEntriesInline) {
-  PageSnapshotPtr snapshot_proxy;
-  FakeSnapshotImpl snapshot_impl;
-  zx::channel writer, reader;
-  ASSERT_EQ(ZX_OK, zx::channel::create(0, &writer, &reader));
-
-  snapshot_proxy.Bind(std::move(reader));
-  fidl::Binding<PageSnapshot> binding(&snapshot_impl);
-  binding.Bind(std::move(writer));
-
-  auto client_callback = [](Status /*status*/,
-                            std::vector<InlinedEntry> /*entries*/,
-                            std::unique_ptr<Token> /*next_token*/) {};
-  // FakeSnapshot saves the callback instead of running it.
-  snapshot_proxy->GetEntriesInline(fidl::VectorPtr<uint8_t>::New(0), nullptr,
-                                   std::move(client_callback));
-  RunLoopUntilIdle();
-
-  fidl::InterfaceHandle<PageSnapshot> handle = snapshot_proxy.Unbind();
-  reader = handle.TakeChannel();
-
-  std::vector<InlinedEntry> entries_to_send;
-
-  const size_t key_size = 125;
-  const size_t value_size = 125;
-  const size_t n_entries = 7;
-  const size_t n_empty_entries = 7;
-  auto token = std::make_unique<Token>();
-  token->opaque_id = GetKey(0, key_size);
-  InlinedEntry entry;
-  entry.key = GetKey(0, key_size);
-  entry.inlined_value = std::make_unique<InlinedValue>();
-  entry.inlined_value->value = convert::ToArray(GetValue(0, value_size));
-  size_t kExpectedEntrySize = GetInlinedEntrySize(entry);
-  for (size_t i = 0; i < n_entries; i++) {
-    entries_to_send.push_back(fidl::Clone(entry));
-  }
-  InlinedEntry empty_entry;
-  empty_entry.key = GetKey(0, key_size);
-  for (size_t i = 0; i < n_empty_entries; i++) {
-    entries_to_send.push_back(fidl::Clone(empty_entry));
-  }
-  size_t kExpectedEmptyEntrySize = GetInlinedEntrySize(empty_entry);
-
-  // Run the callback directly.
-  snapshot_impl.get_entries_inline_callback(
-      Status::OK, std::move(entries_to_send), std::move(token));
-
-  const size_t expected_bytes =
-      Align(kMessageHeaderSize +                         // Header.
-            kVectorHeaderSize +                          // VectorPtr.
-            n_entries * kExpectedEntrySize +             // Vector of entries.
-            n_empty_entries * kExpectedEmptyEntrySize +  // Vector of entries.
-            kPointerSize +                 // Pointer to next_token.
-            GetByteVectorSize(key_size) +  // next_token.
-            kStatusEnumSize                // Status.
-      );
-  const size_t expected_handles = 0;
-  EXPECT_TRUE(
-      CheckMessageSize(std::move(reader), expected_bytes, expected_handles));
-}
-
-TEST_F(SerializationSizeTest, GetEntries) {
-  PageSnapshotPtr snapshot_proxy;
-  FakeSnapshotImpl snapshot_impl;
-  zx::channel writer, reader;
-  ASSERT_EQ(ZX_OK, zx::channel::create(0, &writer, &reader));
-
-  snapshot_proxy.Bind(std::move(reader));
-  fidl::Binding<PageSnapshot> binding(&snapshot_impl);
-  binding.Bind(std::move(writer));
-
-  auto client_callback = [](Status /*status*/,
-                            std::vector<Entry> /*entries*/,
-                            std::unique_ptr<Token> /*next_token*/) {};
-  // FakeSnapshot saves the callback instead of running it.
-  snapshot_proxy->GetEntries(fidl::VectorPtr<uint8_t>::New(0), nullptr,
-                             std::move(client_callback));
-  RunLoopUntilIdle();
-
-  fidl::InterfaceHandle<PageSnapshot> handle = snapshot_proxy.Unbind();
-  reader = handle.TakeChannel();
-
-  std::vector<Entry> entries_to_send;
-
-  const size_t key_size = 125;
-  const size_t value_size = 125;
-  const size_t n_entries = 10;
-  auto token = std::make_unique<Token>();
-  token->opaque_id = GetKey(0, key_size);
-  for (size_t i = 0; i < n_entries; i++) {
-    Entry entry;
-    std::string object_data = GetValue(0, value_size);
-    fsl::SizedVmo vmo;
-    ASSERT_TRUE(fsl::VmoFromString(object_data, &vmo));
-    entry.value = fidl::MakeOptional(std::move(vmo).ToTransport());
-    entry.key = GetKey(0, key_size);
-    entry.priority = Priority::EAGER;
-    entries_to_send.push_back(std::move(entry));
-  }
-
-  // Run the callback directly.
-  snapshot_impl.get_entries_callback(Status::OK, std::move(entries_to_send),
-                                     std::move(token));
-
-  const size_t expected_bytes =
-      Align(kMessageHeaderSize +                  // Header.
-            kVectorHeaderSize +                   // VectorPtr.
-            n_entries * GetEntrySize(key_size) +  // Vector of entries.
-            kPointerSize +                        // Pointer to next_token.
-            GetByteVectorSize(key_size) +         // next_token.
-            kStatusEnumSize                       // Status.
-      );
-  const size_t expected_handles = n_entries;
-  EXPECT_TRUE(
-      CheckMessageSize(std::move(reader), expected_bytes, expected_handles));
-}
-
-}  // namespace
-}  // namespace fidl_serialization
-}  // namespace ledger
diff --git a/bin/ledger/app/ledger_impl.cc b/bin/ledger/app/ledger_impl.cc
deleted file mode 100644
index 27a75ec..0000000
--- a/bin/ledger/app/ledger_impl.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/ledger_impl.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/callback/trace_callback.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fxl/logging.h>
-#include <trace/event.h>
-#include <zircon/syscalls.h>
-
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/page_impl.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-
-namespace ledger {
-
-LedgerImpl::LedgerImpl(Environment* environment, Delegate* delegate)
-    : environment_(environment), delegate_(delegate) {}
-
-LedgerImpl::~LedgerImpl() {}
-
-void LedgerImpl::GetRootPage(fidl::InterfaceRequest<Page> page_request,
-                             GetRootPageCallback callback) {
-  delegate_->GetPage(
-      kRootPageId, Delegate::PageState::NAMED, std::move(page_request),
-      TRACE_CALLBACK(std::move(callback), "ledger", "ledger_get_root_page"));
-}
-
-void LedgerImpl::GetPage(PageIdPtr id,
-                         fidl::InterfaceRequest<Page> page_request,
-                         GetPageCallback callback) {
-  Delegate::PageState page_state = Delegate::PageState::NAMED;
-  if (!id) {
-    id = fidl::MakeOptional(PageId());
-    environment_->random()->Draw(&id->id);
-    page_state = Delegate::PageState::NEW;
-  }
-  delegate_->GetPage(
-      id->id, page_state, std::move(page_request),
-      TRACE_CALLBACK(std::move(callback), "ledger", "ledger_get_page"));
-}
-
-void LedgerImpl::SetConflictResolverFactory(
-    fidl::InterfaceHandle<ConflictResolverFactory> factory,
-    SetConflictResolverFactoryCallback callback) {
-  TRACE_DURATION("ledger", "ledger_set_conflict_resolver_factory");
-
-  delegate_->SetConflictResolverFactory(std::move(factory));
-  callback(Status::OK);
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/ledger_impl.h b/bin/ledger/app/ledger_impl.h
deleted file mode 100644
index 0334b07..0000000
--- a/bin/ledger/app/ledger_impl.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_LEDGER_IMPL_H_
-#define PERIDOT_BIN_LEDGER_APP_LEDGER_IMPL_H_
-
-#include <memory>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/app/page_manager.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/ledger_storage.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-// An implementation of the |Ledger| FIDL interface.
-class LedgerImpl : public Ledger {
- public:
-  // Delegate capable of actually performing the page operations.
-  class Delegate {
-   public:
-    // State of a new page. If the state is |NEW|, it is known that it doesn't
-    // have any content on the cloud or on another device.
-    enum class PageState {
-      // The page is new and has been created locally.
-      NEW,
-      // The page has been named by the client.
-      // well known name
-      NAMED,
-    };
-
-    Delegate() {}
-    virtual ~Delegate() = default;
-
-    virtual void GetPage(convert::ExtendedStringView page_id,
-                         PageState page_state,
-                         fidl::InterfaceRequest<Page> page_request,
-                         fit::function<void(Status)> callback) = 0;
-
-    virtual void SetConflictResolverFactory(
-        fidl::InterfaceHandle<ConflictResolverFactory> factory) = 0;
-
-   private:
-    FXL_DISALLOW_COPY_AND_ASSIGN(Delegate);
-  };
-
-  // |delegate| outlives LedgerImpl.
-  explicit LedgerImpl(Environment* environment, Delegate* delegate);
-  ~LedgerImpl() override;
-
- private:
-  // Ledger:
-  void GetRootPage(fidl::InterfaceRequest<Page> page_request,
-                   GetRootPageCallback callback) override;
-  void GetPage(PageIdPtr id, fidl::InterfaceRequest<Page> page_request,
-               GetPageCallback callback) override;
-
-  void SetConflictResolverFactory(
-      fidl::InterfaceHandle<ConflictResolverFactory> factory,
-      SetConflictResolverFactoryCallback callback) override;
-
-  Environment* const environment_;
-  Delegate* const delegate_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerImpl);
-};
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_LEDGER_IMPL_H_
diff --git a/bin/ledger/app/ledger_manager.cc b/bin/ledger/app/ledger_manager.cc
deleted file mode 100644
index 537d14f..0000000
--- a/bin/ledger/app/ledger_manager.cc
+++ /dev/null
@@ -1,715 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/ledger_manager.h"
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/p2p_sync/public/page_communicator.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-namespace {
-
-// A token that performs a given action on destruction.
-// ExpiringToken objects are used with internal page requests to notify the
-// PageManagerContainer that the requested PageManager is no longer used.
-using ExpiringToken = fit::deferred_action<fit::closure>;
-
-// A notifier for |PageUsageListener|.
-//
-// Given information about when internal and external page connections open and
-// close, |PageConnectionNotifier| calls the corresponding methods from
-// |PageUsageListener|. The |PageUsageListener| given in the constructor should
-// outlive this object.
-class PageConnectionNotifier {
- public:
-  PageConnectionNotifier(std::string ledger_name, storage::PageId page_id,
-                         PageUsageListener* page_usage_listener);
-  ~PageConnectionNotifier();
-
-  // Registers a new external page request.
-  void RegisterExternalRequest();
-
-  // Unregisters all active external page requests. This can be because all
-  // active connections were closed, or because of failure to bind the requests.
-  void UnregisterExternalRequests();
-
-  // Registers a new internal page request.
-  void RegisterInternalRequest();
-
-  // Unregisters one active internal page request. This can be because the
-  // active connection was closed, or because of failure to fulfill the request.
-  void UnregisterInternalRequest();
-
-  // Sets the on_empty callaback, to be called every time this object becomes
-  // empty.
-  void set_on_empty(fit::closure on_empty_callback);
-
-  // Checks and returns whether there are no active external or internal
-  // requests.
-  bool IsEmpty();
-
- private:
-  // Checks whether this object is empty, and if it is and the on_empty callback
-  // is set, calls it.
-  void CheckEmpty();
-
-  const std::string ledger_name_;
-  const storage::PageId page_id_;
-  PageUsageListener* page_usage_listener_;
-
-  // Stores whether the page was opened by an external request. Used to
-  // determine whether to send the OnPageUnused notifications when this is
-  // empty.
-  bool must_notify_on_page_unused_ = false;
-  // Stores whether the page is opened by an external request.
-  bool has_external_requests_ = false;
-  // Stores the number of active internal requests.
-  ssize_t internal_request_count_ = 0;
-
-  fit::closure on_empty_callback_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageConnectionNotifier);
-};
-
-PageConnectionNotifier::PageConnectionNotifier(
-    std::string ledger_name, storage::PageId page_id,
-    PageUsageListener* page_usage_listener)
-    : ledger_name_(std::move(ledger_name)),
-      page_id_(std::move(page_id)),
-      page_usage_listener_(page_usage_listener) {}
-
-PageConnectionNotifier::~PageConnectionNotifier() {}
-
-void PageConnectionNotifier::RegisterExternalRequest() {
-  if (has_external_requests_) {
-    return;
-  }
-  must_notify_on_page_unused_ = true;
-  has_external_requests_ = true;
-  page_usage_listener_->OnPageOpened(ledger_name_, page_id_);
-}
-
-void PageConnectionNotifier::UnregisterExternalRequests() {
-  if (has_external_requests_) {
-    page_usage_listener_->OnPageClosed(ledger_name_, page_id_);
-    has_external_requests_ = false;
-    CheckEmpty();
-  }
-}
-
-void PageConnectionNotifier::RegisterInternalRequest() {
-  ++internal_request_count_;
-}
-
-void PageConnectionNotifier::UnregisterInternalRequest() {
-  FXL_DCHECK(internal_request_count_ > 0);
-  --internal_request_count_;
-  CheckEmpty();
-}
-
-void PageConnectionNotifier::set_on_empty(fit::closure on_empty_callback) {
-  on_empty_callback_ = std::move(on_empty_callback);
-}
-
-bool PageConnectionNotifier::IsEmpty() {
-  return internal_request_count_ == 0 && !has_external_requests_;
-}
-
-void PageConnectionNotifier::CheckEmpty() {
-  if (!IsEmpty()) {
-    return;
-  }
-  if (must_notify_on_page_unused_) {
-    // We must set |must_notify_on_page_unused_| to false before calling
-    // |OnPageUsed|: While |OnPageUsed| is executed it creates an internal
-    // request to the PageManagerContainer, hence triggering a call to
-    // |UnregisterInternalRequest|. Since that will be the last active request,
-    // it will then trigger |CheckEmpty|, reaching again this part of the code.
-    // Setting |must_notify_on_page_unused_| to false prevents this infinite
-    // loop.
-    must_notify_on_page_unused_ = false;
-    page_usage_listener_->OnPageUnused(ledger_name_, page_id_);
-  }
-  if (on_empty_callback_) {
-    on_empty_callback_();
-  }
-}
-
-}  // namespace
-
-void LedgerManager::PageAvailabilityManager::MarkPageBusy(
-    convert::ExtendedStringView page_id) {
-  auto result =
-      busy_pages_.emplace(page_id.ToString(), std::vector<fit::closure>());
-  FXL_DCHECK(result.second)
-      << "Page " << convert::ToHex(page_id) << " is already busy.";
-}
-
-void LedgerManager::PageAvailabilityManager::MarkPageAvailable(
-    convert::ExtendedStringView page_id) {
-  storage::PageId page_id_str = page_id.ToString();
-  auto it = busy_pages_.find(page_id_str);
-  if (it == busy_pages_.end()) {
-    return;
-  }
-
-  for (auto& page_callback : it->second) {
-    page_callback();
-  }
-  busy_pages_.erase(it);
-}
-
-void LedgerManager::PageAvailabilityManager::OnPageAvailable(
-    convert::ExtendedStringView page_id, fit::closure on_page_available) {
-  storage::PageId page_id_str = page_id.ToString();
-  auto it = busy_pages_.find(page_id_str);
-  if (it == busy_pages_.end()) {
-    on_page_available();
-    return;
-  }
-  it->second.push_back(std::move(on_page_available));
-}
-
-// Container for a PageManager that keeps tracks of in-flight page requests and
-// callbacks and fires them when the PageManager is available.
-class LedgerManager::PageManagerContainer {
- public:
-  PageManagerContainer(std::string ledger_name, storage::PageId page_id,
-                       PageUsageListener* page_usage_listener);
-  ~PageManagerContainer();
-
-  void set_on_empty(fit::closure on_empty_callback);
-
-  // Keeps track of |page| and |callback|. Binds |page| and fires |callback|
-  // when a PageManager is available or an error occurs.
-  void BindPage(fidl::InterfaceRequest<Page> page_request,
-                fit::function<void(Status)> callback);
-
-  // Keeps track of |page_debug| and |callback|. Binds |page_debug| and fires
-  // |callback| when a PageManager is available or an error occurs.
-  void BindPageDebug(
-      fidl::InterfaceRequest<ledger_internal::PageDebug> page_debug,
-      fit::function<void(Status)> callback);
-
-  // Registers a new internal request for PageStorage.
-  void NewInternalRequest(
-      fit::function<void(Status, ExpiringToken, PageManager*)> callback);
-
-  // Sets the PageManager or the error status for the container. This notifies
-  // all awaiting callbacks and binds all pages in case of success.
-  void SetPageManager(Status status, std::unique_ptr<PageManager> page_manager);
-
-  // Returns true if there is at least one active external page connection.
-  bool PageConnectionIsOpen();
-
- private:
-  // Creates a new ExpiringToken to be used while internal requests for the
-  // |PageManager| remain active.
-  ExpiringToken NewExpiringToken();
-
-  // Checks whether this container is empty, and calls the |on_empty_callback_|
-  // if it is.
-  void CheckEmpty();
-
-  const storage::PageId page_id_;
-
-  std::unique_ptr<PageManager> page_manager_;
-  // |status_| holds the status given to |SetPageManager|. If
-  // |page_manager_is_set_| is true, |status_| is |Status::OK| if and only if
-  // |page_manager_| is not null.
-  Status status_ = Status::OK;
-  // |page_manager_is_set_| if |SetPageManager| has been called. |page_manager_|
-  // may still be null.
-  bool page_manager_is_set_ = false;
-
-  PageConnectionNotifier connection_notifier_;
-  std::vector<std::pair<std::unique_ptr<PageDelayingFacade>,
-                        fit::function<void(Status)>>>
-      requests_;
-  std::vector<std::pair<fidl::InterfaceRequest<ledger_internal::PageDebug>,
-                        fit::function<void(Status)>>>
-      debug_requests_;
-  std::vector<fit::function<void(Status, ExpiringToken, PageManager*)>>
-      internal_request_callbacks_;
-  fit::closure on_empty_callback_;
-
-  // Must be the last member.
-  fxl::WeakPtrFactory<PageManagerContainer> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageManagerContainer);
-};
-
-LedgerManager::PageManagerContainer::PageManagerContainer(
-    std::string ledger_name, storage::PageId page_id,
-    PageUsageListener* page_usage_listener)
-    : page_id_(page_id),
-      connection_notifier_(std::move(ledger_name), std::move(page_id),
-                           page_usage_listener),
-      weak_factory_(this) {}
-
-LedgerManager::PageManagerContainer::~PageManagerContainer() {
-  for (const auto& request : requests_) {
-    request.second(Status::INTERNAL_ERROR);
-  }
-  for (const auto& request : debug_requests_) {
-    request.second(Status::INTERNAL_ERROR);
-  }
-}
-
-void LedgerManager::PageManagerContainer::set_on_empty(
-    fit::closure on_empty_callback) {
-  on_empty_callback_ = std::move(on_empty_callback);
-  connection_notifier_.set_on_empty([this] { CheckEmpty(); });
-  if (page_manager_) {
-    page_manager_->set_on_empty(
-        [this] { connection_notifier_.UnregisterExternalRequests(); });
-  }
-}
-
-void LedgerManager::PageManagerContainer::BindPage(
-    fidl::InterfaceRequest<Page> page_request,
-    fit::function<void(Status)> callback) {
-  connection_notifier_.RegisterExternalRequest();
-
-  if (status_ != Status::OK) {
-    callback(status_);
-    return;
-  }
-  auto delaying_facade =
-      std::make_unique<PageDelayingFacade>(page_id_, std::move(page_request));
-  if (page_manager_) {
-    page_manager_->AddPageDelayingFacade(std::move(delaying_facade),
-                                         std::move(callback));
-    return;
-  }
-  requests_.emplace_back(std::move(delaying_facade), std::move(callback));
-}
-
-void LedgerManager::PageManagerContainer::BindPageDebug(
-    fidl::InterfaceRequest<ledger_internal::PageDebug> page_debug,
-    fit::function<void(Status)> callback) {
-  connection_notifier_.RegisterExternalRequest();
-
-  if (status_ != Status::OK) {
-    callback(status_);
-    return;
-  }
-  if (page_manager_) {
-    page_manager_->BindPageDebug(std::move(page_debug), std::move(callback));
-    return;
-  }
-  debug_requests_.emplace_back(std::move(page_debug), std::move(callback));
-}
-
-void LedgerManager::PageManagerContainer::NewInternalRequest(
-    fit::function<void(Status, ExpiringToken, PageManager*)> callback) {
-  if (status_ != Status::OK) {
-    callback(status_, fit::defer<fit::closure>([] {}), nullptr);
-    return;
-  }
-
-  if (page_manager_) {
-    callback(status_, NewExpiringToken(), page_manager_.get());
-    return;
-  }
-
-  internal_request_callbacks_.push_back(std::move(callback));
-}
-
-void LedgerManager::PageManagerContainer::SetPageManager(
-    Status status, std::unique_ptr<PageManager> page_manager) {
-  TRACE_DURATION("ledger", "ledger_manager_set_page_manager");
-
-  FXL_DCHECK(!page_manager_is_set_);
-  FXL_DCHECK((status != Status::OK) == !page_manager);
-  status_ = status;
-  page_manager_ = std::move(page_manager);
-  page_manager_is_set_ = true;
-
-  for (auto& request : requests_) {
-    if (page_manager_) {
-      page_manager_->AddPageDelayingFacade(std::move(request.first),
-                                           std::move(request.second));
-    } else {
-      request.second(status_);
-    }
-  }
-  requests_.clear();
-
-  for (auto& request : debug_requests_) {
-    if (page_manager_) {
-      page_manager_->BindPageDebug(std::move(request.first),
-                                   std::move(request.second));
-    } else {
-      request.second(status_);
-    }
-  }
-  debug_requests_.clear();
-
-  for (auto& callback : internal_request_callbacks_) {
-    if (!page_manager_) {
-      callback(status_, fit::defer<fit::closure>([] {}), nullptr);
-      continue;
-    }
-    callback(status_, NewExpiringToken(), page_manager_.get());
-  }
-
-  if (page_manager_) {
-    page_manager_->set_on_empty(
-        [this] { connection_notifier_.UnregisterExternalRequests(); });
-  } else {
-    CheckEmpty();
-  }
-}
-
-bool LedgerManager::PageManagerContainer::PageConnectionIsOpen() {
-  return (page_manager_ && !page_manager_->IsEmpty()) || !requests_.empty() ||
-         !debug_requests_.empty();
-}
-
-ExpiringToken LedgerManager::PageManagerContainer::NewExpiringToken() {
-  connection_notifier_.RegisterInternalRequest();
-  return ExpiringToken(callback::MakeScoped(weak_factory_.GetWeakPtr(), [this] {
-    connection_notifier_.UnregisterInternalRequest();
-  }));
-}
-
-void LedgerManager::PageManagerContainer::CheckEmpty() {
-  // The PageManagerContainer is not considered empty until |SetPageManager| has
-  // been called.
-  if (on_empty_callback_ && connection_notifier_.IsEmpty() &&
-      page_manager_is_set_ && (!page_manager_ || page_manager_->IsEmpty())) {
-    on_empty_callback_();
-  }
-}
-
-LedgerManager::LedgerManager(
-    Environment* environment, std::string ledger_name,
-    std::unique_ptr<encryption::EncryptionService> encryption_service,
-    std::unique_ptr<storage::LedgerStorage> storage,
-    std::unique_ptr<sync_coordinator::LedgerSync> ledger_sync,
-    PageUsageListener* page_usage_listener)
-    : environment_(environment),
-      ledger_name_(std::move(ledger_name)),
-      encryption_service_(std::move(encryption_service)),
-      storage_(std::move(storage)),
-      ledger_sync_(std::move(ledger_sync)),
-      ledger_impl_(environment_, this),
-      merge_manager_(environment_),
-      page_usage_listener_(page_usage_listener) {
-  bindings_.set_empty_set_handler([this] { CheckEmpty(); });
-  page_managers_.set_on_empty([this] { CheckEmpty(); });
-  ledger_debug_bindings_.set_empty_set_handler([this] { CheckEmpty(); });
-}
-
-LedgerManager::~LedgerManager() {}
-
-void LedgerManager::BindLedger(fidl::InterfaceRequest<Ledger> ledger_request) {
-  bindings_.AddBinding(&ledger_impl_, std::move(ledger_request));
-}
-
-void LedgerManager::PageIsClosedAndSynced(
-    storage::PageIdView page_id,
-    fit::function<void(Status, PagePredicateResult)> callback) {
-  auto is_synced = [](PageManager* page_manager,
-                      fit::function<void(Status, bool)> on_done) {
-    page_manager->IsSynced(std::move(on_done));
-  };
-  PageIsClosedAndSatisfiesPredicate(page_id, std::move(is_synced),
-                                    std::move(callback));
-}
-
-void LedgerManager::PageIsClosedOfflineAndEmpty(
-    storage::PageIdView page_id,
-    fit::function<void(Status, PagePredicateResult)> callback) {
-  auto is_offline_and_empty = [](PageManager* page_manager,
-                                 fit::function<void(Status, bool)> on_done) {
-    page_manager->IsOfflineAndEmpty(std::move(on_done));
-  };
-  PageIsClosedAndSatisfiesPredicate(page_id, std::move(is_offline_and_empty),
-                                    std::move(callback));
-}
-
-void LedgerManager::DeletePageStorage(convert::ExtendedStringView page_id,
-                                      fit::function<void(Status)> callback) {
-  auto it = page_managers_.find(page_id);
-  if (it != page_managers_.end()) {
-    callback(Status::ILLEGAL_STATE);
-    return;
-  }
-
-  // Block all page requests until deletion is complete.
-  page_availability_manager_.MarkPageBusy(page_id);
-  storage_->DeletePageStorage(
-      page_id, [this, page_id = page_id.ToString(),
-                callback = std::move(callback)](storage::Status status) {
-        page_availability_manager_.MarkPageAvailable(page_id);
-        callback(PageUtils::ConvertStatus(status));
-      });
-}
-
-void LedgerManager::GetPage(storage::PageIdView page_id, PageState page_state,
-                            fidl::InterfaceRequest<Page> page_request,
-                            fit::function<void(Status)> callback) {
-  MaybeMarkPageOpened(page_id);
-
-  // If we have the page manager ready, just bind the request and return.
-  auto it = page_managers_.find(page_id);
-  if (it != page_managers_.end()) {
-    it->second.BindPage(std::move(page_request), std::move(callback));
-    return;
-  }
-
-  PageManagerContainer* container = AddPageManagerContainer(page_id);
-  // TODO(LE-631): We will need to remove empty pages that are unknown to the
-  // user or the page usage database.
-  container->BindPage(std::move(page_request), std::move(callback));
-
-  InitPageManagerContainer(container, page_id,
-                           [this, container, page_id = page_id.ToString(),
-                            page_state](Status status) mutable {
-                             // Create the page if it wasn't found.
-                             if (status == Status::PAGE_NOT_FOUND) {
-                               CreatePageStorage(std::move(page_id), page_state,
-                                                 container);
-                             }
-                           });
-}
-
-void LedgerManager::InitPageManagerContainer(
-    PageManagerContainer* container, convert::ExtendedStringView page_id,
-    fit::function<void(Status)> callback) {
-  page_availability_manager_.OnPageAvailable(
-      page_id, [this, container, page_id = page_id.ToString(),
-                callback = std::move(callback)]() mutable {
-        storage_->GetPageStorage(
-            std::move(page_id),
-            [this, container, callback = std::move(callback)](
-                storage::Status storage_status,
-                std::unique_ptr<storage::PageStorage> page_storage) mutable {
-              Status status =
-                  PageUtils::ConvertStatus(storage_status, Status::OK);
-              if (status != Status::OK) {
-                container->SetPageManager(status, nullptr);
-                callback(status);
-                return;
-              }
-
-              // If the page was found locally, just use it and return.
-              if (page_storage) {
-                container->SetPageManager(
-                    Status::OK,
-                    NewPageManager(std::move(page_storage),
-                                   PageManager::PageStorageState::AVAILABLE));
-                callback(status);
-                return;
-              }
-
-              callback(Status::PAGE_NOT_FOUND);
-            });
-      });
-}
-
-void LedgerManager::CreatePageStorage(storage::PageId page_id,
-                                      PageState page_state,
-                                      PageManagerContainer* container) {
-  page_availability_manager_.OnPageAvailable(
-      page_id,
-      [this, page_id = std::move(page_id), page_state, container]() mutable {
-        storage_->CreatePageStorage(
-            std::move(page_id),
-            [this, page_state, container](
-                storage::Status status,
-                std::unique_ptr<storage::PageStorage> page_storage) {
-              if (status != storage::Status::OK) {
-                container->SetPageManager(Status::INTERNAL_ERROR, nullptr);
-                return;
-              }
-              container->SetPageManager(
-                  Status::OK,
-                  NewPageManager(
-                      std::move(page_storage),
-                      page_state == PageState::NEW
-                          ? PageManager::PageStorageState::AVAILABLE
-                          : PageManager::PageStorageState::NEEDS_SYNC));
-            });
-      });
-}
-
-LedgerManager::PageManagerContainer* LedgerManager::AddPageManagerContainer(
-    storage::PageIdView page_id) {
-  auto ret = page_managers_.emplace(
-      std::piecewise_construct, std::forward_as_tuple(page_id.ToString()),
-      std::forward_as_tuple(ledger_name_, page_id.ToString(),
-                            page_usage_listener_));
-  FXL_DCHECK(ret.second);
-  return &ret.first->second;
-}
-
-std::unique_ptr<PageManager> LedgerManager::NewPageManager(
-    std::unique_ptr<storage::PageStorage> page_storage,
-    PageManager::PageStorageState state) {
-  std::unique_ptr<sync_coordinator::PageSync> page_sync;
-  if (ledger_sync_) {
-    page_sync =
-        ledger_sync_->CreatePageSync(page_storage.get(), page_storage.get());
-  }
-  return std::make_unique<PageManager>(
-      environment_, std::move(page_storage), std::move(page_sync),
-      merge_manager_.GetMergeResolver(page_storage.get()), state);
-}
-
-void LedgerManager::PageIsClosedAndSatisfiesPredicate(
-    storage::PageIdView page_id,
-    fit::function<void(PageManager*, fit::function<void(Status, bool)>)>
-        predicate,
-    fit::function<void(Status, PagePredicateResult)> callback) {
-  // Start logging whether the page has been opened during the execution of
-  // this method.
-  uint64_t operation_id = page_was_opened_id_++;
-  page_was_opened_map_[page_id.ToString()].push_back(operation_id);
-  auto on_return =
-      fit::defer([this, page_id = page_id.ToString(), operation_id] {
-        RemoveTrackedPage(page_id, operation_id);
-      });
-
-  PageManagerContainer* container;
-
-  auto it = page_managers_.find(page_id);
-  if (it != page_managers_.end()) {
-    // The page manager is open, check if there are any open connections.
-    container = &it->second;
-    if (container->PageConnectionIsOpen()) {
-      callback(Status::OK, PagePredicateResult::PAGE_OPENED);
-      return;
-    }
-  } else {
-    // Create a new container and get the PageStorage.
-    container = AddPageManagerContainer(page_id);
-    InitPageManagerContainer(container, page_id, [container](Status status) {
-      if (status == Status::PAGE_NOT_FOUND) {
-        container->SetPageManager(status, nullptr);
-      }
-    });
-  }
-
-  container->NewInternalRequest(
-      [this, page_id = page_id.ToString(), operation_id,
-       predicate = std::move(predicate), on_return = std::move(on_return),
-       callback = std::move(callback)](Status status, ExpiringToken token,
-                                       PageManager* page_manager) mutable {
-        auto final_callback =
-            [token = std::move(token), callback = std::move(callback)](
-                Status status, PagePredicateResult result) mutable {
-              // The token needs to be valid while |predicate| is being
-              // computed. Invalidate it right before calling the callback.
-              token.call();
-              callback(status, result);
-            };
-        if (status != Status::OK) {
-          final_callback(status, PagePredicateResult::PAGE_OPENED);
-          return;
-        }
-        FXL_DCHECK(page_manager);
-        predicate(page_manager, [this, page_id = std::move(page_id),
-                                 operation_id, on_return = std::move(on_return),
-                                 callback = std::move(final_callback)](
-                                    Status status, bool condition) mutable {
-          on_return.cancel();
-          if (!RemoveTrackedPage(page_id, operation_id) ||
-              status != Status::OK) {
-            // If |RemoveTrackedPage| returns false, this means that
-            // the page was opened during this operation and
-            // |PAGE_OPENED| must be returned.
-            callback(status, PagePredicateResult::PAGE_OPENED);
-            return;
-          }
-          callback(Status::OK, condition ? PagePredicateResult::YES
-                                         : PagePredicateResult::NO);
-        });
-      });
-}
-
-bool LedgerManager::RemoveTrackedPage(storage::PageIdView page_id,
-                                      uint64_t operation_id) {
-  auto it = page_was_opened_map_.find(page_id.ToString());
-  if (it == page_was_opened_map_.end()) {
-    return false;
-  }
-  if (it->second.size() == 1) {
-    // This is the last operation for this page: delete the page's entry.
-    page_was_opened_map_.erase(it);
-    return true;
-  }
-  // Erase the operation_id, if found, from the found vector (it->second).
-  auto operation_it =
-      std::find(it->second.begin(), it->second.end(), operation_id);
-  if (operation_it != it->second.end()) {
-    it->second.erase(operation_it);
-    return true;
-  }
-  return false;
-}
-
-void LedgerManager::MaybeMarkPageOpened(storage::PageIdView page_id) {
-  page_was_opened_map_.erase(page_id.ToString());
-}
-
-void LedgerManager::CheckEmpty() {
-  if (on_empty_callback_ && bindings_.size() == 0 && page_managers_.empty() &&
-      ledger_debug_bindings_.size() == 0)
-    on_empty_callback_();
-}
-
-void LedgerManager::SetConflictResolverFactory(
-    fidl::InterfaceHandle<ConflictResolverFactory> factory) {
-  merge_manager_.AddFactory(std::move(factory));
-}
-
-void LedgerManager::BindLedgerDebug(
-    fidl::InterfaceRequest<LedgerDebug> request) {
-  ledger_debug_bindings_.AddBinding(this, std::move(request));
-}
-
-// TODO(ayaelattar): See LE-370: Inspect ledgers and pages not currently active.
-void LedgerManager::GetPagesList(GetPagesListCallback callback) {
-  fidl::VectorPtr<PageId> result;
-  result.resize(0);
-  for (const auto& key_value : page_managers_) {
-    PageId page_id;
-    convert::ToArray(key_value.first, &page_id.id);
-    result.push_back(page_id);
-  }
-  callback(std::move(result));
-}
-
-void LedgerManager::GetPageDebug(
-    PageId page_id,
-    fidl::InterfaceRequest<ledger_internal::PageDebug> page_debug,
-    GetPageDebugCallback callback) {
-  MaybeMarkPageOpened(page_id.id);
-  auto it = page_managers_.find(convert::ExtendedStringView(page_id.id));
-  if (it != page_managers_.end()) {
-    it->second.BindPageDebug(std::move(page_debug), std::move(callback));
-  } else {
-    callback(Status::PAGE_NOT_FOUND);
-  }
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/ledger_manager.h b/bin/ledger/app/ledger_manager.h
deleted file mode 100644
index 4d6ffcd..0000000
--- a/bin/ledger/app/ledger_manager.h
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_LEDGER_MANAGER_H_
-#define PERIDOT_BIN_LEDGER_APP_LEDGER_MANAGER_H_
-
-#include <functional>
-#include <map>
-#include <memory>
-#include <type_traits>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/app/ledger_impl.h"
-#include "peridot/bin/ledger/app/merging/ledger_merge_manager.h"
-#include "peridot/bin/ledger/app/page_manager.h"
-#include "peridot/bin/ledger/app/page_usage_listener.h"
-#include "peridot/bin/ledger/app/types.h"
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/bin/ledger/sync_coordinator/public/ledger_sync.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-// Manages a ledger instance. A ledger instance represents the data scoped to a
-// particular user and a particular client app.
-//
-// LedgerManager owns all per-ledger-instance objects: LedgerStorage and a FIDL
-// LedgerImpl. It is safe to delete it at any point - this closes all channels,
-// deletes the LedgerImpl and tears down the storage.
-class LedgerManager : public LedgerImpl::Delegate,
-                      public ledger_internal::LedgerDebug {
- public:
-  LedgerManager(
-      Environment* environment, std::string ledger_name,
-      std::unique_ptr<encryption::EncryptionService> encryption_service,
-      std::unique_ptr<storage::LedgerStorage> storage,
-      std::unique_ptr<sync_coordinator::LedgerSync> ledger_sync,
-      PageUsageListener* page_usage_listener);
-  ~LedgerManager() override;
-
-  // Creates a new proxy for the LedgerImpl managed by this LedgerManager.
-  void BindLedger(fidl::InterfaceRequest<Ledger> ledger_request);
-
-  // Checks whether the given page is closed and synced. The result returned in
-  // the callback will be |PAGE_OPENED| if the page is opened after calling this
-  // method and before the callback is called. Otherwise it will be |YES| or
-  // |NO| depending on whether the page is synced or not.
-  void PageIsClosedAndSynced(
-      storage::PageIdView page_id,
-      fit::function<void(Status, PagePredicateResult)> callback);
-
-  // Checks whether the given page is closed, offline and empty. The result
-  // returned in the callback will be |PAGE_OPENED| if the page is opened after
-  // calling this method and before the callback is called. Otherwise it will be
-  // |YES| or |NO| depending on whether the page is offline and empty or not.
-  void PageIsClosedOfflineAndEmpty(
-      storage::PageIdView page_id,
-      fit::function<void(Status, PagePredicateResult)> callback);
-
-  // Deletes the local copy of the page. If the page is currently open, the
-  // callback will be called with |ILLEGAL_STATE|.
-  void DeletePageStorage(convert::ExtendedStringView page_id,
-                         fit::function<void(Status)> callback);
-
-  // LedgerImpl::Delegate:
-  void GetPage(convert::ExtendedStringView page_id, PageState page_state,
-               fidl::InterfaceRequest<Page> page_request,
-               fit::function<void(Status)> callback) override;
-  void SetConflictResolverFactory(
-      fidl::InterfaceHandle<ConflictResolverFactory> factory) override;
-
-  void set_on_empty(fit::closure on_empty_callback) {
-    on_empty_callback_ = std::move(on_empty_callback);
-  }
-
-  // Creates a new proxy for the LedgerDebug implemented by this LedgerManager.
-  void BindLedgerDebug(fidl::InterfaceRequest<LedgerDebug> request);
-
- private:
-  class PageManagerContainer;
-
-  // Stores whether a given page is busy or available. After |MarkPageBusy| has
-  // been called, all calls to |OnPageAvailable| will be delayed until a call to
-  // |MarkPageAvailable|. By default, all pages are available.
-  class PageAvailabilityManager {
-   public:
-    // Marks the page as busy and delays calling the callback in
-    // |OnPageAvailable| for this page. It is an error to call this method for a
-    // page that is already busy.
-    void MarkPageBusy(convert::ExtendedStringView page_id);
-
-    // Marks the page as available and calls any pending callbacks from
-    // |OnPageAvailable| for this page.
-    void MarkPageAvailable(convert::ExtendedStringView page_id);
-
-    // If the page is available calls the given callback directly. Otherwise,
-    // the callback is registered util the page becomes available.
-    void OnPageAvailable(convert::ExtendedStringView page_id,
-                         fit::closure on_page_available);
-
-   private:
-    // For each busy page, stores the list of pending callbacks.
-    std::map<storage::PageId, std::vector<fit::closure>> busy_pages_;
-  };
-
-  // Requests a PageStorage object for the given |container|. If the page is not
-  // locally available, the |callback| is called with |PAGE_NOT_FOUND|.
-  void InitPageManagerContainer(PageManagerContainer* container,
-                                convert::ExtendedStringView page_id,
-                                fit::function<void(Status)> callback);
-
-  // Creates a page storage for the given |page_id| and completes the
-  // PageManagerContainer.
-  void CreatePageStorage(storage::PageId page_id, PageState page_state,
-                         PageManagerContainer* container);
-
-  // Adds a new PageManagerContainer for |page_id| and configures it so that it
-  // is automatically deleted from |page_managers_| when the last local client
-  // disconnects from the page. Returns the container.
-  PageManagerContainer* AddPageManagerContainer(storage::PageIdView page_id);
-
-  // Creates a new page manager for the given storage.
-  std::unique_ptr<PageManager> NewPageManager(
-      std::unique_ptr<storage::PageStorage> page_storage,
-      PageManager::PageStorageState state);
-
-  // Checks whether the given page is closed and staisfies the given
-  // |predicate|. The result returned in the callback will be |PAGE_OPENED| if
-  // the page is opened after calling this method and before the callback is
-  // called. Otherwise it will be |YES| or |NO| depending on whether the
-  // predicate is satisfied.
-  void PageIsClosedAndSatisfiesPredicate(
-      storage::PageIdView page_id,
-      fit::function<void(PageManager*, fit::function<void(Status, bool)>)>
-          predicate,
-      fit::function<void(Status, PagePredicateResult)> callback);
-
-  // Marks the page with the given id as no longer tracked by the given
-  // operation. Returns true if the entry was found; false otherwise.
-  bool RemoveTrackedPage(storage::PageIdView page_id, uint64_t operation_id);
-
-  // If the page is among the ones whose usage is being tracked, marks this page
-  // as opened. See also |page_was_opened_map_|.
-  void MaybeMarkPageOpened(storage::PageIdView page_id);
-
-  void CheckEmpty();
-
-  // LedgerDebug:
-  void GetPagesList(GetPagesListCallback callback) override;
-
-  void GetPageDebug(
-      PageId page_id,
-      fidl::InterfaceRequest<ledger_internal::PageDebug> page_debug,
-      GetPageDebugCallback callback) override;
-
-  Environment* const environment_;
-  std::string ledger_name_;
-  std::unique_ptr<encryption::EncryptionService> encryption_service_;
-  std::unique_ptr<storage::LedgerStorage> storage_;
-  std::unique_ptr<sync_coordinator::LedgerSync> ledger_sync_;
-  LedgerImpl ledger_impl_;
-  // |merge_manager_| must be destructed after |page_managers_| to ensure it
-  // outlives any page-specific merge resolver.
-  LedgerMergeManager merge_manager_;
-  fidl::BindingSet<Ledger> bindings_;
-
-  // Mapping from each page id to the manager of that page.
-  callback::AutoCleanableMap<storage::PageId, PageManagerContainer,
-                             convert::StringViewComparator>
-      page_managers_;
-  PageUsageListener* page_usage_listener_;
-  fit::closure on_empty_callback_;
-
-  fidl::BindingSet<LedgerDebug> ledger_debug_bindings_;
-
-  PageAvailabilityManager page_availability_manager_;
-
-  // |page_was_opened_map_| is used to track whether certain pages were opened
-  // during a given operation. When |PageIsClosedAndSatisfiesPredicate()| is
-  // called, an entry is added in this map, with the given page_id as key, while
-  // a unique operation id is added in the corresponding value. That entry will
-  // be deleted either when that opertion is done, or when the page is opened
-  // because of an external request. This guarantees that if before calling the
-  // callback of |PageIsClosedAndSatisfiesPredicate|, the entry is still present
-  // in the map, the page was not opened during that operation. Otherwise, it
-  // was, and |PAGE_OPENED| should be returned.
-  std::map<storage::PageId, std::vector<uint64_t>> page_was_opened_map_;
-  uint64_t page_was_opened_id_ = 0;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerManager);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_LEDGER_MANAGER_H_
diff --git a/bin/ledger/app/ledger_manager_unittest.cc b/bin/ledger/app/ledger_manager_unittest.cc
deleted file mode 100644
index 1faa3e6..0000000
--- a/bin/ledger/app/ledger_manager_unittest.cc
+++ /dev/null
@@ -1,1005 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/ledger_manager.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include <lib/async/cpp/task.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/callback/waiter.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <zircon/syscalls.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/disk_cleanup_manager_impl.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/fake/fake_page_storage.h"
-#include "peridot/bin/ledger/storage/public/ledger_storage.h"
-#include "peridot/bin/ledger/sync_coordinator/public/ledger_sync.h"
-#include "peridot/bin/ledger/testing/fake_disk_cleanup_manager.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-class DelayingCallbacksManager {
- public:
-  DelayingCallbacksManager() {}
-  virtual ~DelayingCallbacksManager() {}
-
-  // Returns true if the PageStorage of the page with the given id should delay
-  // calling the callback of |IsSynced|.
-  virtual bool ShouldDelayIsSyncedCallback(storage::PageIdView page_id) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(DelayingCallbacksManager);
-};
-
-class DelayIsSyncedCallbackFakePageStorage
-    : public storage::fake::FakePageStorage {
- public:
-  explicit DelayIsSyncedCallbackFakePageStorage(
-      Environment* environment,
-      DelayingCallbacksManager* delaying_callbacks_manager, storage::PageId id)
-      : storage::fake::FakePageStorage(environment, id),
-        delaying_callbacks_manager_(delaying_callbacks_manager) {}
-  ~DelayIsSyncedCallbackFakePageStorage() override {}
-
-  void IsSynced(fit::function<void(storage::Status, bool)> callback) override {
-    if (!delaying_callbacks_manager_->ShouldDelayIsSyncedCallback(page_id_)) {
-      storage::fake::FakePageStorage::IsSynced(std::move(callback));
-      return;
-    }
-    is_synced_callback_ = std::move(callback);
-  }
-
-  void IsEmpty(fit::function<void(storage::Status, bool)> callback) override {
-    callback(storage::Status::OK, true);
-  }
-
-  bool IsOnline() override { return false; }
-
-  void CallIsSyncedCallback() {
-    storage::fake::FakePageStorage::IsSynced(std::move(is_synced_callback_));
-  }
-
- private:
-  fit::function<void(storage::Status, bool)> is_synced_callback_;
-  DelayingCallbacksManager* delaying_callbacks_manager_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DelayIsSyncedCallbackFakePageStorage);
-};
-
-class FakeLedgerStorage : public storage::LedgerStorage,
-                          public DelayingCallbacksManager {
- public:
-  explicit FakeLedgerStorage(Environment* environment)
-      : environment_(environment) {}
-  ~FakeLedgerStorage() override {}
-
-  void CreatePageStorage(
-      storage::PageId page_id,
-      fit::function<void(storage::Status,
-                         std::unique_ptr<storage::PageStorage>)>
-          callback) override {
-    create_page_calls.push_back(std::move(page_id));
-    callback(storage::Status::IO_ERROR, nullptr);
-  }
-
-  void GetPageStorage(storage::PageId page_id,
-                      fit::function<void(storage::Status,
-                                         std::unique_ptr<storage::PageStorage>)>
-                          callback) override {
-    get_page_calls.push_back(page_id);
-    async::PostTask(
-        environment_->dispatcher(),
-        [this, callback = std::move(callback), page_id]() mutable {
-          if (should_get_page_fail) {
-            callback(storage::Status::NOT_FOUND, nullptr);
-          } else {
-            auto fake_page_storage =
-                std::make_unique<DelayIsSyncedCallbackFakePageStorage>(
-                    environment_, this, page_id);
-            // If the page was opened before, restore the previous sync state.
-            fake_page_storage->set_synced(synced_pages_.find(page_id) !=
-                                          synced_pages_.end());
-            page_storages_[std::move(page_id)] = fake_page_storage.get();
-            callback(storage::Status::OK, std::move(fake_page_storage));
-          }
-        });
-  }
-
-  void DeletePageStorage(
-      storage::PageIdView /*page_id*/,
-      fit::function<void(storage::Status)> callback) override {
-    delete_page_storage_callback = std::move(callback);
-  }
-
-  void ClearCalls() {
-    create_page_calls.clear();
-    get_page_calls.clear();
-    page_storages_.clear();
-  }
-
-  void DelayIsSyncedCallback(storage::PageIdView page_id, bool delay_callback) {
-    if (delay_callback) {
-      pages_with_delayed_callback.insert(page_id.ToString());
-    } else {
-      pages_with_delayed_callback.erase(page_id.ToString());
-    }
-  }
-
-  // DelayingCallbacksManager:
-  bool ShouldDelayIsSyncedCallback(storage::PageIdView page_id) override {
-    return pages_with_delayed_callback.find(page_id.ToString()) !=
-           pages_with_delayed_callback.end();
-  }
-
-  void CallIsSyncedCallback(storage::PageIdView page_id) {
-    auto it = page_storages_.find(page_id.ToString());
-    FXL_CHECK(it != page_storages_.end());
-    it->second->CallIsSyncedCallback();
-  }
-
-  void set_page_storage_synced(storage::PageIdView page_id, bool is_synced) {
-    storage::PageId page_id_string = page_id.ToString();
-    if (is_synced) {
-      synced_pages_.insert(page_id_string);
-    } else {
-      auto it = synced_pages_.find(page_id_string);
-      if (it != synced_pages_.end()) {
-        synced_pages_.erase(it);
-      }
-    }
-
-    FXL_CHECK(page_storages_.find(page_id_string) != page_storages_.end());
-    page_storages_[page_id_string]->set_synced(is_synced);
-  }
-
-  void set_page_storage_offline_empty(storage::PageIdView page_id,
-                                      bool is_offline_empty) {
-    storage::PageId page_id_string = page_id.ToString();
-    if (is_offline_empty) {
-      offline_empty_pages_.insert(page_id_string);
-    } else {
-      auto it = offline_empty_pages_.find(page_id_string);
-      if (it != offline_empty_pages_.end()) {
-        offline_empty_pages_.erase(it);
-      }
-    }
-  }
-
-  bool should_get_page_fail = false;
-  std::vector<storage::PageId> create_page_calls;
-  std::vector<storage::PageId> get_page_calls;
-  fit::function<void(storage::Status)> delete_page_storage_callback;
-
- private:
-  Environment* const environment_;
-  std::map<storage::PageId, DelayIsSyncedCallbackFakePageStorage*>
-      page_storages_;
-  std::set<storage::PageId> synced_pages_;
-  std::set<storage::PageId> offline_empty_pages_;
-  std::set<storage::PageId> pages_with_delayed_callback;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeLedgerStorage);
-};
-
-class FakeLedgerSync : public sync_coordinator::LedgerSync {
- public:
-  FakeLedgerSync() {}
-  ~FakeLedgerSync() override {}
-
-  std::unique_ptr<sync_coordinator::PageSync> CreatePageSync(
-      storage::PageStorage* /*page_storage*/,
-      storage::PageSyncClient* /*page_sync_client*/) override {
-    called = true;
-    return nullptr;
-  }
-
-  bool called = false;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeLedgerSync);
-};
-
-class LedgerManagerTest : public TestWithEnvironment {
- public:
-  LedgerManagerTest() {}
-
-  ~LedgerManagerTest() override {}
-
-  // gtest::TestWithEnvironment:
-  void SetUp() override {
-    TestWithEnvironment::SetUp();
-    std::unique_ptr<FakeLedgerStorage> storage =
-        std::make_unique<FakeLedgerStorage>(&environment_);
-    storage_ptr = storage.get();
-    std::unique_ptr<FakeLedgerSync> sync = std::make_unique<FakeLedgerSync>();
-    sync_ptr = sync.get();
-    disk_cleanup_manager_ = std::make_unique<FakeDiskCleanupManager>();
-    ledger_manager_ = std::make_unique<LedgerManager>(
-        &environment_, "test_ledger",
-        std::make_unique<encryption::FakeEncryptionService>(dispatcher()),
-        std::move(storage), std::move(sync), disk_cleanup_manager_.get());
-    ledger_manager_->BindLedger(ledger_.NewRequest());
-    ledger_manager_->BindLedgerDebug(ledger_debug_.NewRequest());
-  }
-
-  PageId RandomId() {
-    PageId result;
-    environment_.random()->Draw(&result.id);
-    return result;
-  }
-
- protected:
-  FakeLedgerStorage* storage_ptr;
-  FakeLedgerSync* sync_ptr;
-  std::unique_ptr<FakeDiskCleanupManager> disk_cleanup_manager_;
-  std::unique_ptr<LedgerManager> ledger_manager_;
-  LedgerPtr ledger_;
-  ledger_internal::LedgerDebugPtr ledger_debug_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerManagerTest);
-};
-
-class StubConflictResolverFactory : public ConflictResolverFactory {
- public:
-  explicit StubConflictResolverFactory(
-      fidl::InterfaceRequest<ConflictResolverFactory> request)
-      : binding_(this, std::move(request)) {
-    binding_.set_error_handler(
-        [this](zx_status_t status) { disconnected = true; });
-  }
-
-  bool disconnected = false;
-
- private:
-  void GetPolicy(PageId page_id,
-                 fit::function<void(MergePolicy)> callback) override {}
-
-  void NewConflictResolver(
-      PageId page_id,
-      fidl::InterfaceRequest<ConflictResolver> resolver) override {}
-
-  fidl::Binding<ConflictResolverFactory> binding_;
-};
-
-// Verifies that LedgerImpl proxies vended by LedgerManager work correctly,
-// that is, make correct calls to ledger storage.
-TEST_F(LedgerManagerTest, LedgerImpl) {
-  EXPECT_EQ(0u, storage_ptr->create_page_calls.size());
-  EXPECT_EQ(0u, storage_ptr->get_page_calls.size());
-
-  PagePtr page;
-  storage_ptr->should_get_page_fail = true;
-  ledger_->GetPage(nullptr, page.NewRequest(), [this](Status) { QuitLoop(); });
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, storage_ptr->create_page_calls.size());
-  EXPECT_EQ(1u, storage_ptr->get_page_calls.size());
-  page.Unbind();
-  storage_ptr->ClearCalls();
-
-  storage_ptr->should_get_page_fail = true;
-  ledger_->GetRootPage(page.NewRequest(), [this](Status) { QuitLoop(); });
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, storage_ptr->create_page_calls.size());
-  EXPECT_EQ(1u, storage_ptr->get_page_calls.size());
-  page.Unbind();
-  storage_ptr->ClearCalls();
-
-  PageId id = RandomId();
-  ledger_->GetPage(fidl::MakeOptional(id), page.NewRequest(),
-                   [this](Status) { QuitLoop(); });
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, storage_ptr->create_page_calls.size());
-  ASSERT_EQ(1u, storage_ptr->get_page_calls.size());
-  EXPECT_EQ(convert::ToString(id.id), storage_ptr->get_page_calls[0]);
-  page.Unbind();
-  storage_ptr->ClearCalls();
-}
-
-// Verifies that deleting the LedgerManager closes the channels connected to
-// LedgerImpl.
-TEST_F(LedgerManagerTest, DeletingLedgerManagerClosesConnections) {
-  bool ledger_closed = false;
-  ledger_.set_error_handler([this, &ledger_closed](zx_status_t status) {
-    ledger_closed = true;
-    QuitLoop();
-  });
-
-  ledger_manager_.reset();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(ledger_closed);
-}
-
-TEST_F(LedgerManagerTest, OnEmptyCalled) {
-  bool on_empty_called;
-  ledger_manager_->set_on_empty(callback::SetWhenCalled(&on_empty_called));
-
-  ledger_.Unbind();
-  ledger_debug_.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(on_empty_called);
-}
-
-TEST_F(LedgerManagerTest, PageIsClosedAndSyncedCheckNotFound) {
-  bool called;
-  Status status;
-  PagePredicateResult is_closed_and_synced;
-
-  PageId id = RandomId();
-
-  // Check for a page that doesn't exist.
-  storage_ptr->should_get_page_fail = true;
-  ledger_manager_->PageIsClosedAndSynced(
-      id.id, callback::Capture(callback::SetWhenCalled(&called), &status,
-                               &is_closed_and_synced));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::PAGE_NOT_FOUND, status);
-}
-
-// Check for a page that exists, is synced and open. PageIsClosedAndSynced
-// should be false.
-TEST_F(LedgerManagerTest, PageIsClosedAndSyncedCheckClosed) {
-  bool called;
-  Status status;
-  PagePredicateResult is_closed_and_synced;
-
-  storage_ptr->should_get_page_fail = false;
-  PagePtr page;
-  PageId id = RandomId();
-  storage::PageIdView storage_page_id = convert::ExtendedStringView(id.id);
-
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  storage_ptr->set_page_storage_synced(storage_page_id, true);
-  ledger_manager_->PageIsClosedAndSynced(
-      storage_page_id, callback::Capture(callback::SetWhenCalled(&called),
-                                         &status, &is_closed_and_synced));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(PagePredicateResult::PAGE_OPENED, is_closed_and_synced);
-
-  // Close the page. PageIsClosedAndSynced should now be true.
-  page.Unbind();
-  RunLoopUntilIdle();
-
-  ledger_manager_->PageIsClosedAndSynced(
-      storage_page_id, callback::Capture(callback::SetWhenCalled(&called),
-                                         &status, &is_closed_and_synced));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(PagePredicateResult::YES, is_closed_and_synced);
-}
-
-// Check for a page that exists, is closed, but is not synced.
-// PageIsClosedAndSynced should be false.
-TEST_F(LedgerManagerTest, PageIsClosedAndSyncedCheckSynced) {
-  bool called;
-  Status status;
-  PagePredicateResult is_closed_and_synced;
-
-  storage_ptr->should_get_page_fail = false;
-  PagePtr page;
-  PageId id = RandomId();
-  storage::PageIdView storage_page_id = convert::ExtendedStringView(id.id);
-
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  // Mark the page as unsynced and close it.
-  storage_ptr->set_page_storage_synced(storage_page_id, false);
-  page.Unbind();
-  RunLoopUntilIdle();
-
-  ledger_manager_->PageIsClosedAndSynced(
-      storage_page_id, callback::Capture(callback::SetWhenCalled(&called),
-                                         &status, &is_closed_and_synced));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(PagePredicateResult::NO, is_closed_and_synced);
-}
-
-// Check for a page that exists, is closed, and synced, but was opened during
-// the PageIsClosedAndSynced call. Expect an |PAGE_OPENED| result.
-TEST_F(LedgerManagerTest, PageIsClosedAndSyncedCheckPageOpened) {
-  bool called;
-  Status status;
-  PagePredicateResult is_closed_and_synced;
-
-  storage_ptr->should_get_page_fail = false;
-  PagePtr page;
-  PageId id = RandomId();
-  storage::PageIdView storage_page_id = convert::ExtendedStringView(id.id);
-
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  // Mark the page as synced and close it.
-  storage_ptr->set_page_storage_synced(storage_page_id, true);
-  page.Unbind();
-  RunLoopUntilIdle();
-
-  // Call PageIsClosedAndSynced but don't let it terminate.
-  bool page_is_closed_and_synced_called = false;
-  storage_ptr->DelayIsSyncedCallback(storage_page_id, true);
-  ledger_manager_->PageIsClosedAndSynced(
-      storage_page_id, callback::Capture(callback::SetWhenCalled(
-                                             &page_is_closed_and_synced_called),
-                                         &status, &is_closed_and_synced));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(page_is_closed_and_synced_called);
-
-  // Open and close the page.
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  page.Unbind();
-  RunLoopUntilIdle();
-
-  // Make sure PageIsClosedAndSynced terminates with a |PAGE_OPENED| result.
-  storage_ptr->CallIsSyncedCallback(storage_page_id);
-  EXPECT_TRUE(page_is_closed_and_synced_called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(PagePredicateResult::PAGE_OPENED, is_closed_and_synced);
-}
-
-// Check for a page that exists, is closed, and synced. Test two concurrent
-// calls to PageIsClosedAndSynced, where the second one will start and terminate
-// without the page being opened by external requests.
-TEST_F(LedgerManagerTest, PageIsClosedAndSyncedConcurrentCalls) {
-  bool called;
-  Status status;
-
-  storage_ptr->should_get_page_fail = false;
-  PagePtr page;
-  PageId id = RandomId();
-  storage::PageIdView storage_page_id = convert::ExtendedStringView(id.id);
-
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  // Mark the page as synced and close it.
-  storage_ptr->set_page_storage_synced(storage_page_id, true);
-  page.Unbind();
-  RunLoopUntilIdle();
-
-  // Make a first call to PageIsClosedAndSynced but don't let it terminate.
-  bool called1 = false;
-  Status status1;
-  PagePredicateResult is_closed_and_synced1;
-  storage_ptr->DelayIsSyncedCallback(storage_page_id, true);
-  ledger_manager_->PageIsClosedAndSynced(
-      storage_page_id, callback::Capture(callback::SetWhenCalled(&called1),
-                                         &status1, &is_closed_and_synced1));
-  RunLoopUntilIdle();
-
-  // Prepare for the second call: it will return immediately and the expected
-  // result is |YES|.
-  bool called2 = false;
-  Status status2;
-  PagePredicateResult is_closed_and_synced2;
-  storage_ptr->DelayIsSyncedCallback(storage_page_id, false);
-  ledger_manager_->PageIsClosedAndSynced(
-      storage_page_id, callback::Capture(callback::SetWhenCalled(&called2),
-                                         &status2, &is_closed_and_synced2));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called1);
-  EXPECT_TRUE(called2);
-  EXPECT_EQ(Status::OK, status2);
-  EXPECT_EQ(PagePredicateResult::YES, is_closed_and_synced2);
-
-  // Open and close the page.
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  page.Unbind();
-  RunLoopUntilIdle();
-
-  // Call the callback and let the first call to PageIsClosedAndSynced
-  // terminate. The expected returned result is |PAGE_OPENED|.
-  storage_ptr->CallIsSyncedCallback(storage_page_id);
-  EXPECT_TRUE(called1);
-  EXPECT_EQ(Status::OK, status1);
-  EXPECT_EQ(PagePredicateResult::PAGE_OPENED, is_closed_and_synced1);
-}
-
-TEST_F(LedgerManagerTest, PageIsClosedOfflineAndEmptyCheckNotFound) {
-  bool called;
-  Status status;
-  PagePredicateResult is_closed_offline_empty;
-
-  PageId id = RandomId();
-
-  // Check for a page that doesn't exist.
-  storage_ptr->should_get_page_fail = true;
-  ledger_manager_->PageIsClosedOfflineAndEmpty(
-      id.id, callback::Capture(callback::SetWhenCalled(&called), &status,
-                               &is_closed_offline_empty));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::PAGE_NOT_FOUND, status);
-}
-
-TEST_F(LedgerManagerTest, PageIsClosedOfflineAndEmptyCheckClosed) {
-  bool called;
-  Status status;
-  PagePredicateResult is_closed_offline_empty;
-
-  storage_ptr->should_get_page_fail = false;
-  PagePtr page;
-  PageId id = RandomId();
-  storage::PageIdView storage_page_id = convert::ExtendedStringView(id.id);
-
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  storage_ptr->set_page_storage_offline_empty(storage_page_id, true);
-  ledger_manager_->PageIsClosedOfflineAndEmpty(
-      storage_page_id, callback::Capture(callback::SetWhenCalled(&called),
-                                         &status, &is_closed_offline_empty));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(PagePredicateResult::PAGE_OPENED, is_closed_offline_empty);
-
-  // Close the page. PagePredicateResult should now be true.
-  page.Unbind();
-  RunLoopUntilIdle();
-
-  ledger_manager_->PageIsClosedOfflineAndEmpty(
-      storage_page_id, callback::Capture(callback::SetWhenCalled(&called),
-                                         &status, &is_closed_offline_empty));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(PagePredicateResult::YES, is_closed_offline_empty);
-}
-
-TEST_F(LedgerManagerTest, PageIsClosedOfflineAndEmptyCanDeletePageOnCallback) {
-  bool page_is_empty_called = false;
-  Status page_is_empty_status;
-  PagePredicateResult is_closed_offline_empty;
-  bool delete_page_called = false;
-  Status delete_page_status;
-  PageId id = RandomId();
-
-  // The page is closed, offline and empty. Try to delete the page storage in
-  // the callback.
-  storage_ptr->set_page_storage_offline_empty(id.id, true);
-  ledger_manager_->PageIsClosedOfflineAndEmpty(
-      id.id, [&](Status status, PagePredicateResult result) {
-        page_is_empty_called = true;
-        page_is_empty_status = status;
-        is_closed_offline_empty = result;
-
-        ledger_manager_->DeletePageStorage(
-            id.id,
-            callback::Capture(callback::SetWhenCalled(&delete_page_called),
-                              &delete_page_status));
-      });
-  RunLoopUntilIdle();
-  // Make sure the deletion finishes successfully.
-  ASSERT_NE(nullptr, storage_ptr->delete_page_storage_callback);
-  storage_ptr->delete_page_storage_callback(storage::Status::OK);
-
-  EXPECT_TRUE(page_is_empty_called);
-  EXPECT_EQ(Status::OK, page_is_empty_status);
-  EXPECT_EQ(PagePredicateResult::YES, is_closed_offline_empty);
-
-  EXPECT_TRUE(delete_page_called);
-  EXPECT_EQ(Status::OK, delete_page_status);
-}
-
-// Verifies that two successive calls to GetPage do not create 2 storages.
-TEST_F(LedgerManagerTest, CallGetPageTwice) {
-  PageId id = RandomId();
-
-  uint8_t calls = 0;
-  PagePtr page1;
-  ledger_->GetPage(fidl::MakeOptional(id), page1.NewRequest(),
-                   [&calls](Status) { calls++; });
-  PagePtr page2;
-  ledger_->GetPage(fidl::MakeOptional(id), page2.NewRequest(),
-                   [&calls](Status) { calls++; });
-  RunLoopUntilIdle();
-  EXPECT_EQ(2u, calls);
-  EXPECT_EQ(0u, storage_ptr->create_page_calls.size());
-  ASSERT_EQ(1u, storage_ptr->get_page_calls.size());
-  EXPECT_EQ(convert::ToString(id.id), storage_ptr->get_page_calls[0]);
-}
-
-// Cloud should never be queried.
-TEST_F(LedgerManagerTest, GetPageDoNotCallTheCloud) {
-  storage_ptr->should_get_page_fail = true;
-  Status status;
-
-  PagePtr page;
-  PageId id = RandomId();
-  bool called;
-  // Get the root page.
-  storage_ptr->ClearCalls();
-  ledger_->GetRootPage(
-      page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::INTERNAL_ERROR, status);
-  EXPECT_FALSE(sync_ptr->called);
-
-  // Get a new page with a random id.
-  storage_ptr->ClearCalls();
-  page.Unbind();
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::INTERNAL_ERROR, status);
-  EXPECT_FALSE(sync_ptr->called);
-
-  // Create a new page.
-  storage_ptr->ClearCalls();
-  page.Unbind();
-  ledger_->GetPage(
-      nullptr, page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::INTERNAL_ERROR, status);
-  EXPECT_FALSE(sync_ptr->called);
-}
-
-// Verifies that LedgerDebugImpl proxy vended by LedgerManager works correctly.
-TEST_F(LedgerManagerTest, CallGetPagesList) {
-  std::vector<PagePtr> pages(3);
-  std::vector<PageId> ids;
-
-  for (size_t i = 0; i < pages.size(); ++i) {
-    ids.push_back(RandomId());
-  }
-
-  Status status;
-
-  std::vector<PageId> actual_pages_list;
-
-  EXPECT_EQ(0u, actual_pages_list.size());
-
-  auto waiter = fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-  for (size_t i = 0; i < pages.size(); ++i) {
-    ledger_->GetPage(fidl::MakeOptional(ids[i]), pages[i].NewRequest(),
-                     waiter->NewCallback());
-  }
-
-  bool called;
-  waiter->Finalize(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  ledger_debug_->GetPagesList(
-      callback::Capture(callback::SetWhenCalled(&called), &actual_pages_list));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(pages.size(), actual_pages_list.size());
-
-  std::sort(ids.begin(), ids.end(), [](const PageId& lhs, const PageId& rhs) {
-    return convert::ToStringView(lhs.id) < convert::ToStringView(rhs.id);
-  });
-  for (size_t i = 0; i < ids.size(); i++)
-    EXPECT_EQ(ids[i].id, actual_pages_list.at(i).id);
-}
-
-TEST_F(LedgerManagerTest, OnPageOpenedClosedCalls) {
-  PagePtr page1;
-  PagePtr page2;
-  PageId id = RandomId();
-
-  EXPECT_EQ(0, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_unused_count);
-
-  // Open a page and check that OnPageOpened was called once.
-  bool called;
-  Status status;
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page1.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_unused_count);
-
-  // Open the page again and check that there is no new call to OnPageOpened.
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page2.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_unused_count);
-
-  // Close one of the two connections and check that there is still no call to
-  // OnPageClosed.
-  page1.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_unused_count);
-
-  // Close the second connection and check that OnPageClosed was called once.
-  page2.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_unused_count);
-}
-
-TEST_F(LedgerManagerTest, OnPageOpenedClosedCallInternalRequest) {
-  PagePtr page;
-  PageId id = RandomId();
-
-  EXPECT_EQ(0, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_unused_count);
-
-  // Make an internal request by calling PageIsClosedAndSynced. No calls to page
-  // opened/closed should be made.
-  bool called;
-  Status status;
-  PagePredicateResult page_state;
-  ledger_manager_->PageIsClosedAndSynced(
-      convert::ToString(id.id),
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &page_state));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(PagePredicateResult::NO, page_state);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_unused_count);
-
-  // Open the same page with an external request and check that OnPageOpened
-  // was called once.
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_unused_count);
-}
-
-TEST_F(LedgerManagerTest, OnPageOpenedClosedUnused) {
-  PagePtr page;
-  PageId id = RandomId();
-  storage::PageIdView storage_page_id = convert::ExtendedStringView(id.id);
-
-  Status status;
-  bool called = false;
-
-  EXPECT_EQ(0, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(0, disk_cleanup_manager_->page_unused_count);
-
-  // Open and close the page through an external request.
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  // Mark the page as synced and close it.
-  storage_ptr->set_page_storage_synced(storage_page_id, true);
-  page.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_unused_count);
-
-  // Start an internal request but don't let it terminate. Nothing should have
-  // changed in the notifications received.
-  PagePredicateResult is_synced;
-  bool page_is_synced_called = false;
-  storage_ptr->DelayIsSyncedCallback(storage_page_id, true);
-  ledger_manager_->PageIsClosedAndSynced(
-      storage_page_id,
-      callback::Capture(callback::SetWhenCalled(&page_is_synced_called),
-                        &status, &is_synced));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(page_is_synced_called);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_unused_count);
-
-  // Open the same page with an external request and check that OnPageOpened
-  // was called once.
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(2, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_unused_count);
-
-  // Close the page. We should get the page closed notification, but not the
-  // unused one: the internal request is still running.
-  page.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_EQ(2, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(2, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(1, disk_cleanup_manager_->page_unused_count);
-
-  // Terminate the internal request. We should now see the unused page
-  // notification.
-  storage_ptr->CallIsSyncedCallback(storage_page_id);
-  EXPECT_EQ(2, disk_cleanup_manager_->page_opened_count);
-  EXPECT_EQ(2, disk_cleanup_manager_->page_closed_count);
-  EXPECT_EQ(2, disk_cleanup_manager_->page_unused_count);
-}
-
-TEST_F(LedgerManagerTest, DeletePageStorageWhenPageOpenFails) {
-  PagePtr page;
-  PageId id = RandomId();
-  bool called;
-  Status status;
-
-  ledger_->GetPage(
-      fidl::MakeOptional(id), page.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  // Try to delete the page while it is open. Expect to get an error.
-  ledger_manager_->DeletePageStorage(
-      id.id, callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::ILLEGAL_STATE, status);
-}
-
-TEST_F(LedgerManagerTest, OpenPageWithDeletePageStorageInProgress) {
-  PagePtr page;
-  PageId id = RandomId();
-
-  // Start deleting the page.
-  bool delete_called;
-  Status delete_status;
-  ledger_manager_->DeletePageStorage(
-      id.id, callback::Capture(callback::SetWhenCalled(&delete_called),
-                               &delete_status));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(delete_called);
-
-  // Try to open the same page.
-  bool get_page_called;
-  Status get_page_status;
-  ledger_->GetPage(fidl::MakeOptional(id), page.NewRequest(),
-                   callback::Capture(callback::SetWhenCalled(&get_page_called),
-                                     &get_page_status));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(get_page_called);
-
-  // After calling the callback registered in |DeletePageStorage| both
-  // operations should terminate without an error.
-  storage_ptr->delete_page_storage_callback(storage::Status::OK);
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(delete_called);
-  EXPECT_EQ(Status::OK, delete_status);
-
-  EXPECT_TRUE(get_page_called);
-  EXPECT_EQ(Status::OK, get_page_status);
-}
-
-TEST_F(LedgerManagerTest, ChangeConflictResolver) {
-  fidl::InterfaceHandle<ConflictResolverFactory> handle1;
-  fidl::InterfaceHandle<ConflictResolverFactory> handle2;
-  StubConflictResolverFactory factory1(handle1.NewRequest());
-  StubConflictResolverFactory factory2(handle2.NewRequest());
-  Status status;
-  bool called;
-
-  ledger_->SetConflictResolverFactory(
-      std::move(handle1),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(status, Status::OK);
-
-  ledger_->SetConflictResolverFactory(
-      std::move(handle2),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(status, Status::OK);
-  EXPECT_FALSE(factory1.disconnected);
-  EXPECT_FALSE(factory2.disconnected);
-}
-
-TEST_F(LedgerManagerTest, MultipleConflictResolvers) {
-  fidl::InterfaceHandle<ConflictResolverFactory> handle1;
-  fidl::InterfaceHandle<ConflictResolverFactory> handle2;
-  StubConflictResolverFactory factory1(handle1.NewRequest());
-  StubConflictResolverFactory factory2(handle2.NewRequest());
-  Status status;
-  bool called;
-
-  LedgerPtr ledger2;
-  ledger_manager_->BindLedger(ledger2.NewRequest());
-
-  ledger_->SetConflictResolverFactory(
-      std::move(handle1),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(status, Status::OK);
-
-  ledger2->SetConflictResolverFactory(
-      std::move(handle2),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(status, Status::OK);
-  EXPECT_FALSE(factory1.disconnected);
-  EXPECT_FALSE(factory2.disconnected);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/ledger_repository_factory_impl.cc b/bin/ledger/app/ledger_repository_factory_impl.cc
deleted file mode 100644
index 5682137..0000000
--- a/bin/ledger/app/ledger_repository_factory_impl.cc
+++ /dev/null
@@ -1,421 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/ledger_repository_factory_impl.h"
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#include <lib/backoff/exponential_backoff.h>
-#include <lib/component/cpp/expose.h>
-#include <lib/component/cpp/object_dir.h>
-#include <lib/fdio/util.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/io/fd.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/eintr_wrapper.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/files/path.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/strings/concatenate.h>
-#include <lib/fxl/strings/string_view.h>
-#include <trace/event.h>
-#include <zircon/processargs.h>
-#include <zircon/syscalls.h>
-
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/disk_cleanup_manager_impl.h"
-#include "peridot/bin/ledger/app/serialization_version.h"
-#include "peridot/bin/ledger/cloud_sync/impl/user_sync_impl.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/p2p_provider/impl/p2p_provider_impl.h"
-#include "peridot/bin/ledger/p2p_provider/impl/static_user_id_provider.h"
-#include "peridot/bin/ledger/p2p_sync/impl/user_communicator_impl.h"
-#include "peridot/bin/ledger/storage/impl/leveldb_factory.h"
-#include "peridot/bin/ledger/sync_coordinator/impl/user_sync_impl.h"
-
-namespace ledger {
-
-namespace {
-
-// The contents of each repository are organized in the following way:
-//   <base_path>
-//   ├── <serialization_version>
-//   │   ├── name
-//   │   ├── cache/
-//   │   ├── page_usage_db/
-//   │   └── ledgers
-//   │       └── ...
-//   └── staging/
-//
-// - <base_path>/
-//   The base path of this repository. It is defined by the channel given in
-//   |LedgerRepositoryFactory::GetRepository| (see the internal.fidl API).
-// - <base_path>/<serialization_version>/
-//   Stores all the contents of this repository for that serialization
-//   version. It is used to store the `name` file, and subdirectories `cache/`,
-//   `page_usage_db/` and `ledgers/` (see below).
-// - <base_path>/<serialization_version>/name
-//   Stores the name of the repository, which is randomly chosen on creation.
-// - <base_path>/<serialization_version>/cache/
-//   The path used by |LevelDbFactory| as the cache directory.
-// - <base_path>/<serialization_version>/page_usage_db/
-//   The path used by |DiskCleanupManagerImpl| to store statistics on pages.
-// - <base_path>/<serialization_version>/ledgers/
-//   The path used by |LedgerRepositoryImpl| to store all Ledger instances for
-//   this repository.
-// - <base_path>/staging/
-//   The staging path. Used for removing all contents of this repository.
-//
-// Note that content/ should be the only directory storing information on the
-// repository: When deleting a repository, the content/ directory is moved
-// atomically to the staging path and then contents are recursively deleted.
-// This two-phase deletion guarantees that the repository will be in a correct
-// state even if the deletion execution is unexpectedly terminated.
-
-constexpr fxl::StringView kCachePath = "cache";
-constexpr fxl::StringView kPageUsageDbPath = "page_usage_db";
-constexpr fxl::StringView kLedgersPath = "ledgers";
-constexpr fxl::StringView kStagingPath = "staging";
-constexpr fxl::StringView kNamePath = "name";
-
-bool GetRepositoryName(rng::Random* random, const DetachedPath& content_path,
-                       std::string* name) {
-  DetachedPath name_path = content_path.SubPath(kNamePath);
-
-  if (files::ReadFileToStringAt(name_path.root_fd(), name_path.path(), name)) {
-    return true;
-  }
-
-  if (!files::CreateDirectoryAt(content_path.root_fd(), content_path.path())) {
-    return false;
-  }
-
-  std::string new_name;
-  new_name.resize(16);
-  random->Draw(&new_name);
-  if (!files::WriteFileAt(name_path.root_fd(), name_path.path(),
-                          new_name.c_str(), new_name.size())) {
-    FXL_LOG(ERROR) << "Unable to write file at: " << name_path.path();
-    return false;
-  }
-
-  name->swap(new_name);
-  return true;
-}
-
-}  // namespace
-
-// Container for a LedgerRepositoryImpl that keeps track of the in-flight FIDL
-// requests and callbacks and fires them when the repository is available.
-class LedgerRepositoryFactoryImpl::LedgerRepositoryContainer {
- public:
-  explicit LedgerRepositoryContainer(fxl::UniqueFD root_fd)
-      : root_fd_(std::move(root_fd)) {}
-  ~LedgerRepositoryContainer() {
-    for (const auto& request : requests_) {
-      request.second(Status::INTERNAL_ERROR);
-    }
-  }
-
-  void set_on_empty(fit::closure on_empty_callback) {
-    if (ledger_repository_) {
-      ledger_repository_->set_on_empty(std::move(on_empty_callback));
-    } else {
-      on_empty_callback_ = std::move(on_empty_callback);
-    }
-  };
-
-  // Forwards to the Inspect method of the wrapped LedgerRepositoryImpl, if the
-  // wrapped LedgerRepositoryImpl is present. Otherwise does nothing.
-  void Inspect(std::string display_name,
-               component::Object::ObjectVector* out) const {
-    if (ledger_repository_) {
-      ledger_repository_->Inspect(std::move(display_name), out);
-    }
-  }
-
-  // Keeps track of |request| and |callback|. Binds |request| and fires
-  // |callback| when the repository is available or an error occurs.
-  void BindRepository(
-      fidl::InterfaceRequest<ledger_internal::LedgerRepository> request,
-      fit::function<void(Status)> callback) {
-    if (status_ != Status::OK) {
-      callback(status_);
-      return;
-    }
-    if (ledger_repository_) {
-      ledger_repository_->BindRepository(std::move(request));
-      callback(status_);
-      return;
-    }
-    requests_.emplace_back(std::move(request), std::move(callback));
-  }
-
-  // Sets the implementation or the error status for the container. This
-  // notifies all awaiting callbacks and binds all pages in case of success.
-  void SetRepository(Status status,
-                     std::unique_ptr<LedgerRepositoryImpl> ledger_repository) {
-    FXL_DCHECK(!ledger_repository_);
-    FXL_DCHECK(status != Status::OK || ledger_repository);
-    status_ = status;
-    ledger_repository_ = std::move(ledger_repository);
-    for (auto& request : requests_) {
-      if (ledger_repository_) {
-        ledger_repository_->BindRepository(std::move(request.first));
-      }
-      request.second(status_);
-    }
-    requests_.clear();
-    if (on_empty_callback_) {
-      if (ledger_repository_) {
-        ledger_repository_->set_on_empty(std::move(on_empty_callback_));
-      } else {
-        on_empty_callback_();
-      }
-    }
-  }
-
-  // Shuts down the repository impl (if already initialized) and detaches all
-  // handles bound to it, moving their owneship to the container.
-  void Detach() {
-    if (ledger_repository_) {
-      detached_handles_ = ledger_repository_->Unbind();
-      ledger_repository_.reset();
-    }
-    for (auto& request : requests_) {
-      detached_handles_.push_back(std::move(request.first));
-    }
-
-    // TODO(ppi): rather than failing all already pending and future requests,
-    // we should stash them and fulfill them once the deletion is finished.
-    status_ = Status::INTERNAL_ERROR;
-  }
-
- private:
-  fxl::UniqueFD root_fd_;
-  std::unique_ptr<LedgerRepositoryImpl> ledger_repository_;
-  Status status_ = Status::OK;
-  std::vector<
-      std::pair<fidl::InterfaceRequest<ledger_internal::LedgerRepository>,
-                fit::function<void(Status)>>>
-      requests_;
-  fit::closure on_empty_callback_;
-  std::vector<fidl::InterfaceRequest<ledger_internal::LedgerRepository>>
-      detached_handles_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerRepositoryContainer);
-};
-
-struct LedgerRepositoryFactoryImpl::RepositoryInformation {
- public:
-  explicit RepositoryInformation(int root_fd, std::string user_id)
-      : base_path(root_fd),
-        content_path(base_path.SubPath(kSerializationVersion)),
-        cache_path(content_path.SubPath(kCachePath)),
-        page_usage_db_path(content_path.SubPath(kPageUsageDbPath)),
-        ledgers_path(content_path.SubPath(kLedgersPath)),
-        staging_path(base_path.SubPath(kStagingPath)),
-        user_id(std::move(user_id)) {}
-
-  RepositoryInformation(const RepositoryInformation& other) = default;
-  RepositoryInformation(RepositoryInformation&& other) = default;
-
-  bool Init(rng::Random* random) {
-    return GetRepositoryName(random, content_path, &name);
-  }
-
-  DetachedPath base_path;
-  DetachedPath content_path;
-  DetachedPath cache_path;
-  DetachedPath page_usage_db_path;
-  DetachedPath ledgers_path;
-  DetachedPath staging_path;
-  std::string user_id;
-  std::string name;
-};
-
-LedgerRepositoryFactoryImpl::LedgerRepositoryFactoryImpl(
-    Environment* environment,
-    std::unique_ptr<p2p_sync::UserCommunicatorFactory>
-        user_communicator_factory,
-    component::ObjectDir inspect_object_dir)
-    : environment_(environment),
-      user_communicator_factory_(std::move(user_communicator_factory)),
-      inspect_object_dir_(std::move(inspect_object_dir)) {}
-
-LedgerRepositoryFactoryImpl::~LedgerRepositoryFactoryImpl() {}
-
-void LedgerRepositoryFactoryImpl::GetChildren(
-    component::Object::ObjectVector* out) {
-  for (const auto& [name, container] : repositories_) {
-    container.Inspect(convert::ToHex(name), out);
-  }
-}
-
-void LedgerRepositoryFactoryImpl::GetRepository(
-    zx::channel repository_handle,
-    fidl::InterfaceHandle<cloud_provider::CloudProvider> cloud_provider,
-    std::string user_id,
-    fidl::InterfaceRequest<ledger_internal::LedgerRepository>
-        repository_request,
-    fit::function<void(Status)> callback) {
-  fxl::UniqueFD root_fd =
-      fsl::OpenChannelAsFileDescriptor(std::move(repository_handle));
-  if (!root_fd.is_valid()) {
-    callback(Status::IO_ERROR);
-    return;
-  }
-  GetRepositoryByFD(std::move(root_fd), std::move(cloud_provider), user_id,
-                    std::move(repository_request), std::move(callback));
-}
-
-void LedgerRepositoryFactoryImpl::GetRepositoryByFD(
-    fxl::UniqueFD root_fd,
-    fidl::InterfaceHandle<cloud_provider::CloudProvider> cloud_provider,
-    std::string user_id,
-    fidl::InterfaceRequest<ledger_internal::LedgerRepository>
-        repository_request,
-    fit::function<void(Status)> callback) {
-  TRACE_DURATION("ledger", "repository_factory_get_repository");
-
-  RepositoryInformation repository_information(root_fd.get(),
-                                               std::move(user_id));
-  if (!repository_information.Init(environment_->random())) {
-    callback(Status::IO_ERROR);
-    return;
-  }
-
-  auto it = repositories_.find(repository_information.name);
-  if (it != repositories_.end()) {
-    it->second.BindRepository(std::move(repository_request),
-                              std::move(callback));
-    return;
-  }
-
-  auto ret =
-      repositories_.emplace(std::piecewise_construct,
-                            std::forward_as_tuple(repository_information.name),
-                            std::forward_as_tuple(std::move(root_fd)));
-  LedgerRepositoryContainer* container = &ret.first->second;
-  container->BindRepository(std::move(repository_request), std::move(callback));
-
-  auto db_factory = std::make_unique<storage::LevelDbFactory>(
-      environment_, repository_information.cache_path);
-  db_factory->Init();
-  auto disk_cleanup_manager = std::make_unique<DiskCleanupManagerImpl>(
-      environment_, db_factory.get(),
-      repository_information.page_usage_db_path);
-  Status status = disk_cleanup_manager->Init();
-  if (status != Status::OK) {
-    container->SetRepository(status, nullptr);
-    return;
-  }
-
-  std::unique_ptr<SyncWatcherSet> watchers = std::make_unique<SyncWatcherSet>();
-  std::unique_ptr<sync_coordinator::UserSyncImpl> user_sync;
-  if (cloud_provider) {
-    user_sync = CreateUserSync(repository_information,
-                               std::move(cloud_provider), watchers.get());
-  } else {
-    FXL_LOG(WARNING) << "No cloud provider - Ledger will work locally but "
-                     << "not sync. (running in Guest mode?)";
-  }
-
-  DiskCleanupManagerImpl* disk_cleanup_manager_ptr = disk_cleanup_manager.get();
-  auto repository = std::make_unique<LedgerRepositoryImpl>(
-      repository_information.ledgers_path, environment_, std::move(db_factory),
-      std::move(watchers), std::move(user_sync),
-      std::move(disk_cleanup_manager), disk_cleanup_manager_ptr);
-  disk_cleanup_manager_ptr->SetPageEvictionDelegate(repository.get());
-  container->SetRepository(Status::OK, std::move(repository));
-}
-
-std::unique_ptr<sync_coordinator::UserSyncImpl>
-LedgerRepositoryFactoryImpl::CreateUserSync(
-    const RepositoryInformation& repository_information,
-    fidl::InterfaceHandle<cloud_provider::CloudProvider> cloud_provider,
-    SyncWatcherSet* watchers) {
-  auto cloud_provider_ptr = cloud_provider.Bind();
-  cloud_provider_ptr.set_error_handler([](zx_status_t status) {
-    FXL_LOG(ERROR)
-        << "Lost connection to cloud provider; cloud sync will no longer work.";
-  });
-
-  cloud_sync::UserConfig user_config;
-  user_config.user_directory = repository_information.content_path;
-  user_config.cloud_provider = std::move(cloud_provider_ptr);
-  fit::closure on_version_mismatch = [this, repository_information]() mutable {
-    OnVersionMismatch(repository_information);
-  };
-  auto cloud_sync = std::make_unique<cloud_sync::UserSyncImpl>(
-      environment_, std::move(user_config), environment_->MakeBackoff(),
-      std::move(on_version_mismatch));
-  std::unique_ptr<p2p_sync::UserCommunicator> p2p_sync =
-      CreateP2PSync(repository_information);
-
-  auto user_sync = std::make_unique<sync_coordinator::UserSyncImpl>(
-      std::move(cloud_sync), std::move(p2p_sync));
-  user_sync->SetWatcher(watchers);
-  user_sync->Start();
-  return user_sync;
-}
-
-std::unique_ptr<p2p_sync::UserCommunicator>
-LedgerRepositoryFactoryImpl::CreateP2PSync(
-    const RepositoryInformation& repository_information) {
-  if (!user_communicator_factory_) {
-    return nullptr;
-  }
-
-  if (repository_information.user_id.empty()) {
-    return nullptr;
-  }
-
-  auto user_id_provider = std::make_unique<p2p_provider::StaticUserIdProvider>(
-      repository_information.user_id);
-
-  return user_communicator_factory_->GetUserCommunicator(
-      std::move(user_id_provider));
-}
-
-void LedgerRepositoryFactoryImpl::OnVersionMismatch(
-    RepositoryInformation repository_information) {
-  FXL_LOG(WARNING)
-      << "Data in the cloud was wiped out, erasing local state. "
-      << "This should log you out, log back in to start syncing again.";
-
-  // First, shut down the repository so that we can delete the files while it's
-  // not running.
-  auto find_repository = repositories_.find(repository_information.name);
-  FXL_DCHECK(find_repository != repositories_.end());
-  find_repository->second.Detach();
-  DeleteRepositoryDirectory(repository_information);
-  repositories_.erase(find_repository);
-}
-
-Status LedgerRepositoryFactoryImpl::DeleteRepositoryDirectory(
-    const RepositoryInformation& repository_information) {
-  files::ScopedTempDirAt tmp_directory(
-      repository_information.staging_path.root_fd(),
-      repository_information.staging_path.path());
-  std::string destination = tmp_directory.path() + "/content";
-
-  if (renameat(repository_information.content_path.root_fd(),
-               repository_information.content_path.path().c_str(),
-               tmp_directory.root_fd(), destination.c_str()) != 0) {
-    FXL_LOG(ERROR) << "Unable to move repository local storage to "
-                   << destination << ". Error: " << strerror(errno);
-    return Status::IO_ERROR;
-  }
-  if (!files::DeletePathAt(tmp_directory.root_fd(), destination, true)) {
-    FXL_LOG(ERROR) << "Unable to delete repository staging storage at "
-                   << destination;
-    return Status::IO_ERROR;
-  }
-  return Status::OK;
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/ledger_repository_factory_impl.h b/bin/ledger/app/ledger_repository_factory_impl.h
deleted file mode 100644
index 631d50e..0000000
--- a/bin/ledger/app/ledger_repository_factory_impl.h
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_LEDGER_REPOSITORY_FACTORY_IMPL_H_
-#define PERIDOT_BIN_LEDGER_APP_LEDGER_REPOSITORY_FACTORY_IMPL_H_
-
-#include <memory>
-#include <string>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <fuchsia/modular/auth/cpp/fidl.h>
-#include <fuchsia/netconnector/cpp/fidl.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/callback/cancellable.h>
-#include <lib/callback/managed_container.h>
-#include <lib/component/cpp/expose.h>
-#include <lib/fxl/files/unique_fd.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/app/disk_cleanup_manager_impl.h"
-#include "peridot/bin/ledger/app/ledger_repository_impl.h"
-#include "peridot/bin/ledger/cloud_sync/public/user_config.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/fidl/error_notifier.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/p2p_sync/public/user_communicator_factory.h"
-#include "peridot/bin/ledger/sync_coordinator/impl/user_sync_impl.h"
-
-namespace ledger {
-
-class LedgerRepositoryFactoryImpl
-    : public ::fuchsia::ledger::internal::
-          LedgerRepositoryFactoryErrorNotifierDelegate {
- public:
-  explicit LedgerRepositoryFactoryImpl(
-      Environment* environment,
-      std::unique_ptr<p2p_sync::UserCommunicatorFactory>
-          user_communicator_factory,
-      component::ObjectDir inspect_object_dir);
-  ~LedgerRepositoryFactoryImpl() override;
-
-  // Populates |out| with children to be traversed (or not) during an
-  // inspection.
-  void GetChildren(component::Object::ObjectVector* out);
-
-  // LedgerRepositoryFactoryErrorNotifierDelegate:
-  void GetRepository(
-      zx::channel repository_handle,
-      fidl::InterfaceHandle<cloud_provider::CloudProvider> cloud_provider,
-      std::string user_id,
-      fidl::InterfaceRequest<ledger_internal::LedgerRepository>
-          repository_request,
-      fit::function<void(Status)> callback) override;
-
- private:
-  class LedgerRepositoryContainer;
-  struct RepositoryInformation;
-
-  // Binds |repository_request| to the repository stored in the directory opened
-  // in |root_fd|.
-  void GetRepositoryByFD(
-      fxl::UniqueFD root_fd,
-      fidl::InterfaceHandle<cloud_provider::CloudProvider> cloud_provider,
-      std::string user_id,
-      fidl::InterfaceRequest<ledger_internal::LedgerRepository>
-          repository_request,
-      fit::function<void(Status)> callback);
-  std::unique_ptr<sync_coordinator::UserSyncImpl> CreateUserSync(
-      const RepositoryInformation& repository_information,
-      fidl::InterfaceHandle<cloud_provider::CloudProvider> cloud_provider,
-      SyncWatcherSet* watchers);
-  std::unique_ptr<p2p_sync::UserCommunicator> CreateP2PSync(
-      const RepositoryInformation& repository_information);
-  void OnVersionMismatch(RepositoryInformation repository_information);
-
-  Status DeleteRepositoryDirectory(
-      const RepositoryInformation& repository_information);
-
-  Environment* const environment_;
-  std::unique_ptr<p2p_sync::UserCommunicatorFactory> const
-      user_communicator_factory_;
-
-  callback::AutoCleanableMap<std::string, LedgerRepositoryContainer>
-      repositories_;
-
-  component::ObjectDir inspect_object_dir_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerRepositoryFactoryImpl);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_LEDGER_REPOSITORY_FACTORY_IMPL_H_
diff --git a/bin/ledger/app/ledger_repository_factory_impl_unittest.cc b/bin/ledger/app/ledger_repository_factory_impl_unittest.cc
deleted file mode 100644
index af543c6..0000000
--- a/bin/ledger/app/ledger_repository_factory_impl_unittest.cc
+++ /dev/null
@@ -1,345 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/ledger_repository_factory_impl.h"
-
-#include <fuchsia/inspect/cpp/fidl.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fsl/io/fd.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/unique_fd.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/testing/inspect.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace ledger {
-namespace {
-
-using ::testing::ElementsAre;
-using ::testing::IsEmpty;
-using ::testing::Not;
-using ::testing::SizeIs;
-using ::testing::UnorderedElementsAre;
-
-constexpr fxl::StringView kObjectsName = "test objects";
-constexpr fxl::StringView kUserID = "test user ID";
-
-class LedgerRepositoryFactoryImplTest : public TestWithEnvironment {
- public:
-  LedgerRepositoryFactoryImplTest() {
-    object_dir_ =
-        component::ObjectDir::Make({kObjectsName.data(), kObjectsName.size()});
-    repository_factory_ = std::make_unique<LedgerRepositoryFactoryImpl>(
-        &environment_, nullptr, object_dir_);
-    object_dir_.set_children_callback(
-        {kRepositoriesInspectPathComponent},
-        [this](component::Object::ObjectVector* out) {
-          repository_factory_->GetChildren(out);
-        });
-  }
-
-  ~LedgerRepositoryFactoryImplTest() override {
-    object_dir_.set_children_callback({kRepositoriesInspectPathComponent},
-                                      nullptr);
-  }
-
- protected:
-  ::testing::AssertionResult CreateDirectory(std::string name);
-  ::testing::AssertionResult CallGetRepository(
-      std::string name,
-      ledger_internal::LedgerRepositoryPtr* ledger_repository_ptr);
-  ::testing::AssertionResult ReadTopLevelData(fuchsia::inspect::Object* object);
-  ::testing::AssertionResult ListTopLevelChildren(
-      std::vector<std::string>* children);
-  ::testing::AssertionResult OpenTopLevelRepositoriesChild(
-      fuchsia::inspect::InspectPtr* repositories_inspect_ptr);
-  ::testing::AssertionResult ReadData(fuchsia::inspect::InspectPtr* inspect_ptr,
-                                      fuchsia::inspect::Object* object);
-  ::testing::AssertionResult ListChildren(
-      fuchsia::inspect::InspectPtr* inspect_ptr,
-      std::vector<std::string>* children_names);
-  ::testing::AssertionResult OpenChild(
-      fuchsia::inspect::InspectPtr* parent_inspect_ptr,
-      std::string child_name,
-      fuchsia::inspect::InspectPtr* child_inspect_ptr);
-
-  scoped_tmpfs::ScopedTmpFS tmpfs_;
-  component::ObjectDir object_dir_;
-  std::unique_ptr<LedgerRepositoryFactoryImpl> repository_factory_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerRepositoryFactoryImplTest);
-};
-
-::testing::AssertionResult LedgerRepositoryFactoryImplTest::CreateDirectory(
-    std::string name) {
-  if (!files::CreateDirectoryAt(tmpfs_.root_fd(), name)) {
-    return ::testing::AssertionFailure()
-           << "Failed to create directory \"" << name << "\"!";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult LedgerRepositoryFactoryImplTest::CallGetRepository(
-    std::string name,
-    ledger_internal::LedgerRepositoryPtr* ledger_repository_ptr) {
-  fxl::UniqueFD fd(openat(tmpfs_.root_fd(), name.c_str(), O_PATH));
-  if (!fd.is_valid()) {
-    return ::testing::AssertionFailure()
-           << "Failed to validate directory \"" << name << "\"!";
-  }
-
-  bool callback_called;
-  Status status = Status::UNKNOWN_ERROR;
-
-  repository_factory_->GetRepository(
-      fsl::CloneChannelFromFileDescriptor(fd.get()), nullptr,
-      kUserID.ToString(), ledger_repository_ptr->NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &status));
-
-  if (!callback_called) {
-    return ::testing::AssertionFailure()
-           << "Callback passed to GetRepository not called!";
-  }
-  if (status != Status::OK) {
-    return ::testing::AssertionFailure() << "Status of GetRepository call was "
-                                         << static_cast<int32_t>(status) << "!";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult LedgerRepositoryFactoryImplTest::ReadTopLevelData(
-    fuchsia::inspect::Object* object) {
-  bool callback_called;
-
-  object_dir_.object()->ReadData(
-      callback::Capture(callback::SetWhenCalled(&callback_called), object));
-  RunLoopUntilIdle();
-
-  if (!callback_called) {
-    return ::testing::AssertionFailure()
-           << "Callback passed to object_dir_.object()->ReadData not called!";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult
-LedgerRepositoryFactoryImplTest::ListTopLevelChildren(
-    std::vector<std::string>* children) {
-  bool callback_called;
-
-  object_dir_.object()->ListChildren(
-      callback::Capture(callback::SetWhenCalled(&callback_called), children));
-  RunLoopUntilIdle();
-
-  if (!callback_called) {
-    return ::testing::AssertionFailure()
-           << "Callback passed to object_dir_.object()->ListChildren not "
-              "called!";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult
-LedgerRepositoryFactoryImplTest::OpenTopLevelRepositoriesChild(
-    fuchsia::inspect::InspectPtr* repositories_inspect_ptr) {
-  bool callback_called;
-  bool success = false;
-
-  object_dir_.object()->OpenChild(
-      kRepositoriesInspectPathComponent, repositories_inspect_ptr->NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&callback_called), &success));
-  RunLoopUntilIdle();
-
-  if (!callback_called) {
-    return ::testing::AssertionFailure()
-           << "Callback passed to object_dir_.object()->OpenChild not called!";
-  }
-  if (!success) {
-    return ::testing::AssertionFailure()
-           << "object_dir_.object()->OpenChild call unsuccessful!";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult LedgerRepositoryFactoryImplTest::ReadData(
-    fuchsia::inspect::InspectPtr* inspect_ptr,
-    fuchsia::inspect::Object* object) {
-  bool callback_called;
-
-  (*inspect_ptr)
-      ->ReadData(
-          callback::Capture(callback::SetWhenCalled(&callback_called), object));
-  RunLoopUntilIdle();
-
-  if (!callback_called) {
-    return ::testing::AssertionFailure() << "ReadData callback not called!";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult LedgerRepositoryFactoryImplTest::ListChildren(
-    fuchsia::inspect::InspectPtr* inspect_ptr,
-    std::vector<std::string>* children_names) {
-  bool callback_called;
-
-  (*inspect_ptr)
-      ->ListChildren(callback::Capture(
-          callback::SetWhenCalled(&callback_called), children_names));
-  RunLoopUntilIdle();
-
-  if (!callback_called) {
-    return ::testing::AssertionFailure() << "ListChildren callback not called!";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult LedgerRepositoryFactoryImplTest::OpenChild(
-    fuchsia::inspect::InspectPtr* parent_inspect_ptr,
-    std::string child_name,
-    fuchsia::inspect::InspectPtr* child_inspect_ptr) {
-  bool callback_called;
-  bool success = false;
-
-  (*parent_inspect_ptr)
-      ->OpenChild(child_name, child_inspect_ptr->NewRequest(),
-                  callback::Capture(callback::SetWhenCalled(&callback_called),
-                                    &success));
-  RunLoopUntilIdle();
-
-  if (!callback_called) {
-    return ::testing::AssertionFailure() << "OpenChild callback not called!";
-  }
-  if (!success) {
-    return ::testing::AssertionFailure() << "OpenChild call unsuccessful!";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-TEST_F(LedgerRepositoryFactoryImplTest, InspectAPINoRepositories) {
-  fuchsia::inspect::Object object;
-  std::vector<std::string> children;
-
-  ASSERT_TRUE(ReadTopLevelData(&object));
-  ASSERT_TRUE(ListTopLevelChildren(&children));
-
-  EXPECT_EQ(kObjectsName, object.name);
-  EXPECT_THAT(*object.properties, IsEmpty());
-  EXPECT_THAT(*object.metrics, IsEmpty());
-  EXPECT_THAT(children, ElementsAre(kRepositoriesInspectPathComponent));
-}
-
-TEST_F(LedgerRepositoryFactoryImplTest,
-       InspectAPITwoRepositoriesOneAccessedTwice) {
-  // The directories in which the two repositories will be created.
-  std::string first_directory = "first directory";
-  std::string second_directory = "second directory";
-
-  // The names of the two repositories, determined by the
-  // LedgerRepositoryFactoryImpl under test.
-  fidl::StringPtr first_repository_name;
-  fidl::StringPtr second_repository_name;
-
-  // Bindings to the two repositories. If these are not maintained, the
-  // LedgerRepositoryFactoryImpl::LedgerRepositoryContainer objects associated
-  // with the repositories will be destroyed and the repositories will no
-  // longer appear represented in the Inspect API.
-  ledger_internal::LedgerRepositoryPtr first_ledger_repository_ptr;
-  ledger_internal::LedgerRepositoryPtr second_ledger_repository_ptr;
-  ledger_internal::LedgerRepositoryPtr first_again_ledger_repository_ptr;
-
-  // Bindings to Inspect API "Inspect" objects. Because the Ledger objects'
-  // parent-child relationships are dynamically computed, these need to be
-  // unbound and rebound for each inspection of the repositories.
-  fuchsia::inspect::InspectPtr repositories_inspect_ptr;
-  fuchsia::inspect::InspectPtr first_repository_inspect_ptr;
-  fuchsia::inspect::InspectPtr second_repository_inspect_ptr;
-
-  // Temporary objects populated and cleared throughout the test.
-  fuchsia::inspect::Object object;
-  std::vector<std::string> children_names;
-
-  // Create the directories for the repositories.
-  ASSERT_TRUE(CreateDirectory(first_directory));
-  ASSERT_TRUE(CreateDirectory(second_directory));
-
-  // Request one repository, then query the object_dir_ (and its children) to
-  // verify that that repository is listed (and to learn the name under which
-  // it is listed) and that it was requested once.
-  ASSERT_TRUE(CallGetRepository(first_directory, &first_ledger_repository_ptr));
-  ASSERT_TRUE(ListTopLevelChildren(&children_names));
-  EXPECT_THAT(children_names, ElementsAre(kRepositoriesInspectPathComponent));
-  ASSERT_TRUE(OpenTopLevelRepositoriesChild(&repositories_inspect_ptr));
-  ASSERT_TRUE(ListChildren(&repositories_inspect_ptr, &children_names));
-  EXPECT_THAT(children_names, SizeIs(1));
-  first_repository_name = children_names.at(0);
-  EXPECT_THAT(*first_repository_name, Not(IsEmpty()));
-  ASSERT_TRUE(OpenChild(&repositories_inspect_ptr, first_repository_name,
-                        &first_repository_inspect_ptr));
-  ASSERT_TRUE(ReadData(&first_repository_inspect_ptr, &object));
-  EXPECT_EQ(first_repository_name, object.name);
-  ExpectRequestsMetric(&object, 1UL);
-
-  // Request a second repository, then query the "repositories" Inspect object
-  // to verify that that second repository is listed in addition to the first
-  // (and to learn the name under which it is listed) and that the two
-  // repositories were each requested once.
-  ASSERT_TRUE(
-      CallGetRepository(second_directory, &second_ledger_repository_ptr));
-  ASSERT_TRUE(ListTopLevelChildren(&children_names));
-  EXPECT_THAT(children_names, ElementsAre(kRepositoriesInspectPathComponent));
-  ASSERT_TRUE(OpenTopLevelRepositoriesChild(&repositories_inspect_ptr));
-  ASSERT_TRUE(ListChildren(&repositories_inspect_ptr, &children_names));
-  EXPECT_THAT(children_names, SizeIs(2));
-  second_repository_name =
-      *find_if_not(children_names.begin(), children_names.end(),
-                   [&first_repository_name](const auto& name) {
-                     return name == first_repository_name;
-                   });
-  EXPECT_THAT(children_names, UnorderedElementsAre(first_repository_name,
-                                                    second_repository_name));
-  EXPECT_THAT(*second_repository_name, Not(IsEmpty()));
-  ASSERT_TRUE(OpenChild(&repositories_inspect_ptr, first_repository_name,
-                        &first_repository_inspect_ptr));
-  ASSERT_TRUE(OpenChild(&repositories_inspect_ptr, second_repository_name,
-                        &second_repository_inspect_ptr));
-  ASSERT_TRUE(ReadData(&first_repository_inspect_ptr, &object));
-  EXPECT_EQ(first_repository_name, object.name);
-  ExpectRequestsMetric(&object, 1UL);
-  ASSERT_TRUE(ReadData(&second_repository_inspect_ptr, &object));
-  EXPECT_EQ(second_repository_name, object.name);
-  ExpectRequestsMetric(&object, 1UL);
-
-  // Request the first repository a second time, then query the "repositories"
-  // Inspect object to verify that both repositories remain listed (with their
-  // same names) and are described as having been requested twice and once,
-  // respectively.
-  ASSERT_TRUE(
-      CallGetRepository(first_directory, &first_again_ledger_repository_ptr));
-  ASSERT_TRUE(ListTopLevelChildren(&children_names));
-  EXPECT_THAT(children_names, ElementsAre(kRepositoriesInspectPathComponent));
-  ASSERT_TRUE(OpenTopLevelRepositoriesChild(&repositories_inspect_ptr));
-  ASSERT_TRUE(ListChildren(&repositories_inspect_ptr, &children_names));
-  EXPECT_THAT(children_names, UnorderedElementsAre(first_repository_name,
-                                                    second_repository_name));
-  ASSERT_TRUE(OpenChild(&repositories_inspect_ptr, first_repository_name,
-                        &first_repository_inspect_ptr));
-  ASSERT_TRUE(OpenChild(&repositories_inspect_ptr, second_repository_name,
-                        &second_repository_inspect_ptr));
-  ASSERT_TRUE(ReadData(&first_repository_inspect_ptr, &object));
-  EXPECT_EQ(first_repository_name, object.name);
-  ExpectRequestsMetric(&object, 2UL);
-  ASSERT_TRUE(ReadData(&second_repository_inspect_ptr, &object));
-  EXPECT_EQ(second_repository_name, object.name);
-  ExpectRequestsMetric(&object, 1UL);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/ledger_repository_impl.cc b/bin/ledger/app/ledger_repository_impl.cc
deleted file mode 100644
index 3c95ba9..0000000
--- a/bin/ledger/app/ledger_repository_impl.cc
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/ledger_repository_impl.h"
-
-#include <lib/component/cpp/expose.h>
-#include <lib/component/cpp/object_dir.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/bin/ledger/cloud_sync/impl/ledger_sync_impl.h"
-#include "peridot/bin/ledger/p2p_sync/public/ledger_communicator.h"
-#include "peridot/bin/ledger/storage/impl/ledger_storage_impl.h"
-#include "peridot/bin/ledger/sync_coordinator/public/ledger_sync.h"
-#include "peridot/lib/base64url/base64url.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-// Encodes opaque bytes in a way that is usable as a directory name.
-std::string GetDirectoryName(fxl::StringView bytes) {
-  return base64url::Base64UrlEncode(bytes);
-}
-}  // namespace
-
-LedgerRepositoryImpl::LedgerRepositoryImpl(
-    DetachedPath content_path, Environment* environment,
-    std::unique_ptr<storage::DbFactory> db_factory,
-    std::unique_ptr<SyncWatcherSet> watchers,
-    std::unique_ptr<sync_coordinator::UserSync> user_sync,
-    std::unique_ptr<DiskCleanupManager> disk_cleanup_manager,
-    PageUsageListener* page_usage_listener)
-    : content_path_(std::move(content_path)),
-      environment_(environment),
-      db_factory_(std::move(db_factory)),
-      encryption_service_factory_(environment),
-      watchers_(std::move(watchers)),
-      user_sync_(std::move(user_sync)),
-      disk_cleanup_manager_(std::move(disk_cleanup_manager)),
-      page_usage_listener_(page_usage_listener) {
-  bindings_.set_on_empty([this] { CheckEmpty(); });
-  ledger_managers_.set_on_empty([this] { CheckEmpty(); });
-  ledger_repository_debug_bindings_.set_empty_set_handler(
-      [this] { CheckEmpty(); });
-  disk_cleanup_manager_->set_on_empty([this] { CheckEmpty(); });
-}
-
-LedgerRepositoryImpl::~LedgerRepositoryImpl() {}
-
-void LedgerRepositoryImpl::Inspect(std::string display_name,
-                                   component::Object::ObjectVector* out) const {
-  auto object_dir = component::ObjectDir::Make(std::move(display_name));
-  object_dir.set_metric({kRequestsInspectPathComponent},
-                        component::UIntMetric(bindings_.size()));
-  object_dir.set_children_callback(
-      [/*this*/](component::Object::ObjectVector* out) {
-        // TODO(nathaniel): This is the next level down of inspection...
-      });
-  out->push_back(object_dir.object());
-}
-
-void LedgerRepositoryImpl::BindRepository(
-    fidl::InterfaceRequest<ledger_internal::LedgerRepository>
-        repository_request) {
-  bindings_.emplace(this, std::move(repository_request));
-}
-
-void LedgerRepositoryImpl::PageIsClosedAndSynced(
-    fxl::StringView ledger_name, storage::PageIdView page_id,
-    fit::function<void(Status, PagePredicateResult)> callback) {
-  LedgerManager* ledger_manager;
-  Status status = GetLedgerManager(ledger_name, &ledger_manager);
-  if (status != Status::OK) {
-    callback(status, PagePredicateResult::PAGE_OPENED);
-    return;
-  }
-
-  FXL_DCHECK(ledger_manager);
-  ledger_manager->PageIsClosedAndSynced(page_id, std::move(callback));
-}
-
-void LedgerRepositoryImpl::PageIsClosedOfflineAndEmpty(
-    fxl::StringView ledger_name, storage::PageIdView page_id,
-    fit::function<void(Status, PagePredicateResult)> callback) {
-  LedgerManager* ledger_manager;
-  Status status = GetLedgerManager(ledger_name, &ledger_manager);
-  if (status != Status::OK) {
-    callback(status, PagePredicateResult::PAGE_OPENED);
-    return;
-  }
-  FXL_DCHECK(ledger_manager);
-  ledger_manager->PageIsClosedOfflineAndEmpty(page_id, std::move(callback));
-}
-
-void LedgerRepositoryImpl::DeletePageStorage(
-    fxl::StringView ledger_name, storage::PageIdView page_id,
-    fit::function<void(Status)> callback) {
-  LedgerManager* ledger_manager;
-  Status status = GetLedgerManager(ledger_name, &ledger_manager);
-  if (status != Status::OK) {
-    callback(status);
-    return;
-  }
-  FXL_DCHECK(ledger_manager);
-  return ledger_manager->DeletePageStorage(page_id, std::move(callback));
-}
-
-std::vector<fidl::InterfaceRequest<ledger_internal::LedgerRepository>>
-LedgerRepositoryImpl::Unbind() {
-  std::vector<fidl::InterfaceRequest<ledger_internal::LedgerRepository>>
-      handles;
-  for (auto& binding : bindings_) {
-    handles.push_back(binding.Unbind());
-  }
-  bindings_.clear();
-  return handles;
-}
-
-Status LedgerRepositoryImpl::GetLedgerManager(
-    convert::ExtendedStringView ledger_name, LedgerManager** ledger_manager) {
-  FXL_DCHECK(!ledger_name.empty());
-
-  // If the Ledger instance is already open return it directly.
-  auto it = ledger_managers_.find(ledger_name);
-  if (it != ledger_managers_.end()) {
-    *ledger_manager = &(it->second);
-    return Status::OK;
-  }
-
-  std::string name_as_string = convert::ToString(ledger_name);
-  std::unique_ptr<encryption::EncryptionService> encryption_service =
-      encryption_service_factory_.MakeEncryptionService(name_as_string);
-  auto ledger_storage = std::make_unique<storage::LedgerStorageImpl>(
-      environment_, encryption_service.get(), db_factory_.get(),
-      GetPathFor(name_as_string));
-  storage::Status status = ledger_storage->Init();
-  if (status != storage::Status::OK) {
-    return PageUtils::ConvertStatus(status);
-  }
-  std::unique_ptr<sync_coordinator::LedgerSync> ledger_sync;
-  if (user_sync_) {
-    ledger_sync =
-        user_sync_->CreateLedgerSync(name_as_string, encryption_service.get());
-  }
-  auto result = ledger_managers_.emplace(
-      std::piecewise_construct, std::forward_as_tuple(name_as_string),
-      std::forward_as_tuple(environment_, std::move(name_as_string),
-                            std::move(encryption_service),
-                            std::move(ledger_storage), std::move(ledger_sync),
-                            page_usage_listener_));
-  FXL_DCHECK(result.second);
-  *ledger_manager = &(result.first->second);
-  return Status::OK;
-}
-
-void LedgerRepositoryImpl::GetLedger(
-    std::vector<uint8_t> ledger_name,
-    fidl::InterfaceRequest<Ledger> ledger_request,
-    fit::function<void(Status)> callback) {
-  TRACE_DURATION("ledger", "repository_get_ledger");
-  if (ledger_name.empty()) {
-    callback(Status::INVALID_ARGUMENT);
-    return;
-  }
-
-  LedgerManager* ledger_manager;
-  Status status = GetLedgerManager(ledger_name, &ledger_manager);
-  if (status != Status::OK) {
-    callback(status);
-    return;
-  }
-  FXL_DCHECK(ledger_manager);
-  ledger_manager->BindLedger(std::move(ledger_request));
-  callback(Status::OK);
-}
-
-void LedgerRepositoryImpl::Duplicate(
-    fidl::InterfaceRequest<ledger_internal::LedgerRepository> request,
-    fit::function<void(Status)> callback) {
-  BindRepository(std::move(request));
-  callback(Status::OK);
-}
-
-void LedgerRepositoryImpl::SetSyncStateWatcher(
-    fidl::InterfaceHandle<SyncWatcher> watcher,
-    fit::function<void(Status)> callback) {
-  watchers_->AddSyncWatcher(std::move(watcher));
-  callback(Status::OK);
-}
-
-void LedgerRepositoryImpl::CheckEmpty() {
-  if (!on_empty_callback_)
-    return;
-  if (ledger_managers_.empty() && bindings_.empty() &&
-      ledger_repository_debug_bindings_.size() == 0 &&
-      disk_cleanup_manager_->IsEmpty()) {
-    on_empty_callback_();
-  }
-}
-
-void LedgerRepositoryImpl::GetLedgerRepositoryDebug(
-    fidl::InterfaceRequest<ledger_internal::LedgerRepositoryDebug> request,
-    fit::function<void(Status)> callback) {
-  ledger_repository_debug_bindings_.AddBinding(this, std::move(request));
-  callback(Status::OK);
-}
-
-void LedgerRepositoryImpl::DiskCleanUp(fit::function<void(Status)> callback) {
-  cleanup_callbacks_.push_back(std::move(callback));
-  if (cleanup_callbacks_.size() > 1) {
-    return;
-  }
-  disk_cleanup_manager_->TryCleanUp([this](Status status) {
-    FXL_DCHECK(!cleanup_callbacks_.empty());
-
-    auto callbacks = std::move(cleanup_callbacks_);
-    cleanup_callbacks_.clear();
-    for (auto& callback : callbacks) {
-      callback(status);
-    }
-  });
-}
-
-DetachedPath LedgerRepositoryImpl::GetPathFor(fxl::StringView ledger_name) {
-  FXL_DCHECK(!ledger_name.empty());
-  return content_path_.SubPath(GetDirectoryName(ledger_name));
-}
-
-void LedgerRepositoryImpl::GetInstancesList(GetInstancesListCallback callback) {
-  std::vector<std::vector<uint8_t>> result;
-  for (const auto& key_value : ledger_managers_) {
-    result.push_back(convert::ToArray(key_value.first));
-  }
-  callback(std::move(result));
-}
-
-void LedgerRepositoryImpl::GetLedgerDebug(
-    std::vector<uint8_t> ledger_name,
-    fidl::InterfaceRequest<ledger_internal::LedgerDebug> request,
-    GetLedgerDebugCallback callback) {
-  auto it = ledger_managers_.find(ledger_name);
-  if (it == ledger_managers_.end()) {
-    callback(Status::KEY_NOT_FOUND);
-  } else {
-    it->second.BindLedgerDebug(std::move(request));
-    callback(Status::OK);
-  }
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/ledger_repository_impl.h b/bin/ledger/app/ledger_repository_impl.h
deleted file mode 100644
index 9ead887..0000000
--- a/bin/ledger/app/ledger_repository_impl.h
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_LEDGER_REPOSITORY_IMPL_H_
-#define PERIDOT_BIN_LEDGER_APP_LEDGER_REPOSITORY_IMPL_H_
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <fuchsia/modular/auth/cpp/fidl.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/component/cpp/expose.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/files/unique_fd.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/app/disk_cleanup_manager.h"
-#include "peridot/bin/ledger/app/ledger_manager.h"
-#include "peridot/bin/ledger/app/page_eviction_manager.h"
-#include "peridot/bin/ledger/app/sync_watcher_set.h"
-#include "peridot/bin/ledger/app/types.h"
-#include "peridot/bin/ledger/encryption/impl/encryption_service_factory_impl.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/fidl/error_notifier.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-#include "peridot/bin/ledger/p2p_sync/public/user_communicator.h"
-#include "peridot/bin/ledger/storage/public/db_factory.h"
-#include "peridot/bin/ledger/sync_coordinator/public/user_sync.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-class LedgerRepositoryImpl
-    : public fuchsia::ledger::internal::LedgerRepositoryErrorNotifierDelegate,
-      public ledger_internal::LedgerRepositoryDebug,
-      public PageEvictionManager::Delegate {
- public:
-  // Creates a new LedgerRepositoryImpl object. Guarantees that |db_factory|
-  // will outlive the given |disk_cleanup_manager|.
-  LedgerRepositoryImpl(DetachedPath content_path, Environment* environment,
-                       std::unique_ptr<storage::DbFactory> db_factory,
-                       std::unique_ptr<SyncWatcherSet> watchers,
-                       std::unique_ptr<sync_coordinator::UserSync> user_sync,
-                       std::unique_ptr<DiskCleanupManager> disk_cleanup_manager,
-                       PageUsageListener* page_usage_listener);
-  ~LedgerRepositoryImpl() override;
-
-  // Satisfies an inspection by adding to |out| an object with properties,
-  // metrics, and (callbacks affording access to) children of its own.
-  void Inspect(std::string display_name,
-               component::Object::ObjectVector* out) const;
-
-  void set_on_empty(fit::closure on_empty_callback) {
-    on_empty_callback_ = std::move(on_empty_callback);
-  }
-
-  void BindRepository(fidl::InterfaceRequest<ledger_internal::LedgerRepository>
-                          repository_request);
-
-  // Releases all handles bound to this repository impl.
-  std::vector<fidl::InterfaceRequest<ledger_internal::LedgerRepository>>
-  Unbind();
-
-  // PageEvictionManager::Delegate:
-  void PageIsClosedAndSynced(
-      fxl::StringView ledger_name, storage::PageIdView page_id,
-      fit::function<void(Status, PagePredicateResult)> callback) override;
-  void PageIsClosedOfflineAndEmpty(
-      fxl::StringView ledger_name, storage::PageIdView page_id,
-      fit::function<void(Status, PagePredicateResult)> callback) override;
-  void DeletePageStorage(fxl::StringView ledger_name,
-                         storage::PageIdView page_id,
-                         fit::function<void(Status)> callback) override;
-
-  // LedgerRepository:
-  void GetLedger(std::vector<uint8_t> ledger_name,
-                 fidl::InterfaceRequest<Ledger> ledger_request,
-                 fit::function<void(Status)> callback) override;
-  void Duplicate(
-      fidl::InterfaceRequest<ledger_internal::LedgerRepository> request,
-      fit::function<void(Status)> callback) override;
-  void SetSyncStateWatcher(fidl::InterfaceHandle<SyncWatcher> watcher,
-                           fit::function<void(Status)> callback) override;
-  void GetLedgerRepositoryDebug(
-      fidl::InterfaceRequest<ledger_internal::LedgerRepositoryDebug> request,
-      fit::function<void(Status)> callback) override;
-  void DiskCleanUp(fit::function<void(Status)> callback) override;
-
- private:
-  // Retrieves the existing, or creates a new LedgerManager object with the
-  // given |ledger_name|.
-  Status GetLedgerManager(convert::ExtendedStringView ledger_name,
-                          LedgerManager** ledger_manager);
-
-  void CheckEmpty();
-
-  DetachedPath GetPathFor(fxl::StringView ledger_name);
-
-  // LedgerRepositoryDebug:
-  void GetInstancesList(GetInstancesListCallback callback) override;
-
-  void GetLedgerDebug(
-      std::vector<uint8_t> ledger_name,
-      fidl::InterfaceRequest<ledger_internal::LedgerDebug> request,
-      GetLedgerDebugCallback callback) override;
-
-  const DetachedPath content_path_;
-  Environment* const environment_;
-  std::unique_ptr<storage::DbFactory> db_factory_;
-  encryption::EncryptionServiceFactoryImpl encryption_service_factory_;
-  std::unique_ptr<SyncWatcherSet> watchers_;
-  std::unique_ptr<sync_coordinator::UserSync> user_sync_;
-  std::unique_ptr<DiskCleanupManager> disk_cleanup_manager_;
-  PageUsageListener* page_usage_listener_;
-  callback::AutoCleanableMap<std::string, LedgerManager,
-                             convert::StringViewComparator>
-      ledger_managers_;
-  callback::AutoCleanableSet<ErrorNotifierBinding<
-      fuchsia::ledger::internal::LedgerRepositoryErrorNotifierDelegate>>
-      bindings_;
-  fit::closure on_empty_callback_;
-
-  fidl::BindingSet<ledger_internal::LedgerRepositoryDebug>
-      ledger_repository_debug_bindings_;
-
-  std::vector<fit::function<void(Status)>> cleanup_callbacks_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerRepositoryImpl);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_LEDGER_REPOSITORY_IMPL_H_
diff --git a/bin/ledger/app/ledger_repository_impl_unittest.cc b/bin/ledger/app/ledger_repository_impl_unittest.cc
deleted file mode 100644
index 378a9e6..0000000
--- a/bin/ledger/app/ledger_repository_impl_unittest.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/ledger_repository_impl.h"
-
-#include <fuchsia/inspect/cpp/fidl.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/component/cpp/expose.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/ledger_repository_factory_impl.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/fake/fake_db_factory.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/bin/ledger/testing/fake_disk_cleanup_manager.h"
-#include "peridot/bin/ledger/testing/inspect.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace ledger {
-namespace {
-
-class LedgerRepositoryImplTest : public TestWithEnvironment {
- public:
-  LedgerRepositoryImplTest() {
-    auto fake_page_eviction_manager =
-        std::make_unique<FakeDiskCleanupManager>();
-    disk_cleanup_manager_ = fake_page_eviction_manager.get();
-
-    repository_ = std::make_unique<LedgerRepositoryImpl>(
-        DetachedPath(tmpfs_.root_fd()), &environment_,
-        std::make_unique<storage::fake::FakeDbFactory>(dispatcher()), nullptr,
-        nullptr, std::move(fake_page_eviction_manager), disk_cleanup_manager_);
-  }
-
-  ~LedgerRepositoryImplTest() override {}
-
- protected:
-  scoped_tmpfs::ScopedTmpFS tmpfs_;
-  FakeDiskCleanupManager* disk_cleanup_manager_;
-  std::unique_ptr<LedgerRepositoryImpl> repository_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerRepositoryImplTest);
-};
-
-TEST_F(LedgerRepositoryImplTest, ConcurrentCalls) {
-  // Make a first call to DiskCleanUp.
-  bool callback_called1 = false;
-  Status status1;
-  repository_->DiskCleanUp(
-      callback::Capture(callback::SetWhenCalled(&callback_called1), &status1));
-
-  // Make a second one before the first one has finished.
-  bool callback_called2 = false;
-  Status status2;
-  repository_->DiskCleanUp(
-      callback::Capture(callback::SetWhenCalled(&callback_called2), &status2));
-
-  // Make sure both of them start running.
-  RunLoopUntilIdle();
-
-  // Both calls must wait for the cleanup manager.
-  EXPECT_FALSE(callback_called1);
-  EXPECT_FALSE(callback_called2);
-
-  // Call the cleanup manager callback and expect to see an ok status for both
-  // pending callbacks.
-  disk_cleanup_manager_->cleanup_callback(Status::OK);
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called1);
-  EXPECT_TRUE(callback_called2);
-  EXPECT_EQ(Status::OK, status1);
-  EXPECT_EQ(Status::OK, status2);
-}
-
-TEST_F(LedgerRepositoryImplTest, InspectAPIRequestsMetricOnMultipleBindings) {
-  // When nothing has bound to the repository, check that the "requests" metric
-  // is present and is zero.
-  bool zeroth_callback_called = false;
-  fuchsia::inspect::Object zeroth_read_object;
-  component::Object::ObjectVector zeroth_out;
-
-  repository_->Inspect("zeroth", &zeroth_out);
-
-  ASSERT_EQ(1UL, zeroth_out.size());
-  zeroth_out.at(0).get()->ReadData(callback::Capture(
-      callback::SetWhenCalled(&zeroth_callback_called), &zeroth_read_object));
-  EXPECT_TRUE(zeroth_callback_called);
-  ExpectRequestsMetric(&zeroth_read_object, 0UL);
-
-  // When one binding has been made to the repository, check that the "requests"
-  // metric is present and is one.
-  ledger_internal::LedgerRepositoryPtr first_ledger_repository_ptr;
-  bool first_callback_called = false;
-  fuchsia::inspect::Object first_read_object;
-  component::Object::ObjectVector first_out;
-  repository_->BindRepository(first_ledger_repository_ptr.NewRequest());
-
-  repository_->Inspect("first", &first_out);
-
-  ASSERT_EQ(1UL, first_out.size());
-  first_out.at(0).get()->ReadData(callback::Capture(
-      callback::SetWhenCalled(&first_callback_called), &first_read_object));
-  EXPECT_TRUE(first_callback_called);
-  ExpectRequestsMetric(&first_read_object, 1UL);
-
-  // When two bindings have been made to the repository, check that the
-  // "requests" metric is present and is two.
-  ledger_internal::LedgerRepositoryPtr second_ledger_repository_ptr;
-  bool second_callback_called = false;
-  fuchsia::inspect::Object second_read_object;
-  component::Object::ObjectVector second_out;
-  repository_->BindRepository(second_ledger_repository_ptr.NewRequest());
-
-  repository_->Inspect("second", &second_out);
-
-  ASSERT_EQ(1UL, second_out.size());
-  second_out.at(0).get()->ReadData(callback::Capture(
-      callback::SetWhenCalled(&second_callback_called), &second_read_object));
-  EXPECT_TRUE(second_callback_called);
-  ExpectRequestsMetric(&second_read_object, 2UL);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/auto_merge_strategy.cc b/bin/ledger/app/merging/auto_merge_strategy.cc
deleted file mode 100644
index 071d5d2..0000000
--- a/bin/ledger/app/merging/auto_merge_strategy.cc
+++ /dev/null
@@ -1,345 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/merging/auto_merge_strategy.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/app/merging/conflict_resolver_client.h"
-#include "peridot/bin/ledger/app/page_manager.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-
-namespace ledger {
-class AutoMergeStrategy::AutoMerger {
- public:
-  AutoMerger(storage::PageStorage* storage, PageManager* page_manager,
-             ConflictResolver* conflict_resolver,
-             std::unique_ptr<const storage::Commit> left,
-             std::unique_ptr<const storage::Commit> right,
-             std::unique_ptr<const storage::Commit> ancestor,
-             fit::function<void(Status)> callback);
-  ~AutoMerger();
-
-  void Start();
-  void Cancel();
-  void Done(Status status);
-
- private:
-  void OnRightChangeReady(
-      storage::Status status,
-      std::unique_ptr<std::vector<storage::EntryChange>> right_change);
-  void OnComparisonDone(
-      storage::Status status,
-      std::unique_ptr<std::vector<storage::EntryChange>> right_changes,
-      bool distinct);
-  void ApplyDiffOnJournal(
-      std::unique_ptr<storage::Journal> journal,
-      std::unique_ptr<std::vector<storage::EntryChange>> diff);
-
-  storage::PageStorage* const storage_;
-  PageManager* const manager_;
-  ConflictResolver* const conflict_resolver_;
-
-  std::unique_ptr<const storage::Commit> left_;
-  std::unique_ptr<const storage::Commit> right_;
-  std::unique_ptr<const storage::Commit> ancestor_;
-
-  std::unique_ptr<ConflictResolverClient> delegated_merge_;
-
-  fit::function<void(Status)> callback_;
-
-  bool cancelled_ = false;
-
-  // This must be the last member of the class.
-  fxl::WeakPtrFactory<AutoMergeStrategy::AutoMerger> weak_factory_;
-};
-
-AutoMergeStrategy::AutoMerger::AutoMerger(
-    storage::PageStorage* storage, PageManager* page_manager,
-    ConflictResolver* conflict_resolver,
-    std::unique_ptr<const storage::Commit> left,
-    std::unique_ptr<const storage::Commit> right,
-    std::unique_ptr<const storage::Commit> ancestor,
-    fit::function<void(Status)> callback)
-    : storage_(storage),
-      manager_(page_manager),
-      conflict_resolver_(conflict_resolver),
-      left_(std::move(left)),
-      right_(std::move(right)),
-      ancestor_(std::move(ancestor)),
-      callback_(std::move(callback)),
-      weak_factory_(this) {
-  FXL_DCHECK(callback_);
-}
-
-AutoMergeStrategy::AutoMerger::~AutoMerger() {}
-
-void AutoMergeStrategy::AutoMerger::Start() {
-  auto changes = std::make_unique<std::vector<storage::EntryChange>>();
-  auto on_next = [weak_this = weak_factory_.GetWeakPtr(),
-                  changes = changes.get()](storage::EntryChange change) {
-    if (!weak_this) {
-      return false;
-    }
-
-    if (weak_this->cancelled_) {
-      return false;
-    }
-
-    changes->push_back(change);
-    return true;
-  };
-
-  auto callback = callback::MakeScoped(
-      weak_factory_.GetWeakPtr(),
-      [this, changes = std::move(changes)](storage::Status status) mutable {
-        if (cancelled_) {
-          Done(Status::INTERNAL_ERROR);
-          return;
-        }
-        OnRightChangeReady(status, std::move(changes));
-      });
-
-  storage_->GetCommitContentsDiff(*ancestor_, *right_, "", std::move(on_next),
-                                  std::move(callback));
-}
-
-void AutoMergeStrategy::AutoMerger::OnRightChangeReady(
-    storage::Status status,
-    std::unique_ptr<std::vector<storage::EntryChange>> right_change) {
-  if (cancelled_) {
-    Done(Status::INTERNAL_ERROR);
-    return;
-  }
-
-  if (status != storage::Status::OK) {
-    FXL_LOG(ERROR) << "Unable to compute right diff due to error " << status
-                   << ", aborting.";
-    Done(PageUtils::ConvertStatus(status));
-    return;
-  }
-
-  if (right_change->empty()) {
-    OnComparisonDone(storage::Status::OK, std::move(right_change), true);
-    return;
-  }
-
-  struct PageChangeIndex {
-    size_t entry_index = 0;
-    bool distinct = true;
-  };
-
-  auto index = std::make_unique<PageChangeIndex>();
-
-  auto on_next = [weak_this = weak_factory_.GetWeakPtr(), index = index.get(),
-                  right_change =
-                      right_change.get()](storage::EntryChange change) {
-    if (!weak_this || weak_this->cancelled_) {
-      return false;
-    }
-
-    while (change.entry.key > (*right_change)[index->entry_index].entry.key) {
-      index->entry_index++;
-      if (index->entry_index >= right_change->size()) {
-        return false;
-      }
-    }
-    if (change.entry.key == (*right_change)[index->entry_index].entry.key) {
-      if (change == (*right_change)[index->entry_index]) {
-        return true;
-      }
-      index->distinct = false;
-      return false;
-    }
-    return true;
-  };
-
-  // |callback| is called when the full diff is computed.
-  auto callback = callback::MakeScoped(
-      weak_factory_.GetWeakPtr(),
-      [this, right_change = std::move(right_change),
-       index = std::move(index)](storage::Status status) mutable {
-        if (cancelled_) {
-          Done(Status::INTERNAL_ERROR);
-          return;
-        }
-        OnComparisonDone(status, std::move(right_change), index->distinct);
-      });
-
-  storage_->GetCommitContentsDiff(*ancestor_, *left_, "", std::move(on_next),
-                                  std::move(callback));
-}
-
-void AutoMergeStrategy::AutoMerger::OnComparisonDone(
-    storage::Status status,
-    std::unique_ptr<std::vector<storage::EntryChange>> right_changes,
-    bool distinct) {
-  if (cancelled_) {
-    Done(Status::INTERNAL_ERROR);
-    return;
-  }
-
-  if (status != storage::Status::OK) {
-    FXL_LOG(ERROR) << "Unable to compute left diff due to error " << status
-                   << ", aborting.";
-    Done(PageUtils::ConvertStatus(status));
-    return;
-  }
-
-  if (!distinct) {
-    // Some keys are overlapping, so we need to proceed like the CUSTOM
-    // strategy. We could be more efficient if we reused |right_changes| instead
-    // of re-computing the diff inside |ConflictResolverClient|.
-    delegated_merge_ = std::make_unique<ConflictResolverClient>(
-        storage_, manager_, conflict_resolver_, std::move(left_),
-        std::move(right_), std::move(ancestor_),
-        callback::MakeScoped(weak_factory_.GetWeakPtr(), [this](Status status) {
-          if (cancelled_) {
-            Done(Status::INTERNAL_ERROR);
-            return;
-          }
-          Done(status);
-        }));
-
-    delegated_merge_->Start();
-    return;
-  }
-
-  // Here, we reuse the diff we computed before to create the merge commit. As
-  // StartMergeCommit uses the left commit (first parameter) as its base, we
-  // only have to apply the right diff to it and we are done.
-  storage_->StartMergeCommit(
-      left_->GetId(), right_->GetId(),
-      callback::MakeScoped(
-          weak_factory_.GetWeakPtr(),
-          [this, right_changes = std::move(right_changes)](
-              storage::Status s,
-              std::unique_ptr<storage::Journal> journal) mutable {
-            if (cancelled_) {
-              Done(Status::INTERNAL_ERROR);
-              return;
-            }
-            if (s != storage::Status::OK) {
-              FXL_LOG(ERROR) << "Unable to start merge commit: " << s;
-              Done(PageUtils::ConvertStatus(s));
-              return;
-            }
-            ApplyDiffOnJournal(std::move(journal), std::move(right_changes));
-          }));
-}
-
-void AutoMergeStrategy::AutoMerger::ApplyDiffOnJournal(
-    std::unique_ptr<storage::Journal> journal,
-    std::unique_ptr<std::vector<storage::EntryChange>> diff) {
-  auto waiter = fxl::MakeRefCounted<callback::StatusWaiter<storage::Status>>(
-      storage::Status::OK);
-  for (const storage::EntryChange& change : *diff) {
-    if (change.deleted) {
-      journal->Delete(change.entry.key, waiter->NewCallback());
-    } else {
-      journal->Put(change.entry.key, change.entry.object_identifier,
-                   change.entry.priority, waiter->NewCallback());
-    }
-  }
-
-  waiter->Finalize([weak_this = weak_factory_.GetWeakPtr(),
-                    journal = std::move(journal)](storage::Status s) mutable {
-    if (!weak_this) {
-      return;
-    }
-    if (weak_this->cancelled_) {
-      weak_this->Done(Status::INTERNAL_ERROR);
-      return;
-    }
-    if (s != storage::Status::OK) {
-      FXL_LOG(ERROR) << "Unable to commit merge journal: " << s;
-      weak_this->Done(PageUtils::ConvertStatus(s));
-      return;
-    }
-    weak_this->storage_->CommitJournal(
-        std::move(journal),
-        [weak_this = std::move(weak_this)](
-            storage::Status s,
-            std::unique_ptr<const storage::Commit> /*commit*/) {
-          if (s != storage::Status::OK) {
-            FXL_LOG(ERROR) << "Unable to commit merge journal: " << s;
-          }
-          if (weak_this) {
-            weak_this->Done(PageUtils::ConvertStatus(s));
-          }
-        });
-  });
-}
-
-void AutoMergeStrategy::AutoMerger::Cancel() {
-  cancelled_ = true;
-  if (delegated_merge_) {
-    delegated_merge_->Cancel();
-  }
-}
-
-void AutoMergeStrategy::AutoMerger::Done(Status status) {
-  delegated_merge_.reset();
-  auto callback = std::move(callback_);
-  callback_ = nullptr;
-  callback(status);
-}
-
-AutoMergeStrategy::AutoMergeStrategy(ConflictResolverPtr conflict_resolver)
-    : conflict_resolver_(std::move(conflict_resolver)) {
-  conflict_resolver_.set_error_handler([this](zx_status_t status) {
-    // If a merge is in progress, it must be terminated.
-    if (in_progress_merge_) {
-      // The actual cleanup of in_progress_merge_ will happen in its callback
-      // callback.
-      in_progress_merge_->Cancel();
-    }
-    if (on_error_) {
-      // It is safe to call |on_error_| because the error handler waits for the
-      // merges to finish before deleting this object.
-      on_error_();
-    }
-  });
-}
-
-AutoMergeStrategy::~AutoMergeStrategy() {}
-
-void AutoMergeStrategy::SetOnError(fit::closure on_error) {
-  on_error_ = std::move(on_error);
-}
-
-void AutoMergeStrategy::Merge(storage::PageStorage* storage,
-                              PageManager* page_manager,
-                              std::unique_ptr<const storage::Commit> head_1,
-                              std::unique_ptr<const storage::Commit> head_2,
-                              std::unique_ptr<const storage::Commit> ancestor,
-                              fit::function<void(Status)> callback) {
-  FXL_DCHECK(head_1->GetTimestamp() <= head_2->GetTimestamp());
-  FXL_DCHECK(!in_progress_merge_);
-
-  in_progress_merge_ = std::make_unique<AutoMergeStrategy::AutoMerger>(
-      storage, page_manager, conflict_resolver_.get(), std::move(head_2),
-      std::move(head_1), std::move(ancestor),
-      [this, callback = std::move(callback)](Status status) {
-        in_progress_merge_.reset();
-        callback(status);
-      });
-
-  in_progress_merge_->Start();
-}
-
-void AutoMergeStrategy::Cancel() {
-  if (in_progress_merge_) {
-    in_progress_merge_->Cancel();
-  }
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/auto_merge_strategy.h b/bin/ledger/app/merging/auto_merge_strategy.h
deleted file mode 100644
index c68e24d..0000000
--- a/bin/ledger/app/merging/auto_merge_strategy.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_MERGING_AUTO_MERGE_STRATEGY_H_
-#define PERIDOT_BIN_LEDGER_APP_MERGING_AUTO_MERGE_STRATEGY_H_
-
-#include <memory>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/app/merging/merge_strategy.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-// Strategy for merging commits using the AUTOMATIC_WITH_FALLBACK policy.
-class AutoMergeStrategy : public MergeStrategy {
- public:
-  explicit AutoMergeStrategy(ConflictResolverPtr conflict_resolver);
-  ~AutoMergeStrategy() override;
-
-  // MergeStrategy:
-  void SetOnError(fit::closure on_error) override;
-
-  void Merge(storage::PageStorage* storage, PageManager* page_manager,
-             std::unique_ptr<const storage::Commit> head_1,
-             std::unique_ptr<const storage::Commit> head_2,
-             std::unique_ptr<const storage::Commit> ancestor,
-             fit::function<void(Status)> callback) override;
-
-  void Cancel() override;
-
- private:
-  class AutoMerger;
-
-  fit::closure on_error_;
-
-  ConflictResolverPtr conflict_resolver_;
-
-  std::unique_ptr<AutoMerger> in_progress_merge_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AutoMergeStrategy);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_MERGING_AUTO_MERGE_STRATEGY_H_
diff --git a/bin/ledger/app/merging/common_ancestor.cc b/bin/ledger/app/merging/common_ancestor.cc
deleted file mode 100644
index fdb12e5..0000000
--- a/bin/ledger/app/merging/common_ancestor.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/merging/common_ancestor.h"
-
-#include <utility>
-
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/coroutine/coroutine_waiter.h"
-
-namespace ledger {
-
-namespace {
-
-// Comparator for commits that order commits based on their generation, then on
-// their id.
-struct GenerationComparator {
-  bool operator()(const std::unique_ptr<const storage::Commit>& lhs,
-                  const std::unique_ptr<const storage::Commit>& rhs) const {
-    uint64_t lhs_generation = lhs->GetGeneration();
-    uint64_t rhs_generation = rhs->GetGeneration();
-    return lhs_generation == rhs_generation ? lhs->GetId() < rhs->GetId()
-                                            : lhs_generation < rhs_generation;
-  }
-};
-
-// Find the common ancestor the 2 given commits.
-//
-// The algorithm goes as follows: we keep a set of "active" commits, ordered
-// by generation order. Until this set has only one element, we take the
-// commit with the greater generation (the one deepest in the commit graph)
-// and replace it by its parent. If we seed the initial set with two commits,
-// we get their unique lowest common ancestor.
-// At each step of the iteration we request the parent commits of all commits
-// with the same generation.
-storage::Status FindCommonAncestorSync(
-    coroutine::CoroutineHandler* handler, storage::PageStorage* storage,
-    std::unique_ptr<const storage::Commit> head1,
-    std::unique_ptr<const storage::Commit> head2,
-    std::unique_ptr<const storage::Commit>* result) {
-  std::set<std::unique_ptr<const storage::Commit>, GenerationComparator>
-      commits;
-  commits.emplace(std::move(head1));
-  commits.emplace(std::move(head2));
-
-  while (commits.size() > 1) {
-    // Pop the newest commits and retrieve their parents.
-    uint64_t expected_generation = (*commits.rbegin())->GetGeneration();
-    auto waiter = fxl::MakeRefCounted<callback::Waiter<
-        storage::Status, std::unique_ptr<const storage::Commit>>>(
-        storage::Status::OK);
-    while (commits.size() > 1 &&
-           expected_generation == (*commits.rbegin())->GetGeneration()) {
-      // Pop the newest commit.
-      std::unique_ptr<const storage::Commit> commit =
-          std::move(commits.extract(std::prev(commits.end())).value());
-      // Request its parents.
-      for (const auto& parent_id : commit->GetParentIds()) {
-        storage->GetCommit(parent_id, waiter->NewCallback());
-      }
-    }
-    storage::Status status;
-    std::vector<std::unique_ptr<const storage::Commit>> parents;
-    if (coroutine::Wait(handler, std::move(waiter), &status, &parents) ==
-        coroutine::ContinuationStatus::INTERRUPTED) {
-      return storage::Status::INTERRUPTED;
-    }
-    if (status != storage::Status::OK) {
-      return status;
-    }
-    // Once the parents have been retrieved, add these in the set.
-    // ancestor in that generation.
-    for (auto& parent : parents) {
-      commits.insert(std::move(parent));
-    }
-  }
-  FXL_DCHECK(commits.size() == 1);
-  *result = std::move(commits.extract(commits.begin()).value());
-  return storage::Status::OK;
-}
-
-}  // namespace
-
-void FindCommonAncestor(
-    coroutine::CoroutineService* coroutine_service,
-    storage::PageStorage* const storage,
-    std::unique_ptr<const storage::Commit> head1,
-    std::unique_ptr<const storage::Commit> head2,
-    fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-        callback) {
-  coroutine_service->StartCoroutine(
-      [storage, head1 = std::move(head1), head2 = std::move(head2),
-       callback =
-           std::move(callback)](coroutine::CoroutineHandler* handler) mutable {
-        std::unique_ptr<const storage::Commit> result;
-        storage::Status status = FindCommonAncestorSync(
-            handler, storage, std::move(head1), std::move(head2), &result);
-        callback(PageUtils::ConvertStatus(status), std::move(result));
-      });
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/common_ancestor.h b/bin/ledger/app/merging/common_ancestor.h
deleted file mode 100644
index b44eca8..0000000
--- a/bin/ledger/app/merging/common_ancestor.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_MERGING_COMMON_ANCESTOR_H_
-#define PERIDOT_BIN_LEDGER_APP_MERGING_COMMON_ANCESTOR_H_
-
-#include <functional>
-#include <memory>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_counted.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-
-void FindCommonAncestor(
-    coroutine::CoroutineService* coroutine_service,
-    storage::PageStorage* storage, std::unique_ptr<const storage::Commit> head1,
-    std::unique_ptr<const storage::Commit> head2,
-    fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-        callback);
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_MERGING_COMMON_ANCESTOR_H_
diff --git a/bin/ledger/app/merging/common_ancestor_unittest.cc b/bin/ledger/app/merging/common_ancestor_unittest.cc
deleted file mode 100644
index b15d279..0000000
--- a/bin/ledger/app/merging/common_ancestor_unittest.cc
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/merging/common_ancestor.h"
-
-#include <algorithm>
-#include <string>
-
-#include <lib/callback/cancellable_helper.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/merging/test_utils.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/encryption/primitives/hash.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-namespace {
-class CommonAncestorTest : public TestWithPageStorage {
- public:
-  CommonAncestorTest() {}
-  ~CommonAncestorTest() override {}
-
- protected:
-  storage::PageStorage* page_storage() override { return storage_.get(); }
-
-  void SetUp() override {
-    TestWithPageStorage::SetUp();
-    ASSERT_TRUE(CreatePageStorage(&storage_));
-  }
-
-  std::unique_ptr<const storage::Commit> CreateCommit(
-      storage::CommitIdView parent_id,
-      fit::function<void(storage::Journal*)> contents) {
-    bool called;
-    storage::Status status;
-    std::unique_ptr<storage::Journal> journal;
-    storage_->StartCommit(
-        parent_id.ToString(), storage::JournalType::IMPLICIT,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-
-    contents(journal.get());
-    std::unique_ptr<const storage::Commit> commit;
-    storage_->CommitJournal(
-        std::move(journal),
-        callback::Capture(callback::SetWhenCalled(&called), &status, &commit));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-    return commit;
-  }
-
-  std::unique_ptr<const storage::Commit> CreateMergeCommit(
-      storage::CommitIdView left, storage::CommitIdView right,
-      fit::function<void(storage::Journal*)> contents) {
-    bool called;
-    storage::Status status;
-    std::unique_ptr<storage::Journal> journal;
-    storage_->StartMergeCommit(
-        left.ToString(), right.ToString(),
-        callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-
-    contents(journal.get());
-    storage::Status actual_status;
-    std::unique_ptr<const storage::Commit> actual_commit;
-    storage_->CommitJournal(std::move(journal),
-                            callback::Capture(callback::SetWhenCalled(&called),
-                                              &actual_status, &actual_commit));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, actual_status);
-    return actual_commit;
-  }
-
-  std::unique_ptr<const storage::Commit> GetRoot() {
-    bool called;
-    storage::Status status;
-    std::unique_ptr<const storage::Commit> root;
-    storage_->GetCommit(
-        storage::kFirstPageCommitId,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &root));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-    return root;
-  }
-
-  coroutine::CoroutineServiceImpl coroutine_service_;
-  std::unique_ptr<storage::PageStorage> storage_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(CommonAncestorTest);
-};
-
-TEST_F(CommonAncestorTest, TwoChildrenOfRoot) {
-  std::unique_ptr<const storage::Commit> commit_1 = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key", "a"));
-  std::unique_ptr<const storage::Commit> commit_2 = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key", "b"));
-
-  bool called;
-  Status status;
-  std::unique_ptr<const storage::Commit> result;
-  FindCommonAncestor(
-      &coroutine_service_, storage_.get(), std::move(commit_1),
-      std::move(commit_2),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &result));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(storage::kFirstPageCommitId, result->GetId());
-}
-
-TEST_F(CommonAncestorTest, RootAndChild) {
-  std::unique_ptr<const storage::Commit> root = GetRoot();
-
-  std::unique_ptr<const storage::Commit> child = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key", "a"));
-
-  bool called;
-  Status status;
-  std::unique_ptr<const storage::Commit> result;
-  FindCommonAncestor(
-      &coroutine_service_, storage_.get(), std::move(root), std::move(child),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &result));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(storage::kFirstPageCommitId, result->GetId());
-}
-
-// In this test the commits have the following structure:
-//            (root)
-//              /  \
-//            (A)  (B)
-//           /  \  /   \
-//         (1) (merge) (2)
-TEST_F(CommonAncestorTest, MergeCommitAndSomeOthers) {
-  std::unique_ptr<const storage::Commit> commit_a = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key", "a"));
-  std::unique_ptr<const storage::Commit> commit_b = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key", "b"));
-
-  std::unique_ptr<const storage::Commit> commit_merge = CreateMergeCommit(
-      commit_a->GetId(), commit_b->GetId(), AddKeyValueToJournal("key", "c"));
-
-  std::unique_ptr<const storage::Commit> commit_1 =
-      CreateCommit(commit_a->GetId(), AddKeyValueToJournal("key", "1"));
-  std::unique_ptr<const storage::Commit> commit_2 =
-      CreateCommit(commit_b->GetId(), AddKeyValueToJournal("key", "2"));
-
-  // Ancestor of (1) and (merge) needs to be (root).
-  bool called;
-  Status status;
-  std::unique_ptr<const storage::Commit> result;
-  FindCommonAncestor(
-      &coroutine_service_, storage_.get(), std::move(commit_1),
-      std::move(commit_merge),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &result));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(storage::kFirstPageCommitId, result->GetId());
-
-  // Ancestor of (2) and (A).
-  FindCommonAncestor(
-      &coroutine_service_, storage_.get(), std::move(commit_2),
-      std::move(commit_a),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &result));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(storage::kFirstPageCommitId, result->GetId());
-}
-
-// Regression test for LE-187.
-TEST_F(CommonAncestorTest, LongChain) {
-  const int length = 180;
-
-  std::unique_ptr<const storage::Commit> commit_a = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key", "a"));
-  std::unique_ptr<const storage::Commit> commit_b = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key", "b"));
-
-  std::unique_ptr<const storage::Commit> last_commit = std::move(commit_a);
-  for (int i = 0; i < length; i++) {
-    last_commit = CreateCommit(last_commit->GetId(),
-                               AddKeyValueToJournal(std::to_string(i), "val"));
-  }
-
-  // Ancestor of (last commit) and (b) needs to be (root).
-  bool called;
-  Status status;
-  std::unique_ptr<const storage::Commit> result;
-  FindCommonAncestor(
-      &coroutine_service_, storage_.get(), std::move(last_commit),
-      std::move(commit_b),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &result));
-  // This test lasts ~2.5s on x86+qemu+kvm.
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(storage::kFirstPageCommitId, result->GetId());
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/conflict_resolver_client.cc b/bin/ledger/app/merging/conflict_resolver_client.cc
deleted file mode 100644
index e38690d..0000000
--- a/bin/ledger/app/merging/conflict_resolver_client.cc
+++ /dev/null
@@ -1,450 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/merging/conflict_resolver_client.h"
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/app/diff_utils.h"
-#include "peridot/bin/ledger/app/fidl/serialization_size.h"
-#include "peridot/bin/ledger/app/page_manager.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/lib/util/ptr.h"
-
-namespace ledger {
-
-ConflictResolverClient::ConflictResolverClient(
-    storage::PageStorage* storage, PageManager* page_manager,
-    ConflictResolver* conflict_resolver,
-    std::unique_ptr<const storage::Commit> left,
-    std::unique_ptr<const storage::Commit> right,
-    std::unique_ptr<const storage::Commit> ancestor,
-    fit::function<void(Status)> callback)
-    : storage_(storage),
-      manager_(page_manager),
-      conflict_resolver_(conflict_resolver),
-      left_(std::move(left)),
-      right_(std::move(right)),
-      ancestor_(std::move(ancestor)),
-      callback_(std::move(callback)),
-      merge_result_provider_binding_(this),
-      weak_factory_(this) {
-  FXL_DCHECK(left_->GetTimestamp() >= right_->GetTimestamp());
-  FXL_DCHECK(callback_);
-}
-
-ConflictResolverClient::~ConflictResolverClient() {
-  if (journal_) {
-    storage_->RollbackJournal(std::move(journal_),
-                              [](storage::Status /*status*/) {});
-  }
-}
-
-void ConflictResolverClient::Start() {
-  // Prepare the journal for the merge commit.
-  storage_->StartMergeCommit(
-      left_->GetId(), right_->GetId(),
-      callback::MakeScoped(
-          weak_factory_.GetWeakPtr(),
-          [this](storage::Status status,
-                 std::unique_ptr<storage::Journal> journal) {
-            if (cancelled_) {
-              Finalize(Status::INTERNAL_ERROR);
-              return;
-            }
-            journal_ = std::move(journal);
-            if (status != storage::Status::OK) {
-              FXL_LOG(ERROR) << "Unable to start merge commit: "
-                             << fidl::ToUnderlying(status);
-              Finalize(PageUtils::ConvertStatus(status));
-              return;
-            }
-
-            PageSnapshotPtr page_snapshot_ancestor;
-            manager_->BindPageSnapshot(ancestor_->Clone(),
-                                       page_snapshot_ancestor.NewRequest(), "");
-
-            PageSnapshotPtr page_snapshot_left;
-            manager_->BindPageSnapshot(left_->Clone(),
-                                       page_snapshot_left.NewRequest(), "");
-
-            PageSnapshotPtr page_snapshot_right;
-            manager_->BindPageSnapshot(right_->Clone(),
-                                       page_snapshot_right.NewRequest(), "");
-
-            in_client_request_ = true;
-            conflict_resolver_->Resolve(
-                std::move(page_snapshot_left), std::move(page_snapshot_right),
-                std::move(page_snapshot_ancestor),
-                merge_result_provider_binding_.NewBinding());
-          }));
-}
-
-void ConflictResolverClient::Cancel() {
-  cancelled_ = true;
-  if (in_client_request_) {
-    Finalize(Status::INTERNAL_ERROR);
-  }
-}
-
-void ConflictResolverClient::OnNextMergeResult(
-    const MergedValue& merged_value,
-    const fxl::RefPtr<
-        callback::Waiter<storage::Status, storage::ObjectIdentifier>>& waiter) {
-  switch (merged_value.source) {
-    case ValueSource::RIGHT: {
-      std::string key = convert::ToString(merged_value.key);
-      storage_->GetEntryFromCommit(
-          *right_, key,
-          [key, callback = waiter->NewCallback()](storage::Status status,
-                                                  storage::Entry entry) {
-            if (status != storage::Status::OK) {
-              if (status == storage::Status::NOT_FOUND) {
-                FXL_LOG(ERROR)
-                    << "Key " << key
-                    << " is not present in the right change. Unable to proceed";
-              }
-              callback(status, {});
-              return;
-            }
-            callback(storage::Status::OK, entry.object_identifier);
-          });
-      break;
-    }
-    case ValueSource::NEW: {
-      if (merged_value.new_value->is_bytes()) {
-        storage_->AddObjectFromLocal(storage::ObjectType::BLOB,
-                                     storage::DataSource::Create(std::move(
-                                         merged_value.new_value->bytes())),
-                                     waiter->NewCallback());
-      } else {
-        storage::ObjectIdentifier object_identifier;
-        Status status = manager_->ResolveReference(
-            std::move(merged_value.new_value->reference()), &object_identifier);
-        if (status != Status::OK) {
-          waiter->NewCallback()(storage::Status::NOT_FOUND, {});
-          return;
-        }
-        waiter->NewCallback()(storage::Status::OK,
-                              std::move(object_identifier));
-      }
-      break;
-    }
-    case ValueSource::DELETE: {
-      journal_->Delete(merged_value.key,
-                       [callback = waiter->NewCallback()](
-                           storage::Status status) { callback(status, {}); });
-      break;
-    }
-  }
-}
-
-void ConflictResolverClient::Finalize(Status status) {
-  FXL_DCHECK(callback_) << "Finalize must only be called once.";
-  if (journal_) {
-    storage_->RollbackJournal(std::move(journal_),
-                              [](storage::Status /*rollback_status*/) {});
-    journal_.reset();
-  }
-  merge_result_provider_binding_.Close(status);
-  auto callback = std::move(callback_);
-  callback_ = nullptr;
-  callback(status);
-}
-
-void ConflictResolverClient::GetFullDiffNew(
-    std::unique_ptr<Token> token,
-    fit::function<void(Status, IterationStatus, std::vector<DiffEntry>,
-                       std::unique_ptr<Token>)>
-        callback) {
-  GetDiff(diff_utils::DiffType::FULL, std::move(token), std::move(callback));
-}
-
-void ConflictResolverClient::GetFullDiff(
-    std::unique_ptr<Token> token,
-    fit::function<void(Status, Status, std::vector<DiffEntry>,
-                       std::unique_ptr<Token>)>
-        callback) {
-  GetFullDiffNew(
-      std::move(token),
-      [callback = std::move(callback)](
-          Status status, IterationStatus diff_status,
-          std::vector<DiffEntry> entries, std::unique_ptr<Token> token) {
-        if (status != Status::OK && status != Status::PARTIAL_RESULT) {
-          callback(status, status, std::move(entries), std::move(token));
-          return;
-        }
-        callback(Status::OK,
-                 diff_status == IterationStatus::OK ? Status::OK
-                                                    : Status::PARTIAL_RESULT,
-                 std::move(entries), std::move(token));
-      });
-}
-
-void ConflictResolverClient::GetConflictingDiffNew(
-    std::unique_ptr<Token> token,
-    fit::function<void(Status, IterationStatus, std::vector<DiffEntry>,
-                       std::unique_ptr<Token>)>
-        callback) {
-  GetDiff(diff_utils::DiffType::CONFLICTING, std::move(token),
-          std::move(callback));
-}
-
-void ConflictResolverClient::GetConflictingDiff(
-    std::unique_ptr<Token> token,
-    fit::function<void(Status, Status, std::vector<DiffEntry>,
-                       std::unique_ptr<Token>)>
-        callback) {
-  GetConflictingDiffNew(
-      std::move(token),
-      [callback = std::move(callback)](
-          Status status, IterationStatus diff_status,
-          std::vector<DiffEntry> entries, std::unique_ptr<Token> token) {
-        if (status != Status::OK && status != Status::PARTIAL_RESULT) {
-          callback(status, status, std::move(entries), std::move(token));
-          return;
-        }
-        callback(Status::OK,
-                 diff_status == IterationStatus::OK ? Status::OK
-                                                    : Status::PARTIAL_RESULT,
-                 std::move(entries), std::move(token));
-      });
-}
-
-void ConflictResolverClient::GetDiff(
-    diff_utils::DiffType type, std::unique_ptr<Token> token,
-    fit::function<void(Status, IterationStatus, std::vector<DiffEntry>,
-                       std::unique_ptr<Token>)>
-        callback) {
-  diff_utils::ComputeThreeWayDiff(
-      storage_, *ancestor_, *left_, *right_, "",
-      token ? convert::ToString(token->opaque_id) : "", type,
-      callback::MakeScoped(
-          weak_factory_.GetWeakPtr(),
-          [this, callback = std::move(callback)](
-              Status status,
-              std::pair<std::vector<DiffEntry>, std::string> page_change) {
-            if (cancelled_) {
-              callback(Status::INTERNAL_ERROR, IterationStatus::OK,
-                       {}, nullptr);
-              Finalize(Status::INTERNAL_ERROR);
-              return;
-            }
-            if (status != Status::OK) {
-              FXL_LOG(ERROR) << "Unable to compute diff due to error "
-                             << fidl::ToUnderlying(status) << ", aborting.";
-              callback(status, IterationStatus::OK,
-                       {}, nullptr);
-              Finalize(status);
-              return;
-            }
-
-            const std::string& next_token = page_change.second;
-            IterationStatus diff_status = next_token.empty()
-                                              ? IterationStatus::OK
-                                              : IterationStatus::PARTIAL_RESULT;
-            std::unique_ptr<Token> token;
-            if (!next_token.empty()) {
-              token = std::make_unique<Token>();
-              token->opaque_id = convert::ToArray(next_token);
-            }
-            callback(Status::OK, diff_status, std::move(page_change.first),
-                     std::move(token));
-          }));
-}
-
-void ConflictResolverClient::MergeNew(
-    std::vector<MergedValue> merged_values,
-    fit::function<void(Status)> callback) {
-  has_merged_values_ = true;
-  operation_serializer_.Serialize<Status>(
-      std::move(callback), [this, weak_this = weak_factory_.GetWeakPtr(),
-                            merged_values = std::move(merged_values)](
-                               fit::function<void(Status)> callback) mutable {
-        if (!IsInValidStateAndNotify(weak_this, callback)) {
-          return;
-        }
-        auto waiter = fxl::MakeRefCounted<
-            callback::Waiter<storage::Status, storage::ObjectIdentifier>>(
-            storage::Status::OK);
-        for (const MergedValue& merged_value : merged_values) {
-          OnNextMergeResult(merged_value, waiter);
-        }
-        waiter->Finalize([this, weak_this,
-                          merged_values = std::move(merged_values),
-                          callback = std::move(callback)](
-                             storage::Status status,
-                             std::vector<storage::ObjectIdentifier>
-                                 object_identifiers) mutable {
-          if (!IsInValidStateAndNotify(weak_this, callback, status)) {
-            return;
-          }
-
-          auto waiter =
-              fxl::MakeRefCounted<callback::StatusWaiter<storage::Status>>(
-                  storage::Status::OK);
-          for (size_t i = 0; i < object_identifiers.size(); ++i) {
-            // DELETE is encoded with an invalid digest in OnNextMergeResult.
-            if (!object_identifiers[i].object_digest().IsValid()) {
-              continue;
-            }
-            journal_->Put(merged_values.at(i).key, object_identifiers[i],
-                          merged_values.at(i).priority == Priority::EAGER
-                              ? storage::KeyPriority::EAGER
-                              : storage::KeyPriority::LAZY,
-                          waiter->NewCallback());
-          }
-          waiter->Finalize(
-              [callback = std::move(callback)](storage::Status status) {
-                callback(PageUtils::ConvertStatus(status));
-              });
-        });
-      });
-}
-
-void ConflictResolverClient::Merge(
-    std::vector<MergedValue> merged_values,
-    fit::function<void(Status, Status)> callback) {
-  MergeNew(std::move(merged_values),
-           [callback = std::move(callback)](Status status) {
-             callback(status, status);
-           });
-}
-
-void ConflictResolverClient::MergeNonConflictingEntriesNew(
-    fit::function<void(Status)> callback) {
-  operation_serializer_.Serialize<Status>(
-      std::move(callback), [this, weak_this = weak_factory_.GetWeakPtr()](
-                               fit::function<void(Status)> callback) mutable {
-        if (!IsInValidStateAndNotify(weak_this, callback)) {
-          return;
-        }
-        auto waiter =
-            fxl::MakeRefCounted<callback::StatusWaiter<storage::Status>>(
-                storage::Status::OK);
-
-        auto on_next = [this, weak_this,
-                        waiter](storage::ThreeWayChange change) {
-          if (!weak_this) {
-            return false;
-          }
-          // When |MergeNonConflictingEntries| is called first, we know that the
-          // base state of |journal_| is equal to the left version. In that
-          // case, we only want to merge diffs where the change is only on the
-          // right side: no change means no diff, 3 different versions means
-          // conflict (so we skip), and left-only changes are already taken into
-          // account.
-          if (util::EqualPtr(change.base, change.left)) {
-            if (change.right) {
-              journal_->Put(change.right->key, change.right->object_identifier,
-                            change.right->priority, waiter->NewCallback());
-            } else {
-              journal_->Delete(change.base->key, waiter->NewCallback());
-            }
-          } else if (util::EqualPtr(change.base, change.right) &&
-                     has_merged_values_) {
-            if (change.left) {
-              journal_->Put(change.left->key, change.left->object_identifier,
-                            change.left->priority, waiter->NewCallback());
-            } else {
-              journal_->Delete(change.base->key, waiter->NewCallback());
-            }
-          }
-          return true;
-        };
-        auto on_done = [waiter, callback = std::move(callback)](
-                           storage::Status status) mutable {
-          if (status != storage::Status::OK) {
-            callback(PageUtils::ConvertStatus(status));
-            return;
-          }
-          waiter->Finalize(
-              [callback = std::move(callback)](storage::Status status) {
-                callback(PageUtils::ConvertStatus(status));
-              });
-        };
-        storage_->GetThreeWayContentsDiff(*ancestor_, *left_, *right_, "",
-                                          std::move(on_next),
-                                          std::move(on_done));
-      });
-}
-
-void ConflictResolverClient::MergeNonConflictingEntries(
-    fit::function<void(Status, Status)> callback) {
-  MergeNonConflictingEntriesNew(
-      [callback = std::move(callback)](Status status) {
-        callback(status, status);
-      });
-}
-
-void ConflictResolverClient::DoneNew(fit::function<void(Status)> callback) {
-  operation_serializer_.Serialize<Status>(
-      std::move(callback), [this, weak_this = weak_factory_.GetWeakPtr()](
-                               fit::function<void(Status)> callback) mutable {
-        if (!IsInValidStateAndNotify(weak_this, callback)) {
-          return;
-        }
-        in_client_request_ = false;
-        FXL_DCHECK(!cancelled_);
-        FXL_DCHECK(journal_);
-
-        storage_->CommitJournal(
-            std::move(journal_),
-            callback::MakeScoped(
-                weak_factory_.GetWeakPtr(),
-                [this, weak_this, callback = std::move(callback)](
-                    storage::Status status,
-                    std::unique_ptr<const storage::Commit>) {
-                  if (!IsInValidStateAndNotify(weak_this, callback, status)) {
-                    return;
-                  }
-                  callback(Status::OK);
-                  Finalize(Status::OK);
-                }));
-      });
-}
-
-void ConflictResolverClient::Done(
-    fit::function<void(Status, Status)> callback) {
-  DoneNew([callback = std::move(callback)](Status status) {
-    callback(status, status);
-  });
-}
-
-bool ConflictResolverClient::IsInValidStateAndNotify(
-    const fxl::WeakPtr<ConflictResolverClient>& weak_this,
-    const fit::function<void(Status)>& callback, storage::Status status) {
-  if (!weak_this) {
-    callback(Status::INTERNAL_ERROR);
-    return false;
-  }
-  if (!weak_this->cancelled_ && status == storage::Status::OK) {
-    return true;
-  }
-  Status ledger_status =
-      weak_this->cancelled_
-          ? Status::INTERNAL_ERROR
-          // The only not found error that can occur is a key not
-          // found when processing a MergedValue with
-          // ValueSource::RIGHT.
-          : PageUtils::ConvertStatus(status, Status::KEY_NOT_FOUND);
-  // An eventual error was logged before, no need to do it again here.
-  callback(ledger_status);
-  // Finalize destroys this object; we need to do it after executing
-  // the callback.
-  weak_this->Finalize(ledger_status);
-  return false;
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/conflict_resolver_client.h b/bin/ledger/app/merging/conflict_resolver_client.h
deleted file mode 100644
index b576866..0000000
--- a/bin/ledger/app/merging/conflict_resolver_client.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_MERGING_CONFLICT_RESOLVER_CLIENT_H_
-#define PERIDOT_BIN_LEDGER_APP_MERGING_CONFLICT_RESOLVER_CLIENT_H_
-
-#include <memory>
-#include <vector>
-
-#include <lib/callback/operation_serializer.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/app/diff_utils.h"
-#include "peridot/bin/ledger/app/page_manager.h"
-#include "peridot/bin/ledger/fidl/error_notifier.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-// Client handling communication with a ConflictResolver interface in order to
-// merge conflicting commit branches. It is used both by AutoMergeStrategy and
-// CustomMergeStrategy.
-class ConflictResolverClient
-    : public fuchsia::ledger::MergeResultProviderErrorNotifierDelegate {
- public:
-  explicit ConflictResolverClient(
-      storage::PageStorage* storage, PageManager* page_manager,
-      ConflictResolver* conflict_resolver,
-      std::unique_ptr<const storage::Commit> left,
-      std::unique_ptr<const storage::Commit> right,
-      std::unique_ptr<const storage::Commit> ancestor,
-      fit::function<void(Status)> callback);
-  ~ConflictResolverClient() override;
-
-  void Start();
-  void Cancel();
-
- private:
-  void OnNextMergeResult(
-      const MergedValue& merged_value,
-      const fxl::RefPtr<callback::Waiter<storage::Status,
-                                         storage::ObjectIdentifier>>& waiter);
-
-  // Rolls back journal, closes merge result provider and invokes callback_ with
-  // |status|. This method must be called at most once.
-  void Finalize(Status status);
-
-  // Performs a diff of the given type on the conflict. Return a |Status|
-  // different than OK if an error occured. If no error, return an
-  // |IterationStatus|.
-  void GetDiff(
-      diff_utils::DiffType type, std::unique_ptr<Token> token,
-      fit::function<void(Status, IterationStatus, std::vector<DiffEntry>,
-                         std::unique_ptr<Token>)>
-          callback);
-
-  // MergeResultProviderNotifierDelegate:
-  void GetFullDiff(
-      std::unique_ptr<Token> token,
-      fit::function<void(Status, Status, std::vector<DiffEntry>,
-                         std::unique_ptr<Token>)>
-          callback) override;
-  void GetFullDiffNew(
-      std::unique_ptr<Token> token,
-      fit::function<void(Status, IterationStatus, std::vector<DiffEntry>,
-                         std::unique_ptr<Token>)>
-          callback) override;
-  void GetConflictingDiff(
-      std::unique_ptr<Token> token,
-      fit::function<void(Status, Status, std::vector<DiffEntry>,
-                         std::unique_ptr<Token>)>
-          callback) override;
-  void GetConflictingDiffNew(
-      std::unique_ptr<Token> token,
-      fit::function<void(Status, IterationStatus, std::vector<DiffEntry>,
-                         std::unique_ptr<Token>)>
-          callback) override;
-  void Merge(std::vector<MergedValue> merged_values,
-             fit::function<void(Status, Status)> callback) override;
-  void MergeNew(std::vector<MergedValue> merged_values,
-                fit::function<void(Status)> callback) override;
-  void MergeNonConflictingEntries(
-      fit::function<void(Status, Status)> callback) override;
-  void MergeNonConflictingEntriesNew(
-      fit::function<void(Status)> callback) override;
-  void Done(fit::function<void(Status, Status)> callback) override;
-  void DoneNew(fit::function<void(Status)> callback) override;
-
-  // Checks whether this ConflictResolverClient is still valid (not deleted nor
-  // cancelled) and the status is OK. Returns |true| in that case. Otherwise,
-  // calls |callback| with the given |status| and calls |Finalize| if this
-  // object is not deleted, then return |false|.
-  static bool IsInValidStateAndNotify(
-      const fxl::WeakPtr<ConflictResolverClient>& weak_this,
-      const fit::function<void(Status)>& callback,
-      storage::Status status = storage::Status::OK);
-
-  storage::PageStorage* const storage_;
-  PageManager* const manager_;
-  ConflictResolver* const conflict_resolver_;
-
-  std::unique_ptr<const storage::Commit> const left_;
-  std::unique_ptr<const storage::Commit> const right_;
-  std::unique_ptr<const storage::Commit> const ancestor_;
-
-  // Called when the merge process is finished.
-  fit::function<void(Status)> callback_;
-
-  // |has_merged_values_| is true when |Merge| has been called to set some
-  // values. It is used as an optimization in |MergeNonConflictingEntries|.
-  bool has_merged_values_ = false;
-  std::unique_ptr<storage::Journal> journal_;
-  // |in_client_request_| is true when waiting for the callback of the
-  // ConflictResolver.Resolve call. When this merge is cancelled, we check this
-  // boolean to know if we should abort immediately (when in a client request,
-  // as the client may have disconnected) and when we should wait for the
-  // operation to finish (the other cases, such as committing the merge).
-  bool in_client_request_ = false;
-  bool cancelled_ = false;
-
-  // Operations are operating on the state of the merge commit. They must be
-  // serialized.
-  callback::OperationSerializer operation_serializer_;
-
-  ledger::ErrorNotifierBinding<
-      fuchsia::ledger::MergeResultProviderErrorNotifierDelegate>
-      merge_result_provider_binding_;
-
-  // This must be the last member of the class.
-  fxl::WeakPtrFactory<ConflictResolverClient> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ConflictResolverClient);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_MERGING_CONFLICT_RESOLVER_CLIENT_H_
diff --git a/bin/ledger/app/merging/conflict_resolver_client_unittest.cc b/bin/ledger/app/merging/conflict_resolver_client_unittest.cc
deleted file mode 100644
index 4924571..0000000
--- a/bin/ledger/app/merging/conflict_resolver_client_unittest.cc
+++ /dev/null
@@ -1,350 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <string>
-
-#include <lib/backoff/testing/test_backoff.h>
-#include <lib/callback/cancellable_helper.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/macros.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/merging/custom_merge_strategy.h"
-#include "peridot/bin/ledger/app/merging/merge_resolver.h"
-#include "peridot/bin/ledger/app/merging/test_utils.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/encryption/primitives/hash.h"
-#include "peridot/bin/ledger/storage/impl/page_storage_impl.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-namespace {
-class ConflictResolverClientTest : public TestWithPageStorage {
- public:
-  ConflictResolverClientTest() {}
-  ~ConflictResolverClientTest() override {}
-
- protected:
-  storage::PageStorage* page_storage() override { return page_storage_; }
-
-  void SetUp() override {
-    TestWithPageStorage::SetUp();
-    std::unique_ptr<storage::PageStorage> page_storage;
-    ASSERT_TRUE(CreatePageStorage(&page_storage));
-    page_storage_ = page_storage.get();
-
-    std::unique_ptr<MergeResolver> resolver = std::make_unique<MergeResolver>(
-        [] {}, &environment_, page_storage_,
-        std::make_unique<backoff::TestBackoff>());
-    resolver->SetMergeStrategy(nullptr);
-    resolver->set_on_empty(QuitLoopClosure());
-    merge_resolver_ = resolver.get();
-
-    page_manager_ = std::make_unique<PageManager>(
-        &environment_, std::move(page_storage), nullptr, std::move(resolver),
-        PageManager::PageStorageState::NEEDS_SYNC);
-  }
-
-  storage::CommitId CreateCommit(
-      storage::CommitIdView parent_id,
-      fit::function<void(storage::Journal*)> contents) {
-    storage::Status status;
-    bool called;
-    std::unique_ptr<storage::Journal> journal;
-    page_storage_->StartCommit(
-        parent_id.ToString(), storage::JournalType::IMPLICIT,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-
-    contents(journal.get());
-    std::unique_ptr<const storage::Commit> commit;
-    page_storage_->CommitJournal(
-        std::move(journal),
-        callback::Capture(callback::SetWhenCalled(&called), &status, &commit));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-    return commit->GetId();
-  }
-
-  storage::PageStorage* page_storage_;
-  MergeResolver* merge_resolver_;
-
- private:
-  std::unique_ptr<PageManager> page_manager_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ConflictResolverClientTest);
-};
-
-class ConflictResolverImpl : public ConflictResolver {
- public:
-  explicit ConflictResolverImpl(
-      fidl::InterfaceRequest<ConflictResolver> request,
-      fit::closure quit_callback)
-      : binding_(this, std::move(request)),
-        quit_callback_(std::move(quit_callback)) {
-    binding_.set_error_handler(
-        [this](zx_status_t status) { this->disconnected = true; });
-  }
-  ~ConflictResolverImpl() override {}
-
-  struct ResolveRequest {
-    fidl::InterfaceHandle<PageSnapshot> left_version;
-    fidl::InterfaceHandle<PageSnapshot> right_version;
-    fidl::InterfaceHandle<PageSnapshot> common_version;
-    MergeResultProviderPtr result_provider_ptr;
-    bool result_provider_disconnected = false;
-    zx_status_t result_provider_status = ZX_OK;
-
-    ResolveRequest(fidl::InterfaceHandle<PageSnapshot> left_version,
-                   fidl::InterfaceHandle<PageSnapshot> right_version,
-                   fidl::InterfaceHandle<PageSnapshot> common_version,
-                   fidl::InterfaceHandle<MergeResultProvider> result_provider)
-        : left_version(std::move(left_version)),
-          right_version(std::move(right_version)),
-          common_version(std::move(common_version)),
-          result_provider_ptr(result_provider.Bind()) {
-      result_provider_ptr.set_error_handler(callback::Capture(
-          callback::SetWhenCalled(&result_provider_disconnected),
-          &result_provider_status));
-    }
-  };
-
-  std::vector<std::unique_ptr<ResolveRequest>> requests;
-  bool disconnected = false;
-
- private:
-  // ConflictResolver:
-  void Resolve(
-      fidl::InterfaceHandle<PageSnapshot> left_version,
-      fidl::InterfaceHandle<PageSnapshot> right_version,
-      fidl::InterfaceHandle<PageSnapshot> common_version,
-      fidl::InterfaceHandle<MergeResultProvider> result_provider) override {
-    requests.push_back(std::make_unique<ResolveRequest>(
-        std::move(left_version), std::move(right_version),
-        std::move(common_version), std::move(result_provider)));
-    quit_callback_();
-  }
-
-  fidl::Binding<ConflictResolver> binding_;
-  fit::closure quit_callback_;
-};
-
-TEST_F(ConflictResolverClientTest, Error) {
-  // Set up conflict.
-  CreateCommit(storage::kFirstPageCommitId,
-               AddKeyValueToJournal("key1", "value1"));
-  CreateCommit(storage::kFirstPageCommitId,
-               AddKeyValueToJournal("key2", "value2"));
-
-  // Set the resolver.
-  ConflictResolverPtr conflict_resolver_ptr;
-  ConflictResolverImpl conflict_resolver_impl(
-      conflict_resolver_ptr.NewRequest(), QuitLoopClosure());
-  std::unique_ptr<CustomMergeStrategy> custom_merge_strategy =
-      std::make_unique<CustomMergeStrategy>(std::move(conflict_resolver_ptr));
-
-  bool custom_strategy_error = false;
-  custom_merge_strategy->SetOnError([this, &custom_strategy_error]() {
-    custom_strategy_error = true;
-    QuitLoop();
-  });
-
-  merge_resolver_->SetMergeStrategy(std::move(custom_merge_strategy));
-  bool called;
-  storage::Status status;
-  std::vector<storage::CommitId> ids;
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(2u, ids.size());
-
-  EXPECT_FALSE(merge_resolver_->IsEmpty());
-  EXPECT_EQ(1u, conflict_resolver_impl.requests.size());
-
-  // Create a bogus conflict resolution.
-  std::vector<MergedValue> merged_values;
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("unknown_key");
-    merged_value.source = ValueSource::RIGHT;
-    merged_values.push_back(std::move(merged_value));
-  }
-
-  conflict_resolver_impl.requests[0]->result_provider_ptr->MergeNew(
-      std::move(merged_values));
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(Status::KEY_NOT_FOUND,
-            static_cast<Status>(
-                conflict_resolver_impl.requests[0]->result_provider_status));
-  EXPECT_EQ(2u, conflict_resolver_impl.requests.size());
-}
-
-TEST_F(ConflictResolverClientTest, MergeNonConflicting) {
-  // Set up conflict.
-  CreateCommit(storage::kFirstPageCommitId,
-               AddKeyValueToJournal("key1", "value1"));
-  CreateCommit(storage::kFirstPageCommitId,
-               AddKeyValueToJournal("key2", "value2"));
-
-  // Set the resolver.
-  ConflictResolverPtr conflict_resolver_ptr;
-  ConflictResolverImpl conflict_resolver_impl(
-      conflict_resolver_ptr.NewRequest(), QuitLoopClosure());
-  std::unique_ptr<CustomMergeStrategy> custom_merge_strategy =
-      std::make_unique<CustomMergeStrategy>(std::move(conflict_resolver_ptr));
-
-  merge_resolver_->SetMergeStrategy(std::move(custom_merge_strategy));
-
-  RunLoopUntilIdle();
-
-  EXPECT_FALSE(merge_resolver_->IsEmpty());
-  EXPECT_EQ(1u, conflict_resolver_impl.requests.size());
-
-  conflict_resolver_impl.requests[0]
-      ->result_provider_ptr->MergeNonConflictingEntriesNew();
-  conflict_resolver_impl.requests[0]->result_provider_ptr->DoneNew();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(conflict_resolver_impl.requests[0]->result_provider_disconnected);
-  EXPECT_EQ(ZX_OK, conflict_resolver_impl.requests[0]->result_provider_status);
-
-  bool called;
-  storage::Status storage_status;
-  std::vector<storage::CommitId> ids;
-  page_storage_->GetHeadCommitIds(callback::Capture(
-      callback::SetWhenCalled(&called), &storage_status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, storage_status);
-  // The merge happened.
-  EXPECT_EQ(1u, ids.size());
-
-  // Let's verify the contents.
-  std::unique_ptr<const storage::Commit> commit;
-  page_storage_->GetCommit(ids[0],
-                           callback::Capture(callback::SetWhenCalled(&called),
-                                             &storage_status, &commit));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, storage_status);
-
-  storage::Entry key1_entry, key2_entry;
-  page_storage_->GetEntryFromCommit(
-      *commit, "key1",
-      callback::Capture(callback::SetWhenCalled(&called), &storage_status,
-                        &key1_entry));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, storage_status);
-
-  page_storage_->GetEntryFromCommit(
-      *commit, "key2",
-      callback::Capture(callback::SetWhenCalled(&called), &storage_status,
-                        &key2_entry));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, storage_status);
-
-  std::string value1, value2;
-  GetValue(key1_entry.object_identifier, &value1);
-  EXPECT_EQ("value1", value1);
-  GetValue(key2_entry.object_identifier, &value2);
-  EXPECT_EQ("value2", value2);
-}
-
-TEST_F(ConflictResolverClientTest, MergeNonConflictingOrdering) {
-  // Set up conflict.
-  storage::CommitId base_id = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key1", "value1"));
-  CreateCommit(base_id, AddKeyValueToJournal("key2", "value2"));
-  CreateCommit(base_id, AddKeyValueToJournal("key1", "value1bis"));
-
-  // Set the resolver.
-  ConflictResolverPtr conflict_resolver_ptr;
-  ConflictResolverImpl conflict_resolver_impl(
-      conflict_resolver_ptr.NewRequest(), QuitLoopClosure());
-  std::unique_ptr<CustomMergeStrategy> custom_merge_strategy =
-      std::make_unique<CustomMergeStrategy>(std::move(conflict_resolver_ptr));
-
-  merge_resolver_->SetMergeStrategy(std::move(custom_merge_strategy));
-
-  RunLoopUntilIdle();
-
-  EXPECT_FALSE(merge_resolver_->IsEmpty());
-  EXPECT_EQ(1u, conflict_resolver_impl.requests.size());
-
-  std::vector<MergedValue> merged_values;
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("key1");
-    merged_value.source = ValueSource::RIGHT;
-    merged_values.push_back(std::move(merged_value));
-  }
-
-  conflict_resolver_impl.requests[0]->result_provider_ptr->MergeNew(
-      std::move(merged_values));
-  conflict_resolver_impl.requests[0]
-      ->result_provider_ptr->MergeNonConflictingEntriesNew();
-  conflict_resolver_impl.requests[0]->result_provider_ptr->DoneNew();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(conflict_resolver_impl.requests[0]->result_provider_disconnected);
-  EXPECT_EQ(ZX_OK, conflict_resolver_impl.requests[0]->result_provider_status);
-
-  bool called;
-  storage::Status storage_status;
-  std::vector<storage::CommitId> ids;
-  page_storage_->GetHeadCommitIds(callback::Capture(
-      callback::SetWhenCalled(&called), &storage_status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, storage_status);
-  // The merge happened.
-  EXPECT_EQ(1u, ids.size());
-
-  // Let's verify the contents.
-  std::unique_ptr<const storage::Commit> commit;
-  page_storage_->GetCommit(ids[0],
-                           callback::Capture(callback::SetWhenCalled(&called),
-                                             &storage_status, &commit));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, storage_status);
-
-  storage::Entry key1_entry, key2_entry;
-  page_storage_->GetEntryFromCommit(
-      *commit, "key1",
-      callback::Capture(callback::SetWhenCalled(&called), &storage_status,
-                        &key1_entry));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, storage_status);
-
-  page_storage_->GetEntryFromCommit(
-      *commit, "key2",
-      callback::Capture(callback::SetWhenCalled(&called), &storage_status,
-                        &key2_entry));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, storage_status);
-
-  std::string value1, value2;
-  GetValue(key1_entry.object_identifier, &value1);
-  EXPECT_EQ("value1bis", value1);
-  GetValue(key2_entry.object_identifier, &value2);
-  EXPECT_EQ("value2", value2);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/custom_merge_strategy.cc b/bin/ledger/app/merging/custom_merge_strategy.cc
deleted file mode 100644
index 69c587f..0000000
--- a/bin/ledger/app/merging/custom_merge_strategy.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/merging/custom_merge_strategy.h"
-
-#include <memory>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/app/page_manager.h"
-
-namespace ledger {
-CustomMergeStrategy::CustomMergeStrategy(ConflictResolverPtr conflict_resolver)
-    : conflict_resolver_(std::move(conflict_resolver)) {
-  conflict_resolver_.set_error_handler([this](zx_status_t status) {
-    // If a merge is in progress, it must be terminated.
-    if (in_progress_merge_) {
-      // The actual cleanup of in_progress_merge_ will happen in its on_done
-      // callback.
-      in_progress_merge_->Cancel();
-    }
-    if (on_error_) {
-      // It is safe to call |on_error_| because the error handler waits for the
-      // merges to finish before deleting this object.
-      on_error_();
-    }
-  });
-}
-
-CustomMergeStrategy::~CustomMergeStrategy() {}
-
-void CustomMergeStrategy::SetOnError(fit::closure on_error) {
-  on_error_ = std::move(on_error);
-}
-
-void CustomMergeStrategy::Merge(storage::PageStorage* storage,
-                                PageManager* page_manager,
-                                std::unique_ptr<const storage::Commit> head_1,
-                                std::unique_ptr<const storage::Commit> head_2,
-                                std::unique_ptr<const storage::Commit> ancestor,
-                                fit::function<void(Status)> callback) {
-  FXL_DCHECK(head_1->GetTimestamp() <= head_2->GetTimestamp());
-  FXL_DCHECK(!in_progress_merge_);
-
-  in_progress_merge_ = std::make_unique<ConflictResolverClient>(
-      storage, page_manager, conflict_resolver_.get(), std::move(head_2),
-      std::move(head_1), std::move(ancestor),
-      [this, callback = std::move(callback)](Status status) {
-        in_progress_merge_.reset();
-        callback(status);
-      });
-
-  in_progress_merge_->Start();
-}
-
-void CustomMergeStrategy::Cancel() {
-  if (in_progress_merge_) {
-    in_progress_merge_->Cancel();
-  }
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/custom_merge_strategy.h b/bin/ledger/app/merging/custom_merge_strategy.h
deleted file mode 100644
index fb92e4e..0000000
--- a/bin/ledger/app/merging/custom_merge_strategy.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_MERGING_CUSTOM_MERGE_STRATEGY_H_
-#define PERIDOT_BIN_LEDGER_APP_MERGING_CUSTOM_MERGE_STRATEGY_H_
-
-#include <memory>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/app/merging/conflict_resolver_client.h"
-#include "peridot/bin/ledger/app/merging/merge_strategy.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-// Strategy for merging commits using the CUSTOM policy.
-class CustomMergeStrategy : public MergeStrategy {
- public:
-  explicit CustomMergeStrategy(ConflictResolverPtr conflict_resolver);
-  ~CustomMergeStrategy() override;
-
-  // MergeStrategy:
-  void SetOnError(fit::closure on_error) override;
-
-  void Merge(storage::PageStorage* storage, PageManager* page_manager,
-             std::unique_ptr<const storage::Commit> head_1,
-             std::unique_ptr<const storage::Commit> head_2,
-             std::unique_ptr<const storage::Commit> ancestor,
-             fit::function<void(Status)> callback) override;
-
-  void Cancel() override;
-
- private:
-  fit::closure on_error_;
-
-  ConflictResolverPtr conflict_resolver_;
-
-  std::unique_ptr<ConflictResolverClient> in_progress_merge_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(CustomMergeStrategy);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_MERGING_CUSTOM_MERGE_STRATEGY_H_
diff --git a/bin/ledger/app/merging/last_one_wins_merge_strategy.cc b/bin/ledger/app/merging/last_one_wins_merge_strategy.cc
deleted file mode 100644
index da56323..0000000
--- a/bin/ledger/app/merging/last_one_wins_merge_strategy.cc
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/merging/last_one_wins_merge_strategy.h"
-
-#include <memory>
-#include <string>
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/app/page_manager.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-
-namespace ledger {
-
-class LastOneWinsMergeStrategy::LastOneWinsMerger {
- public:
-  LastOneWinsMerger(storage::PageStorage* storage,
-                    std::unique_ptr<const storage::Commit> left,
-                    std::unique_ptr<const storage::Commit> right,
-                    std::unique_ptr<const storage::Commit> ancestor,
-                    fit::function<void(Status)> callback);
-  ~LastOneWinsMerger();
-
-  void Start();
-  void Cancel();
-
- private:
-  void Done(Status status);
-  void BuildAndCommitJournal();
-
-  storage::PageStorage* const storage_;
-
-  std::unique_ptr<const storage::Commit> const left_;
-  std::unique_ptr<const storage::Commit> const right_;
-  std::unique_ptr<const storage::Commit> const ancestor_;
-
-  fit::function<void(Status)> callback_;
-
-  std::unique_ptr<storage::Journal> journal_;
-  bool cancelled_ = false;
-
-  // This must be the last member of the class.
-  fxl::WeakPtrFactory<LastOneWinsMerger> weak_factory_;
-};
-
-LastOneWinsMergeStrategy::LastOneWinsMerger::LastOneWinsMerger(
-    storage::PageStorage* storage, std::unique_ptr<const storage::Commit> left,
-    std::unique_ptr<const storage::Commit> right,
-    std::unique_ptr<const storage::Commit> ancestor,
-    fit::function<void(Status)> callback)
-    : storage_(storage),
-      left_(std::move(left)),
-      right_(std::move(right)),
-      ancestor_(std::move(ancestor)),
-      callback_(std::move(callback)),
-      weak_factory_(this) {
-  FXL_DCHECK(callback_);
-}
-
-LastOneWinsMergeStrategy::LastOneWinsMerger::~LastOneWinsMerger() {
-  if (journal_) {
-    storage_->RollbackJournal(std::move(journal_),
-                              [](storage::Status /*status*/) {});
-  }
-}
-
-void LastOneWinsMergeStrategy::LastOneWinsMerger::Start() {
-  storage_->StartMergeCommit(
-      left_->GetId(), right_->GetId(),
-      callback::MakeScoped(
-          weak_factory_.GetWeakPtr(),
-          [this](storage::Status s, std::unique_ptr<storage::Journal> journal) {
-            if (cancelled_ || s != storage::Status::OK) {
-              Done(cancelled_ ? Status::INTERNAL_ERROR
-                              : PageUtils::ConvertStatus(s));
-              return;
-            }
-            journal_ = std::move(journal);
-            BuildAndCommitJournal();
-          }));
-}
-
-void LastOneWinsMergeStrategy::LastOneWinsMerger::Cancel() {
-  cancelled_ = true;
-  if (journal_) {
-    storage_->RollbackJournal(std::move(journal_),
-                              [](storage::Status /*status*/) {});
-    journal_.reset();
-  }
-}
-
-void LastOneWinsMergeStrategy::LastOneWinsMerger::Done(Status status) {
-  auto callback = std::move(callback_);
-  callback_ = nullptr;
-  callback(status);
-}
-
-void LastOneWinsMergeStrategy::LastOneWinsMerger::BuildAndCommitJournal() {
-  auto waiter = fxl::MakeRefCounted<callback::StatusWaiter<storage::Status>>(
-      storage::Status::OK);
-  auto on_next = [weak_this = weak_factory_.GetWeakPtr(),
-                  waiter = waiter.get()](storage::EntryChange change) {
-    if (!weak_this || weak_this->cancelled_) {
-      // No need to call Done, as it will be called in the on_done callback.
-      return false;
-    }
-    const std::string& key = change.entry.key;
-    if (change.deleted) {
-      weak_this->journal_->Delete(key, waiter->NewCallback());
-    } else {
-      weak_this->journal_->Put(key, change.entry.object_identifier,
-                               change.entry.priority, waiter->NewCallback());
-    }
-    return true;
-  };
-
-  auto on_diff_done = [weak_this = weak_factory_.GetWeakPtr(),
-                       waiter = std::move(waiter)](storage::Status s) {
-    if (!weak_this) {
-      return;
-    }
-    if (weak_this->cancelled_) {
-      weak_this->Done(Status::INTERNAL_ERROR);
-      return;
-    }
-    if (s != storage::Status::OK) {
-      FXL_LOG(ERROR) << "Unable to create diff for merging: " << s;
-      weak_this->Done(PageUtils::ConvertStatus(s));
-      return;
-    }
-    waiter->Finalize([weak_this](storage::Status s) {
-      if (!weak_this) {
-        return;
-      }
-      if (weak_this->cancelled_) {
-        weak_this->Done(Status::INTERNAL_ERROR);
-        return;
-      }
-      if (s != storage::Status::OK) {
-        FXL_LOG(ERROR) << "Error while merging commits: " << s;
-        weak_this->Done(PageUtils::ConvertStatus(s));
-        return;
-      }
-      weak_this->storage_->CommitJournal(
-          std::move(weak_this->journal_),
-          [weak_this](storage::Status s,
-                      std::unique_ptr<const storage::Commit>) {
-            if (s != storage::Status::OK) {
-              FXL_LOG(ERROR) << "Unable to commit merge journal: " << s;
-            }
-            if (weak_this) {
-              weak_this->Done(
-                  PageUtils::ConvertStatus(s, Status::INTERNAL_ERROR));
-            }
-          });
-    });
-  };
-  storage_->GetCommitContentsDiff(*(ancestor_), *(right_), "",
-                                  std::move(on_next), std::move(on_diff_done));
-}
-
-LastOneWinsMergeStrategy::LastOneWinsMergeStrategy() {}
-
-LastOneWinsMergeStrategy::~LastOneWinsMergeStrategy() {}
-
-void LastOneWinsMergeStrategy::SetOnError(fit::function<void()> /*on_error*/) {}
-
-void LastOneWinsMergeStrategy::Merge(
-    storage::PageStorage* storage, PageManager* /*page_manager*/,
-    std::unique_ptr<const storage::Commit> head_1,
-    std::unique_ptr<const storage::Commit> head_2,
-    std::unique_ptr<const storage::Commit> ancestor,
-    fit::function<void(Status)> callback) {
-  FXL_DCHECK(!in_progress_merge_);
-  FXL_DCHECK(head_1->GetTimestamp() <= head_2->GetTimestamp());
-
-  in_progress_merge_ =
-      std::make_unique<LastOneWinsMergeStrategy::LastOneWinsMerger>(
-          storage, std::move(head_1), std::move(head_2), std::move(ancestor),
-          [this, callback = std::move(callback)](Status status) {
-            in_progress_merge_.reset();
-            callback(status);
-          });
-
-  in_progress_merge_->Start();
-}
-
-void LastOneWinsMergeStrategy::Cancel() {
-  if (in_progress_merge_) {
-    in_progress_merge_->Cancel();
-  }
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/last_one_wins_merge_strategy.h b/bin/ledger/app/merging/last_one_wins_merge_strategy.h
deleted file mode 100644
index 905600e..0000000
--- a/bin/ledger/app/merging/last_one_wins_merge_strategy.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_MERGING_LAST_ONE_WINS_MERGE_STRATEGY_H_
-#define PERIDOT_BIN_LEDGER_APP_MERGING_LAST_ONE_WINS_MERGE_STRATEGY_H_
-
-#include <memory>
-
-#include <lib/callback/auto_cleanable.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/app/merging/merge_strategy.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-// Strategy for merging commits using a last-one-wins policy for conflicts.
-// Commits are merged key-by-key. When a key has been modified on both sides,
-// the value from the most recent commit is used.
-class LastOneWinsMergeStrategy : public MergeStrategy {
- public:
-  LastOneWinsMergeStrategy();
-  ~LastOneWinsMergeStrategy() override;
-
-  void SetOnError(fit::function<void()> on_error) override;
-
-  void Merge(storage::PageStorage* storage, PageManager* page_manager,
-             std::unique_ptr<const storage::Commit> head_1,
-             std::unique_ptr<const storage::Commit> head_2,
-             std::unique_ptr<const storage::Commit> ancestor,
-             fit::function<void(Status)> callback) override;
-
-  void Cancel() override;
-
- private:
-  class LastOneWinsMerger;
-
-  std::unique_ptr<LastOneWinsMerger> in_progress_merge_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_MERGING_LAST_ONE_WINS_MERGE_STRATEGY_H_
diff --git a/bin/ledger/app/merging/ledger_merge_manager.cc b/bin/ledger/app/merging/ledger_merge_manager.cc
deleted file mode 100644
index 32fc88e..0000000
--- a/bin/ledger/app/merging/ledger_merge_manager.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/merging/ledger_merge_manager.h"
-
-#include <memory>
-#include <string>
-
-#include <lib/backoff/exponential_backoff.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/app/merging/auto_merge_strategy.h"
-#include "peridot/bin/ledger/app/merging/custom_merge_strategy.h"
-#include "peridot/bin/ledger/app/merging/last_one_wins_merge_strategy.h"
-#include "peridot/bin/ledger/app/merging/merge_resolver.h"
-
-namespace ledger {
-
-class LedgerMergeManager::ConflictResolverFactoryPtrContainer {
- public:
-  explicit ConflictResolverFactoryPtrContainer(
-      fidl::InterfaceHandle<ConflictResolverFactory> factory)
-      : ptr_(factory.Bind()) {
-    ptr_.set_error_handler([this](zx_status_t status) { OnEmpty(); });
-  }
-
-  void set_on_empty(fit::closure on_empty_callback) {
-    on_empty_callback_ = std::move(on_empty_callback);
-  }
-
-  // Returns the pointer and disappear from the AutoCleanableMap
-  ConflictResolverFactoryPtr TakePtr() {
-    ConflictResolverFactoryPtr ptr = std::move(ptr_);
-    ptr.set_error_handler(nullptr);
-    // Deletes |this|
-    OnEmpty();
-    return ptr;
-  }
-
- private:
-  // Deletes the object when in an AutoCleanableMap
-  void OnEmpty() {
-    if (on_empty_callback_)
-      on_empty_callback_();
-  }
-
-  ConflictResolverFactoryPtr ptr_;
-  fit::closure on_empty_callback_;
-};
-
-LedgerMergeManager::LedgerMergeManager(Environment* environment)
-    : environment_(environment) {}
-
-LedgerMergeManager::~LedgerMergeManager() {}
-
-void LedgerMergeManager::AddFactory(
-    fidl::InterfaceHandle<ConflictResolverFactory> factory) {
-  using_default_conflict_resolver_ = false;
-
-  conflict_resolver_factories_.emplace(std::move(factory));
-
-  if (!current_conflict_resolver_factory_) {
-    ResetFactory();
-  }
-}
-
-void LedgerMergeManager::ResetFactory() {
-  if (conflict_resolver_factories_.empty())
-    return;
-
-  current_conflict_resolver_factory_ =
-      conflict_resolver_factories_.begin()->TakePtr();
-  current_conflict_resolver_factory_.set_error_handler(
-      [this](zx_status_t status) { this->ResetFactory(); });
-
-  for (const auto& item : resolvers_) {
-    item.second->SetMergeStrategy(nullptr);
-    GetResolverStrategyForPage(
-        item.first, [this, page_id = item.first](
-                        std::unique_ptr<MergeStrategy> strategy) mutable {
-          if (resolvers_.find(page_id) != resolvers_.end()) {
-            resolvers_[page_id]->SetMergeStrategy(std::move(strategy));
-          }
-        });
-  }
-}
-
-void LedgerMergeManager::RemoveResolver(const storage::PageId& page_id) {
-  resolvers_.erase(page_id);
-}
-
-std::unique_ptr<MergeResolver> LedgerMergeManager::GetMergeResolver(
-    storage::PageStorage* storage) {
-  storage::PageId page_id = storage->GetId();
-  std::unique_ptr<MergeResolver> resolver = std::make_unique<MergeResolver>(
-      [this, page_id]() { RemoveResolver(page_id); }, environment_, storage,
-      std::make_unique<backoff::ExponentialBackoff>(
-          zx::msec(10), 2u, zx::sec(60 * 60),
-          environment_->random()->NewBitGenerator<uint64_t>()));
-  resolvers_[page_id] = resolver.get();
-  GetResolverStrategyForPage(
-      page_id,
-      [this, page_id](std::unique_ptr<MergeStrategy> strategy) mutable {
-        if (resolvers_.find(page_id) != resolvers_.end()) {
-          resolvers_[page_id]->SetMergeStrategy(std::move(strategy));
-        }
-      });
-  return resolver;
-}
-
-void LedgerMergeManager::GetResolverStrategyForPage(
-    const storage::PageId& page_id,
-    fit::function<void(std::unique_ptr<MergeStrategy>)> strategy_callback) {
-  if (using_default_conflict_resolver_) {
-    strategy_callback(std::make_unique<LastOneWinsMergeStrategy>());
-  } else if (!current_conflict_resolver_factory_) {
-    // When no |ConflictResolverFactory| is connected, no conflict resolution
-    // happens for pages where conflict resolution has not been setup.
-    // Conflict resolution continues for pages that already have a policy.
-  } else {
-    PageId converted_page_id;
-    convert::ToArray(page_id, &converted_page_id.id);
-    current_conflict_resolver_factory_->GetPolicy(
-        converted_page_id,
-        [this, page_id, converted_page_id,
-         strategy_callback = std::move(strategy_callback)](MergePolicy policy) {
-          switch (policy) {
-            case MergePolicy::LAST_ONE_WINS:
-              strategy_callback(std::make_unique<LastOneWinsMergeStrategy>());
-              break;
-            case MergePolicy::AUTOMATIC_WITH_FALLBACK: {
-              ConflictResolverPtr conflict_resolver;
-              current_conflict_resolver_factory_->NewConflictResolver(
-                  converted_page_id, conflict_resolver.NewRequest());
-              std::unique_ptr<AutoMergeStrategy> auto_merge_strategy =
-                  std::make_unique<AutoMergeStrategy>(
-                      std::move(conflict_resolver));
-              auto_merge_strategy->SetOnError(
-                  [this, page_id]() { ResetStrategyForPage(page_id); });
-              strategy_callback(std::move(auto_merge_strategy));
-              break;
-            }
-            case MergePolicy::CUSTOM: {
-              PageId converted_page_id;
-              convert::ToArray(page_id, &converted_page_id.id);
-              ConflictResolverPtr conflict_resolver;
-              current_conflict_resolver_factory_->NewConflictResolver(
-                  converted_page_id, conflict_resolver.NewRequest());
-              std::unique_ptr<CustomMergeStrategy> custom_merge_strategy =
-                  std::make_unique<CustomMergeStrategy>(
-                      std::move(conflict_resolver));
-              custom_merge_strategy->SetOnError(
-                  [this, page_id]() { ResetStrategyForPage(page_id); });
-              strategy_callback(std::move(custom_merge_strategy));
-              break;
-            }
-          }
-        });
-  }
-}
-
-void LedgerMergeManager::ResetStrategyForPage(storage::PageId page_id) {
-  if (resolvers_.find(page_id) == resolvers_.end()) {
-    return;
-  }
-  resolvers_[page_id]->SetMergeStrategy(nullptr);
-  GetResolverStrategyForPage(
-      page_id,
-      [this, page_id](std::unique_ptr<MergeStrategy> strategy) mutable {
-        if (resolvers_.find(page_id) != resolvers_.end()) {
-          resolvers_[page_id]->SetMergeStrategy(std::move(strategy));
-        }
-      });
-}
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/ledger_merge_manager.h b/bin/ledger/app/merging/ledger_merge_manager.h
deleted file mode 100644
index dbddb45..0000000
--- a/bin/ledger/app/merging/ledger_merge_manager.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_MERGING_LEDGER_MERGE_MANAGER_H_
-#define PERIDOT_BIN_LEDGER_APP_MERGING_LEDGER_MERGE_MANAGER_H_
-
-#include <map>
-#include <memory>
-
-#include <lib/callback/auto_cleanable.h>
-#include <lib/fidl/cpp/interface_ptr.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/app/merging/merge_resolver.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-
-// Manages the strategies for handling merges and conflicts for a ledger as
-// managed by |LedgerManager|.
-// Holds a ConflictResolverFactory if the client provides one.
-// |LedgerMergeManager| must outlive all MergeResolver it provides.
-class LedgerMergeManager {
- public:
-  explicit LedgerMergeManager(Environment* environment);
-  ~LedgerMergeManager();
-
-  void AddFactory(fidl::InterfaceHandle<ConflictResolverFactory> factory);
-
-  std::unique_ptr<MergeResolver> GetMergeResolver(
-      storage::PageStorage* storage);
-
- private:
-  void ResetFactory();
-  void RemoveResolver(const storage::PageId& page_id);
-  void GetResolverStrategyForPage(
-      const storage::PageId& page_id,
-      fit::function<void(std::unique_ptr<MergeStrategy>)> strategy_callback);
-  void ResetStrategyForPage(storage::PageId page_id);
-
-  Environment* const environment_;
-
-  class ConflictResolverFactoryPtrContainer;
-
-  // Inactive, available conflict resolver factories
-  callback::AutoCleanableSet<ConflictResolverFactoryPtrContainer>
-      conflict_resolver_factories_;
-  // The ConflictResolverFactory that is currently in use
-  fidl::InterfacePtr<ConflictResolverFactory>
-      current_conflict_resolver_factory_;
-  // |true| if using the default last-one-wins conflict resolver factory
-  bool using_default_conflict_resolver_ = true;
-
-  std::map<storage::PageId, MergeResolver*> resolvers_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerMergeManager);
-};
-}  // namespace ledger
-#endif  // PERIDOT_BIN_LEDGER_APP_MERGING_LEDGER_MERGE_MANAGER_H_
diff --git a/bin/ledger/app/merging/merge_resolver.cc b/bin/ledger/app/merging/merge_resolver.cc
deleted file mode 100644
index b8d0268..0000000
--- a/bin/ledger/app/merging/merge_resolver.cc
+++ /dev/null
@@ -1,426 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/merging/merge_resolver.h"
-
-#include <algorithm>
-#include <memory>
-#include <queue>
-#include <set>
-#include <utility>
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/callback/trace_callback.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/app/merging/common_ancestor.h"
-#include "peridot/bin/ledger/app/merging/ledger_merge_manager.h"
-#include "peridot/bin/ledger/app/merging/merge_strategy.h"
-#include "peridot/bin/ledger/app/page_manager.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/bin/ledger/cobalt/cobalt.h"
-
-namespace ledger {
-
-// Enumerates merge candidates' indexes among current head commits.
-class MergeResolver::MergeCandidates {
- public:
-  MergeCandidates();
-
-  // Resets the MergeCandidates and sets the total number of head commits to
-  // |head_count|.
-  void ResetCandidates(size_t head_count);
-
-  // Returns whether MergeCandidates should be reset. A reset is necessary
-  // when the head commits have changed, i.e. when there is a successful merge
-  // or on a new commit.
-  bool NeedsReset() { return needs_reset_; }
-
-  // Returns the current pair on indexes of head commits to be merged.
-  std::pair<size_t, size_t> GetCurrentPair();
-
-  // Returns whether there is a merge candidate pair available.
-  bool HasCandidate();
-
-  // Returns true if there was a network error in one of the previous merge
-  // attempts. This does not include merges before |ResetCandidates| was
-  // called.
-  bool HadNetworkErrors() { return had_network_errors_; }
-
-  // Should be called after a successful merge.
-  void OnMergeSuccess();
-
-  // Should be called after an unsuccessful merge.
-  void OnMergeError(Status status);
-
-  // Should be called when new commits are available.
-  void OnNewCommits();
-
-  // Returns the number of head commits.
-  size_t head_count() { return head_count_; }
-
- private:
-  // Advances to the next available pair of merge candidates.
-  void PrepareNext();
-
-  size_t head_count_;
-  std::pair<size_t, size_t> current_pair_;
-  bool needs_reset_ = true;
-  bool had_network_errors_ = false;
-};
-
-MergeResolver::MergeCandidates::MergeCandidates() {}
-
-void MergeResolver::MergeCandidates::ResetCandidates(size_t head_count) {
-  head_count_ = head_count;
-  current_pair_ = {0, 1};
-  needs_reset_ = false;
-  had_network_errors_ = false;
-}
-
-bool MergeResolver::MergeCandidates::HasCandidate() {
-  return current_pair_.first != head_count_ - 1;
-}
-
-std::pair<size_t, size_t> MergeResolver::MergeCandidates::GetCurrentPair() {
-  return current_pair_;
-}
-
-void MergeResolver::MergeCandidates::OnMergeSuccess() { needs_reset_ = true; }
-
-void MergeResolver::MergeCandidates::OnMergeError(Status status) {
-  if (status == Status::NETWORK_ERROR) {
-    // The contents of the common ancestor are unavailable locally and it wasn't
-    // possible to retrieve them through the network: Ignore this pair of heads
-    // for now.
-    had_network_errors_ = true;
-    PrepareNext();
-  } else {
-    FXL_LOG(WARNING) << "Merging failed. Will try again later.";
-  }
-}
-
-void MergeResolver::MergeCandidates::OnNewCommits() { needs_reset_ = true; }
-
-void MergeResolver::MergeCandidates::PrepareNext() {
-  ++current_pair_.second;
-  if (current_pair_.second == head_count_) {
-    ++current_pair_.first;
-    current_pair_.second = current_pair_.first + 1;
-  }
-}
-
-MergeResolver::MergeResolver(fit::closure on_destroyed,
-                             Environment* environment,
-                             storage::PageStorage* storage,
-                             std::unique_ptr<backoff::Backoff> backoff)
-    : coroutine_service_(environment->coroutine_service()),
-      storage_(storage),
-      backoff_(std::move(backoff)),
-      merge_candidates_(std::make_unique<MergeCandidates>()),
-      on_destroyed_(std::move(on_destroyed)),
-      task_runner_(environment->dispatcher()) {
-  storage_->AddCommitWatcher(this);
-  PostCheckConflicts(DelayedStatus::DONT_DELAY);
-}
-
-MergeResolver::~MergeResolver() {
-  storage_->RemoveCommitWatcher(this);
-  on_destroyed_();
-}
-
-void MergeResolver::set_on_empty(fit::closure on_empty_callback) {
-  on_empty_callback_ = std::move(on_empty_callback);
-}
-
-bool MergeResolver::IsEmpty() { return !merge_in_progress_; }
-
-bool MergeResolver::HasUnfinishedMerges() {
-  return merge_in_progress_ || check_conflicts_in_progress_ ||
-         check_conflicts_task_count_ != 0 || in_delay_ ||
-         merge_candidates_->HadNetworkErrors();
-}
-
-void MergeResolver::SetMergeStrategy(std::unique_ptr<MergeStrategy> strategy) {
-  if (merge_in_progress_) {
-    FXL_DCHECK(strategy_);
-    // The new strategy can be the empty strategy (nullptr), so we need a
-    // separate boolean to know if we have a pending strategy change to make.
-    has_next_strategy_ = true;
-    next_strategy_ = std::move(strategy);
-    strategy_->Cancel();
-    return;
-  }
-  strategy_.swap(strategy);
-  if (strategy_) {
-    PostCheckConflicts(DelayedStatus::DONT_DELAY);
-  }
-}
-
-void MergeResolver::SetPageManager(PageManager* page_manager) {
-  FXL_DCHECK(page_manager_ == nullptr);
-  page_manager_ = page_manager;
-}
-
-void MergeResolver::RegisterNoConflictCallback(
-    fit::function<void(ConflictResolutionWaitStatus)> callback) {
-  no_conflict_callbacks_.push_back(std::move(callback));
-}
-
-void MergeResolver::OnNewCommits(
-    const std::vector<std::unique_ptr<const storage::Commit>>& /*commits*/,
-    storage::ChangeSource source) {
-  merge_candidates_->OnNewCommits();
-  PostCheckConflicts(source == storage::ChangeSource::LOCAL
-                         ? DelayedStatus::DONT_DELAY
-                         // We delay remote commits.
-                         : DelayedStatus::MAY_DELAY);
-}
-
-void MergeResolver::PostCheckConflicts(DelayedStatus delayed_status) {
-  check_conflicts_task_count_++;
-  task_runner_.PostTask([this, delayed_status] {
-    check_conflicts_task_count_--;
-    CheckConflicts(delayed_status);
-  });
-}
-
-void MergeResolver::CheckConflicts(DelayedStatus delayed_status) {
-  if (!strategy_ || merge_in_progress_ || check_conflicts_in_progress_ ||
-      in_delay_) {
-    // No strategy is set, or a merge is already in progress, or we are already
-    // checking for conflicts, or we are delaying merges. Let's bail out early.
-    return;
-  }
-  check_conflicts_in_progress_ = true;
-  storage_->GetHeadCommitIds(task_runner_.MakeScoped(
-      [this, delayed_status](storage::Status s,
-                             std::vector<storage::CommitId> heads) {
-        check_conflicts_in_progress_ = false;
-
-        if (merge_candidates_->NeedsReset()) {
-          merge_candidates_->ResetCandidates(heads.size());
-        }
-        FXL_DCHECK(merge_candidates_->head_count() == heads.size())
-            << merge_candidates_->head_count() << " != " << heads.size();
-
-        if (s != storage::Status::OK || heads.size() == 1 ||
-            !(merge_candidates_->HasCandidate())) {
-          // An error occurred, or there is no conflict we can resolve. In
-          // either case, return early.
-          if (s != storage::Status::OK) {
-            FXL_LOG(ERROR) << "Failed to get head commits with status " << s;
-          } else if (heads.size() == 1) {
-            for (auto& callback : no_conflict_callbacks_) {
-              callback(has_merged_
-                           ? ConflictResolutionWaitStatus::CONFLICTS_RESOLVED
-                           : ConflictResolutionWaitStatus::NO_CONFLICTS);
-            }
-            no_conflict_callbacks_.clear();
-            has_merged_ = false;
-          }
-          if (on_empty_callback_) {
-            on_empty_callback_();
-          }
-          return;
-        }
-        if (!strategy_) {
-          if (on_empty_callback_) {
-            on_empty_callback_();
-          }
-          return;
-        }
-        merge_in_progress_ = true;
-        std::pair<size_t, size_t> head_indexes =
-            merge_candidates_->GetCurrentPair();
-        ResolveConflicts(delayed_status, std::move(heads[head_indexes.first]),
-                         std::move(heads[head_indexes.second]));
-      }));
-}
-
-void MergeResolver::ResolveConflicts(DelayedStatus delayed_status,
-                                     storage::CommitId head1,
-                                     storage::CommitId head2) {
-  auto cleanup = fit::defer(task_runner_.MakeScoped([this, delayed_status] {
-    // |merge_in_progress_| must be reset before calling
-    // |on_empty_callback_|.
-    merge_in_progress_ = false;
-
-    if (has_next_strategy_) {
-      strategy_ = std::move(next_strategy_);
-      next_strategy_.reset();
-      has_next_strategy_ = false;
-    }
-    PostCheckConflicts(delayed_status);
-    // Call on_empty_callback_ at the very end as it might delete the
-    // resolver.
-    if (on_empty_callback_) {
-      on_empty_callback_();
-    }
-  }));
-  uint64_t id = TRACE_NONCE();
-  TRACE_ASYNC_BEGIN("ledger", "merge", id);
-  auto tracing = fit::defer([id] { TRACE_ASYNC_END("ledger", "merge", id); });
-
-  auto waiter = fxl::MakeRefCounted<callback::Waiter<
-      storage::Status, std::unique_ptr<const storage::Commit>>>(
-      storage::Status::OK);
-  storage_->GetCommit(head1, waiter->NewCallback());
-  storage_->GetCommit(head2, waiter->NewCallback());
-  waiter->Finalize(TRACE_CALLBACK(
-      task_runner_.MakeScoped(
-          [this, delayed_status, cleanup = std::move(cleanup),
-           tracing = std::move(tracing)](
-              storage::Status status,
-              std::vector<std::unique_ptr<const storage::Commit>>
-                  commits) mutable {
-            if (status != storage::Status::OK) {
-              FXL_LOG(ERROR)
-                  << "Failed to retrieve head commits. Status: " << status;
-              return;
-            }
-            FXL_DCHECK(commits.size() == 2);
-            FXL_DCHECK(commits[0]->GetTimestamp() <=
-                       commits[1]->GetTimestamp());
-
-            if (commits[0]->GetParentIds().size() == 2 &&
-                commits[1]->GetParentIds().size() == 2) {
-              if (delayed_status == DelayedStatus::MAY_DELAY) {
-                // If trying to merge 2 merge commits, add some delay with
-                // exponential backoff.
-                auto delay_callback = [this] {
-                  in_delay_ = false;
-                  CheckConflicts(DelayedStatus::DONT_DELAY);
-                };
-                in_delay_ = true;
-                task_runner_.PostDelayedTask(
-                    TRACE_CALLBACK(std::move(delay_callback), "ledger",
-                                   "merge_delay"),
-                    backoff_->GetNext());
-                cleanup.cancel();
-                merge_in_progress_ = false;
-                // We don't want to continue merging if nobody is interested
-                // (all clients disconnected).
-                if (on_empty_callback_) {
-                  on_empty_callback_();
-                }
-                return;
-              }
-              // If delayed_status is not initial, report the merge.
-              ReportEvent(CobaltEvent::MERGED_COMMITS_MERGED);
-            } else {
-              // No longer merging 2 merge commits, reinitialize the exponential
-              // backoff.
-              backoff_->Reset();
-            }
-
-            // Check if the 2 parents have the same content.
-            if (commits[0]->GetRootIdentifier() ==
-                commits[1]->GetRootIdentifier()) {
-              // In that case, the result must be a commit with the same
-              // content.
-              MergeCommitsWithSameContent(
-                  std::move(commits[0]), std::move(commits[1]),
-                  [cleanup = std::move(cleanup), tracing = std::move(tracing)] {
-                    // Report the merge.
-                    ReportEvent(CobaltEvent::COMMITS_MERGED);
-                  });
-              return;
-            }
-
-            // If the strategy has been changed, bail early.
-            if (has_next_strategy_) {
-              return;
-            }
-
-            // Merge the first two commits using the most recent one as the
-            // base.
-            FindCommonAncestorAndMerge(
-                std::move(commits[0]), std::move(commits[1]),
-                [cleanup = std::move(cleanup), tracing = std::move(tracing)] {
-                  ReportEvent(CobaltEvent::COMMITS_MERGED);
-                });
-          }),
-      "ledger", "merge_get_commit_finalize"));
-}
-
-void MergeResolver::MergeCommitsWithSameContent(
-    std::unique_ptr<const storage::Commit> head1,
-    std::unique_ptr<const storage::Commit> head2,
-    fit::closure on_successful_merge) {
-  storage_->StartMergeCommit(
-      head1->GetId(), head2->GetId(),
-      TRACE_CALLBACK(
-          task_runner_.MakeScoped(
-              [this, on_successful_merge = std::move(on_successful_merge)](
-                  storage::Status status,
-                  std::unique_ptr<storage::Journal> journal) mutable {
-                if (status != storage::Status::OK) {
-                  FXL_LOG(ERROR)
-                      << "Unable to start merge commit for identical commits.";
-                  return;
-                }
-                has_merged_ = true;
-                storage_->CommitJournal(
-                    std::move(journal),
-                    [on_successful_merge = std::move(on_successful_merge)](
-                        storage::Status status,
-                        std::unique_ptr<const storage::Commit>) {
-                      if (status != storage::Status::OK) {
-                        FXL_LOG(ERROR) << "Unable to merge identical commits.";
-                        return;
-                      }
-                      on_successful_merge();
-                    });
-              }),
-          "ledger", "merge_same_commit_journal"));
-}
-
-void MergeResolver::FindCommonAncestorAndMerge(
-    std::unique_ptr<const storage::Commit> head1,
-    std::unique_ptr<const storage::Commit> head2,
-    fit::closure on_successful_merge) {
-  FindCommonAncestor(
-      coroutine_service_, storage_, head1->Clone(), head2->Clone(),
-      TRACE_CALLBACK(
-          task_runner_.MakeScoped(
-              [this, head1 = std::move(head1), head2 = std::move(head2),
-               on_successful_merge = std::move(on_successful_merge)](
-                  Status status, std::unique_ptr<const storage::Commit>
-                                     common_ancestor) mutable {
-                // If the strategy has been changed, bail early.
-                if (has_next_strategy_) {
-                  return;
-                }
-
-                if (status != Status::OK) {
-                  FXL_LOG(ERROR)
-                      << "Failed to find common ancestor of head commits.";
-                  return;
-                }
-                auto strategy_callback =
-                    [this, on_successful_merge =
-                               std::move(on_successful_merge)](Status status) {
-                      if (status != Status::OK) {
-                        merge_candidates_->OnMergeError(status);
-                        return;
-                      }
-                      merge_candidates_->OnMergeSuccess();
-                      on_successful_merge();
-                    };
-                has_merged_ = true;
-                strategy_->Merge(
-                    storage_, page_manager_, std::move(head1), std::move(head2),
-                    std::move(common_ancestor),
-                    TRACE_CALLBACK(std::move(strategy_callback), "ledger",
-                                   "merge_strategy_merge"));
-              }),
-          "ledger", "merge_find_common_ancestor"));
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/merge_resolver.h b/bin/ledger/app/merging/merge_resolver.h
deleted file mode 100644
index ac01c3c..0000000
--- a/bin/ledger/app/merging/merge_resolver.h
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_MERGING_MERGE_RESOLVER_H_
-#define PERIDOT_BIN_LEDGER_APP_MERGING_MERGE_RESOLVER_H_
-
-#include <vector>
-
-#include <lib/backoff/backoff.h>
-#include <lib/callback/scoped_task_runner.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-class PageManager;
-class MergeStrategy;
-
-// MergeResolver watches a page and resolves conflicts as they appear using the
-// provided merge strategy.
-class MergeResolver : public storage::CommitWatcher {
- public:
-  MergeResolver(fit::closure on_destroyed, Environment* environment,
-                storage::PageStorage* storage,
-                std::unique_ptr<backoff::Backoff> backoff);
-  ~MergeResolver() override;
-
-  void set_on_empty(fit::closure on_empty_callback);
-
-  // Returns true if no merge is currently in progress. Note that returning
-  // true, does not mean that there are no pending conflicts.
-  bool IsEmpty();
-
-  // Returns true if a merge is pending or in progress. A merge is pending when
-  // a merge is currently processed (|IsEmpty| returns false), but also when
-  // checking for conflict, or when in backoff delay between merges.
-  bool HasUnfinishedMerges();
-
-  // Changes the current merge strategy. Any pending merge will be cancelled.
-  void SetMergeStrategy(std::unique_ptr<MergeStrategy> strategy);
-
-  void SetPageManager(PageManager* page_manager);
-
-  // Adds an action to perform when all the pending conflicts are resolved
-  // (once).
-  void RegisterNoConflictCallback(
-      fit::function<void(ConflictResolutionWaitStatus)> callback);
-
- private:
-  class MergeCandidates;
-
-  // DelayedStatus allows us to avoid merge storms (several devices battling
-  // to merge branches but not agreeing). We use the following algorithm:
-  // - Old (local or originally remote) changes are always merged right away.
-  // Local changes do not pose any risk risk of storm, as you cannot storm with
-  // yourself.
-  // - When a remote change arrives, that is a merge of two merges, then we are
-  // at risk of a merge storm. In that case, we delay.
-  // - If we receive any new commit while we are delaying, these are not merged
-  // right away; they are only merged after the delay.
-  // - Once the delay is finished, we merge everything we know. Upload will not
-  // happen until we finish merging all branches, so we don't risk amplifying a
-  // storm while merging.
-  // - If, after that, we still need to do a merge of a merge from remote
-  // commits, then we delay again, but more (exponential backoff).
-  // - We reset this backoff delay to its initial value once we see a non
-  // merge-of-a-merge commit.
-  enum class DelayedStatus {
-    // Whatever the commits, we won't delay merging. Used for local commits.
-    DONT_DELAY,
-    // May delay
-    MAY_DELAY,
-  };
-
-  // storage::CommitWatcher:
-  void OnNewCommits(
-      const std::vector<std::unique_ptr<const storage::Commit>>& commits,
-      storage::ChangeSource source) override;
-
-  void PostCheckConflicts(DelayedStatus delayed_status);
-  void CheckConflicts(DelayedStatus delayed_status);
-  void ResolveConflicts(DelayedStatus delayed_status, storage::CommitId head1,
-                        storage::CommitId head2);
-  void MergeCommitsWithSameContent(std::unique_ptr<const storage::Commit> head1,
-                                   std::unique_ptr<const storage::Commit> head2,
-                                   fit::closure on_successful_merge);
-  void FindCommonAncestorAndMerge(std::unique_ptr<const storage::Commit> head1,
-                                  std::unique_ptr<const storage::Commit> head2,
-                                  fit::closure on_successful_merge);
-
-  coroutine::CoroutineService* coroutine_service_;
-  storage::PageStorage* const storage_;
-  std::unique_ptr<backoff::Backoff> backoff_;
-  PageManager* page_manager_ = nullptr;
-  std::unique_ptr<MergeStrategy> strategy_;
-  std::unique_ptr<MergeStrategy> next_strategy_;
-  bool has_next_strategy_ = false;
-  // TODO(LE-384): Convert the fields below into a single enum to track the
-  // state of this class.
-  bool merge_in_progress_ = false;
-  // True between the time we commit a merge and we check if there are more
-  // conflicts. It is used to report to conflict callbacks (see
-  // |no_conflict_callbacks_|) whether a conflict has been merged while waiting.
-  bool has_merged_ = false;
-  // Counts the number of currently pending |CheckConflict| tasks posted on the
-  // run loop. We use a counter instead of a single flag as multiple
-  // |CheckConflict| tasks could be pending at the same time.
-  int check_conflicts_task_count_ = 0;
-  bool check_conflicts_in_progress_ = false;
-  bool in_delay_ = false;
-  std::unique_ptr<MergeCandidates> merge_candidates_;
-  fit::closure on_empty_callback_;
-  fit::closure on_destroyed_;
-  std::vector<fit::function<void(ConflictResolutionWaitStatus)>>
-      no_conflict_callbacks_;
-
-  // ScopedTaskRunner must be the last member of the class.
-  callback::ScopedTaskRunner task_runner_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(MergeResolver);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_MERGING_MERGE_RESOLVER_H_
diff --git a/bin/ledger/app/merging/merge_resolver_unittest.cc b/bin/ledger/app/merging/merge_resolver_unittest.cc
deleted file mode 100644
index a3ff9fa..0000000
--- a/bin/ledger/app/merging/merge_resolver_unittest.cc
+++ /dev/null
@@ -1,811 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/merging/merge_resolver.h"
-
-#include <string>
-#include <utility>
-
-#include <lib/async/cpp/task.h>
-#include <lib/backoff/testing/test_backoff.h>
-#include <lib/callback/cancellable_helper.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/macros.h>
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/merging/last_one_wins_merge_strategy.h"
-#include "peridot/bin/ledger/app/merging/test_utils.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/encryption/primitives/hash.h"
-#include "peridot/bin/ledger/storage/fake/fake_page_storage.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-namespace {
-
-using ::testing::UnorderedElementsAre;
-
-class FakePageStorageImpl : public storage::PageStorageEmptyImpl {
- public:
-  FakePageStorageImpl(std::unique_ptr<storage::PageStorage> page_storage)
-      : storage_(std::move(page_storage)) {}
-
-  void MarkCommitContentsUnavailable(storage::CommitIdView commit_id) {
-    removed_commit_ids_.insert(commit_id.ToString());
-  }
-
-  void GetHeadCommitIds(
-      fit::function<void(storage::Status, std::vector<storage::CommitId>)>
-          callback) override {
-    storage_->GetHeadCommitIds(std::move(callback));
-  }
-
-  void GetCommit(storage::CommitIdView commit_id,
-                 fit::function<void(storage::Status,
-                                    std::unique_ptr<const storage::Commit>)>
-                     callback) override {
-    storage_->GetCommit(commit_id, std::move(callback));
-  }
-
-  storage::Status AddCommitWatcher(storage::CommitWatcher* watcher) override {
-    return storage_->AddCommitWatcher(watcher);
-  }
-
-  storage::Status RemoveCommitWatcher(
-      storage::CommitWatcher* watcher) override {
-    return storage_->RemoveCommitWatcher(watcher);
-  }
-
-  void GetObject(storage::ObjectIdentifier object_identifier, Location location,
-                 fit::function<void(storage::Status,
-                                    std::unique_ptr<const storage::Object>)>
-                     callback) override {
-    storage_->GetObject(std::move(object_identifier), location,
-                        std::move(callback));
-  }
-
-  void StartCommit(
-      const storage::CommitId& commit_id, storage::JournalType journal_type,
-      fit::function<void(storage::Status, std::unique_ptr<storage::Journal>)>
-          callback) override {
-    storage_->StartCommit(commit_id, journal_type, std::move(callback));
-  }
-
-  void StartMergeCommit(
-      const storage::CommitId& left, const storage::CommitId& right,
-      fit::function<void(storage::Status, std::unique_ptr<storage::Journal>)>
-          callback) override {
-    storage_->StartMergeCommit(left, right, std::move(callback));
-  }
-
-  void CommitJournal(std::unique_ptr<storage::Journal> journal,
-                     fit::function<void(storage::Status,
-                                        std::unique_ptr<const storage::Commit>)>
-                         callback) override {
-    storage_->CommitJournal(std::move(journal), std::move(callback));
-  }
-
-  void RollbackJournal(std::unique_ptr<storage::Journal> journal,
-                       fit::function<void(storage::Status)> callback) override {
-    storage_->RollbackJournal(std::move(journal), std::move(callback));
-  }
-
-  void AddObjectFromLocal(
-      storage::ObjectType object_type,
-      std::unique_ptr<storage::DataSource> data_source,
-      fit::function<void(storage::Status, storage::ObjectIdentifier)> callback)
-      override {
-    storage_->AddObjectFromLocal(object_type, std::move(data_source),
-                                 std::move(callback));
-  }
-
-  void GetCommitContents(
-      const storage::Commit& commit, std::string min_key,
-      fit::function<bool(storage::Entry)> on_next,
-      fit::function<void(storage::Status)> on_done) override {
-    storage_->GetCommitContents(commit, std::move(min_key), std::move(on_next),
-                                std::move(on_done));
-  }
-
-  void GetCommitContentsDiff(
-      const storage::Commit& base_commit, const storage::Commit& other_commit,
-      std::string min_key,
-      fit::function<bool(storage::EntryChange)> on_next_diff,
-      fit::function<void(storage::Status)> on_done) override {
-    if (removed_commit_ids_.find(base_commit.GetId()) !=
-            removed_commit_ids_.end() ||
-        removed_commit_ids_.find(other_commit.GetId()) !=
-            removed_commit_ids_.end()) {
-      on_done(storage::Status::NOT_CONNECTED_ERROR);
-      return;
-    }
-    storage_->GetCommitContentsDiff(base_commit, other_commit,
-                                    std::move(min_key), std::move(on_next_diff),
-                                    std::move(on_done));
-  }
-
- private:
-  std::set<storage::CommitId> removed_commit_ids_;
-
-  std::unique_ptr<storage::PageStorage> storage_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakePageStorageImpl);
-};
-
-class RecordingTestStrategy : public MergeStrategy {
- public:
-  RecordingTestStrategy() {}
-  ~RecordingTestStrategy() override {}
-  void SetOnError(fit::closure on_error) override {
-    this->on_error = std::move(on_error);
-  }
-
-  void SetOnMerge(fit::closure on_merge) { on_merge_ = std::move(on_merge); }
-
-  void Merge(storage::PageStorage* /*storage*/, PageManager* /*page_manager*/,
-             std::unique_ptr<const storage::Commit> /*head_1*/,
-             std::unique_ptr<const storage::Commit> /*head_2*/,
-             std::unique_ptr<const storage::Commit> /*ancestor*/,
-             fit::function<void(Status)> callback) override {
-    this->callback = std::move(callback);
-    merge_calls++;
-    if (on_merge_) {
-      on_merge_();
-    }
-  }
-
-  void Cancel() override { cancel_calls++; }
-
-  fit::closure on_error;
-
-  fit::function<void(Status)> callback;
-  uint32_t merge_calls = 0;
-  uint32_t cancel_calls = 0;
-
- private:
-  fit::closure on_merge_;
-};
-
-class MergeResolverTest : public TestWithPageStorage {
- public:
-  MergeResolverTest() {}
-  ~MergeResolverTest() override {}
-
- protected:
-  storage::PageStorage* page_storage() override { return page_storage_.get(); }
-
-  void SetUp() override {
-    TestWithPageStorage::SetUp();
-    std::unique_ptr<storage::PageStorage> storage;
-    ASSERT_TRUE(CreatePageStorage(&storage));
-    page_storage_ = std::make_unique<FakePageStorageImpl>(std::move(storage));
-  }
-
-  storage::CommitId CreateCommit(
-      storage::CommitIdView parent_id,
-      fit::function<void(storage::Journal*)> contents) {
-    return CreateCommit(page_storage_.get(), parent_id, std::move(contents));
-  }
-
-  storage::CommitId CreateCommit(
-      storage::PageStorage* storage, storage::CommitIdView parent_id,
-      fit::function<void(storage::Journal*)> contents) {
-    bool called;
-    storage::Status status;
-    std::unique_ptr<storage::Journal> journal;
-    storage->StartCommit(
-        parent_id.ToString(), storage::JournalType::IMPLICIT,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-
-    contents(journal.get());
-    std::unique_ptr<const storage::Commit> commit;
-    storage->CommitJournal(
-        std::move(journal),
-        callback::Capture(callback::SetWhenCalled(&called), &status, &commit));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-    return commit->GetId();
-  }
-
-  storage::CommitId CreateMergeCommit(
-      storage::CommitIdView parent_id1, storage::CommitIdView parent_id2,
-      fit::function<void(storage::Journal*)> contents) {
-    return CreateMergeCommit(page_storage_.get(), parent_id1, parent_id2,
-                             std::move(contents));
-  }
-
-  storage::CommitId CreateMergeCommit(
-      storage::PageStorage* storage, storage::CommitIdView parent_id1,
-      storage::CommitIdView parent_id2,
-      fit::function<void(storage::Journal*)> contents) {
-    bool called;
-    storage::Status status;
-    std::unique_ptr<storage::Journal> journal;
-    storage->StartMergeCommit(
-        parent_id1.ToString(), parent_id2.ToString(),
-        callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-    contents(journal.get());
-    storage::Status actual_status;
-    std::unique_ptr<const storage::Commit> actual_commit;
-    storage->CommitJournal(std::move(journal),
-                           callback::Capture(callback::SetWhenCalled(&called),
-                                             &actual_status, &actual_commit));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, actual_status);
-    return actual_commit->GetId();
-  }
-
-  std::vector<storage::Entry> GetCommitContents(const storage::Commit& commit) {
-    storage::Status status;
-    std::vector<storage::Entry> result;
-    auto on_next = [&result](storage::Entry e) {
-      result.push_back(e);
-      return true;
-    };
-    bool called;
-    page_storage_->GetCommitContents(
-        commit, "", std::move(on_next),
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-
-    EXPECT_EQ(storage::Status::OK, status);
-    return result;
-  }
-
-  std::unique_ptr<FakePageStorageImpl> page_storage_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(MergeResolverTest);
-};
-
-TEST_F(MergeResolverTest, Empty) {
-  // Set up conflict
-  CreateCommit(storage::kFirstPageCommitId, AddKeyValueToJournal("foo", "bar"));
-  CreateCommit(storage::kFirstPageCommitId, AddKeyValueToJournal("foo", "baz"));
-  std::unique_ptr<LastOneWinsMergeStrategy> strategy =
-      std::make_unique<LastOneWinsMergeStrategy>();
-  MergeResolver resolver([] {}, &environment_, page_storage_.get(),
-                         std::make_unique<backoff::TestBackoff>());
-  resolver.SetMergeStrategy(std::move(strategy));
-  resolver.set_on_empty(QuitLoopClosure());
-
-  bool called;
-  storage::Status status;
-  std::vector<storage::CommitId> ids;
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(2u, ids.size());
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(resolver.IsEmpty());
-
-  ids.clear();
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(1u, ids.size());
-}
-
-class CapturingMergeStrategy : public MergeStrategy {
- public:
-  CapturingMergeStrategy() {}
-  ~CapturingMergeStrategy() override {}
-
-  void SetOnError(fit::function<void()> /*on_error*/) override {}
-
-  void Merge(storage::PageStorage* /*storage*/, PageManager* /*page_manager*/,
-             std::unique_ptr<const storage::Commit> merge_head_1,
-             std::unique_ptr<const storage::Commit> merge_head_2,
-             std::unique_ptr<const storage::Commit> merge_ancestor,
-             fit::function<void(Status)> merge_callback) override {
-    head_1 = std::move(merge_head_1);
-    head_2 = std::move(merge_head_2);
-    ancestor = std::move(merge_ancestor);
-    callback = std::move(merge_callback);
-  }
-
-  void Cancel() override{};
-
-  std::unique_ptr<const storage::Commit> head_1;
-  std::unique_ptr<const storage::Commit> head_2;
-  std::unique_ptr<const storage::Commit> ancestor;
-  fit::function<void(Status)> callback;
-
- private:
-  FXL_DISALLOW_ASSIGN(CapturingMergeStrategy);
-};
-
-TEST_F(MergeResolverTest, CommonAncestor) {
-  // Add commits forming the following history graph:
-  // (root) -> (1) -> (2) ->  (3)
-  //                      \
-  //                       -> (4) -> (5)
-  storage::CommitId commit_1 = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key1", "val1.0"));
-  storage::CommitId commit_2 =
-      CreateCommit(commit_1, AddKeyValueToJournal("key2", "val2.0"));
-  storage::CommitId commit_3 =
-      CreateCommit(commit_2, AddKeyValueToJournal("key3", "val3.0"));
-  storage::CommitId commit_4 =
-      CreateCommit(commit_2, DeleteKeyFromJournal("key1"));
-  storage::CommitId commit_5 =
-      CreateCommit(commit_4, AddKeyValueToJournal("key2", "val2.1"));
-  RunLoopUntilIdle();
-
-  // Set a merge strategy to capture the requested merge.
-  MergeResolver resolver([] {}, &environment_, page_storage_.get(),
-                         std::make_unique<backoff::TestBackoff>());
-  std::unique_ptr<CapturingMergeStrategy> strategy =
-      std::make_unique<CapturingMergeStrategy>();
-  auto strategy_ptr = strategy.get();
-  resolver.SetMergeStrategy(std::move(strategy));
-  RunLoopUntilIdle();
-
-  // Verify that the strategy is asked to merge commits 5 and 3, with 2 as the
-  // common ancestor.
-  EXPECT_EQ(commit_3, strategy_ptr->head_1->GetId());
-  EXPECT_EQ(commit_5, strategy_ptr->head_2->GetId());
-  EXPECT_EQ(commit_2, strategy_ptr->ancestor->GetId());
-
-  // Resolve the conflict.
-  CreateMergeCommit(strategy_ptr->head_1->GetId(),
-                    strategy_ptr->head_2->GetId(),
-                    AddKeyValueToJournal("key_foo", "abc"));
-  strategy_ptr->callback(Status::OK);
-  strategy_ptr->callback = nullptr;
-  RunLoopUntilIdle();
-  EXPECT_TRUE(resolver.IsEmpty());
-}
-
-TEST_F(MergeResolverTest, LastOneWins) {
-  // Set up conflict
-  storage::CommitId commit_1 = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key1", "val1.0"));
-
-  storage::CommitId commit_2 =
-      CreateCommit(commit_1, AddKeyValueToJournal("key2", "val2.0"));
-
-  storage::CommitId commit_3 =
-      CreateCommit(commit_2, AddKeyValueToJournal("key3", "val3.0"));
-
-  storage::CommitId commit_4 =
-      CreateCommit(commit_2, DeleteKeyFromJournal("key1"));
-
-  storage::CommitId commit_5 =
-      CreateCommit(commit_4, AddKeyValueToJournal("key2", "val2.1"));
-
-  bool called;
-  storage::Status status;
-  std::vector<storage::CommitId> ids;
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(2u, ids.size());
-  EXPECT_NE(ids.end(), std::find(ids.begin(), ids.end(), commit_3));
-  EXPECT_NE(ids.end(), std::find(ids.begin(), ids.end(), commit_5));
-
-  std::unique_ptr<LastOneWinsMergeStrategy> strategy =
-      std::make_unique<LastOneWinsMergeStrategy>();
-  MergeResolver resolver([] {}, &environment_, page_storage_.get(),
-                         std::make_unique<backoff::TestBackoff>());
-  resolver.SetMergeStrategy(std::move(strategy));
-  resolver.set_on_empty(callback::SetWhenCalled(&called));
-
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_TRUE(resolver.IsEmpty());
-
-  ids.clear();
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(1u, ids.size());
-
-  std::unique_ptr<const storage::Commit> commit;
-  page_storage_->GetCommit(
-      ids[0],
-      ::callback::Capture(callback::SetWhenCalled(&called), &status, &commit));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  ASSERT_TRUE(commit);
-
-  std::vector<storage::Entry> content_vector = GetCommitContents(*commit);
-  // Entries are ordered by keys
-  ASSERT_EQ(2u, content_vector.size());
-  EXPECT_EQ("key2", content_vector[0].key);
-  std::string value;
-  EXPECT_TRUE(GetValue(content_vector[0].object_identifier, &value));
-  EXPECT_EQ("val2.1", value);
-  EXPECT_EQ("key3", content_vector[1].key);
-  EXPECT_TRUE(GetValue(content_vector[1].object_identifier, &value));
-  EXPECT_EQ("val3.0", value);
-}
-
-TEST_F(MergeResolverTest, LastOneWinsDiffNotAvailable) {
-  // Set up conflict
-  storage::CommitId commit_1 = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key1", "val1.0"));
-
-  storage::CommitId commit_2 =
-      CreateCommit(commit_1, AddKeyValueToJournal("key2", "val2.0"));
-
-  storage::CommitId commit_3 =
-      CreateCommit(commit_2, AddKeyValueToJournal("key3", "val3.0"));
-
-  storage::CommitId commit_4 =
-      CreateCommit(commit_2, DeleteKeyFromJournal("key1"));
-
-  storage::CommitId commit_5 =
-      CreateCommit(commit_4, AddKeyValueToJournal("key2", "val2.1"));
-
-  bool called;
-  storage::Status status;
-  std::vector<storage::CommitId> ids;
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_THAT(ids, UnorderedElementsAre(commit_3, commit_5));
-
-  page_storage_->MarkCommitContentsUnavailable(commit_2);
-
-  std::unique_ptr<LastOneWinsMergeStrategy> strategy =
-      std::make_unique<LastOneWinsMergeStrategy>();
-  MergeResolver resolver([] {}, &environment_, page_storage_.get(),
-                         std::make_unique<backoff::TestBackoff>());
-  resolver.SetMergeStrategy(std::move(strategy));
-  resolver.set_on_empty(callback::SetWhenCalled(&called));
-
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_TRUE(resolver.IsEmpty());
-  ids.clear();
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(2u, ids.size());
-}
-
-TEST_F(MergeResolverTest, None) {
-  // Set up conflict
-  storage::CommitId commit_1 = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key1", "val1.0"));
-
-  storage::CommitId commit_2 =
-      CreateCommit(commit_1, AddKeyValueToJournal("key2", "val2.0"));
-
-  storage::CommitId commit_3 =
-      CreateCommit(commit_2, AddKeyValueToJournal("key3", "val3.0"));
-
-  storage::CommitId commit_4 =
-      CreateCommit(commit_2, DeleteKeyFromJournal("key1"));
-
-  storage::CommitId commit_5 =
-      CreateCommit(commit_4, AddKeyValueToJournal("key2", "val2.1"));
-
-  bool called;
-  storage::Status status;
-  std::vector<storage::CommitId> ids;
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(2u, ids.size());
-  EXPECT_NE(ids.end(), std::find(ids.begin(), ids.end(), commit_3));
-  EXPECT_NE(ids.end(), std::find(ids.begin(), ids.end(), commit_5));
-
-  MergeResolver resolver([] {}, &environment_, page_storage_.get(),
-                         std::make_unique<backoff::TestBackoff>());
-  resolver.set_on_empty(QuitLoopClosure());
-  RunLoopUntilIdle();
-  EXPECT_TRUE(resolver.IsEmpty());
-  ids.clear();
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(2u, ids.size());
-}
-
-TEST_F(MergeResolverTest, UpdateMidResolution) {
-  // Set up conflict
-  storage::CommitId commit_1 = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key1", "val1.0"));
-
-  storage::CommitId commit_2 =
-      CreateCommit(commit_1, AddKeyValueToJournal("key2", "val2.0"));
-
-  storage::CommitId commit_3 =
-      CreateCommit(commit_1, AddKeyValueToJournal("key3", "val3.0"));
-
-  bool called;
-  storage::Status status;
-  std::vector<storage::CommitId> ids;
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(2u, ids.size());
-  EXPECT_NE(ids.end(), std::find(ids.begin(), ids.end(), commit_2));
-  EXPECT_NE(ids.end(), std::find(ids.begin(), ids.end(), commit_3));
-
-  MergeResolver resolver([] {}, &environment_, page_storage_.get(),
-                         std::make_unique<backoff::TestBackoff>());
-  resolver.set_on_empty(callback::SetWhenCalled(&called));
-  resolver.SetMergeStrategy(std::make_unique<LastOneWinsMergeStrategy>());
-  async::PostTask(dispatcher(), [&resolver] {
-    resolver.SetMergeStrategy(std::make_unique<LastOneWinsMergeStrategy>());
-  });
-
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-
-  EXPECT_TRUE(resolver.IsEmpty());
-  ids.clear();
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(1u, ids.size());
-}
-
-// Merge of merges backoff is only triggered when commits are coming from sync.
-// To test this, we need to create conflicts and make it as if they are not
-// created locally. This is done by preventing commit notifications for new
-// commits, then issuing manually a commit notification "from sync". As this
-// implies using a fake PageStorage, we don't test the resolution itself, only
-// that backoff is triggered correctly.
-TEST_F(MergeResolverTest, WaitOnMergeOfMerges) {
-  storage::fake::FakePageStorage page_storage(&environment_, "page_id");
-
-  bool on_empty_called;
-  auto backoff = std::make_unique<backoff::TestBackoff>();
-  auto backoff_ptr = backoff.get();
-  MergeResolver resolver([] {}, &environment_, &page_storage,
-                         std::move(backoff));
-  resolver.set_on_empty(callback::SetWhenCalled(&on_empty_called));
-  auto strategy = std::make_unique<RecordingTestStrategy>();
-  strategy->SetOnMerge(QuitLoopClosure());
-  resolver.SetMergeStrategy(std::move(strategy));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(on_empty_called);
-
-  page_storage.SetDropCommitNotifications(true);
-
-  // Set up conflict
-  storage::CommitId commit_0 = CreateCommit(
-      &page_storage, storage::kFirstPageCommitId, [](storage::Journal*) {});
-
-  storage::CommitId commit_1 = CreateCommit(
-      &page_storage, commit_0, AddKeyValueToJournal("key1", "val1.0"));
-
-  storage::CommitId commit_2 = CreateCommit(
-      &page_storage, commit_0, AddKeyValueToJournal("key1", "val1.0"));
-
-  storage::CommitId commit_3 = CreateCommit(
-      &page_storage, commit_0, AddKeyValueToJournal("key2", "val2.0"));
-
-  storage::CommitId merge_1 =
-      CreateMergeCommit(&page_storage, commit_1, commit_3,
-                        AddKeyValueToJournal("key3", "val3.0"));
-
-  storage::CommitId merge_2 =
-      CreateMergeCommit(&page_storage, commit_2, commit_3,
-                        AddKeyValueToJournal("key3", "val3.0"));
-
-  bool called;
-  storage::Status status;
-  std::vector<storage::CommitId> ids;
-  page_storage.GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(2u, ids.size());
-  EXPECT_NE(ids.end(), std::find(ids.begin(), ids.end(), merge_1));
-  EXPECT_NE(ids.end(), std::find(ids.begin(), ids.end(), merge_2));
-
-  page_storage.SetDropCommitNotifications(false);
-
-  storage::CommitWatcher* watcher = &resolver;
-  watcher->OnNewCommits({}, storage::ChangeSource::CLOUD);
-
-  // Note we can't use "RunLoopUntilIdle()" because the FakePageStorage delays
-  // before inserting tasks into the message loop.
-  RunLoopFor(zx::sec(5));
-
-  EXPECT_GT(backoff_ptr->get_next_count, 0);
-}
-
-TEST_F(MergeResolverTest, AutomaticallyMergeIdenticalCommits) {
-  // Set up conflict
-  storage::CommitId commit_1 = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key1", "val1.0"));
-
-  storage::CommitId commit_2 = CreateCommit(
-      storage::kFirstPageCommitId, AddKeyValueToJournal("key1", "val1.0"));
-
-  bool called;
-  storage::Status status;
-  std::vector<storage::CommitId> ids;
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(2u, ids.size());
-  EXPECT_NE(ids.end(), std::find(ids.begin(), ids.end(), commit_1));
-  EXPECT_NE(ids.end(), std::find(ids.begin(), ids.end(), commit_2));
-
-  MergeResolver resolver([] {}, &environment_, page_storage_.get(),
-                         std::make_unique<backoff::TestBackoff>());
-  resolver.set_on_empty(callback::SetWhenCalled(&called));
-  auto merge_strategy = std::make_unique<RecordingTestStrategy>();
-  auto merge_strategy_ptr = merge_strategy.get();
-  resolver.SetMergeStrategy(std::move(merge_strategy));
-
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_TRUE(resolver.IsEmpty());
-  ids.clear();
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(1u, ids.size());
-  EXPECT_EQ(0u, merge_strategy_ptr->merge_calls);
-}
-
-TEST_F(MergeResolverTest, NoConflictCallback_ConflictsResolved) {
-  // Set up conflict.
-  CreateCommit(storage::kFirstPageCommitId, AddKeyValueToJournal("foo", "bar"));
-  CreateCommit(storage::kFirstPageCommitId, AddKeyValueToJournal("foo", "baz"));
-  std::unique_ptr<LastOneWinsMergeStrategy> strategy =
-      std::make_unique<LastOneWinsMergeStrategy>();
-  MergeResolver resolver([] {}, &environment_, page_storage_.get(),
-                         std::make_unique<backoff::TestBackoff>());
-  resolver.SetMergeStrategy(std::move(strategy));
-  resolver.set_on_empty(MakeQuitTaskOnce());
-
-  bool called;
-  storage::Status status;
-  std::vector<storage::CommitId> ids;
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(2u, ids.size());
-
-  size_t callback_calls = 0;
-  auto conflicts_resolved_callback = [&resolver, &callback_calls]() {
-    EXPECT_TRUE(resolver.IsEmpty());
-    callback_calls++;
-  };
-  ConflictResolutionWaitStatus wait_status;
-  resolver.RegisterNoConflictCallback(
-      callback::Capture(conflicts_resolved_callback, &wait_status));
-  resolver.RegisterNoConflictCallback(
-      callback::Capture(conflicts_resolved_callback, &wait_status));
-
-  // Check that the callback was called 2 times.
-  RunLoopUntilIdle();
-  EXPECT_TRUE(resolver.IsEmpty());
-  EXPECT_EQ(2u, callback_calls);
-  EXPECT_EQ(ConflictResolutionWaitStatus::CONFLICTS_RESOLVED, wait_status);
-
-  ids.clear();
-  page_storage_->GetHeadCommitIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(1u, ids.size());
-
-  callback_calls = 0;
-  CreateCommit(ids[0], AddKeyValueToJournal("foo", "baw"));
-  CreateCommit(ids[0], AddKeyValueToJournal("foo", "bat"));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(resolver.IsEmpty());
-
-  // Check that callback wasn't called (callback queue cleared after all the
-  // callbacks in it were called).
-  RunLoopFor(zx::sec(10));
-  EXPECT_EQ(0u, callback_calls);
-}
-
-TEST_F(MergeResolverTest, NoConflictCallback_NoConflicts) {
-  CreateCommit(storage::kFirstPageCommitId, AddKeyValueToJournal("foo", "baz"));
-  std::unique_ptr<LastOneWinsMergeStrategy> strategy =
-      std::make_unique<LastOneWinsMergeStrategy>();
-  MergeResolver resolver([] {}, &environment_, page_storage_.get(),
-                         std::make_unique<backoff::TestBackoff>());
-  resolver.SetMergeStrategy(std::move(strategy));
-  resolver.set_on_empty(MakeQuitTaskOnce());
-
-  size_t callback_calls = 0;
-  auto conflicts_resolved_callback = [&resolver, &callback_calls]() {
-    EXPECT_TRUE(resolver.IsEmpty());
-    callback_calls++;
-  };
-  ConflictResolutionWaitStatus wait_status;
-  resolver.RegisterNoConflictCallback(
-      callback::Capture(conflicts_resolved_callback, &wait_status));
-
-  // Check that the callback was called 1 times.
-  RunLoopUntilIdle();
-  EXPECT_TRUE(resolver.IsEmpty());
-  EXPECT_EQ(1u, callback_calls);
-  EXPECT_EQ(ConflictResolutionWaitStatus::NO_CONFLICTS, wait_status);
-}
-
-TEST_F(MergeResolverTest, HasUnfinishedMerges) {
-  MergeResolver resolver([] {}, &environment_, page_storage_.get(),
-                         std::make_unique<backoff::TestBackoff>());
-  std::unique_ptr<CapturingMergeStrategy> strategy =
-      std::make_unique<CapturingMergeStrategy>();
-  auto strategy_ptr = strategy.get();
-  resolver.SetMergeStrategy(std::move(strategy));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(resolver.HasUnfinishedMerges());
-
-  // Set up a conflict and verify that HasUnfinishedMerges() returns true.
-  storage::CommitId commit_1 = CreateCommit(storage::kFirstPageCommitId,
-                                            AddKeyValueToJournal("foo", "bar"));
-  storage::CommitId commit_2 = CreateCommit(storage::kFirstPageCommitId,
-                                            AddKeyValueToJournal("foo", "baz"));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(resolver.HasUnfinishedMerges());
-
-  // Resolve the conflict and verify that HasUnfinishedMerges() returns false.
-  ASSERT_TRUE(strategy_ptr->head_1);
-  ASSERT_TRUE(strategy_ptr->head_2);
-  ASSERT_TRUE(strategy_ptr->ancestor);
-  ASSERT_TRUE(strategy_ptr->callback);
-  CreateMergeCommit(strategy_ptr->head_1->GetId(),
-                    strategy_ptr->head_2->GetId(),
-                    AddKeyValueToJournal("key3", "val3.0"));
-  strategy_ptr->callback(Status::OK);
-  strategy_ptr->callback = nullptr;
-  RunLoopUntilIdle();
-  EXPECT_FALSE(resolver.HasUnfinishedMerges());
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/merge_strategy.h b/bin/ledger/app/merging/merge_strategy.h
deleted file mode 100644
index 78a4069..0000000
--- a/bin/ledger/app/merging/merge_strategy.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_MERGING_MERGE_STRATEGY_H_
-#define PERIDOT_BIN_LEDGER_APP_MERGING_MERGE_STRATEGY_H_
-
-#include <memory>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/app/merging/merge_resolver.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-class PageManager;
-
-// Interface for a merge algorithm.
-class MergeStrategy {
- public:
-  MergeStrategy() {}
-  virtual ~MergeStrategy() {}
-
-  // Sets a callback that will be called if this strategy is not to be used
-  // anymore, for instance when the underlying merge mechanism is no longer
-  // available. This callback should not delete the strategy if there are merges
-  // in progress.
-  virtual void SetOnError(fit::function<void()> on_error) = 0;
-
-  // Merge the given commits. head_1.timesteamp must be less or equals to
-  // head_2.timestamp. MergeStrategy should not be deleted while merges are in
-  // progress.
-  virtual void Merge(storage::PageStorage* storage, PageManager* page_manager,
-                     std::unique_ptr<const storage::Commit> head_1,
-                     std::unique_ptr<const storage::Commit> head_2,
-                     std::unique_ptr<const storage::Commit> ancestor,
-                     fit::function<void(Status)> callback) = 0;
-
-  // Cancel an in-progress merge. This must be called after |Merge| has been
-  // called, and before the |on_done| callback.
-  virtual void Cancel() = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(MergeStrategy);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_MERGING_MERGE_STRATEGY_H_
diff --git a/bin/ledger/app/merging/test_utils.cc b/bin/ledger/app/merging/test_utils.cc
deleted file mode 100644
index c82dbd3..0000000
--- a/bin/ledger/app/merging/test_utils.cc
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/merging/test_utils.h"
-
-#include <lib/async/dispatcher.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fit/function.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/encryption/primitives/hash.h"
-#include "peridot/bin/ledger/storage/impl/leveldb.h"
-#include "peridot/bin/ledger/storage/impl/page_storage_impl.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-namespace ledger {
-
-TestWithPageStorage::TestWithPageStorage()
-    : encryption_service_(dispatcher()) {}
-
-TestWithPageStorage::~TestWithPageStorage() {}
-
-fit::function<void(storage::Journal*)>
-TestWithPageStorage::AddKeyValueToJournal(const std::string& key,
-                                          std::string value) {
-  return [this, key,
-          value = std::move(value)](storage::Journal* journal) mutable {
-    storage::Status status;
-    storage::ObjectIdentifier object_identifier;
-    bool called;
-    page_storage()->AddObjectFromLocal(
-        storage::ObjectType::BLOB,
-        storage::DataSource::Create(std::move(value)),
-        callback::Capture(callback::SetWhenCalled(&called), &status,
-                          &object_identifier));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-
-    journal->Put(key, object_identifier, storage::KeyPriority::EAGER,
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-  };
-}
-
-fit::function<void(storage::Journal*)>
-TestWithPageStorage::DeleteKeyFromJournal(const std::string& key) {
-  return [this, key](storage::Journal* journal) {
-    storage::Status status;
-    bool called;
-    journal->Delete(
-        key, callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-  };
-}
-
-::testing::AssertionResult TestWithPageStorage::GetValue(
-    storage::ObjectIdentifier object_identifier, std::string* value) {
-  storage::Status status;
-  std::unique_ptr<const storage::Object> object;
-  bool called;
-  page_storage()->GetObject(
-      std::move(object_identifier), storage::PageStorage::Location::LOCAL,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &object));
-  RunLoopUntilIdle();
-  if (!called) {
-    return ::testing::AssertionFailure()
-           << "PageStorage::GetObject never called the callback.";
-  }
-  if (status != storage::Status::OK) {
-    return ::testing::AssertionFailure()
-           << "PageStorage::GetObject returned status: " << status;
-  }
-
-  fxl::StringView data;
-  status = object->GetData(&data);
-  if (status != storage::Status::OK) {
-    return ::testing::AssertionFailure()
-           << "Object::GetData returned status: " << status;
-  }
-
-  *value = data.ToString();
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult TestWithPageStorage::CreatePageStorage(
-    std::unique_ptr<storage::PageStorage>* page_storage) {
-  auto db = std::make_unique<storage::LevelDb>(environment_.dispatcher(),
-                                               DetachedPath(tmpfs_.root_fd()));
-  storage::Status status = db->Init();
-  if (status != storage::Status::OK) {
-    return ::testing::AssertionFailure()
-           << "LevelDb::Init failed with status " << status;
-  }
-  auto local_page_storage = std::make_unique<storage::PageStorageImpl>(
-      &environment_, &encryption_service_, std::move(db),
-      kRootPageId.ToString());
-
-  bool called;
-  local_page_storage->Init(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  if (!called) {
-    return ::testing::AssertionFailure()
-           << "PageStorage::Init never called the callback.";
-  }
-
-  if (status != storage::Status::OK) {
-    return ::testing::AssertionFailure()
-           << "PageStorageImpl::Init returned status: " << status;
-  }
-  *page_storage = std::move(local_page_storage);
-  return ::testing::AssertionSuccess();
-}
-
-fit::closure TestWithPageStorage::MakeQuitTaskOnce() {
-  return [this, called = false]() mutable {
-    if (!called) {
-      called = true;
-      QuitLoop();
-    }
-  };
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/merging/test_utils.h b/bin/ledger/app/merging/test_utils.h
deleted file mode 100644
index ea76078..0000000
--- a/bin/ledger/app/merging/test_utils.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_MERGING_TEST_UTILS_H_
-#define PERIDOT_BIN_LEDGER_APP_MERGING_TEST_UTILS_H_
-
-#include <functional>
-#include <memory>
-
-#include <lib/backoff/backoff.h>
-#include <lib/fit/function.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/storage/public/journal.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace ledger {
-
-class TestWithPageStorage : public TestWithEnvironment {
- public:
-  TestWithPageStorage();
-  ~TestWithPageStorage() override;
-
- protected:
-  virtual storage::PageStorage* page_storage() = 0;
-
-  // Returns a function that, when executed, adds the provided key and object to
-  // a journal.
-  fit::function<void(storage::Journal*)> AddKeyValueToJournal(
-      const std::string& key, std::string value);
-
-  // Returns a function that, when executed, deleted the provided key from a
-  // journal.
-  fit::function<void(storage::Journal*)> DeleteKeyFromJournal(
-      const std::string& key);
-
-  ::testing::AssertionResult GetValue(
-      storage::ObjectIdentifier object_identifier, std::string* value);
-
-  ::testing::AssertionResult CreatePageStorage(
-      std::unique_ptr<storage::PageStorage>* page_storage);
-
-  fit::closure MakeQuitTaskOnce();
-
- private:
-  scoped_tmpfs::ScopedTmpFS tmpfs_;
-  encryption::FakeEncryptionService encryption_service_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_MERGING_TEST_UTILS_H_
diff --git a/bin/ledger/app/page_delaying_facade.cc b/bin/ledger/app/page_delaying_facade.cc
deleted file mode 100644
index 4ce0b4c..0000000
--- a/bin/ledger/app/page_delaying_facade.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_delaying_facade.h"
-
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-PageDelayingFacade::PageDelayingFacade(storage::PageIdView page_id,
-                                       fidl::InterfaceRequest<Page> request)
-    : interface_(this) {
-  convert::ToArray(page_id, &page_id_.id);
-
-  interface_.set_on_empty([this] {
-    if (on_empty_callback_) {
-      on_empty_callback_();
-    }
-  });
-  interface_.Bind(std::move(request));
-}
-
-void PageDelayingFacade::SetPageDelegate(PageDelegate* page_delegate) {
-  delaying_facade_.SetTargetObject(page_delegate);
-}
-
-bool PageDelayingFacade::IsEmpty() { return !interface_.is_bound(); }
-
-void PageDelayingFacade::GetId(Page::GetIdCallback callback) {
-  callback(page_id_);
-}
-
-void PageDelayingFacade::GetSnapshot(
-    fidl::InterfaceRequest<PageSnapshot> snapshot_request,
-    std::vector<uint8_t> key_prefix,
-    fidl::InterfaceHandle<PageWatcher> watcher,
-    Page::GetSnapshotCallback callback) {
-  delaying_facade_.EnqueueCall(
-      &PageDelegate::GetSnapshot, std::move(snapshot_request),
-      std::move(key_prefix), std::move(watcher), std::move(callback));
-}
-
-void PageDelayingFacade::Put(std::vector<uint8_t> key,
-                             std::vector<uint8_t> value,
-                             Page::PutCallback callback) {
-  delaying_facade_.EnqueueCall(&PageDelegate::Put, std::move(key),
-                               std::move(value), std::move(callback));
-}
-
-void PageDelayingFacade::PutWithPriority(
-    std::vector<uint8_t> key, std::vector<uint8_t> value,
-    Priority priority, Page::PutWithPriorityCallback callback) {
-  delaying_facade_.EnqueueCall(&PageDelegate::PutWithPriority, std::move(key),
-                               std::move(value), priority, std::move(callback));
-}
-
-void PageDelayingFacade::PutReference(std::vector<uint8_t> key,
-                                      Reference reference, Priority priority,
-                                      Page::PutReferenceCallback callback) {
-  delaying_facade_.EnqueueCall(&PageDelegate::PutReference, std::move(key),
-                               std::move(reference), priority,
-                               std::move(callback));
-}
-
-void PageDelayingFacade::Delete(std::vector<uint8_t> key,
-                                Page::DeleteCallback callback) {
-  delaying_facade_.EnqueueCall(&PageDelegate::Delete, std::move(key),
-                               std::move(callback));
-}
-
-void PageDelayingFacade::Clear(Page::ClearCallback callback) {
-  delaying_facade_.EnqueueCall(&PageDelegate::Clear, std::move(callback));
-}
-
-void PageDelayingFacade::CreateReference(
-    std::unique_ptr<storage::DataSource> data,
-    fit::function<void(Status, ReferencePtr)> callback) {
-  delaying_facade_.EnqueueCall(&PageDelegate::CreateReference, std::move(data),
-                               std::move(callback));
-}
-
-void PageDelayingFacade::StartTransaction(
-    Page::StartTransactionCallback callback) {
-  delaying_facade_.EnqueueCall(&PageDelegate::StartTransaction,
-                               std::move(callback));
-}
-
-void PageDelayingFacade::Commit(Page::CommitCallback callback) {
-  delaying_facade_.EnqueueCall(&PageDelegate::Commit, std::move(callback));
-}
-
-void PageDelayingFacade::Rollback(Page::RollbackCallback callback) {
-  delaying_facade_.EnqueueCall(&PageDelegate::Rollback, std::move(callback));
-}
-
-void PageDelayingFacade::SetSyncStateWatcher(
-    fidl::InterfaceHandle<SyncWatcher> watcher,
-    Page::SetSyncStateWatcherCallback callback) {
-  delaying_facade_.EnqueueCall(&PageDelegate::SetSyncStateWatcher,
-                               std::move(watcher), std::move(callback));
-}
-
-void PageDelayingFacade::WaitForConflictResolution(
-    Page::WaitForConflictResolutionCallback callback) {
-  delaying_facade_.EnqueueCall(&PageDelegate::WaitForConflictResolution,
-                               std::move(callback));
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/page_delaying_facade.h b/bin/ledger/app/page_delaying_facade.h
deleted file mode 100644
index 424ad89..0000000
--- a/bin/ledger/app/page_delaying_facade.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_PAGE_DELAYING_FACADE_H_
-#define PERIDOT_BIN_LEDGER_APP_PAGE_DELAYING_FACADE_H_
-
-#include "peridot/bin/ledger/app/delaying_facade.h"
-#include "peridot/bin/ledger/app/page_delegate.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-
-// A handler for all calls to methods from the |Page| interface.
-//
-// |PageDelayingFacade| owns PageImpl. It makes sure that |Page::GetId| can be
-// answered immediately after the page is bound, but also that all other methods
-// are queued until the page initialization is complete.
-//
-// On |Page| request, a |PageDelayingFacade| should immediately be created and
-// |BindPage| should be called. This will guarantee that |GetId| will get an
-// immediate response and that the other method calls will be queued. Once page
-// initialization is complete, |SetPageDelegate| should be called. After that,
-// all pending operations, as well as any new ones, will be delegated to the
-// given PageDelegate.
-class PageDelayingFacade {
- public:
-  // PageDelayingFacade constructor. The given request is bound immediately.
-  PageDelayingFacade(storage::PageIdView page_id,
-                     fidl::InterfaceRequest<Page> request);
-
-  void SetPageDelegate(PageDelegate* page_delegate);
-
-  bool IsEmpty();
-
-  void set_on_empty(fit::closure on_empty_callback) {
-    on_empty_callback_ = std::move(on_empty_callback);
-  }
-
-  // From Page interface, called by PageImpl:
-  void GetId(Page::GetIdCallback callback);
-
-  void GetSnapshot(fidl::InterfaceRequest<PageSnapshot> snapshot_request,
-                   std::vector<uint8_t> key_prefix,
-                   fidl::InterfaceHandle<PageWatcher> watcher,
-                   Page::GetSnapshotCallback callback);
-  void Put(std::vector<uint8_t> key, std::vector<uint8_t> value,
-           Page::PutCallback callback);
-  void PutWithPriority(std::vector<uint8_t> key,
-                       std::vector<uint8_t> value, Priority priority,
-                       Page::PutWithPriorityCallback callback);
-  void PutReference(std::vector<uint8_t> key, Reference reference,
-                    Priority priority, Page::PutReferenceCallback callback);
-  void Delete(std::vector<uint8_t> key, Page::DeleteCallback callback);
-  void Clear(Page::ClearCallback callback);
-  void CreateReference(std::unique_ptr<storage::DataSource> data,
-                       fit::function<void(Status, ReferencePtr)> callback);
-  void StartTransaction(Page::StartTransactionCallback callback);
-  void Commit(Page::CommitCallback callback);
-  void Rollback(Page::RollbackCallback callback);
-  void SetSyncStateWatcher(fidl::InterfaceHandle<SyncWatcher> watcher,
-                           Page::SetSyncStateWatcherCallback callback);
-  void WaitForConflictResolution(
-      Page::WaitForConflictResolutionCallback callback);
-
- private:
-  PageId page_id_;
-  DelayingFacade<PageDelegate> delaying_facade_;
-
-  fit::closure on_empty_callback_;
-
-  fidl_helpers::BoundInterface<Page, PageImpl> interface_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageDelayingFacade);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_PAGE_DELAYING_FACADE_H_
diff --git a/bin/ledger/app/page_delegate.cc b/bin/ledger/app/page_delegate.cc
deleted file mode 100644
index b42771b..0000000
--- a/bin/ledger/app/page_delegate.cc
+++ /dev/null
@@ -1,419 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_delegate.h"
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/callback/waiter.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/page_delaying_facade.h"
-#include "peridot/bin/ledger/app/page_manager.h"
-#include "peridot/bin/ledger/app/page_snapshot_impl.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-PageDelegate::PageDelegate(
-    coroutine::CoroutineService* coroutine_service, PageManager* manager,
-    storage::PageStorage* storage, MergeResolver* merge_resolver,
-    SyncWatcherSet* watchers,
-    std::unique_ptr<PageDelayingFacade> page_delaying_facade)
-    : manager_(manager),
-      storage_(storage),
-      merge_resolver_(merge_resolver),
-      branch_tracker_(coroutine_service, manager, storage),
-      watcher_set_(watchers),
-      page_delaying_facade_(std::move(page_delaying_facade)),
-      weak_factory_(this) {
-  page_delaying_facade_->set_on_empty([this] {
-    operation_serializer_.Serialize<Status>(
-        [](Status status) {},
-        [this](fit::function<void(Status)> callback) {
-          branch_tracker_.StopTransaction(nullptr);
-          callback(Status::OK);
-        });
-  });
-  branch_tracker_.set_on_empty([this] { CheckEmpty(); });
-  operation_serializer_.set_on_empty([this] { CheckEmpty(); });
-}
-
-PageDelegate::~PageDelegate() {}
-
-void PageDelegate::Init(fit::function<void(Status)> on_done) {
-  branch_tracker_.Init([this, on_done = std::move(on_done)](Status status) {
-    if (status != Status::OK) {
-      on_done(status);
-      return;
-    }
-    page_delaying_facade_->SetPageDelegate(this);
-    on_done(Status::OK);
-  });
-}
-
-void PageDelegate::GetSnapshot(
-    fidl::InterfaceRequest<PageSnapshot> snapshot_request,
-    std::vector<uint8_t> key_prefix,
-    fidl::InterfaceHandle<PageWatcher> watcher,
-    Page::GetSnapshotCallback callback) {
-  // TODO(qsr): Update this so that only |GetCurrentCommitId| is done in a the
-  // operation serializer.
-  operation_serializer_.Serialize<Status>(
-      std::move(callback),
-      [this, snapshot_request = std::move(snapshot_request),
-       key_prefix = std::move(key_prefix), watcher = std::move(watcher)](
-          Page::GetSnapshotCallback callback) mutable {
-        storage_->GetCommit(
-            GetCurrentCommitId(),
-            callback::MakeScoped(
-                weak_factory_.GetWeakPtr(),
-                [this, snapshot_request = std::move(snapshot_request),
-                 key_prefix = std::move(key_prefix),
-                 watcher = std::move(watcher), callback = std::move(callback)](
-                    storage::Status status,
-                    std::unique_ptr<const storage::Commit> commit) mutable {
-                  if (status != storage::Status::OK) {
-                    callback(PageUtils::ConvertStatus(status));
-                    return;
-                  }
-                  std::string prefix = convert::ToString(key_prefix);
-                  if (watcher) {
-                    PageWatcherPtr watcher_ptr = watcher.Bind();
-                    branch_tracker_.RegisterPageWatcher(
-                        std::move(watcher_ptr), commit->Clone(), prefix);
-                  }
-                  manager_->BindPageSnapshot(std::move(commit),
-                                             std::move(snapshot_request),
-                                             std::move(prefix));
-                  callback(Status::OK);
-                }));
-      });
-}
-
-void PageDelegate::Put(std::vector<uint8_t> key,
-                       std::vector<uint8_t> value,
-                       Page::PutCallback callback) {
-  PutWithPriority(std::move(key), std::move(value), Priority::EAGER,
-                  std::move(callback));
-}
-
-void PageDelegate::PutWithPriority(std::vector<uint8_t> key,
-                                   std::vector<uint8_t> value,
-                                   Priority priority,
-                                   Page::PutWithPriorityCallback callback) {
-  FXL_DCHECK(key.size() <= kMaxKeySize);
-  auto promise = fxl::MakeRefCounted<
-      callback::Promise<storage::Status, storage::ObjectIdentifier>>(
-      storage::Status::ILLEGAL_STATE);
-  storage_->AddObjectFromLocal(storage::ObjectType::BLOB,
-                               storage::DataSource::Create(std::move(value)),
-                               promise->NewCallback());
-
-  operation_serializer_.Serialize<Status>(
-      std::move(callback),
-      [this, promise = std::move(promise), key = std::move(key),
-       priority](Page::PutWithPriorityCallback callback) mutable {
-        promise->Finalize(callback::MakeScoped(
-            weak_factory_.GetWeakPtr(),
-            [this, key = std::move(key), priority,
-             callback = std::move(callback)](
-                storage::Status status,
-                storage::ObjectIdentifier object_identifier) mutable {
-              if (status != storage::Status::OK) {
-                callback(PageUtils::ConvertStatus(status));
-                return;
-              }
-
-              PutInCommit(std::move(key), std::move(object_identifier),
-                          priority == Priority::EAGER
-                              ? storage::KeyPriority::EAGER
-                              : storage::KeyPriority::LAZY,
-                          std::move(callback));
-            }));
-      });
-}
-
-void PageDelegate::PutReference(std::vector<uint8_t> key,
-                                Reference reference, Priority priority,
-                                Page::PutReferenceCallback callback) {
-  FXL_DCHECK(key.size() <= kMaxKeySize);
-  // |ResolveReference| also makes sure that the reference was created for this
-  // page.
-  storage::ObjectIdentifier object_identifier;
-  Status status =
-      manager_->ResolveReference(std::move(reference), &object_identifier);
-  if (status != Status::OK) {
-    callback(status);
-    return;
-  }
-
-  operation_serializer_.Serialize<Status>(
-      std::move(callback),
-      [this, key = std::move(key),
-       object_identifier = std::move(object_identifier),
-       priority](Page::PutReferenceCallback callback) mutable {
-        PutInCommit(std::move(key), std::move(object_identifier),
-                    priority == Priority::EAGER ? storage::KeyPriority::EAGER
-                                                : storage::KeyPriority::LAZY,
-                    std::move(callback));
-      });
-}
-
-void PageDelegate::Delete(std::vector<uint8_t> key,
-                          Page::DeleteCallback callback) {
-  operation_serializer_.Serialize<Status>(
-      std::move(callback),
-      [this, key = std::move(key)](Page::DeleteCallback callback) mutable {
-        RunInTransaction(
-            [key = std::move(key)](storage::Journal* journal,
-                                   fit::function<void(Status)> callback) {
-              journal->Delete(key, [callback = std::move(callback)](
-                                       storage::Status status) {
-                callback(
-                    PageUtils::ConvertStatus(status, Status::KEY_NOT_FOUND));
-              });
-            },
-            std::move(callback));
-      });
-}
-
-void PageDelegate::Clear(Page::ClearCallback callback) {
-  operation_serializer_.Serialize<Status>(
-      std::move(callback), [this](Page::ClearCallback callback) mutable {
-        RunInTransaction(
-            [](storage::Journal* journal,
-               fit::function<void(Status)> callback) {
-              journal->Clear(
-                  [callback = std::move(callback)](storage::Status status) {
-                    callback(PageUtils::ConvertStatus(status));
-                  });
-            },
-            std::move(callback));
-      });
-}
-
-void PageDelegate::CreateReference(
-    std::unique_ptr<storage::DataSource> data,
-    fit::function<void(Status, ReferencePtr)> callback) {
-  storage_->AddObjectFromLocal(
-      storage::ObjectType::BLOB, std::move(data),
-      callback::MakeScoped(
-          weak_factory_.GetWeakPtr(),
-          [this, callback = std::move(callback)](
-              storage::Status status,
-              storage::ObjectIdentifier object_identifier) {
-            if (status != storage::Status::OK) {
-              callback(PageUtils::ConvertStatus(status), nullptr);
-              return;
-            }
-
-            callback(Status::OK, fidl::MakeOptional(manager_->CreateReference(
-                                     std::move(object_identifier))));
-          }));
-}
-
-void PageDelegate::StartTransaction(Page::StartTransactionCallback callback) {
-  operation_serializer_.Serialize<Status>(
-      std::move(callback), [this](StatusCallback callback) {
-        if (journal_) {
-          callback(Status::TRANSACTION_ALREADY_IN_PROGRESS);
-          return;
-        }
-        storage::CommitId commit_id = branch_tracker_.GetBranchHeadId();
-        storage_->StartCommit(
-            commit_id, storage::JournalType::EXPLICIT,
-            callback::MakeScoped(
-                weak_factory_.GetWeakPtr(),
-                [this, commit_id, callback = std::move(callback)](
-                    storage::Status status,
-                    std::unique_ptr<storage::Journal> journal) mutable {
-                  journal_ = std::move(journal);
-                  if (status != storage::Status::OK) {
-                    callback(PageUtils::ConvertStatus(status));
-                    return;
-                  }
-                  journal_parent_commit_ = commit_id;
-
-                  branch_tracker_.StartTransaction(
-                      [callback = std::move(callback)]() {
-                        callback(Status::OK);
-                      });
-                }));
-      });
-}
-
-void PageDelegate::Commit(Page::CommitCallback callback) {
-  operation_serializer_.Serialize<Status>(
-      std::move(callback), [this](StatusCallback callback) {
-        if (!journal_) {
-          callback(Status::NO_TRANSACTION_IN_PROGRESS);
-          return;
-        }
-        journal_parent_commit_.clear();
-        CommitJournal(std::move(journal_),
-                      callback::MakeScoped(
-                          weak_factory_.GetWeakPtr(),
-                          [this, callback = std::move(callback)](
-                              Status status,
-                              std::unique_ptr<const storage::Commit> commit) {
-                            branch_tracker_.StopTransaction(std::move(commit));
-                            callback(status);
-                          }));
-      });
-}
-
-void PageDelegate::Rollback(Page::RollbackCallback callback) {
-  operation_serializer_.Serialize<Status>(
-      std::move(callback), [this](StatusCallback callback) {
-        if (!journal_) {
-          callback(Status::NO_TRANSACTION_IN_PROGRESS);
-          return;
-        }
-        storage_->RollbackJournal(
-            std::move(journal_),
-            callback::MakeScoped(
-                weak_factory_.GetWeakPtr(),
-                [this, callback = std::move(callback)](storage::Status status) {
-                  journal_.reset();
-                  journal_parent_commit_.clear();
-                  callback(PageUtils::ConvertStatus(status));
-                  branch_tracker_.StopTransaction(nullptr);
-                }));
-      });
-}
-
-void PageDelegate::SetSyncStateWatcher(
-    fidl::InterfaceHandle<SyncWatcher> watcher,
-    Page::SetSyncStateWatcherCallback callback) {
-  SyncWatcherPtr watcher_ptr = watcher.Bind();
-  watcher_set_->AddSyncWatcher(std::move(watcher_ptr));
-  callback(Status::OK);
-}
-
-void PageDelegate::WaitForConflictResolution(
-    Page::WaitForConflictResolutionCallback callback) {
-  if (!merge_resolver_->HasUnfinishedMerges()) {
-    callback(ConflictResolutionWaitStatus::NO_CONFLICTS);
-    return;
-  }
-  merge_resolver_->RegisterNoConflictCallback(std::move(callback));
-}
-
-const storage::CommitId& PageDelegate::GetCurrentCommitId() {
-  // TODO(etiennej): Commit implicit transactions when we have those.
-  if (!journal_) {
-    return branch_tracker_.GetBranchHeadId();
-  }
-  return journal_parent_commit_;
-}
-
-void PageDelegate::PutInCommit(std::vector<uint8_t> key,
-                               storage::ObjectIdentifier object_identifier,
-                               storage::KeyPriority priority,
-                               fit::function<void(Status)> callback) {
-  RunInTransaction(
-      [key = std::move(key), object_identifier = std::move(object_identifier),
-       priority](storage::Journal* journal,
-                 fit::function<void(Status status)> callback) mutable {
-        journal->Put(key, std::move(object_identifier), priority,
-                     [callback = std::move(callback)](storage::Status status) {
-                       callback(PageUtils::ConvertStatus(status));
-                     });
-      },
-      std::move(callback));
-}
-
-void PageDelegate::RunInTransaction(
-    fit::function<void(storage::Journal*, fit::function<void(Status)>)>
-        runnable,
-    fit::function<void(Status)> callback) {
-  if (journal_) {
-    // A transaction is in progress; add this change to it.
-    runnable(journal_.get(), std::move(callback));
-    return;
-  }
-  // No transaction is in progress; create one just for this change.
-  // TODO(etiennej): Add a change batching strategy for operations outside
-  // transactions. Currently, we create a commit for every change; we
-  // would like to group changes that happen "close enough" together in
-  // one commit.
-  branch_tracker_.StartTransaction([] {});
-  storage::CommitId commit_id = branch_tracker_.GetBranchHeadId();
-  std::unique_ptr<storage::Journal> journal;
-  storage_->StartCommit(
-      commit_id, storage::JournalType::IMPLICIT,
-      callback::MakeScoped(
-          weak_factory_.GetWeakPtr(),
-          [this, runnable = std::move(runnable),
-           callback = std::move(callback)](
-              storage::Status status,
-              std::unique_ptr<storage::Journal> journal) mutable {
-            if (status != storage::Status::OK) {
-              callback(PageUtils::ConvertStatus(status));
-              branch_tracker_.StopTransaction(nullptr);
-              return;
-            }
-            runnable(
-                journal.get(),
-                callback::MakeScoped(
-                    weak_factory_.GetWeakPtr(),
-                    [this, journal = std::move(journal),
-                     callback =
-                         std::move(callback)](Status ledger_status) mutable {
-                      if (ledger_status != Status::OK) {
-                        callback(ledger_status);
-                        storage_->RollbackJournal(
-                            std::move(journal),
-                            [](storage::Status /*rollback_status*/) {});
-                        branch_tracker_.StopTransaction(nullptr);
-                        return;
-                      }
-
-                      CommitJournal(
-                          std::move(journal),
-                          callback::MakeScoped(
-                              weak_factory_.GetWeakPtr(),
-                              [this, callback = std::move(callback)](
-                                  Status status,
-                                  std::unique_ptr<const storage::Commit>
-                                      commit) {
-                                branch_tracker_.StopTransaction(
-                                    status == Status::OK ? std::move(commit)
-                                                         : nullptr);
-                                callback(status);
-                              }));
-                    }));
-          }));
-}
-
-void PageDelegate::CommitJournal(
-    std::unique_ptr<storage::Journal> journal,
-    fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-        callback) {
-  storage_->CommitJournal(
-      std::move(journal), [callback = std::move(callback)](
-                              storage::Status status,
-                              std::unique_ptr<const storage::Commit> commit) {
-        callback(PageUtils::ConvertStatus(status), std::move(commit));
-      });
-}
-
-void PageDelegate::CheckEmpty() {
-  if (on_empty_callback_ && page_delaying_facade_->IsEmpty() &&
-      branch_tracker_.IsEmpty() && operation_serializer_.empty()) {
-    on_empty_callback_();
-  }
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/page_delegate.h b/bin/ledger/app/page_delegate.h
deleted file mode 100644
index 6520708..0000000
--- a/bin/ledger/app/page_delegate.h
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_PAGE_DELEGATE_H_
-#define PERIDOT_BIN_LEDGER_APP_PAGE_DELEGATE_H_
-
-#include <memory>
-#include <queue>
-#include <string>
-#include <vector>
-
-#include <lib/callback/operation_serializer.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/app/branch_tracker.h"
-#include "peridot/bin/ledger/app/merging/merge_resolver.h"
-#include "peridot/bin/ledger/app/page_impl.h"
-#include "peridot/bin/ledger/app/sync_watcher_set.h"
-#include "peridot/bin/ledger/fidl_helpers/bound_interface.h"
-#include "peridot/bin/ledger/storage/public/data_source.h"
-#include "peridot/bin/ledger/storage/public/journal.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-class PageManager;
-
-// A delegate for the implementation of the |Page| interface.
-//
-// PageDelegate owns PageDelayingFacade and BranchTracker. It makes sure that
-// all operations in progress will terminate, even if the Page is no longer
-// connected. When the page connection is closed and BranchTracker is also
-// empty, the client is notified through |on_empty_callback| (registered by
-// |set_on_empty()|).
-class PageDelegate {
- public:
-  PageDelegate(coroutine::CoroutineService* coroutine_service,
-               PageManager* manager, storage::PageStorage* storage,
-               MergeResolver* merge_resolver, SyncWatcherSet* watchers,
-               std::unique_ptr<PageDelayingFacade> page_delaying_facade);
-  ~PageDelegate();
-
-  void Init(fit::function<void(Status)> on_done);
-
-  void set_on_empty(fit::closure on_empty_callback) {
-    on_empty_callback_ = std::move(on_empty_callback);
-  }
-
-  // From Page interface, called by PageDelayingFacade:
-
-  void GetSnapshot(fidl::InterfaceRequest<PageSnapshot> snapshot_request,
-                   std::vector<uint8_t> key_prefix,
-                   fidl::InterfaceHandle<PageWatcher> watcher,
-                   Page::GetSnapshotCallback callback);
-
-  void Put(std::vector<uint8_t> key, std::vector<uint8_t> value,
-           Page::PutCallback callback);
-
-  void PutWithPriority(std::vector<uint8_t> key,
-                       std::vector<uint8_t> value, Priority priority,
-                       Page::PutWithPriorityCallback callback);
-
-  void PutReference(std::vector<uint8_t> key, Reference reference,
-                    Priority priority, Page::PutReferenceCallback callback);
-
-  void Delete(std::vector<uint8_t> key, Page::DeleteCallback callback);
-
-  void Clear(Page::ClearCallback callback);
-
-  void CreateReference(std::unique_ptr<storage::DataSource> data,
-                       fit::function<void(Status, ReferencePtr)> callback);
-
-  void StartTransaction(Page::StartTransactionCallback callback);
-
-  void Commit(Page::CommitCallback callback);
-
-  void Rollback(Page::RollbackCallback callback);
-
-  void SetSyncStateWatcher(fidl::InterfaceHandle<SyncWatcher> watcher,
-                           Page::SetSyncStateWatcherCallback callback);
-
-  void WaitForConflictResolution(
-      Page::WaitForConflictResolutionCallback callback);
-
- private:
-  using StatusCallback = fit::function<void(Status)>;
-
-  const storage::CommitId& GetCurrentCommitId();
-
-  void PutInCommit(std::vector<uint8_t> key,
-                   storage::ObjectIdentifier object_identifier,
-                   storage::KeyPriority priority, StatusCallback callback);
-
-  // Runs |runnable| in a transaction, and notifies |callback| of the result. If
-  // a transaction is currently in progress, it reuses it, otherwise creates a
-  // new one and commits it before calling |callback|. This method is not
-  // serialized, and should only be called from a callsite that is serialized.
-  void RunInTransaction(
-      fit::function<void(storage::Journal*, fit::function<void(Status)>)>
-          runnable,
-      StatusCallback callback);
-
-  void CommitJournal(
-      std::unique_ptr<storage::Journal> journal,
-      fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-          callback);
-
-  void CheckEmpty();
-
-  PageManager* manager_;
-  storage::PageStorage* storage_;
-  MergeResolver* merge_resolver_;
-
-  BranchTracker branch_tracker_;
-
-  fit::closure on_empty_callback_;
-
-  storage::CommitId journal_parent_commit_;
-  std::unique_ptr<storage::Journal> journal_;
-  callback::OperationSerializer operation_serializer_;
-  SyncWatcherSet* watcher_set_;
-
-  std::unique_ptr<PageDelayingFacade> page_delaying_facade_;
-
-  // This must be the last member of the class.
-  fxl::WeakPtrFactory<PageDelegate> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageDelegate);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_PAGE_DELEGATE_H_
diff --git a/bin/ledger/app/page_eviction_manager.h b/bin/ledger/app/page_eviction_manager.h
deleted file mode 100644
index 4514896..0000000
--- a/bin/ledger/app/page_eviction_manager.h
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_PAGE_EVICTION_MANAGER_H_
-#define PERIDOT_BIN_LEDGER_APP_PAGE_EVICTION_MANAGER_H_
-
-#include <map>
-#include <string>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/app/page_eviction_policies.h"
-#include "peridot/bin/ledger/app/page_usage_listener.h"
-#include "peridot/bin/ledger/app/types.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-
-// Manages page eviction based on page usage information.
-//
-// |PageEvictionManager| provides the |TryEvictPage| method which evicts a given
-// page, as well as one that selects and evicts a set of pages, among those
-// that are stored on the device.
-//
-// Regardless of the method used, a page can only be evicted if it is closed,
-// i.e. is not currently opened by an external request, and either of the
-// following is true:
-// - All contents of the page (commits and objects) are synced to the cloud.
-// - The page is offline and empty. A page is offline if it has never been
-//   synced to the cloud or a peer. It is empty, if it has a single head commit
-//   and the contents of that commit is empty.
-//
-// If neither of these conditions is fulfilled, the page will fail to be
-// evicted.
-class PageEvictionManager {
- public:
-  // A Delegate, providing the necessary functionality to allow
-  // PageEvictionManager to perform storage clean up operations.
-  class Delegate {
-   public:
-    // Checks whether the given page is closed and synced. The result returned
-    // in the callback will be |PAGE_OPENED| if the page is opened after calling
-    // this method and before the callback is called. Otherwise it will be |YES|
-    // or |NO| depending on whether the page is synced.
-    virtual void PageIsClosedAndSynced(
-        fxl::StringView ledger_name, storage::PageIdView page_id,
-        fit::function<void(Status, PagePredicateResult)> callback) = 0;
-
-    // Checks whether the given page is closed, offline and empty. The result
-    // returned in the callback will be |PAGE_OPENED| if the page is opened
-    // after calling this method and before the callback is called. Otherwise it
-    // will be |YES| or |NO| depending on whether the page is offline and empty.
-    virtual void PageIsClosedOfflineAndEmpty(
-        fxl::StringView ledger_name, storage::PageIdView page_id,
-        fit::function<void(Status, PagePredicateResult)> callback) = 0;
-
-    // Deletes the local copy of the given page from storage.
-    virtual void DeletePageStorage(fxl::StringView ledger_name,
-                                   storage::PageIdView page_id,
-                                   fit::function<void(Status)> callback) = 0;
-  };
-
-  PageEvictionManager() {}
-  virtual ~PageEvictionManager() {}
-
-  // Sets the callback to be called every time the PageEvictionManager is empty.
-  virtual void set_on_empty(fit::closure on_empty_callback) = 0;
-
-  // Returns whether the PageEvictionManager is empty, i.e. whether there are no
-  // pending operations.
-  virtual bool IsEmpty() = 0;
-
-  // Tries to evict from the local storage the least recently used page among
-  // those that are not currectly in use and can be evicted. Returns |IO_ERROR|
-  // through the callback in case of failure to retrieve data on page usage, or
-  // when trying to evict a given page; |OK| otherwise. It is not an error if
-  // there is no page fulfilling the requirements.
-  virtual void TryEvictPages(PageEvictionPolicy* policy,
-                             fit::function<void(Status)> callback) = 0;
-
-  // Marks the page as open.
-  virtual void MarkPageOpened(fxl::StringView ledger_name,
-                              storage::PageIdView page_id) = 0;
-
-  // Marks the page as closed.
-  virtual void MarkPageClosed(fxl::StringView ledger_name,
-                              storage::PageIdView page_id) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageEvictionManager);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_PAGE_EVICTION_MANAGER_H_
diff --git a/bin/ledger/app/page_eviction_manager_impl.cc b/bin/ledger/app/page_eviction_manager_impl.cc
deleted file mode 100644
index aa13c2a..0000000
--- a/bin/ledger/app/page_eviction_manager_impl.cc
+++ /dev/null
@@ -1,396 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_eviction_manager_impl.h"
-
-#include <algorithm>
-
-#include <lib/async/cpp/task.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/strings/concatenate.h>
-#include <zx/time.h>
-
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/ledger_repository_impl.h"
-#include "peridot/bin/ledger/app/page_usage_db.h"
-#include "peridot/bin/ledger/app/types.h"
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/coroutine/coroutine_waiter.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-namespace {
-
-// Logs an error message if the given |status| is not |OK| or |INTERNAL_ERROR|.
-void LogOnPageUpdateError(fxl::StringView operation_description, Status status,
-                          fxl::StringView ledger_name,
-                          storage::PageIdView page_id) {
-  // Don't print an error on |INTERNAL_ERROR|: it means that the operation was
-  // interrupted, because PageEvictionManagerImpl was destroyed before being
-  // empty.
-  if (status != Status::OK && status != Status::INTERNAL_ERROR) {
-    FXL_LOG(ERROR) << "Failed to " << operation_description
-                   << " in PageUsage DB. Status: " << fidl::ToUnderlying(status)
-                   << ". Ledger name: " << ledger_name
-                   << ". Page ID: " << convert::ToHex(page_id);
-  }
-}
-
-// If the given |status| is not |OK|, logs an error message on failure to
-// initialize. Returns true in case of error; false otherwise.
-bool LogOnInitializationError(fxl::StringView operation_description,
-                              Status status) {
-  if (status != Status::OK) {
-    FXL_LOG(ERROR) << operation_description
-                   << " failed because of initialization error: "
-                   << fidl::ToUnderlying(status);
-    return true;
-  }
-  return false;
-}
-
-}  // namespace
-
-PageEvictionManagerImpl::Completer::Completer() {}
-
-PageEvictionManagerImpl::Completer::~Completer() {
-  CallCallbacks(Status::INTERNAL_ERROR);
-}
-
-void PageEvictionManagerImpl::Completer::Complete(Status status) {
-  FXL_DCHECK(!completed_);
-  CallCallbacks(status);
-}
-
-Status PageEvictionManagerImpl::Completer::WaitUntilDone(
-    coroutine::CoroutineHandler* handler) {
-  if (completed_) {
-    return status_;
-  }
-
-  auto sync_call_status =
-      coroutine::SyncCall(handler, [this](fit::closure callback) {
-        // SyncCall finishes its execution when the given |callback| is called.
-        // To block the termination of |SyncCall| (and of |WaitUntilDone|), here
-        // we push this |callback| in the vector of |callbacks_|. Once
-        // |Complete| is called, we will call all of these callbacks, which will
-        // eventually unblock all pending |WaitUntilDone| calls.
-        callbacks_.push_back(std::move(callback));
-      });
-  if (sync_call_status == coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERNAL_ERROR;
-  }
-  return status_;
-}
-
-void PageEvictionManagerImpl::Completer::CallCallbacks(Status status) {
-  if (completed_) {
-    return;
-  }
-  completed_ = true;
-  status_ = status;
-  // We need to move the callbacks in the stack since calling any of the
-  // them might lead to the deletion of this object, invalidating callbacks_.
-  std::vector<fit::closure> callbacks = std::move(callbacks_);
-  callbacks_.clear();
-  for (const auto& callback : callbacks) {
-    callback();
-  }
-}
-
-PageEvictionManagerImpl::PageEvictionManagerImpl(Environment* environment,
-                                                 storage::DbFactory* db_factory,
-                                                 DetachedPath db_path)
-    : environment_(environment),
-      db_factory_(db_factory),
-      db_path_(db_path.SubPath(kPageUsageDbSerializationVersion)),
-      coroutine_manager_(environment_->coroutine_service()),
-      weak_factory_(this) {}
-
-PageEvictionManagerImpl::~PageEvictionManagerImpl() {}
-
-Status PageEvictionManagerImpl::Init() {
-  // Initializing the DB and marking pages as closed are slow operations and we
-  // shouldn't wait for them to finish, before returning from initialization:
-  // Start these operations and finalize the initialization completer when done.
-  coroutine_manager_.StartCoroutine([this](
-                                        coroutine::CoroutineHandler* handler) {
-    ExpiringToken token = NewExpiringToken();
-    if (!files::CreateDirectoryAt(db_path_.root_fd(), db_path_.path())) {
-      initialization_completer_.Complete(Status::IO_ERROR);
-      return;
-    }
-    storage::Status storage_status;
-    std::unique_ptr<storage::Db> db_instance;
-    if (coroutine::SyncCall(
-            handler,
-            [this](fit::function<void(storage::Status,
-                                      std::unique_ptr<storage::Db>)>
-                       callback) {
-              db_factory_->GetOrCreateDb(
-                  std::move(db_path_), storage::DbFactory::OnDbNotFound::CREATE,
-                  std::move(callback));
-            },
-            &storage_status,
-            &db_instance) == coroutine::ContinuationStatus::INTERRUPTED) {
-      initialization_completer_.Complete(Status::INTERNAL_ERROR);
-      return;
-    }
-    if (storage_status != storage::Status::OK) {
-      initialization_completer_.Complete(
-          PageUtils::ConvertStatus(storage_status));
-      return;
-    }
-    db_ = std::make_unique<PageUsageDb>(environment_->clock(),
-                                        std::move(db_instance));
-    Status status = db_->MarkAllPagesClosed(handler);
-    initialization_completer_.Complete(status);
-  });
-  return Status::OK;
-}
-
-void PageEvictionManagerImpl::SetDelegate(
-    PageEvictionManager::Delegate* delegate) {
-  FXL_DCHECK(delegate);
-  FXL_DCHECK(!delegate_);
-  delegate_ = delegate;
-}
-
-void PageEvictionManagerImpl::set_on_empty(fit::closure on_empty_callback) {
-  on_empty_callback_ = std::move(on_empty_callback);
-}
-
-bool PageEvictionManagerImpl::IsEmpty() { return pending_operations_ == 0; }
-
-void PageEvictionManagerImpl::TryEvictPages(
-    PageEvictionPolicy* policy, fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, policy](coroutine::CoroutineHandler* handler,
-                     fit::function<void(Status)> callback) mutable {
-        ExpiringToken token = NewExpiringToken();
-        Status status = initialization_completer_.WaitUntilDone(handler);
-        if (LogOnInitializationError("TryEvictPages", status)) {
-          callback(status);
-          return;
-        }
-        std::unique_ptr<storage::Iterator<const PageInfo>> pages_it;
-        status = db_->GetPages(handler, &pages_it);
-        if (status != Status::OK) {
-          callback(status);
-          return;
-        }
-        policy->SelectAndEvict(std::move(pages_it), std::move(callback));
-      });
-}
-
-void PageEvictionManagerImpl::MarkPageOpened(fxl::StringView ledger_name,
-                                             storage::PageIdView page_id) {
-  coroutine_manager_.StartCoroutine([this, ledger_name = ledger_name.ToString(),
-                                     page_id = page_id.ToString()](
-                                        coroutine::CoroutineHandler* handler) {
-    ExpiringToken token = NewExpiringToken();
-    Status status = initialization_completer_.WaitUntilDone(handler);
-    if (LogOnInitializationError("MarkPageOpened", status)) {
-      return;
-    }
-    status = db_->MarkPageOpened(handler, ledger_name, page_id);
-    LogOnPageUpdateError("mark page as opened", status, ledger_name, page_id);
-  });
-}
-
-void PageEvictionManagerImpl::MarkPageClosed(fxl::StringView ledger_name,
-                                             storage::PageIdView page_id) {
-  coroutine_manager_.StartCoroutine([this, ledger_name = ledger_name.ToString(),
-                                     page_id = page_id.ToString()](
-                                        coroutine::CoroutineHandler* handler) {
-    ExpiringToken token = NewExpiringToken();
-    Status status = initialization_completer_.WaitUntilDone(handler);
-    if (LogOnInitializationError("MarkPageClosed", status)) {
-      return;
-    }
-    status = db_->MarkPageClosed(handler, ledger_name, page_id);
-    LogOnPageUpdateError("mark page as closed", status, ledger_name, page_id);
-  });
-}
-
-void PageEvictionManagerImpl::TryEvictPage(
-    fxl::StringView ledger_name, storage::PageIdView page_id,
-    PageEvictionCondition condition,
-    fit::function<void(Status, PageWasEvicted)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, ledger_name = ledger_name.ToString(), page_id = page_id.ToString(),
-       condition](
-          coroutine::CoroutineHandler* handler,
-          fit::function<void(Status, PageWasEvicted)> callback) mutable {
-        ExpiringToken token = NewExpiringToken();
-        Status status = initialization_completer_.WaitUntilDone(handler);
-        if (LogOnInitializationError("TryEvictPage", status)) {
-          callback(status, PageWasEvicted(false));
-          return;
-        }
-        PageWasEvicted was_evicted;
-        status = SynchronousTryEvictPage(handler, ledger_name, page_id,
-                                         condition, &was_evicted);
-        callback(status, was_evicted);
-      });
-}
-
-void PageEvictionManagerImpl::EvictPage(fxl::StringView ledger_name,
-                                        storage::PageIdView page_id,
-                                        fit::function<void(Status)> callback) {
-  FXL_DCHECK(delegate_);
-  // We cannot delete the page storage and mark the deletion atomically. We thus
-  // delete the page first, and then mark it as evicted in Page Usage DB. If at
-  // some point a page gets deleted, but marking fails, on the next attempt to
-  // evict it we will get a |PAGE_NOT_FOUND| error, indicating we should remove
-  // the entry then. Therefore, |PAGE_NOT_FOUND| errors are handled internally
-  // and never returned to the callback.
-  delegate_->DeletePageStorage(
-      ledger_name, page_id,
-      [this, ledger_name = ledger_name.ToString(), page_id = page_id.ToString(),
-       callback = std::move(callback)](Status status) mutable {
-        // |PAGE_NOT_FOUND| is not an error, but it must have been handled
-        // before we try to evict the page.
-        FXL_DCHECK(status != Status::PAGE_NOT_FOUND);
-        if (status == Status::OK) {
-          MarkPageEvicted(std::move(ledger_name), std::move(page_id));
-        }
-        callback(status);
-      });
-}
-
-Status PageEvictionManagerImpl::CanEvictPage(
-    coroutine::CoroutineHandler* handler, fxl::StringView ledger_name,
-    storage::PageIdView page_id, bool* can_evict) {
-  FXL_DCHECK(delegate_);
-
-  auto waiter =
-      fxl::MakeRefCounted<callback::Waiter<Status, PagePredicateResult>>(
-          Status::OK);
-
-  delegate_->PageIsClosedAndSynced(ledger_name, page_id, waiter->NewCallback());
-  delegate_->PageIsClosedOfflineAndEmpty(ledger_name, page_id,
-                                         waiter->NewCallback());
-
-  Status status;
-  std::vector<PagePredicateResult> can_evict_states;
-  auto sync_call_status =
-      coroutine::Wait(handler, std::move(waiter), &status, &can_evict_states);
-  if (sync_call_status == coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERNAL_ERROR;
-  }
-  if (status != Status::OK) {
-    return status;
-  }
-  FXL_DCHECK(can_evict_states.size() == 2);
-  // Receiving status |PAGE_OPENED| means that the page was opened during the
-  // query. If either result is |PAGE_OPENED| the page cannot be evicted, as the
-  // result of the other might be invalid at this point.
-  *can_evict = std::any_of(can_evict_states.begin(), can_evict_states.end(),
-                           [](PagePredicateResult result) {
-                             return result == PagePredicateResult::YES;
-                           }) &&
-               std::none_of(can_evict_states.begin(), can_evict_states.end(),
-                            [](PagePredicateResult result) {
-                              return result == PagePredicateResult::PAGE_OPENED;
-                            });
-
-  return Status::OK;
-}
-
-Status PageEvictionManagerImpl::CanEvictEmptyPage(
-    coroutine::CoroutineHandler* handler, fxl::StringView ledger_name,
-    storage::PageIdView page_id, bool* can_evict) {
-  FXL_DCHECK(delegate_);
-
-  Status status;
-  PagePredicateResult empty_state;
-  auto sync_call_status = coroutine::SyncCall(
-      handler,
-      [this, ledger_name = ledger_name.ToString(),
-       page_id = page_id.ToString()](auto callback) {
-        delegate_->PageIsClosedOfflineAndEmpty(ledger_name, page_id,
-                                               std::move(callback));
-      },
-      &status, &empty_state);
-  if (sync_call_status == coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERNAL_ERROR;
-  }
-  *can_evict = (empty_state == PagePredicateResult::YES);
-  return status;
-}
-
-void PageEvictionManagerImpl::MarkPageEvicted(std::string ledger_name,
-                                              storage::PageId page_id) {
-  coroutine_manager_.StartCoroutine([this, ledger_name = std::move(ledger_name),
-                                     page_id = std::move(page_id)](
-                                        coroutine::CoroutineHandler* handler) {
-    Status status = db_->MarkPageEvicted(handler, ledger_name, page_id);
-    LogOnPageUpdateError("mark page as evicted", status, ledger_name, page_id);
-  });
-}
-
-Status PageEvictionManagerImpl::SynchronousTryEvictPage(
-    coroutine::CoroutineHandler* handler, std::string ledger_name,
-    storage::PageId page_id, PageEvictionCondition condition,
-    PageWasEvicted* was_evicted) {
-  bool can_evict;
-  Status status;
-  switch (condition) {
-    case IF_EMPTY:
-      status = CanEvictEmptyPage(handler, ledger_name, page_id, &can_evict);
-      break;
-    case IF_POSSIBLE:
-      status = CanEvictPage(handler, ledger_name, page_id, &can_evict);
-  }
-  if (status == Status::PAGE_NOT_FOUND) {
-    // The page was already removed. Mark it as evicted in Page Usage DB.
-    MarkPageEvicted(ledger_name, page_id);
-    *was_evicted = PageWasEvicted(false);
-    return Status::OK;
-  }
-  if (status != Status::OK || !can_evict) {
-    *was_evicted = PageWasEvicted(false);
-    return status;
-  }
-
-  auto sync_call_status = coroutine::SyncCall(
-      handler,
-      [this, ledger_name = std::move(ledger_name),
-       page_id = std::move(page_id)](auto callback) {
-        EvictPage(ledger_name, page_id, std::move(callback));
-      },
-      &status);
-  if (sync_call_status == coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERNAL_ERROR;
-  }
-  *was_evicted = PageWasEvicted(status == Status::OK);
-  return status;
-}
-
-PageEvictionManagerImpl::ExpiringToken
-PageEvictionManagerImpl::NewExpiringToken() {
-  ++pending_operations_;
-  return ExpiringToken(callback::MakeScoped(weak_factory_.GetWeakPtr(), [this] {
-    --pending_operations_;
-    // We need to post a task here: Tokens expire while a coroutine is being
-    // executed, and if |on_empty_callback_| is executed directly, it might end
-    // up deleting the PageEvictionManagerImpl object, which will delete the
-    // |coroutine_manager_|.
-    async::PostTask(environment_->dispatcher(),
-                    callback::MakeScoped(weak_factory_.GetWeakPtr(), [this] {
-                      if (on_empty_callback_ && pending_operations_ == 0) {
-                        on_empty_callback_();
-                      }
-                    }));
-  }));
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/page_eviction_manager_impl.h b/bin/ledger/app/page_eviction_manager_impl.h
deleted file mode 100644
index adc1a1b..0000000
--- a/bin/ledger/app/page_eviction_manager_impl.h
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_PAGE_EVICTION_MANAGER_IMPL_H_
-#define PERIDOT_BIN_LEDGER_APP_PAGE_EVICTION_MANAGER_IMPL_H_
-
-#include "peridot/bin/ledger/app/page_eviction_manager.h"
-
-#include <memory>
-#include <utility>
-
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/app/page_usage_db.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/coroutine/coroutine_manager.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/storage/public/db_factory.h"
-
-namespace ledger {
-
-class PageEvictionManagerImpl : public PageEvictionManager,
-                                public PageEvictionDelegate {
- public:
-  PageEvictionManagerImpl(Environment* environment,
-                          storage::DbFactory* db_factory, DetachedPath db_path);
-  ~PageEvictionManagerImpl() override;
-
-  // Initializes this PageEvictionManager. |IO_ERROR| will be returned in case
-  // of an error while initializing the underlying database.
-  Status Init();
-
-  // Sets the delegate for this PageEvictionManagerImpl. The delegate should
-  // outlive this object.
-  void SetDelegate(PageEvictionManager::Delegate* delegate);
-
-  // PageEvictionManager:
-  void set_on_empty(fit::closure on_empty_callback) override;
-
-  bool IsEmpty() override;
-
-  void TryEvictPages(PageEvictionPolicy* policy,
-                     fit::function<void(Status)> callback) override;
-
-  void MarkPageOpened(fxl::StringView ledger_name,
-                      storage::PageIdView page_id) override;
-
-  void MarkPageClosed(fxl::StringView ledger_name,
-                      storage::PageIdView page_id) override;
-
-  // PageEvictionDelegate:
-  void TryEvictPage(
-      fxl::StringView ledger_name, storage::PageIdView page_id,
-      PageEvictionCondition condition,
-      fit::function<void(Status, PageWasEvicted)> callback) override;
-
- private:
-  // A token that performs a given action on destruction. ExpiringToken objects
-  // are used to keep track of pending operations.
-  using ExpiringToken = fit::deferred_action<fit::closure>;
-
-  // A Completer allowing waiting until the target operation is completed.
-  class Completer {
-   public:
-    Completer();
-
-    ~Completer();
-
-    // Completes the operation with the given status and unblocks all pending
-    // |WaitUntilDone| calls. |Complete| can only be called once.
-    void Complete(Status status);
-
-    // Blocks execution until |Complete| is called, and then returns its status.
-    // If the operation is already completed, |WaitUntilDone| returns
-    // immediately with the result status.
-    Status WaitUntilDone(coroutine::CoroutineHandler* handler);
-
-   private:
-    // Marks the Completer as completed with the given status and calls the
-    // pending callbacks.
-    void CallCallbacks(Status status);
-
-    bool completed_ = false;
-    Status status_;
-    // Closures invoked upon completion to unblock the waiting coroutines.
-    std::vector<fit::closure> callbacks_;
-
-    FXL_DISALLOW_COPY_AND_ASSIGN(Completer);
-  };
-
-  // Removes the page from the local storage.
-  void EvictPage(fxl::StringView ledger_name, storage::PageIdView page_id,
-                 fit::function<void(Status)> callback);
-
-  // Checks whether a page can be evicted. A page can be evicted if it is
-  // currently closed and either:
-  // - has no unsynced commits or objects, or
-  // - is empty and offline, i.e. was never synced to the cloud or a peer.
-  Status CanEvictPage(coroutine::CoroutineHandler* handler,
-                      fxl::StringView ledger_name, storage::PageIdView page_id,
-                      bool* can_evict);
-
-  // Checks whether a page is closed, offline and empty, and thus can be
-  // evicted.
-  Status CanEvictEmptyPage(coroutine::CoroutineHandler* handler,
-                           fxl::StringView ledger_name,
-                           storage::PageIdView page_id, bool* can_evict);
-
-  // Marks the given page as evicted in the page usage database.
-  void MarkPageEvicted(std::string ledger_name, storage::PageId page_id);
-
-  Status SynchronousTryEvictPage(coroutine::CoroutineHandler* handler,
-                                 std::string ledger_name,
-                                 storage::PageId page_id,
-                                 PageEvictionCondition condition,
-                                 PageWasEvicted* was_evicted);
-
-  ExpiringToken NewExpiringToken();
-
-  Environment* environment_;
-  // The initialization completer. |Init| method starts marking pages as closed,
-  // and returns before that operation is done. This completer makes sure that
-  // all methods accessing the page usage database wait until the initialization
-  // has finished, before reading or updating information.
-  Completer initialization_completer_;
-  // A closure to be called every time all pending operations are completed.
-  fit::closure on_empty_callback_;
-  ssize_t pending_operations_ = 0;
-  PageEvictionManager::Delegate* delegate_ = nullptr;
-  // |db_factory_| and |db_path_| should only be used during initialization.
-  // After Init() has been called their contents are no longer valid.
-  storage::DbFactory* db_factory_;
-  DetachedPath db_path_;
-  std::unique_ptr<PageUsageDb> db_;
-  coroutine::CoroutineManager coroutine_manager_;
-
-  // Must be the last member.
-  fxl::WeakPtrFactory<PageEvictionManagerImpl> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageEvictionManagerImpl);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_PAGE_EVICTION_MANAGER_IMPL_H_
diff --git a/bin/ledger/app/page_eviction_manager_impl_unittest.cc b/bin/ledger/app/page_eviction_manager_impl_unittest.cc
deleted file mode 100644
index cb5fb2d..0000000
--- a/bin/ledger/app/page_eviction_manager_impl_unittest.cc
+++ /dev/null
@@ -1,509 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_eviction_manager_impl.h"
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/storage/fake/fake_db_factory.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace ledger {
-namespace {
-
-using ::testing::ElementsAre;
-using ::testing::IsEmpty;
-
-class FakeDelegate : public PageEvictionManager::Delegate {
- public:
-  void PageIsClosedAndSynced(
-      fxl::StringView /*ledger_name*/, storage::PageIdView /*page_id*/,
-      fit::function<void(Status, PagePredicateResult)> callback) override {
-    callback(page_closed_and_synced_status, closed_and_synced);
-  }
-
-  void PageIsClosedOfflineAndEmpty(
-      fxl::StringView ledger_name, storage::PageIdView page_id,
-      fit::function<void(Status, PagePredicateResult)> callback) override {
-    callback(Status::OK, closed_and_empty);
-  }
-
-  void DeletePageStorage(fxl::StringView /*ledger_name*/,
-                         storage::PageIdView page_id,
-                         fit::function<void(Status)> callback) override {
-    deleted_pages.push_back(page_id.ToString());
-    callback(Status::OK);
-  }
-
-  std::vector<storage::PageId> deleted_pages;
-
-  PagePredicateResult closed_and_synced = PagePredicateResult::YES;
-  Status page_closed_and_synced_status = Status::OK;
-
-  PagePredicateResult closed_and_empty = PagePredicateResult::YES;
-};
-
-class PageEvictionManagerTest : public TestWithEnvironment {
- public:
-  PageEvictionManagerTest()
-      : db_factory_(environment_.dispatcher()),
-        page_eviction_manager_(&environment_, &db_factory_,
-                               DetachedPath(tmpfs_.root_fd())),
-        policy_(NewLeastRecentyUsedPolicy(environment_.coroutine_service(),
-                                          &page_eviction_manager_)) {}
-
-  // TestWithEnvironment:
-  void SetUp() override {
-    EXPECT_EQ(Status::OK, page_eviction_manager_.Init());
-    RunLoopUntilIdle();
-    page_eviction_manager_.SetDelegate(&delegate_);
-  }
-
- private:
-  scoped_tmpfs::ScopedTmpFS tmpfs_;
-  storage::fake::FakeDbFactory db_factory_;
-
- protected:
-  FakeDelegate delegate_;
-  PageEvictionManagerImpl page_eviction_manager_;
-  std::unique_ptr<PageEvictionPolicy> policy_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageEvictionManagerTest);
-};
-
-TEST_F(PageEvictionManagerTest, NoEvictionWithoutPages) {
-  bool called;
-  Status status;
-
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-}
-
-TEST_F(PageEvictionManagerTest, AtLeastOneEvictionWhenPossible) {
-  std::string ledger_name = "ledger";
-  storage::PageId page1 = std::string(::fuchsia::ledger::kPageIdSize, '1');
-  storage::PageId page2 = std::string(::fuchsia::ledger::kPageIdSize, '2');
-
-  delegate_.closed_and_synced = PagePredicateResult::YES;
-
-  page_eviction_manager_.MarkPageOpened(ledger_name, page1);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page1);
-  page_eviction_manager_.MarkPageOpened(ledger_name, page2);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page2);
-  RunLoopUntilIdle();
-
-  bool called;
-  Status status;
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(delegate_.deleted_pages.empty());
-}
-
-TEST_F(PageEvictionManagerTest, DontEvictUnsyncedNotEmptyPages) {
-  std::string ledger_name = "ledger";
-  storage::PageId page1 = std::string(::fuchsia::ledger::kPageIdSize, '1');
-  storage::PageId page2 = std::string(::fuchsia::ledger::kPageIdSize, '2');
-
-  delegate_.closed_and_synced = PagePredicateResult::NO;
-  delegate_.closed_and_empty = PagePredicateResult::NO;
-
-  page_eviction_manager_.MarkPageOpened(ledger_name, page1);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page1);
-  page_eviction_manager_.MarkPageOpened(ledger_name, page2);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page2);
-  RunLoopUntilIdle();
-
-  bool called;
-  Status status;
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-}
-
-TEST_F(PageEvictionManagerTest, DontEvictOpenPages) {
-  std::string ledger_name = "ledger";
-  storage::PageId page = std::string(::fuchsia::ledger::kPageIdSize, '1');
-
-  delegate_.closed_and_synced = PagePredicateResult::YES;
-
-  page_eviction_manager_.MarkPageOpened(ledger_name, page);
-  RunLoopUntilIdle();
-
-  bool called;
-  Status status;
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-
-  // Close the page. It can now be evicted.
-  page_eviction_manager_.MarkPageClosed(ledger_name, page);
-  RunLoopUntilIdle();
-
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate_.deleted_pages, ElementsAre(page));
-}
-
-TEST_F(PageEvictionManagerTest, DontEvictAnEvictedPage) {
-  std::string ledger_name = "ledger";
-  storage::PageId page = std::string(::fuchsia::ledger::kPageIdSize, '1');
-
-  delegate_.closed_and_synced = PagePredicateResult::YES;
-
-  page_eviction_manager_.MarkPageOpened(ledger_name, page);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page);
-  RunLoopUntilIdle();
-
-  bool called;
-  Status status;
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate_.deleted_pages, ElementsAre(page));
-
-  delegate_.deleted_pages.clear();
-  // Try to clean up again. We shouldn't be able to evict any pages.
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-}
-
-TEST_F(PageEvictionManagerTest, PageNotFoundIsNotAnError) {
-  std::string ledger_name = "ledger";
-  storage::PageId page = std::string(::fuchsia::ledger::kPageIdSize, '1');
-
-  delegate_.closed_and_synced = PagePredicateResult::YES;
-
-  page_eviction_manager_.MarkPageOpened(ledger_name, page);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page);
-  RunLoopUntilIdle();
-
-  delegate_.page_closed_and_synced_status = Status::PAGE_NOT_FOUND;
-
-  bool called;
-  Status status;
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-}
-
-TEST_F(PageEvictionManagerTest, EvictUnsyncedButEmptyPages) {
-  std::string ledger_name = "ledger";
-  storage::PageId page1 = std::string(::fuchsia::ledger::kPageIdSize, '1');
-  storage::PageId page2 = std::string(::fuchsia::ledger::kPageIdSize, '2');
-
-  delegate_.closed_and_synced = PagePredicateResult::NO;
-  delegate_.closed_and_empty = PagePredicateResult::YES;
-
-  page_eviction_manager_.MarkPageOpened(ledger_name, page1);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page1);
-  page_eviction_manager_.MarkPageOpened(ledger_name, page2);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page2);
-  RunLoopUntilIdle();
-
-  bool called;
-  Status status;
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate_.deleted_pages, ElementsAre(page1));
-}
-
-TEST_F(PageEvictionManagerTest, EvictSyncedAndNotEmptyPages) {
-  std::string ledger_name = "ledger";
-  storage::PageId page1 = std::string(::fuchsia::ledger::kPageIdSize, '1');
-  storage::PageId page2 = std::string(::fuchsia::ledger::kPageIdSize, '2');
-
-  delegate_.closed_and_synced = PagePredicateResult::YES;
-  delegate_.closed_and_empty = PagePredicateResult::NO;
-
-  page_eviction_manager_.MarkPageOpened(ledger_name, page1);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page1);
-  page_eviction_manager_.MarkPageOpened(ledger_name, page2);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page2);
-  RunLoopUntilIdle();
-
-  bool called;
-  Status status;
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate_.deleted_pages, ElementsAre(page1));
-}
-
-TEST_F(PageEvictionManagerTest, DontEvictIfPageWasOpenedDuringQuery) {
-  std::string ledger_name = "ledger";
-  storage::PageId page1 = std::string(::fuchsia::ledger::kPageIdSize, '1');
-  storage::PageId page2 = std::string(::fuchsia::ledger::kPageIdSize, '2');
-
-  // Page is offline and synced, but PageIsClosedOfflineAndEmpty returned
-  // |PAGE_OPENED|, meaning it was opened during the operation. The page cannot
-  // be evicted.
-  delegate_.closed_and_synced = PagePredicateResult::YES;
-  delegate_.closed_and_empty = PagePredicateResult::PAGE_OPENED;
-
-  page_eviction_manager_.MarkPageOpened(ledger_name, page1);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page1);
-  page_eviction_manager_.MarkPageOpened(ledger_name, page2);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page2);
-  RunLoopUntilIdle();
-
-  bool called;
-  Status status;
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-  delegate_.deleted_pages.clear();
-
-  // Page is offline and empty, but PageIsClosedAndSynced returned
-  // |PAGE_OPENED|. The page cannot be evicted.
-  delegate_.closed_and_synced = PagePredicateResult::PAGE_OPENED;
-  delegate_.closed_and_empty = PagePredicateResult::YES;
-
-  page_eviction_manager_.MarkPageOpened(ledger_name, page2);
-  page_eviction_manager_.MarkPageClosed(ledger_name, page2);
-  RunLoopUntilIdle();
-
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-}
-
-TEST_F(PageEvictionManagerTest, IsEmpty) {
-  std::string ledger_name = "ledger";
-  storage::PageId page = std::string(::fuchsia::ledger::kPageIdSize, '1');
-  bool on_empty_called = false;
-
-  page_eviction_manager_.set_on_empty([&] { on_empty_called = true; });
-
-  EXPECT_TRUE(page_eviction_manager_.IsEmpty());
-  EXPECT_FALSE(on_empty_called);
-
-  // PageEvictionManagerImpl should be empty if there is no pending operation
-  // on: OnPageOpened, OnPageClosed, or TryEvictPages.
-  on_empty_called = false;
-  page_eviction_manager_.MarkPageOpened(ledger_name, page);
-  EXPECT_FALSE(page_eviction_manager_.IsEmpty());
-  EXPECT_FALSE(on_empty_called);
-  RunLoopUntilIdle();
-  EXPECT_TRUE(page_eviction_manager_.IsEmpty());
-  EXPECT_TRUE(on_empty_called);
-
-  on_empty_called = false;
-  page_eviction_manager_.MarkPageClosed(ledger_name, page);
-  EXPECT_FALSE(page_eviction_manager_.IsEmpty());
-  EXPECT_FALSE(on_empty_called);
-  RunLoopUntilIdle();
-  EXPECT_TRUE(page_eviction_manager_.IsEmpty());
-  EXPECT_TRUE(on_empty_called);
-
-  bool called;
-  Status status;
-  on_empty_called = false;
-  page_eviction_manager_.TryEvictPages(
-      policy_.get(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  EXPECT_FALSE(page_eviction_manager_.IsEmpty());
-  EXPECT_FALSE(on_empty_called);
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(page_eviction_manager_.IsEmpty());
-  EXPECT_TRUE(on_empty_called);
-}
-
-TEST_F(PageEvictionManagerTest, TryEvictPage) {
-  std::string ledger_name = "ledger";
-  storage::PageId page = std::string(::fuchsia::ledger::kPageIdSize, '1');
-
-  // The page is not evicted if the result from PageIsClosedOfflineAndEmpty and
-  // from PageIsClosedAndSynced is |NO|.
-  delegate_.closed_and_empty = PagePredicateResult::NO;
-  delegate_.closed_and_synced = PagePredicateResult::NO;
-
-  bool called;
-  Status status;
-  PageWasEvicted was_evicted;
-  page_eviction_manager_.TryEvictPage(
-      ledger_name, page, PageEvictionCondition::IF_POSSIBLE,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &was_evicted));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(was_evicted);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-
-  // The page is not evicted if the result from PageIsClosedOfflineAndEmpty is
-  // |PAGE_OPENED|.
-  delegate_.closed_and_empty = PagePredicateResult::PAGE_OPENED;
-  delegate_.closed_and_synced = PagePredicateResult::YES;
-  page_eviction_manager_.TryEvictPage(
-      ledger_name, page, PageEvictionCondition::IF_POSSIBLE,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &was_evicted));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(was_evicted);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-
-  // The page is not evicted if the result from PageIsClosedAndSynced is
-  // |PAGE_OPENED|.
-  delegate_.closed_and_empty = PagePredicateResult::YES;
-  delegate_.closed_and_synced = PagePredicateResult::PAGE_OPENED;
-  page_eviction_manager_.TryEvictPage(
-      ledger_name, page, PageEvictionCondition::IF_POSSIBLE,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &was_evicted));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(was_evicted);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-
-  // The page is evicted if the result from PageIsClosedOfflineAndEmpty is
-  // |YES|.
-  delegate_.closed_and_empty = PagePredicateResult::YES;
-  delegate_.closed_and_synced = PagePredicateResult::NO;
-  page_eviction_manager_.TryEvictPage(
-      ledger_name, page, PageEvictionCondition::IF_POSSIBLE,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &was_evicted));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(was_evicted);
-  EXPECT_THAT(delegate_.deleted_pages, ElementsAre(page));
-
-  // The page is evicted if the result from PageIsClosedAndSynced is |YES|.
-  delegate_.deleted_pages.clear();
-  delegate_.closed_and_empty = PagePredicateResult::NO;
-  delegate_.closed_and_synced = PagePredicateResult::YES;
-  page_eviction_manager_.TryEvictPage(
-      ledger_name, page, PageEvictionCondition::IF_POSSIBLE,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &was_evicted));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(was_evicted);
-  EXPECT_THAT(delegate_.deleted_pages, ElementsAre(page));
-}
-
-TEST_F(PageEvictionManagerTest, EvictEmptyPage) {
-  std::string ledger_name = "ledger";
-  storage::PageId page = std::string(::fuchsia::ledger::kPageIdSize, '1');
-
-  // The page is not evicted if the result from PageIsClosedOfflineAndEmpty is
-  // |NO|.
-  delegate_.closed_and_empty = PagePredicateResult::NO;
-
-  bool called;
-  Status status;
-  PageWasEvicted was_evicted;
-  page_eviction_manager_.TryEvictPage(
-      ledger_name, page, PageEvictionCondition::IF_EMPTY,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &was_evicted));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(was_evicted);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-
-  // The page is not evicted if the result from PageIsClosedOfflineAndEmpty is
-  // |PAGE_OPENED|.
-  delegate_.closed_and_empty = PagePredicateResult::PAGE_OPENED;
-  page_eviction_manager_.TryEvictPage(
-      ledger_name, page, PageEvictionCondition::IF_EMPTY,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &was_evicted));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(was_evicted);
-  EXPECT_THAT(delegate_.deleted_pages, IsEmpty());
-
-  // The page is evicted if the result from PageIsClosedOfflineAndEmpty is
-  // |YES|.
-  delegate_.closed_and_empty = PagePredicateResult::YES;
-  page_eviction_manager_.TryEvictPage(
-      ledger_name, page, PageEvictionCondition::IF_EMPTY,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &was_evicted));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(was_evicted);
-  EXPECT_THAT(delegate_.deleted_pages, ElementsAre(page));
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/page_eviction_policies.cc b/bin/ledger/app/page_eviction_policies.cc
deleted file mode 100644
index df9af41..0000000
--- a/bin/ledger/app/page_eviction_policies.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_eviction_policies.h"
-
-#include "peridot/bin/ledger/coroutine/coroutine_manager.h"
-
-namespace ledger {
-namespace {
-
-// Computes the list of PageInfo for all pages that are not currently open,
-// ordered by the timestamp of their last usage, in ascending order.
-Status GetPagesByTimestamp(
-    std::unique_ptr<storage::Iterator<const PageInfo>> pages_it,
-    std::vector<PageInfo>* sorted_pages) {
-  std::vector<PageInfo> pages;
-  while (pages_it->Valid()) {
-    // Sort out pages that are currently in use, i.e. those for which timestamp
-    // is |PageInfo::kOpenedPageTimestamp|.
-    if ((*pages_it)->timestamp != PageInfo::kOpenedPageTimestamp) {
-      pages.push_back(**pages_it);
-    }
-    pages_it->Next();
-  }
-
-  // Order pages by the last used timestamp.
-  std::sort(
-      pages.begin(), pages.end(),
-      [](const PageInfo& info1, const PageInfo& info2) {
-        return std::tie(info1.timestamp, info1.ledger_name, info1.page_id) <
-               std::tie(info2.timestamp, info2.ledger_name, info2.page_id);
-      });
-
-  sorted_pages->swap(pages);
-  return Status::OK;
-}
-
-class LeastRecentlyUsedPageEvictionPolicy : public PageEvictionPolicy {
- public:
-  LeastRecentlyUsedPageEvictionPolicy(
-      coroutine::CoroutineService* coroutine_service,
-      PageEvictionDelegate* delegate);
-
-  void SelectAndEvict(std::unique_ptr<storage::Iterator<const PageInfo>> pages,
-                      fit::function<void(Status)> callback) override;
-
- private:
-  PageEvictionDelegate* delegate_;
-  coroutine::CoroutineManager coroutine_manager_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LeastRecentlyUsedPageEvictionPolicy);
-};
-
-LeastRecentlyUsedPageEvictionPolicy::LeastRecentlyUsedPageEvictionPolicy(
-    coroutine::CoroutineService* coroutine_service,
-    PageEvictionDelegate* delegate)
-    : delegate_(delegate), coroutine_manager_(coroutine_service) {}
-
-void LeastRecentlyUsedPageEvictionPolicy::SelectAndEvict(
-    std::unique_ptr<storage::Iterator<const PageInfo>> pages_it,
-    fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback), [this, pages_it = std::move(pages_it)](
-                               coroutine::CoroutineHandler* handler,
-                               fit::function<void(Status)> callback) mutable {
-        std::vector<PageInfo> pages;
-        Status status = GetPagesByTimestamp(std::move(pages_it), &pages);
-        if (status != Status::OK) {
-          callback(status);
-          return;
-        }
-        for (const auto& page_info : pages) {
-          PageWasEvicted was_evicted;
-          auto sync_call_status = coroutine::SyncCall(
-              handler,
-              [this, ledger_name = std::move(page_info.ledger_name),
-               page_id = std::move(page_info.page_id)](auto callback) {
-                delegate_->TryEvictPage(ledger_name, page_id,
-                                        PageEvictionCondition::IF_POSSIBLE,
-                                        std::move(callback));
-              },
-              &status, &was_evicted);
-          if (sync_call_status == coroutine::ContinuationStatus::INTERRUPTED) {
-            callback(Status::INTERNAL_ERROR);
-            return;
-          }
-          if (status != Status::OK || was_evicted) {
-            callback(status);
-            return;
-          }
-        }
-        callback(Status::OK);
-      });
-}
-
-}  // namespace
-
-std::unique_ptr<PageEvictionPolicy> NewLeastRecentyUsedPolicy(
-    coroutine::CoroutineService* coroutine_service,
-    PageEvictionDelegate* delegate) {
-  return std::make_unique<LeastRecentlyUsedPageEvictionPolicy>(
-      coroutine_service, delegate);
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/page_eviction_policies.h b/bin/ledger/app/page_eviction_policies.h
deleted file mode 100644
index 2bb8d68..0000000
--- a/bin/ledger/app/page_eviction_policies.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_PAGE_EVICTION_POLICIES_H_
-#define PERIDOT_BIN_LEDGER_APP_PAGE_EVICTION_POLICIES_H_
-
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/app/types.h"
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/iterator.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-
-using PageWasEvicted = bool;
-
-// The policy for evicting pages.
-class PageEvictionPolicy {
- public:
-  PageEvictionPolicy() {}
-  virtual ~PageEvictionPolicy() {}
-
-  // Given an iterator over all pages currently stored on disk, chooses and
-  // tries to evict those that match the implementing policy. The status
-  // returned through the |callback| will be |IO_ERROR| in case of failure
-  // during trying to evict a page; |OK| otherwise. It is not an error if no
-  // page was evited.
-  virtual void SelectAndEvict(
-      std::unique_ptr<storage::Iterator<const PageInfo>> pages,
-      fit::function<void(Status)> callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageEvictionPolicy);
-};
-
-// The condition to be checked before evicting a page.
-enum PageEvictionCondition {
-  // Indicates the page should be deleted if possible.
-  IF_POSSIBLE,
-  // Indicates the page should be deleted only if it is empty and offline.
-  IF_EMPTY,
-};
-
-// The delegate used for the |PageEvictionPolicy|. Provides the methods
-// necessary to evict pages.
-class PageEvictionDelegate {
- public:
-  PageEvictionDelegate() {}
-  virtual ~PageEvictionDelegate() {}
-
-  // Checks whether the given page can be evicted based on the given
-  // |condition| and if it can, evicts it. Note that evicting a page with
-  // |IF_EMPTY| has no observable effect for the user, i.e. doesn't break the
-  // offline case. |IF_POSSIBLE| on the other hand means that a completely
-  // synced page might be evicted, and thus become unavailable to the user, if
-  // offline. Returns |IO_ERROR| through the callback in case of failure while
-  // retrieving information on the page, or when trying to evict it; |OK|
-  // otherwise. The boolean in the callback indicates whether the page was
-  // evicted.
-  virtual void TryEvictPage(
-      fxl::StringView ledger_name, storage::PageIdView page_id,
-      PageEvictionCondition condition,
-      fit::function<void(Status, PageWasEvicted)> callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageEvictionDelegate);
-};
-
-// Creates and returns a new Least-Recently-Used policy, which evicts the least
-// recently used page among those that can be evicted. The given delegate should
-// outlive the returned object.
-std::unique_ptr<PageEvictionPolicy> NewLeastRecentyUsedPolicy(
-    coroutine::CoroutineService* corroutine_service,
-    PageEvictionDelegate* delegate);
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_PAGE_EVICTION_POLICIES_H_
diff --git a/bin/ledger/app/page_eviction_policies_unittest.cc b/bin/ledger/app/page_eviction_policies_unittest.cc
deleted file mode 100644
index a2e08fe..0000000
--- a/bin/ledger/app/page_eviction_policies_unittest.cc
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_eviction_policies.h"
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-
-namespace ledger {
-namespace {
-
-using ::testing::ElementsAre;
-using ::testing::IsEmpty;
-
-// A wrapper storage::Iterator for the elements of an std::vector<T>.
-template <class T>
-class VectorIterator : public storage::Iterator<T> {
- public:
-  VectorIterator(const std::vector<T>& v) : it_(v.begin()), end_(v.end()) {}
-
-  ~VectorIterator() {}
-
-  storage::Iterator<T>& Next() override {
-    ++it_;
-    return *this;
-  }
-
-  bool Valid() const override { return it_ != end_; }
-
-  storage::Status GetStatus() const override { return storage::Status::OK; }
-
-  T& operator*() const override { return *it_; }
-
-  T* operator->() const override { return &*it_; }
-
- private:
-  typename std::vector<T>::iterator it_;
-  typename std::vector<T>::iterator end_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(VectorIterator);
-};
-
-// A fake PageEvictionDelegate, that stores the set of pages that were evicted.
-class FakePageEvictionDelegate : public PageEvictionDelegate {
- public:
-  FakePageEvictionDelegate() {}
-  ~FakePageEvictionDelegate() {}
-
-  void TryEvictPage(fxl::StringView ledger_name, storage::PageIdView page_id,
-                    PageEvictionCondition condition,
-                    fit::function<void(Status, PageWasEvicted)> callback) {
-    if (try_evict_page_status_ != Status::OK) {
-      callback(try_evict_page_status_, PageWasEvicted(false));
-      return;
-    }
-    if (pages_not_to_evict_.find(page_id.ToString()) !=
-        pages_not_to_evict_.end()) {
-      callback(Status::OK, PageWasEvicted(false));
-      return;
-    }
-    evicted_pages_.push_back(page_id.ToString());
-    callback(Status::OK, PageWasEvicted(true));
-  }
-
-  const std::vector<storage::PageId>& GetEvictedPages() {
-    return evicted_pages_;
-  }
-
-  void SetPagesNotToEvict(std::set<storage::PageId> pages_not_to_evict) {
-    pages_not_to_evict_ = std::move(pages_not_to_evict);
-  }
-
-  void SetTryEvictPageStatus(Status status) { try_evict_page_status_ = status; }
-
- private:
-  // The vector of pages for which |TryEvictPage| returned PageWasEvicted(true).
-  std::vector<storage::PageId> evicted_pages_;
-  // Pages in this set will return PageWasEvicted(false) if TryEvictPage is
-  // called on them.
-  std::set<storage::PageId> pages_not_to_evict_;
-  // The status to be returned by |TryEvictPage|.
-  Status try_evict_page_status_ = Status::OK;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakePageEvictionDelegate);
-};
-
-using PageEvictionPoliciesTest = TestWithEnvironment;
-
-TEST_F(PageEvictionPoliciesTest, LeastRecentyUsed) {
-  FakePageEvictionDelegate delegate;
-  std::string ledger_name = "ledger";
-  std::vector<const PageInfo> pages = {
-      {ledger_name, "page1", zx::time_utc(1)},
-      {ledger_name, "page2", zx::time_utc(2)},
-      {ledger_name, "page3", zx::time_utc(3)},
-      {ledger_name, "page4", zx::time_utc(4)},
-  };
-
-  std::unique_ptr<PageEvictionPolicy> policy =
-      NewLeastRecentyUsedPolicy(environment_.coroutine_service(), &delegate);
-
-  // Expect to only evict the least recently used page, i.e. "page1".
-  bool called;
-  Status status;
-  policy->SelectAndEvict(
-      std::make_unique<VectorIterator<const PageInfo>>(pages),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate.GetEvictedPages(), ElementsAre("page1"));
-}
-
-TEST_F(PageEvictionPoliciesTest, LeastRecentyUsedWithOpenPages) {
-  FakePageEvictionDelegate delegate;
-  std::string ledger_name = "ledger";
-  std::vector<const PageInfo> pages = {
-      {ledger_name, "page1", PageInfo::kOpenedPageTimestamp},
-      {ledger_name, "page2", zx::time_utc(2)},
-      {ledger_name, "page3", zx::time_utc(3)},
-      {ledger_name, "page4", zx::time_utc(4)},
-  };
-
-  std::unique_ptr<PageEvictionPolicy> policy =
-      NewLeastRecentyUsedPolicy(environment_.coroutine_service(), &delegate);
-
-  // "page1" should not be evicted as it is marked as open. Expect to only evict
-  // the least recently used page, i.e. "page2".
-  bool called;
-  Status status;
-  policy->SelectAndEvict(
-      std::make_unique<VectorIterator<const PageInfo>>(pages),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate.GetEvictedPages(), ElementsAre("page2"));
-}
-
-TEST_F(PageEvictionPoliciesTest, LeastRecentyUsedNoPagesToEvict) {
-  FakePageEvictionDelegate delegate;
-  std::string ledger_name = "ledger";
-  std::vector<const PageInfo> pages = {
-      {ledger_name, "page1", PageInfo::kOpenedPageTimestamp},
-      {ledger_name, "page2", zx::time_utc(2)},
-      {ledger_name, "page3", zx::time_utc(3)},
-      {ledger_name, "page4", zx::time_utc(4)},
-  };
-
-  delegate.SetPagesNotToEvict({"page2", "page3", "page4"});
-
-  std::unique_ptr<PageEvictionPolicy> policy =
-      NewLeastRecentyUsedPolicy(environment_.coroutine_service(), &delegate);
-
-  // "page1" is marked as open, and pages 2-4 will fail to be evicted. The
-  // returned status should be ok, and not pages will be evicted.
-  bool called;
-  Status status;
-  policy->SelectAndEvict(
-      std::make_unique<VectorIterator<const PageInfo>>(pages),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_THAT(delegate.GetEvictedPages(), IsEmpty());
-}
-
-TEST_F(PageEvictionPoliciesTest, LeastRecentyUsedErrorWhileEvicting) {
-  FakePageEvictionDelegate delegate;
-  std::string ledger_name = "ledger";
-  std::vector<const PageInfo> pages = {
-      {ledger_name, "page1", zx::time_utc(1)},
-      {ledger_name, "page2", zx::time_utc(2)},
-      {ledger_name, "page3", zx::time_utc(3)},
-      {ledger_name, "page4", zx::time_utc(4)},
-  };
-  delegate.SetTryEvictPageStatus(Status::INTERNAL_ERROR);
-
-  // If |TryEvictPage| fails, so should |SelectAndEvict|. Expect to find the
-  // same error status.
-  std::unique_ptr<PageEvictionPolicy> policy =
-      NewLeastRecentyUsedPolicy(environment_.coroutine_service(), &delegate);
-  bool called;
-  Status status;
-  policy->SelectAndEvict(
-      std::make_unique<VectorIterator<const PageInfo>>(pages),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::INTERNAL_ERROR, status);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/page_impl.cc b/bin/ledger/app/page_impl.cc
deleted file mode 100644
index 32946f3..0000000
--- a/bin/ledger/app/page_impl.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_impl.h"
-
-#include <lib/callback/trace_callback.h>
-#include <lib/fxl/logging.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/app/page_delaying_facade.h"
-
-namespace ledger {
-
-PageImpl::PageImpl(PageDelayingFacade* delaying_facade)
-    : delaying_facade_(delaying_facade) {}
-
-PageImpl::~PageImpl() {}
-
-void PageImpl::GetId(GetIdCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "page_get_id");
-  delaying_facade_->GetId(std::move(timed_callback));
-}
-
-void PageImpl::GetSnapshot(
-    fidl::InterfaceRequest<PageSnapshot> snapshot_request,
-    std::vector<uint8_t> key_prefix,
-    fidl::InterfaceHandle<PageWatcher> watcher, GetSnapshotCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "page_get_snapshot");
-  delaying_facade_->GetSnapshot(std::move(snapshot_request),
-                                std::move(key_prefix), std::move(watcher),
-                                std::move(timed_callback));
-}
-
-void PageImpl::Put(std::vector<uint8_t> key, std::vector<uint8_t> value,
-                   PutCallback callback) {
-  PutWithPriority(std::move(key), std::move(value), Priority::EAGER,
-                  std::move(callback));
-}
-
-void PageImpl::PutWithPriority(std::vector<uint8_t> key,
-                               std::vector<uint8_t> value,
-                               Priority priority,
-                               PutWithPriorityCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "page_put_with_priority");
-  delaying_facade_->PutWithPriority(std::move(key), std::move(value), priority,
-                                    std::move(timed_callback));
-}
-
-void PageImpl::PutReference(std::vector<uint8_t> key, Reference reference,
-                            Priority priority, PutReferenceCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "page_put_reference");
-  delaying_facade_->PutReference(std::move(key), std::move(reference), priority,
-                                 std::move(timed_callback));
-}
-
-void PageImpl::Delete(std::vector<uint8_t> key, DeleteCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "page_delete");
-  delaying_facade_->Delete(std::move(key), std::move(timed_callback));
-}
-
-void PageImpl::Clear(ClearCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "page_clear");
-  delaying_facade_->Clear(std::move(timed_callback));
-}
-
-void PageImpl::CreateReferenceFromSocket(
-    uint64_t size, zx::socket data,
-    CreateReferenceFromSocketCallback callback) {
-  auto timed_callback = TRACE_CALLBACK(std::move(callback), "ledger",
-                                       "page_create_reference_from_socket");
-  delaying_facade_->CreateReference(
-      storage::DataSource::Create(std::move(data), size),
-      std::move(timed_callback));
-}
-
-void PageImpl::CreateReferenceFromBuffer(
-    fuchsia::mem::Buffer data, CreateReferenceFromBufferCallback callback) {
-  auto timed_callback = TRACE_CALLBACK(std::move(callback), "ledger",
-                                       "page_create_reference_from_vmo");
-  fsl::SizedVmo vmo;
-  if (!fsl::SizedVmo::FromTransport(std::move(data), &vmo)) {
-    callback(Status::INVALID_ARGUMENT, nullptr);
-    return;
-  }
-  delaying_facade_->CreateReference(storage::DataSource::Create(std::move(vmo)),
-                                    std::move(timed_callback));
-}
-
-void PageImpl::StartTransaction(StartTransactionCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "page_start_transaction");
-  delaying_facade_->StartTransaction(std::move(timed_callback));
-}
-
-void PageImpl::Commit(CommitCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "page_commit");
-  delaying_facade_->Commit(std::move(timed_callback));
-}
-
-void PageImpl::Rollback(RollbackCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "page_rollback");
-  delaying_facade_->Rollback(std::move(timed_callback));
-}
-
-void PageImpl::SetSyncStateWatcher(fidl::InterfaceHandle<SyncWatcher> watcher,
-                                   SetSyncStateWatcherCallback callback) {
-  delaying_facade_->SetSyncStateWatcher(std::move(watcher),
-                                        std::move(callback));
-}
-
-void PageImpl::WaitForConflictResolution(
-    WaitForConflictResolutionCallback callback) {
-  delaying_facade_->WaitForConflictResolution(std::move(callback));
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/page_impl.h b/bin/ledger/app/page_impl.h
deleted file mode 100644
index 2c2c748..0000000
--- a/bin/ledger/app/page_impl.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_PAGE_IMPL_H_
-#define PERIDOT_BIN_LEDGER_APP_PAGE_IMPL_H_
-
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-
-namespace ledger {
-class PageDelayingFacade;
-
-// An implementation of the |Page| FIDL interface.
-class PageImpl : public Page {
- public:
-  explicit PageImpl(PageDelayingFacade* delaying_facade);
-  ~PageImpl() override;
-
- private:
-  // Page:
-  void GetId(GetIdCallback callback) override;
-
-  void GetSnapshot(fidl::InterfaceRequest<PageSnapshot> snapshot_request,
-                   std::vector<uint8_t> key_prefix,
-                   fidl::InterfaceHandle<PageWatcher> watcher,
-                   GetSnapshotCallback callback) override;
-
-  void Put(std::vector<uint8_t> key, std::vector<uint8_t> value,
-           PutCallback callback) override;
-
-  void PutWithPriority(std::vector<uint8_t> key,
-                       std::vector<uint8_t> value, Priority priority,
-                       PutWithPriorityCallback callback) override;
-
-  void PutReference(std::vector<uint8_t> key, Reference reference,
-                    Priority priority, PutReferenceCallback callback) override;
-
-  void Delete(std::vector<uint8_t> key, DeleteCallback callback) override;
-
-  void Clear(ClearCallback callback) override;
-
-  void CreateReferenceFromSocket(
-      uint64_t size, zx::socket data,
-      CreateReferenceFromSocketCallback callback) override;
-
-  void CreateReferenceFromBuffer(
-      fuchsia::mem::Buffer data,
-      CreateReferenceFromBufferCallback callback) override;
-
-  void StartTransaction(StartTransactionCallback callback) override;
-
-  void Commit(CommitCallback callback) override;
-
-  void Rollback(RollbackCallback callback) override;
-
-  void SetSyncStateWatcher(fidl::InterfaceHandle<SyncWatcher> watcher,
-                           SetSyncStateWatcherCallback callback) override;
-
-  void WaitForConflictResolution(
-      WaitForConflictResolutionCallback callback) override;
-
-  PageDelayingFacade* delaying_facade_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageImpl);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_PAGE_IMPL_H_
diff --git a/bin/ledger/app/page_impl_unittest.cc b/bin/ledger/app/page_impl_unittest.cc
deleted file mode 100644
index bf0e35b..0000000
--- a/bin/ledger/app/page_impl_unittest.cc
+++ /dev/null
@@ -1,1753 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_impl.h"
-
-#include <algorithm>
-#include <map>
-#include <memory>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/backoff/exponential_backoff.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_printf.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/fidl/serialization_size.h"
-#include "peridot/bin/ledger/app/merging/merge_resolver.h"
-#include "peridot/bin/ledger/app/page_manager.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/storage/fake/fake_journal.h"
-#include "peridot/bin/ledger/storage/fake/fake_journal_delegate.h"
-#include "peridot/bin/ledger/storage/fake/fake_page_storage.h"
-#include "peridot/bin/ledger/storage/testing/storage_matcher.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/convert/convert.h"
-
-using testing::Contains;
-using testing::ElementsAre;
-using testing::IsEmpty;
-using testing::Key;
-using testing::Not;
-using testing::Pair;
-using testing::SizeIs;
-
-namespace ledger {
-namespace {
-
-std::string ToString(const fuchsia::mem::BufferPtr& vmo) {
-  std::string value;
-  bool status = fsl::StringFromVmo(*vmo, &value);
-  FXL_DCHECK(status);
-  return value;
-}
-
-class PageImplTest : public TestWithEnvironment {
- public:
-  PageImplTest() {}
-  ~PageImplTest() override {}
-
- protected:
-  // ApplicationTestBase:
-  void SetUp() override {
-    ::testing::Test::SetUp();
-    page_id1_ = storage::PageId(::fuchsia::ledger::kPageIdSize, 'a');
-    auto fake_storage = std::make_unique<storage::fake::FakePageStorage>(
-        &environment_, page_id1_);
-    fake_storage_ = fake_storage.get();
-    auto resolver = std::make_unique<MergeResolver>(
-        [] {}, &environment_, fake_storage_,
-        std::make_unique<backoff::ExponentialBackoff>(
-            zx::sec(0), 1u, zx::sec(0),
-            environment_.random()->NewBitGenerator<uint64_t>()));
-    resolver_ = resolver.get();
-
-    manager_ = std::make_unique<PageManager>(
-        &environment_, std::move(fake_storage), nullptr, std::move(resolver),
-        PageManager::PageStorageState::NEEDS_SYNC);
-    bool called;
-    Status status;
-    auto delaying_facade =
-        std::make_unique<PageDelayingFacade>(page_id1_, page_ptr_.NewRequest());
-    manager_->AddPageDelayingFacade(
-        std::move(delaying_facade),
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    DrainLoop();
-  }
-
-  // Run the message loop until there is nothing left to dispatch.
-  void DrainLoop() {
-    RunLoopRepeatedlyFor(storage::fake::kFakePageStorageDelay);
-  }
-
-  void CommitFirstPendingJournal(
-      const std::map<std::string,
-                     std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-          journals) {
-    for (const auto& journal_pair : journals) {
-      const auto& journal = journal_pair.second;
-      if (!journal->IsCommitted() && !journal->IsRolledBack()) {
-        journal->ResolvePendingCommit(storage::Status::OK);
-        return;
-      }
-    }
-  }
-
-  storage::ObjectIdentifier AddObjectToStorage(std::string value_string) {
-    bool called;
-    storage::Status status;
-    storage::ObjectIdentifier object_identifier;
-    fake_storage_->AddObjectFromLocal(
-        storage::ObjectType::BLOB,
-        storage::DataSource::Create(std::move(value_string)),
-        callback::Capture(callback::SetWhenCalled(&called), &status,
-                          &object_identifier));
-    DrainLoop();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-    return object_identifier;
-  }
-
-  std::unique_ptr<const storage::Object> AddObject(const std::string& value) {
-    storage::ObjectIdentifier object_identifier = AddObjectToStorage(value);
-
-    bool called;
-    storage::Status status;
-    std::unique_ptr<const storage::Object> object;
-    fake_storage_->GetObject(
-        object_identifier, storage::PageStorage::Location::LOCAL,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &object));
-    DrainLoop();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(storage::Status::OK, status);
-    return object;
-  }
-
-  std::string GetKey(size_t index, size_t min_key_size = 0u) {
-    std::string result = fxl::StringPrintf("key %04" PRIuMAX, index);
-    result.resize(std::max(result.size(), min_key_size));
-    return result;
-  }
-
-  std::string GetValue(size_t index, size_t min_value_size = 0u) {
-    std::string result = fxl::StringPrintf("val %zu", index);
-    result.resize(std::max(result.size(), min_value_size));
-    return result;
-  }
-
-  void AddEntries(int entry_count, size_t min_key_size = 0u,
-                  size_t min_value_size = 0u) {
-    FXL_DCHECK(entry_count <= 10000);
-    bool called;
-    Status status;
-    page_ptr_->StartTransaction(
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    DrainLoop();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-
-    for (int i = 0; i < entry_count; ++i) {
-      page_ptr_->Put(
-          convert::ToArray(GetKey(i, min_key_size)),
-          convert::ToArray(GetValue(i, min_value_size)),
-          callback::Capture(callback::SetWhenCalled(&called), &status));
-      DrainLoop();
-      EXPECT_TRUE(called);
-      EXPECT_EQ(Status::OK, status);
-    }
-    page_ptr_->Commit(
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    DrainLoop();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-  }
-
-  PageSnapshotPtr GetSnapshot(
-      std::vector<uint8_t> prefix = std::vector<uint8_t>()) {
-    bool called;
-    Status status;
-    PageSnapshotPtr snapshot;
-    page_ptr_->GetSnapshot(
-        snapshot.NewRequest(), std::move(prefix), nullptr,
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    DrainLoop();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(status, Status::OK);
-    return snapshot;
-  }
-
-  storage::PageId page_id1_;
-  storage::fake::FakePageStorage* fake_storage_;
-  std::unique_ptr<PageManager> manager_;
-  MergeResolver* resolver_;
-
-  PagePtr page_ptr_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageImplTest);
-};
-
-TEST_F(PageImplTest, GetId) {
-  bool called;
-  PageId page_id;
-  page_ptr_->GetId(
-      callback::Capture(callback::SetWhenCalled(&called), &page_id));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(page_id1_, convert::ToString(page_id.id));
-}
-
-TEST_F(PageImplTest, PutNoTransaction) {
-  std::string key("some_key");
-  std::string value("a small value");
-  bool called;
-  Status status;
-  page_ptr_->Put(convert::ToArray(key), convert::ToArray(value),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  auto objects = fake_storage_->GetObjects();
-  EXPECT_EQ(1u, objects.size());
-  storage::ObjectIdentifier object_identifier = objects.begin()->first;
-  std::string actual_value = objects.begin()->second;
-  EXPECT_EQ(value, actual_value);
-
-  const std::map<std::string,
-                 std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-      journals = fake_storage_->GetJournals();
-  EXPECT_EQ(1u, journals.size());
-  auto it = journals.begin();
-  EXPECT_TRUE(it->second->IsCommitted());
-  EXPECT_EQ(1u, it->second->GetData().size());
-  storage::Entry entry = it->second->GetData().at(key);
-  EXPECT_EQ(object_identifier, entry.object_identifier);
-  EXPECT_EQ(storage::KeyPriority::EAGER, entry.priority);
-}
-
-TEST_F(PageImplTest, PutReferenceNoTransaction) {
-  std::string object_data("some_data");
-  fsl::SizedVmo vmo;
-  ASSERT_TRUE(fsl::VmoFromString(object_data, &vmo));
-
-  bool called;
-  Status status;
-  ReferencePtr reference;
-  page_ptr_->CreateReferenceFromBuffer(
-      std::move(vmo).ToTransport(),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &reference));
-  DrainLoop();
-
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  std::string key("some_key");
-  page_ptr_->PutReference(
-      convert::ToArray(key), std::move(*reference), Priority::LAZY,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  auto objects = fake_storage_->GetObjects();
-  // No object should have been added.
-  EXPECT_EQ(1u, objects.size());
-
-  const std::map<std::string,
-                 std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-      journals = fake_storage_->GetJournals();
-  EXPECT_EQ(1u, journals.size());
-  auto it = journals.begin();
-  EXPECT_TRUE(it->second->IsCommitted());
-  EXPECT_EQ(1u, it->second->GetData().size());
-  storage::Entry entry = it->second->GetData().at(key);
-  std::unique_ptr<const storage::Object> object = AddObject(object_data);
-  EXPECT_EQ(object->GetIdentifier().object_digest(),
-            entry.object_identifier.object_digest());
-  EXPECT_EQ(storage::KeyPriority::LAZY, entry.priority);
-}
-
-TEST_F(PageImplTest, PutUnknownReference) {
-  std::string key("some_key");
-  ReferencePtr reference = Reference::New();
-  reference->opaque_id = convert::ToArray("12345678");
-
-  bool called;
-  Status status;
-  page_ptr_->PutReference(
-      convert::ToArray(key), std::move(*reference), Priority::LAZY,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::REFERENCE_NOT_FOUND, status);
-  auto objects = fake_storage_->GetObjects();
-  // No object should have been added.
-  EXPECT_EQ(0u, objects.size());
-
-  const std::map<std::string,
-                 std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-      journals = fake_storage_->GetJournals();
-  EXPECT_EQ(0u, journals.size());
-}
-
-TEST_F(PageImplTest, PutKeyTooLarge) {
-  std::string value("a small value");
-
-  zx::channel writer, reader;
-  ASSERT_EQ(ZX_OK, zx::channel::create(0, &writer, &reader));
-  page_ptr_.Bind(std::move(writer));
-
-  // Key too large; message doesn't go through, failing on validation.
-  const size_t key_size = kMaxKeySize + 1;
-  std::string key = GetKey(1, key_size);
-  page_ptr_->Put(convert::ToArray(key), convert::ToArray(value),
-                 [](Status status) {});
-  zx_status_t status = reader.read(0, nullptr, 0, nullptr, nullptr, 0, nullptr);
-  DrainLoop();
-  EXPECT_EQ(ZX_ERR_SHOULD_WAIT, status);
-
-  // With a smaller key, message goes through.
-  key = GetKey(1, kMaxKeySize);
-  page_ptr_->Put(convert::ToArray(key), convert::ToArray(value),
-                 [](Status status) {});
-  status = reader.read(0, nullptr, 0, nullptr, nullptr, 0, nullptr);
-  DrainLoop();
-  EXPECT_EQ(ZX_ERR_BUFFER_TOO_SMALL, status);
-}
-
-TEST_F(PageImplTest, PutReferenceKeyTooLarge) {
-  std::string object_data("some_data");
-  fsl::SizedVmo vmo;
-  ASSERT_TRUE(fsl::VmoFromString(object_data, &vmo));
-
-  bool called;
-  Status reference_status;
-  ReferencePtr reference;
-  page_ptr_->CreateReferenceFromBuffer(
-      std::move(vmo).ToTransport(),
-      callback::Capture(callback::SetWhenCalled(&called), &reference_status,
-                        &reference));
-  DrainLoop();
-  ASSERT_EQ(Status::OK, reference_status);
-
-  zx::channel writer, reader;
-  ASSERT_EQ(ZX_OK, zx::channel::create(0, &writer, &reader));
-  page_ptr_.Bind(std::move(writer));
-
-  // Key too large; message doesn't go through, failing on validation.
-  const size_t key_size = kMaxKeySize + 1;
-  std::string key = GetKey(1, key_size);
-  page_ptr_->PutReference(convert::ToArray(key), fidl::Clone(*reference),
-                          Priority::EAGER, [](Status status) {});
-  zx_status_t status = reader.read(0, nullptr, 0, nullptr, nullptr, 0, nullptr);
-  DrainLoop();
-  EXPECT_EQ(ZX_ERR_SHOULD_WAIT, status);
-
-  // With a smaller key, message goes through.
-  key = GetKey(1, kMaxKeySize);
-  page_ptr_->PutReference(convert::ToArray(key), std::move(*reference),
-                          Priority::EAGER, [](Status status) {});
-  status = reader.read(0, nullptr, 0, nullptr, nullptr, 0, nullptr);
-  DrainLoop();
-  EXPECT_EQ(ZX_ERR_BUFFER_TOO_SMALL, status);
-}
-
-TEST_F(PageImplTest, DeleteNoTransaction) {
-  std::string key("some_key");
-
-  bool called;
-  Status status;
-  page_ptr_->Delete(
-      convert::ToArray(key),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  auto objects = fake_storage_->GetObjects();
-  // No object should have been added.
-  EXPECT_EQ(0u, objects.size());
-
-  const std::map<std::string,
-                 std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-      journals = fake_storage_->GetJournals();
-  EXPECT_EQ(1u, journals.size());
-  auto it = journals.begin();
-  EXPECT_TRUE(it->second->IsCommitted());
-  EXPECT_THAT(it->second->GetData(), IsEmpty());
-}
-
-TEST_F(PageImplTest, ClearNoTransaction) {
-  bool called;
-  Status status;
-  page_ptr_->Clear(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  auto objects = fake_storage_->GetObjects();
-  // No object should have been added.
-  EXPECT_THAT(objects, IsEmpty());
-
-  const std::map<std::string,
-                 std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-      journals = fake_storage_->GetJournals();
-  EXPECT_EQ(1u, journals.size());
-  auto it = journals.begin();
-  EXPECT_TRUE(it->second->IsCommitted());
-  EXPECT_THAT(it->second->GetData(), IsEmpty());
-}
-
-TEST_F(PageImplTest, TransactionCommit) {
-  std::string key1("some_key1");
-  storage::ObjectDigest object_digest1;
-  std::string value("a small value");
-
-  std::string key2("some_key2");
-  std::string value2("another value");
-
-  fsl::SizedVmo vmo;
-  ASSERT_TRUE(fsl::VmoFromString(value2, &vmo));
-
-  bool called;
-  Status status;
-  ReferencePtr reference;
-  page_ptr_->CreateReferenceFromBuffer(
-      std::move(vmo).ToTransport(),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &reference));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  // Sequence of operations:
-  //  - StartTransaction
-  //  - Put
-  //  - PutReference
-  //  - Delete
-  //  - Commit
-  page_ptr_->StartTransaction(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Put(convert::ToArray(key1), convert::ToArray(value),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-
-  {
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    auto objects = fake_storage_->GetObjects();
-    EXPECT_EQ(2u, objects.size());
-    // Objects are ordered by a randomly assigned object id, so we can't know
-    // the correct possition of the value in the map.
-    bool object_found = false;
-    for (const auto& object : objects) {
-      if (object.second == value) {
-        object_found = true;
-        object_digest1 = object.first.object_digest();
-        break;
-      }
-    }
-    EXPECT_TRUE(object_found);
-
-    // No finished commit yet.
-    const std::map<std::string,
-                   std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-        journals = fake_storage_->GetJournals();
-    EXPECT_EQ(1u, journals.size());
-    auto it = journals.begin();
-    EXPECT_FALSE(it->second->IsCommitted());
-    EXPECT_EQ(1u, it->second->GetData().size());
-    storage::Entry entry = it->second->GetData().at(key1);
-    EXPECT_EQ(object_digest1, entry.object_identifier.object_digest());
-    EXPECT_EQ(storage::KeyPriority::EAGER, entry.priority);
-  }
-
-  page_ptr_->PutReference(
-      convert::ToArray(key2), std::move(*reference), Priority::LAZY,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-
-  {
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(2u, fake_storage_->GetObjects().size());
-
-    // No finished commit yet, with now two entries.
-    const std::map<std::string,
-                   std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-        journals = fake_storage_->GetJournals();
-    EXPECT_EQ(1u, journals.size());
-    auto it = journals.begin();
-    EXPECT_FALSE(it->second->IsCommitted());
-    EXPECT_EQ(2u, it->second->GetData().size());
-    storage::Entry entry = it->second->GetData().at(key2);
-    EXPECT_EQ(AddObject(value2)->GetIdentifier().object_digest(),
-              entry.object_identifier.object_digest());
-    EXPECT_EQ(storage::KeyPriority::LAZY, entry.priority);
-  }
-
-  page_ptr_->Delete(
-      convert::ToArray(key2),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-
-  {
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(2u, fake_storage_->GetObjects().size());
-
-    // No finished commit yet, with the second entry deleted.
-    const std::map<std::string,
-                   std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-        journals = fake_storage_->GetJournals();
-    EXPECT_EQ(1u, journals.size());
-    auto it = journals.begin();
-    EXPECT_FALSE(it->second->IsCommitted());
-    EXPECT_EQ(1u, it->second->GetData().size());
-    EXPECT_THAT(it->second->GetData(), Not(Contains(Key(key2))));
-  }
-
-  page_ptr_->Commit(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-
-  {
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(2u, fake_storage_->GetObjects().size());
-
-    const std::map<std::string,
-                   std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-        journals = fake_storage_->GetJournals();
-    EXPECT_EQ(1u, journals.size());
-    auto it = journals.begin();
-    EXPECT_TRUE(it->second->IsCommitted());
-    EXPECT_EQ(1u, it->second->GetData().size());
-  }
-}
-
-TEST_F(PageImplTest, TransactionClearCommit) {
-  std::string key1("some_key1");
-  std::string value1("a small value");
-
-  std::string key2("some_key2");
-  std::string value2("another value");
-  storage::ObjectDigest object_digest2;
-
-  bool called;
-  Status status;
-
-  // Sequence of operations:
-  //  - Put key1
-  //  - StartTransaction
-  //  - Clear
-  //  - Put key2
-  //  - Commit
-
-  page_ptr_->Put(convert::ToArray(key1), convert::ToArray(value1),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->StartTransaction(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-
-  {
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-  }
-
-  const std::map<std::string,
-                 std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-      journals = fake_storage_->GetJournals();
-  EXPECT_EQ(2u, journals.size());
-  const auto& journal_it = std::find_if(
-      journals.begin(), journals.end(),
-      [](const auto& pair) { return !pair.second->IsCommitted(); });
-  EXPECT_NE(journals.end(), journal_it);
-  const auto& journal = journal_it->second;
-
-  {
-    EXPECT_FALSE(journal->IsCommitted());
-    EXPECT_THAT(journal->GetData(), SizeIs(1));
-  }
-
-  page_ptr_->Clear(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-
-  {
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(1u, fake_storage_->GetObjects().size());
-
-    EXPECT_FALSE(journal->IsCommitted());
-    EXPECT_THAT(journal->GetData(), IsEmpty());
-  }
-
-  page_ptr_->Put(convert::ToArray(key2), convert::ToArray(value2),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-
-  {
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    auto objects = fake_storage_->GetObjects();
-    EXPECT_EQ(2u, objects.size());
-    bool object_found = false;
-    for (const auto& object : objects) {
-      if (object.second == value2) {
-        object_found = true;
-        object_digest2 = object.first.object_digest();
-        break;
-      }
-    }
-    EXPECT_TRUE(object_found);
-
-    // No finished commit yet.
-    const std::map<std::string,
-                   std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-        journals = fake_storage_->GetJournals();
-    EXPECT_THAT(journals, SizeIs(2));
-    EXPECT_FALSE(journal->IsCommitted());
-    EXPECT_THAT(journal->GetData(),
-                ElementsAre(Pair(
-                    key2, storage::MatchesEntry(
-                              {key2, storage::MatchesDigest(object_digest2),
-                               storage::KeyPriority::EAGER}))));
-  }
-
-  page_ptr_->Commit(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-
-  {
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(2u, fake_storage_->GetObjects().size());
-
-    const std::map<std::string,
-                   std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-        journals = fake_storage_->GetJournals();
-    EXPECT_THAT(journals, SizeIs(2));
-    EXPECT_TRUE(journal->IsCommitted());
-    EXPECT_THAT(journal->GetData(),
-                ElementsAre(Pair(
-                    key2, storage::MatchesEntry(
-                              {key2, storage::MatchesDigest(object_digest2),
-                               storage::KeyPriority::EAGER}))));
-  }
-}
-
-TEST_F(PageImplTest, TransactionRollback) {
-  // Sequence of operations:
-  //  - StartTransaction
-  //  - Rollback
-  bool called_start;
-  Status status_start;
-  bool called_rollback;
-  Status status_rollback;
-
-  page_ptr_->StartTransaction(
-      callback::Capture(callback::SetWhenCalled(&called_start), &status_start));
-  page_ptr_->Rollback(callback::Capture(
-      callback::SetWhenCalled(&called_rollback), &status_rollback));
-
-  DrainLoop();
-  EXPECT_TRUE(called_start);
-  EXPECT_EQ(Status::OK, status_start);
-  EXPECT_TRUE(called_rollback);
-  EXPECT_EQ(Status::OK, status_rollback);
-  EXPECT_EQ(0u, fake_storage_->GetObjects().size());
-
-  // Only one journal, rollbacked.
-  const std::map<std::string,
-                 std::unique_ptr<storage::fake::FakeJournalDelegate>>&
-      journals = fake_storage_->GetJournals();
-  EXPECT_EQ(1u, journals.size());
-  auto it = journals.begin();
-  EXPECT_TRUE(it->second->IsRolledBack());
-  EXPECT_EQ(0u, it->second->GetData().size());
-}
-
-TEST_F(PageImplTest, NoTwoTransactions) {
-  // Sequence of operations:
-  //  - StartTransaction
-  //  - StartTransaction
-  bool called1;
-  Status status1;
-  bool called2;
-  Status status2;
-
-  page_ptr_->StartTransaction(
-      callback::Capture(callback::SetWhenCalled(&called1), &status1));
-  page_ptr_->StartTransaction(
-      callback::Capture(callback::SetWhenCalled(&called2), &status2));
-
-  DrainLoop();
-  EXPECT_TRUE(called1);
-  EXPECT_EQ(Status::OK, status1);
-  EXPECT_TRUE(called2);
-  EXPECT_EQ(Status::TRANSACTION_ALREADY_IN_PROGRESS, status2);
-}
-
-TEST_F(PageImplTest, NoTransactionCommit) {
-  // Sequence of operations:
-  //  - Commit
-  bool called;
-  Status status;
-  page_ptr_->Commit(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::NO_TRANSACTION_IN_PROGRESS, status);
-}
-
-TEST_F(PageImplTest, NoTransactionRollback) {
-  // Sequence of operations:
-  //  - Rollback
-  bool called;
-  Status status;
-  page_ptr_->Rollback(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::NO_TRANSACTION_IN_PROGRESS, status);
-}
-
-TEST_F(PageImplTest, CreateReferenceFromSocket) {
-  ASSERT_EQ(0u, fake_storage_->GetObjects().size());
-
-  std::string value("a small value");
-  bool called;
-  Status status;
-  ReferencePtr reference;
-  page_ptr_->CreateReferenceFromSocket(
-      value.size(), fsl::WriteStringToSocket(value),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &reference));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  ASSERT_EQ(1u, fake_storage_->GetObjects().size());
-  ASSERT_EQ(value, fake_storage_->GetObjects().begin()->second);
-}
-
-TEST_F(PageImplTest, CreateReferenceFromBuffer) {
-  ASSERT_EQ(0u, fake_storage_->GetObjects().size());
-
-  std::string value("a small value");
-  fsl::SizedVmo vmo;
-  ASSERT_TRUE(fsl::VmoFromString(value, &vmo));
-
-  bool called;
-  Status status;
-  ReferencePtr reference;
-  page_ptr_->CreateReferenceFromBuffer(
-      std::move(vmo).ToTransport(),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &reference));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  ASSERT_EQ(1u, fake_storage_->GetObjects().size());
-  ASSERT_EQ(value, fake_storage_->GetObjects().begin()->second);
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetEntries) {
-  std::string eager_key("a_key");
-  std::string eager_value("an eager value");
-  std::string lazy_key("another_key");
-  std::string lazy_value("a lazy value");
-
-  bool called;
-  Status status;
-  page_ptr_->Put(convert::ToArray(eager_key), convert::ToArray(eager_value),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  status = Status::UNKNOWN_ERROR;
-  page_ptr_->PutWithPriority(
-      convert::ToArray(lazy_key), convert::ToArray(lazy_value), Priority::LAZY,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  std::vector<Entry> actual_entries;
-  std::unique_ptr<Token> next_token;
-  snapshot->GetEntries(
-      std::vector<uint8_t>(), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries, &next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(next_token);
-  ASSERT_EQ(2u, actual_entries.size());
-  EXPECT_EQ(eager_key, convert::ExtendedStringView(actual_entries.at(0).key));
-  EXPECT_EQ(eager_value, ToString(actual_entries.at(0).value));
-  EXPECT_EQ(Priority::EAGER, actual_entries.at(0).priority);
-
-  EXPECT_EQ(lazy_key, convert::ExtendedStringView(actual_entries.at(1).key));
-  EXPECT_EQ(lazy_value, ToString(actual_entries.at(1).value));
-  EXPECT_EQ(Priority::LAZY, actual_entries.at(1).priority);
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetEntriesInline) {
-  std::string eager_key("a_key");
-  std::string eager_value("an eager value");
-  std::string lazy_key("another_key");
-  std::string lazy_value("a lazy value");
-
-  bool called;
-  Status status;
-  page_ptr_->Put(convert::ToArray(eager_key), convert::ToArray(eager_value),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->PutWithPriority(
-      convert::ToArray(lazy_key), convert::ToArray(lazy_value), Priority::LAZY,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  std::unique_ptr<Token> next_token;
-  std::vector<InlinedEntry> actual_entries;
-  snapshot->GetEntriesInline(
-      fidl::VectorPtr<uint8_t>::New(0), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries, &next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(next_token);
-
-  ASSERT_EQ(2u, actual_entries.size());
-  EXPECT_EQ(eager_key, convert::ExtendedStringView(actual_entries.at(0).key));
-  EXPECT_TRUE(actual_entries.at(0).inlined_value);
-  EXPECT_EQ(eager_value,
-            convert::ToString(actual_entries.at(0).inlined_value->value));
-  EXPECT_EQ(Priority::EAGER, actual_entries.at(0).priority);
-
-  EXPECT_EQ(lazy_key, convert::ExtendedStringView(actual_entries.at(1).key));
-  EXPECT_TRUE(actual_entries.at(1).inlined_value);
-  EXPECT_EQ(lazy_value,
-            convert::ToString(actual_entries.at(1).inlined_value->value));
-  EXPECT_EQ(Priority::LAZY, actual_entries.at(1).priority);
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetEntriesWithTokenForSize) {
-  const size_t min_key_size = kMaxKeySize;
-  // Put enough entries to ensure pagination of the result.
-  // The number of entries in a Page is bounded by the maximum number of
-  // handles, and the size of a fidl message (which cannot exceed
-  // |kMaxInlineDataSize|), so we put one entry more than that.
-  const size_t entry_count =
-      std::min(fidl_serialization::kMaxMessageHandles,
-               (fidl_serialization::kMaxInlineDataSize -
-                fidl_serialization::kVectorHeaderSize) /
-                   fidl_serialization::GetEntrySize(min_key_size)) +
-      1;
-  AddEntries(entry_count, min_key_size);
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  // Call GetEntries and find a partial result.
-  bool called;
-  Status status;
-  std::vector<Entry> actual_entries;
-  std::unique_ptr<Token> actual_next_token;
-  snapshot->GetEntries(
-      std::vector<uint8_t>(), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::PARTIAL_RESULT, status);
-  EXPECT_TRUE(actual_next_token);
-
-  // Call GetEntries with the previous token and receive the remaining results.
-  std::vector<Entry> actual_next_entries;
-  snapshot->GetEntries(
-      std::vector<uint8_t>(), std::move(actual_next_token),
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_next_entries, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-
-  for (auto& entry : actual_next_entries) {
-    actual_entries.push_back(std::move(entry));
-  }
-  EXPECT_EQ(static_cast<size_t>(entry_count), actual_entries.size());
-
-  // Check that the correct values of the keys are all present in the result and
-  // in the correct order.
-  for (int i = 0; i < static_cast<int>(actual_entries.size()); ++i) {
-    ASSERT_EQ(GetKey(i, min_key_size),
-              convert::ToString(actual_entries.at(i).key));
-    ASSERT_EQ(GetValue(i, 0), ToString(actual_entries.at(i).value));
-  }
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetEntriesInlineWithTokenForSize) {
-  const size_t entry_count = 20;
-  const size_t min_value_size =
-      fidl_serialization::kMaxInlineDataSize * 3 / 2 / entry_count;
-  AddEntries(entry_count, 0, min_value_size);
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  // Call GetEntries and find a partial result.
-  bool called;
-  Status status;
-  std::vector<InlinedEntry> actual_entries;
-  std::unique_ptr<Token> actual_next_token;
-  snapshot->GetEntriesInline(
-      std::vector<uint8_t>(), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::PARTIAL_RESULT, status);
-  EXPECT_TRUE(actual_next_token);
-
-  // Call GetEntries with the previous token and receive the remaining results.
-  std::vector<InlinedEntry> actual_entries2;
-  std::unique_ptr<Token> actual_next_token2;
-  snapshot->GetEntriesInline(
-      std::vector<uint8_t>(), std::move(actual_next_token),
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries2, &actual_next_token2));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token2);
-  for (auto& entry : actual_entries2) {
-    actual_entries.push_back(std::move(entry));
-  }
-  EXPECT_EQ(static_cast<size_t>(entry_count), actual_entries.size());
-
-  // Check that the correct values of the keys are all present in the result and
-  // in the correct order.
-  for (int i = 0; i < static_cast<int>(actual_entries.size()); ++i) {
-    ASSERT_EQ(GetKey(i, 0), convert::ToString(actual_entries.at(i).key));
-    ASSERT_TRUE(actual_entries.at(i).inlined_value);
-    ASSERT_EQ(GetValue(i, min_value_size),
-              convert::ToString(actual_entries.at(i).inlined_value->value));
-  }
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetEntriesInlineWithTokenForEntryCount) {
-  const size_t min_key_size = 8;
-  const size_t min_value_size = 1;
-  // Approximate size of the entry: takes into account size of the pointers for
-  // key, object and entry itself; enum size for Priority and size of the header
-  // for the InlinedEntry struct.
-  const size_t min_entry_size =
-      fidl_serialization::Align(fidl_serialization::kPriorityEnumSize) +
-      fidl_serialization::GetByteVectorSize(min_key_size) +
-      fidl_serialization::GetByteVectorSize(min_value_size);
-  // Put enough inlined entries to cause pagination based on size of the
-  // message.
-  const size_t entry_count =
-      fidl_serialization::kMaxInlineDataSize * 3 / 2 / min_entry_size;
-  AddEntries(entry_count, 0, min_value_size);
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  // Call GetEntries and find a partial result.
-  bool called;
-  Status status;
-  std::vector<InlinedEntry> actual_entries;
-  std::unique_ptr<Token> actual_next_token;
-  snapshot->GetEntriesInline(
-      std::vector<uint8_t>(), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::PARTIAL_RESULT, status);
-  EXPECT_TRUE(actual_next_token);
-
-  // Call GetEntries with the previous token and receive the remaining results.
-  std::vector<InlinedEntry> actual_entries2;
-  std::unique_ptr<Token> actual_next_token2;
-  snapshot->GetEntriesInline(
-      std::vector<uint8_t>(), std::move(actual_next_token),
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries2, &actual_next_token2));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token2);
-  for (auto& entry : actual_entries2) {
-    actual_entries.push_back(std::move(entry));
-  }
-  EXPECT_EQ(static_cast<size_t>(entry_count), actual_entries.size());
-
-  // Check that the correct values of the keys are all present in the result and
-  // in the correct order.
-  for (int i = 0; i < static_cast<int>(actual_entries.size()); ++i) {
-    ASSERT_EQ(GetKey(i, 0), convert::ToString(actual_entries.at(i).key));
-    ASSERT_TRUE(actual_entries.at(i).inlined_value);
-    ASSERT_EQ(GetValue(i, min_value_size),
-              convert::ToString(actual_entries.at(i).inlined_value->value));
-  }
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetEntriesWithTokenForHandles) {
-  const size_t entry_count = 100;
-  AddEntries(entry_count);
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  // Call GetEntries and find a partial result.
-  bool called;
-  Status status;
-  std::vector<Entry> actual_entries;
-  std::unique_ptr<Token> actual_next_token;
-  snapshot->GetEntries(
-      std::vector<uint8_t>(), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::PARTIAL_RESULT, status);
-  EXPECT_TRUE(actual_next_token);
-
-  // Call GetEntries with the previous token and receive the remaining results.
-  std::vector<Entry> actual_next_entries;
-  snapshot->GetEntries(
-      std::vector<uint8_t>(), std::move(actual_next_token),
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_next_entries, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-  for (auto& entry : actual_next_entries) {
-    actual_entries.push_back(std::move(entry));
-  }
-  EXPECT_EQ(static_cast<size_t>(entry_count), actual_entries.size());
-
-  // Check that the correct values of the keys are all present in the result and
-  // in the correct order.
-  for (int i = 0; i < static_cast<int>(actual_entries.size()); ++i) {
-    ASSERT_EQ(GetKey(i), convert::ToString(actual_entries.at(i).key));
-    ASSERT_EQ(GetValue(i, 0), ToString(actual_entries.at(i).value));
-  }
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetEntriesWithFetch) {
-  std::string eager_key("a_key");
-  std::string eager_value("an eager value");
-  std::string lazy_key("another_key");
-  std::string lazy_value("a lazy value");
-
-  bool called;
-  Status status;
-  page_ptr_->PutWithPriority(
-      convert::ToArray(lazy_key), convert::ToArray(lazy_value), Priority::LAZY,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  storage::ObjectIdentifier lazy_object_identifier =
-      fake_storage_->GetObjects().begin()->first;
-
-  status = Status::UNKNOWN_ERROR;
-  page_ptr_->Put(convert::ToArray(eager_key), convert::ToArray(eager_value),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  fake_storage_->DeleteObjectFromLocal(lazy_object_identifier);
-
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  std::vector<Entry> actual_entries;
-  std::unique_ptr<Token> actual_next_token;
-  snapshot->GetEntries(
-      std::vector<uint8_t>(), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-  ASSERT_EQ(2u, actual_entries.size());
-  EXPECT_EQ(eager_key, convert::ExtendedStringView(actual_entries.at(0).key));
-  EXPECT_EQ(eager_value, ToString(actual_entries.at(0).value));
-  EXPECT_EQ(Priority::EAGER, actual_entries.at(0).priority);
-
-  EXPECT_EQ(lazy_key, convert::ExtendedStringView(actual_entries.at(1).key));
-  EXPECT_FALSE(actual_entries.at(1).value);
-  EXPECT_EQ(Priority::LAZY, actual_entries.at(1).priority);
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetEntriesWithPrefix) {
-  std::string eager_key("001-a_key");
-  std::string eager_value("an eager value");
-  std::string lazy_key("002-another_key");
-  std::string lazy_value("a lazy value");
-
-  bool called;
-  Status status;
-  page_ptr_->Put(convert::ToArray(eager_key), convert::ToArray(eager_value),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  status = Status::UNKNOWN_ERROR;
-  page_ptr_->PutWithPriority(
-      convert::ToArray(lazy_key), convert::ToArray(lazy_value), Priority::LAZY,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = GetSnapshot(convert::ToArray("001"));
-  std::vector<Entry> actual_entries;
-  std::unique_ptr<Token> actual_next_token;
-  snapshot->GetEntries(
-      std::vector<uint8_t>(), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-  ASSERT_EQ(1u, actual_entries.size());
-  EXPECT_EQ(eager_key, convert::ExtendedStringView(actual_entries.at(0).key));
-
-  snapshot = GetSnapshot(convert::ToArray("00"));
-  snapshot->GetEntries(
-      std::vector<uint8_t>(), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  ASSERT_EQ(2u, actual_entries.size());
-  EXPECT_EQ(eager_key, convert::ExtendedStringView(actual_entries.at(0).key));
-  EXPECT_EQ(lazy_key, convert::ExtendedStringView(actual_entries.at(1).key));
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetEntriesWithStart) {
-  std::string eager_key("001-a_key");
-  std::string eager_value("an eager value");
-  std::string lazy_key("002-another_key");
-  std::string lazy_value("a lazy value");
-
-  bool called;
-  Status status;
-  page_ptr_->Put(convert::ToArray(eager_key), convert::ToArray(eager_value),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  status = Status::UNKNOWN_ERROR;
-  page_ptr_->PutWithPriority(
-      convert::ToArray(lazy_key), convert::ToArray(lazy_value), Priority::LAZY,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = GetSnapshot();
-  std::vector<Entry> actual_entries;
-  std::unique_ptr<Token> actual_next_token;
-  snapshot->GetEntries(
-      convert::ToArray("002"), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-  ASSERT_EQ(1u, actual_entries.size());
-  EXPECT_EQ(lazy_key, convert::ExtendedStringView(actual_entries.at(0).key));
-
-  snapshot->GetEntries(
-      convert::ToArray("001"), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &actual_entries, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-  ASSERT_EQ(2u, actual_entries.size());
-  EXPECT_EQ(eager_key, convert::ExtendedStringView(actual_entries.at(0).key));
-  EXPECT_EQ(lazy_key, convert::ExtendedStringView(actual_entries.at(1).key));
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetKeys) {
-  std::string key1("some_key");
-  std::string value1("a small value");
-  std::string key2("some_key2");
-  std::string value2("another value");
-
-  bool called;
-  Status status;
-  page_ptr_->StartTransaction(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Put(convert::ToArray(key1), convert::ToArray(value1),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Put(convert::ToArray(key2), convert::ToArray(value2),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Commit(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  std::vector<std::vector<uint8_t>> actual_keys;
-  std::unique_ptr<Token> actual_next_token;
-  snapshot->GetKeys(std::vector<uint8_t>(), nullptr,
-                    callback::Capture(callback::SetWhenCalled(&called), &status,
-                                      &actual_keys, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-  EXPECT_EQ(key1, convert::ExtendedStringView(actual_keys.at(0)));
-  EXPECT_EQ(key2, convert::ExtendedStringView(actual_keys.at(1)));
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetKeysWithToken) {
-  const size_t min_key_size = kMaxKeySize;
-  const size_t key_count =
-      fidl_serialization::kMaxInlineDataSize /
-          fidl_serialization::GetByteVectorSize(min_key_size) +
-      1;
-  AddEntries(key_count, min_key_size);
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  // Call GetKeys and find a partial result.
-  bool called;
-  Status status;
-  std::vector<std::vector<uint8_t>> actual_keys;
-  std::unique_ptr<Token> actual_next_token;
-  snapshot->GetKeys(std::vector<uint8_t>(), nullptr,
-                    callback::Capture(callback::SetWhenCalled(&called), &status,
-                                      &actual_keys, &actual_next_token));
-
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::PARTIAL_RESULT, status);
-  EXPECT_TRUE(actual_next_token);
-
-  // Call GetKeys with the previous token and receive the remaining results.
-  std::vector<std::vector<uint8_t>> actual_next_keys;
-  snapshot->GetKeys(std::vector<uint8_t>(),
-                    std::move(actual_next_token),
-                    callback::Capture(callback::SetWhenCalled(&called), &status,
-                                      &actual_next_keys, &actual_next_token));
-
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-  for (auto& key : actual_next_keys) {
-    actual_keys.push_back(std::move(key));
-  }
-  EXPECT_EQ(static_cast<size_t>(key_count), actual_keys.size());
-
-  // Check that the correct values of the keys are all present in the result and
-  // in the correct order.
-  for (size_t i = 0; i < actual_keys.size(); ++i) {
-    ASSERT_EQ(GetKey(i, min_key_size), convert::ToString(actual_keys.at(i)));
-  }
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetKeysWithPrefix) {
-  std::string key1("001-some_key");
-  std::string value1("a small value");
-  std::string key2("002-some_key2");
-  std::string value2("another value");
-
-  bool called;
-  Status status;
-  page_ptr_->StartTransaction(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Put(convert::ToArray(key1), convert::ToArray(value1),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Put(convert::ToArray(key2), convert::ToArray(value2),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Commit(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = GetSnapshot(convert::ToArray("001"));
-
-  std::vector<std::vector<uint8_t>> actual_keys;
-  std::unique_ptr<Token> actual_next_token;
-  snapshot->GetKeys(std::vector<uint8_t>(), nullptr,
-                    callback::Capture(callback::SetWhenCalled(&called), &status,
-                                      &actual_keys, &actual_next_token));
-
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-  EXPECT_EQ(1u, actual_keys.size());
-  EXPECT_EQ(key1, convert::ExtendedStringView(actual_keys.at(0)));
-
-  snapshot = GetSnapshot(convert::ToArray("00"));
-  snapshot->GetKeys(std::vector<uint8_t>(), nullptr,
-                    callback::Capture(callback::SetWhenCalled(&called), &status,
-                                      &actual_keys, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-  EXPECT_EQ(2u, actual_keys.size());
-  EXPECT_EQ(key1, convert::ExtendedStringView(actual_keys.at(0)));
-  EXPECT_EQ(key2, convert::ExtendedStringView(actual_keys.at(1)));
-}
-
-TEST_F(PageImplTest, PutGetSnapshotGetKeysWithStart) {
-  std::string key1("001-some_key");
-  std::string value1("a small value");
-  std::string key2("002-some_key2");
-  std::string value2("another value");
-
-  bool called;
-  Status status;
-  page_ptr_->StartTransaction(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Put(convert::ToArray(key1), convert::ToArray(value1),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Put(convert::ToArray(key2), convert::ToArray(value2),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Commit(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  std::vector<std::vector<uint8_t>> actual_keys;
-  std::unique_ptr<Token> actual_next_token;
-  snapshot->GetKeys(convert::ToArray("002"), nullptr,
-                    callback::Capture(callback::SetWhenCalled(&called), &status,
-                                      &actual_keys, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-  EXPECT_EQ(1u, actual_keys.size());
-  EXPECT_EQ(key2, convert::ExtendedStringView(actual_keys.at(0)));
-
-  snapshot = GetSnapshot();
-  snapshot->GetKeys(convert::ToArray("001"), nullptr,
-                    callback::Capture(callback::SetWhenCalled(&called), &status,
-                                      &actual_keys, &actual_next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(actual_next_token);
-  EXPECT_EQ(2u, actual_keys.size());
-  EXPECT_EQ(key1, convert::ExtendedStringView(actual_keys.at(0)));
-  EXPECT_EQ(key2, convert::ExtendedStringView(actual_keys.at(1)));
-}
-
-TEST_F(PageImplTest, SnapshotGetSmall) {
-  std::string key("some_key");
-  std::string value("a small value");
-
-  bool called;
-  Status status;
-  page_ptr_->Put(convert::ToArray(key), convert::ToArray(value),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  fuchsia::mem::BufferPtr actual_value;
-  snapshot->Get(convert::ToArray(key),
-                callback::Capture(callback::SetWhenCalled(&called), &status,
-                                  &actual_value));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(value, ToString(actual_value));
-
-  std::unique_ptr<InlinedValue> actual_inlined_value;
-  snapshot->GetInline(convert::ToArray(key),
-                      callback::Capture(callback::SetWhenCalled(&called),
-                                        &status, &actual_inlined_value));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(actual_inlined_value);
-  EXPECT_EQ(value, convert::ToString(actual_inlined_value->value));
-}
-
-TEST_F(PageImplTest, SnapshotGetLarge) {
-  std::string value_string(fidl_serialization::kMaxInlineDataSize + 1, 'a');
-  fsl::SizedVmo vmo;
-  ASSERT_TRUE(fsl::VmoFromString(value_string, &vmo));
-
-  bool called;
-  Status status;
-  ReferencePtr reference;
-  page_ptr_->CreateReferenceFromBuffer(
-      std::move(vmo).ToTransport(),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &reference));
-  DrainLoop();
-
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  std::string key("some_key");
-  page_ptr_->PutReference(
-      convert::ToArray(key), std::move(*reference), Priority::EAGER,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  fuchsia::mem::BufferPtr actual_value;
-  snapshot->Get(convert::ExtendedStringView(key).ToArray(),
-                callback::Capture(callback::SetWhenCalled(&called), &status,
-                                  &actual_value));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  EXPECT_EQ(value_string, ToString(actual_value));
-
-  std::unique_ptr<InlinedValue> inlined_value;
-  snapshot->GetInline(convert::ToArray(key),
-                      callback::Capture(callback::SetWhenCalled(&called),
-                                        &status, &inlined_value));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::VALUE_TOO_LARGE, status);
-  EXPECT_FALSE(inlined_value);
-}
-
-TEST_F(PageImplTest, SnapshotGetNeedsFetch) {
-  std::string key("some_key");
-  std::string value("a small value");
-
-  bool called;
-  Status status;
-  page_ptr_->PutWithPriority(
-      convert::ToArray(key), convert::ToArray(value), Priority::LAZY,
-      ::callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  storage::ObjectIdentifier lazy_object_identifier =
-      fake_storage_->GetObjects().begin()->first;
-  fake_storage_->DeleteObjectFromLocal(lazy_object_identifier);
-
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  fuchsia::mem::BufferPtr actual_value;
-  snapshot->Get(convert::ToArray(key),
-                ::callback::Capture(callback::SetWhenCalled(&called), &status,
-                                    &actual_value));
-  DrainLoop();
-
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::NEEDS_FETCH, status);
-  EXPECT_FALSE(actual_value);
-
-  std::unique_ptr<InlinedValue> actual_inlined_value;
-  snapshot->GetInline(convert::ToArray(key),
-                      ::callback::Capture(callback::SetWhenCalled(&called),
-                                          &status, &actual_inlined_value));
-  DrainLoop();
-
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::NEEDS_FETCH, status);
-  EXPECT_FALSE(actual_inlined_value);
-}
-
-TEST_F(PageImplTest, SnapshotFetchPartial) {
-  std::string key("some_key");
-  std::string value("a small value");
-
-  bool called;
-  Status status;
-  page_ptr_->Put(convert::ToArray(key), convert::ToArray(value),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = GetSnapshot();
-
-  fuchsia::mem::BufferPtr buffer;
-  snapshot->FetchPartial(
-      convert::ToArray(key), 2, 5,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &buffer));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  std::string content;
-  EXPECT_TRUE(fsl::StringFromVmo(*buffer, &content));
-  EXPECT_EQ("small", content);
-}
-
-TEST_F(PageImplTest, ParallelPut) {
-  bool called;
-  Status status;
-  PagePtr page_ptr2;
-  auto delaying_facade =
-      std::make_unique<PageDelayingFacade>(page_id1_, page_ptr2.NewRequest());
-  manager_->AddPageDelayingFacade(
-      std::move(delaying_facade),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  std::string key("some_key");
-  std::string value1("a small value");
-  std::string value2("another value");
-
-  PageSnapshotPtr snapshot1;
-  PageSnapshotPtr snapshot2;
-
-  page_ptr_->StartTransaction(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Put(convert::ToArray(key), convert::ToArray(value1),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr2->StartTransaction(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr2->Put(convert::ToArray(key), convert::ToArray(value2),
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->Commit(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr2->Commit(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr_->GetSnapshot(
-      snapshot1.NewRequest(), fidl::VectorPtr<uint8_t>::New(0), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page_ptr2->GetSnapshot(
-      snapshot2.NewRequest(), fidl::VectorPtr<uint8_t>::New(0), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  fuchsia::mem::BufferPtr actual_value1;
-  snapshot1->Get(convert::ToArray(key),
-                 callback::Capture(callback::SetWhenCalled(&called), &status,
-                                   &actual_value1));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  fuchsia::mem::BufferPtr actual_value2;
-  snapshot2->Get(convert::ToArray(key),
-                 callback::Capture(callback::SetWhenCalled(&called), &status,
-                                   &actual_value2));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  // The two snapshots should have different contents.
-  EXPECT_EQ(value1, ToString(actual_value1));
-  EXPECT_EQ(value2, ToString(actual_value2));
-}
-
-TEST_F(PageImplTest, SerializedOperations) {
-  fake_storage_->set_autocommit(false);
-
-  std::string key("some_key");
-  std::string value1("a value");
-  std::string value2("a second value");
-  std::string value3("a third value");
-
-  bool called[7] = {false, false, false, false, false, false, false};
-  Status statuses[7] = {Status::UNKNOWN_ERROR, Status::UNKNOWN_ERROR,
-                        Status::UNKNOWN_ERROR, Status::UNKNOWN_ERROR,
-                        Status::UNKNOWN_ERROR, Status::UNKNOWN_ERROR,
-                        Status::UNKNOWN_ERROR};
-
-  page_ptr_->Put(
-      convert::ToArray(key), convert::ToArray(value1),
-      callback::Capture(callback::SetWhenCalled(&called[0]), &statuses[0]));
-  page_ptr_->Clear(
-      callback::Capture(callback::SetWhenCalled(&called[1]), &statuses[1]));
-  page_ptr_->Put(
-      convert::ToArray(key), convert::ToArray(value2),
-      callback::Capture(callback::SetWhenCalled(&called[2]), &statuses[2]));
-  page_ptr_->Delete(
-      convert::ToArray(key),
-      callback::Capture(callback::SetWhenCalled(&called[3]), &statuses[3]));
-  page_ptr_->StartTransaction(
-      callback::Capture(callback::SetWhenCalled(&called[4]), &statuses[4]));
-  page_ptr_->Put(
-      convert::ToArray(key), convert::ToArray(value3),
-      callback::Capture(callback::SetWhenCalled(&called[5]), &statuses[5]));
-  page_ptr_->Commit(
-      callback::Capture(callback::SetWhenCalled(&called[6]), &statuses[6]));
-
-  // 4 first operations need to be serialized and blocked on commits.
-  for (size_t i = 0; i < 4; ++i) {
-    // Callbacks are blocked until operation commits.
-    DrainLoop();
-    EXPECT_FALSE(called[i]);
-
-    // The commit queue contains the new commit.
-    ASSERT_EQ(i + 1, fake_storage_->GetJournals().size());
-    CommitFirstPendingJournal(fake_storage_->GetJournals());
-
-    // The operation can now succeed.
-    DrainLoop();
-    EXPECT_TRUE(called[i]);
-    EXPECT_EQ(Status::OK, statuses[i]);
-  }
-
-  // Neither StartTransaction, nor Put in a transaction should now be blocked.
-  DrainLoop();
-  for (size_t i = 4; i < 6; ++i) {
-    EXPECT_TRUE(called[i]);
-    EXPECT_EQ(Status::OK, statuses[i]);
-  }
-
-  // But committing the transaction should still be blocked.
-  DrainLoop();
-  EXPECT_FALSE(called[6]);
-  EXPECT_NE(Status::OK, statuses[6]);
-
-  // Unblocking the transaction commit.
-  CommitFirstPendingJournal(fake_storage_->GetJournals());
-  // The operation can now succeed.
-  DrainLoop();
-  EXPECT_TRUE(called[6]);
-  EXPECT_EQ(Status::OK, statuses[6]);
-}
-
-TEST_F(PageImplTest, WaitForConflictResolutionNoConflicts) {
-  bool called;
-  ConflictResolutionWaitStatus status;
-  page_ptr_->WaitForConflictResolution(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(ConflictResolutionWaitStatus::NO_CONFLICTS, status);
-  EXPECT_TRUE(resolver_->IsEmpty());
-
-  // Special case: no changes from the previous call; event OnEmpty is not
-  // triggered, but WaitForConflictResolution should return right away, as there
-  // are no pending merges.
-  page_ptr_->WaitForConflictResolution(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(ConflictResolutionWaitStatus::NO_CONFLICTS, status);
-  EXPECT_TRUE(resolver_->IsEmpty());
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/page_manager.cc b/bin/ledger/app/page_manager.cc
deleted file mode 100644
index e9cb942..0000000
--- a/bin/ledger/app/page_manager.cc
+++ /dev/null
@@ -1,230 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_manager.h"
-
-#include <algorithm>
-
-#include <lib/callback/trace_callback.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-#include <zircon/syscalls.h>
-
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/impl/data_serialization.h"
-
-namespace ledger {
-
-PageManager::PageManager(Environment* environment,
-                         std::unique_ptr<storage::PageStorage> page_storage,
-                         std::unique_ptr<sync_coordinator::PageSync> page_sync,
-                         std::unique_ptr<MergeResolver> merge_resolver,
-                         PageManager::PageStorageState state,
-                         zx::duration sync_timeout)
-    : environment_(environment),
-      page_storage_(std::move(page_storage)),
-      page_sync_(std::move(page_sync)),
-      merge_resolver_(std::move(merge_resolver)),
-      sync_timeout_(sync_timeout),
-      task_runner_(environment->dispatcher()) {
-  pages_.set_on_empty([this] { CheckEmpty(); });
-  snapshots_.set_on_empty([this] { CheckEmpty(); });
-  page_debug_bindings_.set_empty_set_handler([this] { CheckEmpty(); });
-
-  if (page_sync_) {
-    page_sync_->SetSyncWatcher(&watchers_);
-    page_sync_->SetOnIdle([this] { CheckEmpty(); });
-    page_sync_->SetOnBacklogDownloaded([this] { OnSyncBacklogDownloaded(); });
-    page_sync_->Start();
-    if (state == PageManager::PageStorageState::NEEDS_SYNC) {
-      // The page storage was created locally. We wait a bit in order to get the
-      // initial state from the network before accepting requests.
-      task_runner_.PostDelayedTask(
-          [this] {
-            if (!sync_backlog_downloaded_) {
-              FXL_LOG(INFO) << "Initial sync will continue in background, "
-                            << "in the meantime binding to local page data "
-                            << "(might be stale or empty).";
-              OnSyncBacklogDownloaded();
-            }
-          },
-          sync_timeout_);
-    } else {
-      sync_backlog_downloaded_ = true;
-    }
-  } else {
-    sync_backlog_downloaded_ = true;
-  }
-  merge_resolver_->set_on_empty([this] { CheckEmpty(); });
-  merge_resolver_->SetPageManager(this);
-}
-
-PageManager::~PageManager() {
-  for (const auto& delaying_facade : delaying_facades_) {
-    delaying_facade.second(Status::INTERNAL_ERROR);
-  }
-  delaying_facades_.clear();
-}
-
-void PageManager::AddPageDelayingFacade(
-    std::unique_ptr<PageDelayingFacade> delaying_facade,
-    fit::function<void(Status)> on_done) {
-  auto traced_on_done = TRACE_CALLBACK(std::move(on_done), "ledger",
-                                       "page_manager_add_page_delaying_facade");
-  if (!sync_backlog_downloaded_) {
-    delaying_facades_.emplace_back(std::move(delaying_facade),
-                                   std::move(traced_on_done));
-    return;
-  }
-  pages_
-      .emplace(environment_->coroutine_service(), this, page_storage_.get(),
-               merge_resolver_.get(), &watchers_, std::move(delaying_facade))
-      .Init(std::move(traced_on_done));
-}
-
-void PageManager::BindPageDebug(fidl::InterfaceRequest<PageDebug> page_debug,
-                                fit::function<void(Status)> callback) {
-  page_debug_bindings_.AddBinding(this, std::move(page_debug));
-  callback(Status::OK);
-}
-
-void PageManager::BindPageSnapshot(
-    std::unique_ptr<const storage::Commit> commit,
-    fidl::InterfaceRequest<PageSnapshot> snapshot_request,
-    std::string key_prefix) {
-  snapshots_.emplace(std::move(snapshot_request), page_storage_.get(),
-                     std::move(commit), std::move(key_prefix));
-}
-
-Reference PageManager::CreateReference(
-    storage::ObjectIdentifier object_identifier) {
-  uint64_t index = environment_->random()->Draw<uint64_t>();
-  FXL_DCHECK(references_.find(index) == references_.end());
-  references_[index] = std::move(object_identifier);
-  Reference reference;
-  reference.opaque_id = convert::ToArray(storage::SerializeData(index));
-  return reference;
-}
-
-Status PageManager::ResolveReference(
-    Reference reference, storage::ObjectIdentifier* object_identifier) {
-  if (reference.opaque_id.size() != sizeof(uint64_t)) {
-    return Status::REFERENCE_NOT_FOUND;
-  }
-  uint64_t index = storage::DeserializeData<uint64_t>(
-      convert::ToStringView(reference.opaque_id));
-  auto iterator = references_.find(index);
-  if (iterator == references_.end()) {
-    return Status::REFERENCE_NOT_FOUND;
-  }
-  *object_identifier = iterator->second;
-  return Status::OK;
-}
-
-void PageManager::IsSynced(fit::function<void(Status, bool)> callback) {
-  page_storage_->IsSynced(
-      [callback = std::move(callback)](storage::Status status, bool is_synced) {
-        callback(PageUtils::ConvertStatus(status), is_synced);
-      });
-}
-
-void PageManager::IsOfflineAndEmpty(
-    fit::function<void(Status, bool)> callback) {
-  if (page_storage_->IsOnline()) {
-    callback(Status::OK, false);
-    return;
-  }
-  // The page is offline. Check and return if it's also empty.
-  page_storage_->IsEmpty(
-      [callback = std::move(callback)](storage::Status status, bool is_empty) {
-        callback(PageUtils::ConvertStatus(status), is_empty);
-      });
-}
-
-bool PageManager::IsEmpty() {
-  return pages_.empty() && snapshots_.empty() && delaying_facades_.empty() &&
-         merge_resolver_->IsEmpty() && (!page_sync_ || page_sync_->IsIdle()) &&
-         page_debug_bindings_.size() == 0;
-}
-
-void PageManager::CheckEmpty() {
-  if (on_empty_callback_ && IsEmpty()) {
-    on_empty_callback_();
-  }
-}
-
-void PageManager::OnSyncBacklogDownloaded() {
-  if (sync_backlog_downloaded_) {
-    FXL_LOG(INFO) << "Initial sync in background finished. "
-                  << "Clients will receive a change notification.";
-  }
-  sync_backlog_downloaded_ = true;
-  for (auto& delaying_facade : delaying_facades_) {
-    AddPageDelayingFacade(std::move(delaying_facade.first),
-                          std::move(delaying_facade.second));
-  }
-  delaying_facades_.clear();
-}
-
-void PageManager::GetHeadCommitsIds(GetHeadCommitsIdsCallback callback) {
-  page_storage_->GetHeadCommitIds(
-      [callback = std::move(callback)](storage::Status status,
-                                       std::vector<storage::CommitId> heads) {
-        fidl::VectorPtr<ledger_internal::CommitId> result;
-        result.resize(0);
-        for (const auto& head : heads) {
-          ledger_internal::CommitId commit_id;
-          commit_id.id = convert::ToArray(head);
-          result.push_back(std::move(commit_id));
-        }
-
-        callback(PageUtils::ConvertStatus(status, Status::INVALID_ARGUMENT),
-                 std::move(result));
-      });
-}
-
-void PageManager::GetSnapshot(
-    ledger_internal::CommitId commit_id,
-    fidl::InterfaceRequest<PageSnapshot> snapshot_request,
-    GetSnapshotCallback callback) {
-  page_storage_->GetCommit(
-      convert::ToStringView(commit_id.id),
-      [this, snapshot_request = std::move(snapshot_request),
-       callback = std::move(callback)](
-          storage::Status status,
-          std::unique_ptr<const storage::Commit> commit) mutable {
-        if (status == storage::Status::OK) {
-          BindPageSnapshot(std::move(commit), std::move(snapshot_request), "");
-        }
-        callback(PageUtils::ConvertStatus(status, Status::INVALID_ARGUMENT));
-      });
-}
-
-void PageManager::GetCommit(ledger_internal::CommitId commit_id,
-                            GetCommitCallback callback) {
-  page_storage_->GetCommit(
-      convert::ToStringView(commit_id.id),
-      [callback = std::move(callback)](
-          storage::Status status,
-          std::unique_ptr<const storage::Commit> commit) mutable {
-        ledger_internal::CommitPtr commit_struct = nullptr;
-        if (status == storage::Status::OK) {
-          commit_struct = ledger_internal::Commit::New();
-          commit_struct->commit_id.id = convert::ToArray(commit->GetId());
-          commit_struct->parents_ids.resize(0);
-          for (const storage::CommitIdView& parent : commit->GetParentIds()) {
-            ledger_internal::CommitId id;
-            id.id = convert::ToArray(parent);
-            commit_struct->parents_ids.push_back(std::move(id));
-          }
-          commit_struct->timestamp = commit->GetTimestamp().get();
-          commit_struct->generation = commit->GetGeneration();
-        }
-        callback(PageUtils::ConvertStatus(status, Status::INVALID_ARGUMENT),
-                 std::move(commit_struct));
-      });
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/page_manager.h b/bin/ledger/app/page_manager.h
deleted file mode 100644
index 2164f2a..0000000
--- a/bin/ledger/app/page_manager.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_PAGE_MANAGER_H_
-#define PERIDOT_BIN_LEDGER_APP_PAGE_MANAGER_H_
-
-#include <memory>
-#include <vector>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/callback/scoped_task_runner.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/time/time_delta.h>
-
-#include "peridot/bin/ledger/app/merging/merge_resolver.h"
-#include "peridot/bin/ledger/app/page_delaying_facade.h"
-#include "peridot/bin/ledger/app/page_delegate.h"
-#include "peridot/bin/ledger/app/page_snapshot_impl.h"
-#include "peridot/bin/ledger/app/sync_watcher_set.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/fidl_helpers/bound_interface.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/page_sync_delegate.h"
-#include "peridot/bin/ledger/sync_coordinator/public/page_sync.h"
-
-namespace ledger {
-// Manages a ledger page.
-//
-// PageManager owns all page-level objects related to a single page: page
-// storage, and a set of FIDL PageImpls backed by the page storage. It is safe
-// to delete it at any point - this closes all channels, deletes PageImpls and
-// tears down the storage.
-//
-// When the set of PageImpls becomes empty, client is notified through
-// |on_empty_callback|.
-class PageManager : public ledger_internal::PageDebug {
- public:
-  // Whether the page storage needs to sync with the cloud provider before
-  // binding new pages (|NEEDS_SYNC|) or whether it is immediately available
-  // (|AVAILABLE|).
-  enum class PageStorageState {
-    AVAILABLE,
-    NEEDS_SYNC,
-  };
-
-  // Both |page_storage| and |page_sync| are owned by PageManager and are
-  // deleted when it goes away.
-  PageManager(Environment* environment,
-              std::unique_ptr<storage::PageStorage> page_storage,
-              std::unique_ptr<sync_coordinator::PageSync> page_sync,
-              std::unique_ptr<MergeResolver> merge_resolver,
-              PageManager::PageStorageState state,
-              zx::duration sync_timeout = zx::sec(5));
-  ~PageManager() override;
-
-  // Creates a new PageDelegate managed by this PageManager, and binds it to the
-  // given PageDelayingFacade.
-  void AddPageDelayingFacade(
-      std::unique_ptr<PageDelayingFacade> delaying_facade,
-      fit::function<void(Status)> on_done);
-
-  // Binds |page_debug| request and fires |callback| with Status::OK.
-  void BindPageDebug(fidl::InterfaceRequest<PageDebug> page_debug,
-                     fit::function<void(Status)> callback);
-
-  // Creates a new PageSnapshotImpl managed by this PageManager, and binds it to
-  // the request.
-  void BindPageSnapshot(std::unique_ptr<const storage::Commit> commit,
-                        fidl::InterfaceRequest<PageSnapshot> snapshot_request,
-                        std::string key_prefix);
-
-  // Create a new reference for the given object identifier.
-  Reference CreateReference(storage::ObjectIdentifier object_identifier);
-
-  // Retrieve an object identifier from a Reference.
-  Status ResolveReference(Reference reference,
-                          storage::ObjectIdentifier* object_identifier);
-
-  // Checks whether there are any unsynced commits or pieces in this page.
-  void IsSynced(fit::function<void(Status, bool)> callback);
-
-  // Checks whether the page is offline and has no entries.
-  void IsOfflineAndEmpty(fit::function<void(Status, bool)> callback);
-
-  // Returns true if this PageManager can be deleted without interrupting
-  // syncing, merging, or requests related to this page.
-  bool IsEmpty();
-
-  void set_on_empty(fit::closure on_empty_callback) {
-    on_empty_callback_ = std::move(on_empty_callback);
-  }
-
- private:
-  void CheckEmpty();
-  void OnSyncBacklogDownloaded();
-
-  void GetHeadCommitsIds(GetHeadCommitsIdsCallback callback) override;
-
-  void GetSnapshot(ledger_internal::CommitId commit_id,
-                   fidl::InterfaceRequest<PageSnapshot> snapshot_request,
-                   GetSnapshotCallback callback) override;
-
-  void GetCommit(ledger_internal::CommitId commit_id,
-                 GetCommitCallback callback) override;
-
-  Environment* const environment_;
-  std::unique_ptr<storage::PageStorage> page_storage_;
-  std::unique_ptr<sync_coordinator::PageSync> page_sync_;
-  std::unique_ptr<MergeResolver> merge_resolver_;
-  const zx::duration sync_timeout_;
-  callback::AutoCleanableSet<
-      fidl_helpers::BoundInterface<PageSnapshot, PageSnapshotImpl>>
-      snapshots_;
-  callback::AutoCleanableSet<PageDelegate> pages_;
-  fit::closure on_empty_callback_;
-
-  bool sync_backlog_downloaded_ = false;
-  std::vector<std::pair<std::unique_ptr<PageDelayingFacade>,
-                        fit::function<void(Status)>>>
-      delaying_facades_;
-
-  SyncWatcherSet watchers_;
-
-  fidl::BindingSet<PageDebug> page_debug_bindings_;
-
-  // Registered references.
-  std::map<uint64_t, storage::ObjectIdentifier> references_;
-
-  // Must be the last member field.
-  callback::ScopedTaskRunner task_runner_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageManager);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_PAGE_MANAGER_H_
diff --git a/bin/ledger/app/page_manager_unittest.cc b/bin/ledger/app/page_manager_unittest.cc
deleted file mode 100644
index 4eb5978..0000000
--- a/bin/ledger/app/page_manager_unittest.cc
+++ /dev/null
@@ -1,651 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_manager.h"
-
-#include <memory>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/backoff/exponential_backoff.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/merging/merge_resolver.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/storage/fake/fake_page_storage.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/bin/ledger/storage/testing/commit_empty_impl.h"
-#include "peridot/bin/ledger/sync_coordinator/public/ledger_sync.h"
-#include "peridot/bin/ledger/sync_coordinator/testing/page_sync_empty_impl.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-
-namespace ledger {
-namespace {
-
-std::unique_ptr<MergeResolver> GetDummyResolver(Environment* environment,
-                                                storage::PageStorage* storage) {
-  return std::make_unique<MergeResolver>(
-      [] {}, environment, storage,
-      std::make_unique<backoff::ExponentialBackoff>(
-          zx::sec(0), 1u, zx::sec(0),
-          environment->random()->NewBitGenerator<uint64_t>()));
-}
-
-std::string ToString(const fuchsia::mem::BufferPtr& vmo) {
-  std::string value;
-  bool status = fsl::StringFromVmo(*vmo, &value);
-  FXL_DCHECK(status);
-  return value;
-}
-
-class FakePageSync : public sync_coordinator::PageSyncEmptyImpl {
- public:
-  void Start() override { start_called = true; }
-
-  void SetOnBacklogDownloaded(
-      fit::closure on_backlog_downloaded_callback) override {
-    this->on_backlog_downloaded_callback =
-        std::move(on_backlog_downloaded_callback);
-  }
-
-  void SetOnIdle(fit::closure on_idle) override {
-    this->on_idle = std::move(on_idle);
-  }
-
-  void SetSyncWatcher(sync_coordinator::SyncStateWatcher* watcher) override {
-    this->watcher = watcher;
-  }
-
-  bool start_called = false;
-  sync_coordinator::SyncStateWatcher* watcher = nullptr;
-  fit::closure on_backlog_downloaded_callback;
-  fit::closure on_idle;
-};
-
-class PageManagerTest : public TestWithEnvironment {
- public:
-  PageManagerTest() {}
-  ~PageManagerTest() override {}
-
- protected:
-  // ApplicationTestBase:
-  void SetUp() override {
-    ::testing::Test::SetUp();
-    page_id_ = storage::PageId(::fuchsia::ledger::kPageIdSize, 'a');
-  }
-
-  void DrainLoop() {
-    RunLoopRepeatedlyFor(storage::fake::kFakePageStorageDelay);
-  }
-
-  std::unique_ptr<storage::PageStorage> MakeStorage() {
-    return std::make_unique<storage::fake::FakePageStorage>(&environment_,
-                                                            page_id_);
-  }
-
-  storage::PageId page_id_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageManagerTest);
-};
-
-TEST_F(PageManagerTest, OnEmptyCallback) {
-  bool on_empty_called = false;
-  auto storage = MakeStorage();
-  auto merger = GetDummyResolver(&environment_, storage.get());
-  PageManager page_manager(&environment_, std::move(storage), nullptr,
-                           std::move(merger),
-                           PageManager::PageStorageState::NEEDS_SYNC);
-  page_manager.set_on_empty(callback::SetWhenCalled(&on_empty_called));
-  DrainLoop();
-  EXPECT_FALSE(on_empty_called);
-
-  bool called;
-  Status status;
-  PagePtr page1;
-  PagePtr page2;
-
-  auto delaying_facade1 =
-      std::make_unique<PageDelayingFacade>(page_id_, page1.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade1),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  auto delaying_facade2 =
-      std::make_unique<PageDelayingFacade>(page_id_, page2.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade2),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  page1.Unbind();
-  page2.Unbind();
-  DrainLoop();
-  EXPECT_TRUE(on_empty_called);
-  EXPECT_TRUE(page_manager.IsEmpty());
-
-  on_empty_called = false;
-  PagePtr page3;
-  auto delaying_facade3 =
-      std::make_unique<PageDelayingFacade>(page_id_, page3.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade3),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_FALSE(page_manager.IsEmpty());
-
-  page3.Unbind();
-  DrainLoop();
-  EXPECT_TRUE(on_empty_called);
-  EXPECT_TRUE(page_manager.IsEmpty());
-
-  on_empty_called = false;
-  PageSnapshotPtr snapshot;
-  page_manager.BindPageSnapshot(
-      std::make_unique<const storage::CommitEmptyImpl>(), snapshot.NewRequest(),
-      "");
-  DrainLoop();
-  EXPECT_FALSE(page_manager.IsEmpty());
-  snapshot.Unbind();
-  DrainLoop();
-  EXPECT_TRUE(on_empty_called);
-}
-
-TEST_F(PageManagerTest, DeletingPageManagerClosesConnections) {
-  auto storage = MakeStorage();
-  auto merger = GetDummyResolver(&environment_, storage.get());
-  auto page_manager = std::make_unique<PageManager>(
-      &environment_, std::move(storage), nullptr, std::move(merger),
-      PageManager::PageStorageState::NEEDS_SYNC);
-
-  bool called;
-  Status status;
-  PagePtr page;
-  auto delaying_facade =
-      std::make_unique<PageDelayingFacade>(page_id_, page.NewRequest());
-  page_manager->AddPageDelayingFacade(
-      std::move(delaying_facade),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  bool page_closed;
-  page.set_error_handler([callback = callback::SetWhenCalled(&page_closed)](
-                             zx_status_t status) { callback(); });
-
-  page_manager.reset();
-  DrainLoop();
-  EXPECT_TRUE(page_closed);
-}
-
-TEST_F(PageManagerTest, OnEmptyCallbackWithWatcher) {
-  bool on_empty_called = false;
-  auto storage = MakeStorage();
-  auto merger = GetDummyResolver(&environment_, storage.get());
-  PageManager page_manager(&environment_, std::move(storage), nullptr,
-                           std::move(merger),
-                           PageManager::PageStorageState::NEEDS_SYNC);
-  page_manager.set_on_empty(callback::SetWhenCalled(&on_empty_called));
-  DrainLoop();
-  // PageManager is empty, but on_empty should not have be called, yet.
-  EXPECT_FALSE(on_empty_called);
-  EXPECT_TRUE(page_manager.IsEmpty());
-
-  bool called;
-  Status status;
-  PagePtr page1;
-  PagePtr page2;
-  auto delaying_facade1 =
-      std::make_unique<PageDelayingFacade>(page_id_, page1.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade1),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  auto delaying_facade2 =
-      std::make_unique<PageDelayingFacade>(page_id_, page2.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade2),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  page1->Put(convert::ToArray("key1"), convert::ToArray("value1"),
-             callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageWatcherPtr watcher;
-  fidl::InterfaceRequest<PageWatcher> watcher_request = watcher.NewRequest();
-  PageSnapshotPtr snapshot;
-  page1->GetSnapshot(
-      snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-      std::move(watcher),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  page1.Unbind();
-  page2.Unbind();
-  snapshot.Unbind();
-  DrainLoop();
-  EXPECT_FALSE(page_manager.IsEmpty());
-  EXPECT_FALSE(on_empty_called);
-
-  watcher_request.TakeChannel();
-  DrainLoop();
-  EXPECT_TRUE(page_manager.IsEmpty());
-  EXPECT_TRUE(on_empty_called);
-}
-
-TEST_F(PageManagerTest, DelayBindingUntilSyncBacklogDownloaded) {
-  auto fake_page_sync = std::make_unique<FakePageSync>();
-  auto fake_page_sync_ptr = fake_page_sync.get();
-  auto storage = MakeStorage();
-  auto merger = GetDummyResolver(&environment_, storage.get());
-
-  EXPECT_EQ(nullptr, fake_page_sync_ptr->watcher);
-  EXPECT_FALSE(fake_page_sync_ptr->start_called);
-  EXPECT_FALSE(fake_page_sync_ptr->on_backlog_downloaded_callback);
-
-  PageManager page_manager(&environment_, std::move(storage),
-                           std::move(fake_page_sync), std::move(merger),
-                           PageManager::PageStorageState::NEEDS_SYNC);
-
-  EXPECT_NE(nullptr, fake_page_sync_ptr->watcher);
-  EXPECT_TRUE(fake_page_sync_ptr->start_called);
-  EXPECT_TRUE(fake_page_sync_ptr->on_backlog_downloaded_callback);
-
-  bool called;
-  Status status;
-  PagePtr page;
-  auto delaying_facade1 =
-      std::make_unique<PageDelayingFacade>(page_id_, page.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade1),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  // The page should be bound, but except from GetId, no other method should
-  // be executed, until the sync backlog is downloaded.
-  DrainLoop();
-  EXPECT_FALSE(called);
-
-  PageId found_page_id;
-  page->GetId(
-      callback::Capture(callback::SetWhenCalled(&called), &found_page_id));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  PageId expected_page_id;
-  convert::ToArray(page_id_, &expected_page_id.id);
-  EXPECT_EQ(expected_page_id.id, found_page_id.id);
-
-  // Clear should not be executed.
-  page->Clear(callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_FALSE(called);
-
-  fake_page_sync_ptr->on_backlog_downloaded_callback();
-  // BindPage callback can now be executed; Clear callback should then be
-  // called.
-  DrainLoop();
-  EXPECT_TRUE(called);
-
-  // Check that a second call on the same manager is not delayed.
-  page.Unbind();
-  auto delaying_facade2 =
-      std::make_unique<PageDelayingFacade>(page_id_, page.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade2),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  page->GetId(
-      callback::Capture(callback::SetWhenCalled(&called), &std::ignore));
-  DrainLoop();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(PageManagerTest, DelayBindingUntilSyncTimeout) {
-  auto fake_page_sync = std::make_unique<FakePageSync>();
-  auto fake_page_sync_ptr = fake_page_sync.get();
-  auto storage = MakeStorage();
-  auto merger = GetDummyResolver(&environment_, storage.get());
-
-  EXPECT_EQ(nullptr, fake_page_sync_ptr->watcher);
-  EXPECT_FALSE(fake_page_sync_ptr->start_called);
-  EXPECT_FALSE(fake_page_sync_ptr->on_backlog_downloaded_callback);
-
-  PageManager page_manager(
-      &environment_, std::move(storage), std::move(fake_page_sync),
-      std::move(merger), PageManager::PageStorageState::NEEDS_SYNC, zx::sec(0));
-
-  EXPECT_NE(nullptr, fake_page_sync_ptr->watcher);
-  EXPECT_TRUE(fake_page_sync_ptr->start_called);
-  EXPECT_TRUE(fake_page_sync_ptr->on_backlog_downloaded_callback);
-
-  bool called;
-  Status status;
-  PagePtr page;
-  auto delaying_facade =
-      std::make_unique<PageDelayingFacade>(page_id_, page.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  page->GetId(
-      callback::Capture(callback::SetWhenCalled(&called), &std::ignore));
-  DrainLoop();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(PageManagerTest, ExitWhenSyncFinishes) {
-  auto fake_page_sync = std::make_unique<FakePageSync>();
-  auto fake_page_sync_ptr = fake_page_sync.get();
-  auto storage = MakeStorage();
-  auto merger = GetDummyResolver(&environment_, storage.get());
-
-  EXPECT_EQ(nullptr, fake_page_sync_ptr->watcher);
-  EXPECT_FALSE(fake_page_sync_ptr->start_called);
-  EXPECT_FALSE(fake_page_sync_ptr->on_backlog_downloaded_callback);
-
-  PageManager page_manager(
-      &environment_, std::move(storage), std::move(fake_page_sync),
-      std::move(merger), PageManager::PageStorageState::NEEDS_SYNC, zx::sec(0));
-
-  EXPECT_NE(nullptr, fake_page_sync_ptr->watcher);
-
-  bool called;
-  page_manager.set_on_empty(callback::SetWhenCalled(&called));
-
-  async::PostTask(dispatcher(),
-                  [fake_page_sync_ptr] { fake_page_sync_ptr->on_idle(); });
-
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_TRUE(page_manager.IsEmpty());
-}
-
-TEST_F(PageManagerTest, DontDelayBindingWithLocalPageStorage) {
-  auto fake_page_sync = std::make_unique<FakePageSync>();
-  auto fake_page_sync_ptr = fake_page_sync.get();
-  auto storage = MakeStorage();
-  auto merger = GetDummyResolver(&environment_, storage.get());
-
-  EXPECT_EQ(nullptr, fake_page_sync_ptr->watcher);
-  EXPECT_FALSE(fake_page_sync_ptr->start_called);
-  EXPECT_FALSE(fake_page_sync_ptr->on_backlog_downloaded_callback);
-
-  PageManager page_manager(
-      &environment_, std::move(storage), std::move(fake_page_sync),
-      std::move(merger), PageManager::PageStorageState::AVAILABLE,
-      // Use a long timeout to ensure the test does not hit it.
-      zx::sec(3600));
-
-  EXPECT_NE(nullptr, fake_page_sync_ptr->watcher);
-  EXPECT_TRUE(fake_page_sync_ptr->start_called);
-  EXPECT_TRUE(fake_page_sync_ptr->on_backlog_downloaded_callback);
-
-  bool called;
-  Status status;
-  PagePtr page;
-  auto delaying_facade =
-      std::make_unique<PageDelayingFacade>(page_id_, page.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  // The page should be bound immediately.
-  DrainLoop();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  page->GetId(
-      callback::Capture(callback::SetWhenCalled(&called), &std::ignore));
-  DrainLoop();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(PageManagerTest, GetHeadCommitEntries) {
-  auto storage = MakeStorage();
-  auto merger = GetDummyResolver(&environment_, storage.get());
-  PageManager page_manager(&environment_, std::move(storage), nullptr,
-                           std::move(merger),
-                           PageManager::PageStorageState::NEEDS_SYNC);
-  bool called;
-  Status status;
-  PagePtr page;
-  auto delaying_facade =
-      std::make_unique<PageDelayingFacade>(page_id_, page.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  ledger_internal::PageDebugPtr page_debug;
-  page_manager.BindPageDebug(
-      page_debug.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  std::string key1("001-some_key");
-  std::string value1("a small value");
-
-  page->Put(convert::ToArray(key1), convert::ToArray(value1),
-            callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  std::vector<ledger_internal::CommitId> heads1;
-  page_debug->GetHeadCommitsIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &heads1));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(1u, heads1.size());
-
-  std::string key2("002-some_key2");
-  std::string value2("another value");
-
-  page->Put(convert::ToArray(key2), convert::ToArray(value2),
-            callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  std::vector<ledger_internal::CommitId> heads2;
-  page_debug->GetHeadCommitsIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &heads2));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(1u, heads2.size());
-
-  EXPECT_NE(convert::ToString(heads1.at(0).id),
-            convert::ToString(heads2.at(0).id));
-
-  PageSnapshotPtr snapshot1;
-  page_debug->GetSnapshot(
-      std::move(heads1.at(0)), snapshot1.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot2;
-  page_debug->GetSnapshot(
-      std::move(heads2.at(0)), snapshot2.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  std::vector<Entry> expected_entries1;
-  std::unique_ptr<Token> next_token;
-  snapshot1->GetEntries(
-      fidl::VectorPtr<uint8_t>::New(0), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &expected_entries1, &next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(1u, expected_entries1.size());
-  EXPECT_EQ(key1, convert::ToString(expected_entries1.at(0).key));
-  EXPECT_EQ(value1, ToString(expected_entries1.at(0).value));
-
-  std::vector<Entry> expected_entries2;
-  snapshot2->GetEntries(
-      fidl::VectorPtr<uint8_t>::New(0), nullptr,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &expected_entries2, &next_token));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(2u, expected_entries2.size());
-  EXPECT_EQ(key1, convert::ToString(expected_entries2.at(0).key));
-  EXPECT_EQ(value1, ToString(expected_entries2.at(0).value));
-  EXPECT_EQ(key2, convert::ToString(expected_entries2.at(1).key));
-  EXPECT_EQ(value2, ToString(expected_entries2.at(1).value));
-}
-
-TEST_F(PageManagerTest, GetCommit) {
-  auto storage = MakeStorage();
-  auto merger = GetDummyResolver(&environment_, storage.get());
-  PageManager page_manager(&environment_, std::move(storage), nullptr,
-                           std::move(merger),
-                           PageManager::PageStorageState::NEEDS_SYNC);
-  bool called;
-  Status status;
-  PagePtr page;
-  auto delaying_facade =
-      std::make_unique<PageDelayingFacade>(page_id_, page.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  ledger_internal::PageDebugPtr page_debug;
-  page_manager.BindPageDebug(
-      page_debug.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  std::string key1("001-some_key");
-  std::string value1("a small value");
-
-  page->Put(convert::ToArray(key1), convert::ToArray(value1),
-            callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  std::vector<ledger_internal::CommitId> heads1;
-  page_debug->GetHeadCommitsIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &heads1));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(1u, heads1.size());
-
-  std::string key2("002-some_key2");
-  std::string value2("another value");
-
-  page->Put(convert::ToArray(key2), convert::ToArray(value2),
-            callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  std::vector<ledger_internal::CommitId> heads2;
-  page_debug->GetHeadCommitsIds(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &heads2));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(1u, heads2.size());
-
-  ledger_internal::CommitPtr commit_struct;
-  ledger_internal::CommitId currHeadCommit = fidl::Clone(heads2.at(0));
-  page_debug->GetCommit(std::move(currHeadCommit),
-                        callback::Capture(callback::SetWhenCalled(&called),
-                                          &status, &commit_struct));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(heads2.at(0).id, commit_struct->commit_id.id);
-  EXPECT_EQ(1u, commit_struct->parents_ids.size());
-  EXPECT_EQ(1u, commit_struct->generation);
-  EXPECT_EQ(heads1.at(0).id, commit_struct->parents_ids.at(0).id);
-}
-
-TEST_F(PageManagerTest, GetCommitError) {
-  auto storage = MakeStorage();
-  auto merger = GetDummyResolver(&environment_, storage.get());
-  PageManager page_manager(&environment_, std::move(storage), nullptr,
-                           std::move(merger),
-                           PageManager::PageStorageState::NEEDS_SYNC);
-  bool called;
-  Status status;
-  PagePtr page;
-  auto delaying_facade =
-      std::make_unique<PageDelayingFacade>(page_id_, page.NewRequest());
-  page_manager.AddPageDelayingFacade(
-      std::move(delaying_facade),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  ledger_internal::PageDebugPtr page_debug;
-  page_manager.BindPageDebug(
-      page_debug.NewRequest(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  ledger_internal::CommitPtr commit_struct;
-  page_debug->GetCommit({convert::ToArray("fake_commit_id")},
-                        callback::Capture(callback::SetWhenCalled(&called),
-                                          &status, &commit_struct));
-  DrainLoop();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::INVALID_ARGUMENT, status);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/page_snapshot_impl.cc b/bin/ledger/app/page_snapshot_impl.cc
deleted file mode 100644
index fe2e38a..0000000
--- a/bin/ledger/app/page_snapshot_impl.cc
+++ /dev/null
@@ -1,454 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_snapshot_impl.h"
-
-#include <algorithm>
-#include <functional>
-#include <limits>
-#include <queue>
-#include <vector>
-
-#include <lib/callback/trace_callback.h>
-#include <lib/callback/waiter.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/memory/ref_counted.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/fidl/serialization_size.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-// Transform a SizedVmo to an optional Buffer. Returns null when
-// status is not OK, or a not-null transport otherwise.
-fuchsia::mem::BufferPtr ToOptionalTransport(Status status, fsl::SizedVmo vmo) {
-  if (status != Status::OK) {
-    return nullptr;
-  }
-  return fidl::MakeOptional(std::move(vmo).ToTransport());
-}
-
-template <typename EntryType>
-EntryType CreateEntry(const storage::Entry& entry) {
-  EntryType result;
-  result.key = convert::ToArray(entry.key);
-  result.priority = entry.priority == storage::KeyPriority::EAGER
-                        ? Priority::EAGER
-                        : Priority::LAZY;
-  return result;
-}
-
-// Returns the number of handles used by an entry of the given type. Specialized
-// for each entry type.
-template <class EntryType>
-size_t HandleUsed();
-
-template <>
-size_t HandleUsed<Entry>() {
-  return 1;
-}
-
-template <>
-size_t HandleUsed<InlinedEntry>() {
-  return 0;
-}
-
-// Computes the size of an Entry.
-size_t ComputeEntrySize(const Entry& entry) {
-  return fidl_serialization::GetEntrySize(entry.key.size());
-}
-
-// Computes the size of an InlinedEntry.
-size_t ComputeEntrySize(const InlinedEntry& entry) {
-  return fidl_serialization::GetInlinedEntrySize(entry);
-}
-
-// Fills an Entry from the content of object.
-storage::Status FillSingleEntry(const storage::Object& object, Entry* entry) {
-  fsl::SizedVmo vmo;
-  storage::Status status = object.GetVmo(&vmo);
-  if (status != storage::Status::OK) {
-    return status;
-  }
-  entry->value = fidl::MakeOptional(std::move(vmo).ToTransport());
-  return storage::Status::OK;
-}
-
-// Fills an InlinedEntry from the content of object.
-storage::Status FillSingleEntry(const storage::Object& object,
-                                InlinedEntry* entry) {
-  fxl::StringView data;
-  storage::Status status = object.GetData(&data);
-  if (status != storage::Status::OK) {
-    return status;
-  }
-  entry->inlined_value = std::make_unique<InlinedValue>();
-  entry->inlined_value->value = convert::ToArray(data);
-  return storage::Status::OK;
-}
-
-// Calls |callback| with filled entries of the provided type per
-// GetEntries/GetEntriesInline semantics.
-// |fill_value| is a callback that fills the entry pointer with the content of
-// the provided object.
-template <typename EntryType>
-void FillEntries(storage::PageStorage* page_storage,
-                 const std::string& key_prefix, const storage::Commit* commit,
-                 std::vector<uint8_t> key_start,
-                 std::unique_ptr<Token> token,
-                 fit::function<void(Status, std::vector<EntryType>,
-                                    std::unique_ptr<Token>)>
-                     callback) {
-  // |token| represents the first key to be returned in the list of entries.
-  // Initially, all entries starting from |token| are requested from storage.
-  // Iteration stops if either all entries were found, or if the estimated
-  // serialization size of entries exceeds the maximum size of a FIDL message
-  // (fidl_serialization::kMaxInlineDataSize), or if the number of entries
-  // exceeds fidl_serialization::kMaxMessageHandles. If inline entries are
-  // requested, then the actual size of the message is computed as the values
-  // are added to the entries. This may result in less entries sent than
-  // initially planned. In the case when not all entries have been sent,
-  // callback will run with a PARTIAL_RESULT status and a token appropriate for
-  // resuming the iteration at the right place.
-
-  // Represents information shared between on_next and on_done callbacks.
-  struct Context {
-    std::vector<EntryType> entries;
-    // The serialization size of all entries.
-    size_t size = fidl_serialization::kVectorHeaderSize;
-    // The number of handles used.
-    size_t handle_count = 0u;
-    // If |entries| array size exceeds kMaxInlineDataSize, |next_token| will
-    // have the value of the following entry's key.
-    std::unique_ptr<Token> next_token;
-  };
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "snapshot_get_entries");
-
-  auto waiter = fxl::MakeRefCounted<callback::Waiter<
-      storage::Status, std::unique_ptr<const storage::Object>>>(
-      storage::Status::OK);
-
-  auto context = std::make_unique<Context>();
-  // Use |token| for the first key if present.
-  std::string start = token
-                          ? convert::ToString(token->opaque_id)
-                          : std::max(key_prefix, convert::ToString(key_start));
-  auto on_next = [page_storage, &key_prefix, context = context.get(),
-                  waiter](storage::Entry entry) {
-    if (!PageUtils::MatchesPrefix(entry.key, key_prefix)) {
-      return false;
-    }
-    context->size += fidl_serialization::GetEntrySize(entry.key.size());
-    context->handle_count += HandleUsed<EntryType>();
-    if ((context->size > fidl_serialization::kMaxInlineDataSize ||
-         context->handle_count > fidl_serialization::kMaxMessageHandles) &&
-        !context->entries.empty()) {
-      context->next_token = std::make_unique<Token>();
-      context->next_token->opaque_id = convert::ToArray(entry.key);
-      return false;
-    }
-    context->entries.push_back(CreateEntry<EntryType>(entry));
-    page_storage->GetObject(
-        entry.object_identifier, storage::PageStorage::Location::LOCAL,
-        [priority = entry.priority, waiter_callback = waiter->NewCallback()](
-            storage::Status status,
-            std::unique_ptr<const storage::Object> object) {
-          if (status == storage::Status::NOT_FOUND &&
-              priority == storage::KeyPriority::LAZY) {
-            waiter_callback(storage::Status::OK, nullptr);
-          } else {
-            waiter_callback(status, std::move(object));
-          }
-        });
-    return true;
-  };
-
-  auto on_done = [waiter, context = std::move(context),
-                  callback = std::move(timed_callback)](
-                     storage::Status status) mutable {
-    if (status != storage::Status::OK) {
-      FXL_LOG(ERROR) << "Error while reading: " << status;
-      callback(Status::IO_ERROR, std::vector<EntryType>(), nullptr);
-      return;
-    }
-    fit::function<void(storage::Status,
-                       std::vector<std::unique_ptr<const storage::Object>>)>
-        result_callback =
-            [callback = std::move(callback), context = std::move(context)](
-                storage::Status status,
-                std::vector<std::unique_ptr<const storage::Object>>
-                    results) mutable {
-              if (status != storage::Status::OK) {
-                FXL_LOG(ERROR) << "Error while reading: " << status;
-                callback(Status::IO_ERROR, std::vector<EntryType>(), nullptr);
-                return;
-              }
-              FXL_DCHECK(context->entries.size() == results.size());
-              size_t real_size = 0;
-              size_t i = 0;
-              for (; i < results.size(); i++) {
-                EntryType& entry = context->entries.at(i);
-                size_t next_token_size =
-                    i + 1 >= results.size()
-                        ? 0
-                        : fidl_serialization::GetByteVectorSize(
-                              context->entries.at(i + 1).key.size());
-                if (!results[i]) {
-                  size_t entry_size = ComputeEntrySize(entry);
-                  if (real_size + entry_size + next_token_size >
-                      fidl_serialization::kMaxInlineDataSize) {
-                    break;
-                  }
-                  real_size += entry_size;
-                  // We don't have the object locally, but we decided not to
-                  // abort. This means this object is a value of a lazy key and
-                  // the client should ask to retrieve it over the network if
-                  // they need it. Here, we just leave the value part of the
-                  // entry null.
-                  continue;
-                }
-
-                storage::Status read_status =
-                    FillSingleEntry(*results[i], &entry);
-                if (read_status != storage::Status::OK) {
-                  callback(PageUtils::ConvertStatus(read_status), std::vector<EntryType>(), nullptr);
-                  return;
-                }
-                size_t entry_size = ComputeEntrySize(entry);
-                if (real_size + entry_size + next_token_size >
-                    fidl_serialization::kMaxInlineDataSize) {
-                  break;
-                }
-                real_size += entry_size;
-              }
-              if (i != results.size()) {
-                if (i == 0) {
-                  callback(Status::VALUE_TOO_LARGE, std::vector<EntryType>(), nullptr);
-                  return;
-                }
-                // We had to bail out early because the result would be too big
-                // otherwise.
-                context->next_token = std::make_unique<Token>();
-                context->next_token->opaque_id =
-                    std::move(context->entries.at(i).key);
-                context->entries.resize(i);
-              }
-              if (context->next_token) {
-                callback(Status::PARTIAL_RESULT, std::move(context->entries),
-                         std::move(context->next_token));
-                return;
-              }
-              callback(Status::OK, std::move(context->entries), nullptr);
-            };
-    waiter->Finalize(std::move(result_callback));
-  };
-  page_storage->GetCommitContents(*commit, std::move(start), std::move(on_next),
-                                  std::move(on_done));
-}
-}  // namespace
-
-PageSnapshotImpl::PageSnapshotImpl(
-    storage::PageStorage* page_storage,
-    std::unique_ptr<const storage::Commit> commit, std::string key_prefix)
-    : page_storage_(page_storage),
-      commit_(std::move(commit)),
-      key_prefix_(std::move(key_prefix)) {}
-
-PageSnapshotImpl::~PageSnapshotImpl() {}
-
-void PageSnapshotImpl::GetEntries(std::vector<uint8_t> key_start,
-                                  std::unique_ptr<Token> token,
-                                  GetEntriesCallback callback) {
-  FillEntries<Entry>(page_storage_, key_prefix_, commit_.get(),
-                     std::move(key_start), std::move(token),
-                     std::move(callback));
-}
-
-void PageSnapshotImpl::GetEntriesInline(std::vector<uint8_t> key_start,
-                                        std::unique_ptr<Token> token,
-                                        GetEntriesInlineCallback callback) {
-  FillEntries<InlinedEntry>(page_storage_, key_prefix_, commit_.get(),
-                            std::move(key_start), std::move(token),
-                            std::move(callback));
-}
-
-void PageSnapshotImpl::GetKeys(std::vector<uint8_t> key_start,
-                               std::unique_ptr<Token> token,
-                               GetKeysCallback callback) {
-  // Represents the information that needs to be shared between on_next and
-  // on_done callbacks.
-  struct Context {
-    // The result of GetKeys. New keys from on_next are appended to this array.
-    std::vector<std::vector<uint8_t>> keys;
-    // The total size in number of bytes of the |keys| array.
-    size_t size = fidl_serialization::kVectorHeaderSize;
-    // If the |keys| array size exceeds the maximum allowed inlined data size,
-    // |next_token| will have the value of the next key (not included in array)
-    // which can be used as the next token.
-    std::unique_ptr<Token> next_token;
-  };
-
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "snapshot_get_keys");
-
-  auto context = std::make_unique<Context>();
-  auto on_next = [this, context = context.get()](storage::Entry entry) {
-    if (!PageUtils::MatchesPrefix(entry.key, key_prefix_)) {
-      return false;
-    }
-    context->size += fidl_serialization::GetByteVectorSize(entry.key.size());
-    if (context->size > fidl_serialization::kMaxInlineDataSize) {
-      context->next_token = std::make_unique<Token>();
-      context->next_token->opaque_id = convert::ToArray(entry.key);
-      return false;
-    }
-    context->keys.push_back(convert::ToArray(entry.key));
-    return true;
-  };
-  auto on_done = [context = std::move(context),
-                  callback =
-                      std::move(timed_callback)](storage::Status status) {
-    if (status != storage::Status::OK) {
-      FXL_LOG(ERROR) << "Error while reading: " << status;
-      callback(Status::IO_ERROR,
-               std::vector<std::vector<uint8_t>>(), nullptr);
-      return;
-    }
-    if (context->next_token) {
-      callback(Status::PARTIAL_RESULT, std::move(context->keys),
-               std::move(context->next_token));
-    } else {
-      callback(Status::OK, std::move(context->keys), nullptr);
-    }
-  };
-  if (token) {
-    page_storage_->GetCommitContents(*commit_,
-                                     convert::ToString(token->opaque_id),
-                                     std::move(on_next), std::move(on_done));
-  } else {
-    page_storage_->GetCommitContents(
-        *commit_, std::max(convert::ToString(key_start), key_prefix_),
-        std::move(on_next), std::move(on_done));
-  }
-}
-
-void PageSnapshotImpl::Get(std::vector<uint8_t> key, GetCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "snapshot_get");
-
-  page_storage_->GetEntryFromCommit(
-      *commit_, convert::ToString(key),
-      [this, callback = std::move(timed_callback)](
-          storage::Status status, storage::Entry entry) mutable {
-        if (status != storage::Status::OK) {
-          callback(PageUtils::ConvertStatus(status, Status::KEY_NOT_FOUND),
-                   nullptr);
-          return;
-        }
-        PageUtils::ResolveObjectIdentifierAsBuffer(
-            page_storage_, entry.object_identifier, 0u,
-            std::numeric_limits<int64_t>::max(),
-            storage::PageStorage::Location::LOCAL, Status::NEEDS_FETCH,
-            [callback = std::move(callback)](Status status,
-                                             fsl::SizedVmo data) {
-              callback(status, ToOptionalTransport(status, std::move(data)));
-            });
-      });
-}
-
-void PageSnapshotImpl::GetInline(std::vector<uint8_t> key,
-                                 GetInlineCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "snapshot_get_inline");
-
-  page_storage_->GetEntryFromCommit(
-      *commit_, convert::ToString(key),
-      [this, callback = std::move(timed_callback)](
-          storage::Status status, storage::Entry entry) mutable {
-        if (status != storage::Status::OK) {
-          callback(PageUtils::ConvertStatus(status, Status::KEY_NOT_FOUND),
-                   nullptr);
-          return;
-        }
-        PageUtils::ResolveObjectIdentifierAsStringView(
-            page_storage_, entry.object_identifier,
-            storage::PageStorage::Location::LOCAL, Status::NEEDS_FETCH,
-            [callback = std::move(callback)](Status status,
-                                             fxl::StringView data_view) {
-              if (status != Status::OK) {
-                callback(status, nullptr);
-                return;
-              }
-              if (fidl_serialization::GetByteVectorSize(data_view.size()) +
-                      fidl_serialization::kStatusEnumSize >
-                  fidl_serialization::kMaxInlineDataSize) {
-                callback(Status::VALUE_TOO_LARGE, nullptr);
-                return;
-              }
-              auto inlined_value = std::make_unique<InlinedValue>();
-              inlined_value->value = convert::ToArray(data_view);
-              callback(status, std::move(inlined_value));
-            });
-      });
-}
-
-void PageSnapshotImpl::Fetch(std::vector<uint8_t> key,
-                             FetchCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "snapshot_fetch");
-
-  page_storage_->GetEntryFromCommit(
-      *commit_, convert::ToString(key),
-      [this, callback = std::move(timed_callback)](
-          storage::Status status, storage::Entry entry) mutable {
-        if (status != storage::Status::OK) {
-          callback(PageUtils::ConvertStatus(status, Status::KEY_NOT_FOUND),
-                   nullptr);
-          return;
-        }
-        PageUtils::ResolveObjectIdentifierAsBuffer(
-            page_storage_, entry.object_identifier, 0u,
-            std::numeric_limits<int64_t>::max(),
-            storage::PageStorage::Location::NETWORK, Status::INTERNAL_ERROR,
-            [callback = std::move(callback)](Status status,
-                                             fsl::SizedVmo data) {
-              callback(status, ToOptionalTransport(status, std::move(data)));
-            });
-      });
-}
-
-void PageSnapshotImpl::FetchPartial(std::vector<uint8_t> key,
-                                    int64_t offset, int64_t max_size,
-                                    FetchPartialCallback callback) {
-  auto timed_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "snapshot_fetch_partial");
-
-  page_storage_->GetEntryFromCommit(
-      *commit_, convert::ToString(key),
-      [this, offset, max_size, callback = std::move(timed_callback)](
-          storage::Status status, storage::Entry entry) mutable {
-        if (status != storage::Status::OK) {
-          callback(PageUtils::ConvertStatus(status, Status::KEY_NOT_FOUND),
-                   nullptr);
-          return;
-        }
-
-        PageUtils::ResolveObjectIdentifierAsBuffer(
-            page_storage_, entry.object_identifier, offset, max_size,
-            storage::PageStorage::Location::NETWORK, Status::INTERNAL_ERROR,
-            [callback = std::move(callback)](Status status,
-                                             fsl::SizedVmo data) {
-              callback(status, ToOptionalTransport(status, std::move(data)));
-            });
-      });
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/page_snapshot_impl.h b/bin/ledger/app/page_snapshot_impl.h
deleted file mode 100644
index fccac8d..0000000
--- a/bin/ledger/app/page_snapshot_impl.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_PAGE_SNAPSHOT_IMPL_H_
-#define PERIDOT_BIN_LEDGER_APP_PAGE_SNAPSHOT_IMPL_H_
-
-#include <memory>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace ledger {
-
-// An implementation of the |PageSnapshot| FIDL interface.
-class PageSnapshotImpl : public PageSnapshot {
- public:
-  PageSnapshotImpl(storage::PageStorage* page_storage,
-                   std::unique_ptr<const storage::Commit> commit,
-                   std::string key_prefix);
-  ~PageSnapshotImpl() override;
-
- private:
-  // PageSnapshot:
-  void GetEntries(std::vector<uint8_t> key_start,
-                  std::unique_ptr<Token> token,
-                  GetEntriesCallback callback) override;
-  void GetEntriesInline(std::vector<uint8_t> key_start,
-                        std::unique_ptr<Token> token,
-                        GetEntriesInlineCallback callback) override;
-  void GetKeys(std::vector<uint8_t> key_start, std::unique_ptr<Token> token,
-               GetKeysCallback callback) override;
-  void Get(std::vector<uint8_t> key, GetCallback callback) override;
-  void GetInline(std::vector<uint8_t> key,
-                 GetInlineCallback callback) override;
-  void Fetch(std::vector<uint8_t> key, FetchCallback callback) override;
-  void FetchPartial(std::vector<uint8_t> key, int64_t offset,
-                    int64_t max_size, FetchPartialCallback callback) override;
-
-  storage::PageStorage* page_storage_;
-  std::unique_ptr<const storage::Commit> commit_;
-  const std::string key_prefix_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_PAGE_SNAPSHOT_IMPL_H_
diff --git a/bin/ledger/app/page_usage_db.cc b/bin/ledger/app/page_usage_db.cc
deleted file mode 100644
index be58663..0000000
--- a/bin/ledger/app/page_usage_db.cc
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_usage_db.h"
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <zx/time.h>
-
-#include "lib/fxl/strings/concatenate.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/lock/lock.h"
-#include "peridot/bin/ledger/storage/impl/data_serialization.h"
-#include "peridot/bin/ledger/storage/public/iterator.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kOpenedPagePrefix = "opened/";
-
-std::string GetKeyForOpenedPage(fxl::StringView ledger_name,
-                                storage::PageIdView page_id) {
-  FXL_DCHECK(page_id.size() == ::fuchsia::ledger::kPageIdSize);
-  return fxl::Concatenate({kOpenedPagePrefix, ledger_name, page_id});
-}
-
-void GetPageFromOpenedRow(fxl::StringView row, std::string* ledger_name,
-                          storage::PageId* page_id) {
-  FXL_DCHECK(row.size() >
-             ::fuchsia::ledger::kPageIdSize + kOpenedPagePrefix.size());
-  size_t ledger_name_size =
-      row.size() - ::fuchsia::ledger::kPageIdSize - kOpenedPagePrefix.size();
-  *ledger_name =
-      row.substr(kOpenedPagePrefix.size(), ledger_name_size).ToString();
-  *page_id = row.substr(kOpenedPagePrefix.size() + ledger_name_size).ToString();
-}
-
-// An iterator over PageInfo.
-// This class is a wrapper from a LevelDB iterator, deserializing the
-// ExtendedStringView key-value pairs to PageInfo entries.
-class PageInfoIterator final : public storage::Iterator<const PageInfo> {
- public:
-  explicit PageInfoIterator(
-      std::unique_ptr<storage::Iterator<const std::pair<
-          convert::ExtendedStringView, convert::ExtendedStringView>>>
-          it)
-      : it_(std::move(it)) {
-    PrepareEntry();
-  }
-
-  ~PageInfoIterator() override {}
-
-  storage::Iterator<const PageInfo>& Next() override {
-    it_->Next();
-    PrepareEntry();
-    return *this;
-  }
-
-  bool Valid() const override { return it_->Valid(); }
-
-  storage::Status GetStatus() const override { return it_->GetStatus(); }
-
-  const PageInfo& operator*() const override { return *(page_.get()); }
-
-  const PageInfo* operator->() const override { return page_.get(); }
-
- private:
-  // Updates `page_` with page info extracted from the current key-value in
-  // `it_`.
-  void PrepareEntry() {
-    if (!Valid()) {
-      page_.reset(nullptr);
-      return;
-    }
-    page_ = std::make_unique<PageInfo>();
-
-    const std::pair<convert::ExtendedStringView, convert::ExtendedStringView>&
-        key_value = **it_;
-    GetPageFromOpenedRow(key_value.first, &(page_->ledger_name),
-                         &(page_->page_id));
-    page_->timestamp = storage::DeserializeData<zx::time_utc>(key_value.second);
-  }
-
-  std::unique_ptr<storage::Iterator<const std::pair<
-      convert::ExtendedStringView, convert::ExtendedStringView>>>
-      it_;
-
-  // The current page info served by the iterator.
-  std::unique_ptr<PageInfo> page_;
-};
-}  // namespace
-
-PageUsageDb::PageUsageDb(timekeeper::Clock* clock,
-                         std::unique_ptr<storage::Db> db)
-    : clock_(clock), db_(std::move(db)) {}
-
-PageUsageDb::~PageUsageDb() {}
-
-Status PageUsageDb::MarkPageOpened(coroutine::CoroutineHandler* handler,
-                                   fxl::StringView ledger_name,
-                                   storage::PageIdView page_id) {
-  return Put(handler, GetKeyForOpenedPage(ledger_name, page_id),
-             storage::SerializeData(PageInfo::kOpenedPageTimestamp));
-}
-
-Status PageUsageDb::MarkPageClosed(coroutine::CoroutineHandler* handler,
-                                   fxl::StringView ledger_name,
-                                   storage::PageIdView page_id) {
-  FXL_DCHECK(page_id.size() == ::fuchsia::ledger::kPageIdSize);
-  zx::time_utc now;
-  if (clock_->Now(&now) != ZX_OK) {
-    return Status::IO_ERROR;
-  }
-  return Put(handler, GetKeyForOpenedPage(ledger_name, page_id),
-             storage::SerializeData(now));
-}
-
-Status PageUsageDb::MarkPageEvicted(coroutine::CoroutineHandler* handler,
-                                    fxl::StringView ledger_name,
-                                    storage::PageIdView page_id) {
-  return Delete(handler, GetKeyForOpenedPage(ledger_name, page_id));
-}
-
-Status PageUsageDb::MarkAllPagesClosed(coroutine::CoroutineHandler* handler) {
-  zx::time_utc now;
-  if (clock_->Now(&now) != ZX_OK) {
-    return Status::IO_ERROR;
-  }
-
-  std::unique_ptr<storage::Iterator<const std::pair<
-      convert::ExtendedStringView, convert::ExtendedStringView>>>
-      rows;
-  storage::Status db_status =
-      db_->GetIteratorAtPrefix(handler, kOpenedPagePrefix, &rows);
-  if (db_status != storage::Status::OK) {
-    return PageUtils::ConvertStatus(db_status);
-  }
-  while (rows->Valid()) {
-    if (storage::DeserializeData<zx::time_utc>((*rows)->second) ==
-        PageInfo::kOpenedPageTimestamp) {
-      // No need to deserialize the key.
-      Status status = Put(handler, (*rows)->first, storage::SerializeData(now));
-      if (status != Status::OK) {
-        return status;
-      }
-    }
-    rows->Next();
-  }
-  return Status::OK;
-}
-
-Status PageUsageDb::GetPages(
-    coroutine::CoroutineHandler* handler,
-    std::unique_ptr<storage::Iterator<const PageInfo>>* pages) {
-  std::unique_ptr<storage::Iterator<const std::pair<
-      convert::ExtendedStringView, convert::ExtendedStringView>>>
-      it;
-  storage::Status status =
-      db_->GetIteratorAtPrefix(handler, kOpenedPagePrefix, &it);
-  if (status != storage::Status::OK) {
-    return PageUtils::ConvertStatus(status);
-  }
-  *pages = std::make_unique<PageInfoIterator>(std::move(it));
-  return Status::OK;
-}
-
-Status PageUsageDb::Put(coroutine::CoroutineHandler* handler,
-                        fxl::StringView key, fxl::StringView value) {
-  std::unique_ptr<storage::Db::Batch> batch;
-  std::unique_ptr<lock::Lock> lock;
-  // Used for serializing Put and Delete operations.
-  if (lock::AcquireLock(handler, &serializer_, &lock) ==
-      coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERNAL_ERROR;
-  }
-  storage::Status status = db_->StartBatch(handler, &batch);
-  if (status != storage::Status::OK) {
-    return PageUtils::ConvertStatus(status);
-  }
-  status = batch->Put(handler, key, value);
-  if (status != storage::Status::OK) {
-    return PageUtils::ConvertStatus(status);
-  }
-  return PageUtils::ConvertStatus(batch->Execute(handler));
-}
-
-Status PageUsageDb::Delete(coroutine::CoroutineHandler* handler,
-                           fxl::StringView key) {
-  std::unique_ptr<storage::Db::Batch> batch;
-  // Used for serializing Put and Delete operations.
-  std::unique_ptr<lock::Lock> lock;
-  if (lock::AcquireLock(handler, &serializer_, &lock) ==
-      coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERNAL_ERROR;
-  }
-  storage::Status status = db_->StartBatch(handler, &batch);
-  if (status != storage::Status::OK) {
-    return PageUtils::ConvertStatus(status);
-  }
-  status = batch->Delete(handler, key);
-  if (status != storage::Status::OK) {
-    return PageUtils::ConvertStatus(status);
-  }
-  return PageUtils::ConvertStatus(batch->Execute(handler));
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/page_usage_db.h b/bin/ledger/app/page_usage_db.h
deleted file mode 100644
index 1013afd..0000000
--- a/bin/ledger/app/page_usage_db.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_PAGE_USAGE_DB_H_
-#define PERIDOT_BIN_LEDGER_APP_PAGE_USAGE_DB_H_
-
-#include <functional>
-#include <memory>
-
-#include <lib/callback/operation_serializer.h>
-#include <lib/timekeeper/clock.h>
-
-#include "lib/fxl/strings/concatenate.h"
-#include "peridot/bin/ledger/app/page_utils.h"
-#include "peridot/bin/ledger/app/types.h"
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/storage/impl/leveldb.h"
-#include "peridot/bin/ledger/storage/public/db.h"
-#include "peridot/bin/ledger/storage/public/iterator.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-
-// |PageUsageDb| persists all information on page usage.
-//
-// Calls to |MarkPageOpened| and |MarkPageClosed| will update the underlying
-// database in the order in which they are called.
-//
-// Rows in the underlying database are serialized as follows:
-// Last usage row:
-// - Key: "opened/<ledger_name><page_id>"
-// - Value: "<timestamp>" or timestamp 0 for open pages
-class PageUsageDb {
- public:
-  PageUsageDb(timekeeper::Clock* clock, std::unique_ptr<storage::Db> db);
-  ~PageUsageDb();
-
-  // Marks the page with the given id as opened. |INTERNAL_ERROR| is returned if
-  // the operation is interrupted.
-  Status MarkPageOpened(coroutine::CoroutineHandler* handler,
-                        fxl::StringView ledger_name,
-                        storage::PageIdView page_id);
-
-  // Marks the page with the given id as closed. |INTERNAL_ERROR| is returned if
-  // the operation is interrupted.
-  Status MarkPageClosed(coroutine::CoroutineHandler* handler,
-                        fxl::StringView ledger_name,
-                        storage::PageIdView page_id);
-
-  // Marks the page with the given id as evicted. |INTERNAL_ERROR| is returned
-  // if the operation is interrupted.
-  Status MarkPageEvicted(coroutine::CoroutineHandler* handler,
-                         fxl::StringView ledger_name,
-                         storage::PageIdView page_id);
-
-  // Marks all open pages as closed. |INTERNAL_ERROR| is returned if the
-  // operation is interrupted.
-  Status MarkAllPagesClosed(coroutine::CoroutineHandler* handler);
-
-  // Updates |pages| to contain an iterator over all entries of page
-  // information.
-  Status GetPages(coroutine::CoroutineHandler* handler,
-                  std::unique_ptr<storage::Iterator<const PageInfo>>* pages);
-
- private:
-  // Inserts the given |key|-|value| pair in the underlying database.
-  Status Put(coroutine::CoroutineHandler* handler, fxl::StringView key,
-             fxl::StringView value);
-
-  // Deletes the row with the given |key| in the underlying database.
-  Status Delete(coroutine::CoroutineHandler* handler, fxl::StringView key);
-
-  timekeeper::Clock* clock_;
-  std::unique_ptr<storage::Db> db_;
-
-  // A serializer used for Put and Delete. Both these operations need to be
-  // serialized to guarantee that consecutive calls to update the contents of a
-  // single page (e.g. a page is opened and then closed) are written in |db_| in
-  // the right order, i.e. the order in which they were called.
-  callback::OperationSerializer serializer_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageUsageDb);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_PAGE_USAGE_DB_H_
diff --git a/bin/ledger/app/page_usage_db_unittest.cc b/bin/ledger/app/page_usage_db_unittest.cc
deleted file mode 100644
index b785c6d..0000000
--- a/bin/ledger/app/page_usage_db_unittest.cc
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_usage_db.h"
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <zircon/syscalls.h>
-
-#include "gtest/gtest.h"
-#include "lib/callback/capture.h"
-#include "lib/callback/set_when_called.h"
-#include "lib/fxl/macros.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/storage/fake/fake_db.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-
-namespace ledger {
-namespace {
-
-class PageUsageDbTest : public TestWithEnvironment {
- public:
-  PageUsageDbTest()
-      : db_(environment_.clock(), std::make_unique<storage::fake::FakeDb>(
-                                      environment_.dispatcher())) {}
-
-  ~PageUsageDbTest() override {}
-
-  std::string RandomString(size_t size) {
-    std::string result;
-    result.resize(size);
-    environment_.random()->Draw(&result);
-    return result;
-  }
-
- protected:
-  PageUsageDb db_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageUsageDbTest);
-};
-
-TEST_F(PageUsageDbTest, GetPagesEmpty) {
-  RunInCoroutine([&](coroutine::CoroutineHandler* handler) {
-    std::string ledger_name = "ledger_name";
-    std::string page_id(::fuchsia::ledger::kPageIdSize, 'p');
-
-    std::unique_ptr<storage::Iterator<const PageInfo>> pages;
-    EXPECT_EQ(Status::OK, db_.GetPages(handler, &pages));
-
-    EXPECT_EQ(storage::Status::OK, pages->GetStatus());
-    EXPECT_FALSE(pages->Valid());
-  });
-}
-
-TEST_F(PageUsageDbTest, MarkPageOpened) {
-  RunInCoroutine([&](coroutine::CoroutineHandler* handler) {
-    std::string ledger_name = "ledger_name";
-    std::string page_id(::fuchsia::ledger::kPageIdSize, 'p');
-
-    // Open the same page.
-    EXPECT_EQ(Status::OK, db_.MarkPageOpened(handler, ledger_name, page_id));
-
-    // Expect to find a single entry with the opened page marker timestamp.
-    std::unique_ptr<storage::Iterator<const PageInfo>> pages;
-    EXPECT_EQ(Status::OK, db_.GetPages(handler, &pages));
-
-    EXPECT_EQ(storage::Status::OK, pages->GetStatus());
-    EXPECT_TRUE(pages->Valid());
-    EXPECT_EQ(ledger_name, (*pages)->ledger_name);
-    EXPECT_EQ(page_id, (*pages)->page_id);
-    EXPECT_EQ(PageInfo::kOpenedPageTimestamp, (*pages)->timestamp);
-
-    pages->Next();
-    EXPECT_EQ(storage::Status::OK, pages->GetStatus());
-    EXPECT_FALSE(pages->Valid());
-  });
-}
-
-TEST_F(PageUsageDbTest, MarkPageOpenedAndClosed) {
-  RunInCoroutine([&](coroutine::CoroutineHandler* handler) {
-    std::string ledger_name = "ledger_name";
-    std::string page_id(::fuchsia::ledger::kPageIdSize, 'p');
-
-    // Open and close the same page.
-    EXPECT_EQ(Status::OK, db_.MarkPageOpened(handler, ledger_name, page_id));
-    EXPECT_EQ(Status::OK, db_.MarkPageClosed(handler, ledger_name, page_id));
-
-    // Expect to find a single entry with timestamp != the opened page marker
-    // timestamp.
-    std::unique_ptr<storage::Iterator<const PageInfo>> pages;
-    EXPECT_EQ(Status::OK, db_.GetPages(handler, &pages));
-
-    EXPECT_EQ(storage::Status::OK, pages->GetStatus());
-    EXPECT_TRUE(pages->Valid());
-    EXPECT_EQ(ledger_name, (*pages)->ledger_name);
-    EXPECT_EQ(page_id, (*pages)->page_id);
-    EXPECT_NE(PageInfo::kOpenedPageTimestamp, (*pages)->timestamp);
-
-    pages->Next();
-    EXPECT_EQ(storage::Status::OK, pages->GetStatus());
-    EXPECT_FALSE(pages->Valid());
-  });
-}
-
-TEST_F(PageUsageDbTest, MarkAllPagesClosed) {
-  RunInCoroutine([&](coroutine::CoroutineHandler* handler) {
-    std::string ledger_name = "ledger_name";
-    int N = 5;
-    std::string page_ids[N];
-    for (int i = 0; i < N; ++i) {
-      page_ids[i] = RandomString(::fuchsia::ledger::kPageIdSize);
-    }
-
-    // Open 5 pages.
-    for (int i = 0; i < N; ++i) {
-      EXPECT_EQ(Status::OK,
-                db_.MarkPageOpened(handler, ledger_name, page_ids[i]));
-    }
-
-    // Close 1 of them.
-    EXPECT_EQ(Status::OK,
-              db_.MarkPageClosed(handler, ledger_name, page_ids[0]));
-
-    // Expect to find 4 entries with timestamp equal to the opened page marker
-    // timestamp.
-    std::unique_ptr<storage::Iterator<const PageInfo>> pages;
-    EXPECT_EQ(Status::OK, db_.GetPages(handler, &pages));
-
-    int open_pages_count = 0;
-    zx::time_utc page_0_timestamp(0);
-    for (int i = 0; i < N; ++i) {
-      EXPECT_EQ(storage::Status::OK, pages->GetStatus());
-      ASSERT_TRUE(pages->Valid());
-      EXPECT_EQ(ledger_name, (*pages)->ledger_name);
-      if ((*pages)->page_id == page_ids[0]) {
-        page_0_timestamp = (*pages)->timestamp;
-        EXPECT_NE(PageInfo::kOpenedPageTimestamp, page_0_timestamp);
-      } else {
-        ++open_pages_count;
-        EXPECT_EQ(PageInfo::kOpenedPageTimestamp, (*pages)->timestamp);
-      }
-      pages->Next();
-    }
-    EXPECT_EQ(N - 1, open_pages_count);
-
-    EXPECT_EQ(storage::Status::OK, pages->GetStatus());
-    EXPECT_FALSE(pages->Valid());
-
-    // Call MarkAllPagesClosed and expect all 5 pages to be closed, 4 with the
-    // same value.
-    EXPECT_EQ(Status::OK, db_.MarkAllPagesClosed(handler));
-
-    EXPECT_EQ(Status::OK, db_.GetPages(handler, &pages));
-    zx::time_utc timestamp(PageInfo::kOpenedPageTimestamp);
-    for (int i = 0; i < N; ++i) {
-      EXPECT_EQ(storage::Status::OK, pages->GetStatus());
-      ASSERT_TRUE(pages->Valid());
-      EXPECT_EQ(ledger_name, (*pages)->ledger_name);
-      if ((*pages)->page_id == page_ids[0]) {
-        EXPECT_EQ(page_0_timestamp, (*pages)->timestamp);
-      } else {
-        // Expect from page 0, the others should have the same timestamp.
-        EXPECT_NE(PageInfo::kOpenedPageTimestamp, (*pages)->timestamp);
-        if (timestamp == PageInfo::kOpenedPageTimestamp) {
-          timestamp = (*pages)->timestamp;
-        } else {
-          EXPECT_EQ(timestamp, (*pages)->timestamp);
-        }
-      }
-      pages->Next();
-    }
-    EXPECT_EQ(N - 1, open_pages_count);
-  });
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/page_usage_listener.h b/bin/ledger/app/page_usage_listener.h
deleted file mode 100644
index 3f43482..0000000
--- a/bin/ledger/app/page_usage_listener.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_PAGE_USAGE_LISTENER_H_
-#define PERIDOT_BIN_LEDGER_APP_PAGE_USAGE_LISTENER_H_
-
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-
-// A listener on page usage, that receives notifications when a page is  opened
-// or closed.
-class PageUsageListener {
- public:
-  PageUsageListener() {}
-  virtual ~PageUsageListener() {}
-
-  // Called when a page connection has been requested. In case of concurrent
-  // connections to the same page, this should only be called once, on the first
-  // connection.
-  virtual void OnPageOpened(fxl::StringView ledger_name,
-                            storage::PageIdView page_id) = 0;
-
-  // Called when all external connections to a page are closed. In case of
-  // concurrent connections to the same page, this should only be called once,
-  // when the last connection closes.
-  // TODO(nellyv): Add argument on whether the page is synced and and cache it.
-  virtual void OnPageClosed(fxl::StringView ledger_name,
-                            storage::PageIdView page_id) = 0;
-
-  // Called when there are no longer any active connections to a page. This
-  // includes both internal and external connections. Note that if the last
-  // active connection to a page is an external one, both |OnPageClosed| and
-  // then |OnPageUnused| will be called.
-  virtual void OnPageUnused(fxl::StringView ledger_name,
-                            storage::PageIdView page_id) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageUsageListener);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_PAGE_USAGE_LISTENER_H_
diff --git a/bin/ledger/app/page_utils.cc b/bin/ledger/app/page_utils.cc
deleted file mode 100644
index 7f0ed50..0000000
--- a/bin/ledger/app/page_utils.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/page_utils.h"
-
-#include <memory>
-
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/sized_vmo.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/storage/public/object.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-
-void PageUtils::ResolveObjectIdentifierAsStringView(
-    storage::PageStorage* storage, storage::ObjectIdentifier object_identifier,
-    storage::PageStorage::Location location, Status not_found_status,
-    fit::function<void(Status, fxl::StringView)> callback) {
-  storage->GetObject(
-      object_identifier, location,
-      [not_found_status, callback = std::move(callback)](
-          storage::Status status,
-          std::unique_ptr<const storage::Object> object) {
-        if (status != storage::Status::OK) {
-          callback(PageUtils::ConvertStatus(status, not_found_status),
-                   fxl::StringView());
-          return;
-        }
-        fxl::StringView data;
-        status = object->GetData(&data);
-        if (status != storage::Status::OK) {
-          callback(PageUtils::ConvertStatus(status, not_found_status),
-                   fxl::StringView());
-          return;
-        }
-
-        callback(Status::OK, data);
-      });
-}
-
-Status PageUtils::ConvertStatus(storage::Status status,
-                                Status not_found_status) {
-  switch (status) {
-    case storage::Status::OK:
-      return Status::OK;
-    case storage::Status::IO_ERROR:
-      return Status::IO_ERROR;
-    case storage::Status::NOT_FOUND:
-      FXL_DCHECK(not_found_status != Status::INTERNAL_ERROR);
-      return not_found_status;
-    case storage::Status::NOT_CONNECTED_ERROR:
-      return Status::NETWORK_ERROR;
-    case storage::Status::INTERRUPTED:
-      return Status::INTERNAL_ERROR;
-    default:
-      FXL_DCHECK(false) << "Internal error in Ledger storage. Status: "
-                        << status;
-      return Status::INTERNAL_ERROR;
-  }
-}
-
-void PageUtils::ResolveObjectIdentifierAsBuffer(
-    storage::PageStorage* storage, storage::ObjectIdentifier object_identifier,
-    int64_t offset, int64_t max_size, storage::PageStorage::Location location,
-    Status not_found_status,
-    fit::function<void(Status, fsl::SizedVmo)> callback) {
-  storage->GetObjectPart(
-      object_identifier, offset, max_size, location,
-      [not_found_status, callback = std::move(callback)](
-          storage::Status status, fsl::SizedVmo object_part) {
-        callback(ConvertStatus(status, not_found_status),
-                 std::move(object_part));
-      });
-}
-
-bool PageUtils::MatchesPrefix(const std::string& key,
-                              const std::string& prefix) {
-  return convert::ExtendedStringView(key).substr(0, prefix.size()) ==
-         convert::ExtendedStringView(prefix);
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/page_utils.h b/bin/ledger/app/page_utils.h
deleted file mode 100644
index d211939..0000000
--- a/bin/ledger/app/page_utils.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_PAGE_UTILS_H_
-#define PERIDOT_BIN_LEDGER_APP_PAGE_UTILS_H_
-
-#include <functional>
-
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/sized_vmo.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-class PageUtils {
- public:
-  // Converts a status from storage into a status from the FIDL API. If the
-  // storage status is storage::Status::NOT_FOUND, |not_found_status| will be
-  // returned.
-  static Status ConvertStatus(storage::Status status,
-                              Status not_found_status = Status::INTERNAL_ERROR);
-
-  // Retrieves the data referenced by the given identifier as a StringView with
-  // no offset.
-  static void ResolveObjectIdentifierAsStringView(
-      storage::PageStorage* storage,
-      storage::ObjectIdentifier object_identifier,
-      storage::PageStorage::Location location, Status not_found_status,
-      fit::function<void(Status, fxl::StringView)> callback);
-
-  // Retrieves the data referenced by the given identifier and returns a subset
-  // of its contents as a buffer. |offset| can be negative. In that case, the
-  // offset is understood as starting from the end of the contents.
-  static void ResolveObjectIdentifierAsBuffer(
-      storage::PageStorage* storage,
-      storage::ObjectIdentifier object_identifier, int64_t offset,
-      int64_t max_size, storage::PageStorage::Location location,
-      Status not_found_status,
-      fit::function<void(Status, fsl::SizedVmo)> callback);
-
-  // Returns true if a key matches the provided prefix, false otherwise.
-  static bool MatchesPrefix(const std::string& key, const std::string& prefix);
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageUtils);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_PAGE_UTILS_H_
diff --git a/bin/ledger/app/serialization_version.h b/bin/ledger/app/serialization_version.h
deleted file mode 100644
index 0612b3b..0000000
--- a/bin/ledger/app/serialization_version.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_SERIALIZATION_VERSION_H_
-#define PERIDOT_BIN_LEDGER_APP_SERIALIZATION_VERSION_H_
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace ledger {
-
-// The serialization version of anything Ledger stores on local storage
-// (directory structure, object/LevelDb serialization).
-inline constexpr fxl::StringView kSerializationVersion = "29";
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_SERIALIZATION_VERSION_H_
diff --git a/bin/ledger/app/sync_watcher_set.cc b/bin/ledger/app/sync_watcher_set.cc
deleted file mode 100644
index 4f0e3f0..0000000
--- a/bin/ledger/app/sync_watcher_set.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/sync_watcher_set.h"
-
-#include <lib/fit/function.h>
-
-namespace ledger {
-namespace {
-SyncState ConvertToSyncState(sync_coordinator::DownloadSyncState download) {
-  switch (download) {
-    case sync_coordinator::DOWNLOAD_IDLE:
-      return SyncState::IDLE;
-    case sync_coordinator::DOWNLOAD_PENDING:
-      return SyncState::PENDING;
-    case sync_coordinator::DOWNLOAD_IN_PROGRESS:
-      return SyncState::IN_PROGRESS;
-    case sync_coordinator::DOWNLOAD_ERROR:
-      return SyncState::ERROR;
-  }
-}
-
-SyncState ConvertToSyncState(sync_coordinator::UploadSyncState upload) {
-  switch (upload) {
-    case sync_coordinator::UPLOAD_IDLE:
-      return SyncState::IDLE;
-    case sync_coordinator::UPLOAD_PENDING:
-      return SyncState::PENDING;
-    case sync_coordinator::UPLOAD_IN_PROGRESS:
-      return SyncState::IN_PROGRESS;
-    case sync_coordinator::UPLOAD_ERROR:
-      return SyncState::ERROR;
-  }
-}
-
-bool operator==(
-    const sync_coordinator::SyncStateWatcher::SyncStateContainer& lhs,
-    const sync_coordinator::SyncStateWatcher::SyncStateContainer& rhs) {
-  return std::tie(lhs.download, lhs.upload) ==
-         std::tie(rhs.download, rhs.upload);
-}
-}  // namespace
-
-class SyncWatcherSet::SyncWatcherContainer
-    : public sync_coordinator::SyncStateWatcher {
- public:
-  explicit SyncWatcherContainer(SyncWatcherPtr watcher)
-      : watcher_(std::move(watcher)) {}
-
-  ~SyncWatcherContainer() override {}
-
-  void Start(SyncStateContainer base_state) {
-    pending_ = base_state;
-    Send();
-  }
-
-  void Notify(SyncStateContainer sync_state) override {
-    if (sync_state == pending_) {
-      return;
-    }
-    pending_ = sync_state;
-
-    SendIfPending();
-  }
-
-  void set_on_empty(fit::closure on_empty_callback) {
-    if (on_empty_callback) {
-      watcher_.set_error_handler([callback = std::move(on_empty_callback)](
-                                     zx_status_t status) { callback(); });
-    }
-  }
-
- private:
-  void SendIfPending() {
-    if (!watcher_ || notification_in_progress_ || last_ == pending_) {
-      return;
-    }
-    Send();
-  }
-
-  void Send() {
-    notification_in_progress_ = true;
-    last_ = pending_;
-    watcher_->SyncStateChanged(ConvertToSyncState(last_.download),
-                               ConvertToSyncState(last_.upload), [this]() {
-                                 notification_in_progress_ = false;
-                                 SendIfPending();
-                               });
-  }
-
-  // fidl interface to the client.
-  SyncWatcherPtr watcher_;
-
-  // True if a notification has been sent but not acknowledged by the client.
-  bool notification_in_progress_ = false;
-  // pending_ contains the next synchronization state to send to the watcher,
-  // or the current one if no notification is currently in progress
-  SyncStateContainer pending_;
-  // last_ contains the last sent notification.
-  SyncStateContainer last_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SyncWatcherContainer);
-};
-
-SyncWatcherSet::SyncWatcherSet() {}
-
-SyncWatcherSet::~SyncWatcherSet() {}
-
-void SyncWatcherSet::AddSyncWatcher(
-    fidl::InterfaceHandle<SyncWatcher> watcher) {
-  SyncWatcherContainer& container = watchers_.emplace(watcher.Bind());
-  container.Start(current_);
-}
-
-void SyncWatcherSet::Notify(SyncStateContainer sync_state) {
-  if (current_ == sync_state) {
-    // Skip notifying if nothing has changed.
-    return;
-  }
-  current_ = sync_state;
-  for (SyncWatcherContainer& watcher : watchers_) {
-    watcher.Notify(current_);
-  }
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/app/sync_watcher_set.h b/bin/ledger/app/sync_watcher_set.h
deleted file mode 100644
index 447e988..0000000
--- a/bin/ledger/app/sync_watcher_set.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_SYNC_WATCHER_SET_H_
-#define PERIDOT_BIN_LEDGER_APP_SYNC_WATCHER_SET_H_
-
-#include <lib/callback/auto_cleanable.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/sync_coordinator/public/sync_state_watcher.h"
-
-namespace ledger {
-
-class SyncWatcherSet : public sync_coordinator::SyncStateWatcher {
- public:
-  SyncWatcherSet();
-  ~SyncWatcherSet() override;
-
-  // Adds a new SyncWatcher.
-  void AddSyncWatcher(fidl::InterfaceHandle<SyncWatcher> watcher);
-
-  // Notify the client watchers of a new state.
-  void Notify(SyncStateContainer sync_state) override;
-
- private:
-  class SyncWatcherContainer;
-
-  void SendIfPending();
-
-  SyncStateContainer current_;
-  callback::AutoCleanableSet<SyncWatcherContainer> watchers_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SyncWatcherSet);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_SYNC_WATCHER_SET_H_
diff --git a/bin/ledger/app/sync_watcher_set_unittest.cc b/bin/ledger/app/sync_watcher_set_unittest.cc
deleted file mode 100644
index 0124059..0000000
--- a/bin/ledger/app/sync_watcher_set_unittest.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/app/sync_watcher_set.h"
-
-#include <algorithm>
-#include <string>
-
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-
-namespace ledger {
-namespace {
-
-class SyncWatcherSetTest : public gtest::TestLoopFixture {
- public:
-  SyncWatcherSetTest() {}
-  ~SyncWatcherSetTest() override {}
-
- protected:
-  void SetUp() override { ::testing::Test::SetUp(); }
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(SyncWatcherSetTest);
-};
-
-class SyncWatcherImpl : public SyncWatcher {
- public:
-  explicit SyncWatcherImpl(fidl::InterfaceRequest<SyncWatcher> request)
-      : binding_(this, std::move(request)) {}
-  void SyncStateChanged(SyncState download_status, SyncState upload_status,
-                        SyncStateChangedCallback callback) override {
-    download_states.push_back(download_status);
-    upload_states.push_back(upload_status);
-    callback();
-  }
-
-  std::vector<SyncState> download_states;
-  std::vector<SyncState> upload_states;
-
- private:
-  fidl::Binding<SyncWatcher> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SyncWatcherImpl);
-};
-
-TEST_F(SyncWatcherSetTest, OneWatcher) {
-  SyncWatcherSet watcher_set;
-  SyncWatcherPtr watcher_ptr;
-
-  SyncWatcherImpl impl(watcher_ptr.NewRequest());
-
-  watcher_set.Notify({sync_coordinator::DOWNLOAD_IN_PROGRESS,
-                      sync_coordinator::UPLOAD_PENDING});
-
-  watcher_set.AddSyncWatcher(std::move(watcher_ptr));
-
-  RunLoopUntilIdle();
-
-  ASSERT_EQ(1u, impl.download_states.size());
-  EXPECT_EQ(SyncState::IN_PROGRESS, *impl.download_states.rbegin());
-  ASSERT_EQ(1u, impl.upload_states.size());
-  EXPECT_EQ(SyncState::PENDING, *impl.upload_states.rbegin());
-
-  watcher_set.Notify(
-      {sync_coordinator::DOWNLOAD_ERROR, sync_coordinator::UPLOAD_IDLE});
-
-  RunLoopUntilIdle();
-
-  ASSERT_EQ(2u, impl.download_states.size());
-  EXPECT_EQ(SyncState::ERROR, *impl.download_states.rbegin());
-  ASSERT_EQ(2u, impl.upload_states.size());
-  EXPECT_EQ(SyncState::IDLE, *impl.upload_states.rbegin());
-}
-
-TEST_F(SyncWatcherSetTest, TwoWatchers) {
-  SyncWatcherSet watcher_set;
-
-  SyncWatcherPtr watcher_ptr1;
-  SyncWatcherImpl impl1(watcher_ptr1.NewRequest());
-  watcher_set.AddSyncWatcher(std::move(watcher_ptr1));
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, impl1.download_states.size());
-  EXPECT_EQ(SyncState::IDLE, *impl1.download_states.rbegin());
-  EXPECT_EQ(1u, impl1.upload_states.size());
-  EXPECT_EQ(SyncState::IDLE, *impl1.upload_states.rbegin());
-
-  SyncWatcherPtr watcher_ptr2;
-  SyncWatcherImpl impl2(watcher_ptr2.NewRequest());
-  watcher_set.AddSyncWatcher(std::move(watcher_ptr2));
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, impl2.download_states.size());
-  EXPECT_EQ(SyncState::IDLE, *impl2.download_states.rbegin());
-  EXPECT_EQ(1u, impl2.upload_states.size());
-  EXPECT_EQ(SyncState::IDLE, *impl2.upload_states.rbegin());
-
-  watcher_set.Notify({sync_coordinator::DOWNLOAD_IN_PROGRESS,
-                      sync_coordinator::UPLOAD_PENDING});
-
-  RunLoopUntilIdle();
-
-  ASSERT_EQ(2u, impl1.download_states.size());
-  EXPECT_EQ(SyncState::IN_PROGRESS, *impl1.download_states.rbegin());
-  ASSERT_EQ(2u, impl1.upload_states.size());
-  EXPECT_EQ(SyncState::PENDING, *impl1.upload_states.rbegin());
-
-  ASSERT_EQ(2u, impl2.download_states.size());
-  EXPECT_EQ(SyncState::IN_PROGRESS, *impl2.download_states.rbegin());
-  ASSERT_EQ(2u, impl2.upload_states.size());
-  EXPECT_EQ(SyncState::PENDING, *impl2.upload_states.rbegin());
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/app/types.h b/bin/ledger/app/types.h
deleted file mode 100644
index 600af5d..0000000
--- a/bin/ledger/app/types.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_APP_TYPES_H_
-#define PERIDOT_BIN_LEDGER_APP_TYPES_H_
-
-#include <string>
-
-#include <zx/time.h>
-
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-
-// The result of a predicate, meant to be checked on a closed page. The result
-// is |YES| or |NO| depending on whether the predicate is satisfied or not. If
-// however the page was opened during the operation, |PAGE_OPENED| is returned.
-enum class PagePredicateResult { YES, NO, PAGE_OPENED };
-
-// Holds information on when a page was last used.
-struct PageInfo {
-  //  The timestamp used for all currently opened pages.
-  static constexpr zx::time_utc kOpenedPageTimestamp =
-      zx::time_utc::infinite_past();
-
-  std::string ledger_name;
-  storage::PageId page_id;
-  // The timestamp in UTC of when the page was last closed, as an indication
-  // of when it was last used. If the page is currently open, the value is set
-  // to |PageInfo::kOpenedPageTimestamp|.
-  zx::time_utc timestamp;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_APP_TYPES_H_
diff --git a/bin/ledger/cache/BUILD.gn b/bin/ledger/cache/BUILD.gn
deleted file mode 100644
index 6b2b3e0..0000000
--- a/bin/ledger/cache/BUILD.gn
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("cache") {
-  sources = [
-    "lazy_value.h",
-    "lru_cache.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-  sources = [
-    "lazy_value_unittest.cc",
-    "lru_cache_unittest.cc",
-  ]
-
-  deps = [
-    ":cache",
-    "//garnet/public/lib/callback",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/cache/lazy_value.h b/bin/ledger/cache/lazy_value.h
deleted file mode 100644
index 20f8675..0000000
--- a/bin/ledger/cache/lazy_value.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CACHE_LAZY_VALUE_H_
-#define PERIDOT_BIN_LEDGER_CACHE_LAZY_VALUE_H_
-
-#include <functional>
-#include <vector>
-
-#include <lib/fit/function.h>
-
-namespace cache {
-// Implements a self-populating lazy value.
-//
-// This class allows to setup a lazy value that will be generated asynchronously
-// the first time it is requested.
-//
-// V is the type of the lazy value. V must be default-constructible and either
-//   copyable or movable.
-// S is the type of the success status for the data generator.
-template <typename V, typename S>
-class LazyValue {
- public:
-  // Constructor.
-  //
-  // |ok_status| is the success status of the generator.
-  // |generator| generates the value. It takes a callback to returns its result.
-  //   It must return |ok_status| as a status when the request is successful.
-  //   Any other return value is considered a failure.
-  LazyValue(S ok_status,
-            fit::function<void(fit::function<void(S, V)>)> generator)
-      : ok_status_(ok_status),
-        generator_(std::move(generator)),
-        value_set_(false) {}
-
-  // Retrieves the value and returns it to |callback|.
-  //
-  // If the value is cached, |callback| will be called synchronously. Otherwise,
-  // |generator| will be called, and depending on its implementation, |callback|
-  // might be called synchronously or not.
-  void Get(fit::function<void(S, const V&)> callback) {
-    if (value_set_) {
-      callback(ok_status_, value_);
-      return;
-    }
-    requests_.push_back(std::move(callback));
-    if (requests_.size() == 1) {
-      generator_([this](S status, V value) {
-        auto callbacks = std::move(requests_);
-        requests_.clear();
-
-        if (status == ok_status_) {
-          value_ = std::move(value);
-          value_set_ = true;
-        }
-        for (const auto& callback : callbacks) {
-          callback(status, value_);
-        }
-      });
-    }
-  }
-
- private:
-  S ok_status_;
-  fit::function<void(fit::function<void(S, V)>)> generator_;
-  V value_;
-  bool value_set_;
-  std::vector<fit::function<void(S, const V&)>> requests_;
-};
-
-}  // namespace cache
-
-#endif  // PERIDOT_BIN_LEDGER_CACHE_LAZY_VALUE_H_
diff --git a/bin/ledger/cache/lazy_value_unittest.cc b/bin/ledger/cache/lazy_value_unittest.cc
deleted file mode 100644
index 198902f..0000000
--- a/bin/ledger/cache/lazy_value_unittest.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cache/lazy_value.h"
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fit/function.h>
-
-#include "gtest/gtest.h"
-
-namespace cache {
-namespace {
-TEST(LazyValueTest, SimpleGet) {
-  auto generator = [](fit::function<void(size_t, size_t)> callback) {
-    callback(0, 1);
-  };
-
-  LazyValue<size_t, size_t> cache(0, generator);
-
-  bool called;
-  size_t status;
-  size_t value;
-  cache.Get(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &value));
-  ASSERT_TRUE(called);
-  EXPECT_EQ(0u, status);
-  EXPECT_EQ(1u, value);
-}
-
-TEST(LazyValueTest, FailingGenerator) {
-  size_t nb_called = 0;
-  auto generator = [&nb_called](fit::function<void(size_t, size_t)> callback) {
-    ++nb_called;
-    callback(1, 0);
-  };
-
-  LazyValue<size_t, size_t> cache(0, generator);
-
-  bool called;
-  size_t status;
-  size_t value;
-
-  cache.Get(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &value));
-  ASSERT_TRUE(called);
-  EXPECT_EQ(1u, status);
-  EXPECT_EQ(1u, nb_called);
-
-  cache.Get(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &value));
-  ASSERT_TRUE(called);
-  EXPECT_EQ(1u, status);
-  EXPECT_EQ(2u, nb_called);
-}
-
-TEST(LazyValueTest, CacheCallback) {
-  size_t nb_called = 0;
-  fit::function<void(size_t, size_t)> generator_callback;
-  auto generator = [&nb_called, &generator_callback](
-                       fit::function<void(size_t, size_t)> callback) {
-    ++nb_called;
-    generator_callback = std::move(callback);
-  };
-
-  LazyValue<size_t, size_t> cache(0, generator);
-
-  bool called1, called2;
-  size_t status1, status2;
-  size_t value1, value2;
-
-  cache.Get(
-      callback::Capture(callback::SetWhenCalled(&called1), &status1, &value1));
-
-  EXPECT_FALSE(called1);
-  EXPECT_EQ(1u, nb_called);
-
-  cache.Get(
-      callback::Capture(callback::SetWhenCalled(&called2), &status2, &value2));
-
-  EXPECT_FALSE(called2);
-  EXPECT_EQ(1u, nb_called);
-
-  generator_callback(0, 42);
-
-  ASSERT_TRUE(called1);
-  ASSERT_TRUE(called2);
-  EXPECT_EQ(1u, nb_called);
-  EXPECT_EQ(0u, status1);
-  EXPECT_EQ(42u, value1);
-  EXPECT_EQ(0u, status2);
-  EXPECT_EQ(42u, value2);
-}
-
-}  // namespace
-}  // namespace cache
diff --git a/bin/ledger/cache/lru_cache.h b/bin/ledger/cache/lru_cache.h
deleted file mode 100644
index 32a7845..0000000
--- a/bin/ledger/cache/lru_cache.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CACHE_LRU_CACHE_H_
-#define PERIDOT_BIN_LEDGER_CACHE_LRU_CACHE_H_
-
-#include <functional>
-#include <list>
-#include <map>
-#include <set>
-#include <vector>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-namespace cache {
-// Implements a self-populating LRU cache.
-//
-// This class allows the user to provide a generator for its data, and will
-// cache a given number of entries, discarding least used entries once its reach
-// its maximum capacity.
-//
-// K is the type of the key of the cached data.
-// V is the type of the cached data.
-// S is the type of the success status for the data generator.
-template <typename K, typename V, typename S>
-class LRUCache {
- public:
-  // Constructor.
-  //
-  // |size| is the maximum capacity of the cache.
-  // |ok_status| is the success status of the generator.
-  // |generator| generates the value to be cached for the given key. It takes a
-  //   callback to returns its result. It must return |ok_status| as a status
-  //   when the request is successful. Any other return value is considered a
-  //   failure.
-  LRUCache(size_t size, S ok_status,
-           fit::function<void(K, fit::function<void(S, V)>)> generator)
-      : size_(size), ok_status_(ok_status), generator_(std::move(generator)) {}
-
-  // Retrieves the value for |key| and returns it to |callback|.
-  //
-  // If the value is cached, |callback| will be called synchronously. Otherwise,
-  // |generator| will be called, and depending on its implementation, |callback|
-  // might be called synchronously or not.
-  void Get(const K& key, fit::function<void(S, const V&)> callback) {
-    auto iterator = map_.find(key);
-    if (iterator != map_.end()) {
-      // Move the list iterator to the front.
-      auto list_iterator = iterator->second;
-      values_.splice(values_.begin(), values_, list_iterator);
-
-      // Call back.
-      callback(ok_status_, iterator->second->second);
-      return;
-    }
-    auto request_iterator = requests_.find(key);
-    if (request_iterator != requests_.end()) {
-      request_iterator->second.push_back(std::move(callback));
-      return;
-    }
-    requests_[key].push_back(std::move(callback));
-    generator_(key, [this, key](S status, V value) {
-      auto request_iterator = requests_.find(key);
-      FXL_DCHECK(request_iterator != requests_.end());
-      auto callbacks = std::move(request_iterator->second);
-      requests_.erase(request_iterator);
-
-      if (status != ok_status_) {
-        for (const auto& callback : callbacks) {
-          callback(status, value);
-        }
-        return;
-      }
-
-      values_.emplace_front(key, value);
-      map_[std::move(key)] = values_.begin();
-      if (values_.size() > size_) {
-        map_.erase(values_.rbegin()->first);
-        values_.pop_back();
-      }
-      for (const auto& callback : callbacks) {
-        callback(status, value);
-      }
-    });
-  }
-
- private:
-  using ValueList = std::list<std::pair<K, V>>;
-  ValueList values_;
-  std::map<K, typename ValueList::iterator> map_;
-  std::map<K, std::vector<fit::function<void(S, const V&)>>> requests_;
-  size_t size_;
-  S ok_status_;
-  fit::function<void(K, fit::function<void(S, V)>)> generator_;
-};
-
-}  // namespace cache
-
-#endif  // PERIDOT_BIN_LEDGER_CACHE_LRU_CACHE_H_
diff --git a/bin/ledger/cache/lru_cache_unittest.cc b/bin/ledger/cache/lru_cache_unittest.cc
deleted file mode 100644
index d65d0c0..0000000
--- a/bin/ledger/cache/lru_cache_unittest.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cache/lru_cache.h"
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fit/function.h>
-
-#include "gtest/gtest.h"
-
-namespace cache {
-namespace {
-TEST(LRUCacheTest, SimpleGet) {
-  auto generator = [](size_t i, fit::function<void(size_t, size_t)> callback) {
-    callback(0, 2 * i);
-  };
-
-  LRUCache<size_t, size_t, size_t> cache(200, 0, generator);
-
-  bool called;
-  size_t status;
-  size_t value;
-  cache.Get(
-      0, callback::Capture(callback::SetWhenCalled(&called), &status, &value));
-  ASSERT_TRUE(called);
-  EXPECT_EQ(0u, status);
-  EXPECT_EQ(0u, value);
-
-  cache.Get(
-      42, callback::Capture(callback::SetWhenCalled(&called), &status, &value));
-  ASSERT_TRUE(called);
-  EXPECT_EQ(0u, status);
-  EXPECT_EQ(84u, value);
-}
-
-TEST(LRUCacheTest, FailingGenerator) {
-  size_t nb_called = 0;
-  auto generator = [&nb_called](size_t i,
-                                fit::function<void(size_t, size_t)> callback) {
-    ++nb_called;
-    callback(1, 0);
-  };
-
-  LRUCache<size_t, size_t, size_t> cache(200, 0, generator);
-
-  bool called;
-  size_t status;
-  size_t value;
-
-  cache.Get(
-      0, callback::Capture(callback::SetWhenCalled(&called), &status, &value));
-  ASSERT_TRUE(called);
-  EXPECT_EQ(1u, status);
-  EXPECT_EQ(1u, nb_called);
-
-  cache.Get(
-      0, callback::Capture(callback::SetWhenCalled(&called), &status, &value));
-  ASSERT_TRUE(called);
-  EXPECT_EQ(1u, status);
-  EXPECT_EQ(2u, nb_called);
-}
-
-TEST(LRUCacheTest, CacheCallback) {
-  size_t nb_called = 0;
-  fit::function<void(size_t, size_t)> generator_callback;
-  auto generator = [&nb_called, &generator_callback](
-                       size_t i, fit::function<void(size_t, size_t)> callback) {
-    ++nb_called;
-    generator_callback = std::move(callback);
-  };
-
-  LRUCache<size_t, size_t, size_t> cache(200, 0, generator);
-
-  bool called1, called2;
-  size_t status1, status2;
-  size_t value1, value2;
-
-  cache.Get(0, callback::Capture(callback::SetWhenCalled(&called1), &status1,
-                                 &value1));
-
-  EXPECT_FALSE(called1);
-  EXPECT_EQ(1u, nb_called);
-
-  cache.Get(0, callback::Capture(callback::SetWhenCalled(&called2), &status2,
-                                 &value2));
-
-  EXPECT_FALSE(called2);
-  EXPECT_EQ(1u, nb_called);
-
-  generator_callback(0, 42);
-
-  ASSERT_TRUE(called1);
-  ASSERT_TRUE(called2);
-  EXPECT_EQ(1u, nb_called);
-  EXPECT_EQ(0u, status1);
-  EXPECT_EQ(42u, value1);
-  EXPECT_EQ(0u, status2);
-  EXPECT_EQ(42u, value2);
-}
-
-TEST(LRUCacheTest, LRUPolicy) {
-  size_t nb_called = 0;
-  fit::function<void(size_t, size_t)> generator_callback;
-  auto generator = [&nb_called](size_t i,
-                                fit::function<void(size_t, size_t)> callback) {
-    ++nb_called;
-    callback(0u, 0u);
-  };
-
-  LRUCache<size_t, size_t, size_t> cache(3, 0, generator);
-
-  size_t status;
-  size_t value;
-
-  cache.Get(0, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(1u, nb_called);
-  cache.Get(0, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(1u, nb_called);
-  cache.Get(1, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(2u, nb_called);
-  cache.Get(2, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(3u, nb_called);
-  cache.Get(0, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(3u, nb_called);
-  cache.Get(1, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(3u, nb_called);
-  cache.Get(2, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(3u, nb_called);
-  cache.Get(3, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(4u, nb_called);
-  cache.Get(1, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(4u, nb_called);
-  cache.Get(2, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(4u, nb_called);
-  cache.Get(3, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(4u, nb_called);
-  cache.Get(0, callback::Capture([] {}, &status, &value));
-  EXPECT_EQ(5u, nb_called);
-}
-
-}  // namespace
-}  // namespace cache
diff --git a/bin/ledger/cloud_sync/BUILD.gn b/bin/ledger/cloud_sync/BUILD.gn
deleted file mode 100644
index e84d990..0000000
--- a/bin/ledger/cloud_sync/BUILD.gn
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("cloud_sync") {
-  deps = [
-    "//peridot/bin/ledger/cloud_sync/impl",
-    "//peridot/bin/ledger/cloud_sync/public",
-  ]
-}
diff --git a/bin/ledger/cloud_sync/impl/BUILD.gn b/bin/ledger/cloud_sync/impl/BUILD.gn
deleted file mode 100644
index f5406ae..0000000
--- a/bin/ledger/cloud_sync/impl/BUILD.gn
+++ /dev/null
@@ -1,79 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("impl") {
-  sources = [
-    "aggregator.cc",
-    "aggregator.h",
-    "batch_download.cc",
-    "batch_download.h",
-    "batch_upload.cc",
-    "batch_upload.h",
-    "constants.h",
-    "ledger_sync_impl.cc",
-    "ledger_sync_impl.h",
-    "page_download.cc",
-    "page_download.h",
-    "page_sync_impl.cc",
-    "page_sync_impl.h",
-    "page_upload.cc",
-    "page_upload.h",
-    "user_sync_impl.cc",
-    "user_sync_impl.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/backoff",
-    "//peridot/bin/ledger/cloud_sync/public",
-    "//peridot/bin/ledger/encryption/impl",
-    "//peridot/bin/ledger/encryption/public",
-    "//peridot/bin/ledger/environment",
-    "//peridot/bin/ledger/fidl/include",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/lib/commit_pack",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//peridot/bin/ledger/encryption/primitives",
-    "//zircon/public/lib/trace",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "aggregator_unittest.cc",
-    "batch_download_unittest.cc",
-    "batch_upload_unittest.cc",
-    "page_download_unittest.cc",
-    "page_sync_impl_unittest.cc",
-    "page_upload_unittest.cc",
-    "user_sync_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":impl",
-    "//garnet/public/lib/backoff/testing",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/cloud_sync/impl/testing",
-    "//peridot/bin/ledger/cloud_sync/testing",
-    "//peridot/bin/ledger/encryption/fake",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/bin/ledger/storage/testing",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/scoped_tmpfs",
-    "//third_party/googletest:gmock",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/cloud_sync/impl/aggregator.cc b/bin/ledger/cloud_sync/impl/aggregator.cc
deleted file mode 100644
index 6667c04..0000000
--- a/bin/ledger/cloud_sync/impl/aggregator.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/aggregator.h"
-
-#include <memory>
-
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-
-namespace cloud_sync {
-class Aggregator::Listener : public SyncStateWatcher {
- public:
-  explicit Listener(Aggregator* aggregator);
-  ~Listener() override;
-
-  // Notify the client watcher, if present, of a new state.
-  void Notify(SyncStateWatcher::SyncStateContainer sync_state) override;
-
-  SyncStateWatcher::SyncStateContainer GetCurrentState();
-
- private:
-  SyncStateWatcher::SyncStateContainer state_;
-
-  Aggregator* aggregator_;
-};
-
-Aggregator::Listener::Listener(Aggregator* aggregator)
-    : aggregator_(aggregator) {}
-
-Aggregator::Listener::~Listener() { aggregator_->UnregisterListener(this); }
-
-void Aggregator::Listener::Notify(
-    SyncStateWatcher::SyncStateContainer sync_state) {
-  state_ = sync_state;
-  aggregator_->NewStateAvailable();
-}
-
-SyncStateWatcher::SyncStateContainer Aggregator::Listener::GetCurrentState() {
-  return state_;
-}
-
-Aggregator::Aggregator() {}
-
-Aggregator::~Aggregator() {
-  // There should be no listener left when destroying this object.
-  FXL_DCHECK(listeners_.empty());
-}
-
-void Aggregator::SetBaseWatcher(SyncStateWatcher* base_watcher) {
-  base_watcher_ = base_watcher;
-  if (base_watcher_) {
-    base_watcher_->Notify(state_);
-  }
-}
-
-std::unique_ptr<SyncStateWatcher> Aggregator::GetNewStateWatcher() {
-  std::unique_ptr<Listener> listener = std::make_unique<Listener>(this);
-  listeners_.insert(listener.get());
-  return listener;
-}
-
-void Aggregator::UnregisterListener(Listener* listener) {
-  listeners_.erase(listener);
-}
-
-void Aggregator::NewStateAvailable() {
-  SyncStateWatcher::SyncStateContainer new_state;
-  for (Aggregator::Listener* listener : listeners_) {
-    new_state.Merge(listener->GetCurrentState());
-  }
-  if (new_state != state_) {
-    state_ = new_state;
-    if (base_watcher_) {
-      base_watcher_->Notify(state_);
-    }
-  }
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/aggregator.h b/bin/ledger/cloud_sync/impl/aggregator.h
deleted file mode 100644
index 994556d..0000000
--- a/bin/ledger/cloud_sync/impl/aggregator.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_AGGREGATOR_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_AGGREGATOR_H_
-
-#include <memory>
-#include <set>
-
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-
-namespace cloud_sync {
-
-// Aggregator collects notifications from several watchers generated using
-// |GetNewStateWatcher| into one notification stream sent to the watcher set in
-// the constructor.
-class Aggregator {
- public:
-  Aggregator();
-  ~Aggregator();
-
-  // Sets the base watcher that will receive the aggregated notification stream.
-  void SetBaseWatcher(cloud_sync::SyncStateWatcher* base_watcher);
-
-  // Generates a new source of notifications for this aggregator. Note that
-  // std::unique_ptr<SyncStateWatcher> should remain alive as long as the
-  // Aggregator object is alive.
-  std::unique_ptr<SyncStateWatcher> GetNewStateWatcher();
-
- private:
-  class Listener;
-
-  void UnregisterListener(Listener* listener);
-  void NewStateAvailable();
-
-  SyncStateWatcher::SyncStateContainer state_;
-
-  std::set<Listener*> listeners_;
-  SyncStateWatcher* base_watcher_ = nullptr;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(Aggregator);
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_AGGREGATOR_H_
diff --git a/bin/ledger/cloud_sync/impl/aggregator_unittest.cc b/bin/ledger/cloud_sync/impl/aggregator_unittest.cc
deleted file mode 100644
index 45ef36b..0000000
--- a/bin/ledger/cloud_sync/impl/aggregator_unittest.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/aggregator.h"
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-
-namespace cloud_sync {
-
-namespace {
-
-class RecordingWatcher : public SyncStateWatcher {
- public:
-  void Notify(SyncStateContainer sync_state) override {
-    states.push_back(sync_state);
-  }
-
-  std::vector<SyncStateContainer> states;
-};
-
-TEST(AggregatorTest, SendFirstNotification) {
-  std::unique_ptr<RecordingWatcher> base_watcher =
-      std::make_unique<RecordingWatcher>();
-  Aggregator aggregator;
-  aggregator.SetBaseWatcher(base_watcher.get());
-
-  std::unique_ptr<SyncStateWatcher> watcher1 = aggregator.GetNewStateWatcher();
-  watcher1->Notify(DOWNLOAD_IN_PROGRESS, UPLOAD_WAIT_REMOTE_DOWNLOAD);
-
-  ASSERT_EQ(2u, base_watcher->states.size());
-  EXPECT_EQ(DOWNLOAD_IN_PROGRESS, base_watcher->states[1].download);
-  EXPECT_EQ(UPLOAD_WAIT_REMOTE_DOWNLOAD, base_watcher->states[1].upload);
-}
-
-TEST(AggregatorTest, AggregateTwo) {
-  std::unique_ptr<RecordingWatcher> base_watcher =
-      std::make_unique<RecordingWatcher>();
-
-  Aggregator aggregator;
-  aggregator.SetBaseWatcher(base_watcher.get());
-
-  std::unique_ptr<SyncStateWatcher> watcher1 = aggregator.GetNewStateWatcher();
-  std::unique_ptr<SyncStateWatcher> watcher2 = aggregator.GetNewStateWatcher();
-
-  EXPECT_EQ(DOWNLOAD_IDLE, base_watcher->states.rbegin()->download);
-  EXPECT_EQ(UPLOAD_IDLE, base_watcher->states.rbegin()->upload);
-
-  watcher1->Notify(DOWNLOAD_IN_PROGRESS, UPLOAD_WAIT_REMOTE_DOWNLOAD);
-
-  EXPECT_EQ(DOWNLOAD_IN_PROGRESS, base_watcher->states.rbegin()->download);
-  EXPECT_EQ(UPLOAD_WAIT_REMOTE_DOWNLOAD, base_watcher->states.rbegin()->upload);
-
-  watcher2->Notify(DOWNLOAD_IDLE, UPLOAD_IDLE);
-  EXPECT_EQ(DOWNLOAD_IN_PROGRESS, base_watcher->states.rbegin()->download);
-  EXPECT_EQ(UPLOAD_WAIT_REMOTE_DOWNLOAD, base_watcher->states.rbegin()->upload);
-
-  watcher1->Notify(DOWNLOAD_IDLE, UPLOAD_IN_PROGRESS);
-  EXPECT_EQ(DOWNLOAD_IDLE, base_watcher->states.rbegin()->download);
-  EXPECT_EQ(UPLOAD_IN_PROGRESS, base_watcher->states.rbegin()->upload);
-}
-
-TEST(AggregatorTest, ResetWatcher) {
-  std::unique_ptr<RecordingWatcher> base_watcher =
-      std::make_unique<RecordingWatcher>();
-  Aggregator aggregator;
-  aggregator.SetBaseWatcher(base_watcher.get());
-
-  std::unique_ptr<SyncStateWatcher> watcher1 = aggregator.GetNewStateWatcher();
-  watcher1->Notify(DOWNLOAD_IN_PROGRESS, UPLOAD_WAIT_REMOTE_DOWNLOAD);
-
-  ASSERT_EQ(2u, base_watcher->states.size());
-  EXPECT_EQ(DOWNLOAD_IN_PROGRESS, base_watcher->states[1].download);
-  EXPECT_EQ(UPLOAD_WAIT_REMOTE_DOWNLOAD, base_watcher->states[1].upload);
-
-  std::unique_ptr<RecordingWatcher> base_watcher2 =
-      std::make_unique<RecordingWatcher>();
-  aggregator.SetBaseWatcher(base_watcher2.get());
-
-  ASSERT_EQ(1u, base_watcher2->states.size());
-  EXPECT_EQ(DOWNLOAD_IN_PROGRESS, base_watcher2->states[0].download);
-  EXPECT_EQ(UPLOAD_WAIT_REMOTE_DOWNLOAD, base_watcher2->states[0].upload);
-
-  watcher1->Notify(DOWNLOAD_IDLE, UPLOAD_IDLE);
-
-  ASSERT_EQ(2u, base_watcher2->states.size());
-  EXPECT_EQ(DOWNLOAD_IDLE, base_watcher2->states[1].download);
-  EXPECT_EQ(UPLOAD_IDLE, base_watcher2->states[1].upload);
-
-  // States in first base watcher have not changed.
-  EXPECT_EQ(2u, base_watcher->states.size());
-}
-
-}  // namespace
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/batch_download.cc b/bin/ledger/cloud_sync/impl/batch_download.cc
deleted file mode 100644
index 6264c2f..0000000
--- a/bin/ledger/cloud_sync/impl/batch_download.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/batch_download.h"
-
-#include <utility>
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/constants.h"
-
-namespace cloud_sync {
-
-BatchDownload::BatchDownload(
-    storage::PageStorage* storage,
-    encryption::EncryptionService* encryption_service,
-    std::vector<cloud_provider::CommitPackEntry> entries,
-    std::unique_ptr<cloud_provider::Token> position_token, fit::closure on_done,
-    fit::closure on_error)
-    : storage_(storage),
-      encryption_service_(encryption_service),
-      entries_(std::move(entries)),
-      position_token_(std::move(position_token)),
-      on_done_(std::move(on_done)),
-      on_error_(std::move(on_error)),
-      weak_ptr_factory_(this) {
-  FXL_DCHECK(storage);
-  TRACE_ASYNC_BEGIN("ledger", "batch_download",
-                    reinterpret_cast<uintptr_t>(this));
-}
-
-BatchDownload::~BatchDownload() {
-  TRACE_ASYNC_END("ledger", "batch_download",
-                  reinterpret_cast<uintptr_t>(this));
-}
-
-void BatchDownload::Start() {
-  FXL_DCHECK(!started_);
-  started_ = true;
-  auto waiter = fxl::MakeRefCounted<callback::Waiter<
-      encryption::Status, storage::PageStorage::CommitIdAndBytes>>(
-      encryption::Status::OK);
-  for (auto& entry : entries_) {
-    encryption_service_->DecryptCommit(
-        entry.data,
-        [id = entry.id, callback = waiter->NewCallback()](
-            encryption::Status status, std::string content) mutable {
-          callback(status, storage::PageStorage::CommitIdAndBytes(
-                               std::move(id), std::move(content)));
-        });
-  }
-  waiter->Finalize(callback::MakeScoped(
-      weak_ptr_factory_.GetWeakPtr(),
-      [this](encryption::Status status,
-             std::vector<storage::PageStorage::CommitIdAndBytes> commits) {
-        if (status != encryption::Status::OK) {
-          on_error_();
-          return;
-        }
-
-        storage_->AddCommitsFromSync(
-            std::move(commits), storage::ChangeSource::CLOUD,
-            callback::MakeScoped(
-                weak_ptr_factory_.GetWeakPtr(),
-                [this](storage::Status status,
-                       std::vector<storage::CommitId> /*commit_ids*/) {
-                  if (status != storage::Status::OK) {
-                    on_error_();
-                    return;
-                  }
-
-                  UpdateTimestampAndQuit();
-                }));
-      }));
-}
-
-void BatchDownload::UpdateTimestampAndQuit() {
-  if (!position_token_) {
-    // Can be deleted within.
-    on_done_();
-    return;
-  }
-
-  storage_->SetSyncMetadata(
-      kTimestampKey, convert::ToString(position_token_->opaque_id),
-      callback::MakeScoped(weak_ptr_factory_.GetWeakPtr(),
-                           [this](storage::Status status) {
-                             if (status != storage::Status::OK) {
-                               on_error_();
-                               return;
-                             }
-
-                             // Can be deleted within.
-                             on_done_();
-                           }));
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/batch_download.h b/bin/ledger/cloud_sync/impl/batch_download.h
deleted file mode 100644
index f26139d..0000000
--- a/bin/ledger/cloud_sync/impl/batch_download.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_BATCH_DOWNLOAD_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_BATCH_DOWNLOAD_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/lib/commit_pack/commit_pack.h"
-
-namespace cloud_sync {
-
-// Adds a batch of remote commits to storage.
-//
-// Given a list of commit metadata, this class makes a request to add them to
-// storage, and waits until storage confirms that the operation completed before
-// calling |on_done|.
-//
-// The operation is not retryable, and errors reported through |on_error| are
-// not recoverable.
-class BatchDownload {
- public:
-  BatchDownload(storage::PageStorage* storage,
-                encryption::EncryptionService* encryption_service,
-                std::vector<cloud_provider::CommitPackEntry> entries,
-                std::unique_ptr<cloud_provider::Token> position_token,
-                fit::closure on_done, fit::closure on_error);
-  ~BatchDownload();
-
-  // Can be called only once.
-  void Start();
-
- private:
-  void UpdateTimestampAndQuit();
-
-  storage::PageStorage* const storage_;
-  encryption::EncryptionService* const encryption_service_;
-  std::vector<cloud_provider::CommitPackEntry> entries_;
-  std::unique_ptr<cloud_provider::Token> position_token_;
-  fit::closure on_done_;
-  fit::closure on_error_;
-  bool started_ = false;
-
-  // Must be the last member.
-  fxl::WeakPtrFactory<BatchDownload> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(BatchDownload);
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_BATCH_DOWNLOAD_H_
diff --git a/bin/ledger/cloud_sync/impl/batch_download_unittest.cc b/bin/ledger/cloud_sync/impl/batch_download_unittest.cc
deleted file mode 100644
index 70c5333..0000000
--- a/bin/ledger/cloud_sync/impl/batch_download_unittest.cc
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/batch_download.h"
-
-#include <map>
-
-#include <lib/async/cpp/task.h>
-#include <lib/callback/capture.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/cloud_sync/impl/constants.h"
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_page_cloud.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/storage/testing/page_storage_empty_impl.h"
-
-namespace cloud_sync {
-
-namespace {
-
-// Creates a dummy continuation token.
-std::unique_ptr<cloud_provider::Token> MakeToken(
-    convert::ExtendedStringView token_id) {
-  auto token = std::make_unique<cloud_provider::Token>();
-  token->opaque_id = convert::ToArray(token_id);
-  return token;
-}
-
-// Fake implementation of storage::PageStorage. Injects the data that
-// CommitUpload asks about: page id and unsynced objects to be uploaded.
-// Registers the reported results of the upload: commits and objects marked as
-// synced.
-class TestPageStorage : public storage::PageStorageEmptyImpl {
- public:
-  explicit TestPageStorage(async_dispatcher_t* dispatcher)
-      : dispatcher_(dispatcher) {}
-
-  void AddCommitsFromSync(
-      std::vector<storage::PageStorage::CommitIdAndBytes> ids_and_bytes,
-      storage::ChangeSource source,
-      fit::function<void(storage::Status, std::vector<storage::CommitId>)>
-          callback) override {
-    ASSERT_EQ(storage::ChangeSource::CLOUD, source);
-    if (should_fail_add_commit_from_sync) {
-      async::PostTask(dispatcher_, [callback = std::move(callback)]() {
-        callback(storage::Status::IO_ERROR, {});
-      });
-      return;
-    }
-    async::PostTask(
-        dispatcher_, [this, ids_and_bytes = std::move(ids_and_bytes),
-                      callback = std::move(callback)]() mutable {
-          for (auto& commit : ids_and_bytes) {
-            received_commits[std::move(commit.id)] = std::move(commit.bytes);
-          }
-          callback(storage::Status::OK, {});
-        });
-  }
-
-  void SetSyncMetadata(fxl::StringView key, fxl::StringView value,
-                       fit::function<void(storage::Status)> callback) override {
-    sync_metadata[key.ToString()] = value.ToString();
-    async::PostTask(dispatcher_, [callback = std::move(callback)]() {
-      callback(storage::Status::OK);
-    });
-  }
-
-  bool should_fail_add_commit_from_sync = false;
-  std::map<storage::CommitId, std::string> received_commits;
-  std::map<std::string, std::string> sync_metadata;
-
- private:
-  async_dispatcher_t* const dispatcher_;
-};
-
-class BatchDownloadTest : public gtest::TestLoopFixture {
- public:
-  BatchDownloadTest()
-      : storage_(dispatcher()), encryption_service_(dispatcher()) {}
-  ~BatchDownloadTest() override {}
-
- protected:
-  TestPageStorage storage_;
-  encryption::FakeEncryptionService encryption_service_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(BatchDownloadTest);
-};
-
-TEST_F(BatchDownloadTest, AddCommit) {
-  int done_calls = 0;
-  int error_calls = 0;
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  entries.push_back(MakeTestCommit(&encryption_service_, "id1", "content1"));
-  BatchDownload batch_download(
-      &storage_, &encryption_service_, std::move(entries), MakeToken("42"),
-      [&done_calls] { done_calls++; }, [&error_calls] { error_calls++; });
-  batch_download.Start();
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, done_calls);
-  EXPECT_EQ(0, error_calls);
-  EXPECT_EQ(1u, storage_.received_commits.size());
-  EXPECT_EQ("content1", storage_.received_commits["id1"]);
-  EXPECT_EQ("42", storage_.sync_metadata[kTimestampKey.ToString()]);
-}
-
-TEST_F(BatchDownloadTest, AddMultipleCommits) {
-  int done_calls = 0;
-  int error_calls = 0;
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  entries.push_back(MakeTestCommit(&encryption_service_, "id1", "content1"));
-  entries.push_back(MakeTestCommit(&encryption_service_, "id2", "content2"));
-  BatchDownload batch_download(
-      &storage_, &encryption_service_, std::move(entries), MakeToken("43"),
-      [&done_calls] { done_calls++; }, [&error_calls] { error_calls++; });
-  batch_download.Start();
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, done_calls);
-  EXPECT_EQ(0, error_calls);
-  EXPECT_EQ(2u, storage_.received_commits.size());
-  EXPECT_EQ("content1", storage_.received_commits["id1"]);
-  EXPECT_EQ("content2", storage_.received_commits["id2"]);
-  EXPECT_EQ("43", storage_.sync_metadata[kTimestampKey.ToString()]);
-}
-
-TEST_F(BatchDownloadTest, FailToAddCommit) {
-  int done_calls = 0;
-  int error_calls = 0;
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  entries.push_back(MakeTestCommit(&encryption_service_, "id1", "content1"));
-  BatchDownload batch_download(
-      &storage_, &encryption_service_, std::move(entries), MakeToken("42"),
-      [&done_calls] { done_calls++; }, [&error_calls] { error_calls++; });
-  storage_.should_fail_add_commit_from_sync = true;
-  batch_download.Start();
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(0, done_calls);
-  EXPECT_EQ(1, error_calls);
-  EXPECT_TRUE(storage_.received_commits.empty());
-  EXPECT_EQ(0u, storage_.sync_metadata.count(kTimestampKey.ToString()));
-}
-
-}  // namespace
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/batch_upload.cc b/bin/ledger/cloud_sync/impl/batch_upload.cc
deleted file mode 100644
index 229f3a1..0000000
--- a/bin/ledger/cloud_sync/impl/batch_upload.cc
+++ /dev/null
@@ -1,347 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/batch_upload.h"
-
-#include <algorithm>
-#include <set>
-#include <utility>
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/callback/trace_callback.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <trace/event.h>
-
-#include "peridot/lib/commit_pack/commit_pack.h"
-
-namespace cloud_sync {
-
-BatchUpload::BatchUpload(
-    storage::PageStorage* storage,
-    encryption::EncryptionService* encryption_service,
-    cloud_provider::PageCloudPtr* page_cloud,
-    std::vector<std::unique_ptr<const storage::Commit>> commits,
-    fit::closure on_done, fit::function<void(ErrorType)> on_error,
-    unsigned int max_concurrent_uploads)
-    : storage_(storage),
-      encryption_service_(encryption_service),
-      page_cloud_(page_cloud),
-      commits_(std::move(commits)),
-      on_done_(std::move(on_done)),
-      on_error_(std::move(on_error)),
-      max_concurrent_uploads_(max_concurrent_uploads),
-      weak_ptr_factory_(this) {
-  TRACE_ASYNC_BEGIN("ledger", "batch_upload",
-                    reinterpret_cast<uintptr_t>(this));
-  FXL_DCHECK(storage_);
-  FXL_DCHECK(page_cloud_);
-}
-
-BatchUpload::~BatchUpload() {
-  TRACE_ASYNC_END("ledger", "batch_upload", reinterpret_cast<uintptr_t>(this));
-}
-
-void BatchUpload::Start() {
-  FXL_DCHECK(!started_);
-  FXL_DCHECK(!errored_);
-  started_ = true;
-  storage_->GetUnsyncedPieces(callback::MakeScoped(
-      weak_ptr_factory_.GetWeakPtr(),
-      [this](storage::Status status,
-             std::vector<storage::ObjectIdentifier> object_identifiers) {
-        if (status != storage::Status::OK) {
-          errored_ = true;
-          on_error_(ErrorType::PERMANENT);
-          return;
-        }
-        remaining_object_identifiers_ = std::move(object_identifiers);
-        StartObjectUpload();
-      }));
-}
-
-void BatchUpload::Retry() {
-  FXL_DCHECK(started_);
-  FXL_DCHECK(errored_);
-  errored_ = false;
-  error_type_ = ErrorType::TEMPORARY;
-  StartObjectUpload();
-}
-
-void BatchUpload::StartObjectUpload() {
-  FXL_DCHECK(current_uploads_ == 0u);
-  // If there are no unsynced objects left, upload the commits.
-  if (remaining_object_identifiers_.empty()) {
-    FilterAndUploadCommits();
-    return;
-  }
-
-  while (current_uploads_ < max_concurrent_uploads_ &&
-         !remaining_object_identifiers_.empty()) {
-    UploadNextObject();
-  }
-}
-
-void BatchUpload::UploadNextObject() {
-  FXL_DCHECK(!remaining_object_identifiers_.empty());
-  FXL_DCHECK(current_uploads_ < max_concurrent_uploads_);
-  current_uploads_++;
-  current_objects_handled_++;
-  auto object_identifier_to_send =
-      std::move(remaining_object_identifiers_.back());
-  // Pop the object from the queue - if the upload fails, we will re-enqueue it.
-  remaining_object_identifiers_.pop_back();
-
-  // TODO(qsr): Retrieving the object name should be done in parallel with
-  // retrieving the object content.
-  encryption_service_->GetObjectName(
-      object_identifier_to_send,
-      callback::MakeScoped(weak_ptr_factory_.GetWeakPtr(),
-                           [this, object_identifier_to_send](
-                               encryption::Status encryption_status,
-                               std::string object_name) mutable {
-                             if (encryption_status != encryption::Status::OK) {
-                               EnqueueForRetryAndSignalError(
-                                   std::move(object_identifier_to_send));
-                               return;
-                             }
-
-                             GetObjectContentAndUpload(
-                                 std::move(object_identifier_to_send),
-                                 std::move(object_name));
-                           }));
-}
-
-void BatchUpload::GetObjectContentAndUpload(
-    storage::ObjectIdentifier object_identifier, std::string object_name) {
-  storage_->GetPiece(
-      object_identifier,
-      callback::MakeScoped(
-          weak_ptr_factory_.GetWeakPtr(),
-          [this, object_identifier, object_name = std::move(object_name)](
-              storage::Status storage_status,
-              std::unique_ptr<const storage::Object> object) mutable {
-            FXL_DCHECK(storage_status == storage::Status::OK);
-            UploadObject(std::move(object_identifier), std::move(object_name),
-                         std::move(object));
-          }));
-}
-
-void BatchUpload::UploadObject(storage::ObjectIdentifier object_identifier,
-                               std::string object_name,
-                               std::unique_ptr<const storage::Object> object) {
-  fsl::SizedVmo data;
-  auto status = object->GetVmo(&data);
-  // TODO(ppi): LE-225 Handle disk IO errors.
-  FXL_DCHECK(status == storage::Status::OK);
-
-  encryption_service_->EncryptObject(
-      std::move(object_identifier), std::move(data),
-      callback::MakeScoped(weak_ptr_factory_.GetWeakPtr(),
-                           [this, object_identifier = object->GetIdentifier(),
-                            object_name = std::move(object_name)](
-                               encryption::Status encryption_status,
-                               std::string encrypted_data) mutable {
-                             if (encryption_status != encryption::Status::OK) {
-                               EnqueueForRetryAndSignalError(
-                                   std::move(object_identifier));
-                               return;
-                             }
-
-                             UploadEncryptedObject(std::move(object_identifier),
-                                                   std::move(object_name),
-                                                   std::move(encrypted_data));
-                           }));
-}
-
-void BatchUpload::UploadEncryptedObject(
-    storage::ObjectIdentifier object_identifier, std::string object_name,
-    std::string content) {
-  fsl::SizedVmo data;
-  if (!fsl::VmoFromString(content, &data)) {
-    EnqueueForRetryAndSignalError(std::move(object_identifier));
-    return;
-  }
-
-  (*page_cloud_)
-      ->AddObject(
-          convert::ToArray(object_name), std::move(data).ToTransport(),
-          callback::MakeScoped(
-              weak_ptr_factory_.GetWeakPtr(),
-              [this, object_identifier = std::move(object_identifier)](
-                  cloud_provider::Status status) mutable {
-                FXL_DCHECK(current_uploads_ > 0);
-                current_uploads_--;
-
-                if (status != cloud_provider::Status::OK) {
-                  EnqueueForRetryAndSignalError(std::move(object_identifier));
-                  return;
-                }
-
-                // Uploading the object succeeded.
-                storage_->MarkPieceSynced(
-                    std::move(object_identifier),
-                    callback::MakeScoped(
-                        weak_ptr_factory_.GetWeakPtr(),
-                        [this](storage::Status status) {
-                          FXL_DCHECK(current_objects_handled_ > 0);
-                          current_objects_handled_--;
-
-                          if (status != storage::Status::OK) {
-                            errored_ = true;
-                            error_type_ = ErrorType::PERMANENT;
-                          }
-
-                          // Notify the user about the error once all pending
-                          // operations of the recent retry complete.
-                          if (errored_ && current_objects_handled_ == 0u) {
-                            on_error_(error_type_);
-                            return;
-                          }
-
-                          if (current_objects_handled_ == 0 &&
-                              remaining_object_identifiers_.empty()) {
-                            // All the referenced objects are uploaded and
-                            // marked as synced, upload the commits.
-                            FilterAndUploadCommits();
-                            return;
-                          }
-
-                          if (!errored_ &&
-                              !remaining_object_identifiers_.empty()) {
-                            UploadNextObject();
-                          }
-                        }));
-              }));
-}
-
-void BatchUpload::FilterAndUploadCommits() {
-  // Remove all commits that have been synced since this upload object was
-  // created. This will happen if a merge is executed on multiple devices at the
-  // same time.
-  storage_->GetUnsyncedCommits(callback::MakeScoped(
-      weak_ptr_factory_.GetWeakPtr(),
-      [this](storage::Status status,
-             std::vector<std::unique_ptr<const storage::Commit>> commits) {
-        std::set<storage::CommitId> commit_ids;
-        std::transform(
-            commits.begin(), commits.end(),
-            std::inserter(commit_ids, commit_ids.begin()),
-            [](const std::unique_ptr<const storage::Commit>& commit) {
-              return commit->GetId();
-            });
-
-        commits_.erase(
-            std::remove_if(
-                commits_.begin(), commits_.end(),
-                [&commit_ids](
-                    const std::unique_ptr<const storage::Commit>& commit) {
-                  return commit_ids.count(commit->GetId()) == 0;
-                }),
-            commits_.end());
-
-        if (commits_.empty()) {
-          // Return early, all commits are synced.
-          on_done_();
-          return;
-        }
-        UploadCommits();
-      }));
-}
-
-void BatchUpload::UploadCommits() {
-  FXL_DCHECK(!errored_);
-  std::vector<storage::CommitId> ids;
-  auto waiter = fxl::MakeRefCounted<
-      callback::Waiter<encryption::Status, cloud_provider::CommitPackEntry>>(
-      encryption::Status::OK);
-  for (auto& storage_commit : commits_) {
-    storage::CommitId id = storage_commit->GetId();
-    encryption_service_->EncryptCommit(
-        storage_commit->GetStorageBytes().ToString(),
-        [id, callback = waiter->NewCallback()](
-            encryption::Status status,
-            std::string encrypted_storage_bytes) mutable {
-          cloud_provider::CommitPackEntry entry;
-          entry.id = std::move(id);
-          entry.data = std::move(encrypted_storage_bytes);
-          callback(status, std::move(entry));
-        });
-    ids.push_back(std::move(id));
-  }
-  waiter->Finalize(callback::MakeScoped(
-      weak_ptr_factory_.GetWeakPtr(),
-      [this, ids = std::move(ids)](
-          encryption::Status status,
-          std::vector<cloud_provider::CommitPackEntry> entries) mutable {
-        if (status != encryption::Status::OK) {
-          errored_ = true;
-          on_error_(ErrorType::PERMANENT);
-          return;
-        }
-        cloud_provider::CommitPack commit_pack;
-        if (!cloud_provider::EncodeCommitPack(entries, &commit_pack)) {
-          errored_ = true;
-          on_error_(ErrorType::PERMANENT);
-          return;
-        }
-        (*page_cloud_)
-            ->AddCommits(
-                std::move(commit_pack),
-                callback::MakeScoped(
-                    weak_ptr_factory_.GetWeakPtr(),
-                    [this, commit_ids =
-                               std::move(ids)](cloud_provider::Status status) {
-                      // UploadCommit() is called as a last step of a
-                      // so-far-successful upload attempt, so we couldn't have
-                      // failed before.
-                      FXL_DCHECK(!errored_);
-                      if (status != cloud_provider::Status::OK) {
-                        errored_ = true;
-                        on_error_(ErrorType::TEMPORARY);
-                        return;
-                      }
-                      auto waiter = fxl::MakeRefCounted<
-                          callback::StatusWaiter<storage::Status>>(
-                          storage::Status::OK);
-
-                      for (auto& id : commit_ids) {
-                        storage_->MarkCommitSynced(id, waiter->NewCallback());
-                      }
-                      waiter->Finalize(callback::MakeScoped(
-                          weak_ptr_factory_.GetWeakPtr(),
-                          [this](storage::Status status) {
-                            if (status != storage::Status::OK) {
-                              errored_ = true;
-                              on_error_(ErrorType::PERMANENT);
-                              return;
-                            }
-
-                            // This object can be deleted in the
-                            // on_done_() callback, don't do
-                            // anything after the call.
-                            on_done_();
-                          }));
-                    }));
-      }));
-}
-
-void BatchUpload::EnqueueForRetryAndSignalError(
-    storage::ObjectIdentifier object_identifier) {
-  FXL_DCHECK(current_objects_handled_ > 0);
-  current_objects_handled_--;
-
-  errored_ = true;
-  // Re-enqueue the object for another upload attempt.
-  remaining_object_identifiers_.push_back(std::move(object_identifier));
-
-  if (current_objects_handled_ == 0u) {
-    on_error_(error_type_);
-  }
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/batch_upload.h b/bin/ledger/cloud_sync/impl/batch_upload.h
deleted file mode 100644
index 93cb011..0000000
--- a/bin/ledger/cloud_sync/impl/batch_upload.h
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_BATCH_UPLOAD_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_BATCH_UPLOAD_H_
-
-#include <functional>
-#include <memory>
-#include <vector>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace cloud_sync {
-
-// Uploads a batch of commits along with unsynced storage objects and marks
-// the uploaded artifacts as synced.
-//
-// Contract: The class doesn't reason about objects referenced by each commit,
-// and instead uploads each unsynced object present in storage at the moment of
-// calling Start(). Unsynced objects are marked as synced as they are uploaded.
-// The commits in the batch are uploaded in one network request once all objects
-// are uploaded.
-//
-// Usage: call Start() to kick off the upload. |on_done| is called after the
-// upload is successfully completed. |on_error| will be called at most once
-// after each error. Each time after |on_error| is called the client can
-// call Retry() once to retry the upload.
-// TODO(ppi): rather than DCHECK on storage errors, take separate callbacks for
-// network and disk errors and let PageSync decide on how to handle each.
-//
-// Lifetime: if BatchUpload is deleted between Start() and |on_done| being
-// called, it has to be deleted along with |storage| and |cloud_provider|, which
-// otherwise can retain callbacks for pending uploads. This isn't a problem as
-// long as the lifetime of page storage and page sync is managed together.
-class BatchUpload {
- public:
-  // In case of error in BatchUpload, ErrorType defines whether the error that
-  // occurred is temporary (from cloud or auth provider), or permanent (from
-  // storage or from encryption).
-  enum class ErrorType {
-    PERMANENT,
-    TEMPORARY,
-  };
-
-  BatchUpload(storage::PageStorage* storage,
-              encryption::EncryptionService* encryption_service,
-              cloud_provider::PageCloudPtr* page_cloud,
-              std::vector<std::unique_ptr<const storage::Commit>> commits,
-              fit::closure on_done, fit::function<void(ErrorType)> on_error,
-              unsigned int max_concurrent_uploads = 10);
-  ~BatchUpload();
-
-  // Starts a new upload attempt. Results are reported through |on_done|
-  // and |on_error| passed in the constructor. Can be called only once.
-  void Start();
-
-  // Retries the attempt to upload the commit batch. Each time after |on_error|
-  // is called, the client can retry by calling this method.
-  void Retry();
-
- private:
-  void StartObjectUpload();
-
-  void UploadNextObject();
-
-  // Retrieves the content of the given object and uploads it.
-  void GetObjectContentAndUpload(storage::ObjectIdentifier object_identifier,
-                                 std::string object_name);
-
-  // Uploads the given object.
-  void UploadObject(storage::ObjectIdentifier object_identifier,
-                    std::string object_name,
-                    std::unique_ptr<const storage::Object> object);
-
-  // Uploads the given object.
-  void UploadEncryptedObject(storage::ObjectIdentifier object_identifier,
-                             std::string object_name, std::string content);
-
-  // Filters already synced commits.
-  void FilterAndUploadCommits();
-
-  // Uploads the commits.
-  void UploadCommits();
-
-  // Notifies an error when trying to upload the given object.
-  void EnqueueForRetryAndSignalError(
-      storage::ObjectIdentifier object_identifier);
-
-  storage::PageStorage* const storage_;
-  encryption::EncryptionService* const encryption_service_;
-  cloud_provider::PageCloudPtr* const page_cloud_;
-  std::vector<std::unique_ptr<const storage::Commit>> commits_;
-  fit::closure on_done_;
-  fit::function<void(ErrorType)> on_error_;
-  const unsigned int max_concurrent_uploads_;
-
-  // All remaining object ids to be uploaded along with this batch of commits.
-  std::vector<storage::ObjectIdentifier> remaining_object_identifiers_;
-
-  // Number of object uploads currently in progress.
-  unsigned int current_uploads_ = 0u;
-
-  // Number of object being handled, including those being uploaded and those
-  // whose metadata are being updated in storage.
-  unsigned int current_objects_handled_ = 0u;
-
-  bool started_ = false;
-  bool errored_ = false;
-  // If an error has occurred while handling the objects, |error_types_|
-  // stores the type of error.
-  ErrorType error_type_ = ErrorType::TEMPORARY;
-
-  // Must be the last member.
-  fxl::WeakPtrFactory<BatchUpload> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(BatchUpload);
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_BATCH_UPLOAD_H_
diff --git a/bin/ledger/cloud_sync/impl/batch_upload_unittest.cc b/bin/ledger/cloud_sync/impl/batch_upload_unittest.cc
deleted file mode 100644
index 0e0711f..0000000
--- a/bin/ledger/cloud_sync/impl/batch_upload_unittest.cc
+++ /dev/null
@@ -1,733 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/batch_upload.h"
-
-#include <functional>
-#include <map>
-#include <utility>
-
-#include <lib/async/dispatcher.h>
-#include <lib/callback/capture.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_page_cloud.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/object.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/testing/commit_empty_impl.h"
-#include "peridot/bin/ledger/storage/testing/page_storage_empty_impl.h"
-
-namespace cloud_sync {
-namespace {
-
-// Fake implementation of storage::Commit.
-class TestCommit : public storage::CommitEmptyImpl {
- public:
-  TestCommit(std::string id, std::string storage_bytes)
-      : id(std::move(id)), storage_bytes(std::move(storage_bytes)) {}
-  ~TestCommit() override = default;
-
-  const storage::CommitId& GetId() const override { return id; }
-
-  fxl::StringView GetStorageBytes() const override { return storage_bytes; }
-
-  std::unique_ptr<const storage::Commit> Clone() const override {
-    return std::make_unique<TestCommit>(id, storage_bytes);
-  }
-
-  storage::CommitId id;
-  std::string storage_bytes;
-};
-
-// Fake implementation of storage::Object.
-class TestObject : public storage::Object {
- public:
-  TestObject() = default;
-  TestObject(storage::ObjectIdentifier identifier, std::string data)
-      : identifier(std::move(identifier)), data(std::move(data)) {}
-  ~TestObject() override = default;
-
-  storage::ObjectIdentifier GetIdentifier() const override {
-    return identifier;
-  };
-
-  storage::Status GetData(fxl::StringView* result) const override {
-    *result = fxl::StringView(data);
-    return storage::Status::OK;
-  }
-
-  storage::ObjectIdentifier identifier;
-  std::string data;
-};
-
-// Fake implementation of storage::PageStorage. Injects the data that
-// BatchUpload asks about: page id and unsynced objects to be uploaded.
-// Registers the reported results of the upload: commits and objects marked as
-// synced.
-class TestPageStorage : public storage::PageStorageEmptyImpl {
- public:
-  TestPageStorage() = default;
-  ~TestPageStorage() override = default;
-
-  void GetUnsyncedCommits(
-      fit::function<void(storage::Status,
-                         std::vector<std::unique_ptr<const storage::Commit>>)>
-          callback) override {
-    std::vector<std::unique_ptr<const storage::Commit>> results;
-    std::transform(unsynced_commits.begin(), unsynced_commits.end(),
-                   std::inserter(results, results.begin()),
-                   [](const std::unique_ptr<const storage::Commit>& commit) {
-                     return commit->Clone();
-                   });
-    callback(storage::Status::OK, std::move(results));
-  }
-
-  void GetUnsyncedPieces(
-      fit::function<void(storage::Status,
-                         std::vector<storage::ObjectIdentifier>)>
-          callback) override {
-    std::vector<storage::ObjectIdentifier> object_identifiers;
-    for (auto& digest_object_pair : unsynced_objects_to_return) {
-      object_identifiers.push_back(digest_object_pair.first);
-    }
-    callback(storage::Status::OK, std::move(object_identifiers));
-  }
-
-  void GetObject(storage::ObjectIdentifier object_identifier,
-                 Location /*location*/,
-                 fit::function<void(storage::Status,
-                                    std::unique_ptr<const storage::Object>)>
-                     callback) override {
-    GetPiece(std::move(object_identifier), std::move(callback));
-  }
-
-  void GetPiece(storage::ObjectIdentifier object_identifier,
-                fit::function<void(storage::Status,
-                                   std::unique_ptr<const storage::Object>)>
-                    callback) override {
-    callback(
-        storage::Status::OK,
-        std::move(unsynced_objects_to_return[std::move(object_identifier)]));
-  }
-
-  void MarkPieceSynced(storage::ObjectIdentifier object_identifier,
-                       fit::function<void(storage::Status)> callback) override {
-    objects_marked_as_synced.insert(object_identifier);
-    callback(storage::Status::OK);
-  }
-
-  void MarkCommitSynced(
-      const storage::CommitId& commit_id,
-      fit::function<void(storage::Status)> callback) override {
-    commits_marked_as_synced.insert(commit_id);
-    unsynced_commits.erase(
-        std::remove_if(
-            unsynced_commits.begin(), unsynced_commits.end(),
-            [&commit_id](const std::unique_ptr<const storage::Commit>& commit) {
-              return commit->GetId() == commit_id;
-            }),
-        unsynced_commits.end());
-    callback(storage::Status::OK);
-  }
-
-  std::unique_ptr<TestCommit> NewCommit(std::string id, std::string content) {
-    auto commit =
-        std::make_unique<TestCommit>(std::move(id), std::move(content));
-    unsynced_commits.push_back(commit->Clone());
-    return commit;
-  }
-
-  std::map<storage::ObjectIdentifier, std::unique_ptr<const TestObject>>
-      unsynced_objects_to_return;
-  std::set<storage::ObjectIdentifier> objects_marked_as_synced;
-  std::set<storage::CommitId> commits_marked_as_synced;
-  std::vector<std::unique_ptr<const storage::Commit>> unsynced_commits;
-};
-
-// Fake implementation of storage::PageStorage. Fails when trying to mark
-// objects as synced and can be used to verify behavior on object upload storage
-// errors.
-class TestPageStorageFailingToMarkPieces : public TestPageStorage {
- public:
-  void MarkPieceSynced(storage::ObjectIdentifier /*object_identifier*/,
-                       fit::function<void(storage::Status)> callback) override {
-    callback(storage::Status::NOT_IMPLEMENTED);
-  }
-};
-
-template <typename E>
-class BaseBatchUploadTest : public gtest::TestLoopFixture {
- public:
-  BaseBatchUploadTest()
-      : encryption_service_(dispatcher()),
-        page_cloud_(page_cloud_ptr_.NewRequest()) {}
-  ~BaseBatchUploadTest() override {}
-
- public:
-  TestPageStorage storage_;
-  E encryption_service_;
-  cloud_provider::PageCloudPtr page_cloud_ptr_;
-  TestPageCloud page_cloud_;
-
-  unsigned int done_calls_ = 0u;
-  unsigned int error_calls_ = 0u;
-  BatchUpload::ErrorType last_error_type_ = BatchUpload::ErrorType::PERMANENT;
-
-  std::unique_ptr<BatchUpload> MakeBatchUpload(
-      std::vector<std::unique_ptr<const storage::Commit>> commits,
-      unsigned int max_concurrent_uploads = 10) {
-    return MakeBatchUploadWithStorage(&storage_, std::move(commits),
-                                      max_concurrent_uploads);
-  }
-
-  std::unique_ptr<BatchUpload> MakeBatchUploadWithStorage(
-      storage::PageStorage* storage,
-      std::vector<std::unique_ptr<const storage::Commit>> commits,
-      unsigned int max_concurrent_uploads = 10) {
-    return std::make_unique<BatchUpload>(
-        storage, &encryption_service_, &page_cloud_ptr_, std::move(commits),
-        [this] {
-          done_calls_++;
-          QuitLoop();
-        },
-        [this](BatchUpload::ErrorType error_type) {
-          error_calls_++;
-          last_error_type_ = error_type;
-          QuitLoop();
-        },
-        max_concurrent_uploads);
-  }
-
-  // Returns an object identifier for the provided fake |object_digest|.
-  // |object_digest| need not be valid (wrt. internal storage constraints) as it
-  // is only used as an opaque identifier for cloud_sync.
-  storage::ObjectIdentifier MakeObjectIdentifier(std::string object_digest) {
-    return encryption_service_.MakeObjectIdentifier(
-        storage::ObjectDigest(std::move(object_digest)));
-  }
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(BaseBatchUploadTest);
-};
-
-using BatchUploadTest = BaseBatchUploadTest<encryption::FakeEncryptionService>;
-
-// Test an upload of a single commit with no unsynced objects.
-TEST_F(BatchUploadTest, SingleCommit) {
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(storage_.NewCommit("id", "content"));
-  auto batch_upload = MakeBatchUpload(std::move(commits));
-
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, done_calls_);
-  EXPECT_EQ(0u, error_calls_);
-
-  // Verify the artifacts uploaded to cloud provider.
-  EXPECT_EQ(1u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id", page_cloud_.received_commits.front().id);
-  EXPECT_EQ("content", encryption_service_.DecryptCommitSynchronous(
-                           page_cloud_.received_commits.front().data));
-  EXPECT_TRUE(page_cloud_.received_objects.empty());
-
-  // Verify the sync status in storage.
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id"));
-  EXPECT_EQ(0u, storage_.objects_marked_as_synced.size());
-}
-
-// Test an upload of multiple commits with no unsynced objects.
-TEST_F(BatchUploadTest, MultipleCommits) {
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(storage_.NewCommit("id0", "content0"));
-  commits.push_back(storage_.NewCommit("id1", "content1"));
-  auto batch_upload = MakeBatchUpload(std::move(commits));
-
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, done_calls_);
-  EXPECT_EQ(0u, error_calls_);
-
-  // Verify that the commits were uploaded correctly and in a single call.
-  EXPECT_EQ(1u, page_cloud_.add_commits_calls);
-  ASSERT_EQ(2u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id0", page_cloud_.received_commits[0].id);
-  EXPECT_EQ("content0", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[0].data));
-  EXPECT_EQ("id1", page_cloud_.received_commits[1].id);
-  EXPECT_EQ("content1", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[1].data));
-  EXPECT_TRUE(page_cloud_.received_objects.empty());
-
-  // Verify the sync status in storage.
-  EXPECT_EQ(2u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id0"));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id1"));
-}
-
-// Test an upload of a commit with a few unsynced objects.
-TEST_F(BatchUploadTest, SingleCommitWithObjects) {
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(storage_.NewCommit("id", "content"));
-  auto id1 = MakeObjectIdentifier("obj_digest1");
-  auto id2 = MakeObjectIdentifier("obj_digest2");
-
-  storage_.unsynced_objects_to_return[id1] =
-      std::make_unique<TestObject>(id1, "obj_data1");
-  storage_.unsynced_objects_to_return[id2] =
-      std::make_unique<TestObject>(id2, "obj_data2");
-
-  auto batch_upload = MakeBatchUpload(std::move(commits));
-
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, done_calls_);
-  EXPECT_EQ(0u, error_calls_);
-
-  // Verify the artifacts uploaded to cloud provider.
-  EXPECT_EQ(1u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id", page_cloud_.received_commits.front().id);
-  EXPECT_EQ("content", encryption_service_.DecryptCommitSynchronous(
-                           page_cloud_.received_commits.front().data));
-  EXPECT_EQ(2u, page_cloud_.received_objects.size());
-  EXPECT_EQ(
-      "obj_data1",
-      encryption_service_.DecryptObjectSynchronous(
-          page_cloud_.received_objects[encryption_service_
-                                           .GetObjectNameSynchronous(id1)]));
-  EXPECT_EQ(
-      "obj_data2",
-      encryption_service_.DecryptObjectSynchronous(
-          page_cloud_.received_objects[encryption_service_
-                                           .GetObjectNameSynchronous(id2)]));
-
-  // Verify the sync status in storage.
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id"));
-  EXPECT_EQ(2u, storage_.objects_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.objects_marked_as_synced.count(id1));
-  EXPECT_EQ(1u, storage_.objects_marked_as_synced.count(id2));
-}
-
-// Verifies that the number of concurrent object uploads is limited to
-// |max_concurrent_uploads|.
-TEST_F(BatchUploadTest, ThrottleConcurrentUploads) {
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(storage_.NewCommit("id", "content"));
-  storage::ObjectIdentifier id0 = MakeObjectIdentifier("obj_digest0");
-  storage::ObjectIdentifier id1 = MakeObjectIdentifier("obj_digest1");
-  storage::ObjectIdentifier id2 = MakeObjectIdentifier("obj_digest2");
-
-  storage_.unsynced_objects_to_return[id0] =
-      std::make_unique<TestObject>(id0, "obj_data0");
-  storage_.unsynced_objects_to_return[id1] =
-      std::make_unique<TestObject>(id1, "obj_data1");
-  storage_.unsynced_objects_to_return[id2] =
-      std::make_unique<TestObject>(id2, "obj_data2");
-
-  // Create the commit upload with |max_concurrent_uploads| = 2.
-  auto batch_upload = MakeBatchUpload(std::move(commits), 2);
-
-  page_cloud_.delay_add_object_callbacks = true;
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  // Verify that only two object uploads are in progress.
-  EXPECT_EQ(2u, page_cloud_.add_object_calls);
-
-  page_cloud_.delay_add_object_callbacks = false;
-  page_cloud_.RunPendingCallbacks();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, done_calls_);
-  EXPECT_EQ(0u, error_calls_);
-  EXPECT_EQ(3u, page_cloud_.add_object_calls);
-  EXPECT_EQ(3u, page_cloud_.received_objects.size());
-  EXPECT_EQ(
-      "obj_data0",
-      encryption_service_.DecryptObjectSynchronous(
-          page_cloud_.received_objects[encryption_service_
-                                           .GetObjectNameSynchronous(id0)]));
-  EXPECT_EQ(
-      "obj_data1",
-      encryption_service_.DecryptObjectSynchronous(
-          page_cloud_.received_objects[encryption_service_
-                                           .GetObjectNameSynchronous(id1)]));
-  EXPECT_EQ(
-      "obj_data2",
-      encryption_service_.DecryptObjectSynchronous(
-          page_cloud_.received_objects[encryption_service_
-                                           .GetObjectNameSynchronous(id2)]));
-
-  // Verify the sync status in storage.
-  EXPECT_EQ(3u, storage_.objects_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.objects_marked_as_synced.count(id0));
-  EXPECT_EQ(1u, storage_.objects_marked_as_synced.count(id1));
-  EXPECT_EQ(1u, storage_.objects_marked_as_synced.count(id2));
-}
-
-// Test an upload that fails on uploading objects.
-TEST_F(BatchUploadTest, FailedObjectUpload) {
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(storage_.NewCommit("id", "content"));
-
-  storage::ObjectIdentifier id1 = MakeObjectIdentifier("obj_digest1");
-  storage::ObjectIdentifier id2 = MakeObjectIdentifier("obj_digest2");
-
-  storage_.unsynced_objects_to_return[id1] =
-      std::make_unique<TestObject>(id1, "obj_data1");
-  storage_.unsynced_objects_to_return[id2] =
-      std::make_unique<TestObject>(id2, "obj_data2");
-
-  auto batch_upload = MakeBatchUpload(std::move(commits));
-
-  page_cloud_.object_status_to_return = cloud_provider::Status::NETWORK_ERROR;
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(0u, done_calls_);
-  EXPECT_EQ(1u, error_calls_);
-  EXPECT_EQ(BatchUpload::ErrorType::TEMPORARY, last_error_type_);
-
-  // Verify that no commits were uploaded.
-  EXPECT_EQ(0u, page_cloud_.received_commits.size());
-
-  // Verify that neither the objects nor the commit were marked as synced.
-  EXPECT_TRUE(storage_.commits_marked_as_synced.empty());
-  EXPECT_TRUE(storage_.objects_marked_as_synced.empty());
-}
-
-// Test an upload that fails on uploading the commit.
-TEST_F(BatchUploadTest, FailedCommitUpload) {
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(storage_.NewCommit("id", "content"));
-
-  storage::ObjectIdentifier id1 = MakeObjectIdentifier("obj_digest1");
-  storage::ObjectIdentifier id2 = MakeObjectIdentifier("obj_digest2");
-
-  storage_.unsynced_objects_to_return[id1] =
-      std::make_unique<TestObject>(id1, "obj_data1");
-  storage_.unsynced_objects_to_return[id2] =
-      std::make_unique<TestObject>(id2, "obj_data2");
-
-  auto batch_upload = MakeBatchUpload(std::move(commits));
-
-  page_cloud_.commit_status_to_return = cloud_provider::Status::NETWORK_ERROR;
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(0u, done_calls_);
-  EXPECT_EQ(1u, error_calls_);
-  EXPECT_EQ(BatchUpload::ErrorType::TEMPORARY, last_error_type_);
-
-  // Verify that the objects were uploaded to cloud provider and marked as
-  // synced.
-  EXPECT_EQ(2u, page_cloud_.received_objects.size());
-  EXPECT_EQ(
-      "obj_data1",
-      encryption_service_.DecryptObjectSynchronous(
-          page_cloud_.received_objects[encryption_service_
-                                           .GetObjectNameSynchronous(id1)]));
-  EXPECT_EQ(
-      "obj_data2",
-      encryption_service_.DecryptObjectSynchronous(
-          page_cloud_.received_objects[encryption_service_
-                                           .GetObjectNameSynchronous(id2)]));
-  EXPECT_EQ(2u, storage_.objects_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.objects_marked_as_synced.count(id1));
-  EXPECT_EQ(1u, storage_.objects_marked_as_synced.count(id2));
-
-  // Verify that neither the commit wasn't marked as synced.
-  EXPECT_TRUE(storage_.commits_marked_as_synced.empty());
-}
-
-// Test an upload that fails and a subsequent retry that succeeds.
-TEST_F(BatchUploadTest, ErrorAndRetry) {
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(storage_.NewCommit("id", "content"));
-
-  storage::ObjectIdentifier id1 = MakeObjectIdentifier("obj_digest1");
-  storage::ObjectIdentifier id2 = MakeObjectIdentifier("obj_digest2");
-
-  storage_.unsynced_objects_to_return[id1] =
-      std::make_unique<TestObject>(id1, "obj_data1");
-  storage_.unsynced_objects_to_return[id2] =
-      std::make_unique<TestObject>(id2, "obj_data2");
-
-  auto batch_upload = MakeBatchUpload(std::move(commits));
-
-  page_cloud_.object_status_to_return = cloud_provider::Status::NETWORK_ERROR;
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(0u, done_calls_);
-  EXPECT_EQ(1u, error_calls_);
-  EXPECT_EQ(BatchUpload::ErrorType::TEMPORARY, last_error_type_);
-
-  EXPECT_EQ(0u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(0u, storage_.objects_marked_as_synced.size());
-
-  // TestStorage moved the objects to be returned out, need to add them again
-  // before retry.
-  storage_.unsynced_objects_to_return[id1] =
-      std::make_unique<TestObject>(id1, "obj_data1");
-  storage_.unsynced_objects_to_return[id2] =
-      std::make_unique<TestObject>(id2, "obj_data2");
-  page_cloud_.object_status_to_return = cloud_provider::Status::OK;
-  batch_upload->Retry();
-  RunLoopUntilIdle();
-
-  // Verify the artifacts uploaded to cloud provider.
-  EXPECT_EQ(1u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id", page_cloud_.received_commits.front().id);
-  EXPECT_EQ("content", encryption_service_.DecryptCommitSynchronous(
-                           page_cloud_.received_commits.front().data));
-  EXPECT_EQ(2u, page_cloud_.received_objects.size());
-  EXPECT_EQ(
-      "obj_data1",
-      encryption_service_.DecryptObjectSynchronous(
-          page_cloud_.received_objects[encryption_service_
-                                           .GetObjectNameSynchronous(id1)]));
-  EXPECT_EQ(
-      "obj_data2",
-      encryption_service_.DecryptObjectSynchronous(
-          page_cloud_.received_objects[encryption_service_
-                                           .GetObjectNameSynchronous(id2)]));
-
-  // Verify the sync status in storage.
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id"));
-  EXPECT_EQ(2u, storage_.objects_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.objects_marked_as_synced.count(id1));
-  EXPECT_EQ(1u, storage_.objects_marked_as_synced.count(id2));
-}
-
-// Test a commit upload that gets an error from storage.
-TEST_F(BatchUploadTest, FailedCommitUploadWitStorageError) {
-  storage::PageStorageEmptyImpl test_storage;
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(storage_.NewCommit("id", "content"));
-
-  auto batch_upload =
-      MakeBatchUploadWithStorage(&test_storage, std::move(commits));
-
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(0u, done_calls_);
-  EXPECT_EQ(1u, error_calls_);
-  EXPECT_EQ(BatchUpload::ErrorType::PERMANENT, last_error_type_);
-
-  // Verify that no commits were uploaded.
-  EXPECT_EQ(0u, page_cloud_.received_commits.size());
-}
-
-// Test objects upload that get an error from storage.
-TEST_F(BatchUploadTest, FailedObjectUploadWitStorageError) {
-  TestPageStorageFailingToMarkPieces test_storage;
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(storage_.NewCommit("id", "content"));
-
-  storage::ObjectIdentifier id1 = MakeObjectIdentifier("obj_digest1");
-  storage::ObjectIdentifier id2 = MakeObjectIdentifier("obj_digest2");
-
-  test_storage.unsynced_objects_to_return[id1] =
-      std::make_unique<TestObject>(id1, "obj_data1");
-  test_storage.unsynced_objects_to_return[id2] =
-      std::make_unique<TestObject>(id2, "obj_data2");
-
-  auto batch_upload =
-      MakeBatchUploadWithStorage(&test_storage, std::move(commits));
-
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(0u, done_calls_);
-  EXPECT_EQ(1u, error_calls_);
-  EXPECT_EQ(BatchUpload::ErrorType::PERMANENT, last_error_type_);
-
-  // Verify that no commit or objects were uploaded.
-  EXPECT_EQ(0u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(0u, storage_.objects_marked_as_synced.size());
-}
-
-// Verifies that if only one of many uploads fails, we still stop and notify the
-// client.
-TEST_F(BatchUploadTest, ErrorOneOfMultipleObject) {
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(storage_.NewCommit("id", "content"));
-
-  storage::ObjectIdentifier id0 = MakeObjectIdentifier("obj_digest0");
-  storage::ObjectIdentifier id1 = MakeObjectIdentifier("obj_digest1");
-  storage::ObjectIdentifier id2 = MakeObjectIdentifier("obj_digest2");
-
-  storage_.unsynced_objects_to_return[id0] =
-      std::make_unique<TestObject>(id0, "obj_data0");
-  storage_.unsynced_objects_to_return[id1] =
-      std::make_unique<TestObject>(id1, "obj_data1");
-  storage_.unsynced_objects_to_return[id2] =
-      std::make_unique<TestObject>(id2, "obj_data2");
-
-  auto batch_upload = MakeBatchUpload(std::move(commits));
-
-  page_cloud_.object_status_to_return = cloud_provider::Status::NETWORK_ERROR;
-  page_cloud_.reset_object_status_after_call = true;
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(0u, done_calls_);
-  EXPECT_EQ(1u, error_calls_);
-
-  // Verify that two storage objects were correctly marked as synced.
-  EXPECT_EQ(0u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(2u, storage_.objects_marked_as_synced.size());
-  EXPECT_EQ(0u, page_cloud_.received_commits.size());
-
-  // TestStorage moved the objects to be returned out, need to add them again
-  // before retry.
-  storage_.unsynced_objects_to_return[id0] =
-      std::make_unique<TestObject>(id0, "obj_data0");
-  storage_.unsynced_objects_to_return[id1] =
-      std::make_unique<TestObject>(id1, "obj_data1");
-  storage_.unsynced_objects_to_return[id2] =
-      std::make_unique<TestObject>(id2, "obj_data2");
-
-  // Try upload again.
-  batch_upload->Retry();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, done_calls_);
-  EXPECT_EQ(1u, error_calls_);
-
-  // Verify the sync status in storage.
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(3u, storage_.objects_marked_as_synced.size());
-}
-
-// Verifies that we do not upload synced commits.
-TEST_F(BatchUploadTest, DoNotUploadSyncedCommits) {
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(std::make_unique<TestCommit>("id", "content"));
-
-  auto batch_upload = MakeBatchUpload(std::move(commits));
-
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, done_calls_);
-  EXPECT_EQ(0u, error_calls_);
-
-  // Verify that the commit was not synced.
-  EXPECT_EQ(0u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(0u, page_cloud_.received_commits.size());
-}
-
-// Verifies that we do not upload synced commits on retries.
-TEST_F(BatchUploadTest, DoNotUploadSyncedCommitsOnRetry) {
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(storage_.NewCommit("id", "content"));
-
-  auto batch_upload = MakeBatchUpload(std::move(commits));
-
-  page_cloud_.commit_status_to_return = cloud_provider::Status::NETWORK_ERROR;
-
-  batch_upload->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(0u, done_calls_);
-  EXPECT_EQ(1u, error_calls_);
-
-  // Verify that the commit was not synced.
-  EXPECT_EQ(0u, storage_.commits_marked_as_synced.size());
-
-  // Mark commit as synced.
-  storage::Status status;
-  storage_.MarkCommitSynced("id",
-                            callback::Capture(QuitLoopClosure(), &status));
-  RunLoopUntilIdle();
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(0u, storage_.unsynced_commits.size());
-
-  // Retry.
-  page_cloud_.add_commits_calls = 0;
-  page_cloud_.commit_status_to_return = cloud_provider::Status::OK;
-  batch_upload->Retry();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, done_calls_);
-  EXPECT_EQ(1u, error_calls_);
-
-  // Verify that no calls were made to attempt to upload the commit.
-  EXPECT_EQ(0u, page_cloud_.add_commits_calls);
-}
-
-class FailingEncryptCommitEncryptionService
-    : public encryption::FakeEncryptionService {
- public:
-  explicit FailingEncryptCommitEncryptionService(async_dispatcher_t* dispatcher)
-      : encryption::FakeEncryptionService(dispatcher) {}
-
-  void EncryptCommit(
-      std::string /*commit_storage*/,
-      fit::function<void(encryption::Status, std::string)> callback) override {
-    callback(encryption::Status::INVALID_ARGUMENT, "");
-  }
-};
-
-class FailingGetNameEncryptionService
-    : public encryption::FakeEncryptionService {
- public:
-  explicit FailingGetNameEncryptionService(async_dispatcher_t* dispatcher)
-      : encryption::FakeEncryptionService(dispatcher) {}
-
-  void GetObjectName(
-      storage::ObjectIdentifier /*object_identifier*/,
-      fit::function<void(encryption::Status, std::string)> callback) override {
-    callback(encryption::Status::INVALID_ARGUMENT, "");
-  }
-};
-
-class FailingEncryptObjectEncryptionService
-    : public encryption::FakeEncryptionService {
- public:
-  explicit FailingEncryptObjectEncryptionService(async_dispatcher_t* dispatcher)
-      : encryption::FakeEncryptionService(dispatcher) {}
-
-  void EncryptObject(
-      storage::ObjectIdentifier /*object_identifier*/,
-      fsl::SizedVmo /*content*/,
-      fit::function<void(encryption::Status, std::string)> callback) override {
-    callback(encryption::Status::INVALID_ARGUMENT, "");
-  }
-};
-
-template <typename E>
-using FailingBatchUploadTest = BaseBatchUploadTest<E>;
-
-using FailingEncryptionServices =
-    ::testing::Types<FailingEncryptCommitEncryptionService,
-                     FailingGetNameEncryptionService,
-                     FailingEncryptObjectEncryptionService>;
-
-TYPED_TEST_CASE(FailingBatchUploadTest, FailingEncryptionServices);
-
-TYPED_TEST(FailingBatchUploadTest, Fail) {
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.push_back(this->storage_.NewCommit("id", "content"));
-  auto id1 = this->MakeObjectIdentifier("obj_digest1");
-  auto id2 = this->MakeObjectIdentifier("obj_digest2");
-
-  this->storage_.unsynced_objects_to_return[id1] =
-      std::make_unique<TestObject>(id1, "obj_data1");
-  this->storage_.unsynced_objects_to_return[id2] =
-      std::make_unique<TestObject>(id2, "obj_data2");
-
-  auto batch_upload = this->MakeBatchUpload(std::move(commits));
-
-  batch_upload->Start();
-  this->RunLoopUntilIdle();
-  EXPECT_EQ(0u, this->done_calls_);
-  EXPECT_GE(this->error_calls_, 1u);
-
-  // Verify the artifacts uploaded to cloud provider.
-  EXPECT_EQ(0u, this->page_cloud_.received_commits.size());
-}
-
-}  // namespace
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/constants.h b/bin/ledger/cloud_sync/impl/constants.h
deleted file mode 100644
index 0ac138b..0000000
--- a/bin/ledger/cloud_sync/impl/constants.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_CONSTANTS_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_CONSTANTS_H_
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace cloud_sync {
-
-// Key for the timestamp metadata in the SyncMetadata KV store.
-inline constexpr fxl::StringView kTimestampKey = "timestamp";
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_CONSTANTS_H_
diff --git a/bin/ledger/cloud_sync/impl/ledger_sync_impl.cc b/bin/ledger/cloud_sync/impl/ledger_sync_impl.cc
deleted file mode 100644
index 6b8db50..0000000
--- a/bin/ledger/cloud_sync/impl/ledger_sync_impl.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/ledger_sync_impl.h"
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/backoff/exponential_backoff.h>
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/page_sync_impl.h"
-#include "peridot/bin/ledger/encryption/impl/encryption_service_impl.h"
-
-namespace cloud_sync {
-
-LedgerSyncImpl::LedgerSyncImpl(
-    ledger::Environment* environment, const UserConfig* user_config,
-    encryption::EncryptionService* encryption_service, fxl::StringView app_id,
-    std::unique_ptr<SyncStateWatcher> watcher)
-    : environment_(environment),
-      user_config_(user_config),
-      encryption_service_(encryption_service),
-      app_id_(app_id.ToString()),
-      user_watcher_(std::move(watcher)) {
-  FXL_DCHECK(user_config_->cloud_provider);
-  aggregator_.SetBaseWatcher(user_watcher_.get());
-}
-
-LedgerSyncImpl::~LedgerSyncImpl() {
-  FXL_DCHECK(active_page_syncs_.empty());
-
-  if (on_delete_) {
-    on_delete_();
-  }
-}
-
-std::unique_ptr<PageSync> LedgerSyncImpl::CreatePageSync(
-    storage::PageStorage* page_storage,
-    storage::PageSyncClient* page_sync_client) {
-  FXL_DCHECK(page_storage);
-  if (!user_config_->cloud_provider) {
-    // TODO(ppi): handle recovery from cloud provider disconnection, LE-567.
-    FXL_LOG(WARNING) << "Skipped initializing the cloud sync. "
-                     << "Cloud provider is disconnected.";
-    return nullptr;
-  }
-
-  cloud_provider::PageCloudPtr page_cloud;
-  user_config_->cloud_provider->GetPageCloud(
-      convert::ToArray(app_id_), convert::ToArray(page_storage->GetId()),
-      page_cloud.NewRequest(), [](auto status) {
-        if (status != cloud_provider::Status::OK) {
-          FXL_LOG(ERROR) << "Failed to retrieve page cloud, status: "
-                         << fidl::ToUnderlying(status);
-          // Only log. This should be handled by page cloud connection error
-          // handler.
-        }
-      });
-  auto page_sync = std::make_unique<PageSyncImpl>(
-      environment_->dispatcher(), page_storage, page_sync_client,
-      encryption_service_, std::move(page_cloud), environment_->MakeBackoff(),
-      environment_->MakeBackoff(), aggregator_.GetNewStateWatcher());
-  if (upload_enabled_) {
-    page_sync->EnableUpload();
-  }
-  active_page_syncs_.insert(page_sync.get());
-  page_sync->set_on_delete([this, page_sync = page_sync.get()]() {
-    active_page_syncs_.erase(page_sync);
-  });
-  return page_sync;
-}
-
-void LedgerSyncImpl::EnableUpload() {
-  if (upload_enabled_) {
-    return;
-  }
-
-  upload_enabled_ = true;
-  for (auto page_sync : active_page_syncs_) {
-    page_sync->EnableUpload();
-  }
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/ledger_sync_impl.h b/bin/ledger/cloud_sync/impl/ledger_sync_impl.h
deleted file mode 100644
index 0049658..0000000
--- a/bin/ledger/cloud_sync/impl/ledger_sync_impl.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_LEDGER_SYNC_IMPL_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_LEDGER_SYNC_IMPL_H_
-
-#include <memory>
-#include <set>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/aggregator.h"
-#include "peridot/bin/ledger/cloud_sync/impl/page_sync_impl.h"
-#include "peridot/bin/ledger/cloud_sync/public/ledger_sync.h"
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-#include "peridot/bin/ledger/cloud_sync/public/user_config.h"
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/environment/environment.h"
-
-namespace cloud_sync {
-
-class LedgerSyncImpl : public LedgerSync {
- public:
-  LedgerSyncImpl(ledger::Environment* environment,
-                 const UserConfig* user_config,
-                 encryption::EncryptionService* encryption_service,
-                 fxl::StringView app_id,
-                 std::unique_ptr<SyncStateWatcher> watcher);
-  ~LedgerSyncImpl() override;
-
-  std::unique_ptr<PageSync> CreatePageSync(
-      storage::PageStorage* page_storage,
-      storage::PageSyncClient* page_sync_client) override;
-
-  // Enables upload. Has no effect if this method has already been called.
-  void EnableUpload();
-
-  bool IsUploadEnabled() const { return upload_enabled_; }
-
-  // |on_delete| will be called when this class is deleted.
-  void set_on_delete(fit::function<void()> on_delete) {
-    FXL_DCHECK(!on_delete_);
-    on_delete_ = std::move(on_delete);
-  }
-
- private:
-  ledger::Environment* const environment_;
-  const UserConfig* const user_config_;
-  encryption::EncryptionService* const encryption_service_;
-  const std::string app_id_;
-  bool upload_enabled_ = false;
-  std::set<PageSyncImpl*> active_page_syncs_;
-  // Called on destruction.
-  fit::function<void()> on_delete_;
-  std::unique_ptr<SyncStateWatcher> user_watcher_;
-  Aggregator aggregator_;
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_LEDGER_SYNC_IMPL_H_
diff --git a/bin/ledger/cloud_sync/impl/page_download.cc b/bin/ledger/cloud_sync/impl/page_download.cc
deleted file mode 100644
index b3f4794..0000000
--- a/bin/ledger/cloud_sync/impl/page_download.cc
+++ /dev/null
@@ -1,464 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/page_download.h"
-
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/strings/concatenate.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/constants.h"
-#include "peridot/bin/ledger/storage/public/data_source.h"
-#include "peridot/bin/ledger/storage/public/read_data_source.h"
-
-namespace cloud_sync {
-namespace {
-DownloadSyncState GetMergedState(DownloadSyncState commit_state,
-                                 int current_get_object_calls) {
-  if (commit_state != DOWNLOAD_IDLE) {
-    return commit_state;
-  }
-  return current_get_object_calls == 0 ? DOWNLOAD_IDLE : DOWNLOAD_IN_PROGRESS;
-}
-
-bool IsPermanentError(cloud_provider::Status status) {
-  switch (status) {
-    case cloud_provider::Status::OK:
-    case cloud_provider::Status::AUTH_ERROR:
-    case cloud_provider::Status::NETWORK_ERROR:
-      return false;
-    case cloud_provider::Status::ARGUMENT_ERROR:
-    case cloud_provider::Status::INTERNAL_ERROR:
-    case cloud_provider::Status::NOT_FOUND:
-    case cloud_provider::Status::PARSE_ERROR:
-    case cloud_provider::Status::SERVER_ERROR:
-    case cloud_provider::Status::UNKNOWN_ERROR:
-      return true;
-  }
-}
-}  // namespace
-
-PageDownload::PageDownload(callback::ScopedTaskRunner* task_runner,
-                           storage::PageStorage* storage,
-                           storage::PageSyncClient* sync_client,
-                           encryption::EncryptionService* encryption_service,
-                           cloud_provider::PageCloudPtr* page_cloud,
-                           Delegate* delegate,
-                           std::unique_ptr<backoff::Backoff> backoff)
-    : task_runner_(task_runner),
-      storage_(storage),
-      sync_client_(sync_client),
-      encryption_service_(encryption_service),
-      page_cloud_(page_cloud),
-      delegate_(delegate),
-      backoff_(std::move(backoff)),
-      log_prefix_(fxl::Concatenate(
-          {"Page ", convert::ToHex(storage->GetId()), " download sync: "})),
-      watcher_binding_(this) {}
-
-PageDownload::~PageDownload() { sync_client_->SetSyncDelegate(nullptr); }
-
-void PageDownload::StartDownload() {
-  SetCommitState(DOWNLOAD_BACKLOG);
-
-  sync_client_->SetSyncDelegate(this);
-
-  // Retrieve the server-side timestamp of the last commit we received.
-  storage_->GetSyncMetadata(
-      kTimestampKey,
-      task_runner_->MakeScoped([this](storage::Status status,
-                                      std::string last_commit_token_id) {
-        // NOT_FOUND means that we haven't persisted the state yet, e.g. because
-        // we haven't received any remote commits yet. In this case an empty
-        // timestamp is the right value.
-        if (status != storage::Status::OK &&
-            status != storage::Status::NOT_FOUND) {
-          HandleDownloadCommitError("Failed to retrieve the sync metadata.");
-          return;
-        }
-        if (last_commit_token_id.empty()) {
-          FXL_VLOG(1) << log_prefix_ << "starting sync for the first time, "
-                      << "retrieving all remote commits";
-        } else {
-          // TODO(ppi): print the timestamp out as human-readable wall time.
-          FXL_VLOG(1) << log_prefix_ << "starting sync again, "
-                      << "retrieving commits uploaded after: "
-                      << last_commit_token_id;
-        }
-
-        std::unique_ptr<cloud_provider::Token> position_token;
-        if (!last_commit_token_id.empty()) {
-          position_token = std::make_unique<cloud_provider::Token>();
-          position_token->opaque_id = convert::ToArray(last_commit_token_id);
-        }
-        (*page_cloud_)
-            ->GetCommits(
-                std::move(position_token),
-                [this](cloud_provider::Status cloud_status,
-                       std::unique_ptr<cloud_provider::CommitPack> commit_pack,
-                       std::unique_ptr<cloud_provider::Token> position_token) {
-                  if (cloud_status != cloud_provider::Status::OK) {
-                    // Fetching the remote commits failed, schedule a retry.
-                    FXL_LOG(WARNING)
-                        << log_prefix_
-                        << "fetching the remote commits failed due to a "
-                        << "connection error, status: "
-                        << fidl::ToUnderlying(cloud_status) << ", retrying.";
-                    SetCommitState(DOWNLOAD_TEMPORARY_ERROR);
-                    RetryWithBackoff([this] { StartDownload(); });
-                    return;
-                  }
-                  if (!commit_pack) {
-                    FXL_LOG(ERROR) << "Null commits despite status OK.";
-                    SetCommitState(DOWNLOAD_PERMANENT_ERROR);
-                    return;
-                  }
-                  backoff_->Reset();
-
-                  std::vector<cloud_provider::CommitPackEntry> entries;
-                  if (!cloud_provider::DecodeCommitPack(*commit_pack,
-                                                        &entries)) {
-                    FXL_LOG(ERROR) << "Failed to decode the commits.";
-                    SetCommitState(DOWNLOAD_PERMANENT_ERROR);
-                    return;
-                  }
-
-                  if (entries.empty()) {
-                    // If there is no remote commits to add, announce that
-                    // we're done.
-                    FXL_VLOG(1)
-                        << log_prefix_
-                        << "initial sync finished, no new remote commits";
-                    BacklogDownloaded();
-                  } else {
-                    FXL_VLOG(1) << log_prefix_ << "retrieved " << entries.size()
-                                << " (possibly) new remote commits, "
-                                << "adding them to storage.";
-                    // If not, fire the backlog download callback when the
-                    // remote commits are downloaded.
-                    const auto commit_count = entries.size();
-                    DownloadBatch(std::move(entries), std::move(position_token),
-                                  [this, commit_count] {
-                                    FXL_VLOG(1)
-                                        << log_prefix_
-                                        << "initial sync finished, added "
-                                        << commit_count << " remote commits.";
-                                    BacklogDownloaded();
-                                  });
-                  }
-                });
-      }));
-}
-
-bool PageDownload::IsIdle() {
-  switch (GetMergedState(commit_state_, current_get_object_calls_)) {
-    case DOWNLOAD_NOT_STARTED:
-    case DOWNLOAD_IDLE:
-    case DOWNLOAD_PERMANENT_ERROR:
-      return true;
-      break;
-    case DOWNLOAD_BACKLOG:
-    case DOWNLOAD_TEMPORARY_ERROR:
-    case DOWNLOAD_SETTING_REMOTE_WATCHER:
-    case DOWNLOAD_IN_PROGRESS:
-      return false;
-      break;
-  }
-}
-
-void PageDownload::BacklogDownloaded() { SetRemoteWatcher(false); }
-
-void PageDownload::SetRemoteWatcher(bool is_retry) {
-  FXL_DCHECK(commit_state_ == DOWNLOAD_BACKLOG ||
-             commit_state_ == DOWNLOAD_TEMPORARY_ERROR)
-      << "Current state: " << commit_state_;
-  SetCommitState(DOWNLOAD_SETTING_REMOTE_WATCHER);
-  // Retrieve the server-side token of the last commit we received.
-  std::string last_commit_token_id;
-  storage_->GetSyncMetadata(
-      kTimestampKey,
-      task_runner_->MakeScoped([this, is_retry](
-                                   storage::Status status,
-                                   std::string last_commit_token_id) {
-        if (status != storage::Status::OK &&
-            status != storage::Status::NOT_FOUND) {
-          HandleDownloadCommitError("Failed to retrieve the sync metadata.");
-          return;
-        }
-
-        std::unique_ptr<cloud_provider::Token> position_token;
-        if (!last_commit_token_id.empty()) {
-          position_token = std::make_unique<cloud_provider::Token>();
-          position_token->opaque_id = convert::ToArray(last_commit_token_id);
-        }
-        cloud_provider::PageCloudWatcherPtr watcher;
-        watcher_binding_.Bind(watcher.NewRequest());
-        (*page_cloud_)
-            ->SetWatcher(
-                std::move(position_token), std::move(watcher),
-                [this](auto status) {
-                  // This should always succeed - any errors are reported
-                  // through OnError().
-                  if (status != cloud_provider::Status::OK) {
-                    HandleDownloadCommitError(
-                        "Unexpected error when setting the PageCloudWatcher.");
-                  }
-                });
-        SetCommitState(DOWNLOAD_IDLE);
-        if (is_retry) {
-          FXL_LOG(INFO) << log_prefix_ << "Cloud watcher re-established";
-        }
-      }));
-}
-
-void PageDownload::OnNewCommits(cloud_provider::CommitPack commits,
-                                cloud_provider::Token position_token,
-                                OnNewCommitsCallback callback) {
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  if (!cloud_provider::DecodeCommitPack(commits, &entries)) {
-    HandleDownloadCommitError("Failed to decode the commits");
-    return;
-  }
-
-  if (batch_download_) {
-    // If there is already a commit batch being downloaded, save the new commits
-    // to be downloaded when it is done.
-    std::move(entries.begin(), entries.end(),
-              std::back_inserter(commits_to_download_));
-    position_token_ = fidl::MakeOptional(std::move(position_token));
-    callback();
-    return;
-  }
-  SetCommitState(DOWNLOAD_IN_PROGRESS);
-  DownloadBatch(std::move(entries),
-                fidl::MakeOptional(std::move(position_token)),
-                std::move(callback));
-}
-
-void PageDownload::OnNewObject(std::vector<uint8_t> /*id*/,
-                               fuchsia::mem::Buffer /*data*/,
-                               OnNewObjectCallback /*callback*/) {
-  // No known cloud provider implementations use this method.
-  // TODO(ppi): implement this method when we have such cloud provider
-  // implementations.
-  FXL_NOTIMPLEMENTED();
-}
-
-void PageDownload::OnError(cloud_provider::Status status) {
-  FXL_DCHECK(commit_state_ == DOWNLOAD_IDLE ||
-             commit_state_ == DOWNLOAD_IN_PROGRESS);
-  if (!IsPermanentError(status)) {
-    // Reset the watcher and schedule a retry.
-    if (watcher_binding_.is_bound()) {
-      watcher_binding_.Unbind();
-    }
-    SetCommitState(DOWNLOAD_TEMPORARY_ERROR);
-    FXL_LOG(WARNING)
-        << log_prefix_
-        << "Connection error in the remote commit watcher, retrying.";
-    RetryWithBackoff([this] { SetRemoteWatcher(true); });
-    return;
-  }
-
-  if (status == cloud_provider::Status::PARSE_ERROR) {
-    HandleDownloadCommitError(
-        "Received a malformed remote commit notification.");
-    return;
-  }
-
-  FXL_LOG(WARNING) << "Received unexpected error from PageCloudWatcher: "
-                   << fidl::ToUnderlying(status);
-  HandleDownloadCommitError("Received unexpected error from PageCloudWatcher.");
-}
-
-void PageDownload::DownloadBatch(
-    std::vector<cloud_provider::CommitPackEntry> entries,
-    std::unique_ptr<cloud_provider::Token> position_token,
-    fit::closure on_done) {
-  FXL_DCHECK(!batch_download_);
-  batch_download_ = std::make_unique<BatchDownload>(
-      storage_, encryption_service_, std::move(entries),
-      std::move(position_token),
-      [this, on_done = std::move(on_done)] {
-        if (on_done) {
-          on_done();
-        }
-        batch_download_.reset();
-
-        if (commits_to_download_.empty()) {
-          // Don't set to idle if we're in process of setting the remote
-          // watcher.
-          if (commit_state_ == DOWNLOAD_IN_PROGRESS) {
-            SetCommitState(DOWNLOAD_IDLE);
-          }
-          return;
-        }
-        auto entries = std::move(commits_to_download_);
-        commits_to_download_.clear();
-        DownloadBatch(std::move(entries), std::move(position_token_), nullptr);
-      },
-      [this] {
-        HandleDownloadCommitError(
-            "Failed to persist a remote commit in storage");
-      });
-  batch_download_->Start();
-}
-
-void PageDownload::GetObject(
-    storage::ObjectIdentifier object_identifier,
-    fit::function<void(storage::Status, storage::ChangeSource,
-                       storage::IsObjectSynced,
-                       std::unique_ptr<storage::DataSource::DataChunk>)>
-        callback) {
-  current_get_object_calls_++;
-  UpdateDownloadState();
-  encryption_service_->GetObjectName(
-      object_identifier,
-      task_runner_->MakeScoped(
-          [this, object_identifier, callback = std::move(callback)](
-              encryption::Status status, std::string object_name) mutable {
-            if (status != encryption::Status::OK) {
-              HandleGetObjectError(std::move(object_identifier),
-                                   encryption::IsPermanentError(status),
-                                   "encryption", std::move(callback));
-              return;
-            }
-            (*page_cloud_)
-                ->GetObject(
-                    convert::ToArray(object_name),
-                    [this, object_identifier = std::move(object_identifier),
-                     callback = std::move(callback)](
-                        cloud_provider::Status status,
-                        ::fuchsia::mem::BufferPtr data) mutable {
-                      if (status != cloud_provider::Status::OK) {
-                        HandleGetObjectError(std::move(object_identifier),
-                                             IsPermanentError(status),
-                                             "cloud provider",
-                                             std::move(callback));
-                        return;
-                      }
-                      fsl::SizedVmo sized_vmo;
-                      if (!fsl::SizedVmo::FromTransport(std::move(*data),
-                                                        &sized_vmo)) {
-                        HandleGetObjectError(std::move(object_identifier), true,
-                                             "converting to SizedVmo",
-                                             std::move(callback));
-                        return;
-                      }
-
-                      DecryptObject(
-                          std::move(object_identifier),
-                          storage::DataSource::Create(std::move(sized_vmo)),
-                          std::move(callback));
-                    });
-          }));
-}
-
-void PageDownload::DecryptObject(
-    storage::ObjectIdentifier object_identifier,
-    std::unique_ptr<storage::DataSource> content,
-    fit::function<void(storage::Status, storage::ChangeSource,
-                       storage::IsObjectSynced,
-                       std::unique_ptr<storage::DataSource::DataChunk>)>
-        callback) {
-  storage::ReadDataSource(
-      &managed_container_, std::move(content),
-      [this, object_identifier = std::move(object_identifier),
-       callback = std::move(callback)](
-          storage::Status status,
-          std::unique_ptr<storage::DataSource::DataChunk> content) mutable {
-        if (status != storage::Status::OK) {
-          HandleGetObjectError(std::move(object_identifier), true, "io",
-                               std::move(callback));
-          return;
-        }
-        encryption_service_->DecryptObject(
-            object_identifier, content->Get().ToString(),
-            [this, object_identifier, callback = std::move(callback)](
-                encryption::Status status, std::string content) mutable {
-              if (status != encryption::Status::OK) {
-                HandleGetObjectError(object_identifier,
-                                     encryption::IsPermanentError(status),
-                                     "encryption", std::move(callback));
-                return;
-              }
-              backoff_->Reset();
-              callback(
-                  storage::Status::OK, storage::ChangeSource::CLOUD,
-                  storage::IsObjectSynced::YES,
-                  storage::DataSource::DataChunk::Create(std::move(content)));
-              current_get_object_calls_--;
-              UpdateDownloadState();
-            });
-      });
-}
-
-void PageDownload::HandleGetObjectError(
-    storage::ObjectIdentifier object_identifier, bool is_permanent,
-    const char error_name[],
-    fit::function<void(storage::Status, storage::ChangeSource,
-                       storage::IsObjectSynced,
-                       std::unique_ptr<storage::DataSource::DataChunk>)>
-        callback) {
-  if (is_permanent) {
-    backoff_->Reset();
-    FXL_LOG(WARNING) << log_prefix_ << "GetObject() failed due to a permanent "
-                     << error_name << " error.";
-    callback(storage::Status::IO_ERROR, storage::ChangeSource::CLOUD,
-             storage::IsObjectSynced::YES, nullptr);
-    current_get_object_calls_--;
-    UpdateDownloadState();
-    return;
-  }
-  FXL_LOG(WARNING) << log_prefix_ << "GetObject() failed due to a "
-                   << error_name << " error, retrying.";
-  current_get_object_calls_--;
-  UpdateDownloadState();
-  RetryWithBackoff([this, object_identifier = std::move(object_identifier),
-                    callback = std::move(callback)]() mutable {
-    GetObject(object_identifier, std::move(callback));
-  });
-}
-
-void PageDownload::HandleDownloadCommitError(const char error_description[]) {
-  FXL_LOG(ERROR) << log_prefix_ << error_description << " Stopping sync.";
-  if (watcher_binding_.is_bound()) {
-    watcher_binding_.Unbind();
-  }
-  sync_client_->SetSyncDelegate(nullptr);
-  SetCommitState(DOWNLOAD_PERMANENT_ERROR);
-}
-
-void PageDownload::SetCommitState(DownloadSyncState new_state) {
-  if (new_state == commit_state_) {
-    return;
-  }
-
-  commit_state_ = new_state;
-  UpdateDownloadState();
-}
-
-void PageDownload::UpdateDownloadState() {
-  DownloadSyncState new_state =
-      GetMergedState(commit_state_, current_get_object_calls_);
-
-  // Notify only if the externally visible state changed.
-  if (new_state != merged_state_) {
-    merged_state_ = new_state;
-    delegate_->SetDownloadState(
-        GetMergedState(commit_state_, current_get_object_calls_));
-  }
-}
-
-void PageDownload::RetryWithBackoff(fit::closure callable) {
-  task_runner_->PostDelayedTask(
-      [this, callable = std::move(callable)]() {
-        if (this->commit_state_ != DOWNLOAD_PERMANENT_ERROR) {
-          callable();
-        }
-      },
-      backoff_->GetNext());
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/page_download.h b/bin/ledger/cloud_sync/impl/page_download.h
deleted file mode 100644
index 1221c81..0000000
--- a/bin/ledger/cloud_sync/impl/page_download.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_PAGE_DOWNLOAD_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_PAGE_DOWNLOAD_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/backoff/backoff.h>
-#include <lib/callback/managed_container.h>
-#include <lib/callback/scoped_task_runner.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/batch_download.h"
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/storage/public/page_sync_delegate.h"
-#include "peridot/lib/commit_pack/commit_pack.h"
-
-namespace cloud_sync {
-// PageDownload handles all the download operations (commits and objects) for a
-// page.
-class PageDownload : public cloud_provider::PageCloudWatcher,
-                     public storage::PageSyncDelegate {
- public:
-  // Delegate ensuring coordination between PageDownload and the class that owns
-  // it.
-  class Delegate {
-   public:
-    // Report that the download state changed.
-    virtual void SetDownloadState(DownloadSyncState sync_state) = 0;
-  };
-
-  PageDownload(callback::ScopedTaskRunner* task_runner,
-               storage::PageStorage* storage,
-               storage::PageSyncClient* sync_client,
-               encryption::EncryptionService* encryption_service,
-               cloud_provider::PageCloudPtr* page_cloud, Delegate* delegate,
-               std::unique_ptr<backoff::Backoff> backoff);
-
-  ~PageDownload() override;
-
-  // Downloads the initial backlog of remote commits, and sets up the remote
-  // watcher upon success.
-  void StartDownload();
-
-  // Returns if PageDownload is idle.
-  bool IsIdle();
-
- private:
-  // cloud_provider::PageCloudWatcher:
-  void OnNewCommits(cloud_provider::CommitPack commits,
-                    cloud_provider::Token position_token,
-                    OnNewCommitsCallback callback) override;
-
-  void OnNewObject(std::vector<uint8_t> id, fuchsia::mem::Buffer data,
-                   OnNewObjectCallback callback) override;
-
-  void OnError(cloud_provider::Status status) override;
-
-  // Called when the initial commit backlog is downloaded.
-  void BacklogDownloaded();
-
-  // Starts watching for Cloud commit notifications.
-  void SetRemoteWatcher(bool is_retry);
-
-  // Downloads the given batch of commits.
-  void DownloadBatch(std::vector<cloud_provider::CommitPackEntry> entries,
-                     std::unique_ptr<cloud_provider::Token> position_token,
-                     fit::closure on_done);
-
-  // storage::PageSyncDelegate:
-  void GetObject(
-      storage::ObjectIdentifier object_identifier,
-      fit::function<void(storage::Status, storage::ChangeSource,
-                         storage::IsObjectSynced,
-                         std::unique_ptr<storage::DataSource::DataChunk>)>
-          callback) override;
-
-  void DecryptObject(
-      storage::ObjectIdentifier object_identifier,
-      std::unique_ptr<storage::DataSource> content,
-      fit::function<void(storage::Status, storage::ChangeSource,
-                         storage::IsObjectSynced,
-                         std::unique_ptr<storage::DataSource::DataChunk>)>
-          callback);
-
-  void HandleGetObjectError(
-      storage::ObjectIdentifier object_identifier, bool is_permanent,
-      const char error_name[],
-      fit::function<void(storage::Status, storage::ChangeSource,
-                         storage::IsObjectSynced,
-                         std::unique_ptr<storage::DataSource::DataChunk>)>
-          callback);
-
-  void HandleDownloadCommitError(const char error_description[]);
-
-  // Sets the state for commit download.
-  void SetCommitState(DownloadSyncState new_state);
-  void UpdateDownloadState();
-
-  void RetryWithBackoff(fit::closure callable);
-
-  // Owned by whoever owns this class.
-  callback::ScopedTaskRunner* const task_runner_;
-  storage::PageStorage* const storage_;
-  storage::PageSyncClient* sync_client_;
-  encryption::EncryptionService* const encryption_service_;
-  cloud_provider::PageCloudPtr* const page_cloud_;
-  Delegate* const delegate_;
-
-  std::unique_ptr<backoff::Backoff> backoff_;
-
-  const std::string log_prefix_;
-
-  // Work queue:
-  // The current batch of remote commits being downloaded.
-  std::unique_ptr<BatchDownload> batch_download_;
-  // Pending remote commits to download.
-  std::vector<cloud_provider::CommitPackEntry> commits_to_download_;
-  std::unique_ptr<cloud_provider::Token> position_token_;
-  // Container for in-progress datasource.
-  callback::ManagedContainer managed_container_;
-
-  // State:
-  // Commit download state.
-  DownloadSyncState commit_state_ = DOWNLOAD_NOT_STARTED;
-  int current_get_object_calls_ = 0;
-  // Merged state of commit and object download.
-  DownloadSyncState merged_state_ = DOWNLOAD_NOT_STARTED;
-
-  fidl::Binding<cloud_provider::PageCloudWatcher> watcher_binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageDownload);
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_PAGE_DOWNLOAD_H_
diff --git a/bin/ledger/cloud_sync/impl/page_download_unittest.cc b/bin/ledger/cloud_sync/impl/page_download_unittest.cc
deleted file mode 100644
index ec252ba..0000000
--- a/bin/ledger/cloud_sync/impl/page_download_unittest.cc
+++ /dev/null
@@ -1,519 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/page_download.h"
-
-#include <memory>
-#include <sstream>
-#include <utility>
-#include <vector>
-
-#include <lib/async/dispatcher.h>
-#include <lib/backoff/testing/test_backoff.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/cloud_sync/impl/constants.h"
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_page_cloud.h"
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_page_storage.h"
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/testing/commit_empty_impl.h"
-#include "peridot/bin/ledger/storage/testing/page_storage_empty_impl.h"
-
-namespace cloud_sync {
-namespace {
-
-// Creates a dummy continuation token.
-cloud_provider::Token MakeToken(convert::ExtendedStringView token_id) {
-  cloud_provider::Token token;
-  token.opaque_id = convert::ToArray(token_id);
-  return token;
-}
-
-// Creates a dummy object identifier.
-storage::ObjectIdentifier MakeObjectIdentifier() {
-  // Need not be valid (wrt. internal storage constraints) as it is only used as
-  // an opaque identifier for cloud_sync.
-  return storage::ObjectIdentifier(1u, 1u,
-                                   storage::ObjectDigest("object_digest"));
-}
-
-constexpr zx::duration kTestBackoffInterval = zx::msec(50);
-std::unique_ptr<backoff::TestBackoff> NewTestBackoff() {
-  auto result = std::make_unique<backoff::TestBackoff>(kTestBackoffInterval);
-  return result;
-}
-
-// Dummy implementation of a backoff policy, which always returns zero backoff
-// time.
-template <typename E>
-class BasePageDownloadTest : public gtest::TestLoopFixture,
-                             public PageDownload::Delegate {
- public:
-  BasePageDownloadTest()
-      : storage_(dispatcher()),
-        encryption_service_(dispatcher()),
-        page_cloud_(page_cloud_ptr_.NewRequest()),
-        task_runner_(dispatcher()) {
-    page_download_ = std::make_unique<PageDownload>(
-        &task_runner_, &storage_, &storage_, &encryption_service_,
-        &page_cloud_ptr_, this, NewTestBackoff());
-  }
-  ~BasePageDownloadTest() override {}
-
- protected:
-  void SetOnNewStateCallback(fit::closure callback) {
-    new_state_callback_ = std::move(callback);
-  }
-
-  // Starts download and runs the loop until the download state is idle. Returns
-  // true iff the download state went to idle as expected.
-  ::testing::AssertionResult StartDownloadAndWaitForIdle() {
-    bool on_idle_called = false;
-    SetOnNewStateCallback([this, &on_idle_called] {
-      if (states_.back() == DOWNLOAD_IDLE) {
-        on_idle_called = true;
-      }
-    });
-    page_download_->StartDownload();
-    RunLoopUntilIdle();
-    SetOnNewStateCallback([] {});
-
-    if (on_idle_called) {
-      return ::testing::AssertionSuccess();
-    }
-    return ::testing::AssertionFailure()
-           << "The download state never reached idle.";
-  }
-
-  TestPageStorage storage_;
-  E encryption_service_;
-  cloud_provider::PageCloudPtr page_cloud_ptr_;
-  TestPageCloud page_cloud_;
-  std::vector<DownloadSyncState> states_;
-  std::unique_ptr<PageDownload> page_download_;
-  int error_callback_calls_ = 0;
-
- private:
-  void SetDownloadState(DownloadSyncState sync_state) override {
-    if (!states_.empty() && sync_state == states_.back()) {
-      // Skip identical states.
-      return;
-    }
-    states_.push_back(sync_state);
-    if (new_state_callback_) {
-      new_state_callback_();
-    }
-  }
-
-  fit::closure new_state_callback_;
-  callback::ScopedTaskRunner task_runner_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(BasePageDownloadTest);
-};
-
-using PageDownloadTest =
-    BasePageDownloadTest<encryption::FakeEncryptionService>;
-
-// Verifies that the backlog of unsynced commits is retrieved from the cloud
-// provider and saved in storage.
-TEST_F(PageDownloadTest, DownloadBacklog) {
-  EXPECT_EQ(0u, storage_.received_commits.size());
-  EXPECT_EQ(0u, storage_.sync_metadata.count(kTimestampKey.ToString()));
-
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "id1", "content1"));
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "id2", "content2"));
-  page_cloud_.position_token_to_return = fidl::MakeOptional(MakeToken("43"));
-
-  ASSERT_TRUE(StartDownloadAndWaitForIdle());
-
-  EXPECT_EQ(2u, storage_.received_commits.size());
-  EXPECT_EQ("content1", storage_.received_commits["id1"]);
-  EXPECT_EQ("content2", storage_.received_commits["id2"]);
-  EXPECT_EQ("43", storage_.sync_metadata[kTimestampKey.ToString()]);
-  EXPECT_EQ(DOWNLOAD_IDLE, states_.back());
-}
-
-TEST_F(PageDownloadTest, DownloadLongBacklog) {
-  EXPECT_EQ(0u, storage_.received_commits.size());
-  EXPECT_EQ(0u, storage_.sync_metadata.count(kTimestampKey.ToString()));
-
-  const size_t commit_count = 100'000;
-  for (size_t i = 0; i < commit_count; i++) {
-    page_cloud_.commits_to_return.push_back(
-        MakeTestCommit(&encryption_service_, "id" + std::to_string(i),
-                       "content" + std::to_string(i)));
-  }
-  page_cloud_.position_token_to_return = fidl::MakeOptional(MakeToken("43"));
-
-  ASSERT_TRUE(StartDownloadAndWaitForIdle());
-
-  EXPECT_EQ(commit_count, storage_.received_commits.size());
-  EXPECT_EQ("43", storage_.sync_metadata[kTimestampKey.ToString()]);
-  EXPECT_EQ(DOWNLOAD_IDLE, states_.back());
-}
-
-TEST_F(PageDownloadTest, DownloadEmptyBacklog) {
-  ASSERT_TRUE(StartDownloadAndWaitForIdle());
-}
-
-// Verifies that the cloud watcher is registered for the timestamp of the most
-// recent commit downloaded from the backlog.
-TEST_F(PageDownloadTest, RegisterWatcher) {
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "id1", "content1"));
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "id2", "content2"));
-  page_cloud_.position_token_to_return = fidl::MakeOptional(MakeToken("43"));
-
-  ASSERT_TRUE(StartDownloadAndWaitForIdle());
-
-  ASSERT_EQ(1u, page_cloud_.set_watcher_position_tokens.size());
-  EXPECT_EQ("43",
-            convert::ToString(
-                page_cloud_.set_watcher_position_tokens.front()->opaque_id));
-}
-
-// Verifies that commit notifications about new commits in cloud provider are
-// received and passed to storage.
-TEST_F(PageDownloadTest, ReceiveNotifications) {
-  ASSERT_TRUE(StartDownloadAndWaitForIdle());
-
-  // Deliver a remote notification.
-  EXPECT_EQ(0u, storage_.received_commits.size());
-  EXPECT_EQ(0u, storage_.sync_metadata.count(kTimestampKey.ToString()));
-  auto commit_pack = MakeTestCommitPack(
-      &encryption_service_, {{"id1", "content1"}, {"id2", "content2"}});
-  ASSERT_TRUE(commit_pack);
-  page_cloud_.set_watcher->OnNewCommits(std::move(*commit_pack),
-                                        MakeToken("43"), [] {});
-  RunLoopUntilIdle();
-
-  // Verify that the remote commits were added to storage.
-  EXPECT_EQ(2u, storage_.received_commits.size());
-  EXPECT_EQ("content1", storage_.received_commits["id1"]);
-  EXPECT_EQ("content2", storage_.received_commits["id2"]);
-  EXPECT_EQ("43", storage_.sync_metadata[kTimestampKey.ToString()]);
-}
-
-// Verify that we retry setting the remote watcher on connection errors
-// and when the auth token expires.
-TEST_F(PageDownloadTest, RetryRemoteWatcher) {
-  page_download_->StartDownload();
-  EXPECT_EQ(0u, storage_.received_commits.size());
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, page_cloud_.set_watcher_position_tokens.size());
-
-  page_cloud_.set_watcher->OnError(cloud_provider::Status::NETWORK_ERROR);
-  RunLoopFor(kTestBackoffInterval);
-  EXPECT_EQ(2u, page_cloud_.set_watcher_position_tokens.size());
-
-  page_cloud_.set_watcher->OnError(cloud_provider::Status::AUTH_ERROR);
-  RunLoopFor(kTestBackoffInterval);
-  EXPECT_EQ(3u, page_cloud_.set_watcher_position_tokens.size());
-}
-
-// Verifies that if multiple remote commits are received while one batch is
-// already being downloaded, the new remote commits are added to storage in one
-// request.
-TEST_F(PageDownloadTest, CoalesceMultipleNotifications) {
-  ASSERT_TRUE(StartDownloadAndWaitForIdle());
-
-  // Make the storage delay requests to add remote commits.
-  storage_.should_delay_add_commit_confirmation = true;
-
-  // Deliver a remote notification.
-  EXPECT_EQ(0u, storage_.received_commits.size());
-  EXPECT_EQ(0u, storage_.sync_metadata.count(kTimestampKey.ToString()));
-  auto commit_pack =
-      MakeTestCommitPack(&encryption_service_, {{"id1", "content1"}});
-  ASSERT_TRUE(commit_pack);
-  page_cloud_.set_watcher->OnNewCommits(std::move(*commit_pack),
-                                        MakeToken("42"), [] {});
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, storage_.delayed_add_commit_confirmations.size());
-
-  // Add two more remote commits, before storage confirms adding the first one.
-  commit_pack = MakeTestCommitPack(&encryption_service_,
-                                   {{"id2", "content2"}, {"id3", "content3"}});
-  page_cloud_.set_watcher->OnNewCommits(std::move(*commit_pack),
-                                        MakeToken("44"), [] {});
-
-  // Make storage confirm adding the first commit.
-  storage_.should_delay_add_commit_confirmation = false;
-  storage_.delayed_add_commit_confirmations.front()();
-  RunLoopUntilIdle();
-  EXPECT_EQ(3u, storage_.received_commits.size());
-
-  // Verify that all three commits were delivered in total of two calls to
-  // storage.
-  EXPECT_EQ(3u, storage_.received_commits.size());
-  EXPECT_EQ("content1", storage_.received_commits["id1"]);
-  EXPECT_EQ("content2", storage_.received_commits["id2"]);
-  EXPECT_EQ("content3", storage_.received_commits["id3"]);
-  EXPECT_EQ("44", storage_.sync_metadata[kTimestampKey.ToString()]);
-  EXPECT_EQ(2u, storage_.add_commits_from_sync_calls);
-}
-
-// TODO(LE-497): The following should not pass. Investigate why.
-// Verifies that failing attempts to download the backlog of unsynced commits
-// are retried.
-TEST_F(PageDownloadTest, RetryDownloadBacklog) {
-  page_cloud_.status_to_return = cloud_provider::Status::NETWORK_ERROR;
-  page_download_->StartDownload();
-
-  // Loop through five attempts to download the backlog.
-  SetOnNewStateCallback([this] {
-    if (page_cloud_.get_commits_calls >= 5u) {
-      QuitLoop();
-    }
-  });
-  RunLoopUntilIdle();
-  EXPECT_GE(5u, page_cloud_.get_commits_calls);
-  EXPECT_EQ(0u, storage_.received_commits.size());
-
-  SetOnNewStateCallback([] {});
-  page_cloud_.status_to_return = cloud_provider::Status::OK;
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "id1", "content1"));
-  page_cloud_.position_token_to_return = fidl::MakeOptional(MakeToken("42"));
-  RunLoopFor(kTestBackoffInterval);
-  EXPECT_TRUE(page_download_->IsIdle());
-
-  EXPECT_EQ(1u, storage_.received_commits.size());
-  EXPECT_EQ("content1", storage_.received_commits["id1"]);
-  EXPECT_EQ("42", storage_.sync_metadata[kTimestampKey.ToString()]);
-}
-
-// Verifies that a failure to persist the remote commit stops syncing remote
-// commits and the error status is returned.
-TEST_F(PageDownloadTest, FailToStoreRemoteCommit) {
-  ASSERT_TRUE(StartDownloadAndWaitForIdle());
-  EXPECT_TRUE(page_cloud_.set_watcher.is_bound());
-
-  storage_.should_fail_add_commit_from_sync = true;
-  auto commit_pack =
-      MakeTestCommitPack(&encryption_service_, {{"id1", "content1"}});
-  ASSERT_TRUE(commit_pack);
-  page_cloud_.set_watcher->OnNewCommits(std::move(*commit_pack),
-                                        MakeToken("42"), [] {});
-
-  RunLoopUntilIdle();
-  ASSERT_FALSE(states_.empty());
-  EXPECT_EQ(DOWNLOAD_PERMANENT_ERROR, states_.back());
-  EXPECT_FALSE(page_cloud_.set_watcher.is_bound());
-}
-
-// Verifies that the idle status is returned when there is no download in
-// progress.
-TEST_F(PageDownloadTest, DownloadIdleCallback) {
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "id1", "content1"));
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "id2", "content2"));
-  page_cloud_.position_token_to_return = fidl::MakeOptional(MakeToken("43"));
-
-  int on_idle_calls = 0;
-  SetOnNewStateCallback([this, &on_idle_calls] {
-    if (states_.back() == DOWNLOAD_IDLE) {
-      on_idle_calls++;
-    }
-  });
-  page_download_->StartDownload();
-  EXPECT_EQ(0, on_idle_calls);
-  EXPECT_FALSE(page_download_->IsIdle());
-
-  // Run the message loop and verify that the sync is idle after all remote
-  // commits are added to storage.
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, on_idle_calls);
-  EXPECT_TRUE(page_download_->IsIdle());
-
-  // Notify about a new commit to download and verify that the idle callback was
-  // called again on completion.
-  auto commit_pack =
-      MakeTestCommitPack(&encryption_service_, {{"id3", "content3"}});
-  ASSERT_TRUE(commit_pack);
-  page_cloud_.set_watcher->OnNewCommits(std::move(*commit_pack),
-                                        MakeToken("44"), [] {});
-  RunLoopUntilIdle();
-  EXPECT_EQ(3u, storage_.received_commits.size());
-  EXPECT_EQ(2, on_idle_calls);
-  EXPECT_TRUE(page_download_->IsIdle());
-}
-
-// Verifies that sync correctly fetches objects from the cloud provider.
-TEST_F(PageDownloadTest, GetObject) {
-  storage::ObjectIdentifier object_identifier = MakeObjectIdentifier();
-  std::string object_name =
-      encryption_service_.GetObjectNameSynchronous(object_identifier);
-  page_cloud_.objects_to_return[object_name] =
-      encryption_service_.EncryptObjectSynchronous("content");
-  page_download_->StartDownload();
-
-  bool called;
-  storage::Status status;
-  storage::ChangeSource source;
-  storage::IsObjectSynced is_object_synced;
-  std::unique_ptr<storage::DataSource::DataChunk> data_chunk;
-  RunLoopUntilIdle();
-  states_.clear();
-  storage_.page_sync_delegate_->GetObject(
-      object_identifier,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &source,
-                        &is_object_synced, &data_chunk));
-  RunLoopUntilIdle();
-
-  EXPECT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(storage::ChangeSource::CLOUD, source);
-  EXPECT_EQ(storage::IsObjectSynced::YES, is_object_synced);
-  EXPECT_EQ("content", data_chunk->Get().ToString());
-  EXPECT_EQ(2u, states_.size());
-  EXPECT_EQ(DOWNLOAD_IN_PROGRESS, states_[0]);
-  EXPECT_EQ(DOWNLOAD_IDLE, states_[1]);
-}
-
-// Verifies that sync retries GetObject() attempts upon connection error.
-TEST_F(PageDownloadTest, RetryGetObject) {
-  storage::ObjectIdentifier object_identifier = MakeObjectIdentifier();
-  std::string object_name =
-      encryption_service_.GetObjectNameSynchronous(object_identifier);
-
-  page_cloud_.status_to_return = cloud_provider::Status::NETWORK_ERROR;
-  SetOnNewStateCallback([this] {
-    if (states_.back() == DOWNLOAD_PERMANENT_ERROR) {
-      QuitLoop();
-    }
-  });
-
-  page_download_->StartDownload();
-
-  bool called;
-  storage::Status status;
-  storage::ChangeSource source;
-  storage::IsObjectSynced is_object_synced;
-  std::unique_ptr<storage::DataSource::DataChunk> data_chunk;
-  storage_.page_sync_delegate_->GetObject(
-      object_identifier,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &source,
-                        &is_object_synced, &data_chunk));
-
-  // Allow the operation to succeed after looping through five attempts.
-  RunLoopFor(kTestBackoffInterval * 4);
-  page_cloud_.status_to_return = cloud_provider::Status::OK;
-  page_cloud_.objects_to_return[object_name] =
-      encryption_service_.EncryptObjectSynchronous("content");
-  RunLoopFor(kTestBackoffInterval);
-
-  ASSERT_TRUE(called);
-  EXPECT_EQ(6u, page_cloud_.get_object_calls);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ(storage::ChangeSource::CLOUD, source);
-  EXPECT_EQ("content", data_chunk->Get().ToString());
-  EXPECT_EQ(storage::IsObjectSynced::YES, is_object_synced);
-}
-
-class FailingDecryptCommitEncryptionService
-    : public encryption::FakeEncryptionService {
- public:
-  explicit FailingDecryptCommitEncryptionService(async_dispatcher_t* dispatcher)
-      : encryption::FakeEncryptionService(dispatcher) {}
-
-  void DecryptCommit(
-      convert::ExtendedStringView /*storage_bytes*/,
-      fit::function<void(encryption::Status, std::string)> callback) override {
-    callback(encryption::Status::INVALID_ARGUMENT, "");
-  }
-};
-
-class FailingGetNameEncryptionService
-    : public encryption::FakeEncryptionService {
- public:
-  explicit FailingGetNameEncryptionService(async_dispatcher_t* dispatcher)
-      : encryption::FakeEncryptionService(dispatcher) {}
-
-  void GetObjectName(
-      storage::ObjectIdentifier /*object_identifier*/,
-      fit::function<void(encryption::Status, std::string)> callback) override {
-    callback(encryption::Status::INVALID_ARGUMENT, "");
-  }
-};
-
-class FailingDecryptObjectEncryptionService
-    : public encryption::FakeEncryptionService {
- public:
-  explicit FailingDecryptObjectEncryptionService(async_dispatcher_t* dispatcher)
-      : encryption::FakeEncryptionService(dispatcher) {}
-
-  void DecryptObject(
-      storage::ObjectIdentifier /*object_identifier*/,
-      std::string /*encrypted_data*/,
-      fit::function<void(encryption::Status, std::string)> callback) override {
-    callback(encryption::Status::INVALID_ARGUMENT, "");
-  }
-};
-
-using FailingDecryptCommitPageDownloadTest =
-    BasePageDownloadTest<FailingDecryptCommitEncryptionService>;
-TEST_F(FailingDecryptCommitPageDownloadTest, Fail) {
-  EXPECT_EQ(0u, storage_.received_commits.size());
-  EXPECT_EQ(0u, storage_.sync_metadata.count(kTimestampKey.ToString()));
-
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "id1", "content1"));
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "id2", "content2"));
-  page_cloud_.position_token_to_return = fidl::MakeOptional(MakeToken("43"));
-
-  EXPECT_FALSE(StartDownloadAndWaitForIdle());
-  ASSERT_FALSE(states_.empty());
-  EXPECT_EQ(DOWNLOAD_PERMANENT_ERROR, states_.back());
-}
-
-template <typename E>
-using FailingPageDownloadTest = BasePageDownloadTest<E>;
-
-using FailingEncryptionServices =
-    ::testing::Types<FailingGetNameEncryptionService,
-                     FailingDecryptObjectEncryptionService>;
-
-TYPED_TEST_CASE(FailingPageDownloadTest, FailingEncryptionServices);
-
-TYPED_TEST(FailingPageDownloadTest, Fail) {
-  storage::ObjectIdentifier object_identifier = MakeObjectIdentifier();
-  std::string object_name =
-      this->encryption_service_.GetObjectNameSynchronous(object_identifier);
-  this->page_cloud_.objects_to_return[object_name] =
-      this->encryption_service_.EncryptObjectSynchronous("content");
-  this->page_download_->StartDownload();
-
-  bool called;
-  storage::Status status;
-  storage::ChangeSource source;
-  storage::IsObjectSynced is_object_synced;
-  std::unique_ptr<storage::DataSource::DataChunk> data_chunk;
-  this->storage_.page_sync_delegate_->GetObject(
-      object_identifier,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &source,
-                        &is_object_synced, &data_chunk));
-  this->RunLoopUntilIdle();
-
-  ASSERT_TRUE(called);
-  EXPECT_EQ(storage::Status::IO_ERROR, status);
-  EXPECT_EQ(storage::ChangeSource::CLOUD, source);
-}
-
-}  // namespace
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/page_sync_impl.cc b/bin/ledger/cloud_sync/impl/page_sync_impl.cc
deleted file mode 100644
index 21bb2a7..0000000
--- a/bin/ledger/cloud_sync/impl/page_sync_impl.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/page_sync_impl.h"
-
-#include <algorithm>
-#include <map>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/constants.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace cloud_sync {
-
-PageSyncImpl::PageSyncImpl(async_dispatcher_t* dispatcher,
-                           storage::PageStorage* storage,
-                           storage::PageSyncClient* sync_client,
-                           encryption::EncryptionService* encryption_service,
-                           cloud_provider::PageCloudPtr page_cloud,
-                           std::unique_ptr<backoff::Backoff> download_backoff,
-                           std::unique_ptr<backoff::Backoff> upload_backoff,
-                           std::unique_ptr<SyncStateWatcher> ledger_watcher)
-    : storage_(storage),
-      sync_client_(sync_client),
-      encryption_service_(encryption_service),
-      page_cloud_(std::move(page_cloud)),
-      log_prefix_("Page " + convert::ToHex(storage->GetId()) + " sync: "),
-      ledger_watcher_(std::move(ledger_watcher)),
-      task_runner_(dispatcher) {
-  FXL_DCHECK(storage_);
-  FXL_DCHECK(page_cloud_);
-  // We need to initialize page_download_ after task_runner_, but task_runner_
-  // must be the last field.
-  page_download_ = std::make_unique<PageDownload>(
-      &task_runner_, storage_, sync_client_, encryption_service_, &page_cloud_,
-      this, std::move(download_backoff));
-  page_upload_ = std::make_unique<PageUpload>(&task_runner_, storage_,
-                                              encryption_service_, &page_cloud_,
-                                              this, std::move(upload_backoff));
-  page_cloud_.set_error_handler([this](zx_status_t status) {
-    if (on_unrecoverable_error_ && !error_callback_already_called_) {
-      error_callback_already_called_ = true;
-      on_unrecoverable_error_();
-    }
-  });
-}
-
-PageSyncImpl::~PageSyncImpl() {
-  if (on_delete_) {
-    on_delete_();
-  }
-}
-
-void PageSyncImpl::EnableUpload() {
-  enable_upload_ = true;
-
-  if (!started_) {
-    // We will start upload when this object is started.
-    return;
-  }
-
-  if (upload_state_ == UPLOAD_NOT_STARTED) {
-    page_upload_->StartOrRestartUpload();
-  }
-}
-
-void PageSyncImpl::Start() {
-  FXL_DCHECK(!started_);
-  started_ = true;
-
-  page_download_->StartDownload();
-  if (enable_upload_) {
-    page_upload_->StartOrRestartUpload();
-  }
-}
-
-void PageSyncImpl::SetOnIdle(fit::closure on_idle) {
-  FXL_DCHECK(!on_idle_);
-  FXL_DCHECK(!started_);
-  on_idle_ = std::move(on_idle);
-}
-
-bool PageSyncImpl::IsIdle() {
-  return page_upload_->IsIdle() && page_download_->IsIdle();
-}
-
-void PageSyncImpl::SetOnBacklogDownloaded(fit::closure on_backlog_downloaded) {
-  FXL_DCHECK(!on_backlog_downloaded_);
-  FXL_DCHECK(!started_);
-  on_backlog_downloaded_ = std::move(on_backlog_downloaded);
-}
-
-void PageSyncImpl::SetSyncWatcher(SyncStateWatcher* watcher) {
-  page_watcher_ = watcher;
-  if (page_watcher_) {
-    page_watcher_->Notify(download_state_, upload_state_);
-  }
-}
-
-void PageSyncImpl::SetOnUnrecoverableError(
-    fit::closure on_unrecoverable_error) {
-  on_unrecoverable_error_ = std::move(on_unrecoverable_error);
-}
-
-void PageSyncImpl::HandleError() {
-  if (error_callback_already_called_) {
-    return;
-  }
-
-  if (on_unrecoverable_error_) {
-    error_callback_already_called_ = true;
-    on_unrecoverable_error_();
-  }
-}
-
-void PageSyncImpl::CheckIdle() {
-  if (IsIdle()) {
-    if (on_idle_) {
-      on_idle_();
-    }
-  }
-}
-
-void PageSyncImpl::NotifyStateWatcher() {
-  if (ledger_watcher_) {
-    ledger_watcher_->Notify(download_state_, upload_state_);
-  }
-  if (page_watcher_) {
-    page_watcher_->Notify(download_state_, upload_state_);
-  }
-  CheckIdle();
-}
-
-void PageSyncImpl::SetDownloadState(DownloadSyncState next_download_state) {
-  if (next_download_state == DOWNLOAD_PERMANENT_ERROR) {
-    HandleError();
-  }
-
-  if (download_state_ == DOWNLOAD_BACKLOG &&
-      next_download_state != DOWNLOAD_PERMANENT_ERROR &&
-      on_backlog_downloaded_) {
-    on_backlog_downloaded_();
-  }
-
-  if (download_state_ != DOWNLOAD_IDLE &&
-      next_download_state == DOWNLOAD_IDLE && enable_upload_) {
-    page_upload_->StartOrRestartUpload();
-  }
-
-  download_state_ = next_download_state;
-  NotifyStateWatcher();
-}
-
-void PageSyncImpl::SetUploadState(UploadSyncState next_upload_state) {
-  if (next_upload_state == UPLOAD_PERMANENT_ERROR) {
-    HandleError();
-  }
-
-  upload_state_ = next_upload_state;
-  NotifyStateWatcher();
-}
-
-bool PageSyncImpl::IsDownloadIdle() { return page_download_->IsIdle(); }
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/page_sync_impl.h b/bin/ledger/cloud_sync/impl/page_sync_impl.h
deleted file mode 100644
index 67e4b54..0000000
--- a/bin/ledger/cloud_sync/impl/page_sync_impl.h
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_PAGE_SYNC_IMPL_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_PAGE_SYNC_IMPL_H_
-
-#include <functional>
-#include <queue>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/async/dispatcher.h>
-#include <lib/backoff/backoff.h>
-#include <lib/callback/scoped_task_runner.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/time/time_delta.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/batch_download.h"
-#include "peridot/bin/ledger/cloud_sync/impl/batch_upload.h"
-#include "peridot/bin/ledger/cloud_sync/impl/page_download.h"
-#include "peridot/bin/ledger/cloud_sync/impl/page_upload.h"
-#include "peridot/bin/ledger/cloud_sync/public/page_sync.h"
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/storage/public/commit_watcher.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace cloud_sync {
-
-// Manages cloud sync for a single page.
-//
-// Contract: commits are uploaded in the same order as storage delivers them.
-// The backlog of unsynced commits is uploaded first, then we upload commits
-// delivered through storage watcher in the notification order.
-//
-// Conversely for the remote commits: the backlog of remote commits is
-// downloaded first, then a cloud watcher is set to track new remote commits
-// appearing in the cloud provider. Remote commits are added to storage in the
-// order in which they were added to the cloud provided.
-//
-// In order to track which remote commits were already fetched, we keep track of
-// the server-side timestamp of the last commit we added to storage. As this
-// information needs to be persisted through reboots, we store the timestamp
-// itself in storage using a dedicated API (Get/SetSyncMetadata()).
-//
-// Recoverable errors (such as network errors) are automatically retried with
-// the given backoff policy, using the given task runner to schedule the tasks.
-// TODO(ppi): once the network service can notify us about regained
-// connectivity, thread this signal through PageCloudHandler and use it as a
-// signal to trigger retries.
-//
-// Unrecoverable errors (such as internal errors accessing the storage) cause
-// the page sync to stop, in which case the client is notified using the error
-// callback set via SetOnUnrecoverableError().
-class PageSyncImpl : public PageSync,
-                     public PageDownload::Delegate,
-                     public PageUpload::Delegate {
- public:
-  PageSyncImpl(async_dispatcher_t* dispatcher, storage::PageStorage* storage,
-               storage::PageSyncClient* sync_client,
-               encryption::EncryptionService* encryption_service,
-               cloud_provider::PageCloudPtr page_cloud,
-               std::unique_ptr<backoff::Backoff> download_backoff,
-               std::unique_ptr<backoff::Backoff> upload_backoff,
-               std::unique_ptr<SyncStateWatcher> ledger_watcher = nullptr);
-  ~PageSyncImpl() override;
-
-  // |on_delete| will be called when this class is deleted.
-  void set_on_delete(fit::function<void()> on_delete) {
-    FXL_DCHECK(!on_delete_);
-    on_delete_ = std::move(on_delete);
-  }
-
-  // Enables upload. Has no effect if this method has already been called.
-  void EnableUpload();
-
-  // PageSync:
-  void Start() override;
-
-  void SetOnIdle(fit::closure on_idle) override;
-
-  bool IsIdle() override;
-
-  void SetOnBacklogDownloaded(fit::closure on_backlog_downloaded) override;
-
-  void SetSyncWatcher(SyncStateWatcher* watcher) override;
-
-  void SetOnUnrecoverableError(fit::closure on_unrecoverable_error) override;
-
- private:
-  void HandleError();
-
-  void CheckIdle();
-
-  // Notify the state watcher of a change of synchronization state.
-  void SetDownloadState(DownloadSyncState next_download_state) override;
-  void SetUploadState(UploadSyncState next_upload_state) override;
-  bool IsDownloadIdle() override;
-
-  void NotifyStateWatcher();
-
-  storage::PageStorage* const storage_;
-  storage::PageSyncClient* const sync_client_;
-  encryption::EncryptionService* const encryption_service_;
-  cloud_provider::PageCloudPtr page_cloud_;
-  const fit::closure on_error_;
-  const std::string log_prefix_;
-
-  std::unique_ptr<PageDownload> page_download_;
-  std::unique_ptr<PageUpload> page_upload_;
-
-  fit::closure on_idle_;
-  fit::closure on_backlog_downloaded_;
-  fit::closure on_unrecoverable_error_;
-  // Ensures that each instance is started only once.
-  bool started_ = false;
-  // Set to true on unrecoverable error. This indicates that PageSyncImpl is in
-  // broken state.
-  bool error_callback_already_called_ = false;
-  // Blocks the start of the upload process until we get an explicit signal.
-  bool enable_upload_ = false;
-
-  // Called on destruction.
-  fit::function<void()> on_delete_;
-
-  // Watcher of the synchronization state that reports to the LedgerSync object.
-  std::unique_ptr<SyncStateWatcher> ledger_watcher_;
-  SyncStateWatcher* page_watcher_ = nullptr;
-  DownloadSyncState download_state_ = DOWNLOAD_NOT_STARTED;
-  UploadSyncState upload_state_ = UPLOAD_NOT_STARTED;
-
-  // Must be the last member field.
-  callback::ScopedTaskRunner task_runner_;
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_PAGE_SYNC_IMPL_H_
diff --git a/bin/ledger/cloud_sync/impl/page_sync_impl_unittest.cc b/bin/ledger/cloud_sync/impl/page_sync_impl_unittest.cc
deleted file mode 100644
index 55ba360..0000000
--- a/bin/ledger/cloud_sync/impl/page_sync_impl_unittest.cc
+++ /dev/null
@@ -1,435 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/page_sync_impl.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-#include <lib/async/cpp/task.h>
-#include <lib/backoff/testing/test_backoff.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/constants.h"
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_page_cloud.h"
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_page_storage.h"
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/testing/commit_empty_impl.h"
-#include "peridot/bin/ledger/storage/testing/page_storage_empty_impl.h"
-
-namespace cloud_sync {
-namespace {
-
-using testing::ElementsAre;
-
-// Creates a dummy continuation token.
-cloud_provider::Token MakeToken(convert::ExtendedStringView token_id) {
-  cloud_provider::Token token;
-  token.opaque_id = convert::ToArray(token_id);
-  return token;
-}
-
-class TestSyncStateWatcher : public SyncStateWatcher {
- public:
-  TestSyncStateWatcher() {}
-  ~TestSyncStateWatcher() override{};
-
-  void Notify(SyncStateContainer sync_state) override {
-    if (!states.empty() && sync_state == *states.rbegin()) {
-      return;
-    }
-    states.push_back(sync_state);
-  }
-
-  std::vector<SyncStateContainer> states;
-};
-
-class PageSyncImplTest : public gtest::TestLoopFixture {
- public:
-  PageSyncImplTest()
-      : storage_(dispatcher()),
-        encryption_service_(dispatcher()),
-        page_cloud_(page_cloud_ptr_.NewRequest()) {
-    std::unique_ptr<TestSyncStateWatcher> watcher =
-        std::make_unique<TestSyncStateWatcher>();
-    state_watcher_ = watcher.get();
-
-    auto download_backoff =
-        std::make_unique<backoff::TestBackoff>(zx::msec(50));
-    download_backoff_ptr_ = download_backoff.get();
-    auto upload_backoff = std::make_unique<backoff::TestBackoff>(zx::msec(50));
-    upload_backoff_ptr_ = upload_backoff.get();
-
-    page_sync_ = std::make_unique<PageSyncImpl>(
-        dispatcher(), &storage_, &storage_, &encryption_service_,
-        std::move(page_cloud_ptr_), std::move(download_backoff),
-        std::move(upload_backoff), std::move(watcher));
-  }
-  ~PageSyncImplTest() override {}
-
- protected:
-  enum class UploadStatus {
-    ENABLED,
-    DISABLED,
-  };
-  void StartPageSync(UploadStatus status = UploadStatus::ENABLED) {
-    if (status == UploadStatus::ENABLED) {
-      page_sync_->EnableUpload();
-    }
-    page_sync_->Start();
-  }
-
-  TestPageStorage storage_;
-  encryption::FakeEncryptionService encryption_service_;
-  cloud_provider::PageCloudPtr page_cloud_ptr_;
-  TestPageCloud page_cloud_;
-  backoff::TestBackoff* download_backoff_ptr_;
-  backoff::TestBackoff* upload_backoff_ptr_;
-  TestSyncStateWatcher* state_watcher_;
-  std::unique_ptr<PageSyncImpl> page_sync_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageSyncImplTest);
-};
-
-SyncStateWatcher::SyncStateContainer MakeStates(DownloadSyncState download,
-                                                UploadSyncState upload) {
-  return {download, upload};
-}
-
-// Verifies that the backlog of commits to upload returned from
-// GetUnsyncedCommits() is uploaded to PageCloudHandler.
-TEST_F(PageSyncImplTest, UploadBacklog) {
-  storage_.NewCommit("id1", "content1");
-  storage_.NewCommit("id2", "content2");
-  bool called;
-  page_sync_->SetOnIdle(callback::SetWhenCalled(&called));
-  StartPageSync();
-
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-
-  ASSERT_EQ(2u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id1", page_cloud_.received_commits[0].id);
-  EXPECT_EQ("content1", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[0].data));
-  EXPECT_EQ("id2", page_cloud_.received_commits[1].id);
-  EXPECT_EQ("content2", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[1].data));
-  EXPECT_EQ(2u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id1"));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id2"));
-
-  EXPECT_THAT(
-      state_watcher_->states,
-      ElementsAre(MakeStates(DOWNLOAD_BACKLOG, UPLOAD_NOT_STARTED),
-                  MakeStates(DOWNLOAD_BACKLOG, UPLOAD_WAIT_REMOTE_DOWNLOAD),
-                  MakeStates(DOWNLOAD_SETTING_REMOTE_WATCHER,
-                             UPLOAD_WAIT_REMOTE_DOWNLOAD),
-                  MakeStates(DOWNLOAD_IDLE, UPLOAD_WAIT_REMOTE_DOWNLOAD),
-                  MakeStates(DOWNLOAD_IDLE, UPLOAD_PENDING),
-                  MakeStates(DOWNLOAD_IDLE, UPLOAD_IN_PROGRESS),
-                  MakeStates(DOWNLOAD_IDLE, UPLOAD_IDLE)));
-}
-
-// Verifies that the backlog of commits to upload returned from
-// GetUnsyncedCommits() is uploaded to PageCloudHandler.
-TEST_F(PageSyncImplTest, PageWatcher) {
-  TestSyncStateWatcher watcher;
-  storage_.NewCommit("id1", "content1");
-  storage_.NewCommit("id2", "content2");
-  bool called;
-  page_sync_->SetOnIdle(callback::SetWhenCalled(&called));
-  page_sync_->SetSyncWatcher(&watcher);
-  StartPageSync();
-
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-
-  EXPECT_THAT(
-      watcher.states,
-      ElementsAre(MakeStates(DOWNLOAD_NOT_STARTED, UPLOAD_NOT_STARTED),
-                  MakeStates(DOWNLOAD_BACKLOG, UPLOAD_NOT_STARTED),
-                  MakeStates(DOWNLOAD_BACKLOG, UPLOAD_WAIT_REMOTE_DOWNLOAD),
-                  MakeStates(DOWNLOAD_SETTING_REMOTE_WATCHER,
-                             UPLOAD_WAIT_REMOTE_DOWNLOAD),
-                  MakeStates(DOWNLOAD_IDLE, UPLOAD_WAIT_REMOTE_DOWNLOAD),
-                  MakeStates(DOWNLOAD_IDLE, UPLOAD_PENDING),
-                  MakeStates(DOWNLOAD_IDLE, UPLOAD_IN_PROGRESS),
-                  MakeStates(DOWNLOAD_IDLE, UPLOAD_IDLE)));
-}
-
-// Verifies that sync pauses uploading commits when it is downloading a commit.
-TEST_F(PageSyncImplTest, NoUploadWhenDownloading) {
-  storage_.should_delay_add_commit_confirmation = true;
-
-  bool called;
-  page_sync_->SetOnIdle(callback::SetWhenCalled(&called));
-  StartPageSync();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  ASSERT_TRUE(page_cloud_.set_watcher.is_bound());
-  auto commit_pack =
-      MakeTestCommitPack(&encryption_service_, {{"id1", "content1"}});
-  ASSERT_TRUE(commit_pack);
-  page_cloud_.set_watcher->OnNewCommits(std::move(*commit_pack),
-                                        MakeToken("44"), [] {});
-  RunLoopUntilIdle();
-  EXPECT_LT(0u, storage_.add_commits_from_sync_calls);
-
-  storage_.watcher_->OnNewCommits(
-      storage_.NewCommit("id2", "content2")->AsList(),
-      storage::ChangeSource::LOCAL);
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(storage_.delayed_add_commit_confirmations.empty());
-  EXPECT_TRUE(page_cloud_.received_commits.empty());
-
-  storage_.delayed_add_commit_confirmations.front()();
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(page_cloud_.received_commits.empty());
-}
-
-TEST_F(PageSyncImplTest, UploadExistingCommitsOnlyAfterBacklogDownload) {
-  // Verify that two local commits are not uploaded when download is in
-  // progress.
-  storage_.NewCommit("local1", "content1");
-  storage_.NewCommit("local2", "content2");
-
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "remote3", "content3"));
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "remote4", "content4"));
-  page_cloud_.position_token_to_return = fidl::MakeOptional(MakeToken("43"));
-  bool backlog_downloaded_called = false;
-  page_sync_->SetOnBacklogDownloaded([this, &backlog_downloaded_called] {
-    EXPECT_EQ(0u, page_cloud_.received_commits.size());
-    EXPECT_EQ(0u, storage_.commits_marked_as_synced.size());
-    backlog_downloaded_called = true;
-  });
-  bool called;
-  page_sync_->SetOnIdle(callback::SetWhenCalled(&called));
-  StartPageSync();
-
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_TRUE(backlog_downloaded_called);
-  ASSERT_EQ(2u, page_cloud_.received_commits.size());
-  EXPECT_EQ("local1", page_cloud_.received_commits[0].id);
-  EXPECT_EQ("content1", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[0].data));
-  EXPECT_EQ("local2", page_cloud_.received_commits[1].id);
-  EXPECT_EQ("content2", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[1].data));
-  ASSERT_EQ(2u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("local1"));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("local2"));
-}
-
-// Verifies that existing commits are uploaded before the new ones.
-TEST_F(PageSyncImplTest, UploadExistingAndNewCommits) {
-  storage_.NewCommit("id1", "content1");
-
-  page_sync_->SetOnBacklogDownloaded([this] {
-    async::PostTask(dispatcher(), [this] {
-      auto commit = storage_.NewCommit("id2", "content2");
-      storage_.new_commits_to_return["id2"] = commit->Clone();
-      storage_.watcher_->OnNewCommits(commit->AsList(),
-                                      storage::ChangeSource::LOCAL);
-    });
-  });
-  bool called;
-  page_sync_->SetOnIdle(callback::SetWhenCalled(&called));
-
-  StartPageSync();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-
-  ASSERT_EQ(2u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id1", page_cloud_.received_commits[0].id);
-  EXPECT_EQ("content1", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[0].data));
-  EXPECT_EQ("id2", page_cloud_.received_commits[1].id);
-  EXPECT_EQ("content2", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[1].data));
-  EXPECT_EQ(2u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id1"));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id2"));
-}
-
-// Verifies that the on idle callback is called when there is no pending upload
-// tasks.
-TEST_F(PageSyncImplTest, UploadIdleCallback) {
-  int on_idle_calls = 0;
-
-  storage_.NewCommit("id1", "content1");
-  storage_.NewCommit("id2", "content2");
-
-  page_sync_->SetOnIdle([&on_idle_calls] { on_idle_calls++; });
-  StartPageSync();
-
-  // Verify that the idle callback is called once both commits are uploaded.
-  RunLoopUntilIdle();
-  EXPECT_EQ(2u, page_cloud_.received_commits.size());
-  EXPECT_EQ(1, on_idle_calls);
-  EXPECT_TRUE(page_sync_->IsIdle());
-
-  // Notify about a new commit to upload and verify that the idle callback was
-  // called again on completion.
-  auto commit3 = storage_.NewCommit("id3", "content3");
-  storage_.new_commits_to_return["id3"] = commit3->Clone();
-  storage_.watcher_->OnNewCommits(commit3->AsList(),
-                                  storage::ChangeSource::LOCAL);
-  EXPECT_FALSE(page_sync_->IsIdle());
-  RunLoopUntilIdle();
-  EXPECT_EQ(3u, page_cloud_.received_commits.size());
-  EXPECT_EQ(2, on_idle_calls);
-  EXPECT_TRUE(page_sync_->IsIdle());
-}
-
-// Verifies that a failure to persist the remote commit stops syncing remote
-// commits and calls the error callback.
-TEST_F(PageSyncImplTest, FailToStoreRemoteCommit) {
-  bool called;
-  page_sync_->SetOnIdle(callback::SetWhenCalled(&called));
-  int error_callback_calls = 0;
-  page_sync_->SetOnUnrecoverableError(
-      [&error_callback_calls] { error_callback_calls++; });
-  StartPageSync();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  ASSERT_TRUE(page_cloud_.set_watcher.is_bound());
-
-  auto commit_pack =
-      MakeTestCommitPack(&encryption_service_, {{"id1", "content1"}});
-  ASSERT_TRUE(commit_pack);
-  storage_.should_fail_add_commit_from_sync = true;
-  EXPECT_EQ(0, error_callback_calls);
-  page_cloud_.set_watcher->OnNewCommits(std::move(*commit_pack),
-                                        MakeToken("42"), [] {});
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(page_cloud_.set_watcher.is_bound());
-  EXPECT_EQ(1, error_callback_calls);
-}
-
-// Verifies that the on idle callback is called when there is no download in
-// progress.
-TEST_F(PageSyncImplTest, DownloadIdleCallback) {
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "id1", "content1"));
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "id2", "content2"));
-  page_cloud_.position_token_to_return = fidl::MakeOptional(MakeToken("43"));
-
-  int on_idle_calls = 0;
-  page_sync_->SetOnIdle([&on_idle_calls] { on_idle_calls++; });
-  StartPageSync();
-  EXPECT_EQ(0, on_idle_calls);
-  EXPECT_FALSE(page_sync_->IsIdle());
-
-  // Run the message loop and verify that the sync is idle after all remote
-  // commits are added to storage.
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, on_idle_calls);
-  EXPECT_TRUE(page_sync_->IsIdle());
-  EXPECT_EQ(2u, storage_.received_commits.size());
-
-  // Notify about a new commit to download and verify that the idle callback was
-  // called again on completion.
-  auto commit_pack =
-      MakeTestCommitPack(&encryption_service_, {{"id3", "content3"}});
-  ASSERT_TRUE(commit_pack);
-  page_cloud_.set_watcher->OnNewCommits(std::move(*commit_pack),
-                                        MakeToken("44"), [] {});
-  RunLoopUntilIdle();
-  EXPECT_EQ(3u, storage_.received_commits.size());
-  EXPECT_EQ(2, on_idle_calls);
-  EXPECT_TRUE(page_sync_->IsIdle());
-}
-
-// Verifies that uploads are paused until EnableUpload is called.
-TEST_F(PageSyncImplTest, UploadIsPaused) {
-  storage_.NewCommit("id1", "content1");
-  storage_.NewCommit("id2", "content2");
-  bool called;
-  page_sync_->SetOnIdle(callback::SetWhenCalled(&called));
-
-  StartPageSync(UploadStatus::DISABLED);
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-
-  ASSERT_EQ(0u, page_cloud_.received_commits.size());
-
-  page_sync_->EnableUpload();
-  RunLoopUntilIdle();
-
-  ASSERT_EQ(2u, page_cloud_.received_commits.size());
-}
-
-// Merge commits are deterministic, so can already be in the cloud when we try
-// to upload it. The upload will then fail. However, we should stop retrying to
-// upload the commit once we received a notification for it through the cloud
-// sync watcher.
-TEST_F(PageSyncImplTest, UploadCommitAlreadyInCloud) {
-  // Complete the initial sync.
-  StartPageSync();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, page_cloud_.get_commits_calls);
-
-  // Create a local commit, but make the upload fail.
-  page_cloud_.commit_status_to_return = cloud_provider::Status::SERVER_ERROR;
-  auto commit1 = storage_.NewCommit("id1", "content1");
-  storage_.new_commits_to_return["id1"] = commit1->Clone();
-  storage_.watcher_->OnNewCommits(commit1->AsList(),
-                                  storage::ChangeSource::LOCAL);
-
-  // We need to wait for the callback to be executed on the PageSync side.
-  RunLoopUntilIdle();
-  EXPECT_EQ(1u, page_cloud_.add_commits_calls);
-  EXPECT_EQ(1, upload_backoff_ptr_->get_next_count);
-
-  // Verify that the commit is still not marked as synced in storage.
-  EXPECT_TRUE(storage_.commits_marked_as_synced.empty());
-
-  // Let's receive the same commit from the remote side.
-  auto commit_pack =
-      MakeTestCommitPack(&encryption_service_, {{"id1", "content1"}});
-  ASSERT_TRUE(commit_pack);
-  page_cloud_.set_watcher->OnNewCommits(std::move(*commit_pack),
-                                        MakeToken("44"), [] {});
-  RunLoopUntilIdle();
-  EXPECT_TRUE(page_sync_->IsIdle());
-
-  // No additional calls.
-  EXPECT_EQ(1u, page_cloud_.add_commits_calls);
-  EXPECT_TRUE(page_sync_->IsIdle());
-}
-
-TEST_F(PageSyncImplTest, UnrecoverableError) {
-  int on_error_calls = 0;
-  page_sync_->SetOnUnrecoverableError([&on_error_calls] { on_error_calls++; });
-  // Complete the initial sync.
-  StartPageSync();
-  RunLoopUntilIdle();
-  EXPECT_EQ(0, on_error_calls);
-
-  page_cloud_.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, on_error_calls);
-}
-
-}  // namespace
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/page_upload.cc b/bin/ledger/cloud_sync/impl/page_upload.cc
deleted file mode 100644
index 222d54e..0000000
--- a/bin/ledger/cloud_sync/impl/page_upload.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/page_upload.h"
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/fit/function.h>
-
-namespace cloud_sync {
-
-PageUpload::PageUpload(callback::ScopedTaskRunner* task_runner,
-                       storage::PageStorage* storage,
-                       encryption::EncryptionService* encryption_service,
-                       cloud_provider::PageCloudPtr* page_cloud,
-                       Delegate* delegate,
-                       std::unique_ptr<backoff::Backoff> backoff)
-    : task_runner_(task_runner),
-      storage_(storage),
-      encryption_service_(encryption_service),
-      page_cloud_(page_cloud),
-      delegate_(delegate),
-      log_prefix_("Page " + convert::ToHex(storage->GetId()) +
-                  " upload sync: "),
-      backoff_(std::move(backoff)),
-      weak_ptr_factory_(this) {}
-
-PageUpload::~PageUpload() {}
-
-void PageUpload::StartOrRestartUpload() {
-  if (external_state_ == UPLOAD_NOT_STARTED) {
-    // When called for the first time, this method is responsible for handling
-    // the initial setup.
-    SetState(UPLOAD_SETUP);
-    // Starting to watch right away is not an issue, because new commit
-    // notifications are used as a tickle only, and we use a separate call to
-    // get unsynced commits.
-    storage_->AddCommitWatcher(this);
-  }
-  // Whether called for the first time or to restart upload, prime the upload
-  // process.
-  NextState();
-}
-
-void PageUpload::OnNewCommits(
-    const std::vector<std::unique_ptr<const storage::Commit>>& /*commits*/,
-    storage::ChangeSource source) {
-  // Only upload the locally created commits.
-  // TODO(ppi): revisit this when we have p2p sync, too.
-  if (source != storage::ChangeSource::LOCAL) {
-    return;
-  }
-
-  if (external_state_ == UPLOAD_TEMPORARY_ERROR) {
-    // Upload is already scheduled to retry uploading. No need to do anything
-    // here.
-    return;
-  }
-  NextState();
-}
-
-void PageUpload::UploadUnsyncedCommits() {
-  FXL_DCHECK(internal_state_ == PageUploadState::PROCESSING);
-
-  if (!delegate_->IsDownloadIdle()) {
-    // If a commit batch is currently being downloaded, don't try to start the
-    // upload.
-    SetState(UPLOAD_WAIT_REMOTE_DOWNLOAD);
-    PreviousState();
-    return;
-  }
-
-  SetState(UPLOAD_PENDING);
-
-  // Retrieve the  of the existing unsynced commits and enqueue them for
-  // upload.
-  // TODO(ppi): either switch to a paginating API or (better?) ensure that long
-  // backlogs of local commits are squashed in storage, as otherwise the list of
-  // commits can be possibly very big.
-  storage_->GetUnsyncedCommits(callback::MakeScoped(
-      weak_ptr_factory_.GetWeakPtr(),
-      [this](storage::Status status,
-             std::vector<std::unique_ptr<const storage::Commit>> commits) {
-        if (status != storage::Status::OK) {
-          SetState(UPLOAD_PERMANENT_ERROR);
-          HandleError("Failed to retrieve the unsynced commits");
-          return;
-        }
-
-        VerifyUnsyncedCommits(std::move(commits));
-      }));
-}
-
-void PageUpload::VerifyUnsyncedCommits(
-    std::vector<std::unique_ptr<const storage::Commit>> commits) {
-  // If we have no commit to upload, skip.
-  if (commits.empty()) {
-    SetState(UPLOAD_IDLE);
-    PreviousState();
-    return;
-  }
-
-  storage_->GetHeadCommitIds(callback::MakeScoped(
-      weak_ptr_factory_.GetWeakPtr(),
-      [this, commits = std::move(commits)](
-          storage::Status status,
-          std::vector<storage::CommitId> heads) mutable {
-        if (status != storage::Status::OK) {
-          HandleError("Failed to retrieve the current heads");
-          return;
-        }
-
-        FXL_DCHECK(!heads.empty());
-
-        if (!delegate_->IsDownloadIdle()) {
-          // If a commit batch is currently being downloaded, don't try to start
-          // the upload.
-          SetState(UPLOAD_WAIT_REMOTE_DOWNLOAD);
-          PreviousState();
-          return;
-        }
-
-        if (heads.size() > 1u) {
-          // Too many local heads.
-          SetState(UPLOAD_WAIT_TOO_MANY_LOCAL_HEADS);
-          PreviousState();
-          return;
-        }
-
-        HandleUnsyncedCommits(std::move(commits));
-      }));
-}
-
-void PageUpload::HandleUnsyncedCommits(
-    std::vector<std::unique_ptr<const storage::Commit>> commits) {
-  FXL_DCHECK(!batch_upload_);
-  SetState(UPLOAD_IN_PROGRESS);
-  batch_upload_ = std::make_unique<BatchUpload>(
-      storage_, encryption_service_, page_cloud_, std::move(commits),
-      [this] {
-        // Upload succeeded, reset the backoff delay.
-        backoff_->Reset();
-        batch_upload_.reset();
-        PreviousState();
-      },
-      [this](BatchUpload::ErrorType error_type) {
-        switch (error_type) {
-          case BatchUpload::ErrorType::TEMPORARY: {
-            FXL_LOG(WARNING)
-                << log_prefix_
-                << "commit upload failed due to a connection error, retrying.";
-            SetState(UPLOAD_TEMPORARY_ERROR);
-            batch_upload_.reset();
-            PreviousState();
-            RetryWithBackoff([this] { NextState(); });
-          } break;
-          case BatchUpload::ErrorType::PERMANENT: {
-            FXL_LOG(WARNING) << log_prefix_
-                             << "commit upload failed with a permanent error.";
-            SetState(UPLOAD_PERMANENT_ERROR);
-          } break;
-        }
-      });
-  batch_upload_->Start();
-}
-
-void PageUpload::HandleError(const char error_description[]) {
-  FXL_LOG(ERROR) << log_prefix_ << error_description << " Stopping sync.";
-  if (external_state_ > UPLOAD_SETUP) {
-    storage_->RemoveCommitWatcher(this);
-  }
-  SetState(UPLOAD_PERMANENT_ERROR);
-}
-
-void PageUpload::RetryWithBackoff(fit::closure callable) {
-  task_runner_->PostDelayedTask(
-      [this, callable = std::move(callable)]() {
-        if (this->external_state_ != UPLOAD_PERMANENT_ERROR) {
-          callable();
-        }
-      },
-      backoff_->GetNext());
-}
-
-void PageUpload::SetState(UploadSyncState new_state) {
-  if (new_state == external_state_) {
-    return;
-  }
-  external_state_ = new_state;
-  // Posting to the run loop to handle the case where the delegate will delete
-  // this class in the SetUploadState method.
-  // TODO(qsr): Aggregate changed state, so that a change from A -> B -> A do
-  //            not send any signal.
-  task_runner_->PostTask(
-      [this] { delegate_->SetUploadState(external_state_); });
-}
-
-bool PageUpload::IsIdle() {
-  switch (external_state_) {
-    case UPLOAD_NOT_STARTED:
-    case UPLOAD_IDLE:
-    // Note: this is considered idle because the reason for being blocked is
-    // external to the class - there's nothing to do on our side.
-    case UPLOAD_WAIT_TOO_MANY_LOCAL_HEADS:
-    case UPLOAD_PERMANENT_ERROR:
-      return true;
-      break;
-    case UPLOAD_SETUP:
-    case UPLOAD_PENDING:
-    case UPLOAD_WAIT_REMOTE_DOWNLOAD:
-    case UPLOAD_TEMPORARY_ERROR:
-    case UPLOAD_IN_PROGRESS:
-      return false;
-      break;
-  }
-}
-
-void PageUpload::NextState() {
-  switch (internal_state_) {
-    case PageUploadState::NO_COMMIT:
-      internal_state_ = PageUploadState::PROCESSING;
-      UploadUnsyncedCommits();
-      return;
-    case PageUploadState::PROCESSING:
-    case PageUploadState::PROCESSING_NEW_COMMIT:
-      internal_state_ = PageUploadState::PROCESSING_NEW_COMMIT;
-      return;
-  }
-}
-
-void PageUpload::PreviousState() {
-  switch (internal_state_) {
-    case PageUploadState::NO_COMMIT:
-      FXL_NOTREACHED() << "Bad state";
-    case PageUploadState::PROCESSING:
-      internal_state_ = PageUploadState::NO_COMMIT;
-      if (external_state_ == UPLOAD_IN_PROGRESS) {
-        SetState(UPLOAD_IDLE);
-      }
-      return;
-    case PageUploadState::PROCESSING_NEW_COMMIT:
-      internal_state_ = PageUploadState::PROCESSING;
-      UploadUnsyncedCommits();
-      return;
-  }
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/page_upload.h b/bin/ledger/cloud_sync/impl/page_upload.h
deleted file mode 100644
index b392a36..0000000
--- a/bin/ledger/cloud_sync/impl/page_upload.h
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_PAGE_UPLOAD_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_PAGE_UPLOAD_H_
-
-#include <memory>
-#include <vector>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/backoff/backoff.h>
-#include <lib/callback/scoped_task_runner.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/batch_upload.h"
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/commit_watcher.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace cloud_sync {
-// Internal state of PageUpload.
-// This ensures there is only one stream of work at any given time, and one in
-// "backlog".
-enum PageUploadState {
-  // No upload attempt is in progress.
-  NO_COMMIT = 0,
-  // An upload attempt is in progress and after completing we should become
-  // idle.
-  PROCESSING,
-  // An upload attempt is in progress and after completing we should start a new
-  // one.
-  PROCESSING_NEW_COMMIT,
-};
-
-// PageUpload handles all the upload operations for a page.
-class PageUpload : public storage::CommitWatcher {
- public:
-  // Delegate ensuring coordination between PageUpload and the class that owns
-  // it.
-  class Delegate {
-   public:
-    // Reports that the upload state changed.
-    virtual void SetUploadState(UploadSyncState sync_state) = 0;
-
-    // Returns true if no download is in progress.
-    virtual bool IsDownloadIdle() = 0;
-  };
-
-  PageUpload(callback::ScopedTaskRunner* task_runner,
-             storage::PageStorage* storage,
-             encryption::EncryptionService* encryption_service,
-             cloud_provider::PageCloudPtr* page_cloud, Delegate* delegate,
-             std::unique_ptr<backoff::Backoff> backoff);
-
-  ~PageUpload() override;
-
-  // Starts or restarts the upload process.
-  //
-  // The first time this method is called this sets up the storage watcher. It
-  // might be called again in the future to restart the upload after it's
-  // stopped due to a remote download in progress.
-  void StartOrRestartUpload();
-
-  // Returns true if PageUpload is idle.
-  bool IsIdle();
-
- private:
-  // storage::CommitWatcher:
-  void OnNewCommits(
-      const std::vector<std::unique_ptr<const storage::Commit>>& /*commits*/,
-      storage::ChangeSource source) override;
-
-  void UploadUnsyncedCommits();
-  void VerifyUnsyncedCommits(
-      std::vector<std::unique_ptr<const storage::Commit>> commits);
-  void HandleUnsyncedCommits(
-      std::vector<std::unique_ptr<const storage::Commit>> commits);
-
-  // Sets the internal state.
-  void SetState(UploadSyncState new_state);
-
-  void HandleError(const char error_description[]);
-
-  void RetryWithBackoff(fit::closure callable);
-
-  // These methods manage the internal state machine.
-
-  // Registers a signal to trigger an upload attempt, and triggers it if
-  // appropriate, that is, if we don't have an upload process already in
-  // progress.
-  void NextState();
-
-  // Registers completion of an upload attempt, for example due to an error, or
-  // because it completed. This will trigger another upload attempt if
-  // appropriate, that is, if a signal to trigger an upload attempt was
-  // delivered while an earlier upload attempt was in progress.
-  void PreviousState();
-
-  // Owned by whoever owns this class.
-  callback::ScopedTaskRunner* const task_runner_;
-  storage::PageStorage* const storage_;
-  encryption::EncryptionService* const encryption_service_;
-  cloud_provider::PageCloudPtr* const page_cloud_;
-  Delegate* const delegate_;
-  const std::string log_prefix_;
-
-  std::unique_ptr<backoff::Backoff> backoff_;
-
-  // Work queue:
-  // Current batch of local commits being uploaded.
-  std::unique_ptr<BatchUpload> batch_upload_;
-  // Internal state.
-  PageUploadState internal_state_ = PageUploadState::NO_COMMIT;
-
-  // External state.
-  UploadSyncState external_state_ = UPLOAD_NOT_STARTED;
-
-  // Must be the last member.
-  fxl::WeakPtrFactory<PageUpload> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageUpload);
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_PAGE_UPLOAD_H_
diff --git a/bin/ledger/cloud_sync/impl/page_upload_unittest.cc b/bin/ledger/cloud_sync/impl/page_upload_unittest.cc
deleted file mode 100644
index a17e586..0000000
--- a/bin/ledger/cloud_sync/impl/page_upload_unittest.cc
+++ /dev/null
@@ -1,517 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/page_upload.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include <lib/backoff/backoff.h>
-#include <lib/backoff/testing/test_backoff.h>
-#include <lib/callback/capture.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/constants.h"
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_page_cloud.h"
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_page_storage.h"
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/testing/commit_empty_impl.h"
-#include "peridot/bin/ledger/storage/testing/page_storage_empty_impl.h"
-
-namespace cloud_sync {
-namespace {
-
-constexpr zx::duration kBackoffInterval = zx::msec(10);
-constexpr zx::duration kHalfBackoffInterval = zx::msec(5);
-
-// Creates a dummy continuation token.
-cloud_provider::Token MakeToken(convert::ExtendedStringView token_id) {
-  cloud_provider::Token token;
-  token.opaque_id = convert::ToArray(token_id);
-  return token;
-}
-
-class PageUploadTest : public gtest::TestLoopFixture,
-                       public PageUpload::Delegate {
- public:
-  PageUploadTest()
-      : storage_(dispatcher()),
-        encryption_service_(dispatcher()),
-        page_cloud_(page_cloud_ptr_.NewRequest()),
-        task_runner_(dispatcher()) {
-    auto test_backoff =
-        std::make_unique<backoff::TestBackoff>(kBackoffInterval);
-    backoff_ = test_backoff.get();
-    page_upload_ = std::make_unique<PageUpload>(
-        &task_runner_, &storage_, &encryption_service_, &page_cloud_ptr_, this,
-        std::move(test_backoff));
-  }
-  ~PageUploadTest() override {}
-
- protected:
-  void SetOnNewStateCallback(fit::closure callback) {
-    new_state_callback_ = std::move(callback);
-  }
-
-  void SetUploadState(UploadSyncState sync_state) override {
-    states_.push_back(sync_state);
-    if (new_state_callback_) {
-      new_state_callback_();
-    }
-  }
-
-  bool IsDownloadIdle() override { return is_download_idle_; }
-
-  TestPageStorage storage_;
-  encryption::FakeEncryptionService encryption_service_;
-  cloud_provider::PageCloudPtr page_cloud_ptr_;
-  TestPageCloud page_cloud_;
-  std::vector<UploadSyncState> states_;
-  std::unique_ptr<PageUpload> page_upload_;
-  backoff::TestBackoff* backoff_;
-  bool is_download_idle_ = true;
-
- private:
-  fit::closure new_state_callback_;
-  callback::ScopedTaskRunner task_runner_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageUploadTest);
-};
-
-// Verifies that the backlog of commits to upload returned from
-// GetUnsyncedCommits() is uploaded to PageCloudHandler.
-TEST_F(PageUploadTest, UploadBacklog) {
-  storage_.NewCommit("id1", "content1");
-  storage_.NewCommit("id2", "content2");
-  bool upload_is_idle = false;
-  SetOnNewStateCallback(
-      [this, &upload_is_idle] { upload_is_idle = page_upload_->IsIdle(); });
-  page_upload_->StartOrRestartUpload();
-
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-
-  ASSERT_EQ(2u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id1", page_cloud_.received_commits[0].id);
-  EXPECT_EQ("content1", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[0].data));
-  EXPECT_EQ("id2", page_cloud_.received_commits[1].id);
-  EXPECT_EQ("content2", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[1].data));
-  EXPECT_EQ(2u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id1"));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id2"));
-}
-
-// Verifies that the backlog of commits to upload is not uploaded until there's
-// only one local head.
-TEST_F(PageUploadTest, UploadBacklogOnlyOnSingleHead) {
-  // Verify that two local commits are not uploaded when there is two local
-  // heads.
-  bool upload_is_idle = false;
-  storage_.head_count = 2;
-  storage_.NewCommit("id0", "content0");
-  storage_.NewCommit("id1", "content1");
-  SetOnNewStateCallback(
-      [this, &upload_is_idle] { upload_is_idle = page_upload_->IsIdle(); });
-  page_upload_->StartOrRestartUpload();
-
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-  EXPECT_EQ(0u, page_cloud_.received_commits.size());
-  EXPECT_EQ(0u, storage_.commits_marked_as_synced.size());
-
-  // Add a new commit and reduce the number of heads to 1.
-  upload_is_idle = false;
-  storage_.head_count = 1;
-  auto commit = storage_.NewCommit("id2", "content2");
-  storage_.new_commits_to_return["id2"] = commit->Clone();
-  storage_.watcher_->OnNewCommits(commit->AsList(),
-                                  storage::ChangeSource::LOCAL);
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-
-  // Verify that all local commits were uploaded.
-  ASSERT_EQ(3u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id0", page_cloud_.received_commits[0].id);
-  EXPECT_EQ("content0", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[0].data));
-  EXPECT_EQ("id1", page_cloud_.received_commits[1].id);
-  EXPECT_EQ("content1", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[1].data));
-  EXPECT_EQ("id2", page_cloud_.received_commits[2].id);
-  EXPECT_EQ("content2", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[2].data));
-  EXPECT_EQ(3u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id0"));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id1"));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id2"));
-}
-
-TEST_F(PageUploadTest, UploadExistingCommitsOnlyAfterBacklogDownload) {
-  // Verify that two local commits are not uploaded when download is in
-  // progress.
-  storage_.NewCommit("local1", "content1");
-  storage_.NewCommit("local2", "content2");
-
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "remote3", "content3"));
-  page_cloud_.commits_to_return.push_back(
-      MakeTestCommit(&encryption_service_, "remote4", "content4"));
-  page_cloud_.position_token_to_return = fidl::MakeOptional(MakeToken("44"));
-
-  is_download_idle_ = false;
-  bool upload_wait_remote_download = false;
-  SetOnNewStateCallback([this, &upload_wait_remote_download] {
-    if (states_.back() == UPLOAD_WAIT_REMOTE_DOWNLOAD) {
-      upload_wait_remote_download = true;
-    }
-  });
-  page_upload_->StartOrRestartUpload();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_wait_remote_download);
-
-  EXPECT_EQ(0u, page_cloud_.received_commits.size());
-  EXPECT_EQ(0u, storage_.commits_marked_as_synced.size());
-
-  is_download_idle_ = true;
-  bool upload_is_idle = false;
-  SetOnNewStateCallback(
-      [this, &upload_is_idle] { upload_is_idle = page_upload_->IsIdle(); });
-  page_upload_->StartOrRestartUpload();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-
-  ASSERT_EQ(2u, page_cloud_.received_commits.size());
-  EXPECT_EQ("local1", page_cloud_.received_commits[0].id);
-  EXPECT_EQ("content1", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[0].data));
-  EXPECT_EQ("local2", page_cloud_.received_commits[1].id);
-  EXPECT_EQ("content2", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[1].data));
-  ASSERT_EQ(2u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("local1"));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("local2"));
-}
-
-// Verfies that the new commits that PageSync is notified about through storage
-// watcher are uploaded to PageCloudHandler, with the exception of commits that
-// themselves come from sync.
-TEST_F(PageUploadTest, UploadNewCommits) {
-  bool upload_is_idle = false;
-  SetOnNewStateCallback(
-      [this, &upload_is_idle] { upload_is_idle = page_upload_->IsIdle(); });
-  page_upload_->StartOrRestartUpload();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-  upload_is_idle = false;
-
-  auto commit1 = storage_.NewCommit("id1", "content1");
-  storage_.new_commits_to_return["id1"] = commit1->Clone();
-  storage_.watcher_->OnNewCommits(commit1->AsList(),
-                                  storage::ChangeSource::LOCAL);
-
-  // The commit coming from sync should be ignored.
-  auto commit2 = storage_.NewCommit("id2", "content2", false);
-  storage_.new_commits_to_return["id2"] = commit2->Clone();
-  storage_.watcher_->OnNewCommits(commit2->AsList(),
-                                  storage::ChangeSource::CLOUD);
-
-  auto commit3 = storage_.NewCommit("id3", "content3");
-  storage_.new_commits_to_return["id3"] = commit3->Clone();
-  storage_.watcher_->OnNewCommits(commit3->AsList(),
-                                  storage::ChangeSource::LOCAL);
-
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-
-  ASSERT_EQ(2u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id1", page_cloud_.received_commits[0].id);
-  EXPECT_EQ("content1", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[0].data));
-  EXPECT_EQ("id3", page_cloud_.received_commits[1].id);
-  EXPECT_EQ("content3", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[1].data));
-  EXPECT_EQ(2u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id1"));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id3"));
-}
-
-// Verifies that new commits being added to storage are only uploaded while
-// there is only a single head.
-TEST_F(PageUploadTest, UploadNewCommitsOnlyOnSingleHead) {
-  bool upload_is_idle = false;
-  SetOnNewStateCallback(
-      [this, &upload_is_idle] { upload_is_idle = page_upload_->IsIdle(); });
-  page_upload_->StartOrRestartUpload();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-  upload_is_idle = false;
-
-  // Add a new commit when there's only one head and verify that it is
-  // uploaded.
-  storage_.head_count = 1;
-  auto commit0 = storage_.NewCommit("id0", "content0");
-  storage_.new_commits_to_return["id0"] = commit0->Clone();
-  storage_.watcher_->OnNewCommits(commit0->AsList(),
-                                  storage::ChangeSource::LOCAL);
-  EXPECT_FALSE(page_upload_->IsIdle());
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-  upload_is_idle = false;
-  ASSERT_EQ(1u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id0", page_cloud_.received_commits[0].id);
-  EXPECT_EQ("content0", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[0].data));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id0"));
-
-  // Add another commit when there's two heads and verify that it is not
-  // uploaded.
-  page_cloud_.received_commits.clear();
-  storage_.head_count = 2;
-  auto commit1 = storage_.NewCommit("id1", "content1");
-  storage_.new_commits_to_return["id1"] = commit1->Clone();
-  storage_.watcher_->OnNewCommits(commit1->AsList(),
-                                  storage::ChangeSource::LOCAL);
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-  upload_is_idle = false;
-  ASSERT_EQ(0u, page_cloud_.received_commits.size());
-  EXPECT_EQ(0u, storage_.commits_marked_as_synced.count("id1"));
-
-  // Add another commit bringing the number of heads down to one and verify that
-  // both commits are uploaded.
-  storage_.head_count = 1;
-  auto commit2 = storage_.NewCommit("id2", "content2");
-  storage_.new_commits_to_return["id2"] = commit2->Clone();
-  storage_.watcher_->OnNewCommits(commit2->AsList(),
-                                  storage::ChangeSource::LOCAL);
-  EXPECT_FALSE(page_upload_->IsIdle());
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-  ASSERT_EQ(2u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id1", page_cloud_.received_commits[0].id);
-  EXPECT_EQ("content1", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[0].data));
-  EXPECT_EQ("id2", page_cloud_.received_commits[1].id);
-  EXPECT_EQ("content2", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[1].data));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id1"));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id2"));
-}
-
-// Verifies that existing commits are uploaded before the new ones.
-TEST_F(PageUploadTest, UploadExistingAndNewCommits) {
-  storage_.NewCommit("id1", "content1");
-  bool upload_is_idle = false;
-  SetOnNewStateCallback(
-      [this, &upload_is_idle] { upload_is_idle = page_upload_->IsIdle(); });
-  page_upload_->StartOrRestartUpload();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-  upload_is_idle = false;
-
-  auto commit = storage_.NewCommit("id2", "content2");
-  storage_.new_commits_to_return["id2"] = commit->Clone();
-  storage_.watcher_->OnNewCommits(commit->AsList(),
-                                  storage::ChangeSource::LOCAL);
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-
-  ASSERT_EQ(2u, page_cloud_.received_commits.size());
-  EXPECT_EQ("id1", page_cloud_.received_commits[0].id);
-  EXPECT_EQ("content1", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[0].data));
-  EXPECT_EQ("id2", page_cloud_.received_commits[1].id);
-  EXPECT_EQ("content2", encryption_service_.DecryptCommitSynchronous(
-                            page_cloud_.received_commits[1].data));
-  EXPECT_EQ(2u, storage_.commits_marked_as_synced.size());
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id1"));
-  EXPECT_EQ(1u, storage_.commits_marked_as_synced.count("id2"));
-}
-
-// Verifies that failing uploads are retried.
-TEST_F(PageUploadTest, RetryUpload) {
-  page_upload_->StartOrRestartUpload();
-  bool upload_is_idle = false;
-  SetOnNewStateCallback(
-      [this, &upload_is_idle] { upload_is_idle = page_upload_->IsIdle(); });
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-  SetOnNewStateCallback(nullptr);
-
-  page_cloud_.commit_status_to_return = cloud_provider::Status::NETWORK_ERROR;
-  auto commit1 = storage_.NewCommit("id1", "content1");
-  storage_.new_commits_to_return["id1"] = commit1->Clone();
-  storage_.watcher_->OnNewCommits(commit1->AsList(),
-                                  storage::ChangeSource::LOCAL);
-  RunLoopFor(kHalfBackoffInterval);
-  EXPECT_GE(backoff_->get_next_count, 0);
-  RunLoopFor(kBackoffInterval);
-  EXPECT_GE(backoff_->get_next_count, 1);
-  RunLoopFor(kBackoffInterval);
-  EXPECT_GE(backoff_->get_next_count, 2);
-
-  // Verify that the commit is still not marked as synced in storage.
-  EXPECT_TRUE(storage_.commits_marked_as_synced.empty());
-}
-
-// Verifies that the idle status is returned when there is no pending upload
-// task.
-TEST_F(PageUploadTest, UploadIdleStatus) {
-  int on_idle_calls = 0;
-
-  storage_.NewCommit("id1", "content1");
-  storage_.NewCommit("id2", "content2");
-
-  SetOnNewStateCallback([this, &on_idle_calls] {
-    if (states_.back() == UPLOAD_IDLE) {
-      on_idle_calls++;
-    }
-  });
-  page_upload_->StartOrRestartUpload();
-
-  // Verify that the idle callback is called once both commits are uploaded.
-  RunLoopUntilIdle();
-  EXPECT_EQ(2u, page_cloud_.received_commits.size());
-  EXPECT_EQ(1, on_idle_calls);
-  EXPECT_TRUE(page_upload_->IsIdle());
-
-  // Notify about a new commit to upload and verify that the idle callback was
-  // called again on completion.
-  auto commit3 = storage_.NewCommit("id3", "content3");
-  storage_.new_commits_to_return["id3"] = commit3->Clone();
-  storage_.watcher_->OnNewCommits(commit3->AsList(),
-                                  storage::ChangeSource::LOCAL);
-  EXPECT_FALSE(page_upload_->IsIdle());
-  RunLoopUntilIdle();
-  EXPECT_EQ(3u, page_cloud_.received_commits.size());
-  EXPECT_EQ(2, on_idle_calls);
-  EXPECT_TRUE(page_upload_->IsIdle());
-}
-
-// Verifies that if listing the original commits to be uploaded fails, the
-// client is notified about the error.
-TEST_F(PageUploadTest, FailToListCommits) {
-  EXPECT_FALSE(storage_.watcher_set);
-  int error_calls = 0;
-  storage_.should_fail_get_unsynced_commits = true;
-  SetOnNewStateCallback([this, &error_calls] {
-    if (states_.back() == UPLOAD_PERMANENT_ERROR) {
-      error_calls++;
-    }
-  });
-
-  page_upload_->StartOrRestartUpload();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, error_calls);
-  EXPECT_EQ(0u, page_cloud_.received_commits.size());
-}
-
-// Verifies that already synced commits are not re-uploaded.
-TEST_F(PageUploadTest, DoNotUploadSyncedCommits) {
-  bool upload_is_idle = false;
-  SetOnNewStateCallback(
-      [this, &upload_is_idle] { upload_is_idle = page_upload_->IsIdle(); });
-  page_upload_->StartOrRestartUpload();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-  upload_is_idle = false;
-
-  auto commit = std::make_unique<TestCommit>("id", "content");
-  storage_.new_commits_to_return["id"] = commit->Clone();
-  storage_.watcher_->OnNewCommits(commit->AsList(),
-                                  storage::ChangeSource::LOCAL);
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-
-  // Commit is already synced.
-  ASSERT_EQ(0u, page_cloud_.received_commits.size());
-}
-
-// Verifies that commits that are received between the first upload and the
-// retry are not sent.
-TEST_F(PageUploadTest, DoNotUploadSyncedCommitsOnRetry) {
-  bool upload_is_idle = false;
-  SetOnNewStateCallback([this, &upload_is_idle] {
-    upload_is_idle = page_upload_->IsIdle();
-    if (states_.back() == UploadSyncState::UPLOAD_TEMPORARY_ERROR) {
-      QuitLoop();
-    }
-  });
-  page_upload_->StartOrRestartUpload();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-  upload_is_idle = false;
-
-  page_cloud_.commit_status_to_return = cloud_provider::Status::NETWORK_ERROR;
-
-  auto commit = storage_.NewCommit("id", "content");
-  storage_.new_commits_to_return["id"] = commit->Clone();
-  storage_.watcher_->OnNewCommits(commit->AsList(),
-                                  storage::ChangeSource::LOCAL);
-
-  // The page upload should run into temporary error.
-  RunLoopUntilIdle();
-  EXPECT_EQ(UploadSyncState::UPLOAD_TEMPORARY_ERROR, states_.back());
-  EXPECT_GT(page_cloud_.add_commits_calls, 0u);
-
-  // Configure the cloud to accept the next attempt to upload.
-  page_cloud_.commit_status_to_return = cloud_provider::Status::OK;
-  page_cloud_.add_commits_calls = 0u;
-
-  // Make storage report the commit as synced (not include it in the list of
-  // unsynced commits to return).
-  storage_.unsynced_commits_to_return.clear();
-
-  RunLoopFor(kHalfBackoffInterval);
-  ASSERT_FALSE(upload_is_idle);
-  RunLoopFor(kBackoffInterval);
-  ASSERT_TRUE(upload_is_idle);
-
-  // Verify that no calls were made to attempt to upload the commit.
-  EXPECT_EQ(0u, page_cloud_.add_commits_calls);
-}
-
-// Verifies that concurrent new commit notifications do not crash PageUpload.
-TEST_F(PageUploadTest, UploadNewCommitsConcurrentNoCrash) {
-  bool upload_is_idle = false;
-  SetOnNewStateCallback(
-      [this, &upload_is_idle] { upload_is_idle = page_upload_->IsIdle(); });
-  page_upload_->StartOrRestartUpload();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(upload_is_idle);
-  upload_is_idle = false;
-
-  storage_.head_count = 2;
-  storage_.should_delay_get_head_commit_ids = true;
-  auto commit0 = storage_.NewCommit("id0", "content0");
-  storage_.new_commits_to_return["id0"] = commit0->Clone();
-  storage_.watcher_->OnNewCommits(commit0->AsList(),
-                                  storage::ChangeSource::LOCAL);
-  RunLoopUntilIdle();
-
-  auto commit1 = storage_.NewCommit("id1", "content1");
-  storage_.new_commits_to_return["id1"] = commit1->Clone();
-  storage_.watcher_->OnNewCommits(commit1->AsList(),
-                                  storage::ChangeSource::LOCAL);
-  RunLoopUntilIdle();
-  ASSERT_EQ(1u, storage_.delayed_get_head_commit_ids.size());
-  storage_.head_count = 1;
-  storage_.delayed_get_head_commit_ids[0]();
-  RunLoopUntilIdle();
-
-  ASSERT_EQ(2u, storage_.delayed_get_head_commit_ids.size());
-  storage_.delayed_get_head_commit_ids[1]();
-  RunLoopUntilIdle();
-}
-
-}  // namespace
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/testing/BUILD.gn b/bin/ledger/cloud_sync/impl/testing/BUILD.gn
deleted file mode 100644
index 50007ee..0000000
--- a/bin/ledger/cloud_sync/impl/testing/BUILD.gn
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("testing") {
-  testonly = true
-
-  sources = [
-    "test_cloud_provider.cc",
-    "test_cloud_provider.h",
-    "test_commit.cc",
-    "test_commit.h",
-    "test_device_set.cc",
-    "test_device_set.h",
-    "test_page_cloud.cc",
-    "test_page_cloud.h",
-    "test_page_storage.cc",
-    "test_page_storage.h",
-  ]
-
-  public_deps = [
-    "//peridot/bin/ledger/cloud_sync/public",
-    "//peridot/bin/ledger/encryption/fake",
-    "//peridot/bin/ledger/fidl/include",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/bin/ledger/storage/testing",
-    "//peridot/lib/commit_pack",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-  ]
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fsl",
-    "//zircon/public/lib/trace",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/cloud_sync/impl/testing/test_cloud_provider.cc b/bin/ledger/cloud_sync/impl/testing/test_cloud_provider.cc
deleted file mode 100644
index f94646c..0000000
--- a/bin/ledger/cloud_sync/impl/testing/test_cloud_provider.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_cloud_provider.h"
-
-#include <lib/fxl/logging.h>
-
-namespace cloud_sync {
-
-TestCloudProvider::TestCloudProvider(
-    fidl::InterfaceRequest<cloud_provider::CloudProvider> request)
-    : binding_(this, std::move(request)), device_set_binding_(&device_set) {}
-
-TestCloudProvider::~TestCloudProvider() {}
-
-void TestCloudProvider::GetDeviceSet(
-    fidl::InterfaceRequest<cloud_provider::DeviceSet> request,
-    GetDeviceSetCallback callback) {
-  device_set_binding_.Bind(std::move(request));
-  callback(cloud_provider::Status::OK);
-}
-
-void TestCloudProvider::GetPageCloud(
-    std::vector<uint8_t> /*app_id*/, std::vector<uint8_t> /*page_id*/,
-    fidl::InterfaceRequest<cloud_provider::PageCloud> /*page_cloud*/,
-    GetPageCloudCallback /*callback*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/testing/test_cloud_provider.h b/bin/ledger/cloud_sync/impl/testing/test_cloud_provider.h
deleted file mode 100644
index d4aa9ac..0000000
--- a/bin/ledger/cloud_sync/impl/testing/test_cloud_provider.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_CLOUD_PROVIDER_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_CLOUD_PROVIDER_H_
-
-#include <memory>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_device_set.h"
-
-namespace cloud_sync {
-class TestCloudProvider : public cloud_provider::CloudProvider {
- public:
-  explicit TestCloudProvider(
-      fidl::InterfaceRequest<cloud_provider::CloudProvider> request);
-  ~TestCloudProvider() override;
-
-  TestDeviceSet device_set;
-
- private:
-  // cloud_provider::CloudProvider:
-  void GetDeviceSet(fidl::InterfaceRequest<cloud_provider::DeviceSet> request,
-                    GetDeviceSetCallback callback) override;
-
-  void GetPageCloud(
-      std::vector<uint8_t> app_id, std::vector<uint8_t> page_id,
-      fidl::InterfaceRequest<cloud_provider::PageCloud> page_cloud,
-      GetPageCloudCallback callback) override;
-
-  fidl::Binding<cloud_provider::CloudProvider> binding_;
-  fidl::Binding<cloud_provider::DeviceSet> device_set_binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestCloudProvider);
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_CLOUD_PROVIDER_H_
diff --git a/bin/ledger/cloud_sync/impl/testing/test_commit.cc b/bin/ledger/cloud_sync/impl/testing/test_commit.cc
deleted file mode 100644
index a77057a..0000000
--- a/bin/ledger/cloud_sync/impl/testing/test_commit.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_commit.h"
-
-#include <memory>
-#include <vector>
-
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/testing/commit_empty_impl.h"
-
-namespace cloud_sync {
-TestCommit::TestCommit(storage::CommitId id, std::string content)
-    : id(std::move(id)), content(std::move(content)) {}
-
-std::vector<std::unique_ptr<const storage::Commit>> TestCommit::AsList() {
-  std::vector<std::unique_ptr<const storage::Commit>> result;
-  result.push_back(Clone());
-  return result;
-}
-
-std::unique_ptr<const storage::Commit> TestCommit::Clone() const {
-  return std::make_unique<TestCommit>(id, content);
-}
-
-const storage::CommitId& TestCommit::GetId() const { return id; }
-
-fxl::StringView TestCommit::GetStorageBytes() const { return content; }
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/testing/test_commit.h b/bin/ledger/cloud_sync/impl/testing/test_commit.h
deleted file mode 100644
index 8efa89c..0000000
--- a/bin/ledger/cloud_sync/impl/testing/test_commit.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_COMMIT_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_COMMIT_H_
-
-#include <memory>
-#include <vector>
-
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/testing/commit_empty_impl.h"
-
-namespace cloud_sync {
-
-// Fake implementation of storage::Commit.
-class TestCommit : public storage::CommitEmptyImpl {
- public:
-  TestCommit() = default;
-  TestCommit(storage::CommitId id, std::string content);
-  ~TestCommit() override = default;
-
-  std::vector<std::unique_ptr<const Commit>> AsList();
-
-  std::unique_ptr<const Commit> Clone() const override;
-
-  const storage::CommitId& GetId() const override;
-
-  fxl::StringView GetStorageBytes() const override;
-
-  storage::CommitId id;
-  std::string content;
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_COMMIT_H_
diff --git a/bin/ledger/cloud_sync/impl/testing/test_device_set.cc b/bin/ledger/cloud_sync/impl/testing/test_device_set.cc
deleted file mode 100644
index 3bdfadf..0000000
--- a/bin/ledger/cloud_sync/impl/testing/test_device_set.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_device_set.h"
-
-#include "peridot/lib/convert/convert.h"
-
-namespace cloud_sync {
-
-TestDeviceSet::TestDeviceSet() {}
-TestDeviceSet::~TestDeviceSet() {}
-
-void TestDeviceSet::CheckFingerprint(std::vector<uint8_t> fingerprint,
-                                     CheckFingerprintCallback callback) {
-  checked_fingerprint = convert::ToString(fingerprint);
-  callback(status_to_return);
-}
-
-void TestDeviceSet::SetFingerprint(std::vector<uint8_t> fingerprint,
-                                   SetFingerprintCallback callback) {
-  set_fingerprint = convert::ToString(fingerprint);
-  callback(status_to_return);
-}
-
-void TestDeviceSet::SetWatcher(
-    std::vector<uint8_t> fingerprint,
-    fidl::InterfaceHandle<cloud_provider::DeviceSetWatcher> watcher,
-    SetWatcherCallback callback) {
-  set_watcher_calls++;
-  watched_fingerprint = convert::ToString(fingerprint);
-  set_watcher = watcher.Bind();
-  if (set_watcher_status_to_return == cloud_provider::Status::NETWORK_ERROR) {
-    set_watcher->OnNetworkError();
-  }
-  callback(set_watcher_status_to_return);
-}
-
-void TestDeviceSet::Erase(EraseCallback callback) {
-  callback(status_to_return);
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/testing/test_device_set.h b/bin/ledger/cloud_sync/impl/testing/test_device_set.h
deleted file mode 100644
index 46eef1c..0000000
--- a/bin/ledger/cloud_sync/impl/testing/test_device_set.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_DEVICE_SET_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_DEVICE_SET_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-
-namespace cloud_sync {
-
-class TestDeviceSet : public cloud_provider::DeviceSet {
- public:
-  TestDeviceSet();
-  ~TestDeviceSet() override;
-
-  cloud_provider::Status status_to_return = cloud_provider::Status::OK;
-  cloud_provider::Status set_watcher_status_to_return =
-      cloud_provider::Status::OK;
-  std::string checked_fingerprint;
-  std::string set_fingerprint;
-
-  int set_watcher_calls = 0;
-  std::string watched_fingerprint;
-  cloud_provider::DeviceSetWatcherPtr set_watcher;
-
- private:
-  // cloud_provider::DeviceSet:
-  void CheckFingerprint(std::vector<uint8_t> fingerprint,
-                        CheckFingerprintCallback callback) override;
-
-  void SetFingerprint(std::vector<uint8_t> fingerprint,
-                      SetFingerprintCallback callback) override;
-
-  void SetWatcher(
-      std::vector<uint8_t> fingerprint,
-      fidl::InterfaceHandle<cloud_provider::DeviceSetWatcher> watcher,
-      SetWatcherCallback callback) override;
-
-  void Erase(EraseCallback callback) override;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestDeviceSet);
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_DEVICE_SET_H_
diff --git a/bin/ledger/cloud_sync/impl/testing/test_page_cloud.cc b/bin/ledger/cloud_sync/impl/testing/test_page_cloud.cc
deleted file mode 100644
index 8dd530f..0000000
--- a/bin/ledger/cloud_sync/impl/testing/test_page_cloud.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_page_cloud.h"
-
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/lib/convert/convert.h"
-
-namespace cloud_sync {
-
-cloud_provider::CommitPackEntry MakeTestCommit(
-    encryption::FakeEncryptionService* encryption_service,
-    const std::string& id, const std::string& data) {
-  cloud_provider::CommitPackEntry commit;
-  commit.id = id;
-  commit.data = encryption_service->EncryptCommitSynchronous(data);
-  return commit;
-}
-
-std::unique_ptr<cloud_provider::CommitPack> MakeTestCommitPack(
-    encryption::FakeEncryptionService* encryption_service,
-    std::vector<std::tuple<std::string, std::string>> commit_data) {
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  for (auto& data : commit_data) {
-    entries.push_back(MakeTestCommit(encryption_service, std::get<0>(data),
-                                     std::get<1>(data)));
-  }
-  cloud_provider::CommitPack result;
-  if (!cloud_provider::EncodeCommitPack(entries, &result)) {
-    return nullptr;
-  }
-  return fidl::MakeOptional(std::move(result));
-}
-
-TestPageCloud::TestPageCloud(
-    fidl::InterfaceRequest<cloud_provider::PageCloud> request)
-    : binding_(this, std::move(request)) {}
-TestPageCloud::~TestPageCloud() {}
-
-void TestPageCloud::RunPendingCallbacks() {
-  for (auto& callback : pending_add_object_callbacks) {
-    callback();
-  }
-  pending_add_object_callbacks.clear();
-}
-
-// cloud_provider::PageCloud:
-void TestPageCloud::AddCommits(cloud_provider::CommitPack commits,
-                               AddCommitsCallback callback) {
-  std::vector<cloud_provider::CommitPackEntry> entries;
-  if (!cloud_provider::DecodeCommitPack(commits, &entries)) {
-    callback(cloud_provider::Status::INTERNAL_ERROR);
-    return;
-  }
-
-  add_commits_calls++;
-  for (auto& entry : entries) {
-    received_commits.push_back(std::move(entry));
-  }
-  callback(commit_status_to_return);
-}
-
-void TestPageCloud::GetCommits(
-    std::unique_ptr<cloud_provider::Token> /*min_position_token*/,
-    GetCommitsCallback callback) {
-  get_commits_calls++;
-  cloud_provider::CommitPack commit_pack;
-  if (!cloud_provider::EncodeCommitPack(commits_to_return, &commit_pack)) {
-    callback(cloud_provider::Status::INTERNAL_ERROR, nullptr, nullptr);
-    return;
-  }
-  callback(status_to_return, fidl::MakeOptional(std::move(commit_pack)),
-           std::move(position_token_to_return));
-}
-
-void TestPageCloud::AddObject(std::vector<uint8_t> id,
-                              fuchsia::mem::Buffer data,
-                              AddObjectCallback callback) {
-  add_object_calls++;
-  std::string received_data;
-  if (!fsl::StringFromVmo(data, &received_data)) {
-    callback(cloud_provider::Status::INTERNAL_ERROR);
-    return;
-  }
-  received_objects[convert::ToString(id)] = received_data;
-  fit::closure report_result = [callback = std::move(callback),
-                                status = object_status_to_return] {
-    callback(status);
-  };
-  if (delay_add_object_callbacks) {
-    pending_add_object_callbacks.push_back(std::move(report_result));
-  } else {
-    report_result();
-  }
-
-  if (reset_object_status_after_call) {
-    object_status_to_return = cloud_provider::Status::OK;
-  }
-}
-
-void TestPageCloud::GetObject(std::vector<uint8_t> id,
-                              GetObjectCallback callback) {
-  get_object_calls++;
-  if (status_to_return != cloud_provider::Status::OK) {
-    callback(status_to_return, nullptr);
-    return;
-  }
-
-  std::string object_id = convert::ToString(id);
-  if (objects_to_return.count(object_id) == 0) {
-    callback(cloud_provider::Status::INTERNAL_ERROR, nullptr);
-    return;
-  }
-
-  ::fuchsia::mem::Buffer buffer;
-  if (!fsl::VmoFromString(objects_to_return[object_id], &buffer)) {
-    callback(cloud_provider::Status::INTERNAL_ERROR, nullptr);
-    return;
-  }
-  callback(status_to_return, fidl::MakeOptional(std::move(buffer)));
-}
-
-void TestPageCloud::SetWatcher(
-    std::unique_ptr<cloud_provider::Token> min_position_token,
-    fidl::InterfaceHandle<cloud_provider::PageCloudWatcher> watcher,
-    SetWatcherCallback callback) {
-  set_watcher_position_tokens.push_back(std::move(min_position_token));
-  set_watcher = watcher.Bind();
-  callback(status_to_return);
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/testing/test_page_cloud.h b/bin/ledger/cloud_sync/impl/testing/test_page_cloud.h
deleted file mode 100644
index 95d55ff..0000000
--- a/bin/ledger/cloud_sync/impl/testing/test_page_cloud.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_PAGE_CLOUD_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_PAGE_CLOUD_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/lib/commit_pack/commit_pack.h"
-
-namespace cloud_sync {
-
-struct ReceivedCommit {
-  std::string id;
-  std::string data;
-};
-
-cloud_provider::CommitPackEntry MakeTestCommit(
-    encryption::FakeEncryptionService* encryption_service,
-    const std::string& id, const std::string& data);
-
-std::unique_ptr<cloud_provider::CommitPack> MakeTestCommitPack(
-    encryption::FakeEncryptionService* encryption_service,
-    std::vector<std::tuple<std::string, std::string>> commit_data);
-
-class TestPageCloud : public cloud_provider::PageCloud {
- public:
-  explicit TestPageCloud(
-      fidl::InterfaceRequest<cloud_provider::PageCloud> request);
-  ~TestPageCloud() override;
-
-  void RunPendingCallbacks();
-  void Unbind() { binding_.Unbind(); }
-
-  cloud_provider::Status status_to_return = cloud_provider::Status::OK;
-  cloud_provider::Status commit_status_to_return = cloud_provider::Status::OK;
-  cloud_provider::Status object_status_to_return = cloud_provider::Status::OK;
-
-  // AddCommits().
-  unsigned int add_commits_calls = 0u;
-  std::vector<cloud_provider::CommitPackEntry> received_commits;
-
-  // GetCommits().
-  unsigned int get_commits_calls = 0u;
-  std::vector<cloud_provider::CommitPackEntry> commits_to_return;
-  std::unique_ptr<cloud_provider::Token> position_token_to_return;
-
-  // AddObject().
-  unsigned int add_object_calls = 0u;
-  std::map<std::string, std::string> received_objects;
-  bool delay_add_object_callbacks = false;
-  std::vector<fit::closure> pending_add_object_callbacks;
-  bool reset_object_status_after_call = false;
-
-  // GetObject().
-  unsigned int get_object_calls = 0u;
-  std::map<std::string, std::string> objects_to_return;
-
-  // SetWatcher().
-  std::vector<std::unique_ptr<cloud_provider::Token>>
-      set_watcher_position_tokens;
-  cloud_provider::PageCloudWatcherPtr set_watcher;
-
- private:
-  // cloud_provider::PageCloud:
-  void AddCommits(cloud_provider::CommitPack commits,
-                  AddCommitsCallback callback) override;
-  void GetCommits(std::unique_ptr<cloud_provider::Token> min_position_token,
-                  GetCommitsCallback callback) override;
-  void AddObject(std::vector<uint8_t> id, fuchsia::mem::Buffer data,
-                 AddObjectCallback callback) override;
-  void GetObject(std::vector<uint8_t> id,
-                 GetObjectCallback callback) override;
-  void SetWatcher(
-      std::unique_ptr<cloud_provider::Token> min_position_token,
-      fidl::InterfaceHandle<cloud_provider::PageCloudWatcher> watcher,
-      SetWatcherCallback callback) override;
-
-  fidl::Binding<cloud_provider::PageCloud> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestPageCloud);
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_PAGE_CLOUD_H_
diff --git a/bin/ledger/cloud_sync/impl/testing/test_page_storage.cc b/bin/ledger/cloud_sync/impl/testing/test_page_storage.cc
deleted file mode 100644
index 4a23989..0000000
--- a/bin/ledger/cloud_sync/impl/testing/test_page_storage.cc
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_page_storage.h"
-
-#include <memory>
-#include <set>
-#include <utility>
-#include <vector>
-
-#include <lib/async/cpp/task.h>
-#include <lib/callback/capture.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_commit.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/testing/page_storage_empty_impl.h"
-
-namespace cloud_sync {
-TestPageStorage::TestPageStorage(async_dispatcher_t* dispatcher)
-    : dispatcher_(dispatcher) {}
-
-std::unique_ptr<TestCommit> TestPageStorage::NewCommit(std::string id,
-                                                       std::string content,
-                                                       bool unsynced) {
-  auto commit = std::make_unique<TestCommit>(std::move(id), std::move(content));
-  if (unsynced) {
-    unsynced_commits_to_return.push_back(commit->Clone());
-  }
-  return commit;
-}
-
-storage::PageId TestPageStorage::GetId() { return page_id_to_return; }
-
-void TestPageStorage::SetSyncDelegate(
-    storage::PageSyncDelegate* page_sync_delegate) {
-  page_sync_delegate_ = page_sync_delegate;
-}
-
-void TestPageStorage::GetHeadCommitIds(
-    fit::function<void(storage::Status, std::vector<storage::CommitId>)>
-        callback) {
-  size_t returned_head_count = head_count;
-  auto confirm = [returned_head_count, callback = std::move(callback)] {
-    // Current tests only rely on the number of heads, not on the actual
-    // ids.
-    callback(storage::Status::OK,
-             std::vector<storage::CommitId>(returned_head_count));
-  };
-  if (should_delay_get_head_commit_ids) {
-    delayed_get_head_commit_ids.emplace_back(std::move(confirm));
-    return;
-  }
-
-  async::PostTask(dispatcher_, std::move(confirm));
-}
-
-void TestPageStorage::GetCommit(
-    storage::CommitIdView commit_id,
-    fit::function<void(storage::Status, std::unique_ptr<const storage::Commit>)>
-        callback) {
-  if (should_fail_get_commit) {
-    async::PostTask(dispatcher_, [callback = std::move(callback)] {
-      callback(storage::Status::IO_ERROR, nullptr);
-    });
-    return;
-  }
-
-  async::PostTask(dispatcher_, [this, commit_id = commit_id.ToString(),
-                                callback = std::move(callback)] {
-    callback(storage::Status::OK, std::move(new_commits_to_return[commit_id]));
-  });
-  new_commits_to_return.erase(commit_id.ToString());
-}
-
-void TestPageStorage::AddCommitsFromSync(
-    std::vector<PageStorage::CommitIdAndBytes> ids_and_bytes,
-    storage::ChangeSource /*source*/,
-    fit::function<void(storage::Status, std::vector<storage::CommitId>)>
-        callback) {
-  add_commits_from_sync_calls++;
-
-  if (should_fail_add_commit_from_sync) {
-    async::PostTask(dispatcher_, [callback = std::move(callback)]() {
-      callback(storage::Status::IO_ERROR, {});
-    });
-    return;
-  }
-
-  fit::closure confirm = [this, ids_and_bytes = std::move(ids_and_bytes),
-                          callback = std::move(callback)]() mutable {
-    for (auto& commit : ids_and_bytes) {
-      received_commits[commit.id] = std::move(commit.bytes);
-      unsynced_commits_to_return.erase(
-          std::remove_if(
-              unsynced_commits_to_return.begin(),
-              unsynced_commits_to_return.end(),
-              [commit_id = std::move(commit.id)](
-                  const std::unique_ptr<const storage::Commit>& commit) {
-                return commit->GetId() == commit_id;
-              }),
-          unsynced_commits_to_return.end());
-    }
-    async::PostTask(dispatcher_, [callback = std::move(callback)] {
-      callback(storage::Status::OK, {});
-    });
-  };
-  if (should_delay_add_commit_confirmation) {
-    delayed_add_commit_confirmations.push_back(std::move(confirm));
-    return;
-  }
-  async::PostTask(dispatcher_, std::move(confirm));
-}
-
-void TestPageStorage::GetUnsyncedPieces(
-    fit::function<void(storage::Status, std::vector<storage::ObjectIdentifier>)>
-        callback) {
-  async::PostTask(dispatcher_, [callback = std::move(callback)] {
-    callback(storage::Status::OK, std::vector<storage::ObjectIdentifier>());
-  });
-}
-
-storage::Status TestPageStorage::AddCommitWatcher(
-    storage::CommitWatcher* watcher) {
-  watcher_ = watcher;
-  watcher_set = true;
-  return storage::Status::OK;
-}
-
-storage::Status TestPageStorage::RemoveCommitWatcher(
-    storage::CommitWatcher* /*watcher*/) {
-  watcher_removed = true;
-  return storage::Status::OK;
-}
-
-void TestPageStorage::GetUnsyncedCommits(
-    fit::function<void(storage::Status,
-                       std::vector<std::unique_ptr<const storage::Commit>>)>
-        callback) {
-  if (should_fail_get_unsynced_commits) {
-    async::PostTask(dispatcher_, [callback = std::move(callback)] {
-      callback(storage::Status::IO_ERROR, {});
-    });
-    return;
-  }
-  std::vector<std::unique_ptr<const storage::Commit>> results;
-  results.resize(unsynced_commits_to_return.size());
-  std::transform(unsynced_commits_to_return.begin(),
-                 unsynced_commits_to_return.end(), results.begin(),
-                 [](const std::unique_ptr<const storage::Commit>& commit) {
-                   return commit->Clone();
-                 });
-  async::PostTask(dispatcher_, [results = std::move(results),
-                                callback = std::move(callback)]() mutable {
-    callback(storage::Status::OK, std::move(results));
-  });
-}
-
-void TestPageStorage::MarkCommitSynced(
-    const storage::CommitId& commit_id,
-    fit::function<void(storage::Status)> callback) {
-  unsynced_commits_to_return.erase(
-      std::remove_if(
-          unsynced_commits_to_return.begin(), unsynced_commits_to_return.end(),
-          [&commit_id](const std::unique_ptr<const storage::Commit>& commit) {
-            return commit->GetId() == commit_id;
-          }),
-      unsynced_commits_to_return.end());
-  commits_marked_as_synced.insert(commit_id);
-  async::PostTask(dispatcher_, [callback = std::move(callback)] {
-    callback(storage::Status::OK);
-  });
-}
-
-void TestPageStorage::SetSyncMetadata(
-    fxl::StringView key, fxl::StringView value,
-    fit::function<void(storage::Status)> callback) {
-  sync_metadata[key.ToString()] = value.ToString();
-  async::PostTask(dispatcher_, [callback = std::move(callback)] {
-    callback(storage::Status::OK);
-  });
-}
-
-void TestPageStorage::GetSyncMetadata(
-    fxl::StringView key,
-    fit::function<void(storage::Status, std::string)> callback) {
-  auto it = sync_metadata.find(key.ToString());
-  if (it == sync_metadata.end()) {
-    async::PostTask(dispatcher_, [callback = std::move(callback)] {
-      callback(storage::Status::NOT_FOUND, "");
-    });
-    return;
-  }
-  async::PostTask(dispatcher_,
-                  [callback = std::move(callback), metadata = it->second] {
-                    callback(storage::Status::OK, metadata);
-                  });
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/testing/test_page_storage.h b/bin/ledger/cloud_sync/impl/testing/test_page_storage.h
deleted file mode 100644
index 5213bb4..0000000
--- a/bin/ledger/cloud_sync/impl/testing/test_page_storage.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_PAGE_STORAGE_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_PAGE_STORAGE_H_
-
-#include <map>
-#include <memory>
-#include <set>
-#include <vector>
-
-#include <lib/async/dispatcher.h>
-#include <lib/callback/capture.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_commit.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/testing/page_storage_empty_impl.h"
-
-namespace cloud_sync {
-// Fake implementation of storage::PageStorage. Injects the data that PageSync
-// asks about: page id, existing unsynced commits to be retrieved through
-// GetUnsyncedCommits() and new commits to be retrieved through GetCommit().
-// Registers the commits marked as synced.
-class TestPageStorage : public storage::PageStorageEmptyImpl {
- public:
-  explicit TestPageStorage(async_dispatcher_t* dispatcher);
-
-  std::unique_ptr<TestCommit> NewCommit(std::string id, std::string content,
-                                        bool unsynced = true);
-
-  storage::PageId GetId() override;
-
-  void SetSyncDelegate(storage::PageSyncDelegate* page_sync_delegate) override;
-
-  void GetHeadCommitIds(
-      fit::function<void(storage::Status, std::vector<storage::CommitId>)>
-          callback) override;
-
-  void GetCommit(storage::CommitIdView commit_id,
-                 fit::function<void(storage::Status,
-                                    std::unique_ptr<const storage::Commit>)>
-                     callback) override;
-
-  void AddCommitsFromSync(
-      std::vector<PageStorage::CommitIdAndBytes> ids_and_bytes,
-      storage::ChangeSource source,
-      fit::function<void(storage::Status status,
-                         std::vector<storage::CommitId>)>
-          callback) override;
-
-  void GetUnsyncedPieces(
-      fit::function<void(storage::Status,
-                         std::vector<storage::ObjectIdentifier>)>
-          callback) override;
-
-  storage::Status AddCommitWatcher(storage::CommitWatcher* watcher) override;
-
-  storage::Status RemoveCommitWatcher(storage::CommitWatcher* watcher) override;
-
-  void GetUnsyncedCommits(
-      fit::function<void(storage::Status,
-                         std::vector<std::unique_ptr<const storage::Commit>>)>
-          callback) override;
-
-  void MarkCommitSynced(const storage::CommitId& commit_id,
-                        fit::function<void(storage::Status)> callback) override;
-
-  void SetSyncMetadata(fxl::StringView key, fxl::StringView value,
-                       fit::function<void(storage::Status)> callback) override;
-
-  void GetSyncMetadata(
-      fxl::StringView key,
-      fit::function<void(storage::Status, std::string)> callback) override;
-
-  storage::PageId page_id_to_return;
-  // Commits to be returned from GetUnsyncedCommits calls.
-  std::vector<std::unique_ptr<const storage::Commit>>
-      unsynced_commits_to_return;
-  size_t head_count = 1;
-  // Commits to be returned from GetCommit() calls.
-  std::map<storage::CommitId, std::unique_ptr<const storage::Commit>>
-      new_commits_to_return;
-  bool should_fail_get_unsynced_commits = false;
-  bool should_fail_get_commit = false;
-  bool should_fail_add_commit_from_sync = false;
-  bool should_delay_add_commit_confirmation = false;
-  std::vector<fit::closure> delayed_add_commit_confirmations;
-  bool should_delay_get_head_commit_ids = false;
-  std::vector<fit::closure> delayed_get_head_commit_ids;
-
-  unsigned int add_commits_from_sync_calls = 0u;
-
-  storage::PageSyncDelegate* page_sync_delegate_;
-  std::set<storage::CommitId> commits_marked_as_synced;
-  storage::CommitWatcher* watcher_;
-  bool watcher_set = false;
-  bool watcher_removed = false;
-  std::map<storage::CommitId, std::string> received_commits;
-  std::map<std::string, std::string> sync_metadata;
-
- private:
-  async_dispatcher_t* const dispatcher_;
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_TESTING_TEST_PAGE_STORAGE_H_
diff --git a/bin/ledger/cloud_sync/impl/user_sync_impl.cc b/bin/ledger/cloud_sync/impl/user_sync_impl.cc
deleted file mode 100644
index 9f0496e..0000000
--- a/bin/ledger/cloud_sync/impl/user_sync_impl.cc
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/user_sync_impl.h"
-
-#include <utility>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/concatenate.h>
-#include <zircon/syscalls.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/ledger_sync_impl.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace cloud_sync {
-
-namespace {
-constexpr size_t kFingerprintSize = 16;
-
-}  // namespace
-
-UserSyncImpl::UserSyncImpl(ledger::Environment* environment,
-                           UserConfig user_config,
-                           std::unique_ptr<backoff::Backoff> backoff,
-                           fit::closure on_version_mismatch)
-    : environment_(environment),
-      user_config_(std::move(user_config)),
-      backoff_(std::move(backoff)),
-      on_version_mismatch_(std::move(on_version_mismatch)),
-      watcher_binding_(this),
-      task_runner_(environment_->dispatcher()) {
-  FXL_DCHECK(on_version_mismatch_);
-}
-
-UserSyncImpl::~UserSyncImpl() { FXL_DCHECK(active_ledger_syncs_.empty()); }
-
-void UserSyncImpl::SetSyncWatcher(SyncStateWatcher* watcher) {
-  aggregator_.SetBaseWatcher(watcher);
-}
-
-std::unique_ptr<LedgerSync> UserSyncImpl::CreateLedgerSync(
-    fxl::StringView app_id, encryption::EncryptionService* encryption_service) {
-  FXL_DCHECK(started_);
-
-  auto result = std::make_unique<LedgerSyncImpl>(
-      environment_, &user_config_, encryption_service, app_id,
-      aggregator_.GetNewStateWatcher());
-  result->set_on_delete([this, ledger_sync = result.get()]() {
-    active_ledger_syncs_.erase(ledger_sync);
-  });
-  active_ledger_syncs_.insert(result.get());
-  if (upload_enabled_) {
-    result->EnableUpload();
-  }
-  return result;
-}
-
-ledger::DetachedPath UserSyncImpl::GetFingerprintPath() {
-  return user_config_.user_directory.SubPath("fingerprint");
-}
-
-void UserSyncImpl::OnCloudErased() {
-  // |this| can be deleted within on_version_mismatch_() - don't
-  // access member variables afterwards.
-  on_version_mismatch_();
-}
-
-void UserSyncImpl::OnNetworkError() {
-  task_runner_.PostDelayedTask([this] { SetCloudErasedWatcher(); },
-                               backoff_->GetNext());
-}
-
-void UserSyncImpl::Start() {
-  FXL_DCHECK(!started_);
-  if (!user_config_.cloud_provider) {
-    // TODO(ppi): handle recovery from cloud provider disconnection, LE-567.
-    FXL_LOG(WARNING) << "Cloud provider is disconnected, will not verify "
-                     << "the cloud fingerprint";
-    return;
-  }
-
-  user_config_.cloud_provider->GetDeviceSet(
-      device_set_.NewRequest(), [this](auto status) {
-        if (status != cloud_provider::Status::OK) {
-          FXL_LOG(ERROR) << "Failed to retrieve the device map: "
-                         << fidl::ToUnderlying(status)
-                         << ", sync upload will not work.";
-          return;
-        }
-        CheckCloudNotErased();
-      });
-
-  started_ = true;
-}
-
-void UserSyncImpl::CheckCloudNotErased() {
-  if (!device_set_) {
-    // TODO(ppi): handle recovery from cloud provider disconnection, LE-567.
-    FXL_LOG(WARNING) << "Cloud provider is disconnected, will not verify "
-                     << "the cloud fingerprint";
-    return;
-  }
-
-  ledger::DetachedPath fingerprint_path = GetFingerprintPath();
-  if (!files::IsFileAt(fingerprint_path.root_fd(), fingerprint_path.path())) {
-    CreateFingerprint();
-    return;
-  }
-
-  if (!files::ReadFileToStringAt(fingerprint_path.root_fd(),
-                                 fingerprint_path.path(), &fingerprint_)) {
-    FXL_LOG(ERROR) << "Unable to read the fingerprint file at: "
-                   << fingerprint_path.path() << ", sync upload will not work.";
-    return;
-  }
-
-  device_set_->CheckFingerprint(
-      convert::ToArray(fingerprint_),
-      [this](cloud_provider::Status status) { HandleDeviceSetResult(status); });
-}
-
-void UserSyncImpl::CreateFingerprint() {
-  if (!device_set_) {
-    // TODO(ppi): handle recovery from cloud provider disconnection, LE-567.
-    FXL_LOG(WARNING) << "Cloud provider is disconnected, will not verify "
-                     << "the cloud fingerprint";
-    return;
-  }
-
-  // Generate the fingerprint.
-  char fingerprint_array[kFingerprintSize];
-  environment_->random()->Draw(fingerprint_array, kFingerprintSize);
-  fingerprint_ =
-      convert::ToHex(fxl::StringView(fingerprint_array, kFingerprintSize));
-
-  device_set_->SetFingerprint(
-      convert::ToArray(fingerprint_), [this](cloud_provider::Status status) {
-        if (status == cloud_provider::Status::OK) {
-          // Persist the new fingerprint.
-          FXL_DCHECK(!fingerprint_.empty());
-          ledger::DetachedPath fingerprint_path = GetFingerprintPath();
-          if (!files::WriteFileAt(fingerprint_path.root_fd(),
-                                  fingerprint_path.path(), fingerprint_.data(),
-                                  fingerprint_.size())) {
-            FXL_LOG(ERROR) << "Failed to persist the fingerprint at: "
-                           << fingerprint_path.path()
-                           << ", sync upload will not work.";
-            return;
-          }
-        }
-        HandleDeviceSetResult(status);
-      });
-}
-
-void UserSyncImpl::HandleDeviceSetResult(cloud_provider::Status status) {
-  switch (status) {
-    case cloud_provider::Status::OK:
-      backoff_->Reset();
-      SetCloudErasedWatcher();
-      EnableUpload();
-      return;
-    case cloud_provider::Status::NETWORK_ERROR:
-      // Retry after some backoff time.
-      task_runner_.PostDelayedTask([this] { CheckCloudNotErased(); },
-                                   backoff_->GetNext());
-      return;
-    case cloud_provider::Status::NOT_FOUND:
-      // |this| can be deleted within on_version_mismatch_() - don't
-      // access member variables afterwards.
-      on_version_mismatch_();
-      return;
-    default:
-      FXL_LOG(ERROR) << "Unexpected status returned from device set: "
-                     << fidl::ToUnderlying(status)
-                     << ", sync upload will not work.";
-      return;
-  }
-}
-
-void UserSyncImpl::SetCloudErasedWatcher() {
-  if (!device_set_) {
-    // TODO(ppi): handle recovery from cloud provider disconnection, LE-567.
-    FXL_LOG(WARNING) << "Cloud provider is disconnected, will not verify "
-                     << "the cloud fingerprint";
-    return;
-  }
-
-  cloud_provider::DeviceSetWatcherPtr watcher;
-  if (watcher_binding_.is_bound()) {
-    watcher_binding_.Unbind();
-  }
-  watcher_binding_.Bind(watcher.NewRequest());
-  device_set_->SetWatcher(convert::ToArray(fingerprint_), std::move(watcher),
-                          [this](cloud_provider::Status status) {
-                            if (status == cloud_provider::Status::OK) {
-                              backoff_->Reset();
-                            }
-                            // Don't handle errors - in case of error, the
-                            // corresponding call is made on the watcher
-                            // itself and handled there (OnCloudErased(),
-                            // OnNetworkError()).
-                          });
-}
-
-void UserSyncImpl::EnableUpload() {
-  upload_enabled_ = true;
-  for (auto ledger_sync : active_ledger_syncs_) {
-    ledger_sync->EnableUpload();
-  }
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/impl/user_sync_impl.h b/bin/ledger/cloud_sync/impl/user_sync_impl.h
deleted file mode 100644
index 9dc6c32..0000000
--- a/bin/ledger/cloud_sync/impl/user_sync_impl.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_USER_SYNC_IMPL_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_USER_SYNC_IMPL_H_
-
-#include <memory>
-#include <set>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/backoff/backoff.h>
-#include <lib/callback/scoped_task_runner.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/aggregator.h"
-#include "peridot/bin/ledger/cloud_sync/impl/ledger_sync_impl.h"
-#include "peridot/bin/ledger/cloud_sync/public/user_sync.h"
-#include "peridot/bin/ledger/environment/environment.h"
-
-namespace cloud_sync {
-
-class UserSyncImpl : public UserSync, cloud_provider::DeviceSetWatcher {
- public:
-  // Parameters:
-  //   |on_version_mismatch| is called when the local state is detected to be
-  //     incompatible with the state in the cloud and has to be erased.
-  UserSyncImpl(ledger::Environment* environment, UserConfig user_config,
-               std::unique_ptr<backoff::Backoff> backoff,
-               fit::closure on_version_mismatch);
-  ~UserSyncImpl() override;
-
-  // UserSync:
-  void SetSyncWatcher(SyncStateWatcher* watcher) override;
-  void Start() override;
-  std::unique_ptr<LedgerSync> CreateLedgerSync(
-      fxl::StringView app_id,
-      encryption::EncryptionService* encryption_service) override;
-
-  // Returns the path where the device fingerprint is stored.
-  ledger::DetachedPath GetFingerprintPath();
-
- private:
-  // cloud_provider::DeviceSetWatcher:
-  void OnCloudErased() override;
-
-  void OnNetworkError() override;
-
-  // Checks that the cloud was not erased since the last sync using the device
-  // fingerprint.
-  void CheckCloudNotErased();
-  void CreateFingerprint();
-  void HandleDeviceSetResult(cloud_provider::Status status);
-
-  // Sets a watcher to detect that the cloud is cleared while sync is running.
-  void SetCloudErasedWatcher();
-
-  // Enables sync upload.
-  void EnableUpload();
-
-  ledger::Environment* environment_;
-  const UserConfig user_config_;
-  std::unique_ptr<backoff::Backoff> backoff_;
-  fit::closure on_version_mismatch_;
-
-  // UserSyncImpl must be started before it can be used.
-  bool started_ = false;
-  // Whether uploads should be enabled. It is false until the cloud version has
-  // been checked.
-  bool upload_enabled_ = false;
-  cloud_provider::DeviceSetPtr device_set_;
-  fidl::Binding<cloud_provider::DeviceSetWatcher> watcher_binding_;
-  // Fingerprint of the device in the cloud device list.
-  std::string fingerprint_;
-  std::set<LedgerSyncImpl*> active_ledger_syncs_;
-
-  // Aggregates the synchronization state of multiple ledgers into one
-  // notification stream.
-  Aggregator aggregator_;
-
-  // This must be the last member of this class.
-  callback::ScopedTaskRunner task_runner_;
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_IMPL_USER_SYNC_IMPL_H_
diff --git a/bin/ledger/cloud_sync/impl/user_sync_impl_unittest.cc b/bin/ledger/cloud_sync/impl/user_sync_impl_unittest.cc
deleted file mode 100644
index 500a920..0000000
--- a/bin/ledger/cloud_sync/impl/user_sync_impl_unittest.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/impl/user_sync_impl.h"
-
-#include <utility>
-
-#include <lib/backoff/backoff.h>
-#include <lib/backoff/testing/test_backoff.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/bin/ledger/cloud_sync/impl/testing/test_cloud_provider.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace cloud_sync {
-
-namespace {
-
-class TestSyncStateWatcher : public SyncStateWatcher {
- public:
-  TestSyncStateWatcher() {}
-  ~TestSyncStateWatcher() override{};
-
-  void Notify(SyncStateContainer /*sync_state*/) override {}
-};
-
-class UserSyncImplTest : public ledger::TestWithEnvironment {
- public:
-  UserSyncImplTest()
-      : cloud_provider_(cloud_provider_ptr_.NewRequest()),
-        encryption_service_(dispatcher()) {
-    UserConfig user_config;
-    user_config.user_directory = ledger::DetachedPath(tmpfs_.root_fd());
-    user_config.cloud_provider = std::move(cloud_provider_ptr_);
-
-    auto backoff = std::make_unique<backoff::TestBackoff>();
-    backoff->SetOnGetNext([this] {
-      // Make RunLoopUntilIdle() return once a backoff is requested, to avoid an
-      // infinite loop.
-      QuitLoop();
-    });
-
-    user_sync_ = std::make_unique<UserSyncImpl>(
-        &environment_, std::move(user_config), std::move(backoff),
-        [this] { on_version_mismatch_calls_++; });
-    user_sync_->SetSyncWatcher(&sync_state_watcher_);
-  }
-  ~UserSyncImplTest() override {}
-
- protected:
-  bool SetFingerprintFile(std::string content) {
-    ledger::DetachedPath fingerprint_path = user_sync_->GetFingerprintPath();
-    return files::WriteFileAt(fingerprint_path.root_fd(),
-                              fingerprint_path.path(), content.data(),
-                              content.size());
-  }
-
-  scoped_tmpfs::ScopedTmpFS tmpfs_;
-  cloud_provider::CloudProviderPtr cloud_provider_ptr_;
-  TestCloudProvider cloud_provider_;
-  std::unique_ptr<UserSyncImpl> user_sync_;
-  encryption::FakeEncryptionService encryption_service_;
-  TestSyncStateWatcher sync_state_watcher_;
-
-  int on_version_mismatch_calls_ = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(UserSyncImplTest);
-};
-
-// Verifies that the mismatch callback is called if the fingerprint appears to
-// be erased from the cloud.
-TEST_F(UserSyncImplTest, CloudCheckErased) {
-  ASSERT_TRUE(SetFingerprintFile("some-value"));
-  cloud_provider_.device_set.status_to_return =
-      cloud_provider::Status::NOT_FOUND;
-  EXPECT_EQ(0, on_version_mismatch_calls_);
-  user_sync_->Start();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, on_version_mismatch_calls_);
-}
-
-// Verifies that if the version checker reports that cloud is compatible, upload
-// is enabled in LedgerSync.
-TEST_F(UserSyncImplTest, CloudCheckOk) {
-  ASSERT_TRUE(SetFingerprintFile("some-value"));
-  cloud_provider_.device_set.status_to_return = cloud_provider::Status::OK;
-  EXPECT_EQ(0, on_version_mismatch_calls_);
-  user_sync_->Start();
-
-  auto ledger_a = user_sync_->CreateLedgerSync("app-id", &encryption_service_);
-  auto ledger_a_ptr = static_cast<LedgerSyncImpl*>(ledger_a.get());
-  EXPECT_FALSE(ledger_a_ptr->IsUploadEnabled());
-  RunLoopUntilIdle();
-  EXPECT_TRUE(ledger_a_ptr->IsUploadEnabled());
-  EXPECT_EQ(0, on_version_mismatch_calls_);
-  EXPECT_EQ("some-value", cloud_provider_.device_set.checked_fingerprint);
-
-  // Verify that newly created LedgerSyncs also have the upload enabled.
-  auto ledger_b = user_sync_->CreateLedgerSync("app-id", &encryption_service_);
-  auto ledger_b_ptr = static_cast<LedgerSyncImpl*>(ledger_b.get());
-  EXPECT_TRUE(ledger_b_ptr->IsUploadEnabled());
-}
-
-// Verifies that if there is no fingerprint file, it is created and set in the
-// cloud.
-TEST_F(UserSyncImplTest, CloudCheckSet) {
-  auto fingerprint_path = user_sync_->GetFingerprintPath();
-  EXPECT_FALSE(
-      files::IsFileAt(fingerprint_path.root_fd(), fingerprint_path.path()));
-  cloud_provider_.device_set.status_to_return = cloud_provider::Status::OK;
-  EXPECT_EQ(0, on_version_mismatch_calls_);
-  user_sync_->Start();
-
-  auto ledger = user_sync_->CreateLedgerSync("app-id", &encryption_service_);
-  auto ledger_ptr = static_cast<LedgerSyncImpl*>(ledger.get());
-  EXPECT_FALSE(ledger_ptr->IsUploadEnabled());
-  RunLoopUntilIdle();
-  EXPECT_TRUE(ledger_ptr->IsUploadEnabled());
-  EXPECT_EQ(0, on_version_mismatch_calls_);
-  EXPECT_FALSE(cloud_provider_.device_set.set_fingerprint.empty());
-
-  // Verify that the fingerprint file was created.
-  EXPECT_TRUE(
-      files::IsFileAt(fingerprint_path.root_fd(), fingerprint_path.path()));
-}
-
-// Verifies that the cloud watcher for the fingerprint is set and triggers the
-// mismatch callback when cloud erase is detected.
-TEST_F(UserSyncImplTest, WatchErase) {
-  ASSERT_TRUE(SetFingerprintFile("some-value"));
-  cloud_provider_.device_set.status_to_return = cloud_provider::Status::OK;
-  user_sync_->Start();
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(cloud_provider_.device_set.set_watcher.is_bound());
-  EXPECT_EQ("some-value", cloud_provider_.device_set.watched_fingerprint);
-  EXPECT_EQ(0, on_version_mismatch_calls_);
-
-  cloud_provider_.device_set.set_watcher->OnCloudErased();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, on_version_mismatch_calls_);
-}
-
-// Verifies that setting the cloud watcher for is retried on network errors.
-TEST_F(UserSyncImplTest, WatchRetry) {
-  ASSERT_TRUE(SetFingerprintFile("some-value"));
-  cloud_provider_.device_set.set_watcher_status_to_return =
-      cloud_provider::Status::NETWORK_ERROR;
-  user_sync_->Start();
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, cloud_provider_.device_set.set_watcher_calls);
-}
-
-}  // namespace
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/public/BUILD.gn b/bin/ledger/cloud_sync/public/BUILD.gn
deleted file mode 100644
index 33468f6..0000000
--- a/bin/ledger/cloud_sync/public/BUILD.gn
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("public") {
-  sources = [
-    "ledger_sync.h",
-    "page_sync.h",
-    "sync_state_watcher.cc",
-    "sync_state_watcher.h",
-    "user_config.h",
-    "user_sync.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/encryption/public",
-    "//peridot/bin/ledger/fidl/include",
-    "//peridot/bin/ledger/filesystem",
-    "//peridot/bin/ledger/storage/public",
-  ]
-
-  deps = [
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/cloud_sync/public/ledger_sync.h b/bin/ledger/cloud_sync/public/ledger_sync.h
deleted file mode 100644
index 1e50f49..0000000
--- a/bin/ledger/cloud_sync/public/ledger_sync.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_LEDGER_SYNC_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_LEDGER_SYNC_H_
-
-#include <functional>
-#include <memory>
-#include <string>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/cloud_sync/public/page_sync.h"
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace cloud_sync {
-
-// Manages Cloud Sync for a particular ledger.
-class LedgerSync {
- public:
-  LedgerSync() {}
-  virtual ~LedgerSync() {}
-
-  // Creates a new page sync for the given page. The page could already have
-  // data synced to the cloud or not.
-  //
-  // The provided |error_callback| is called when sync is stopped due to an
-  // unrecoverable error.
-  virtual std::unique_ptr<PageSync> CreatePageSync(
-      storage::PageStorage* page_storage,
-      storage::PageSyncClient* page_sync_client) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerSync);
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_LEDGER_SYNC_H_
diff --git a/bin/ledger/cloud_sync/public/page_sync.h b/bin/ledger/cloud_sync/public/page_sync.h
deleted file mode 100644
index 6b9e0ea..0000000
--- a/bin/ledger/cloud_sync/public/page_sync.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_PAGE_SYNC_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_PAGE_SYNC_H_
-
-#include <functional>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-
-namespace cloud_sync {
-
-// Manages cloud sync for a single page.
-//
-// PageSync is responsible for uploading locally created artifacts (commits and
-// objects) of the page from storage to the cloud, and for fetching remote
-// artifacts of the same page from the cloud and putting them in storage.
-class PageSync {
- public:
-  PageSync() {}
-  virtual ~PageSync() {}
-
-  // Starts syncing. Upon connection drop, the sync will restart automatically,
-  // the client doesn't need to call Start() again.
-  virtual void Start() = 0;
-
-  // Sets a callback that will be called after Start() every time when PageSync
-  // becomes idle, that is: finished uploading all unsynced local artifacts to
-  // the cloud and not downloading any remote artifacts. Can be set at most once
-  // and only before calling Start().
-  virtual void SetOnIdle(fit::closure on_idle) = 0;
-
-  // Returns true iff PageSync is idle, that is with no pending upload or
-  // download work.
-  virtual bool IsIdle() = 0;
-
-  // Sets a callback that will be called at most once after Start(), when all
-  // remote commits added to the cloud between the last sync and starting the
-  // current sync are added to storage. This can be used by the client to delay
-  // exposing the local page until it catches up with the cloud. Can be set at
-  // most once and only before calling Start().
-  virtual void SetOnBacklogDownloaded(fit::closure on_backlog_downloaded) = 0;
-
-  // Sets a watcher for the synchronization state of this page.
-  virtual void SetSyncWatcher(SyncStateWatcher* watcher) = 0;
-
-  // Sets a callback that will be called at most once, before or after Start(),
-  // when PageSync hits an error it cannot recover from. The class can be
-  // deleted after that.
-  virtual void SetOnUnrecoverableError(fit::closure on_unrecoverable_error) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageSync);
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_PAGE_SYNC_H_
diff --git a/bin/ledger/cloud_sync/public/sync_state_watcher.cc b/bin/ledger/cloud_sync/public/sync_state_watcher.cc
deleted file mode 100644
index 8aaa483..0000000
--- a/bin/ledger/cloud_sync/public/sync_state_watcher.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-
-#include <tuple>
-
-namespace cloud_sync {
-
-SyncStateWatcher::SyncStateContainer::SyncStateContainer(
-    DownloadSyncState download, UploadSyncState upload)
-    : download(download), upload(upload) {}
-
-SyncStateWatcher::SyncStateContainer::SyncStateContainer() {}
-
-void SyncStateWatcher::SyncStateContainer::Merge(SyncStateContainer other) {
-  if (other.download > this->download) {
-    download = other.download;
-  }
-  if (other.upload > this->upload) {
-    upload = other.upload;
-  }
-}
-
-void SyncStateWatcher::Notify(DownloadSyncState download,
-                              UploadSyncState upload) {
-  Notify(SyncStateContainer(download, upload));
-}
-
-bool operator==(const SyncStateWatcher::SyncStateContainer& lhs,
-                const SyncStateWatcher::SyncStateContainer& rhs) {
-  return std::tie(lhs.download, lhs.upload) ==
-         std::tie(rhs.download, rhs.upload);
-}
-
-bool operator!=(const SyncStateWatcher::SyncStateContainer& lhs,
-                const SyncStateWatcher::SyncStateContainer& rhs) {
-  return !(lhs == rhs);
-}
-
-std::ostream& operator<<(
-    std::ostream& strm,
-    const SyncStateWatcher::SyncStateContainer& sync_state) {
-  return strm << "{" << sync_state.download << ", " << sync_state.upload << "}";
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/public/sync_state_watcher.h b/bin/ledger/cloud_sync/public/sync_state_watcher.h
deleted file mode 100644
index 054ef18..0000000
--- a/bin/ledger/cloud_sync/public/sync_state_watcher.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_SYNC_STATE_WATCHER_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_SYNC_STATE_WATCHER_H_
-
-#include <ostream>
-
-namespace cloud_sync {
-// Detail of the download part of the synchronization state.
-enum DownloadSyncState {
-  // Download has not started.
-  // Possible successor states: DOWNLOAD_BACKLOG.
-  DOWNLOAD_NOT_STARTED = 0,
-  // Download is downloading the commit backlog.
-  // Possible successor states: DOWNLOAD_TEMPORARY_ERROR,
-  // DOWNLOAD_SETTING_REMOTE_WATCHER.
-  DOWNLOAD_BACKLOG,
-  // Download experienced a temporary error and will attempt to recover
-  // automatically.
-  // Possible successor states: DOWNLOAD_BACKLOG,
-  // DOWNLOAD_SETTING_REMOTE_WATCHER.
-  DOWNLOAD_TEMPORARY_ERROR,
-  // Download prepares the remote watcher to be notified of new remote commits.
-  // Possible successor states: DOWNLOAD_IDLE.
-  DOWNLOAD_SETTING_REMOTE_WATCHER,
-  // Download is idle and waits for new remote commits to download.
-  // Possible successor states: DOWNLOAD_TEMPORARY_ERROR, DOWNLOAD_IN_PROGRESS,
-  // DOWNLOAD_PERMANENT_ERROR.
-  DOWNLOAD_IDLE,
-  // Download is in progress.
-  // Possible successor states: DOWNLOAD_TEMPORARY_ERROR, DOWNLOAD_IDLE,
-  // DOWNLOAD_PERMANENT_ERROR.
-  DOWNLOAD_IN_PROGRESS,
-  // Download experienced a permanent, unrecoverable error.
-  // Possible successor states: None.
-  DOWNLOAD_PERMANENT_ERROR,
-};
-
-// Detail of the upload part of the synchronization state.
-enum UploadSyncState {
-  // Upload has not started.
-  // Possible successor states: UPLOAD_SETUP.
-  UPLOAD_NOT_STARTED = 0,
-  // Upload is started and being prepared.
-  // Possible successor states: UPLOAD_IDLE, UPLOAD_WAIT_TOO_MANY_LOCAL_HEADS,
-  // UPLOAD_WAIT_REMOTE_DOWNLOAD, UPLOAD_PERMANENT_ERROR.
-  UPLOAD_SETUP,
-  // Upload is ready, but currently idle.
-  // Possible successor states: UPLOAD_PENDING,
-  // UPLOAD_WAIT_TOO_MANY_LOCAL_HEADS,
-  // UPLOAD_WAIT_REMOTE_DOWNLOAD, UPLOAD_PERMANENT_ERROR.
-  UPLOAD_IDLE,
-  // Upload has some contents to upload, but has to wait before proceeding.
-  // Possible successor states: UPLOAD_WAIT_TOO_MANY_LOCAL_HEADS,
-  // UPLOAD_WAIT_REMOTE_DOWNLOAD, UPLOAD_PERMANENT_ERROR.
-  UPLOAD_PENDING,
-  // Upload cannot proceed as there are more than one local head commit.
-  // Possible successor states: UPLOAD_IDLE, UPLOAD_IN_PROGRESS,
-  // UPLOAD_WAIT_REMOTE_DOWNLOAD, UPLOAD_PERMANENT_ERROR.
-  UPLOAD_WAIT_TOO_MANY_LOCAL_HEADS,
-  // Upload is waiting for a remote download to finish.
-  // Possible successor states: UPLOAD_IDLE, UPLOAD_IN_PROGRESS,
-  // UPLOAD_WAIT_TOO_MANY_LOCAL_HEADS, UPLOAD_PERMANENT_ERROR.
-  UPLOAD_WAIT_REMOTE_DOWNLOAD,
-  // Upload experienced a temporary error and will attempt to recover
-  // automatically.
-  // Possible successor states: UPLOAD_IDLE, UPLOAD_WAIT_TOO_MANY_LOCAL_HEADS,
-  // UPLOAD_WAIT_REMOTE_DOWNLOAD, UPLOAD_IN_PROGRESS, UPLOAD_PERMANENT_ERROR.
-  UPLOAD_TEMPORARY_ERROR,
-  // Upload is uploading a local commit and its contents.
-  // Possible successor states: UPLOAD_IDLE, UPLOAD_WAIT_TOO_MANY_LOCAL_HEADS,
-  // UPLOAD_WAIT_REMOTE_DOWNLOAD, UPLOAD_PERMANENT_ERROR.
-  UPLOAD_IN_PROGRESS,
-  // Upload has experienced an unrecoverable error and cannot continue.
-  // Possible successor states: None.
-  UPLOAD_PERMANENT_ERROR,
-};
-
-// Watcher interface for the current state of data synchronization
-class SyncStateWatcher {
- public:
-  // Container for the synchronization state, containing both download and
-  // upload components.
-  struct SyncStateContainer {
-    DownloadSyncState download = DOWNLOAD_IDLE;
-    UploadSyncState upload = UPLOAD_IDLE;
-
-    SyncStateContainer(DownloadSyncState download, UploadSyncState upload);
-    SyncStateContainer();
-
-    void Merge(SyncStateContainer other);
-  };
-
-  virtual ~SyncStateWatcher() {}
-
-  // Notifies the watcher of a new state.
-  virtual void Notify(SyncStateContainer sync_state) = 0;
-
-  // Helper method, equivalent to |Notify| above.
-  virtual void Notify(DownloadSyncState download, UploadSyncState upload);
-};
-
-bool operator==(const SyncStateWatcher::SyncStateContainer& lhs,
-                const SyncStateWatcher::SyncStateContainer& rhs);
-bool operator!=(const SyncStateWatcher::SyncStateContainer& lhs,
-                const SyncStateWatcher::SyncStateContainer& rhs);
-std::ostream& operator<<(
-    std::ostream& strm, const SyncStateWatcher::SyncStateContainer& sync_state);
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_SYNC_STATE_WATCHER_H_
diff --git a/bin/ledger/cloud_sync/public/user_config.h b/bin/ledger/cloud_sync/public/user_config.h
deleted file mode 100644
index 7452f40..0000000
--- a/bin/ledger/cloud_sync/public/user_config.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_USER_CONFIG_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_USER_CONFIG_H_
-
-#include <memory>
-#include <string>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-
-namespace cloud_sync {
-
-// Sync configuration for a particular user.
-struct UserConfig {
-  // The directory for the user persistent data.
-  ledger::DetachedPath user_directory;
-  // The provider of the auth data for the user.
-  cloud_provider::CloudProviderPtr cloud_provider;
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_USER_CONFIG_H_
diff --git a/bin/ledger/cloud_sync/public/user_sync.h b/bin/ledger/cloud_sync/public/user_sync.h
deleted file mode 100644
index f33abd2..0000000
--- a/bin/ledger/cloud_sync/public/user_sync.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_USER_SYNC_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_USER_SYNC_H_
-
-#include <memory>
-
-#include <lib/fxl/functional/closure.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/cloud_sync/public/ledger_sync.h"
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-#include "peridot/bin/ledger/cloud_sync/public/user_config.h"
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-
-namespace cloud_sync {
-
-// Top level factory for every object sync related for a given user.
-class UserSync {
- public:
-  UserSync() {}
-  virtual ~UserSync() {}
-
-  // Sets a synchronization state watcher for this user.
-  //
-  // Set the watcher to nullptr to unregister a previously set watcher.
-  virtual void SetSyncWatcher(SyncStateWatcher* watcher) = 0;
-
-  // Starts the user synchronization.
-  virtual void Start() = 0;
-
-  virtual std::unique_ptr<LedgerSync> CreateLedgerSync(
-      fxl::StringView app_id,
-      encryption::EncryptionService* encryption_service) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(UserSync);
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_PUBLIC_USER_SYNC_H_
diff --git a/bin/ledger/cloud_sync/testing/BUILD.gn b/bin/ledger/cloud_sync/testing/BUILD.gn
deleted file mode 100644
index 914ff00..0000000
--- a/bin/ledger/cloud_sync/testing/BUILD.gn
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("testing") {
-  testonly = true
-
-  sources = [
-    "page_sync_empty_impl.cc",
-    "page_sync_empty_impl.h",
-  ]
-
-  public_deps = [
-    "//peridot/bin/ledger/cloud_sync/public",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/cloud_sync/testing/page_sync_empty_impl.cc b/bin/ledger/cloud_sync/testing/page_sync_empty_impl.cc
deleted file mode 100644
index c26a25b..0000000
--- a/bin/ledger/cloud_sync/testing/page_sync_empty_impl.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cloud_sync/testing/page_sync_empty_impl.h"
-
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-namespace cloud_sync {
-
-void PageSyncEmptyImpl::Start() { FXL_NOTIMPLEMENTED(); }
-
-void PageSyncEmptyImpl::SetOnIdle(fit::closure /*on_idle_callback*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-bool PageSyncEmptyImpl::IsIdle() {
-  FXL_NOTIMPLEMENTED();
-  return true;
-}
-
-void PageSyncEmptyImpl::SetOnBacklogDownloaded(
-    fit::closure /*on_backlog_downloaded_callback*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void PageSyncEmptyImpl::SetSyncWatcher(SyncStateWatcher* /*watcher*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void PageSyncEmptyImpl::SetOnUnrecoverableError(fit::closure /*on_error*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-}  // namespace cloud_sync
diff --git a/bin/ledger/cloud_sync/testing/page_sync_empty_impl.h b/bin/ledger/cloud_sync/testing/page_sync_empty_impl.h
deleted file mode 100644
index e35d115..0000000
--- a/bin/ledger/cloud_sync/testing/page_sync_empty_impl.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_CLOUD_SYNC_TESTING_PAGE_SYNC_EMPTY_IMPL_H_
-#define PERIDOT_BIN_LEDGER_CLOUD_SYNC_TESTING_PAGE_SYNC_EMPTY_IMPL_H_
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/cloud_sync/public/page_sync.h"
-
-namespace cloud_sync {
-
-class PageSyncEmptyImpl : public PageSync {
- public:
-  // PageSync:
-  void Start() override;
-  void SetOnIdle(fit::closure on_idle_callback) override;
-  bool IsIdle() override;
-  void SetOnBacklogDownloaded(
-      fit::closure on_backlog_downloaded_callback) override;
-  void SetSyncWatcher(SyncStateWatcher* watcher) override;
-  void SetOnUnrecoverableError(fit::closure on_error) override;
-};
-
-}  // namespace cloud_sync
-
-#endif  // PERIDOT_BIN_LEDGER_CLOUD_SYNC_TESTING_PAGE_SYNC_EMPTY_IMPL_H_
diff --git a/bin/ledger/cobalt/BUILD.gn b/bin/ledger/cobalt/BUILD.gn
deleted file mode 100644
index c377739..0000000
--- a/bin/ledger/cobalt/BUILD.gn
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/cobalt_config/metrics_registry.gni")
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-metrics_registry("ledger_metrics_registry") {
-  project_id = 100
-}
-
-source_set("cobalt") {
-  sources = [
-    "cobalt.cc",
-    "cobalt.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fxl",
-  ]
-
-  deps = [
-    "//garnet/public/lib/backoff",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/cobalt/cpp:cobalt_logger",
-    "//zircon/public/fidl/fuchsia-cobalt",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/cobalt/cobalt.cc b/bin/ledger/cobalt/cobalt.cc
deleted file mode 100644
index 57c2831..0000000
--- a/bin/ledger/cobalt/cobalt.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/cobalt/cobalt.h"
-
-#include <lib/cobalt/cpp/cobalt_logger.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/file.h>
-
-namespace ledger {
-namespace {
-constexpr char kConfigBinProtoPath[] = "/pkg/data/ledger_cobalt_config.pb";
-constexpr int32_t kCobaltMetricId = 2;
-
-cobalt::CobaltLogger* g_cobalt_logger = nullptr;
-
-}  // namespace
-
-fit::deferred_action<fit::closure> InitializeCobalt(
-    async_dispatcher_t* dispatcher, component::StartupContext* context) {
-  std::unique_ptr<cobalt::CobaltLogger> cobalt_logger;
-  FXL_DCHECK(!g_cobalt_logger);
-
-  cobalt_logger =
-      cobalt::NewCobaltLogger(dispatcher, context, kConfigBinProtoPath);
-
-  g_cobalt_logger = cobalt_logger.get();
-  return fit::defer<fit::closure>([cobalt_logger = std::move(cobalt_logger)] {
-    g_cobalt_logger = nullptr;
-  });
-}
-
-void ReportEvent(CobaltEvent event) {
-  // Do not do anything if cobalt reporting is disabled.
-  if (!g_cobalt_logger) {
-    return;
-  }
-  g_cobalt_logger->LogEvent(kCobaltMetricId, static_cast<uint32_t>(event));
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/cobalt/cobalt.h b/bin/ledger/cobalt/cobalt.h
deleted file mode 100644
index e712493..0000000
--- a/bin/ledger/cobalt/cobalt.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_COBALT_COBALT_H_
-#define PERIDOT_BIN_LEDGER_COBALT_COBALT_H_
-
-#include <lib/async/dispatcher.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-namespace ledger {
-
-// The events to report.
-// Next enum value: 6
-enum class CobaltEvent : uint32_t {
-  LEDGER_STARTED = 0,
-  COMMITS_RECEIVED_OUT_OF_ORDER = 1,
-  COMMITS_RECEIVED_OUT_OF_ORDER_NOT_RECOVERED = 4,
-  COMMITS_MERGED = 2,
-  MERGED_COMMITS_MERGED = 3,
-  LEDGER_LEVELDB_STATE_CORRUPTED = 5,
-};
-
-// Cobalt initialization. When cobalt is not need, the returned object must be
-// deleted. This method must not be called again until then.
-fit::deferred_action<fit::closure> InitializeCobalt(
-    async_dispatcher_t* dispatcher, component::StartupContext* context);
-
-// Report an event to Cobalt. The callback returned by |InitializeCobalt|
-// must be live throughout every call to this function. This is
-// thread-compatible, as long as the previous requirement is ensured across
-// threads.
-void ReportEvent(CobaltEvent event);
-
-};  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_COBALT_COBALT_H_
diff --git a/bin/ledger/coroutine/BUILD.gn b/bin/ledger/coroutine/BUILD.gn
deleted file mode 100644
index 22f8973..0000000
--- a/bin/ledger/coroutine/BUILD.gn
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("coroutine") {
-  sources = [
-    "coroutine.h",
-    "coroutine_impl.cc",
-    "coroutine_impl.h",
-    "coroutine_manager.h",
-    "coroutine_waiter.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fxl",
-  ]
-
-  deps = [
-    "//peridot/bin/ledger/coroutine/context",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "coroutine_manager_unittest.cc",
-    "coroutine_unittest.cc",
-    "coroutine_waiter_unittest.cc",
-  ]
-
-  deps = [
-    ":coroutine",
-    "//garnet/public/lib/fxl",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/coroutine/README.md b/bin/ledger/coroutine/README.md
deleted file mode 100644
index 739f7ac..0000000
--- a/bin/ledger/coroutine/README.md
+++ /dev/null
@@ -1,115 +0,0 @@
-# Coroutine library
-
-## Description
-This coroutine library can help you write highly asynchronous code, and avoid
-"callback hell". It does so by allowing a function (or method) to be paused and
-resumed by swapping [execution contexts](context/context.h). It makes the code  
-*look* synchronous, while remaining asynchronous under the hood, with all the
-usual concurrency pitfalls, such as race conditions and deadlocks.
-
-Coroutines are different than multithreading, but both can be used together.
-See [CoroutineHandler](coroutine.h) for details.
-
-## Usage
-
-Here are some tips on good use of the Coroutine library.
-
-### Use CoroutineManager in classes
-
-Usually, coroutines created within a class object should not survive its
-destruction, whether because continuing the processing didn't make sense, or
-because resources captured by the coroutine would be destroyed (such as `this`).
-
-[CoroutineManager](coroutine_manager.h) is a proxy class for
-[CoroutineService](coroutine.h). `CoroutineManager` interrupts the coroutine it
-created when destroyed, and can be created using the `CoroutineService` vended
-by an `Environment` object.
-
-You should consider using `CoroutineManager` if you use coroutines in your
-class.
-
-Free-standing functions probably don't need `CoroutineManager` and can use
-`CoroutineService` directly.
-
-### When receiving INTERRUPTED, return
-
-`coroutine::ContinuationStatus::INTERRUPTED` means another part of your code
-requested the coroutine to terminate gracefully. This would be the case if the
-`CoroutineManager` or `CoroutineService` who created this coroutine are
-destroyed.
-
-This mechanism is needed because other parts of the program don’t know the heap
-allocations made inside the coroutine, as well as other cleanup performed by
-the destructors of objects created or owned by the coroutine. When a coroutine
-destruction is needed, it is resumed with an `ContinuationStatus::INTERRUPTED`
-and it is the coroutine's job to unwind its call stack.
-
-Usually, the only thing you need to do when receiving a
-`ContinuationStatus::INTERRUPTED` is to return immediately. Doing more work is
-dangerous as some objects you rely on may be destroyed already.
-
-
-### Don’t use Yield and Resume
-
-You probably don’t need to use `Yield()` and `Resume()` directly.
-[SyncCall](coroutine.h) is a utility function that can be used to wrap any
-asynchronous call, so that you don't have to use `CoroutineHandler` methods
-directly.
-
-If you have an asynchronous function with the signature
-`AsynchronousCall(Argument, std::function<void(Status, Result)>)`, then you can
-wrap it such as:
-``` cpp
-Argument argument(...)
-Status status;
-Result value;
-if (coroutine::SyncCall(handler,
-    [argument](fit::function<void(Status, Result)> cb) {
-        AsynchronousCall(argument, std::move(cb));
-    }, &status, &value) == coroutine::ContinuationStatus::INTERRUPTED) {
-  return Status::INTERRUPTED;
-}
-if (status != Status::OK)
-  return status;
-Process(value);
-```
-
-`SyncCall` will ensure the asynchronous call is made and the coroutine paused,
-and then resumed when the asynchronous callback is executed.
-
-
-### Use coroutine::Wait with for loops
-
-Coroutines make it very easy to write asynchronous code, but the execution of
-the coroutine itself remains sequential. In particular, `for` loops are not run
-in parallel. If you can, avoid the following pattern:
-``` cpp
-std::vector<Result> results;
-for (auto& obj : objects_) {
-  Result result;
-  // Don't do that! SynchronousFrobinate does not need to wait for the previous
-  // call to finish.
-  if (SynchronousFrobinate(handler, obj, &result) ==
-      coroutine::ContinuationStatus::INTERRUPTED) {
-    return;
-  }
-  results.push_back(std::move(result));
-}
-```
-
-Instead, make the asynchronous calls directly and use
-[coroutine::Waiter](coroutine_waiter.h) to collate the results:
-``` cpp
-auto waiter = fxl::MakeRefCounted<
-    callback::Waiter<Status, std::unique_ptr<Result>>>(Status::OK);
-
-for (auto& obj : objects_) {
-  AsyncFrobinate(obj, waiter->NewCallback());
-}
-
-Status status; std::vector<std::unique_ptr<Result>> result;
-if (coroutine::Wait(handler, std::move(waiter), &s, &result) ==
-    coroutine::ContinuationStatus::INTERRUPTED) {
-  return Status::INTERRUPTED;
-}
-```
diff --git a/bin/ledger/coroutine/context/BUILD.gn b/bin/ledger/coroutine/context/BUILD.gn
deleted file mode 100644
index ef4e62d..0000000
--- a/bin/ledger/coroutine/context/BUILD.gn
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("context") {
-  sources = [
-    "context.cc",
-    "context.h",
-    "stack.cc",
-    "stack.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/coroutine/context/$target_cpu",
-  ]
-
-  public_deps = [
-    "//zircon/public/lib/zx",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "context_unittest.cc",
-  ]
-
-  deps = [
-    ":context",
-    "//garnet/public/lib/fxl",
-    "//third_party/googletest:gtest",
-    "//zircon/public/lib/fit",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/coroutine/context/arm64/BUILD.gn b/bin/ledger/coroutine/context/arm64/BUILD.gn
deleted file mode 100644
index 964ab20..0000000
--- a/bin/ledger/coroutine/context/arm64/BUILD.gn
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("arm64") {
-  sources = [
-    "context.S",
-    "context.h",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/coroutine/context/arm64/context.S b/bin/ledger/coroutine/context/arm64/context.S
deleted file mode 100644
index 8b5c411..0000000
--- a/bin/ledger/coroutine/context/arm64/context.S
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <zircon/tls.h>
-
-#include "peridot/bin/ledger/coroutine/context/arm64/context.h"
-
-#define FUNCTION(x) .global x; .type x,%function; x:
-
-// GetContext
-// Captures the state of the CPU in the passed struct.
-// The saved registers are:
-// - All callee saved registers.
-// - SP, Unsafe SP, LR and ARG0.
-FUNCTION(_ZN7context10GetContextEPNS_15InternalContextE)
-    stp x19, x20, [x0, #X19_O]
-    stp x21, x22, [x0, #X21_O]
-    stp x23, x24, [x0, #X23_O]
-    stp x25, x26, [x0, #X25_O]
-    stp x27, x28, [x0, #X27_O]
-    stp x29, x30, [x0, #X29_O]
-    mov x2,  sp
-    str x2,  [x0, #SP_O]
-    stp d8,  d9,  [x0, #D8_O]
-    stp d10, d11, [x0, #D10_O]
-    stp d12, d13, [x0, #D12_O]
-    stp d14, d15, [x0, #D14_O]
-    mov x1,  #0
-    str x1,  [x0, #X0_O]
-
-#if __has_feature(safe_stack)
-    mrs x1, TPIDR_EL0
-    ldr x1, [x1, #ZX_TLS_UNSAFE_SP_OFFSET]
-    str x1, [x0, #UNSAFE_SP_O]
-#endif
-
-    mov x0,  #0xFFFFFFFFFFFFFFFF
-    ret
-
-// SetContext
-// Restores the state of the CPU from the passed struct.
-// The restored registers are:
-// - All callee saved registers.
-// - SP, Unsafe SP, LR and ARG0.
-FUNCTION(_ZN7context10SetContextEPNS_15InternalContextE)
-    // The sanitizer runtime wants to be informed of non-local exits.
-    // Call __asan_handle_no_return() before doing the actual longjmp.
-#if __has_feature(address_sanitizer)
-    // Save the argument register in a callee-saves register
-    // around calling __asan_handle_no_return.  We don't need
-    // to save the return address since we'll never return to it.
-    mov x19, x0
-    bl __asan_handle_no_return
-    mov x0, x19
-#endif
-
-    ldp x19, x20, [x0, #X19_O]
-    ldp x21, x22, [x0, #X21_O]
-    ldp x23, x24, [x0, #X23_O]
-    ldp x25, x26, [x0, #X25_O]
-    ldp x27, x28, [x0, #X27_O]
-    ldp x29, x30, [x0, #X29_O]
-    ldr x2,  [x0, #SP_O]
-    mov sp,  x2
-    ldp d8 , d9,  [x0, #D8_O]
-    ldp d10, d11, [x0, #D10_O]
-    ldp d12, d13, [x0, #D12_O]
-    ldp d14, d15, [x0, #D14_O]
-
-#if __has_feature(safe_stack)
-    ldr x2,  [x0, #UNSAFE_SP_O]
-    mrs x1, TPIDR_EL0
-    str x2, [x1, #ZX_TLS_UNSAFE_SP_OFFSET]
-#endif
-
-    ldr x0, [x0, #X0_O]
-    br x30
diff --git a/bin/ledger/coroutine/context/arm64/context.h b/bin/ledger/coroutine/context/arm64/context.h
deleted file mode 100644
index 62118d8..0000000
--- a/bin/ledger/coroutine/context/arm64/context.h
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_ARM64_CONTEXT_H_
-#define PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_ARM64_CONTEXT_H_
-
-// Offset of all saved registers.
-#define X19_O 0
-#define X20_O 8
-#define X21_O 16
-#define X22_O 24
-#define X23_O 32
-#define X24_O 40
-#define X25_O 48
-#define X26_O 56
-#define X27_O 64
-#define X28_O 72
-#define X29_O 80
-#define X30_O 88
-#define SP_O 96
-#define D8_O 104
-#define D9_O 112
-#define D10_O 120
-#define D11_O 128
-#define D12_O 136
-#define D13_O 144
-#define D14_O 152
-#define D15_O 160
-#define X0_O 168
-
-#if __has_feature(safe_stack)
-#define UNSAFE_SP_O 176
-#endif
-
-#ifndef __ASSEMBLER__
-
-#include <stddef.h>
-#include <stdint.h>
-
-namespace context {
-
-enum Register {
-  REG_X19 = 0,
-  REG_X20,
-  REG_X21,
-  REG_X22,
-  REG_X23,
-  REG_X24,
-  REG_X25,
-  REG_X26,
-  REG_X27,
-  REG_X28,
-  REG_X29,
-  REG_X30,
-  REG_SP,
-  REG_D8,
-  REG_D9,
-  REG_D10,
-  REG_D11,
-  REG_D12,
-  REG_D13,
-  REG_D14,
-  REG_D15,
-  REG_X0,
-#if __has_feature(safe_stack)
-  REG_UNSAFE_SP,
-#endif
-  NUM_REGISTERS,
-
-  // Special registers.
-  REG_ARG0 = REG_X0,
-  REG_LR = REG_X30,
-};
-
-inline constexpr size_t kAdditionalStackAlignment = 0;
-
-struct InternalContext {
-  uint64_t registers[NUM_REGISTERS];
-};
-
-#define ASSERT_REGISTER_OFFSET(REG)                                 \
-  static_assert(offsetof(struct InternalContext,                    \
-                         registers[context::REG_##REG]) == REG##_O, \
-                "offset is incorrect")
-
-ASSERT_REGISTER_OFFSET(X19);
-ASSERT_REGISTER_OFFSET(X20);
-ASSERT_REGISTER_OFFSET(X21);
-ASSERT_REGISTER_OFFSET(X22);
-ASSERT_REGISTER_OFFSET(X23);
-ASSERT_REGISTER_OFFSET(X24);
-ASSERT_REGISTER_OFFSET(X25);
-ASSERT_REGISTER_OFFSET(X26);
-ASSERT_REGISTER_OFFSET(X27);
-ASSERT_REGISTER_OFFSET(X28);
-ASSERT_REGISTER_OFFSET(X29);
-ASSERT_REGISTER_OFFSET(X30);
-ASSERT_REGISTER_OFFSET(SP);
-ASSERT_REGISTER_OFFSET(D8);
-ASSERT_REGISTER_OFFSET(D9);
-ASSERT_REGISTER_OFFSET(D10);
-ASSERT_REGISTER_OFFSET(D11);
-ASSERT_REGISTER_OFFSET(D12);
-ASSERT_REGISTER_OFFSET(D13);
-ASSERT_REGISTER_OFFSET(D14);
-ASSERT_REGISTER_OFFSET(D15);
-ASSERT_REGISTER_OFFSET(X0);
-#if __has_feature(safe_stack)
-ASSERT_REGISTER_OFFSET(UNSAFE_SP);
-#endif
-
-}  // namespace context
-
-#endif  // __ASSEMBLER__
-
-#endif  // PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_ARM64_CONTEXT_H_
diff --git a/bin/ledger/coroutine/context/context.cc b/bin/ledger/coroutine/context/context.cc
deleted file mode 100644
index e9e8ec5..0000000
--- a/bin/ledger/coroutine/context/context.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/coroutine/context/context.h"
-
-#include <lib/fxl/logging.h>
-
-namespace context {
-
-void SwapContext(Context* out_context, Context* in_context) {
-  if (!GetContext(out_context)) {
-    // Returning from a SetContext, nothing else to do.
-    return;
-  }
-  SetContext(in_context);
-
-  FXL_NOTREACHED() << "SetContext should not return.";
-}
-
-void MakeContext(Context* context, Stack* stack, void (*func)(void*),
-                 void* data) {
-  memset(context, 0, sizeof(Context));
-
-  uintptr_t sp = stack->safe_stack() + stack->stack_size();
-  // Align stack.
-  sp = ((sp + kAdditionalStackAlignment) & (~15)) - kAdditionalStackAlignment;
-
-  context->registers[REG_LR] = reinterpret_cast<uintptr_t>(func);
-  context->registers[REG_ARG0] = reinterpret_cast<uintptr_t>(data);
-  context->registers[REG_SP] = sp;
-
-#if __has_feature(safe_stack)
-  uintptr_t unsafe_sp = stack->unsafe_stack() + stack->stack_size();
-  // Align stack.
-  unsafe_sp = (unsafe_sp & (~15));
-
-  context->registers[REG_UNSAFE_SP] = unsafe_sp;
-#endif
-}
-
-}  // namespace context
diff --git a/bin/ledger/coroutine/context/context.h b/bin/ledger/coroutine/context/context.h
deleted file mode 100644
index c8d653d..0000000
--- a/bin/ledger/coroutine/context/context.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_CONTEXT_H_
-#define PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_CONTEXT_H_
-
-#include <memory>
-
-#include <lib/fxl/build_config.h>
-
-#include "peridot/bin/ledger/coroutine/context/stack.h"
-
-#if defined(ARCH_CPU_X86_64)
-#include "peridot/bin/ledger/coroutine/context/x64/context.h"
-#elif defined(ARCH_CPU_ARM64)
-#include "peridot/bin/ledger/coroutine/context/arm64/context.h"
-#else
-#error Please add support for your architecture.
-#endif
-
-namespace context {
-
-// Context is architecture dependent.
-using Context = InternalContext;
-
-// Initializes |context| to the currently active execution context. Return
-// |true| on the first return of this function. If this context is later resumed
-// using SetContext or SwapContext, the execution will start with this function
-// returning false.
-extern bool GetContext(Context* context);
-
-// Restores the execution context pointed at by |context|. This function never
-// returns. The program execution will continue as if the call to |GetContext|,
-// |MakeContext| or |SwapContext| that created |context| just returned.
-extern void SetContext(Context* context);
-
-// Initializes |context| to a new context. When this context is later activated,
-// |func| is called with |data| as parameter. The stack will be |stack|. |func|
-// must never return.
-//
-// NOLINT suppresses false-positive redundant declaration check due to a
-// friend declaration in stack.h.
-void MakeContext(Context* context,  // NOLINT
-                 Stack* stack, void (*func)(void*), void* data);
-
-// Saves the current execution context in |old_context| and activates the
-// execution context pointed by |in_context|.
-void SwapContext(Context* out_context, Context* in_context);
-
-}  // namespace context
-
-#endif  // PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_CONTEXT_H_
diff --git a/bin/ledger/coroutine/context/context_unittest.cc b/bin/ledger/coroutine/context/context_unittest.cc
deleted file mode 100644
index 5cc8030..0000000
--- a/bin/ledger/coroutine/context/context_unittest.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/coroutine/context/context.h"
-
-#include <string.h>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/compiler_specific.h>
-#include <lib/fxl/logging.h>
-
-#include "gtest/gtest.h"
-
-namespace context {
-
-#if __has_feature(safe_stack)
-char* GetUnsafeStackForTest(const Stack& stack) {
-  return reinterpret_cast<char*>(stack.unsafe_stack());
-}
-#endif
-
-namespace {
-
-// Function using variable args to generate mmx code on x86_64. Running this
-// without crashing ensures that the stack is correctly aligned.
-int UseMMX(const char* format, ...) {
-  va_list va;
-  va_start(va, format);
-  int result = vsnprintf(nullptr, 0, format, va);
-  va_end(va);
-  return result;
-}
-
-size_t Fact(size_t n) {
-  if (n == 0) {
-    return 1;
-  }
-  return n * Fact(n - 1);
-}
-
-void RunInContext(void* data) {
-  auto runnable = reinterpret_cast<fit::function<void()>*>(data);
-  (*runnable)();
-}
-
-TEST(Context, GetContext) {
-  Context context;
-  EXPECT_TRUE(GetContext(&context));
-}
-
-TEST(Context, SetContext) {
-  Context context;
-  volatile size_t nb_calls = 0;
-
-  volatile bool result = GetContext(&context);
-  ++nb_calls;
-  if (result) {
-    SetContext(&context);
-  }
-
-  EXPECT_EQ(2u, nb_calls);
-}
-
-TEST(Context, MakeContext) {
-  Stack stack;
-
-  Context new_context;
-  Context old_context;
-
-  size_t f = 0u;
-  int va_args_result = 0;
-  fit::function<void()> runnable = [&]() {
-    f = Fact(5);
-    va_args_result = UseMMX("Hello %d %d\n", 1, 2);
-    SetContext(&old_context);
-  };
-
-  MakeContext(&new_context, &stack, &RunInContext, &runnable);
-
-  SwapContext(&old_context, &new_context);
-
-  EXPECT_EQ(120u, f);
-  EXPECT_EQ(10, va_args_result);
-}
-
-struct ThreadLocalContext {
-  static thread_local char* thread_local_ptr;
-
-  char* ptr = nullptr;
-  Context old_context;
-};
-
-thread_local char* ThreadLocalContext::thread_local_ptr = nullptr;
-
-void GetThreadLocalPointer(void* context) {
-  auto thread_local_context = reinterpret_cast<ThreadLocalContext*>(context);
-  thread_local_context->ptr = ThreadLocalContext::thread_local_ptr;
-  SetContext(&thread_local_context->old_context);
-}
-
-TEST(Context, ThreadLocal) {
-  Stack stack;
-  ThreadLocalContext context;
-
-  char c = 'a';
-  ThreadLocalContext::thread_local_ptr = &c;
-
-  Context new_context;
-
-  EXPECT_TRUE(GetContext(&new_context));
-  MakeContext(&new_context, &stack, &GetThreadLocalPointer, &context);
-
-  SwapContext(&context.old_context, &new_context);
-
-  EXPECT_EQ(&c, context.ptr);
-}
-
-#if __has_feature(safe_stack)
-// Force to set the pointed address to 1. This must be no-inline to prevent the
-// compiler to optimize away the set.
-FXL_NOINLINE void ForceSet(volatile char* addr) { *addr = 1; }
-
-// Write some data to the unsafe stack.
-void TrashStack(void* context) {
-  volatile char buffer[1024];
-  for (size_t i = 0; i < 6; ++i) {
-    ForceSet(buffer + Fact(i));
-  }
-
-  SetContext(reinterpret_cast<Context*>(context));
-}
-
-TEST(Context, MakeContextUnsafeStack) {
-  Stack stack;
-  memset(GetUnsafeStackForTest(stack), 0, stack.stack_size());
-
-  Context new_context;
-  Context old_context;
-
-  EXPECT_TRUE(GetContext(&new_context));
-  MakeContext(&new_context, &stack, &TrashStack, &old_context);
-
-  SwapContext(&old_context, &new_context);
-
-  bool found = false;
-  char* ptr = GetUnsafeStackForTest(stack);
-  for (size_t i = 0; i < stack.stack_size(); ++i) {
-    found = found || *(ptr + i);
-  }
-  EXPECT_TRUE(found);
-}
-
-__NO_SAFESTACK intptr_t GetSafeStackPointer() {
-  char a = 0;
-  // Suppress check about returning a stack memory address.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wreturn-stack-address"
-  return reinterpret_cast<intptr_t>(&a);  // NOLINT
-#pragma clang diagnostic pop
-}
-
-void CheckDistinctStack(void* context) {
-  char buff[1];
-  memset(buff, 0, sizeof(buff));
-  // buff is on the unsafe stack, GetSafeStackPointer() returns a value on the
-  // safe stack. This checks that the address of the 2 stacks are separated at
-  // least by 2 PAGE_SIZE, given that each stack has a guard.
-  EXPECT_GE(std::abs(reinterpret_cast<intptr_t>(buff) - GetSafeStackPointer()),
-            2 * PAGE_SIZE);
-
-  SetContext(reinterpret_cast<Context*>(context));
-}
-
-TEST(Context, CheckStacksAreDifferent) {
-  Stack stack;
-
-  Context new_context;
-  Context old_context;
-
-  EXPECT_TRUE(GetContext(&new_context));
-  MakeContext(&new_context, &stack, &CheckDistinctStack, &old_context);
-
-  SwapContext(&old_context, &new_context);
-}
-#endif
-
-}  // namespace
-}  // namespace context
diff --git a/bin/ledger/coroutine/context/stack.cc b/bin/ledger/coroutine/context/stack.cc
deleted file mode 100644
index 1868f14..0000000
--- a/bin/ledger/coroutine/context/stack.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/coroutine/context/stack.h"
-
-#include <stdlib.h>
-
-#include <lib/fxl/logging.h>
-#include <lib/zx/vmar.h>
-
-namespace context {
-
-namespace {
-size_t ToFullPages(size_t value) {
-  return (value + PAGE_SIZE - 1) & (~(PAGE_SIZE - 1));
-}
-
-// ASAN doesn't instrument vmo mappings. Use traditional malloc/free when
-// running with ASAN.
-#if __has_feature(address_sanitizer)
-// ASAN doesn't support safe stack.
-static_assert(!__has_feature(safe_stack),
-              "Add support for safe stack under ASAN");
-
-void AllocateASAN(size_t stack_size, uintptr_t* stack) {
-  *stack = reinterpret_cast<uintptr_t>(malloc(stack_size));
-  FXL_DCHECK(*stack);
-}
-
-void ReleaseASAN(uintptr_t stack) { free(reinterpret_cast<void*>(stack)); }
-
-#else  // __has_feature(address_sanitizer)
-
-constexpr size_t kStackGuardSize = PAGE_SIZE;
-
-#if __has_feature(safe_stack)
-constexpr size_t kVmoSizeMultiplier = 2u;
-#else
-constexpr size_t kVmoSizeMultiplier = 1u;
-#endif
-
-void AllocateStack(const zx::vmo& vmo, size_t vmo_offset, size_t stack_size,
-                   zx::vmar* vmar, uintptr_t* addr) {
-  uintptr_t allocate_address;
-  zx_status_t status = zx::vmar::root_self()->allocate(
-      0, stack_size + 2 * kStackGuardSize,
-      ZX_VM_CAN_MAP_READ | ZX_VM_CAN_MAP_WRITE | ZX_VM_CAN_MAP_SPECIFIC, vmar,
-      &allocate_address);
-  FXL_DCHECK(status == ZX_OK);
-
-  status = vmar->map(kStackGuardSize, vmo, vmo_offset, stack_size,
-                     ZX_VM_PERM_READ | ZX_VM_PERM_WRITE | ZX_VM_SPECIFIC, addr);
-  FXL_DCHECK(status == ZX_OK);
-}
-
-#endif  // __has_feature(address_sanitizer)
-}  // namespace
-
-#if __has_feature(address_sanitizer)
-
-Stack::Stack(size_t stack_size) : stack_size_(ToFullPages(stack_size)) {
-  FXL_DCHECK(stack_size_);
-
-  AllocateASAN(stack_size_, &safe_stack_);
-}
-
-Stack::~Stack() { ReleaseASAN(safe_stack_); }
-
-void Stack::Release() {
-  ReleaseASAN(safe_stack_);
-  AllocateASAN(stack_size_, &safe_stack_);
-}
-
-#else  // __has_feature(address_sanitizer)
-
-Stack::Stack(size_t stack_size) : stack_size_(ToFullPages(stack_size)) {
-  FXL_DCHECK(stack_size_);
-  zx_status_t status =
-      zx::vmo::create(kVmoSizeMultiplier * stack_size_, 0, &vmo_);
-  FXL_DCHECK(status == ZX_OK);
-
-  AllocateStack(vmo_, 0, stack_size_, &safe_stack_mapping_, &safe_stack_);
-  FXL_DCHECK(safe_stack_);
-
-#if __has_feature(safe_stack)
-  AllocateStack(vmo_, stack_size_, stack_size_, &unsafe_stack_mapping_,
-                &unsafe_stack_);
-  FXL_DCHECK(unsafe_stack_);
-#endif
-}
-
-Stack::~Stack() {
-  safe_stack_mapping_.destroy();
-#if __has_feature(safe_stack)
-  unsafe_stack_mapping_.destroy();
-#endif
-}
-
-void Stack::Release() {
-  zx_status_t status = vmo_.op_range(
-      ZX_VMO_OP_DECOMMIT, 0, kVmoSizeMultiplier * stack_size_, nullptr, 0);
-  FXL_DCHECK(status == ZX_OK);
-}
-
-#endif  // __has_feature(address_sanitizer)
-
-}  // namespace context
diff --git a/bin/ledger/coroutine/context/stack.h b/bin/ledger/coroutine/context/stack.h
deleted file mode 100644
index a8b599c..0000000
--- a/bin/ledger/coroutine/context/stack.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_STACK_H_
-#define PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_STACK_H_
-
-#include <stddef.h>
-
-#include <lib/zx/vmar.h>
-#include <lib/zx/vmo.h>
-
-namespace context {
-
-struct InternalContext;
-using Context = InternalContext;
-
-// A stack to be used with |MakeContext|.
-class Stack {
- public:
-  // Creates a new stack. |stack_size| is the minimal size of the new stack.
-  explicit Stack(size_t stack_size = 64 * 1024);
-  ~Stack();
-
-  // Releases the memory associated with this stack. After this call, the stack
-  // is ready to be used again, but its content is not specified.
-  void Release();
-
-  size_t stack_size() const { return stack_size_; }
-
-  uintptr_t safe_stack() const { return safe_stack_; }
-#if __has_feature(safe_stack)
-  uintptr_t unsafe_stack() const { return unsafe_stack_; };
-#endif
-
- private:
-  const size_t stack_size_;
-  zx::vmo vmo_;
-  zx::vmar safe_stack_mapping_;
-  uintptr_t safe_stack_;
-#if __has_feature(safe_stack)
-  zx::vmar unsafe_stack_mapping_;
-  uintptr_t unsafe_stack_;
-#endif
-};
-}  // namespace context
-
-#endif  // PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_STACK_H_
diff --git a/bin/ledger/coroutine/context/x64/BUILD.gn b/bin/ledger/coroutine/context/x64/BUILD.gn
deleted file mode 100644
index 9d4fdb4..0000000
--- a/bin/ledger/coroutine/context/x64/BUILD.gn
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("x64") {
-  sources = [
-    "context.S",
-    "context.h",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/coroutine/context/x64/context.S b/bin/ledger/coroutine/context/x64/context.S
deleted file mode 100644
index 153c259..0000000
--- a/bin/ledger/coroutine/context/x64/context.S
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <zircon/tls.h>
-
-#include "peridot/bin/ledger/coroutine/context/x64/context.h"
-
-#define FUNCTION(x) .global x; .type x,%function; x:
-
-// GetContext
-// Captures the state of the CPU in the passed struct.
-// The saved registers are:
-// - All callee saved registers.
-// - SP, Unsafe SP, LR and ARG0.
-FUNCTION(_ZN7context10GetContextEPNS_15InternalContextE)
-    movq %rbx,    RBX_O(%rdi)
-    movq %rbp,    RBP_O(%rdi)
-    movq %r12,    R12_O(%rdi)
-    movq %r13,    R13_O(%rdi)
-    movq %r14,    R14_O(%rdi)
-    movq %r15,    R15_O(%rdi)
-    movq %rdi,    RDI_O(%rdi)
-
-#if __has_feature(safe_stack)
-    movq %fs:ZX_TLS_UNSAFE_SP_OFFSET, %rax
-    movq %rax, UNSAFE_SP_O(%rdi)
-#endif
-
-    # Skip return address.
-    leaq 8(%rsp), %rax
-    movq %rax,    RSP_O(%rdi)
-    # Store return value in rip.
-    movq (%rsp),  %rax
-    movq %rax,    RIP_O(%rdi)
-
-    // Returns true for initial call.
-    xor %rax,     %rax
-    dec %rax
-    ret
-
-// SetContext
-// Restores the state of the CPU from the passed struct.
-// The restored registers are:
-// - All callee saved registers.
-// - SP, Unsafe SP, LR and ARG0.
-FUNCTION(_ZN7context10SetContextEPNS_15InternalContextE)
-    // The sanitizer runtime wants to be informed of non-local exits.
-    // Call __asan_handle_no_return() before doing the actual longjmp.
-#if __has_feature(address_sanitizer)
-    // Save our incoming argument register on the stack around calling
-    // __asan_handle_no_return.  The incoming stack is misaligned by one
-    // word, so we need to move the stack by an odd number of words.
-    push %rdi
-    call __asan_handle_no_return@PLT
-    pop %rdi
-#endif
-
-    movq RBX_O(%rdi), %rbx
-    movq RBP_O(%rdi), %rbp
-    movq R12_O(%rdi), %r12
-    movq R13_O(%rdi), %r13
-    movq R14_O(%rdi), %r14
-    movq R15_O(%rdi), %r15
-    movq RSP_O(%rdi), %rsp
-
-#if __has_feature(safe_stack)
-    movq UNSAFE_SP_O(%rdi), %rax
-    movq %rax, %fs:ZX_TLS_UNSAFE_SP_OFFSET
-#endif
-
-    # Returns 0.
-    xor %rax,         %rax
-
-    # Get the return address.
-    movq RIP_O(%rdi), %rcx
-
-    # Set RDI at the end.
-    movq RDI_O(%rdi), %rdi
-
-    # Jump directly to the return address.
-    jmp *%rcx
diff --git a/bin/ledger/coroutine/context/x64/context.h b/bin/ledger/coroutine/context/x64/context.h
deleted file mode 100644
index fbc68fc..0000000
--- a/bin/ledger/coroutine/context/x64/context.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_X64_CONTEXT_H_
-#define PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_X64_CONTEXT_H_
-
-// Offset of all saved registers.
-#define RBX_O 0
-#define RBP_O 8
-#define R12_O 16
-#define R13_O 24
-#define R14_O 32
-#define R15_O 40
-#define RDI_O 48
-#define RSP_O 56
-#define RIP_O 64
-
-#if __has_feature(safe_stack)
-#define UNSAFE_SP_O 72
-#endif
-
-#ifndef __ASSEMBLER__
-
-#include <stddef.h>
-#include <stdint.h>
-
-namespace context {
-
-enum Register {
-  REG_RBX = 0,
-  REG_RBP,
-  REG_R12,
-  REG_R13,
-  REG_R14,
-  REG_R15,
-  REG_RDI,
-  REG_RSP,
-  REG_RIP,
-#if __has_feature(safe_stack)
-  REG_UNSAFE_SP,
-#endif
-  NUM_REGISTERS,
-
-  // Special registers.
-  REG_ARG0 = REG_RDI,
-  REG_LR = REG_RIP,
-  REG_SP = REG_RSP,
-};
-
-inline constexpr size_t kAdditionalStackAlignment = 8;
-
-struct InternalContext {
-  uint64_t registers[NUM_REGISTERS];
-};
-
-#define ASSERT_REGISTER_OFFSET(REG)                                 \
-  static_assert(offsetof(struct InternalContext,                    \
-                         registers[context::REG_##REG]) == REG##_O, \
-                "offset is incorrect")
-
-ASSERT_REGISTER_OFFSET(RBX);
-ASSERT_REGISTER_OFFSET(RBP);
-ASSERT_REGISTER_OFFSET(R12);
-ASSERT_REGISTER_OFFSET(R13);
-ASSERT_REGISTER_OFFSET(R14);
-ASSERT_REGISTER_OFFSET(R15);
-ASSERT_REGISTER_OFFSET(RDI);
-ASSERT_REGISTER_OFFSET(RSP);
-ASSERT_REGISTER_OFFSET(RIP);
-#if __has_feature(safe_stack)
-ASSERT_REGISTER_OFFSET(UNSAFE_SP);
-#endif
-
-}  // namespace context
-
-#endif  // __ASSEMBLER__
-
-#endif  // PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_X64_CONTEXT_H_
diff --git a/bin/ledger/coroutine/coroutine.h b/bin/ledger/coroutine/coroutine.h
deleted file mode 100644
index 79cdb25..0000000
--- a/bin/ledger/coroutine/coroutine.h
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_H_
-#define PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_H_
-
-#include <functional>
-
-#include <lib/callback/capture.h>
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_counted.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-// This Coroutine library allows to use coroutines. A coroutine is a function
-// that can interrupt itself by yielding, and the computation will resume at the
-// same point when another context of execution resumes the coroutine using
-// its handler.
-namespace coroutine {
-
-// The status of a coroutine when it returns from Yield.
-enum class ContinuationStatus : bool {
-  // The coroutine is in its standard state. Computation can continue.
-  OK,
-  // The coroutine has been interrupted, it must unwind its stack and terminate.
-  INTERRUPTED,
-};
-
-// The Handler of a coroutine. It allows a coroutine to yield and another
-// context of execution to resume the computation.
-//
-// Threading: until the first Yield(), the coroutine executes on the thread that
-// called CoroutineService::StartCoroutine(). Between Yield() and Resume(),
-// the handler can be passed to another thread - the computation resumes on the
-// thread that called Resume().
-class CoroutineHandler {
- public:
-  virtual ~CoroutineHandler() {}
-
-  // Yield the current coroutine. This must only be called from inside the
-  // coroutine associated with this handler. If Yield returns |INTERRUPTED|, the
-  // coroutine must unwind its stack and terminate.
-  FXL_WARN_UNUSED_RESULT virtual ContinuationStatus Yield() = 0;
-
-  // Restarts the computation of the coroutine associated with this handler.
-  // This must only be called outside of the coroutine when it is yielded. If
-  // |status| is |INTERRUPTED|, |Yield| will return |INTERRUPTED| when the
-  // coroutine is resumed, asking it to terminate.
-  virtual void Resume(ContinuationStatus status) = 0;
-};
-
-// The service handling coroutines. It allows to create new coroutines.
-// Destructing the service will terminate all active coroutines. All the
-// non-terminated coroutines will eventually be activated and asked to
-// terminate.
-class CoroutineService {
- public:
-  virtual ~CoroutineService() {}
-
-  // Starts a new coroutine that will execute |runnable|.
-  virtual void StartCoroutine(
-      fit::function<void(CoroutineHandler*)> runnable) = 0;
-};
-
-// Allows to execute an asynchronous call in a coroutine. The coroutine will
-// yield until the asynchronous call terminates, it will then be resumed and
-// will store the results of the asynchronous calls in |parameters|. If
-// |SyncCall| returns |INTERRUPTED|, the coroutine must unwind its stack and
-// terminate.
-//
-// |async_call| will be never be called after this method returns. As such, it
-// can capture local variables by reference.
-//
-// For instance, suppose you have the following asynchronous function
-// LongAsyncComputation that signals its completion by passing the computed
-// string and integer to a callback:
-//
-// void LongAsyncComputation(fit::function<void(std::string, int)> on_done);
-//
-// Here is how to execute it synchronously in a coroutine:
-//
-// CoroutineHandler* handler;
-// std::string s; int i;
-// if (SyncCall(handler, &LongAsyncComputation, &s, &i) ==
-//     ContinuationStatus::INTERRUPTED) {
-//   return ContinuationStatus::INTERRUPTED;
-// }
-// FXL_LOG(INFO) << "LongAsyncComputation returned: " << s << " " << i;
-//
-// Another usage pattern is to have a lambda in place of LongAsyncComputation,
-// that will immediately store the callback provided by SyncCall in some
-// ancillary data structure. The SyncCall will then yield until some other part
-// of the code invokes this callback with a result:
-//
-// if (SyncCall(handler,
-//              [this](fit::function<void(string, int)> on_done) {
-//                pending_callbacks_.emplace_back(std::move(on_done));
-//              },
-//              &s, &i) == ContinuationStatus::INTERRUPTED) {
-//   return ContinuationStatus::INTERRUPTED;
-// }
-// FXL_LOG(INFO) << "Some background task computed: " << s << " " << i;
-//
-template <typename A, typename... Args>
-FXL_WARN_UNUSED_RESULT ContinuationStatus SyncCall(CoroutineHandler* handler,
-                                                   A async_call,
-                                                   Args*... parameters) {
-  class TerminationSentinel
-      : public fxl::RefCountedThreadSafe<TerminationSentinel> {
-   public:
-    bool terminated = false;
-  };
-
-  auto termination_sentinel = fxl::MakeRefCounted<TerminationSentinel>();
-  auto on_return = fit::defer(
-      [termination_sentinel] { termination_sentinel->terminated = true; });
-
-  volatile bool sync_state = true;
-  volatile bool callback_called = false;
-  // Unblock the coroutine (by having it return early) if the asynchronous call
-  // drops its callback without ever calling it.
-  auto unblocker = fit::defer([termination_sentinel, &handler, &sync_state] {
-    if (termination_sentinel->terminated) {
-      return;
-    }
-
-    if (sync_state) {
-      sync_state = false;
-      return;
-    }
-    handler->Resume(ContinuationStatus::INTERRUPTED);
-  });
-  auto capture = callback::Capture(
-      [&sync_state, &callback_called, handler,
-       unblocker = std::move(unblocker)]() mutable {
-        // |capture| is already gated by the termination sentinel below. No need
-        // to re-check here.
-
-        unblocker.cancel();
-        callback_called = true;
-        if (sync_state) {
-          sync_state = false;
-          return;
-        }
-        handler->Resume(ContinuationStatus::OK);
-      },
-      parameters...);
-  async_call([termination_sentinel,
-              capture = std::move(capture)](Args... args) mutable {
-    if (termination_sentinel->terminated) {
-      return;
-    }
-    capture(std::forward<Args>(args)...);
-  });
-  // If sync_state is still true, the callback was not called. Yield until it
-  // is.
-  if (sync_state) {
-    sync_state = false;
-    return handler->Yield();
-  }
-  return callback_called ? ContinuationStatus::OK
-                         : ContinuationStatus::INTERRUPTED;
-};
-
-}  // namespace coroutine
-
-#endif  // PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_H_
diff --git a/bin/ledger/coroutine/coroutine_impl.cc b/bin/ledger/coroutine/coroutine_impl.cc
deleted file mode 100644
index e250a1e..0000000
--- a/bin/ledger/coroutine/coroutine_impl.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-
-#include <lib/fit/function.h>
-
-#if __has_feature(address_sanitizer)
-#include <sanitizer/common_interface_defs.h>
-#endif
-
-#include <lib/fxl/logging.h>
-#include "peridot/bin/ledger/coroutine/context/context.h"
-#include "peridot/bin/ledger/coroutine/context/stack.h"
-
-namespace coroutine {
-
-constexpr size_t kMaxAvailableStacks = 25;
-
-class CoroutineServiceImpl::CoroutineHandlerImpl : public CoroutineHandler {
- public:
-  CoroutineHandlerImpl(std::unique_ptr<context::Stack> stack,
-                       fit::function<void(CoroutineHandler*)> runnable);
-  ~CoroutineHandlerImpl() override;
-
-  // CoroutineHandler.
-  ContinuationStatus Yield() override;
-  void Resume(ContinuationStatus status) override;
-
-  void Start();
-  void set_cleanup(
-      fit::function<void(std::unique_ptr<context::Stack>)> cleanup) {
-    cleanup_ = std::move(cleanup);
-  }
-
- private:
-  static void StaticRun(void* data);
-  void Run();
-  ContinuationStatus DoYield();
-
-  std::unique_ptr<context::Stack> stack_;
-  fit::function<void(CoroutineHandler*)> runnable_;
-  fit::function<void(std::unique_ptr<context::Stack>)> cleanup_;
-  context::Context main_context_;
-  context::Context routine_context_;
-  bool interrupted_ = false;
-  bool finished_ = false;
-#if __has_feature(address_sanitizer)
-  const void* origin_stack_ = nullptr;
-  size_t origin_stacksize_ = 0;
-#endif
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(CoroutineHandlerImpl);
-};
-
-CoroutineServiceImpl::CoroutineHandlerImpl::CoroutineHandlerImpl(
-    std::unique_ptr<context::Stack> stack,
-    fit::function<void(CoroutineHandler*)> runnable)
-    : stack_(std::move(stack)), runnable_(std::move(runnable)) {
-  FXL_DCHECK(stack_);
-  FXL_DCHECK(runnable_);
-}
-
-CoroutineServiceImpl::CoroutineHandlerImpl::~CoroutineHandlerImpl() {
-  FXL_DCHECK(!stack_);
-}
-
-ContinuationStatus CoroutineServiceImpl::CoroutineHandlerImpl::Yield() {
-  FXL_DCHECK(!interrupted_);
-
-  if (interrupted_) {
-    return ContinuationStatus::INTERRUPTED;
-  }
-
-  return DoYield();
-}
-
-void CoroutineServiceImpl::CoroutineHandlerImpl::Resume(
-    ContinuationStatus status) {
-  FXL_DCHECK(!finished_);
-
-  interrupted_ = interrupted_ || (status == ContinuationStatus::INTERRUPTED);
-#if __has_feature(address_sanitizer)
-  void* fake_stack_save;
-  __sanitizer_start_switch_fiber(
-      &fake_stack_save, reinterpret_cast<const void*>(stack_->safe_stack()),
-      stack_->stack_size());
-#endif
-  context::SwapContext(&main_context_, &routine_context_);
-#if __has_feature(address_sanitizer)
-  __sanitizer_finish_switch_fiber(fake_stack_save, nullptr, nullptr);
-#endif
-
-  if (finished_) {
-    cleanup_(std::move(stack_));
-    // this object has been deleted by |cleanup_|, return.
-    return;
-  }
-}
-
-void CoroutineServiceImpl::CoroutineHandlerImpl::Start() {
-  context::MakeContext(&routine_context_, stack_.get(),
-                       &CoroutineServiceImpl::CoroutineHandlerImpl::StaticRun,
-                       this);
-  Resume(ContinuationStatus::OK);
-}
-
-void CoroutineServiceImpl::CoroutineHandlerImpl::StaticRun(void* data) {
-  reinterpret_cast<CoroutineHandlerImpl*>(data)->Run();
-}
-
-void CoroutineServiceImpl::CoroutineHandlerImpl::Run() {
-#if __has_feature(address_sanitizer)
-  __sanitizer_finish_switch_fiber(nullptr, &origin_stack_, &origin_stacksize_);
-#endif
-  runnable_(this);
-  // Delete |runnable_|, as it can have side effects that should be run inside
-  // the co-routine.
-  runnable_ = [](CoroutineHandler*) {};
-  finished_ = true;
-  DoYield();
-  FXL_NOTREACHED() << "Last yield should never return.";
-}
-
-ContinuationStatus CoroutineServiceImpl::CoroutineHandlerImpl::DoYield() {
-#if __has_feature(address_sanitizer)
-  FXL_DCHECK(origin_stack_);
-  FXL_DCHECK(origin_stacksize_);
-  void* fake_stack_save = nullptr;
-  __sanitizer_start_switch_fiber(finished_ ? nullptr : &fake_stack_save,
-                                 origin_stack_, origin_stacksize_);
-#endif
-  context::SwapContext(&routine_context_, &main_context_);
-#if __has_feature(address_sanitizer)
-  __sanitizer_finish_switch_fiber(fake_stack_save, &origin_stack_,
-                                  &origin_stacksize_);
-#endif
-
-  return interrupted_ ? ContinuationStatus::INTERRUPTED
-                      : ContinuationStatus::OK;
-}
-
-CoroutineServiceImpl::CoroutineServiceImpl() {}
-
-CoroutineServiceImpl::~CoroutineServiceImpl() {
-  while (!handlers_.empty()) {
-    handlers_.back()->Resume(ContinuationStatus::INTERRUPTED);
-  }
-}
-
-void CoroutineServiceImpl::StartCoroutine(
-    fit::function<void(CoroutineHandler* handler)> runnable) {
-  std::unique_ptr<context::Stack> stack;
-  if (available_stack_.empty()) {
-    stack = std::make_unique<context::Stack>();
-  } else {
-    stack = std::move(available_stack_.back());
-    available_stack_.pop_back();
-  }
-  auto handler = std::make_unique<CoroutineHandlerImpl>(std::move(stack),
-                                                        std::move(runnable));
-  auto handler_ptr = handler.get();
-  handler->set_cleanup([this,
-                        handler_ptr](std::unique_ptr<context::Stack> stack) {
-    if (available_stack_.size() < kMaxAvailableStacks) {
-      stack->Release();
-      available_stack_.push_back(std::move(stack));
-    }
-    handlers_.erase(std::find_if(
-        handlers_.begin(), handlers_.end(),
-        [handler_ptr](const std::unique_ptr<CoroutineHandlerImpl>& handler) {
-          return handler.get() == handler_ptr;
-        }));
-  });
-  handlers_.push_back(std::move(handler));
-  handler_ptr->Start();
-}
-
-}  // namespace coroutine
diff --git a/bin/ledger/coroutine/coroutine_impl.h b/bin/ledger/coroutine/coroutine_impl.h
deleted file mode 100644
index 2677ad3..0000000
--- a/bin/ledger/coroutine/coroutine_impl.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_IMPL_H_
-#define PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_IMPL_H_
-
-#include <memory>
-#include <vector>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-
-namespace context {
-class Stack;
-}
-
-namespace coroutine {
-
-class CoroutineServiceImpl : public CoroutineService {
- public:
-  CoroutineServiceImpl();
-  ~CoroutineServiceImpl() override;
-
-  // CoroutineService.
-  void StartCoroutine(fit::function<void(CoroutineHandler*)> runnable) override;
-
- private:
-  class CoroutineHandlerImpl;
-
-  std::vector<std::unique_ptr<context::Stack>> available_stack_;
-  std::vector<std::unique_ptr<CoroutineHandlerImpl>> handlers_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(CoroutineServiceImpl);
-};
-
-}  // namespace coroutine
-
-#endif  // PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_IMPL_H_
diff --git a/bin/ledger/coroutine/coroutine_manager.h b/bin/ledger/coroutine/coroutine_manager.h
deleted file mode 100644
index 8748219..0000000
--- a/bin/ledger/coroutine/coroutine_manager.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_MANAGER_H_
-#define PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_MANAGER_H_
-
-#include <algorithm>
-#include <list>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-
-namespace coroutine {
-// CoroutineManager manages the lifetime of coroutines.
-class CoroutineManager {
- public:
-  explicit CoroutineManager(CoroutineService* service) : service_(service) {}
-
-  ~CoroutineManager() {
-    // Interrupt any active handlers.
-    while (!handlers_.empty()) {
-      (*handlers_.begin())->Resume(coroutine::ContinuationStatus::INTERRUPTED);
-    }
-  }
-
-  CoroutineManager(const CoroutineManager&) = delete;
-  const CoroutineManager& operator=(const CoroutineManager&) = delete;
-
-  // Starts a managed coroutine. This coroutine will be automatically
-  // interrupted if this |CoroutineManager| object is destroyed.
-  //
-  // |callback| must be a callable object
-  // |runnable| must be a callable object with the following signature:
-  //   void(CoroutineHandler*, fit::function<void(Args...)>)
-  // When the second argument of |runnable| is called, the coroutine is
-  // unregistered from the manager object and |callback| is called with the same
-  // arguments. It is an error to exit the coroutine without calling
-  // |runnable|'s callback.
-  template <typename Callback, typename Runnable>
-  void StartCoroutine(Callback callback, Runnable runnable) {
-    service_->StartCoroutine(
-        [this, callback = std::move(callback),
-         runnable = std::move(runnable)](CoroutineHandler* handler) mutable {
-          auto iter = handlers_.insert(handlers_.cend(), handler);
-          auto final_callback = [this, iter,
-                                 callback = std::move(callback)](auto... args) {
-            // Remove the handler before calling the final callback. Otherwise
-            // the handler might be unnecessarily interrupted, if this object
-            // destructor is called in the callback.
-            handlers_.erase(iter);
-            callback(std::move(args)...);
-          };
-
-          runnable(handler, std::move(final_callback));
-
-          // Verify that the handler is correctly unregistered. It would be a
-          // bug otherwise.
-          FXL_DCHECK(std::find(handlers_.begin(), handlers_.end(), handler) ==
-                     handlers_.end());
-        });
-  }
-
-  // Starts a managed coroutine. This coroutine will be automatically
-  // interrupted if this |CoroutineManager| object is destroyed.
-  //
-  // |runnable| must be a callable object with the following signature:
-  //   void(CoroutineHandler*)
-  template <typename Runnable>
-  void StartCoroutine(Runnable runnable) {
-    service_->StartCoroutine([this, runnable = std::move(runnable)](
-                                 CoroutineHandler* handler) mutable {
-      auto iter = handlers_.insert(handlers_.cend(), handler);
-      runnable(handler);
-      handlers_.erase(iter);
-    });
-  }
-
- private:
-  std::list<coroutine::CoroutineHandler*> handlers_;
-  CoroutineService* const service_;
-};
-
-}  // namespace coroutine
-
-#endif  // PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_MANAGER_H_
diff --git a/bin/ledger/coroutine/coroutine_manager_unittest.cc b/bin/ledger/coroutine/coroutine_manager_unittest.cc
deleted file mode 100644
index 9c1499b..0000000
--- a/bin/ledger/coroutine/coroutine_manager_unittest.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/coroutine/coroutine_manager.h"
-
-#include <memory>
-
-#include <lib/callback/set_when_called.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-
-namespace coroutine {
-namespace {
-
-TEST(CoroutineManager, CallbackIsCalled) {
-  CoroutineServiceImpl coroutine_service;
-  CoroutineManager manager(&coroutine_service);
-
-  bool called = false;
-  CoroutineHandler* handler = nullptr;
-  manager.StartCoroutine(callback::SetWhenCalled(&called),
-                         [&handler](CoroutineHandler* current_handler,
-                                    fit::function<void()> callback) {
-                           handler = current_handler;
-                           EXPECT_EQ(ContinuationStatus::OK, handler->Yield());
-                           callback();
-                         });
-
-  ASSERT_TRUE(handler);
-  EXPECT_FALSE(called);
-  handler->Resume(ContinuationStatus::OK);
-  EXPECT_TRUE(called);
-}
-
-TEST(CoroutineManager, InterruptCoroutineOnDestruction) {
-  CoroutineServiceImpl coroutine_service;
-  std::unique_ptr<CoroutineManager> manager =
-      std::make_unique<CoroutineManager>(&coroutine_service);
-
-  bool called = false;
-  CoroutineHandler* handler = nullptr;
-  manager->StartCoroutine(callback::SetWhenCalled(&called),
-                          [&handler](CoroutineHandler* current_handler,
-                                     fit::function<void()> callback) {
-                            handler = current_handler;
-                            EXPECT_EQ(ContinuationStatus::INTERRUPTED,
-                                      handler->Yield());
-                            callback();
-                          });
-
-  ASSERT_TRUE(handler);
-  EXPECT_FALSE(called);
-  manager.reset();
-  EXPECT_TRUE(called);
-}
-
-TEST(CoroutineManager, NoCallback) {
-  CoroutineServiceImpl coroutine_service;
-  CoroutineManager manager(&coroutine_service);
-
-  CoroutineHandler* handler = nullptr;
-  manager.StartCoroutine([&handler](CoroutineHandler* current_handler) {
-    handler = current_handler;
-    EXPECT_EQ(ContinuationStatus::OK, handler->Yield());
-  });
-
-  ASSERT_TRUE(handler);
-  handler->Resume(ContinuationStatus::OK);
-}
-
-}  // namespace
-}  // namespace coroutine
diff --git a/bin/ledger/coroutine/coroutine_unittest.cc b/bin/ledger/coroutine/coroutine_unittest.cc
deleted file mode 100644
index ce56332..0000000
--- a/bin/ledger/coroutine/coroutine_unittest.cc
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-
-namespace coroutine {
-namespace {
-
-size_t Fact(size_t n) {
-  if (n == 0) {
-    return 1;
-  }
-  return Fact(n - 1) * n;
-}
-
-void UseStack() { EXPECT_EQ(120u, Fact(5)); }
-
-TEST(Coroutine, SingleRoutine) {
-  CoroutineServiceImpl coroutine_service;
-
-  CoroutineHandler* handler = nullptr;
-  constexpr int kLoopCount = 10;
-  int result = kLoopCount;
-
-  coroutine_service.StartCoroutine(
-      [&handler, &result](CoroutineHandler* current_handler) {
-        handler = current_handler;
-        UseStack();
-        do {
-          EXPECT_EQ(ContinuationStatus::OK, current_handler->Yield());
-          UseStack();
-          --result;
-        } while (result);
-      });
-
-  EXPECT_TRUE(handler);
-  EXPECT_EQ(kLoopCount, result);
-
-  for (int i = kLoopCount - 1; i >= 0; --i) {
-    handler->Resume(ContinuationStatus::OK);
-    EXPECT_EQ(i, result);
-  }
-}
-
-TEST(Coroutine, ManyRoutines) {
-  constexpr size_t nb_routines = 1000;
-
-  CoroutineServiceImpl coroutine_service;
-
-  std::set<CoroutineHandler*> handlers;
-
-  for (size_t i = 0; i < nb_routines; ++i) {
-    coroutine_service.StartCoroutine([&handlers](CoroutineHandler* handler) {
-      handlers.insert(handler);
-      UseStack();
-
-      for (size_t i = 0; i < 3; ++i) {
-        EXPECT_EQ(ContinuationStatus::OK, handler->Yield());
-        UseStack();
-      }
-
-      handlers.erase(handlers.find(handler));
-    });
-  }
-
-  EXPECT_EQ(nb_routines, handlers.size());
-
-  for (size_t i = 0; i < 2; ++i) {
-    for (CoroutineHandler* handler : handlers) {
-      handler->Resume(ContinuationStatus::OK);
-    }
-  }
-
-  EXPECT_EQ(nb_routines, handlers.size());
-
-  for (size_t i = 0; i < nb_routines; ++i) {
-    (*handlers.begin())->Resume(ContinuationStatus::OK);
-  }
-
-  EXPECT_TRUE(handlers.empty());
-}
-
-TEST(Coroutine, AsyncCall) {
-  CoroutineServiceImpl coroutine_service;
-
-  fit::function<void(size_t)> callback;
-  auto callable = [&callback](fit::function<void(size_t)> called_callback) {
-    callback = std::move(called_callback);
-  };
-
-  size_t received_value = 0;
-  coroutine_service.StartCoroutine(
-      [callable, &received_value](CoroutineHandler* handler) {
-        UseStack();
-        size_t value;
-        EXPECT_EQ(ContinuationStatus::OK, SyncCall(handler, callable, &value));
-        UseStack();
-        received_value = value;
-      });
-
-  EXPECT_TRUE(callback);
-  EXPECT_EQ(0u, received_value);
-
-  callback(1);
-
-  EXPECT_EQ(1u, received_value);
-}
-
-TEST(Coroutine, SynchronousAsyncCall) {
-  CoroutineServiceImpl coroutine_service;
-
-  size_t received_value = 0;
-  coroutine_service.StartCoroutine(
-      [&received_value](CoroutineHandler* handler) {
-        UseStack();
-        EXPECT_EQ(ContinuationStatus::OK,
-                  SyncCall(
-                      handler,
-                      [](fit::function<void(size_t)> callback) { callback(1); },
-                      &received_value));
-        UseStack();
-      });
-  EXPECT_EQ(1u, received_value);
-}
-
-TEST(Coroutine, DroppedAsyncCall) {
-  CoroutineServiceImpl coroutine_service;
-
-  bool ended = false;
-  coroutine_service.StartCoroutine([&ended](CoroutineHandler* handler) {
-    EXPECT_EQ(ContinuationStatus::INTERRUPTED,
-              SyncCall(handler, [](fit::function<void()> callback) {
-                // |callback| is dropped here.
-              }));
-    ended = true;
-  });
-  EXPECT_TRUE(ended);
-}
-
-TEST(Coroutine, DroppedAsyncCallAsynchronously) {
-  CoroutineServiceImpl coroutine_service;
-
-  bool ended = false;
-  fit::function<void()> callback;
-
-  coroutine_service.StartCoroutine([&ended,
-                                    &callback](CoroutineHandler* handler) {
-    EXPECT_EQ(
-        ContinuationStatus::INTERRUPTED,
-        SyncCall(handler, [&callback](fit::function<void()> received_callback) {
-          callback = std::move(received_callback);
-        }));
-    ended = true;
-  });
-
-  EXPECT_FALSE(ended);
-  EXPECT_TRUE(callback);
-  callback = [] {};
-
-  EXPECT_TRUE(ended);
-}
-
-TEST(Coroutine, RunAndDroppedAsyncCallAfterCoroutineDeletion) {
-  bool ended = false;
-  fit::function<void()> callback;
-  {
-    CoroutineServiceImpl coroutine_service;
-
-    coroutine_service.StartCoroutine([&ended,
-                                      &callback](CoroutineHandler* handler) {
-      EXPECT_EQ(ContinuationStatus::INTERRUPTED,
-                SyncCall(handler,
-                         [&callback](fit::function<void()> received_callback) {
-                           callback = std::move(received_callback);
-                         }));
-      ended = true;
-    });
-
-    EXPECT_FALSE(ended);
-    EXPECT_TRUE(callback);
-  }
-
-  EXPECT_TRUE(ended);
-  callback();
-}
-
-TEST(Coroutine, Interrupt) {
-  ContinuationStatus status = ContinuationStatus::OK;
-
-  {
-    CoroutineServiceImpl coroutine_service;
-
-    coroutine_service.StartCoroutine([&status](CoroutineHandler* handler) {
-      UseStack();
-      status = handler->Yield();
-      UseStack();
-    });
-
-    EXPECT_EQ(ContinuationStatus::OK, status);
-  }
-
-  EXPECT_EQ(ContinuationStatus::INTERRUPTED, status);
-}
-
-#if !__has_feature(address_sanitizer)
-TEST(Coroutine, ReuseStack) {
-  CoroutineServiceImpl coroutine_service;
-  CoroutineHandler* handler = nullptr;
-  uintptr_t stack_pointer = 0;
-  size_t nb_coroutines_calls = 0;
-
-  for (size_t i = 0; i < 2; ++i) {
-    coroutine_service.StartCoroutine(
-        [&handler, &stack_pointer,
-         &nb_coroutines_calls](CoroutineHandler* called_handler) {
-          UseStack();
-          int a;
-          uintptr_t addr = reinterpret_cast<uintptr_t>(&a);
-          if (stack_pointer == 0) {
-            stack_pointer = addr;
-          }
-          EXPECT_EQ(addr, stack_pointer);
-          handler = called_handler;
-          EXPECT_EQ(ContinuationStatus::OK, called_handler->Yield());
-          UseStack();
-
-          ++nb_coroutines_calls;
-        });
-    handler->Resume(ContinuationStatus::OK);
-  }
-
-  EXPECT_EQ(2u, nb_coroutines_calls);
-}
-#endif  // !__has_feature(address_sanitizer)
-
-TEST(Coroutine, ResumeCoroutineInOtherCoroutineDestructor) {
-  CoroutineServiceImpl coroutine_service;
-  CoroutineHandler* handler1 = nullptr;
-  CoroutineHandler* handler2 = nullptr;
-  bool routine1_done = false;
-  bool routine2_done = false;
-
-  coroutine_service.StartCoroutine([&](CoroutineHandler* local_handler1) {
-    handler1 = local_handler1;
-    auto autocall =
-        fit::defer([&] { handler1->Resume(ContinuationStatus::OK); });
-    coroutine_service.StartCoroutine(
-        [&handler2, &routine2_done,
-         autocall = std::move(autocall)](CoroutineHandler* local_handler2) {
-          handler2 = local_handler2;
-          EXPECT_EQ(ContinuationStatus::OK, handler2->Yield());
-          routine2_done = true;
-        });
-    EXPECT_EQ(ContinuationStatus::OK, handler1->Yield());
-    routine1_done = true;
-  });
-
-  handler2->Resume(ContinuationStatus::OK);
-
-  EXPECT_TRUE(routine1_done);
-  EXPECT_TRUE(routine2_done);
-}
-
-TEST(Coroutine, AsyncCallCapture) {
-  CoroutineServiceImpl coroutine_service;
-
-  fit::function<void(size_t)> callback;
-  auto callable = [&callback](fit::function<void(size_t)> called_callback) {
-    callback = std::move(called_callback);
-  };
-
-  size_t value = 0;
-  CoroutineHandler* coroutine_handler;
-  coroutine_service.StartCoroutine(
-      [callable, &coroutine_handler, &value](CoroutineHandler* handler) {
-        coroutine_handler = handler;
-        EXPECT_EQ(ContinuationStatus::INTERRUPTED,
-                  SyncCall(handler, callable, &value));
-        return;
-      });
-
-  EXPECT_TRUE(callback);
-
-  coroutine_handler->Resume(ContinuationStatus::INTERRUPTED);
-
-  callback(10);
-
-  EXPECT_EQ(0u, value);
-}
-
-}  // namespace
-}  // namespace coroutine
diff --git a/bin/ledger/coroutine/coroutine_waiter.h b/bin/ledger/coroutine/coroutine_waiter.h
deleted file mode 100644
index 349445a..0000000
--- a/bin/ledger/coroutine/coroutine_waiter.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_WAITER_H_
-#define PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_WAITER_H_
-
-#include <utility>
-
-#include <lib/fxl/compiler_specific.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-
-// Utilities to interact with coroutines and callback::Waiter.
-
-namespace coroutine {
-
-// Wait on a callback::Waiter (and other waiter utilities). This method will
-// interrupt the coroutine until the finalizer of the waiter is executed. The
-// results of the waiter will be stored in |parameters|. If |Wait| returns
-// |INTERRUPTED|, the coroutine must unwind its stack and terminate.
-
-template <typename A, typename... Args>
-FXL_WARN_UNUSED_RESULT ContinuationStatus
-Wait(coroutine::CoroutineHandler* handler, A waiter, Args... parameters) {
-  return coroutine::SyncCall(handler,
-                             [waiter = std::move(waiter)](auto callback) {
-                               waiter->Finalize(std::move(callback));
-                             },
-                             std::forward<Args>(parameters)...);
-}
-
-}  // namespace coroutine
-
-#endif  // PERIDOT_BIN_LEDGER_COROUTINE_COROUTINE_WAITER_H_
diff --git a/bin/ledger/coroutine/coroutine_waiter_unittest.cc b/bin/ledger/coroutine/coroutine_waiter_unittest.cc
deleted file mode 100644
index 9585049..0000000
--- a/bin/ledger/coroutine/coroutine_waiter_unittest.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/coroutine/coroutine_waiter.h"
-
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-
-namespace coroutine {
-namespace {
-TEST(CoroutineWaiterTest, Wait) {
-  CoroutineServiceImpl coroutine_service;
-
-  fit::closure on_done;
-  coroutine_service.StartCoroutine([&](CoroutineHandler* current_handler) {
-    auto waiter = fxl::MakeRefCounted<callback::CompletionWaiter>();
-    on_done = waiter->NewCallback();
-    EXPECT_EQ(ContinuationStatus::OK, Wait(current_handler, std::move(waiter)));
-  });
-
-  on_done();
-}
-}  // namespace
-}  // namespace coroutine
diff --git a/bin/ledger/encryption/BUILD.gn b/bin/ledger/encryption/BUILD.gn
deleted file mode 100644
index f7eb456..0000000
--- a/bin/ledger/encryption/BUILD.gn
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("encryption") {
-  deps = [
-    "//peridot/bin/ledger/encryption/impl",
-    "//peridot/bin/ledger/encryption/public",
-  ]
-}
diff --git a/bin/ledger/encryption/fake/BUILD.gn b/bin/ledger/encryption/fake/BUILD.gn
deleted file mode 100644
index 1f269d7..0000000
--- a/bin/ledger/encryption/fake/BUILD.gn
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("fake") {
-  testonly = true
-
-  sources = [
-    "fake_encryption_service.cc",
-    "fake_encryption_service.h",
-    "fake_encryption_service_factory.cc",
-    "fake_encryption_service_factory.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/encryption/public",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/encryption/fake/fake_encryption_service.cc b/bin/ledger/encryption/fake/fake_encryption_service.cc
deleted file mode 100644
index 53db8da..0000000
--- a/bin/ledger/encryption/fake/fake_encryption_service.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-
-#include <lib/async/cpp/task.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/strings/concatenate.h>
-
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-namespace encryption {
-
-namespace {
-std::string Encode(fxl::StringView content) {
-  return "_" + content.ToString() + "_";
-}
-
-std::string Decode(fxl::StringView encrypted_content) {
-  return encrypted_content.substr(1, encrypted_content.size() - 2).ToString();
-}
-}  // namespace
-
-storage::ObjectIdentifier MakeDefaultObjectIdentifier(
-    storage::ObjectDigest digest) {
-  return {1u, 1u, std::move(digest)};
-}
-
-FakeEncryptionService::FakeEncryptionService(async_dispatcher_t* dispatcher)
-    : dispatcher_(dispatcher) {}
-
-FakeEncryptionService::~FakeEncryptionService() {}
-
-storage::ObjectIdentifier FakeEncryptionService::MakeObjectIdentifier(
-    storage::ObjectDigest digest) {
-  return MakeDefaultObjectIdentifier(std::move(digest));
-}
-
-void FakeEncryptionService::EncryptCommit(
-    std::string commit_storage,
-    fit::function<void(Status, std::string)> callback) {
-  std::string encrypted_commit = EncryptCommitSynchronous(commit_storage);
-  async::PostTask(dispatcher_, [encrypted_commit = std::move(encrypted_commit),
-                                callback = std::move(callback)]() mutable {
-    callback(Status::OK, std::move(encrypted_commit));
-  });
-}
-
-void FakeEncryptionService::DecryptCommit(
-    convert::ExtendedStringView storage_bytes,
-    fit::function<void(Status, std::string)> callback) {
-  std::string commit = DecryptCommitSynchronous(storage_bytes);
-  async::PostTask(dispatcher_, [commit = std::move(commit),
-                                callback = std::move(callback)]() mutable {
-    callback(Status::OK, std::move(commit));
-  });
-}
-
-void FakeEncryptionService::GetObjectName(
-    storage::ObjectIdentifier object_identifier,
-    fit::function<void(Status, std::string)> callback) {
-  std::string result = GetObjectNameSynchronous(object_identifier);
-  async::PostTask(dispatcher_, [callback = std::move(callback),
-                                result = std::move(result)]() mutable {
-    callback(Status::OK, std::move(result));
-  });
-}
-
-void FakeEncryptionService::EncryptObject(
-    storage::ObjectIdentifier /*object_identifier*/, fsl::SizedVmo content,
-    fit::function<void(Status, std::string)> callback) {
-  std::string content_as_string;
-  if (!fsl::StringFromVmo(content, &content_as_string)) {
-    callback(Status::IO_ERROR, "");
-    return;
-  }
-  std::string result = EncryptObjectSynchronous(content_as_string);
-  async::PostTask(dispatcher_, [callback = std::move(callback),
-                                result = std::move(result)]() mutable {
-    callback(Status::OK, std::move(result));
-  });
-}
-
-void FakeEncryptionService::DecryptObject(
-    storage::ObjectIdentifier /*object_identifier*/, std::string encrypted_data,
-    fit::function<void(Status, std::string)> callback) {
-  std::string result = DecryptObjectSynchronous(encrypted_data);
-  async::PostTask(dispatcher_, [callback = std::move(callback),
-                                result = std::move(result)]() mutable {
-    callback(Status::OK, std::move(result));
-  });
-}
-
-std::string FakeEncryptionService::EncryptCommitSynchronous(
-    convert::ExtendedStringView commit_storage) {
-  return Encode(commit_storage);
-}
-
-std::string FakeEncryptionService::DecryptCommitSynchronous(
-    convert::ExtendedStringView storage_bytes) {
-  return Decode(storage_bytes);
-}
-
-std::string FakeEncryptionService::GetObjectNameSynchronous(
-    storage::ObjectIdentifier object_identifier) {
-  return Encode(object_identifier.object_digest().Serialize());
-}
-
-std::string FakeEncryptionService::EncryptObjectSynchronous(
-    convert::ExtendedStringView object_content) {
-  return Encode(object_content);
-}
-
-std::string FakeEncryptionService::DecryptObjectSynchronous(
-    convert::ExtendedStringView encrypted_data) {
-  return Decode(encrypted_data);
-}
-
-}  // namespace encryption
diff --git a/bin/ledger/encryption/fake/fake_encryption_service.h b/bin/ledger/encryption/fake/fake_encryption_service.h
deleted file mode 100644
index db86231..0000000
--- a/bin/ledger/encryption/fake/fake_encryption_service.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENCRYPTION_FAKE_FAKE_ENCRYPTION_SERVICE_H_
-#define PERIDOT_BIN_LEDGER_ENCRYPTION_FAKE_FAKE_ENCRYPTION_SERVICE_H_
-
-#include <functional>
-#include <string>
-
-#include <lib/async/dispatcher.h>
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace encryption {
-
-// Creates an |ObjectIdentifier| from an |ObjectDigest|.
-//
-// This method is always constructing the indentifier with the same key index
-// and deletion scope.
-storage::ObjectIdentifier MakeDefaultObjectIdentifier(
-    storage::ObjectDigest digest);
-
-class FakeEncryptionService : public EncryptionService {
- public:
-  explicit FakeEncryptionService(async_dispatcher_t* dispatcher);
-  ~FakeEncryptionService() override;
-
-  // EncryptionService:
-  storage::ObjectIdentifier MakeObjectIdentifier(
-      storage::ObjectDigest digest) override;
-  void EncryptCommit(
-      std::string commit_storage,
-      fit::function<void(Status, std::string)> callback) override;
-  void DecryptCommit(
-      convert::ExtendedStringView storage_bytes,
-      fit::function<void(Status, std::string)> callback) override;
-  void GetObjectName(
-      storage::ObjectIdentifier object_identifier,
-      fit::function<void(Status, std::string)> callback) override;
-  void EncryptObject(
-      storage::ObjectIdentifier object_identifier, fsl::SizedVmo content,
-      fit::function<void(Status, std::string)> callback) override;
-  void DecryptObject(
-      storage::ObjectIdentifier object_identifier, std::string encrypted_data,
-      fit::function<void(Status, std::string)> callback) override;
-
-  // Synchronously encrypts the given commit.
-  std::string EncryptCommitSynchronous(
-      convert::ExtendedStringView commit_storage);
-
-  // Synchronously decrypts the given commit.
-  std::string DecryptCommitSynchronous(
-      convert::ExtendedStringView storage_bytes);
-
-  // Synchronously gets the object name.
-  std::string GetObjectNameSynchronous(
-      storage::ObjectIdentifier object_identifier);
-
-  // Synchronously encrypts the object.
-  std::string EncryptObjectSynchronous(
-      convert::ExtendedStringView object_content);
-
-  // Synchronously decrypts the object.
-  std::string DecryptObjectSynchronous(
-      convert::ExtendedStringView encrypted_data);
-
- private:
-  async_dispatcher_t* dispatcher_;
-};
-
-}  // namespace encryption
-
-#endif  // PERIDOT_BIN_LEDGER_ENCRYPTION_FAKE_FAKE_ENCRYPTION_SERVICE_H_
diff --git a/bin/ledger/encryption/fake/fake_encryption_service_factory.cc b/bin/ledger/encryption/fake/fake_encryption_service_factory.cc
deleted file mode 100644
index 0abe83b..0000000
--- a/bin/ledger/encryption/fake/fake_encryption_service_factory.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service_factory.h"
-
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-
-namespace encryption {
-
-FakeEncryptionServiceFactory::FakeEncryptionServiceFactory(
-    async_dispatcher_t* dispatcher)
-    : dispatcher_(dispatcher) {}
-
-FakeEncryptionServiceFactory::~FakeEncryptionServiceFactory() {}
-
-std::unique_ptr<EncryptionService>
-FakeEncryptionServiceFactory::MakeEncryptionService(
-    std::string /*namespace_id*/) {
-  return std::make_unique<FakeEncryptionService>(dispatcher_);
-}
-
-}  // namespace encryption
diff --git a/bin/ledger/encryption/fake/fake_encryption_service_factory.h b/bin/ledger/encryption/fake/fake_encryption_service_factory.h
deleted file mode 100644
index 4237c56..0000000
--- a/bin/ledger/encryption/fake/fake_encryption_service_factory.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENCRYPTION_FAKE_FAKE_ENCRYPTION_SERVICE_FACTORY_H_
-#define PERIDOT_BIN_LEDGER_ENCRYPTION_FAKE_FAKE_ENCRYPTION_SERVICE_FACTORY_H_
-
-#include <lib/async/dispatcher.h>
-
-#include "peridot/bin/ledger/encryption/public/encryption_service_factory.h"
-
-namespace encryption {
-class FakeEncryptionServiceFactory : public EncryptionServiceFactory {
- public:
-  explicit FakeEncryptionServiceFactory(async_dispatcher_t* dispatcher);
-  ~FakeEncryptionServiceFactory() override;
-
-  // EncryptionServiceFactory
-  std::unique_ptr<EncryptionService> MakeEncryptionService(
-      std::string namespace_id) override;
-
- private:
-  async_dispatcher_t* dispatcher_;
-};
-}  // namespace encryption
-
-#endif  // PERIDOT_BIN_LEDGER_ENCRYPTION_FAKE_FAKE_ENCRYPTION_SERVICE_FACTORY_H_
diff --git a/bin/ledger/encryption/impl/BUILD.gn b/bin/ledger/encryption/impl/BUILD.gn
deleted file mode 100644
index 52d1337..0000000
--- a/bin/ledger/encryption/impl/BUILD.gn
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/flatbuffers/flatbuffer.gni")
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("impl") {
-  sources = [
-    "encryption_service_factory_impl.cc",
-    "encryption_service_factory_impl.h",
-    "encryption_service_impl.cc",
-    "encryption_service_impl.h",
-  ]
-
-  deps = [
-    ":encrypted_commit",
-    "//garnet/public/lib/callback",
-    "//peridot/bin/ledger/cache",
-    "//peridot/bin/ledger/encryption/primitives",
-    "//peridot/bin/ledger/environment",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/encryption/public",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-flatbuffer("encrypted_commit") {
-  sources = [
-    "encrypted_commit.fbs",
-  ]
-
-  extra_configs = [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "encryption_service_factory_impl_unittest.cc",
-    "encryption_service_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":impl",
-    "//garnet/public/lib/callback",
-    "//peridot/bin/ledger/storage/fake:lib",
-    "//peridot/bin/ledger/testing:lib",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/encryption/impl/encrypted_commit.fbs b/bin/ledger/encryption/impl/encrypted_commit.fbs
deleted file mode 100644
index 31eb7c9..0000000
--- a/bin/ledger/encryption/impl/encrypted_commit.fbs
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-namespace encryption;
-
-table EncryptedCommitStorage {
-  key_index: uint;
-  serialized_encrypted_commit_storage: [ubyte];
-}
-
-root_type EncryptedCommitStorage;
diff --git a/bin/ledger/encryption/impl/encryption_service_factory_impl.cc b/bin/ledger/encryption/impl/encryption_service_factory_impl.cc
deleted file mode 100644
index 5459531..0000000
--- a/bin/ledger/encryption/impl/encryption_service_factory_impl.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/impl/encryption_service_factory_impl.h"
-
-#include "peridot/bin/ledger/encryption/impl/encryption_service_impl.h"
-
-namespace encryption {
-
-EncryptionServiceFactoryImpl::EncryptionServiceFactoryImpl(
-    ledger::Environment* environment)
-    : environment_(environment) {}
-
-EncryptionServiceFactoryImpl::~EncryptionServiceFactoryImpl() {}
-
-std::unique_ptr<EncryptionService>
-EncryptionServiceFactoryImpl::MakeEncryptionService(std::string namespace_id) {
-  return std::make_unique<EncryptionServiceImpl>(environment_,
-                                                 std::move(namespace_id));
-}
-
-}  // namespace encryption
diff --git a/bin/ledger/encryption/impl/encryption_service_factory_impl.h b/bin/ledger/encryption/impl/encryption_service_factory_impl.h
deleted file mode 100644
index f84cf3a..0000000
--- a/bin/ledger/encryption/impl/encryption_service_factory_impl.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENCRYPTION_IMPL_ENCRYPTION_SERVICE_FACTORY_IMPL_H_
-#define PERIDOT_BIN_LEDGER_ENCRYPTION_IMPL_ENCRYPTION_SERVICE_FACTORY_IMPL_H_
-
-#include "peridot/bin/ledger/encryption/public/encryption_service_factory.h"
-#include "peridot/bin/ledger/environment/environment.h"
-
-namespace encryption {
-class EncryptionServiceFactoryImpl : public EncryptionServiceFactory {
- public:
-  explicit EncryptionServiceFactoryImpl(ledger::Environment* environment);
-  ~EncryptionServiceFactoryImpl() override;
-
-  // EncryptionServiceFactory
-  std::unique_ptr<EncryptionService> MakeEncryptionService(
-      std::string namespace_id) override;
-
- private:
-  ledger::Environment* const environment_;
-};
-}  // namespace encryption
-
-#endif  // PERIDOT_BIN_LEDGER_ENCRYPTION_IMPL_ENCRYPTION_SERVICE_FACTORY_IMPL_H_
diff --git a/bin/ledger/encryption/impl/encryption_service_factory_impl_unittest.cc b/bin/ledger/encryption/impl/encryption_service_factory_impl_unittest.cc
deleted file mode 100644
index 7c57190..0000000
--- a/bin/ledger/encryption/impl/encryption_service_factory_impl_unittest.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/impl/encryption_service_factory_impl.h"
-
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-
-#include "gtest/gtest.h"
-
-namespace encryption {
-namespace {
-
-using EncryptionServiceFactoryTest = ledger::TestWithEnvironment;
-
-TEST_F(EncryptionServiceFactoryTest, MakeEncryptionService) {
-  EncryptionServiceFactoryImpl factory(&environment_);
-  EXPECT_TRUE(factory.MakeEncryptionService("namespace_id"));
-}
-
-}  // namespace
-}  // namespace encryption
diff --git a/bin/ledger/encryption/impl/encryption_service_impl.cc b/bin/ledger/encryption/impl/encryption_service_impl.cc
deleted file mode 100644
index e27597e..0000000
--- a/bin/ledger/encryption/impl/encryption_service_impl.cc
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/impl/encryption_service_impl.h"
-
-#include <flatbuffers/flatbuffers.h>
-#include <lib/async/cpp/task.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <lib/fxl/strings/concatenate.h>
-
-#include "peridot/bin/ledger/encryption/impl/encrypted_commit_generated.h"
-#include "peridot/bin/ledger/encryption/primitives/encrypt.h"
-#include "peridot/bin/ledger/encryption/primitives/kdf.h"
-
-namespace encryption {
-namespace {
-
-// The default encryption values. Only used until real encryption is
-// implemented: LE-286
-//
-// Use max_int32 for key_index as it will never be used in practice as it is not
-// expected that any user will change its key 2^32 times.
-constexpr uint32_t kDefaultKeyIndex = std::numeric_limits<uint32_t>::max();
-// Use max_int32 - 1 for default deletion scoped id. max_int32 has a special
-// meaning in the specification and is used to have per object deletion scope.
-constexpr uint32_t kDefaultDeletionScopeId =
-    std::numeric_limits<uint32_t>::max() - 1;
-// Special deletion scope id that produces a per-object deletion scope.
-constexpr uint32_t kPerObjectDeletionScopedId =
-    std::numeric_limits<uint32_t>::max();
-
-// Size of keys. Key must have 128 bits of entropy. Randomly generated keys can
-// be 128 bits long, but derived ones need to be twice as big because of the
-// birthday paradox.
-// Size of the randomly generated key.
-constexpr size_t kRandomlyGeneratedKeySize = 16u;
-// Size of the derived keys.
-constexpr size_t kDerivedKeySize = 32u;
-
-// Cache size values.
-constexpr size_t kKeyIndexCacheSize = 10u;
-constexpr size_t kReferenceKeysCacheSize = 10u;
-
-// Checks whether the given |storage_bytes| are a valid serialization of an
-// encrypted commit.
-bool CheckValidSerialization(fxl::StringView storage_bytes) {
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(storage_bytes.data()),
-      storage_bytes.size());
-
-  return VerifyEncryptedCommitStorageBuffer(verifier);
-}
-
-}  // namespace
-
-// Fake implementation of a key service for the Ledger.
-//
-// This implementation generate fake keys and will need to be replaced by a
-// real component.
-class EncryptionServiceImpl::KeyService {
- public:
-  explicit KeyService(async_dispatcher_t* dispatcher)
-      : dispatcher_(dispatcher), weak_factory_(this) {}
-
-  // Retrieves the master key.
-  void GetMasterKey(uint32_t key_index,
-                    fit::function<void(std::string)> callback) {
-    async::PostTask(dispatcher_,
-                    callback::MakeScoped(
-                        weak_factory_.GetWeakPtr(),
-                        [key_index, callback = std::move(callback)]() {
-                          std::string master_key(16u, 0);
-                          memcpy(&master_key[0], &key_index, sizeof(key_index));
-                          callback(std::move(master_key));
-                        }));
-  }
-
-  // Retrieves the reference key associated to the given namespace and reference
-  // key. If the id is not yet associated with a reference key, generates a new
-  // one and associates it with the id before returning.
-  void GetReferenceKey(const std::string& namespace_id,
-                       const std::string& reference_key_id,
-                       fit::function<void(const std::string&)> callback) {
-    std::string result =
-        HMAC256KDF(fxl::Concatenate({namespace_id, reference_key_id}),
-                   kRandomlyGeneratedKeySize);
-    async::PostTask(
-        dispatcher_,
-        callback::MakeScoped(
-            weak_factory_.GetWeakPtr(),
-            [result = std::move(result),
-             callback = std::move(callback)]() mutable { callback(result); }));
-  }
-
- private:
-  async_dispatcher_t* const dispatcher_;
-  fxl::WeakPtrFactory<EncryptionServiceImpl::KeyService> weak_factory_;
-};
-
-EncryptionServiceImpl::EncryptionServiceImpl(ledger::Environment* environment,
-                                             std::string namespace_id)
-    : environment_(environment),
-      namespace_id_(std::move(namespace_id)),
-      key_service_(std::make_unique<KeyService>(environment_->dispatcher())),
-      master_keys_(kKeyIndexCacheSize, Status::OK,
-                   [this](auto k, auto c) {
-                     FetchMasterKey(std::move(k), std::move(c));
-                   }),
-      namespace_keys_(kKeyIndexCacheSize, Status::OK,
-                      [this](auto k, auto c) {
-                        FetchNamespaceKey(std::move(k), std::move(c));
-                      }),
-      reference_keys_(kReferenceKeysCacheSize, Status::OK,
-                      [this](auto k, auto c) {
-                        FetchReferenceKey(std::move(k), std::move(c));
-                      }) {}
-
-EncryptionServiceImpl::~EncryptionServiceImpl() {}
-
-storage::ObjectIdentifier EncryptionServiceImpl::MakeObjectIdentifier(
-    storage::ObjectDigest digest) {
-  return {GetCurrentKeyIndex(), kDefaultDeletionScopeId, std::move(digest)};
-}
-
-void EncryptionServiceImpl::EncryptCommit(
-    std::string commit_storage,
-    fit::function<void(Status, std::string)> callback) {
-  size_t key_index = GetCurrentKeyIndex();
-
-  Encrypt(key_index, std::move(commit_storage),
-          [key_index, callback = std::move(callback)](
-              Status status, std::string encrypted_storage) {
-            if (status != Status::OK) {
-              callback(status, "");
-              return;
-            }
-
-            flatbuffers::FlatBufferBuilder builder;
-
-            auto storage = CreateEncryptedCommitStorage(
-                builder, key_index,
-                convert::ToFlatBufferVector(&builder, encrypted_storage));
-            builder.Finish(storage);
-            callback(Status::OK, std::string(reinterpret_cast<const char*>(
-                                                 builder.GetBufferPointer()),
-                                             builder.GetSize()));
-          });
-}
-
-void EncryptionServiceImpl::DecryptCommit(
-    convert::ExtendedStringView storage_bytes,
-    fit::function<void(Status, std::string)> callback) {
-  if (!CheckValidSerialization(storage_bytes)) {
-    FXL_LOG(WARNING) << "Received invalid data. Cannot decrypt commit.";
-    callback(Status::INVALID_ARGUMENT, "");
-    return;
-  }
-
-  const EncryptedCommitStorage* encrypted_commit_storage =
-      GetEncryptedCommitStorage(storage_bytes.data());
-
-  Decrypt(encrypted_commit_storage->key_index(),
-          convert::ToString(
-              encrypted_commit_storage->serialized_encrypted_commit_storage()),
-          std::move(callback));
-}
-
-void EncryptionServiceImpl::GetObjectName(
-    storage::ObjectIdentifier object_identifier,
-    fit::function<void(Status, std::string)> callback) {
-  GetReferenceKey(object_identifier, [object_identifier,
-                                      callback = std::move(callback)](
-                                         const std::string& reference_key) {
-    callback(Status::OK,
-             HMAC256KDF(fxl::Concatenate(
-                            {reference_key,
-                             object_identifier.object_digest().Serialize()}),
-                        kDerivedKeySize));
-  });
-}
-
-void EncryptionServiceImpl::EncryptObject(
-    storage::ObjectIdentifier object_identifier, fsl::SizedVmo content,
-    fit::function<void(Status, std::string)> callback) {
-  std::string data;
-  if (!fsl::StringFromVmo(content, &data)) {
-    callback(Status::IO_ERROR, "");
-    return;
-  }
-  Encrypt(object_identifier.key_index(), std::move(data), std::move(callback));
-}
-
-void EncryptionServiceImpl::DecryptObject(
-    storage::ObjectIdentifier object_identifier, std::string encrypted_data,
-    fit::function<void(Status, std::string)> callback) {
-  Decrypt(object_identifier.key_index(), std::move(encrypted_data),
-          std::move(callback));
-}
-
-uint32_t EncryptionServiceImpl::GetCurrentKeyIndex() {
-  return kDefaultKeyIndex;
-}
-
-void EncryptionServiceImpl::GetReferenceKey(
-    storage::ObjectIdentifier object_identifier,
-    fit::function<void(const std::string&)> callback) {
-  std::string deletion_scope_seed;
-  if (object_identifier.deletion_scope_id() == kPerObjectDeletionScopedId) {
-    deletion_scope_seed = object_identifier.object_digest().Serialize();
-  } else {
-    const uint32_t deletion_scope_id = object_identifier.deletion_scope_id();
-    deletion_scope_seed =
-        std::string(reinterpret_cast<const char*>(&deletion_scope_id),
-                    sizeof(deletion_scope_id));
-  }
-  DeletionScopeSeed seed = {object_identifier.key_index(),
-                            std::move(deletion_scope_seed)};
-  reference_keys_.Get(
-      seed, [callback = std::move(callback)](
-                Status status, const std::string& value) { callback(value); });
-}
-
-void EncryptionServiceImpl::Encrypt(
-    size_t key_index, std::string data,
-    fit::function<void(Status, std::string)> callback) {
-  master_keys_.Get(
-      key_index,
-      [environment = environment_, data = std::move(data),
-       callback = std::move(callback)](Status status, const std::string& key) {
-        if (status != Status::OK) {
-          callback(status, "");
-          return;
-        }
-        std::string encrypted_data;
-        if (!AES128GCMSIVEncrypt(environment->random(), key, data,
-                                 &encrypted_data)) {
-          callback(Status::INTERNAL_ERROR, "");
-          return;
-        }
-        callback(Status::OK, std::move(encrypted_data));
-      });
-}
-
-void EncryptionServiceImpl::Decrypt(
-    size_t key_index, std::string encrypted_data,
-    fit::function<void(Status, std::string)> callback) {
-  master_keys_.Get(key_index, [encrypted_data = std::move(encrypted_data),
-                               callback = std::move(callback)](
-                                  Status status, const std::string& key) {
-    if (status != Status::OK) {
-      callback(status, "");
-      return;
-    }
-    std::string data;
-    if (!AES128GCMSIVDecrypt(key, encrypted_data, &data)) {
-      callback(Status::INTERNAL_ERROR, "");
-      return;
-    }
-    callback(Status::OK, std::move(data));
-  });
-}
-
-void EncryptionServiceImpl::FetchMasterKey(
-    size_t key_index, fit::function<void(Status, std::string)> callback) {
-  key_service_->GetMasterKey(
-      key_index, [callback = std::move(callback)](std::string master_key) {
-        callback(Status::OK, std::move(master_key));
-      });
-}
-
-void EncryptionServiceImpl::FetchNamespaceKey(
-    size_t key_index, fit::function<void(Status, std::string)> callback) {
-  master_keys_.Get(
-      key_index, [this, callback = std::move(callback)](
-                     Status status, const std::string& master_key) {
-        if (status != Status::OK) {
-          callback(status, "");
-          return;
-        }
-        callback(Status::OK,
-                 HMAC256KDF(fxl::Concatenate({master_key, namespace_id_}),
-                            kDerivedKeySize));
-      });
-}
-
-void EncryptionServiceImpl::FetchReferenceKey(
-    DeletionScopeSeed deletion_scope_seed,
-    fit::function<void(Status, std::string)> callback) {
-  namespace_keys_.Get(
-      deletion_scope_seed.first,
-      [this, deletion_scope_seed = std::move(deletion_scope_seed),
-       callback = std::move(callback)](
-          Status status, const std::string& namespace_key) mutable {
-        if (status != Status::OK) {
-          callback(status, "");
-          return;
-        }
-        key_service_->GetReferenceKey(
-            namespace_id_,
-            HMAC256KDF(
-                fxl::Concatenate({namespace_key, deletion_scope_seed.second}),
-                kDerivedKeySize),
-            [callback = std::move(callback)](std::string reference_key) {
-              callback(Status::OK, std::move(reference_key));
-            });
-      });
-}
-
-}  // namespace encryption
diff --git a/bin/ledger/encryption/impl/encryption_service_impl.h b/bin/ledger/encryption/impl/encryption_service_impl.h
deleted file mode 100644
index 2614183..0000000
--- a/bin/ledger/encryption/impl/encryption_service_impl.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENCRYPTION_IMPL_ENCRYPTION_SERVICE_IMPL_H_
-#define PERIDOT_BIN_LEDGER_ENCRYPTION_IMPL_ENCRYPTION_SERVICE_IMPL_H_
-
-#include <functional>
-#include <string>
-
-#include <lib/async/dispatcher.h>
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/cache/lazy_value.h"
-#include "peridot/bin/ledger/cache/lru_cache.h"
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace encryption {
-
-class EncryptionServiceImpl : public EncryptionService {
- public:
-  EncryptionServiceImpl(ledger::Environment* environment,
-                        std::string namespace_id);
-  ~EncryptionServiceImpl() override;
-
-  // EncryptionService:
-  storage::ObjectIdentifier MakeObjectIdentifier(
-      storage::ObjectDigest digest) override;
-  void EncryptCommit(
-      std::string commit_storage,
-      fit::function<void(Status, std::string)> callback) override;
-  void DecryptCommit(
-      convert::ExtendedStringView storage_bytes,
-      fit::function<void(Status, std::string)> callback) override;
-  void GetObjectName(
-      storage::ObjectIdentifier object_identifier,
-      fit::function<void(Status, std::string)> callback) override;
-  void EncryptObject(
-      storage::ObjectIdentifier object_identifier, fsl::SizedVmo content,
-      fit::function<void(Status, std::string)> callback) override;
-  void DecryptObject(
-      storage::ObjectIdentifier object_identifier, std::string encrypted_data,
-      fit::function<void(Status, std::string)> callback) override;
-
- private:
-  class KeyService;
-  using DeletionScopeSeed = std::pair<size_t, std::string>;
-
-  uint32_t GetCurrentKeyIndex();
-  void GetReferenceKey(storage::ObjectIdentifier object_identifier,
-                       fit::function<void(const std::string&)> callback);
-
-  void Encrypt(size_t key_index, std::string data,
-               fit::function<void(Status, std::string)> callback);
-  void Decrypt(size_t key_index, std::string encrypted_data,
-               fit::function<void(Status, std::string)> callback);
-
-  void FetchMasterKey(size_t key_index,
-                      fit::function<void(Status, std::string)> callback);
-  void FetchNamespaceKey(size_t key_index,
-                         fit::function<void(Status, std::string)> callback);
-  void FetchReferenceKey(DeletionScopeSeed deletion_scope_seed,
-                         fit::function<void(Status, std::string)> callback);
-
-  ledger::Environment* const environment_;
-  const std::string namespace_id_;
-  std::unique_ptr<KeyService> key_service_;
-
-  // Master keys indexed by key_index.
-  cache::LRUCache<uint32_t, std::string, Status> master_keys_;
-  // Namespace keys indexed by key_index.
-  cache::LRUCache<uint32_t, std::string, Status> namespace_keys_;
-  // Reference keys indexed by deletion scope seed.
-  cache::LRUCache<DeletionScopeSeed, std::string, Status> reference_keys_;
-};
-
-}  // namespace encryption
-
-#endif  // PERIDOT_BIN_LEDGER_ENCRYPTION_IMPL_ENCRYPTION_SERVICE_IMPL_H_
diff --git a/bin/ledger/encryption/impl/encryption_service_impl_unittest.cc b/bin/ledger/encryption/impl/encryption_service_impl_unittest.cc
deleted file mode 100644
index e6fb450..0000000
--- a/bin/ledger/encryption/impl/encryption_service_impl_unittest.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/impl/encryption_service_impl.h"
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/storage/fake/fake_object.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-
-namespace encryption {
-namespace {
-
-class EncryptionServiceTest : public ledger::TestWithEnvironment {
- public:
-  EncryptionServiceTest()
-      : encryption_service_(&environment_, "namespace_id") {}
-
- protected:
-  void EncryptCommit(std::string commit_storage, Status* status,
-                     std::string* result) {
-    bool called;
-    encryption_service_.EncryptCommit(
-        commit_storage,
-        callback::Capture(callback::SetWhenCalled(&called), status, result));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-  }
-
-  void DecryptCommit(convert::ExtendedStringView encrypted_commit_storage,
-                     Status* status, std::string* result) {
-    bool called;
-    encryption_service_.DecryptCommit(
-        encrypted_commit_storage,
-        callback::Capture(callback::SetWhenCalled(&called), status, result));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-  }
-
-  void GetObjectName(storage::ObjectIdentifier object_identifier,
-                     Status* status, std::string* result) {
-    bool called;
-    encryption_service_.GetObjectName(
-        std::move(object_identifier),
-        callback::Capture(callback::SetWhenCalled(&called), status, result));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-  }
-
-  void EncryptObject(storage::ObjectIdentifier object_identifier,
-                     fsl::SizedVmo content, Status* status,
-                     std::string* result) {
-    bool called;
-    encryption_service_.EncryptObject(
-        std::move(object_identifier), std::move(content),
-        callback::Capture(callback::SetWhenCalled(&called), status, result));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-  }
-
-  void DecryptObject(storage::ObjectIdentifier object_identifier,
-                     std::string encrypted_data, Status* status,
-                     std::string* result) {
-    bool called;
-    encryption_service_.DecryptObject(
-        std::move(object_identifier), std::move(encrypted_data),
-        callback::Capture(callback::SetWhenCalled(&called), status, result));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-  }
-
-  EncryptionServiceImpl encryption_service_;
-};
-
-TEST_F(EncryptionServiceTest, EncryptDecryptCommit) {
-  std::string contents[] = {
-      "",
-      "Hello",
-      "0123456789012345678901234567890123456789012345678901234567890123456789",
-
-  };
-
-  for (const auto& content : contents) {
-    Status status;
-    std::string value;
-    EncryptCommit(content, &status, &value);
-    ASSERT_EQ(Status::OK, status);
-    DecryptCommit(value, &status, &value);
-    ASSERT_EQ(Status::OK, status);
-    EXPECT_EQ(content, value);
-  }
-}
-
-TEST_F(EncryptionServiceTest, GetName) {
-  storage::ObjectIdentifier identifier{
-      42u, 42u, storage::ObjectDigest(std::string(33u, '\0'))};
-  Status status;
-  std::string name;
-  GetObjectName(identifier, &status, &name);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(name.empty());
-}
-
-TEST_F(EncryptionServiceTest, EncryptDecryptObject) {
-  storage::ObjectIdentifier identifier{
-      42u, 42u, storage::ObjectDigest(std::string(33u, '\0'))};
-  std::string content(256u, '\0');
-  auto object =
-      std::make_unique<storage::fake::FakeObject>(identifier, content);
-  fsl::SizedVmo content_vmo;
-  ASSERT_EQ(storage::Status::OK, object->GetVmo(&content_vmo));
-
-  Status status;
-  std::string encrypted_bytes;
-  EncryptObject(object->GetIdentifier(), std::move(content_vmo), &status,
-                &encrypted_bytes);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(encrypted_bytes.empty());
-
-  std::string decrypted_bytes;
-  DecryptObject(identifier, encrypted_bytes, &status, &decrypted_bytes);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(content, decrypted_bytes);
-}
-
-}  // namespace
-}  // namespace encryption
diff --git a/bin/ledger/encryption/primitives/BUILD.gn b/bin/ledger/encryption/primitives/BUILD.gn
deleted file mode 100644
index efe990b..0000000
--- a/bin/ledger/encryption/primitives/BUILD.gn
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("primitives") {
-  sources = [
-    "encrypt.cc",
-    "encrypt.h",
-    "hash.cc",
-    "hash.h",
-    "hmac.cc",
-    "hmac.h",
-    "kdf.cc",
-    "kdf.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/rng",
-    "//peridot/third_party/modp_b64",
-    "//third_party/boringssl",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-  sources = [
-    "crypto_test_util.cc",
-    "encrypt_unittest.cc",
-    "hmac_unittest.cc",
-    "kdf_unittest.cc",
-  ]
-
-  deps = [
-    ":primitives",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/rng:testing",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/encryption/primitives/crypto_test_util.cc b/bin/ledger/encryption/primitives/crypto_test_util.cc
deleted file mode 100644
index c4b671e..0000000
--- a/bin/ledger/encryption/primitives/crypto_test_util.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/primitives/crypto_test_util.h"
-
-#include <lib/fxl/strings/string_number_conversions.h>
-
-namespace encryption {
-
-std::string FromHex(fxl::StringView data) {
-  std::string result;
-  result.reserve(data.size() / 2);
-  while (!data.empty()) {
-    result.push_back(
-        fxl::StringToNumber<uint8_t>(data.substr(0, 2), fxl::Base::k16));
-    data = data.substr(2);
-  }
-  return result;
-}
-
-}  // namespace encryption
diff --git a/bin/ledger/encryption/primitives/crypto_test_util.h b/bin/ledger/encryption/primitives/crypto_test_util.h
deleted file mode 100644
index 3056d7e..0000000
--- a/bin/ledger/encryption/primitives/crypto_test_util.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_CRYPTO_TEST_UTIL_H_
-#define PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_CRYPTO_TEST_UTIL_H_
-
-#include <string>
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace encryption {
-std::string FromHex(fxl::StringView data);
-}
-
-#endif  // PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_CRYPTO_TEST_UTIL_H_
diff --git a/bin/ledger/encryption/primitives/encrypt.cc b/bin/ledger/encryption/primitives/encrypt.cc
deleted file mode 100644
index d56910a..0000000
--- a/bin/ledger/encryption/primitives/encrypt.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/primitives/encrypt.h"
-
-#include <openssl/aead.h>
-#include <zircon/syscalls.h>
-
-namespace encryption {
-
-bool AES128GCMSIVEncrypt(rng::Random* random, fxl::StringView key,
-                         fxl::StringView data, std::string* output) {
-  if (key.size() != 16) {
-    return false;
-  }
-
-  const EVP_AEAD* algorithm = EVP_aead_aes_128_gcm_siv();
-
-  const size_t kNonceOffset = 0;
-  const size_t kNonceSize = EVP_AEAD_nonce_length(algorithm);
-  const size_t kTagOffset = kNonceOffset + kNonceSize;
-  const size_t kTagSize = EVP_AEAD_max_tag_len(algorithm);
-  const size_t kEncryptedDataOffset = kTagOffset + kTagSize;
-
-  bssl::ScopedEVP_AEAD_CTX ctx;
-  if (!EVP_AEAD_CTX_init_with_direction(
-          ctx.get(), algorithm, reinterpret_cast<const uint8_t*>(key.data()),
-          key.size(), EVP_AEAD_DEFAULT_TAG_LENGTH, evp_aead_seal)) {
-    return false;
-  }
-  std::string result;
-  result.resize(kEncryptedDataOffset + data.size() +
-                EVP_AEAD_max_overhead(algorithm));
-  uint8_t* result_as_int8_ptr = reinterpret_cast<uint8_t*>(&result[0]);
-
-  // Generate seed.
-  random->Draw(&result[0], EVP_AEAD_nonce_length(algorithm));
-
-  size_t out_len;
-  if (EVP_AEAD_CTX_seal(
-          ctx.get(), &result_as_int8_ptr[kEncryptedDataOffset], &out_len,
-          data.size() + EVP_AEAD_max_overhead(algorithm),
-          &result_as_int8_ptr[kNonceOffset], kNonceSize,
-          reinterpret_cast<const uint8_t*>(data.data()), data.size(),
-          &result_as_int8_ptr[kTagOffset], kTagSize) == 0) {
-    return false;
-  }
-  result.resize(kEncryptedDataOffset + out_len);
-  output->swap(result);
-  return true;
-}
-
-bool AES128GCMSIVDecrypt(fxl::StringView key, fxl::StringView encrypted_data,
-                         std::string* output) {
-  if (key.size() != 16) {
-    return false;
-  }
-
-  const EVP_AEAD* algorithm = EVP_aead_aes_128_gcm_siv();
-
-  const size_t kNonceOffset = 0;
-  const size_t kNonceSize = EVP_AEAD_nonce_length(algorithm);
-  const size_t kTagOffset = kNonceOffset + kNonceSize;
-  const size_t kTagSize = EVP_AEAD_max_tag_len(algorithm);
-  const size_t kEncryptedDataOffset = kTagOffset + kTagSize;
-  if (encrypted_data.size() < kEncryptedDataOffset) {
-    return false;
-  }
-  const size_t kEncryptedDataSize =
-      encrypted_data.size() - kEncryptedDataOffset;
-
-  bssl::ScopedEVP_AEAD_CTX ctx;
-  if (!EVP_AEAD_CTX_init_with_direction(
-          ctx.get(), algorithm, reinterpret_cast<const uint8_t*>(key.data()),
-          key.size(), EVP_AEAD_DEFAULT_TAG_LENGTH, evp_aead_open)) {
-    return false;
-  }
-
-  const uint8_t* encrypted_data_as_uint8_ptr =
-      reinterpret_cast<const uint8_t*>(encrypted_data.data());
-
-  std::string result;
-  result.resize(kEncryptedDataSize);
-
-  size_t out_len;
-  if (EVP_AEAD_CTX_open(
-          ctx.get(), reinterpret_cast<uint8_t*>(&result[0]), &out_len,
-          result.size(), &encrypted_data_as_uint8_ptr[kNonceOffset], kNonceSize,
-          &encrypted_data_as_uint8_ptr[kEncryptedDataOffset],
-          kEncryptedDataSize, &encrypted_data_as_uint8_ptr[kTagOffset],
-          kTagSize) == 0) {
-    return false;
-  }
-
-  result.resize(out_len);
-  output->swap(result);
-  return true;
-}
-
-}  // namespace encryption
diff --git a/bin/ledger/encryption/primitives/encrypt.h b/bin/ledger/encryption/primitives/encrypt.h
deleted file mode 100644
index 8c3bead..0000000
--- a/bin/ledger/encryption/primitives/encrypt.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_ENCRYPT_H_
-#define PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_ENCRYPT_H_
-
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/lib/rng/random.h"
-
-namespace encryption {
-
-// Encrypt the given |data| with the given |key| using AES128-GCM-SIV. The key
-// size must be 128 bits.
-bool AES128GCMSIVEncrypt(rng::Random* random, fxl::StringView key,
-                         fxl::StringView data, std::string* output);
-
-// Descript the given |encrypteddata| with the given |key| using AES128-GCM-SIV.
-// The key size must be 128 bits.
-bool AES128GCMSIVDecrypt(fxl::StringView key, fxl::StringView encrypted_data,
-                         std::string* output);
-
-}  // namespace encryption
-
-#endif  // PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_ENCRYPT_H_
diff --git a/bin/ledger/encryption/primitives/encrypt_unittest.cc b/bin/ledger/encryption/primitives/encrypt_unittest.cc
deleted file mode 100644
index 2c66807..0000000
--- a/bin/ledger/encryption/primitives/encrypt_unittest.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/primitives/encrypt.h"
-
-#include <algorithm>
-
-#include <gtest/gtest.h>
-#include <zircon/syscalls.h>
-
-#include "peridot/lib/rng/test_random.h"
-
-namespace encryption {
-namespace {
-
-using EncryptTest = ::testing::TestWithParam<size_t>;
-
-TEST_P(EncryptTest, Correctness) {
-  const size_t kMessageSize = GetParam();
-  rng::TestRandom random(0);
-
-  std::string key;
-  key.resize(16);
-  random.Draw(&key);
-  std::string message;
-  message.resize(kMessageSize);
-  random.Draw(&message);
-
-  std::string encrypted;
-  std::string decrypted;
-  ASSERT_TRUE(AES128GCMSIVEncrypt(&random, key, message, &encrypted));
-
-  // Check that decrypted is the original message.
-  ASSERT_TRUE(AES128GCMSIVDecrypt(key, encrypted, &decrypted));
-  EXPECT_EQ(message, decrypted);
-
-  // Check that changing any of the first 128 bytes breaks the encryption.
-  for (size_t index = 0; index < std::min<size_t>(128u, encrypted.size());
-       ++index) {
-    std::string encrypted_copy = encrypted;
-    encrypted_copy[index] ^= 0xFF;
-    EXPECT_FALSE(AES128GCMSIVDecrypt(key, encrypted_copy, &decrypted));
-  }
-}
-
-INSTANTIATE_TEST_CASE_P(, EncryptTest,
-                        ::testing::Values(0, 64, 127, 128, 129, 192, 256,
-                                          12345));
-
-}  // namespace
-}  // namespace encryption
diff --git a/bin/ledger/encryption/primitives/hash.cc b/bin/ledger/encryption/primitives/hash.cc
deleted file mode 100644
index daa8533..0000000
--- a/bin/ledger/encryption/primitives/hash.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/primitives/hash.h"
-
-#include <lib/fxl/logging.h>
-#include <openssl/sha.h>
-
-namespace encryption {
-
-std::string SHA256WithLengthHash(fxl::StringView data) {
-  std::string result;
-  result.resize(SHA256_DIGEST_LENGTH);
-  SHA256_CTX sha256;
-  SHA256_Init(&sha256);
-  uint64_t size = data.size();
-  SHA256_Update(&sha256, &size, sizeof(size));
-  SHA256_Update(&sha256, data.data(), data.size());
-  SHA256_Final(reinterpret_cast<uint8_t*>(&result[0]), &sha256);
-  return result;
-}
-
-}  // namespace encryption
diff --git a/bin/ledger/encryption/primitives/hash.h b/bin/ledger/encryption/primitives/hash.h
deleted file mode 100644
index 0c79d5d..0000000
--- a/bin/ledger/encryption/primitives/hash.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_HASH_H_
-#define PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_HASH_H_
-
-#include <memory>
-#include <string>
-
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-namespace encryption {
-
-inline constexpr size_t kHashSize = 32;
-
-std::string SHA256WithLengthHash(fxl::StringView data);
-
-}  // namespace encryption
-
-#endif  // PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_HASH_H_
diff --git a/bin/ledger/encryption/primitives/hmac.cc b/bin/ledger/encryption/primitives/hmac.cc
deleted file mode 100644
index 319e031..0000000
--- a/bin/ledger/encryption/primitives/hmac.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/primitives/hmac.h"
-
-#include <openssl/digest.h>
-#include <openssl/hmac.h>
-#include <openssl/sha.h>
-
-namespace encryption {
-
-std::string SHA256HMAC(fxl::StringView key, fxl::StringView data) {
-  FXL_CHECK(key.size() >= SHA256_DIGEST_LENGTH);
-
-  std::string result;
-  result.resize(SHA256_DIGEST_LENGTH);
-  unsigned int result_size;
-  const uint8_t* out =
-      HMAC(EVP_sha256(), key.data(), key.size(),
-           reinterpret_cast<const uint8_t*>(data.data()), data.size(),
-           reinterpret_cast<uint8_t*>(&result[0]), &result_size);
-  FXL_CHECK(out);
-  FXL_DCHECK(result_size == SHA256_DIGEST_LENGTH);
-  result.resize(result_size);
-  return result;
-}
-
-}  // namespace encryption
diff --git a/bin/ledger/encryption/primitives/hmac.h b/bin/ledger/encryption/primitives/hmac.h
deleted file mode 100644
index 1cc7ec6..0000000
--- a/bin/ledger/encryption/primitives/hmac.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_HMAC_H_
-#define PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_HMAC_H_
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace encryption {
-// Compute the HMAC defined by RFC 2104 using SHA-256 for the hash algorithm.
-// |key| must be at least 256 bits long.
-std::string SHA256HMAC(fxl::StringView key, fxl::StringView data);
-}  // namespace encryption
-
-#endif  // PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_HMAC_H_
diff --git a/bin/ledger/encryption/primitives/hmac_unittest.cc b/bin/ledger/encryption/primitives/hmac_unittest.cc
deleted file mode 100644
index 77ee416..0000000
--- a/bin/ledger/encryption/primitives/hmac_unittest.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/primitives/hmac.h"
-
-#include <gtest/gtest.h>
-
-#include "peridot/bin/ledger/encryption/primitives/crypto_test_util.h"
-
-namespace encryption {
-namespace {
-
-TEST(HMAC, Correctness) {
-  std::string key = FromHex(
-      "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223"
-      "2425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F");
-  std::string message = "Sample message for keylen=blocklen";
-  std::string expected = FromHex(
-      "8BB9A1DB9806F20DF7F77B82138C7914D174D59E13DC4D0169C9057B133E1D62");
-  EXPECT_EQ(32u, expected.size());
-  EXPECT_EQ(expected, SHA256HMAC(key, message));
-}
-}  // namespace
-}  // namespace encryption
diff --git a/bin/ledger/encryption/primitives/kdf.cc b/bin/ledger/encryption/primitives/kdf.cc
deleted file mode 100644
index b70032d..0000000
--- a/bin/ledger/encryption/primitives/kdf.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/primitives/kdf.h"
-
-#include <lib/fxl/logging.h>
-#include <openssl/digest.h>
-#include <openssl/hkdf.h>
-
-namespace encryption {
-
-std::string HMAC256KDF(fxl::StringView data, size_t length) {
-  std::string output;
-  output.resize(length);
-  int result = HKDF(reinterpret_cast<uint8_t*>(&output[0]), output.size(),
-                    EVP_sha256(), reinterpret_cast<const uint8_t*>(data.data()),
-                    data.size(), nullptr, 0u, nullptr, 0u);
-  FXL_CHECK(result == 1);
-  return output;
-}
-
-}  // namespace encryption
diff --git a/bin/ledger/encryption/primitives/kdf.h b/bin/ledger/encryption/primitives/kdf.h
deleted file mode 100644
index 2545919..0000000
--- a/bin/ledger/encryption/primitives/kdf.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_KDF_H_
-#define PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_KDF_H_
-
-#include <string>
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace encryption {
-// Compute the key derivation function defined by RFC 5869 using HMAC-256 and
-// the given |length|. The usual salt and info are omitted due to the fact that
-// our scheme always passes unique data to the KDF.
-std::string HMAC256KDF(fxl::StringView data, size_t length);
-}  // namespace encryption
-
-#endif  // PERIDOT_BIN_LEDGER_ENCRYPTION_PRIMITIVES_KDF_H_
diff --git a/bin/ledger/encryption/primitives/kdf_unittest.cc b/bin/ledger/encryption/primitives/kdf_unittest.cc
deleted file mode 100644
index 8ba1d68..0000000
--- a/bin/ledger/encryption/primitives/kdf_unittest.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/primitives/kdf.h"
-
-#include <gtest/gtest.h>
-
-#include "peridot/bin/ledger/encryption/primitives/crypto_test_util.h"
-
-namespace encryption {
-namespace {
-
-TEST(KDF, Correctness) {
-  std::string data = FromHex("0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B");
-  std::string expected = FromHex(
-      "8DA4E775A563C18F715F802A063C5A31B8A11F5C5EE1879EC3454E5F3C738D2D9D201395"
-      "FAA4B61A96C8");
-  EXPECT_EQ(expected, HMAC256KDF(data, expected.size()));
-}
-}  // namespace
-}  // namespace encryption
diff --git a/bin/ledger/encryption/public/BUILD.gn b/bin/ledger/encryption/public/BUILD.gn
deleted file mode 100644
index e3e90f5..0000000
--- a/bin/ledger/encryption/public/BUILD.gn
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("public") {
-  sources = [
-    "encryption_service.cc",
-    "encryption_service.h",
-    "encryption_service_factory.h",
-  ]
-
-  public_deps = [
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/lib/convert",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/encryption/public/encryption_service.cc b/bin/ledger/encryption/public/encryption_service.cc
deleted file mode 100644
index 0fa6d8f..0000000
--- a/bin/ledger/encryption/public/encryption_service.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-
-namespace encryption {
-
-bool IsPermanentError(Status status) {
-  switch (status) {
-    case Status::OK:
-    case Status::AUTH_ERROR:
-    case Status::NETWORK_ERROR:
-      return false;
-    case Status::INTERNAL_ERROR:
-    case Status::INVALID_ARGUMENT:
-    case Status::IO_ERROR:
-      return true;
-  }
-}
-
-}  // namespace encryption
diff --git a/bin/ledger/encryption/public/encryption_service.h b/bin/ledger/encryption/public/encryption_service.h
deleted file mode 100644
index c10f390..0000000
--- a/bin/ledger/encryption/public/encryption_service.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENCRYPTION_PUBLIC_ENCRYPTION_SERVICE_H_
-#define PERIDOT_BIN_LEDGER_ENCRYPTION_PUBLIC_ENCRYPTION_SERVICE_H_
-
-#include <functional>
-#include <string>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/storage/public/object.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace encryption {
-
-// Status of encryption operations.
-enum class Status {
-  OK,
-  AUTH_ERROR,
-  NETWORK_ERROR,
-  INVALID_ARGUMENT,
-  IO_ERROR,
-  INTERNAL_ERROR,
-};
-
-// Returns whether the given |status| is a permanent error.
-bool IsPermanentError(Status status);
-
-// Handles all encryption for a page of the Ledger.
-class EncryptionService {
- public:
-  EncryptionService() {}
-  virtual ~EncryptionService() {}
-
-  // Construct the object identifier for the given digest, using the latest key
-  // index and a default |deletion_scope_id|.
-  // TODO(qsr): The user should have some control on the |deletion_scope_id| to
-  // decide on the scope of deletion for objects.
-  virtual storage::ObjectIdentifier MakeObjectIdentifier(
-      storage::ObjectDigest digest) = 0;
-
-  // Encrypts the given commit storage bytes for storing in the cloud.
-  virtual void EncryptCommit(
-      std::string commit_storage,
-      fit::function<void(Status, std::string)> callback) = 0;
-
-  // Decrypts the given encrypted commit storage bytes from the cloud.
-  virtual void DecryptCommit(
-      convert::ExtendedStringView storage_bytes,
-      fit::function<void(Status, std::string)> callback) = 0;
-
-  // Returns the obfuscated object name for the given identifier.
-  //
-  // This method is used to translate a local object identifier to the name that
-  // is used to refer the object in the cloud provider.
-  virtual void GetObjectName(
-      storage::ObjectIdentifier object_identifier,
-      fit::function<void(Status, std::string)> callback) = 0;
-
-  // Encrypts the given object.
-  virtual void EncryptObject(
-      storage::ObjectIdentifier object_identifier, fsl::SizedVmo content,
-      fit::function<void(Status, std::string)> callback) = 0;
-
-  // Decrypts the given object.
-  virtual void DecryptObject(
-      storage::ObjectIdentifier object_identifier, std::string encrypted_data,
-      fit::function<void(Status, std::string)> callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(EncryptionService);
-};
-
-}  // namespace encryption
-
-#endif  // PERIDOT_BIN_LEDGER_ENCRYPTION_PUBLIC_ENCRYPTION_SERVICE_H_
diff --git a/bin/ledger/encryption/public/encryption_service_factory.h b/bin/ledger/encryption/public/encryption_service_factory.h
deleted file mode 100644
index 2987dfe..0000000
--- a/bin/ledger/encryption/public/encryption_service_factory.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENCRYPTION_PUBLIC_ENCRYPTION_SERVICE_FACTORY_H_
-#define PERIDOT_BIN_LEDGER_ENCRYPTION_PUBLIC_ENCRYPTION_SERVICE_FACTORY_H_
-
-#include <memory>
-
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-
-namespace encryption {
-
-// Factory for building EncryptionService per namespace.
-class EncryptionServiceFactory {
- public:
-  EncryptionServiceFactory() {}
-  virtual ~EncryptionServiceFactory() {}
-
-  // Creates the encryption service for the given namespace.
-  virtual std::unique_ptr<EncryptionService> MakeEncryptionService(
-      std::string namespace_id) = 0;
-};
-
-}  // namespace encryption
-
-#endif  // PERIDOT_BIN_LEDGER_ENCRYPTION_PUBLIC_ENCRYPTION_SERVICE_FACTORY_H_
diff --git a/bin/ledger/environment/BUILD.gn b/bin/ledger/environment/BUILD.gn
deleted file mode 100644
index f7f46cb..0000000
--- a/bin/ledger/environment/BUILD.gn
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("environment") {
-  sources = [
-    "environment.cc",
-    "environment.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/backoff",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/timekeeper",
-    "//garnet/public/lib/timekeeper:impl",
-    "//peridot/bin/ledger/coroutine",
-    "//peridot/lib/rng",
-  ]
-
-  deps = [
-    "//peridot/lib/ledger_client:constants",
-    "//peridot/lib/rng:system",
-    "//zircon/public/lib/async-cpp",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "environment_unittest.cc",
-  ]
-
-  deps = [
-    ":environment",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//garnet/public/lib/timekeeper:testing",
-    "//peridot/lib/rng:testing",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/environment/environment.cc b/bin/ledger/environment/environment.cc
deleted file mode 100644
index e5c33a2..0000000
--- a/bin/ledger/environment/environment.cc
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/environment/environment.h"
-
-#include <lib/backoff/exponential_backoff.h>
-#include <lib/fxl/macros.h>
-#include <lib/timekeeper/system_clock.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/lib/ledger_client/constants.h"
-#include "peridot/lib/rng/system_random.h"
-
-namespace ledger {
-
-Environment::Environment(
-    bool disable_statistics, async_dispatcher_t* dispatcher,
-    async_dispatcher_t* io_dispatcher, std::string firebase_api_key,
-    component::StartupContext* startup_context,
-    std::unique_ptr<coroutine::CoroutineService> coroutine_service,
-    BackoffFactory backoff_factory, std::unique_ptr<timekeeper::Clock> clock,
-    std::unique_ptr<rng::Random> random)
-    : disable_statistics_(disable_statistics),
-      dispatcher_(dispatcher),
-      io_dispatcher_(io_dispatcher),
-      firebase_api_key_(std::move(firebase_api_key)),
-      startup_context_(startup_context),
-      coroutine_service_(std::move(coroutine_service)),
-      backoff_factory_(std::move(backoff_factory)),
-      clock_(std::move(clock)),
-      random_(std::move(random)) {
-  FXL_DCHECK(dispatcher_);
-  FXL_DCHECK(io_dispatcher_);
-  FXL_DCHECK(startup_context_);
-  FXL_DCHECK(coroutine_service_);
-  FXL_DCHECK(backoff_factory_);
-  FXL_DCHECK(clock_);
-  FXL_DCHECK(random_);
-}
-
-Environment::Environment(Environment&& other) noexcept {
-  *this = std::move(other);
-}
-
-Environment& Environment::operator=(Environment&& other) noexcept {
-  disable_statistics_ = other.disable_statistics_;
-  dispatcher_ = other.dispatcher_;
-  io_dispatcher_ = other.io_dispatcher_;
-  firebase_api_key_ = std::move(other.firebase_api_key_);
-  startup_context_ = other.startup_context_;
-  coroutine_service_ = std::move(other.coroutine_service_);
-  backoff_factory_ = std::move(other.backoff_factory_);
-  clock_ = std::move(other.clock_);
-  random_ = std::move(other.random_);
-  FXL_DCHECK(dispatcher_);
-  FXL_DCHECK(io_dispatcher_);
-  FXL_DCHECK(startup_context_);
-  FXL_DCHECK(coroutine_service_);
-  FXL_DCHECK(backoff_factory_);
-  FXL_DCHECK(clock_);
-  FXL_DCHECK(random_);
-  return *this;
-}
-
-Environment::~Environment() {}
-
-std::unique_ptr<backoff::Backoff> Environment::MakeBackoff() {
-  return backoff_factory_();
-}
-
-EnvironmentBuilder::EnvironmentBuilder()
-    : firebase_api_key_(modular::kFirebaseApiKey) {}
-
-EnvironmentBuilder::~EnvironmentBuilder() {}
-
-EnvironmentBuilder& EnvironmentBuilder::SetDisableStatistics(
-    bool disable_statistics) {
-  disable_statistics_ = disable_statistics;
-  return *this;
-}
-
-EnvironmentBuilder& EnvironmentBuilder::SetAsync(
-    async_dispatcher_t* dispatcher) {
-  dispatcher_ = dispatcher;
-  return *this;
-}
-
-EnvironmentBuilder& EnvironmentBuilder::SetIOAsync(
-    async_dispatcher_t* io_dispatcher) {
-  io_dispatcher_ = io_dispatcher;
-  return *this;
-}
-
-EnvironmentBuilder& EnvironmentBuilder::SetFirebaseApiKey(
-    std::string firebase_api_key) {
-  firebase_api_key_ = std::move(firebase_api_key);
-  return *this;
-}
-
-EnvironmentBuilder& EnvironmentBuilder::SetStartupContext(
-    component::StartupContext* startup_context) {
-  startup_context_ = startup_context;
-  return *this;
-}
-
-EnvironmentBuilder& EnvironmentBuilder::SetCoroutineService(
-    std::unique_ptr<coroutine::CoroutineService> coroutine_service) {
-  coroutine_service_ = std::move(coroutine_service);
-  return *this;
-}
-
-// public
-EnvironmentBuilder& EnvironmentBuilder::SetBackoffFactory(
-    Environment::BackoffFactory backoff_factory) {
-  backoff_factory_ = std::move(backoff_factory);
-  return *this;
-}
-
-EnvironmentBuilder& EnvironmentBuilder::SetClock(
-    std::unique_ptr<timekeeper::Clock> clock) {
-  clock_ = std::move(clock);
-  return *this;
-}
-
-EnvironmentBuilder& EnvironmentBuilder::SetRandom(
-    std::unique_ptr<rng::Random> random) {
-  random_ = std::move(random);
-  return *this;
-}
-
-Environment EnvironmentBuilder::Build() {
-  if (!coroutine_service_) {
-    coroutine_service_ = std::make_unique<coroutine::CoroutineServiceImpl>();
-  }
-  if (!clock_) {
-    clock_ = std::make_unique<timekeeper::SystemClock>();
-  }
-  if (!random_) {
-    random_ = std::make_unique<rng::SystemRandom>();
-  }
-  if (!backoff_factory_) {
-    backoff_factory_ = [random = random_.get()] {
-      return std::make_unique<backoff::ExponentialBackoff>(
-          random->NewBitGenerator<uint64_t>());
-    };
-  }
-  return Environment(disable_statistics_, dispatcher_, io_dispatcher_,
-                     std::move(firebase_api_key_), startup_context_,
-                     std::move(coroutine_service_), std::move(backoff_factory_),
-                     std::move(clock_), std::move(random_));
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/environment/environment.h b/bin/ledger/environment/environment.h
deleted file mode 100644
index b6cc858..0000000
--- a/bin/ledger/environment/environment.h
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_ENVIRONMENT_ENVIRONMENT_H_
-#define PERIDOT_BIN_LEDGER_ENVIRONMENT_ENVIRONMENT_H_
-
-#include <memory>
-
-#include <lib/async/dispatcher.h>
-#include <lib/backoff/backoff.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fit/function.h>
-#include <lib/timekeeper/clock.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/lib/rng/random.h"
-
-namespace ledger {
-
-// Environment for the ledger application. |dispatcher| must outlive
-// |io_dispatcher|.
-class Environment {
- public:
-  using BackoffFactory = fit::function<std::unique_ptr<backoff::Backoff>()>;
-  Environment(bool disable_statistics, async_dispatcher_t* dispatcher,
-              async_dispatcher_t* io_dispatcher, std::string firebase_api_key,
-              component::StartupContext* startup_context,
-              std::unique_ptr<coroutine::CoroutineService> coroutine_service,
-              BackoffFactory backoff_factory,
-              std::unique_ptr<timekeeper::Clock> clock,
-              std::unique_ptr<rng::Random> random);
-  Environment(Environment&& other) noexcept;
-  ~Environment();
-
-  Environment& operator=(Environment&& other) noexcept;
-
-  bool disable_statistics() const { return disable_statistics_; }
-
-  async_dispatcher_t* dispatcher() const { return dispatcher_; }
-
-  // Returns the async_dispatcher_t to be used for I/O operations.
-  async_dispatcher_t* io_dispatcher() const { return io_dispatcher_; }
-
-  const std::string& firebase_api_key() const { return firebase_api_key_; };
-
-  component::StartupContext* startup_context() const {
-    return startup_context_;
-  };
-
-  coroutine::CoroutineService* coroutine_service() const {
-    return coroutine_service_.get();
-  }
-
-  std::unique_ptr<backoff::Backoff> MakeBackoff();
-
-  timekeeper::Clock* clock() const { return clock_.get(); }
-
-  rng::Random* random() const { return random_.get(); }
-
- private:
-  bool disable_statistics_;
-
-  async_dispatcher_t* dispatcher_;
-
-  // The async_dispatcher_t to be used for I/O operations.
-  async_dispatcher_t* io_dispatcher_;
-
-  // The firebase API key.
-  std::string firebase_api_key_;
-
-  component::StartupContext* startup_context_;
-  std::unique_ptr<coroutine::CoroutineService> coroutine_service_;
-  BackoffFactory backoff_factory_;
-  std::unique_ptr<timekeeper::Clock> clock_;
-  std::unique_ptr<rng::Random> random_;
-};
-
-// Builder for the environment.
-//
-// The |SetAsync|, |SetIOAsync| and |SetStartupContext| methods must be called
-// before the environment can be built.
-class EnvironmentBuilder {
- public:
-  EnvironmentBuilder();
-  ~EnvironmentBuilder();
-
-  EnvironmentBuilder(const EnvironmentBuilder& other) = delete;
-  EnvironmentBuilder(EnvironmentBuilder&& other) = delete;
-  EnvironmentBuilder& operator=(const EnvironmentBuilder& other) = delete;
-  EnvironmentBuilder& operator=(EnvironmentBuilder&& other) = delete;
-
-  EnvironmentBuilder& SetDisableStatistics(bool disable_statistics);
-  EnvironmentBuilder& SetAsync(async_dispatcher_t* dispatcher);
-  EnvironmentBuilder& SetIOAsync(async_dispatcher_t* io_dispatcher);
-  EnvironmentBuilder& SetFirebaseApiKey(std::string firebase_api_key);
-  EnvironmentBuilder& SetStartupContext(
-      component::StartupContext* startup_context);
-  EnvironmentBuilder& SetCoroutineService(
-      std::unique_ptr<coroutine::CoroutineService> coroutine_service);
-  EnvironmentBuilder& SetBackoffFactory(
-      Environment::BackoffFactory backoff_factory);
-  EnvironmentBuilder& SetClock(std::unique_ptr<timekeeper::Clock> clock);
-  EnvironmentBuilder& SetRandom(std::unique_ptr<rng::Random> random);
-
-  Environment Build();
-
- private:
-  bool disable_statistics_ = true;
-  async_dispatcher_t* dispatcher_ = nullptr;
-  async_dispatcher_t* io_dispatcher_ = nullptr;
-  std::string firebase_api_key_;
-  component::StartupContext* startup_context_ = nullptr;
-  std::unique_ptr<coroutine::CoroutineService> coroutine_service_;
-  Environment::BackoffFactory backoff_factory_;
-  std::unique_ptr<timekeeper::Clock> clock_;
-  std::unique_ptr<rng::Random> random_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_ENVIRONMENT_ENVIRONMENT_H_
diff --git a/bin/ledger/environment/environment_unittest.cc b/bin/ledger/environment/environment_unittest.cc
deleted file mode 100644
index 73775ba..0000000
--- a/bin/ledger/environment/environment_unittest.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/environment/environment.h"
-
-#include <lib/component/cpp/testing/startup_context_for_test.h>
-#include <lib/gtest/test_loop_fixture.h>
-#include <lib/timekeeper/test_clock.h>
-
-#include "peridot/lib/rng/test_random.h"
-
-namespace ledger {
-namespace {
-
-class EnvironmentTest : public ::gtest::TestLoopFixture {
- public:
-  EnvironmentTest()
-      : startup_context_(component::testing::StartupContextForTest::Create()) {}
-
-  std::unique_ptr<component::testing::StartupContextForTest> startup_context_;
-};
-
-TEST_F(EnvironmentTest, InitializationOfAsyncAndIOAsync) {
-  Environment env = EnvironmentBuilder()
-                        .SetStartupContext(startup_context_.get())
-                        .SetAsync(dispatcher())
-                        .SetIOAsync(dispatcher())
-                        .Build();
-
-  EXPECT_EQ(dispatcher(), env.dispatcher());
-  EXPECT_EQ(dispatcher(), env.io_dispatcher());
-}
-
-TEST_F(EnvironmentTest, InitializationClock) {
-  auto clock = std::make_unique<timekeeper::TestClock>();
-  auto clock_ptr = clock.get();
-  Environment env = EnvironmentBuilder()
-                        .SetStartupContext(startup_context_.get())
-                        .SetAsync(dispatcher())
-                        .SetIOAsync(dispatcher())
-                        .SetClock(std::move(clock))
-                        .Build();
-
-  EXPECT_EQ(clock_ptr, env.clock());
-}
-
-TEST_F(EnvironmentTest, InitializationRandom) {
-  auto random = std::make_unique<rng::TestRandom>(0);
-  auto random_ptr = random.get();
-  Environment env = EnvironmentBuilder()
-                        .SetStartupContext(startup_context_.get())
-                        .SetAsync(dispatcher())
-                        .SetIOAsync(dispatcher())
-                        .SetRandom(std::move(random))
-                        .Build();
-
-  EXPECT_EQ(random_ptr, env.random());
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/fidl/BUILD.gn b/bin/ledger/fidl/BUILD.gn
deleted file mode 100644
index 46515a5..0000000
--- a/bin/ledger/fidl/BUILD.gn
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-import("//garnet/public/build/fostr/fostr_fidl.gni")
-import("//peridot/bin/ledger/fidl/error_notifier/error_notifier.gni")
-
-fidl("fidl") {
-  name = "fuchsia.ledger.internal"
-
-  sources = [
-    "debug.fidl",
-    "internal.fidl",
-  ]
-
-  deps = [
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-  ]
-}
-
-error_notifier_fidl("error_notifier_internal") {
-  fidl_target = ":fidl"
-}
-
-error_notifier_fidl("error_notifier_public") {
-  fidl_target = "//peridot/public/fidl/fuchsia.ledger"
-}
-
-source_set("error_notifier") {
-  sources = [
-    "error_notifier.h",
-  ]
-
-  public_deps = [
-    ":error_notifier_internal",
-    ":error_notifier_public",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/fidl/debug.fidl b/bin/ledger/fidl/debug.fidl
deleted file mode 100644
index 90c4468..0000000
--- a/bin/ledger/fidl/debug.fidl
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.ledger.internal;
-
-using fuchsia.ledger;
-using zx;
-
-[Discoverable]
-interface LedgerRepositoryDebug {
-    // Returns the instances list in LedgerRepository.
-    1: GetInstancesList() -> (vector<vector<uint8>> result);
-
-    // Returns the debugging interface for the given |ledger_name|.
-    2: GetLedgerDebug(vector<uint8> ledger_name, request<LedgerDebug> ledger_debug)
-           -> (fuchsia.ledger.Status status);
-};
-
-interface LedgerDebug {
-    // Returns the pages list in Ledger.
-    1: GetPagesList() -> (vector<fuchsia.ledger.PageId> result);
-
-    // Returns OK and binds the |page_debug| for the given |page_id|.
-    // Returns PAGE_NOT_FOUND if |page_id| isn't found.
-    2: GetPageDebug(fuchsia.ledger.PageId page_id, request<PageDebug> page_debug)
-           -> (fuchsia.ledger.Status status);
-};
-
-interface PageDebug {
-    // Returns OK and a list of the head commits IDs.
-    1: GetHeadCommitsIds() -> (fuchsia.ledger.Status status, vector<CommitId> result);
-
-    // Returns OK and creates a snapshot of the page, allowing the client app to read a
-    // consistent view of the content of the page.
-    2: GetSnapshot(CommitId commit_id, request<fuchsia.ledger.PageSnapshot> snapshot_request)
-           -> (fuchsia.ledger.Status status);
-
-    // Returns OK and the Commit struct filled for the given |commit_id|.
-    3: GetCommit(CommitId commit_id) -> (fuchsia.ledger.Status status, Commit? commit);
-};
-
-struct CommitId {
-    vector<uint8> id;
-};
-
-struct Commit {
-    // The ID of this commit.
-    CommitId commit_id;
-
-    // The IDs of this commit parents.
-    vector<CommitId> parents_ids;
-
-    // The creation timestamp of this commit in nanoseconds since epoch.
-    zx.time timestamp;
-
-    // The generation timestamp of this commit (the number of commits to the root).
-    int64 generation;
-};
diff --git a/bin/ledger/fidl/error_notifier.h b/bin/ledger/fidl/error_notifier.h
deleted file mode 100644
index a6e1ad2..0000000
--- a/bin/ledger/fidl/error_notifier.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_FIDL_ERROR_NOTIFIER_H_
-#define PERIDOT_BIN_LEDGER_FIDL_ERROR_NOTIFIER_H_
-
-// Includes generated code for ErrorNotifier for the public and private Ledger
-// APIs.
-
-#include "peridot/bin/ledger/fidl/error_notifier_internal.h"
-#include "peridot/bin/ledger/fidl/error_notifier_public.h"
-
-#endif  // PERIDOT_BIN_LEDGER_FIDL_ERROR_NOTIFIER_H_
diff --git a/bin/ledger/fidl/error_notifier/BUILD.gn b/bin/ledger/fidl/error_notifier/BUILD.gn
deleted file mode 100644
index dfe0820..0000000
--- a/bin/ledger/fidl/error_notifier/BUILD.gn
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-import("//peridot/bin/ledger/fidl/error_notifier/error_notifier.gni")
-
-source_set("error_notifier") {
-  sources = [
-    "error_notifier_binding.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//peridot/bin/ledger/fidl/include",
-    "//peridot/bin/ledger/sync_helper",
-    "//zircon/public/lib/fit",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-error_notifier_fidl("error_notifier_fidl_test") {
-  testonly = true
-
-  fidl_target = "//peridot/bin/ledger/fidl/error_notifier/fidl"
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "error_notifier_binding_unittest.cc",
-  ]
-
-  deps = [
-    ":error_notifier",
-    ":error_notifier_fidl_test",
-    "//garnet/public/lib/callback",
-    "//peridot/bin/ledger/fidl/error_notifier/fidl",
-    "//third_party/googletest:gtest",
-    "//zircon/public/lib/async-testutils",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/fidl/error_notifier/README.md b/bin/ledger/fidl/error_notifier/README.md
deleted file mode 100644
index cf85072..0000000
--- a/bin/ledger/fidl/error_notifier/README.md
+++ /dev/null
@@ -1,30 +0,0 @@
-## Generated ErrorNotifierDelegate ##
-
-The ledger API is sending a status and closing the connection on unexpected
-errors for every interface that extends ledger.ErrorNotifier. These interfaces
-must also implement a |Sync| method that will return when all requests called
-before the |Sync| call have been handled.
-
-When impementing such an interface, one must keep track of each connection to be
-able to close it with the correct status in case of error, and must also
-implement the |Sync| method.
-
-To reduce the amount of repeating code, the files in this directory allow to
-automatically generate an ErrorNotifierDelegate and an implementation of the
-base interface that delegates to it.
-
-When one wants to implement an interface extending ledger.ErrorNotifier, one
-therefore only need to implement the generated delegate interface. For each
-method in the initial interface, the delegate will have a corresponding method
-with an additional callback taking a ::fuchsia::ledger::Status. The implementor
-must call this additional callback when the call is finished, with either
-Status::OK if the call is successful, or with any error status if it is not.
-
-When one wants to bind a request, one can instantiate a new
-ErrorNotifierBinding, associating it with an implementation of the Delegate. The
-binding will take care of forwarding the call to the Delegate, as well as handling
-the error reporting and the |Sync| calls.
-
-For an example, see error\_notifier\_proxy\_base\_unittest.cc, which implements
-the ErrorNotifierTestDelegate interface that is automatically generated from the
-ErrorNotifierTest FIDL interface defined in fidl/error\_notifier\_test.fidl.
diff --git a/bin/ledger/fidl/error_notifier/error_notifier.fidlmerge b/bin/ledger/fidl/error_notifier/error_notifier.fidlmerge
deleted file mode 100644
index 58bd8d0..0000000
--- a/bin/ledger/fidl/error_notifier/error_notifier.fidlmerge
+++ /dev/null
@@ -1,253 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// fidlmerge template for ErrorNotifier support. It generates a .h cc file for
-// the proxy and delegate handling error reporting for the ledger.
-//
-// NOTE: This template generates a "#pragma once", which should be replaced by
-// an #ifndef guard to conform to the style guide.
-
-
-// Produces the copyright messages for a file header.
-{{- define "FileHeader" -}}
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// WARNING: This file is machine generated by fidlmerge.
-{{- end }}
-
-// Produces a C++ expression for a types.EncodedCompoundIdentifier.
-{{- define "QualifiedId" }}
-    {{- range .Parts.Library -}}
-        ::{{ . }}
-    {{- end -}}
-    ::
-    {{- .Parts.Name }}
-{{- end }}
-
-// Produces a C++ type for a handle.
-{{- define "CppHandleType" -}}
-  {{- if .HandleSubtype -}}
-::zx::{{ .HandleSubtype }}
-  {{- else -}}
-::zx::handle
-  {{- end -}}
-{{- end }}
-
-// Produces a C++ type of an identifier.
-// This can be either and InterfaceHandle for interfaces, a std::unique_ptr for
-// a nullable struct, or the struct itself for a non-nullable struct.
-{{- define "CppIdentifierType" -}}
-  {{- $type := declType .Identifier -}}
-  {{- if eq $type "interface" -}}
-::fidl::InterfaceHandle<{{- template "QualifiedId" .Identifier }}>
-  {{- else -}}
-    {{- if .Nullable -}}
-std::unique_ptr<{{- template "QualifiedId" .Identifier }}>
-    {{- else -}}
-{{- template "QualifiedId" .Identifier }}
-    {{- end -}}
-  {{- end -}}
-{{- end }}
-
-// Produces a C++ type of a |Type|
-{{- define "CppType" -}}
-  {{- if eq .Kind "identifier" -}}
-{{- template "CppIdentifierType" . }}
-  {{- end -}}
-  {{- if eq .Kind "handle" -}}
-{{- template "CppHandleType" . }}
-  {{- end -}}
-  {{- if eq .Kind "vector" -}}
-    {{- if .Nullable }}
-::fidl::VectorPtr<{{- template "CppType" .ElementType }}>
-    {{- else }}
-::std::vector<{{- template "CppType" .ElementType }}>
-    {{- end }}
-  {{- end -}}
-  {{- if eq .Kind "request" -}}
-::fidl::InterfaceRequest<{{- template "QualifiedId" .RequestSubtype }}>
-  {{- end -}}
-  {{- if eq .Kind "primitive" -}}
-{{ .PrimitiveSubtype }}_t
-  {{- end }}
-  {{- if eq .Kind "string" -}}
-    {{- if .Nullable }}
-::fidl::StringPtr
-    {{- else }}
-::std::string
-    {{- end }}
-  {{- end }}
-{{- end -}}
-
-// Produces a comma separated list of function parameters (C++ type and name)
-{{- define "Params" -}}
-  {{- range $index, $param := . -}}
-    {{- if $index }}, {{ end -}}{{ template "CppType" $param.Type }} {{ $param.Name }}
-  {{- end -}}
-{{- end }}
-
-// Produces a comma separated list of move operations.
-{{- define "ForwardParams" -}}
-  {{- range $index, $param := . -}}
-    {{- if $index }}, {{ end -}}std::move({{ $param.Name }})
-  {{- end -}}
-{{- end }}
-
-// Produces a comma separated list of C++ types.
-{{- define "ParamTypes" -}}
-  {{- range $index, $param := . -}}
-    {{- if $index }}, {{ end -}}{{ template "CppType" .Type }}
-  {{- end -}}
-{{- end }}
-
-// Produces the type of the callback associated with the current response.
-{{- define "CallbackType" -}}
-::fit::function<void({{ template "ParamTypes" .Response }})>
-{{- end }}
-
-// Produces the type of the callback associated with the current response and an additional Status.
-{{- define "CallbackTypeWithStatus" -}}
-::fit::function<void(::fuchsia::ledger::Status{{ if .Response}}, {{end}}{{ template "ParamTypes" .Response }})>
-{{- end }}
-
-
-// Produces the signature of the FIDL interface method.
-{{- define "RequestMethodSignature" -}}
-  {{- if .HasResponse -}}
-{{ .Name }}({{ template "Params" .Request }}{{ if .Request }}, {{ end }}{{ template "CallbackType" . }} callback)
-  {{- else -}}
-{{ .Name }}({{ template "Params" .Request }})
-  {{- end -}}
-{{ end -}}
-
-// Produces an implementation of the FIDL interface method that forward to the NotifierDelegate.
-{{- define "RequestMethodSignatureForward" -}}
-  {{- if .HasResponse -}}
-{{ .Name }}({{ template "ForwardParams" .Request }}{{ if .Request }}, {{ end }}binding_->WrapOperation("{{ .Name }}", std::move(callback)))
-  {{- else -}}
-{{ .Name }}({{ template "ForwardParams" .Request }}{{ if .Request }}, {{ end }}binding_->NewErrorCallback("{{ .Name }}"))
-  {{- end -}}
-{{ end -}}
-
-// Produces the signature of the NotifierDelegate method associated with the FIDL interface method.
-{{- define "RequestMethodSignatureErrorNotifierDelegate" -}}
-  {{- if .HasResponse -}}
-{{ .Name }}({{ template "Params" .Request }}{{ if .Request }}, {{ end }}{{ template "CallbackTypeWithStatus" . }} callback)
-  {{- else -}}
-{{ .Name }}({{ template "Params" .Request }}{{ if .Request }}, {{ end }}::fit::function<void(::fuchsia::ledger::Status)> callback)
-  {{- end -}}
-{{ end -}}
-
-// Produces the include for the original FIDL generated cpp file.
-{{- define "ThisFidlInclude" -}}
-    #include <{{- range .Name.Parts}}{{ . }}/{{ end }}cpp/fidl.h>
-{{- end }}
-
-// Converts a library into a slashed version of its name, e.g. fuchsia/foo/.
-{{- define "LibrarySlashes" -}}
-    {{- range .Name.Parts}}{{ . }}/{{ end }}
-{{- end }}
-
-{{- define "IncludeHeader" }}
-    {{- template "FileHeader" }}
-
-#pragma once
-
-{{ template "ThisFidlInclude" . }}
-#include <lib/fidl/cpp/interface_request.h>
-
-#include "peridot/bin/ledger/fidl/error_notifier/error_notifier_binding.h"
-
-{{/* keep the newline */}}
-    {{- range .Name.Parts }}
-namespace {{ . }} {
-    {{- end }}
-
-{{/* keep the newline */}}
-{{- end }}
-
-
-{{- define "NamespaceClose" }}
-{{/* keep the newline */}}
-    {{- range .Name.PartsReversed }}
-} // namespace {{ . }}
-    {{- end }}
-{{- end }}
-
-
-// Define the generated classes for the given FIDL interface.
-{{- define "InterfaceDeclaration" }}
-class {{ .Name.Parts.Name }}ErrorNotifierDelegate {
- public:
-  using FidlInterface = {{ .Name.Parts.Name }};
-  class Impl;
-
-  virtual ~{{ .Name.Parts.Name }}ErrorNotifierDelegate() = default;
-    {{- range .Methods }}
-        {{- if (and .HasRequest (not (eq .Name "Sync" ))) }}
-  virtual void {{ template "RequestMethodSignatureErrorNotifierDelegate" . }} = 0;
-        {{- end }}
-    {{- end }}
-};
-
-class {{ .Name.Parts.Name }}ErrorNotifierDelegate::Impl : public {{ .Name.Parts.Name }} {
- public:
-  static constexpr char kInterfaceName[] = "{{ .Name.Parts.Name }}";
-  Impl({{ .Name.Parts.Name }}ErrorNotifierDelegate* delegate,
-       ::ledger::ErrorNotifierBinding<{{ .Name.Parts.Name }}ErrorNotifierDelegate>* binding)
-       : delegate_(delegate), binding_(binding) {}
-
- private:
-    {{- range .Methods }}
-        {{- if (and .HasRequest (not (eq .Name "Sync" ))) }}
-  void {{ template "RequestMethodSignature" . }} override {
-    delegate_->{{ template "RequestMethodSignatureForward" . }};
-  }
-        {{- end }}
-    {{- end }}
-  void Sync(::fit::function<void()> callback) override {
-    binding_->Sync(std::move(callback));
-  }
-
-  {{ .Name.Parts.Name }}ErrorNotifierDelegate* delegate_;
-  ::ledger::ErrorNotifierBinding<{{ .Name.Parts.Name }}ErrorNotifierDelegate>* binding_;
-};
-
-{{/* keep the newline */}}
-{{- end }}
-
-// Define the generated classed for the FIDL library.
-{{- define "InterfaceWriterDecls" }}
-    {{/*
-       * Find the interfaces that extends ErrorNotifier.
-       *
-       * To do this, range over all interfaces that are not ErrorNotifier, and find a method call "Sync".
-       */}}
-    {{- range $interface := .Interfaces }}
-        {{- /* Do not generate anything for the ErrorNotifier interface */ -}}
-        {{- if not (eq .Name.Parts.Name "ErrorNotifier") -}}
-            {{- range .Methods }}
-                {{- if .HasRequest }}
-                    {{- /* Use the "Sync" method has a marker to detect interfaces extending ErrorNotifier */ -}}
-                    {{- if eq .Name "Sync" }}
-                        {{- template "InterfaceDeclaration" $interface }}
-                    {{- end }}
-                {{- end }}
-            {{- end }}
-        {{- end }}
-    {{- end }}
-{{- end }}
-
-{{- define "IncludeFile" }}
-    {{- template "IncludeHeader" . }}
-    {{- template "InterfaceWriterDecls" . }}
-    {{- template "NamespaceClose" . }}
-{{- end }}
-
-{{- define "Main" }}
-    {{- $include_path := .Output ".h" }}
-    {{- .Generate $include_path "IncludeFile" . }}
-{{- end }}
diff --git a/bin/ledger/fidl/error_notifier/error_notifier.gni b/bin/ledger/fidl/error_notifier/error_notifier.gni
deleted file mode 100644
index b7cea74..0000000
--- a/bin/ledger/fidl/error_notifier/error_notifier.gni
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/compiled_action.gni")
-import("//build/cpp/fidlmerge_cpp.gni")
-
-# Declares a error_notifier library that contains C++ delegate allowing to
-# send errors.
-#
-# Parameters
-#
-#   fidl_target (required)
-#     Specifies the fidl target from which to read fidl json.
-#
-#   deps, public_deps, test_only, visibility (optional)
-#     These parameters are forwarded to the source_set. This template lists
-#     //garnet/public/lib/error_notifier and the value of fidl_target as public_deps.
-#
-
-template("error_notifier_fidl") {
-  assert(is_fuchsia, "This template can only be used in $target_toolchain.")
-
-  assert(defined(invoker.fidl_target),
-         "error_notifier_fidl requires parameter fidl_target.")
-
-  fidl_target = invoker.fidl_target
-
-  name = target_name
-
-  fidlmerge_cpp(name) {
-    forward_variables_from(invoker,
-                           [
-                             "deps",
-                             "testonly",
-                             "visibility",
-                           ])
-
-    fidl_target = "$fidl_target"
-
-    template_path =
-        "//peridot/bin/ledger/fidl/error_notifier/error_notifier.fidlmerge"
-
-    generated_source_base = name
-
-    generated_source_extensions = [ ".h" ]
-
-    public_deps = [
-      "$fidl_target",
-      "//garnet/public/lib/fidl/cpp",
-      "//peridot/bin/ledger/fidl/error_notifier",
-    ]
-
-    if (defined(invoker.public_deps)) {
-      public_deps += invoker.public_deps
-    }
-  }
-}
diff --git a/bin/ledger/fidl/error_notifier/error_notifier_binding.h b/bin/ledger/fidl/error_notifier/error_notifier_binding.h
deleted file mode 100644
index bcc795a..0000000
--- a/bin/ledger/fidl/error_notifier/error_notifier_binding.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_FIDL_ERROR_NOTIFIER_ERROR_NOTIFIER_BINDING_H_
-#define PERIDOT_BIN_LEDGER_FIDL_ERROR_NOTIFIER_ERROR_NOTIFIER_BINDING_H_
-
-#include <map>
-#include <utility>
-
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/enum.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/sync_helper/sync_helper.h"
-
-namespace ledger {
-
-// Class for binding of FIDL interface  implementing the ErrorNotifier interface
-// and using the error notifier delegate interface |D|.
-// For a FIDL interface Foo, |D| is an interface named FooErrorNotifierDelegate
-// that needs to be implemented by the user and passed to ErrorNotifierBinding.
-//
-// This class internally handles the following features:
-// - Implement the |Sync| method.
-// - Provides a factory for passing a callback to the companion implementation
-//   that will handle reporting the error and closing the connection.
-// - Provides a |WrapOperation| method that needs to be called on all callback
-//   before passing to the companion implementation so that |Sync| can keep
-//   track of what operations are currently in progress.
-//
-// This class exposes the following features:
-// - Access to the methods of the underlying bindings.
-// - Implement the |set_on_empty| method to be usable with AutoCleanableSet.
-template <typename D>
-class ErrorNotifierBinding {
- public:
-  ErrorNotifierBinding(D* delegate) : impl_(delegate, this), binding_(&impl_) {
-    binding_.set_error_handler(
-        [this](zx_status_t /* status */) { CheckEmpty(); });
-    sync_helper_.set_on_empty([this] { CheckEmpty(); });
-  }
-
-  ErrorNotifierBinding(
-      D* delegate, fidl::InterfaceRequest<typename D::FidlInterface> request,
-      async_dispatcher_t* dispatcher = nullptr)
-      : ErrorNotifierBinding(delegate) {
-    binding_.Bind(std::move(request), dispatcher);
-  }
-
-  void set_on_empty(fit::closure on_empty) { on_empty_ = std::move(on_empty); }
-  bool empty() { return !binding_.is_bound() && sync_helper_.empty(); }
-
-  fidl::InterfaceRequest<typename D::FidlInterface> Unbind() {
-    return binding_.Unbind();
-  }
-  fidl::InterfaceHandle<typename D::FidlInterface> NewBinding(
-      async_dispatcher_t* dispatcher = nullptr) {
-    return binding_.NewBinding(dispatcher);
-  }
-
-  void Close(zx_status_t status) { binding_.Close(status); }
-
-  void Close(ledger::Status status) { Close(static_cast<zx_status_t>(status)); }
-
- private:
-  friend typename D::Impl;
-
-  void Sync(fit::function<void()> callback) {
-    sync_helper_.RegisterSynchronizationCallback(std::move(callback));
-  }
-
-  // Wraps a callback in another one that preprends a Status arguments and
-  // handles the status in case of error.
-  template <typename... Args>
-  auto WrapOperation(const char* function_name,
-                     fit::function<void(Args...)> callback) {
-    return sync_helper_.WrapOperation(
-        [this, function_name, callback = std::move(callback)](
-            ::fuchsia::ledger::Status status, Args&&... args) {
-          if (status == ::fuchsia::ledger::Status::OK) {
-            callback(std::forward<Args>(args)...);
-            return;
-          }
-          FXL_LOG(INFO) << "FIDL call " << D::Impl::kInterfaceName
-                        << "::" << function_name
-                        << " failed with status: " << fidl::ToUnderlying(status)
-                        << ". Sending the epitaph and closing the connection.";
-          Close(status);
-        });
-  }
-
-  // Returns a new callback taking a ledger::Status. This callback will be
-  // responsible, in case of error, to send the status back as an event and
-  // close the connection to the client.
-  auto NewErrorCallback(const char* function_name) {
-    return WrapOperation(function_name, fit::closure([] {}));
-  }
-
-  void CheckEmpty() {
-    if (empty() && on_empty_) {
-      on_empty_();
-    }
-  }
-
-  typename D::Impl impl_;
-  fidl::Binding<typename D::FidlInterface> binding_;
-  fit::closure on_empty_;
-  SyncHelper sync_helper_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_FIDL_ERROR_NOTIFIER_ERROR_NOTIFIER_BINDING_H_
diff --git a/bin/ledger/fidl/error_notifier/error_notifier_binding_unittest.cc b/bin/ledger/fidl/error_notifier/error_notifier_binding_unittest.cc
deleted file mode 100644
index 5355bfc..0000000
--- a/bin/ledger/fidl/error_notifier/error_notifier_binding_unittest.cc
+++ /dev/null
@@ -1,291 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/fidl/error_notifier/error_notifier_fidl_test.h"
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-
-namespace ledger {
-namespace {
-
-class ErrorNotifierTestErrorNotifierDelegateImpl
-    : public fuchsia::ledger::errornotifiertest::
-          ErrorNotifierTestErrorNotifierDelegate {
- public:
-  int no_reponse_count() { return no_reponse_count_; }
-  int empty_reponse_count() { return empty_reponse_count_; }
-  int not_empty_reponse_count() { return not_empty_reponse_count_; }
-  int parameter_received() { return parameter_received_; }
-  fuchsia::ledger::Status& status_to_return() { return status_to_return_; }
-  bool& delay_callback() { return delay_callback_; }
-  void RunDelayedCallback() { delayed_callback_(); }
-
- private:
-  // ErrorNotifierTestErrorNotifierDelegate implementation.
-  void NoResponse(
-      fit::function<void(fuchsia::ledger::Status)> callback) override {
-    NoResponseWithParameter(1, std::move(callback));
-  }
-  void NoResponseWithParameter(
-      int8_t input,
-      fit::function<void(fuchsia::ledger::Status)> callback) override {
-    parameter_received_ = input;
-    ++no_reponse_count_;
-    delayed_callback_ = [callback = std::move(callback),
-                         status_to_return = status_to_return_] {
-      callback(status_to_return);
-    };
-    if (!delay_callback_) {
-      delayed_callback_();
-    }
-  }
-  void EmptyResponse(
-      fit::function<void(fuchsia::ledger::Status)> callback) override {
-    EmptyResponseWithParameter(2, std::move(callback));
-  }
-  void EmptyResponseWithParameter(
-      int8_t input,
-      fit::function<void(fuchsia::ledger::Status)> callback) override {
-    parameter_received_ = input;
-    ++empty_reponse_count_;
-    delayed_callback_ = [callback = std::move(callback),
-                         status_to_return = status_to_return_] {
-      callback(status_to_return);
-    };
-    if (!delay_callback_) {
-      delayed_callback_();
-    }
-  }
-
-  void NotEmptyResponse(::fit::function<void(fuchsia::ledger::Status, int8_t)>
-                            callback) override {
-    NotEmptyResponseWithParameter(3, std::move(callback));
-  }
-  void NotEmptyResponseWithParameter(
-      int8_t input,
-      fit::function<void(fuchsia::ledger::Status, int8_t)> callback) override {
-    parameter_received_ = input;
-    ++not_empty_reponse_count_;
-    delayed_callback_ = [callback = std::move(callback),
-                         status_to_return = status_to_return_] {
-      callback(status_to_return, 1);
-    };
-    if (!delay_callback_) {
-      delayed_callback_();
-    }
-  }
-
-  int32_t no_reponse_count_ = 0;
-  int32_t empty_reponse_count_ = 0;
-  int32_t not_empty_reponse_count_ = 0;
-  int32_t parameter_received_ = 0;
-  fuchsia::ledger::Status status_to_return_ = fuchsia::ledger::Status::OK;
-  bool delay_callback_ = false;
-  fit::closure delayed_callback_;
-};
-
-class ErrorNotifierTest : public gtest::TestLoopFixture {
- protected:
-  ErrorNotifierTest() : binding_(&impl_, ptr_.NewRequest()) {}
-
-  ErrorNotifierTestErrorNotifierDelegateImpl impl_;
-  fuchsia::ledger::errornotifiertest::ErrorNotifierTestPtr ptr_;
-  ErrorNotifierBinding<fuchsia::ledger::errornotifiertest::
-                           ErrorNotifierTestErrorNotifierDelegate>
-      binding_;
-};
-
-TEST_F(ErrorNotifierTest, NoResponse) {
-  zx_status_t status;
-  bool error_called;
-
-  ptr_.set_error_handler(
-      callback::Capture(callback::SetWhenCalled(&error_called), &status));
-
-  ptr_->NoResponse();
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, impl_.no_reponse_count());
-  EXPECT_TRUE(ptr_);
-  EXPECT_FALSE(error_called);
-
-  impl_.status_to_return() = fuchsia::ledger::Status::IO_ERROR;
-  ptr_->NoResponse();
-  RunLoopUntilIdle();
-  EXPECT_EQ(2, impl_.no_reponse_count());
-  EXPECT_FALSE(ptr_);
-  EXPECT_TRUE(error_called);
-  EXPECT_EQ(static_cast<zx_status_t>(fuchsia::ledger::Status::IO_ERROR),
-            status);
-}
-
-TEST_F(ErrorNotifierTest, NoResponseWithParameter) {
-  ptr_->NoResponseWithParameter(42);
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, impl_.no_reponse_count());
-  EXPECT_EQ(42, impl_.parameter_received());
-}
-
-TEST_F(ErrorNotifierTest, NoResponseSync) {
-  impl_.delay_callback() = true;
-
-  bool sync_called;
-  ptr_->NoResponse();
-  ptr_->Sync(callback::SetWhenCalled(&sync_called));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(sync_called);
-
-  impl_.RunDelayedCallback();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(sync_called);
-}
-
-TEST_F(ErrorNotifierTest, EmptyResponse) {
-  zx_status_t status;
-  bool error_called;
-  bool callback_called;
-
-  ptr_.set_error_handler(
-      callback::Capture(callback::SetWhenCalled(&error_called), &status));
-
-  ptr_->EmptyResponse(callback::SetWhenCalled(&callback_called));
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, impl_.empty_reponse_count());
-  EXPECT_TRUE(callback_called);
-  EXPECT_TRUE(ptr_);
-  EXPECT_FALSE(error_called);
-
-  impl_.status_to_return() = fuchsia::ledger::Status::IO_ERROR;
-  ptr_->EmptyResponse(callback::SetWhenCalled(&callback_called));
-  RunLoopUntilIdle();
-  EXPECT_EQ(2, impl_.empty_reponse_count());
-  EXPECT_FALSE(callback_called);
-  EXPECT_FALSE(ptr_);
-  EXPECT_TRUE(error_called);
-  EXPECT_EQ(static_cast<zx_status_t>(fuchsia::ledger::Status::IO_ERROR),
-            status);
-}
-
-TEST_F(ErrorNotifierTest, EmptyResponseWithParameter) {
-  bool callback_called;
-
-  ptr_->EmptyResponseWithParameter(42,
-                                   callback::SetWhenCalled(&callback_called));
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, impl_.empty_reponse_count());
-  EXPECT_EQ(42, impl_.parameter_received());
-  EXPECT_TRUE(callback_called);
-}
-
-TEST_F(ErrorNotifierTest, EmptyResponseSync) {
-  impl_.delay_callback() = true;
-
-  bool callback_called;
-  bool sync_called;
-  ptr_->EmptyResponse(callback::SetWhenCalled(&callback_called));
-  ptr_->Sync(callback::SetWhenCalled(&sync_called));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_FALSE(sync_called);
-
-  impl_.RunDelayedCallback();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_TRUE(sync_called);
-}
-
-TEST_F(ErrorNotifierTest, NotEmptyResponse) {
-  zx_status_t status;
-  bool error_called;
-  bool callback_called;
-  int callback_value;
-
-  ptr_.set_error_handler(
-      callback::Capture(callback::SetWhenCalled(&error_called), &status));
-
-  ptr_->NotEmptyResponse(callback::Capture(
-      callback::SetWhenCalled(&callback_called), &callback_value));
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, impl_.not_empty_reponse_count());
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(1, callback_value);
-  EXPECT_TRUE(ptr_);
-  EXPECT_FALSE(error_called);
-
-  impl_.status_to_return() = fuchsia::ledger::Status::IO_ERROR;
-  ptr_->NotEmptyResponse(callback::Capture(
-      callback::SetWhenCalled(&callback_called), &std::ignore));
-  RunLoopUntilIdle();
-  EXPECT_EQ(2, impl_.not_empty_reponse_count());
-  EXPECT_FALSE(callback_called);
-  EXPECT_FALSE(ptr_);
-  EXPECT_TRUE(error_called);
-  EXPECT_EQ(static_cast<zx_status_t>(fuchsia::ledger::Status::IO_ERROR),
-            status);
-}
-
-TEST_F(ErrorNotifierTest, NotEmptyResponseWithParameter) {
-  bool callback_called;
-  int callback_value;
-
-  ptr_->NotEmptyResponseWithParameter(
-      42, callback::Capture(callback::SetWhenCalled(&callback_called),
-                            &callback_value));
-  RunLoopUntilIdle();
-  EXPECT_EQ(1, impl_.not_empty_reponse_count());
-  EXPECT_EQ(42, impl_.parameter_received());
-  EXPECT_TRUE(callback_called);
-  EXPECT_EQ(1, callback_value);
-}
-
-TEST_F(ErrorNotifierTest, NotEmptyResponseSync) {
-  impl_.delay_callback() = true;
-
-  bool callback_called;
-  bool sync_called;
-  ptr_->NotEmptyResponse(callback::Capture(
-      callback::SetWhenCalled(&callback_called), &std::ignore));
-  ptr_->Sync(callback::SetWhenCalled(&sync_called));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(callback_called);
-  EXPECT_FALSE(sync_called);
-
-  impl_.RunDelayedCallback();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(callback_called);
-  EXPECT_TRUE(sync_called);
-}
-
-TEST_F(ErrorNotifierTest, OnEmpty) {
-  bool called;
-  binding_.set_on_empty(callback::SetWhenCalled(&called));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-  ptr_.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(ErrorNotifierTest, OnEmptyWithRunningOperation) {
-  impl_.delay_callback() = true;
-  bool called;
-  binding_.set_on_empty(callback::SetWhenCalled(&called));
-  ptr_->NoResponse();
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-  ptr_.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-  impl_.RunDelayedCallback();
-  EXPECT_TRUE(called);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/fidl/error_notifier/fidl/BUILD.gn b/bin/ledger/fidl/error_notifier/fidl/BUILD.gn
deleted file mode 100644
index ae501f3..0000000
--- a/bin/ledger/fidl/error_notifier/fidl/BUILD.gn
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-fidl("fidl") {
-  name = "fuchsia.ledger.errornotifiertest"
-
-  sources = [
-    "error_notifier_test.fidl",
-  ]
-
-  deps = [
-    "//peridot/public/fidl/fuchsia.ledger",
-  ]
-}
diff --git a/bin/ledger/fidl/error_notifier/fidl/error_notifier_test.fidl b/bin/ledger/fidl/error_notifier/fidl/error_notifier_test.fidl
deleted file mode 100644
index 5acdaaf..0000000
--- a/bin/ledger/fidl/error_notifier/fidl/error_notifier_test.fidl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.ledger.errornotifiertest;
-
-using fuchsia.ledger;
-
-interface ErrorNotifierTest : fuchsia.ledger.ErrorNotifier {
-    1: NoResponse();
-    2: NoResponseWithParameter(int8 input);
-    3: EmptyResponse() -> ();
-    4: EmptyResponseWithParameter(int8 input) -> ();
-    5: NotEmptyResponse() -> (int8 value);
-    6: NotEmptyResponseWithParameter(int8 input) -> (int8 value);
-};
diff --git a/bin/ledger/fidl/include/BUILD.gn b/bin/ledger/fidl/include/BUILD.gn
deleted file mode 100644
index ad12044..0000000
--- a/bin/ledger/fidl/include/BUILD.gn
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("include") {
-  sources = [
-    "types.h",
-  ]
-
-  public_deps = [
-    "//peridot/bin/ledger/fidl",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-  ]
-}
diff --git a/bin/ledger/fidl/include/types.h b/bin/ledger/fidl/include/types.h
deleted file mode 100644
index 9712788..0000000
--- a/bin/ledger/fidl/include/types.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_FIDL_INCLUDE_TYPES_H_
-#define PERIDOT_BIN_LEDGER_FIDL_INCLUDE_TYPES_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-
-// More convenient aliases for FIDL types.
-
-namespace cloud_provider {
-using CloudProvider = fuchsia::ledger::cloud::CloudProvider;
-using CloudProviderPtr = fuchsia::ledger::cloud::CloudProviderPtr;
-using CommitPack = fuchsia::ledger::cloud::CommitPack;
-using DeviceSet = fuchsia::ledger::cloud::DeviceSet;
-using DeviceSetPtr = fuchsia::ledger::cloud::DeviceSetPtr;
-using DeviceSetWatcher = fuchsia::ledger::cloud::DeviceSetWatcher;
-using DeviceSetWatcherPtr = fuchsia::ledger::cloud::DeviceSetWatcherPtr;
-using PageCloud = fuchsia::ledger::cloud::PageCloud;
-using PageCloudPtr = fuchsia::ledger::cloud::PageCloudPtr;
-using PageCloudWatcher = fuchsia::ledger::cloud::PageCloudWatcher;
-using PageCloudWatcherPtr = fuchsia::ledger::cloud::PageCloudWatcherPtr;
-using Status = fuchsia::ledger::cloud::Status;
-using Token = fuchsia::ledger::cloud::Token;
-}  // namespace cloud_provider
-
-namespace ledger {
-using BytesOrReference = fuchsia::ledger::BytesOrReference;
-using BytesOrReferencePtr = fuchsia::ledger::BytesOrReferencePtr;
-using ConflictResolutionWaitStatus =
-    fuchsia::ledger::ConflictResolutionWaitStatus;
-using ConflictResolver = fuchsia::ledger::ConflictResolver;
-using ConflictResolverFactory = fuchsia::ledger::ConflictResolverFactory;
-using ConflictResolverFactoryPtr = fuchsia::ledger::ConflictResolverFactoryPtr;
-using ConflictResolverPtr = fuchsia::ledger::ConflictResolverPtr;
-using DiffEntry = fuchsia::ledger::DiffEntry;
-using IterationStatus = fuchsia::ledger::IterationStatus;
-using Entry = fuchsia::ledger::Entry;
-using InlinedEntry = fuchsia::ledger::InlinedEntry;
-using InlinedValue = fuchsia::ledger::InlinedValue;
-using InlinedValuePtr = fuchsia::ledger::InlinedValuePtr;
-using Ledger = fuchsia::ledger::Ledger;
-using LedgerPtr = fuchsia::ledger::LedgerPtr;
-using MergePolicy = fuchsia::ledger::MergePolicy;
-using MergeResultProvider = fuchsia::ledger::MergeResultProvider;
-using MergeResultProviderPtr = fuchsia::ledger::MergeResultProviderPtr;
-using MergedValue = fuchsia::ledger::MergedValue;
-using Page = fuchsia::ledger::Page;
-using PageChange = fuchsia::ledger::PageChange;
-using PageChangePtr = fuchsia::ledger::PageChangePtr;
-using PageId = fuchsia::ledger::PageId;
-using PageIdPtr = fuchsia::ledger::PageIdPtr;
-using PagePtr = fuchsia::ledger::PagePtr;
-using PageSnapshot = fuchsia::ledger::PageSnapshot;
-using PageSnapshotPtr = fuchsia::ledger::PageSnapshotPtr;
-using PageWatcher = fuchsia::ledger::PageWatcher;
-using PageWatcherPtr = fuchsia::ledger::PageWatcherPtr;
-using Priority = fuchsia::ledger::Priority;
-using Reference = fuchsia::ledger::Reference;
-using ReferencePtr = fuchsia::ledger::ReferencePtr;
-using ResultState = fuchsia::ledger::ResultState;
-using Status = fuchsia::ledger::Status;
-using SyncState = fuchsia::ledger::SyncState;
-using SyncWatcher = fuchsia::ledger::SyncWatcher;
-using SyncWatcherPtr = fuchsia::ledger::SyncWatcherPtr;
-using Token = fuchsia::ledger::Token;
-using Value = fuchsia::ledger::Value;
-using ValuePtr = fuchsia::ledger::ValuePtr;
-using ValueSource = fuchsia::ledger::ValueSource;
-}  // namespace ledger
-
-namespace ledger_internal {
-using Commit = fuchsia::ledger::internal::Commit;
-using CommitId = fuchsia::ledger::internal::CommitId;
-using CommitPtr = fuchsia::ledger::internal::CommitPtr;
-using LedgerController = fuchsia::ledger::internal::LedgerController;
-using LedgerControllerPtr = fuchsia::ledger::internal::LedgerControllerPtr;
-using LedgerDebug = fuchsia::ledger::internal::LedgerDebug;
-using LedgerDebugPtr = fuchsia::ledger::internal::LedgerDebugPtr;
-using LedgerRepository = fuchsia::ledger::internal::LedgerRepository;
-using LedgerRepositoryPtr = fuchsia::ledger::internal::LedgerRepositoryPtr;
-using LedgerRepositoryDebug = fuchsia::ledger::internal::LedgerRepositoryDebug;
-using LedgerRepositoryDebugPtr =
-    fuchsia::ledger::internal::LedgerRepositoryDebugPtr;
-using LedgerRepositoryFactory =
-    fuchsia::ledger::internal::LedgerRepositoryFactory;
-using LedgerRepositoryFactoryPtr =
-    fuchsia::ledger::internal::LedgerRepositoryFactoryPtr;
-using PageDebug = fuchsia::ledger::internal::PageDebug;
-using PageDebugPtr = fuchsia::ledger::internal::PageDebugPtr;
-}  // namespace ledger_internal
-
-#endif  // PERIDOT_BIN_LEDGER_FIDL_INCLUDE_TYPES_H_
diff --git a/bin/ledger/fidl/internal.fidl b/bin/ledger/fidl/internal.fidl
deleted file mode 100644
index 0135905..0000000
--- a/bin/ledger/fidl/internal.fidl
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.ledger.internal;
-
-using fuchsia.ledger;
-using fuchsia.ledger.cloud;
-
-// Entry interface implemented by the Ledger application, intended to be used by
-// the process setting up the user environment to obtain repositories for
-// individual users.
-[Discoverable]
-interface LedgerRepositoryFactory : fuchsia.ledger.ErrorNotifier {
-    // Binds to the directory referenced by |repository|. If this is called
-    // multiple times for the same directory, only the first instance of
-    // |server_id| / |cloud_provider| will be used. Any subsequent ones will
-    // simply be ignored.
-    //
-    // Parameters:
-    // |repository_directory| channel pointing to the disk directory where the
-    //     repository is stored. At any given time, at most one repository
-    //     instance backed by the same disk directory can be running
-    //     concurrently.
-    //     TODO(qsr): Use typed channel when remoteio has been migrated to FIDL2.
-    // |cloud_provider| is used by Ledger to synchronize data through the
-    //     cloud. If |cloud_provider| is disconnected, Ledger shuts down the
-    //     repository and disconnects all clients.
-    // |user_id| is a unique, not device local, user identifier. It will be
-    //     used to enable Peer to Peer over NetConnector, and will be removed
-    //     once Ledger uses Overnet for Peer to Peer communication. If it is
-    //     empty, Ledger will not synchronize using Peer to Peer communication.
-    1: GetRepository(handle<channel> repository_directory,
-                     fuchsia.ledger.cloud.CloudProvider? cloud_provider,
-                     string user_id,
-                     request<LedgerRepository> repository);
-};
-
-// Controller interface for the Ledger application lifecycle.
-[Discoverable]
-interface LedgerController {
-    // Terminate the ledger application.
-    1: Terminate();
-};
-
-interface LedgerRepository : fuchsia.ledger.ErrorNotifier {
-    // Creates a new Ledger for the given |ledger_name| if it doesn't already
-    // exist.
-    1: GetLedger(vector<uint8> ledger_name, request<fuchsia.ledger.Ledger> ledger);
-
-    // Binds a new LedgerRepository handle to this repository.
-    2: Duplicate(request<LedgerRepository> ledger_repository);
-
-    // Sets a watcher to track the synchronization state of a user's Ledger. The
-    // current state is immediately sent to the watcher when this method is
-    // called.
-    3: SetSyncStateWatcher(fuchsia.ledger.SyncWatcher watcher);
-
-    // Returns the debugging interface for this LedgerRepository
-    4: GetLedgerRepositoryDebug(request<LedgerRepositoryDebug> ledgerRepositoryDebug);
-
-    // Tries to clean up disk space on the device by removing unused data that are
-    // already backed up in the cloud.
-    5: DiskCleanUp();
-};
diff --git a/bin/ledger/fidl_helpers/BUILD.gn b/bin/ledger/fidl_helpers/BUILD.gn
deleted file mode 100644
index 9c6570c..0000000
--- a/bin/ledger/fidl_helpers/BUILD.gn
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("fidl_helpers") {
-  sources = [
-    "bound_interface.h",
-    "bound_interface_set.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/fidl_helpers/bound_interface.h b/bin/ledger/fidl_helpers/bound_interface.h
deleted file mode 100644
index 1e1d3a1..0000000
--- a/bin/ledger/fidl_helpers/bound_interface.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_FIDL_HELPERS_BOUND_INTERFACE_H_
-#define PERIDOT_BIN_LEDGER_FIDL_HELPERS_BOUND_INTERFACE_H_
-
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-namespace ledger {
-namespace fidl_helpers {
-template <class Interface, class Impl>
-class BoundInterface {
- public:
-  template <class... Args>
-  explicit BoundInterface(fidl::InterfaceRequest<Interface> request,
-                          Args&&... args)
-      : impl_(std::forward<Args>(args)...),
-        binding_(&impl_, std::move(request)) {}
-
-  template <class... Args>
-  explicit BoundInterface(Args&&... args)
-      : impl_(std::forward<Args>(args)...), binding_(&impl_) {}
-
-  void Bind(fidl::InterfaceRequest<Interface> request) {
-    binding_.Bind(std::move(request));
-  }
-
-  void set_on_empty(fit::closure on_empty_callback) {
-    binding_.set_error_handler(
-        [this,
-         on_empty_callback = std::move(on_empty_callback)](zx_status_t status) {
-          binding_.Unbind();
-          if (on_empty_callback)
-            on_empty_callback();
-        });
-  }
-
-  bool is_bound() { return binding_.is_bound(); }
-
-  Impl* impl() { return &impl_; }
-
- private:
-  Impl impl_;
-  fidl::Binding<Interface> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(BoundInterface);
-};
-}  // namespace fidl_helpers
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_FIDL_HELPERS_BOUND_INTERFACE_H_
diff --git a/bin/ledger/fidl_helpers/bound_interface_set.h b/bin/ledger/fidl_helpers/bound_interface_set.h
deleted file mode 100644
index 38532e9..0000000
--- a/bin/ledger/fidl_helpers/bound_interface_set.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_FIDL_HELPERS_BOUND_INTERFACE_SET_H_
-#define PERIDOT_BIN_LEDGER_FIDL_HELPERS_BOUND_INTERFACE_SET_H_
-
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-namespace ledger {
-namespace fidl_helpers {
-template <class Interface, class Impl>
-class BoundInterfaceSet {
- public:
-  template <class... Args>
-  explicit BoundInterfaceSet(Args&&... args)
-      : impl_(std::forward<Args>(args)...) {}
-
-  void AddBinding(fidl::InterfaceRequest<Interface> request) {
-    binding_.AddBinding(&impl_, std::move(request));
-  }
-
-  void CloseAll() { binding_.CloseAll(); }
-
-  void set_on_empty(fit::closure on_empty) {
-    binding_.set_empty_set_handler(std::move(on_empty));
-  }
-
-  bool is_bound() { return binding_.is_bound(); }
-
-  size_t size() const { return binding_.size(); }
-
- private:
-  Impl impl_;
-  fidl::BindingSet<Interface> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(BoundInterfaceSet);
-};
-}  // namespace fidl_helpers
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_FIDL_HELPERS_BOUND_INTERFACE_SET_H_
diff --git a/bin/ledger/filesystem/BUILD.gn b/bin/ledger/filesystem/BUILD.gn
deleted file mode 100644
index 845beda..0000000
--- a/bin/ledger/filesystem/BUILD.gn
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("filesystem") {
-  sources = [
-    "detached_path.cc",
-    "detached_path.h",
-    "directory_reader.cc",
-    "directory_reader.h",
-    "get_directory_content_size.cc",
-    "get_directory_content_size.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//zircon/public/lib/fit",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "detached_path_unittest.cc",
-    "directory_reader_unittest.cc",
-    "get_directory_content_size_unittest.cc",
-  ]
-
-  deps = [
-    ":filesystem",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/scoped_tmpfs",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/filesystem/detached_path.cc b/bin/ledger/filesystem/detached_path.cc
deleted file mode 100644
index 5a5a595..0000000
--- a/bin/ledger/filesystem/detached_path.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-
-#include <lib/fxl/strings/concatenate.h>
-
-#include <utility>
-
-namespace ledger {
-
-DetachedPath::DetachedPath(int root_fd, std::string path)
-    : root_fd_(root_fd), path_(std::move(path)) {}
-
-DetachedPath::DetachedPath(std::string path)
-    : root_fd_(AT_FDCWD), path_(std::move(path)) {}
-
-DetachedPath::~DetachedPath() {}
-
-DetachedPath::DetachedPath(const DetachedPath& other) = default;
-
-DetachedPath::DetachedPath(DetachedPath&& other) noexcept = default;
-
-DetachedPath& DetachedPath::operator=(const DetachedPath& other) = default;
-
-DetachedPath& DetachedPath::operator=(DetachedPath&&) noexcept = default;
-
-DetachedPath DetachedPath::SubPath(fxl::StringView path) const {
-  return DetachedPath(root_fd_, fxl::Concatenate({path_, "/", path}));
-}
-
-DetachedPath DetachedPath::SubPath(
-    std::initializer_list<fxl::StringView> components) const {
-  std::string end_path = path_;
-  for (const auto& component : components) {
-    end_path.push_back('/');
-    end_path.append(component.data(), component.size());
-  }
-  return DetachedPath(root_fd_, std::move(end_path));
-}
-
-fxl::UniqueFD DetachedPath::OpenFD(DetachedPath* detatched_path) const {
-  fxl::UniqueFD fd(
-      openat(root_fd_, path_.c_str(), O_RDONLY | O_PATH | O_DIRECTORY));
-  if (fd.is_valid()) {
-    *detatched_path = ledger::DetachedPath(fd.get());
-  }
-  return fd;
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/filesystem/detached_path.h b/bin/ledger/filesystem/detached_path.h
deleted file mode 100644
index 286e666..0000000
--- a/bin/ledger/filesystem/detached_path.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_FILESYSTEM_DETACHED_PATH_H_
-#define PERIDOT_BIN_LEDGER_FILESYSTEM_DETACHED_PATH_H_
-
-#include <fcntl.h>
-#include <string>
-
-#include <lib/fxl/files/unique_fd.h>
-#include <lib/fxl/strings/string_view.h>
-
-namespace ledger {
-
-// Abstraction for a path rooted at a file descriptor.
-//
-// This class doesn't take ownership of the file descriptor and it is expected
-// that the file descriptor will outlive this class and any sub path created
-// from it.
-class DetachedPath {
- public:
-  // If |path| is absolute, DetachedPath is equivalent to it. If |path| is
-  // relative, it is resolved with |root_fd| as reference. See |openat(2)|.
-  explicit DetachedPath(int root_fd = AT_FDCWD, std::string path = ".");
-  // If |path| is absolute, DetachedPath is equivalent to it. If |path| is
-  // relative, it is resolved relative to the current working directory.
-  explicit DetachedPath(std::string path);
-  ~DetachedPath();
-  DetachedPath(const DetachedPath& other);
-  DetachedPath(DetachedPath&& other) noexcept;
-  DetachedPath& operator=(const DetachedPath& other);
-  DetachedPath& operator=(DetachedPath&& /*unused*/) noexcept;
-
-  // The file descriptor to the base directory of this path.
-  int root_fd() const { return root_fd_; };
-  // The relative path to |root_fd|.
-  const std::string& path() const { return path_; };
-
-  // A |DetachedPath| representing the |path| appended to the current path.
-  DetachedPath SubPath(fxl::StringView path) const;
-  // A |DetachedPath| representing all the |path| in |components| appended to
-  // the current path.
-  DetachedPath SubPath(std::initializer_list<fxl::StringView> components) const;
-
-  // Opens a UniqueFD at the current path. If the operation fails, the returned
-  // UniqueFd will be invalid.
-  fxl::UniqueFD OpenFD(DetachedPath* detatched_path) const;
-
- private:
-  int root_fd_;
-  std::string path_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_FILESYSTEM_DETACHED_PATH_H_
diff --git a/bin/ledger/filesystem/detached_path_unittest.cc b/bin/ledger/filesystem/detached_path_unittest.cc
deleted file mode 100644
index 5507326..0000000
--- a/bin/ledger/filesystem/detached_path_unittest.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-
-#include <lib/fxl/files/directory.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace ledger {
-namespace {
-
-TEST(DetachedPathTest, Creation) {
-  DetachedPath path1;
-  EXPECT_EQ(AT_FDCWD, path1.root_fd());
-  EXPECT_EQ(".", path1.path());
-
-  DetachedPath path2(1);
-  EXPECT_EQ(1, path2.root_fd());
-  EXPECT_EQ(".", path2.path());
-
-  DetachedPath path3(1, "foo");
-  EXPECT_EQ(1, path3.root_fd());
-  EXPECT_EQ("foo", path3.path());
-}
-
-TEST(DetachedPathTest, RelativeToDotSubPath) {
-  DetachedPath path(1);
-  DetachedPath subpath1 = path.SubPath("foo");
-  EXPECT_EQ(1, subpath1.root_fd());
-  EXPECT_EQ("./foo", subpath1.path());
-  DetachedPath subpath2 = path.SubPath({"foo", "bar"});
-  EXPECT_EQ(1, subpath2.root_fd());
-  EXPECT_EQ("./foo/bar", subpath2.path());
-}
-
-TEST(DetachedPathTest, RelativeToDirSubPath) {
-  DetachedPath path(1, "base");
-  DetachedPath subpath1 = path.SubPath("foo");
-  EXPECT_EQ(1, subpath1.root_fd());
-  EXPECT_EQ("base/foo", subpath1.path());
-  DetachedPath subpath2 = path.SubPath({"foo", "bar"});
-  EXPECT_EQ(1, subpath2.root_fd());
-  EXPECT_EQ("base/foo/bar", subpath2.path());
-}
-
-TEST(DetachedPathTest, AbsoluteSubPath) {
-  DetachedPath path(1, "/base");
-  DetachedPath subpath1 = path.SubPath("foo");
-  EXPECT_EQ(1, subpath1.root_fd());
-  EXPECT_EQ("/base/foo", subpath1.path());
-  DetachedPath subpath2 = path.SubPath({"foo", "bar"});
-  EXPECT_EQ(1, subpath2.root_fd());
-  EXPECT_EQ("/base/foo/bar", subpath2.path());
-}
-
-TEST(DetatchedPathTest, OpenFD) {
-  scoped_tmpfs::ScopedTmpFS tmpfs;
-  DetachedPath path(tmpfs.root_fd(), "base");
-  DetachedPath subpath = path.SubPath("foo");
-  EXPECT_EQ(path.root_fd(), subpath.root_fd());
-  EXPECT_EQ("base/foo", subpath.path());
-
-  DetachedPath new_subpath;
-  ASSERT_TRUE(files::CreateDirectoryAt(subpath.root_fd(), subpath.path()));
-  fxl::UniqueFD fd = path.OpenFD(&new_subpath);
-  EXPECT_TRUE(fd.is_valid());
-  EXPECT_NE(subpath.root_fd(), new_subpath.root_fd());
-  EXPECT_EQ(".", new_subpath.path());
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/filesystem/directory_reader.cc b/bin/ledger/filesystem/directory_reader.cc
deleted file mode 100644
index 1397dca..0000000
--- a/bin/ledger/filesystem/directory_reader.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/filesystem/directory_reader.h"
-
-#include <dirent.h>
-#include <fcntl.h>
-#include <functional>
-#include <memory>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/strings/string_view.h>
-
-namespace ledger {
-namespace {
-
-void SafeCloseDir(DIR* dir) {
-  if (dir)
-    closedir(dir);
-}
-
-}  // namespace
-
-bool GetDirectoryEntries(const DetachedPath& directory,
-                         fit::function<bool(fxl::StringView)> callback) {
-  int dir_fd = openat(directory.root_fd(), directory.path().c_str(), O_RDONLY);
-  if (dir_fd == -1) {
-    return false;
-  }
-  std::unique_ptr<DIR, decltype(&SafeCloseDir)> dir(fdopendir(dir_fd),
-                                                    SafeCloseDir);
-  if (!dir)
-    return false;
-  for (struct dirent* entry = readdir(dir.get()); entry != nullptr;
-       entry = readdir(dir.get())) {
-    char* name = entry->d_name;
-    if (name[0]) {
-      if (name[0] == '.') {
-        if (!name[1] || (name[1] == '.' && !name[2])) {
-          // . or ..
-          continue;
-        }
-      }
-      if (!callback(fxl::StringView(name))) {
-        break;
-      }
-    }
-  }
-  return true;
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/filesystem/directory_reader.h b/bin/ledger/filesystem/directory_reader.h
deleted file mode 100644
index 795b470..0000000
--- a/bin/ledger/filesystem/directory_reader.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_FILESYSTEM_DIRECTORY_READER_H_
-#define PERIDOT_BIN_LEDGER_FILESYSTEM_DIRECTORY_READER_H_
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-
-namespace ledger {
-
-// Returns the list of directories and files inside the provided directory. The
-// callback will be called once for each directory and files and is guaranteed
-// to never be called again once this method returns. This method will returns
-// immediately if |callback| returns |false|. This method will returns |false|
-// if an error occured while reading the directory and |true| otherwise.
-bool GetDirectoryEntries(const DetachedPath& directory,
-                         fit::function<bool(fxl::StringView)> callback);
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_FILESYSTEM_DIRECTORY_READER_H_
diff --git a/bin/ledger/filesystem/directory_reader_unittest.cc b/bin/ledger/filesystem/directory_reader_unittest.cc
deleted file mode 100644
index 26c291c..0000000
--- a/bin/ledger/filesystem/directory_reader_unittest.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/filesystem/directory_reader.h"
-
-#include <fcntl.h>
-#include <set>
-
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/files/unique_fd.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kFileContent = "file content";
-
-TEST(DirectoryReaderTest, GetDirectoryEntries) {
-  scoped_tmpfs::ScopedTmpFS tmpfs;
-
-  ASSERT_TRUE(files::CreateDirectoryAt(tmpfs.root_fd(), "foo"));
-  ASSERT_TRUE(files::WriteFileAt(tmpfs.root_fd(), "bar", kFileContent.data(),
-                                 kFileContent.size()));
-  ASSERT_TRUE(files::WriteFileAt(tmpfs.root_fd(), "foo/baz",
-                                 kFileContent.data(), kFileContent.size()));
-
-  std::set<std::string> expected_entries = {"foo", "bar"};
-
-  EXPECT_TRUE(GetDirectoryEntries(
-      DetachedPath(tmpfs.root_fd()),
-      [&expected_entries](fxl::StringView entry) {
-        auto entry_iterator = expected_entries.find(entry.ToString());
-        EXPECT_NE(entry_iterator, expected_entries.end());
-        expected_entries.erase(entry_iterator);
-        return true;
-      }));
-  EXPECT_EQ(expected_entries.size(), 0u);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/filesystem/get_directory_content_size.cc b/bin/ledger/filesystem/get_directory_content_size.cc
deleted file mode 100644
index 732f86f..0000000
--- a/bin/ledger/filesystem/get_directory_content_size.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/filesystem/get_directory_content_size.h"
-
-#include <queue>
-#include <string>
-
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/files/path.h>
-
-#include "peridot/bin/ledger/filesystem/directory_reader.h"
-
-namespace ledger {
-
-bool GetDirectoryContentSize(DetachedPath directory, uint64_t* size) {
-  *size = 0;
-  std::queue<DetachedPath> directories;
-  directories.push(std::move(directory));
-  while (!directories.empty()) {
-    DetachedPath parent = std::move(directories.front());
-    directories.pop();
-    if (!GetDirectoryEntries(parent, [&parent, size,
-                                      &directories](fxl::StringView child) {
-          DetachedPath child_path = parent.SubPath(child);
-          if (files::IsDirectoryAt(child_path.root_fd(), child_path.path())) {
-            directories.push(child_path);
-          } else {
-            uint64_t file_size = 0;
-            if (!files::GetFileSizeAt(child_path.root_fd(), child_path.path(),
-                                      &file_size)) {
-              FXL_LOG(ERROR)
-                  << "Couldn't get file size of " << child_path.path();
-              return false;
-            }
-            *size += file_size;
-          }
-          return true;
-        })) {
-      FXL_LOG(ERROR) << "Couldn't retrieve contents of " << parent.path();
-      return false;
-    }
-  }
-  return true;
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/filesystem/get_directory_content_size.h b/bin/ledger/filesystem/get_directory_content_size.h
deleted file mode 100644
index e15969f..0000000
--- a/bin/ledger/filesystem/get_directory_content_size.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_FILESYSTEM_GET_DIRECTORY_CONTENT_SIZE_H_
-#define PERIDOT_BIN_LEDGER_FILESYSTEM_GET_DIRECTORY_CONTENT_SIZE_H_
-
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-
-namespace ledger {
-
-// Recursively compute the full size of the directory. If a directory (top-level
-// |directory| or any of the nested ones) contents can't be retrieved or the
-// size of any of the non-directory entries can't be obtained, this will return
-// false and post an error in the log. Otherwise, |size| will contain the
-// accumulated size in bytes.
-bool GetDirectoryContentSize(DetachedPath directory, uint64_t* size);
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_FILESYSTEM_GET_DIRECTORY_CONTENT_SIZE_H_
diff --git a/bin/ledger/filesystem/get_directory_content_size_unittest.cc b/bin/ledger/filesystem/get_directory_content_size_unittest.cc
deleted file mode 100644
index 2ad461f..0000000
--- a/bin/ledger/filesystem/get_directory_content_size_unittest.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/filesystem/get_directory_content_size.h"
-
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace ledger {
-namespace {
-
-const std::string kFileContent = "file content";
-
-TEST(GetDirectoryContentSizeTest, GetDirectoryContentSize) {
-  scoped_tmpfs::ScopedTmpFS scoped_tmpfs;
-  DetachedPath root(scoped_tmpfs.root_fd());
-  DetachedPath foo = root.SubPath("foo");
-  DetachedPath bar = root.SubPath("bar");
-  DetachedPath foo_baz = foo.SubPath("baz");
-
-  ASSERT_TRUE(files::CreateDirectoryAt(foo.root_fd(), foo.path()));
-  ASSERT_TRUE(files::WriteFileAt(bar.root_fd(), bar.path(), kFileContent.data(),
-                                 kFileContent.size()));
-  ASSERT_TRUE(files::WriteFileAt(foo_baz.root_fd(), foo_baz.path(),
-                                 kFileContent.data(), kFileContent.size()));
-  uint64_t directory_size = 0;
-  ASSERT_TRUE(GetDirectoryContentSize(root, &directory_size));
-  ASSERT_EQ(directory_size, 2 * kFileContent.size());
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/ledger_e2e_sync_credentials.ciphertext b/bin/ledger/ledger_e2e_sync_credentials.ciphertext
deleted file mode 100644
index 19df0aa..0000000
--- a/bin/ledger/ledger_e2e_sync_credentials.ciphertext
+++ /dev/null
Binary files differ
diff --git a/bin/ledger/lock/BUILD.gn b/bin/ledger/lock/BUILD.gn
deleted file mode 100644
index 7e2f9b6..0000000
--- a/bin/ledger/lock/BUILD.gn
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("lock") {
-  sources = [
-    "lock.cc",
-    "lock.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/coroutine",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "lock_unittest.cc",
-  ]
-
-  deps = [
-    ":lock",
-    "//garnet/public/lib/fxl",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/lock/lock.cc b/bin/ledger/lock/lock.cc
deleted file mode 100644
index 60bd642..0000000
--- a/bin/ledger/lock/lock.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/lock/lock.h"
-
-#include <lib/callback/capture.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-namespace lock {
-namespace {
-class LockImpl : public Lock {
- public:
-  LockImpl() : weak_ptr_factory_(this) {}
-
-  ~LockImpl() override {
-    if (serialization_callback_) {
-      serialization_callback_();
-    }
-  }
-
-  coroutine::ContinuationStatus Acquire(
-      coroutine::CoroutineHandler* const handler,
-      callback::OperationSerializer* const serializer) {
-    return SyncCall(handler, [weak_this = weak_ptr_factory_.GetWeakPtr(),
-                              serializer](fit::function<void()> sync_callback) {
-      serializer->Serialize<>(
-          [] {},
-          [weak_this, sync_callback = std::move(sync_callback)](
-              fit::closure serialization_callback) mutable {
-            // Moving sync_callback to the stack as the serialization_callback
-            // might delete this closure.
-            auto sync_callback_local = std::move(sync_callback);
-            if (weak_this) {
-              weak_this->serialization_callback_ =
-                  std::move(serialization_callback);
-            } else {
-              serialization_callback();
-            }
-            sync_callback_local();
-          });
-    });
-  }
-
- private:
-  fit::closure serialization_callback_;
-
-  fxl::WeakPtrFactory<LockImpl> weak_ptr_factory_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(LockImpl);
-};
-}  // namespace
-
-coroutine::ContinuationStatus AcquireLock(
-    coroutine::CoroutineHandler* const handler,
-    callback::OperationSerializer* const serializer,
-    std::unique_ptr<Lock>* lock) {
-  std::unique_ptr<LockImpl> impl = std::make_unique<LockImpl>();
-  coroutine::ContinuationStatus status = impl->Acquire(handler, serializer);
-  if (status == coroutine::ContinuationStatus::OK) {
-    *lock = std::move(impl);
-  }
-  return status;
-}
-
-}  // namespace lock
diff --git a/bin/ledger/lock/lock.h b/bin/ledger/lock/lock.h
deleted file mode 100644
index 68bbdca..0000000
--- a/bin/ledger/lock/lock.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_LOCK_LOCK_H_
-#define PERIDOT_BIN_LEDGER_LOCK_LOCK_H_
-
-#include <memory>
-
-#include <lib/callback/operation_serializer.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-
-namespace lock {
-// A lock. As long as this object lives, OperationSerializer blocks all other
-// operations.
-class Lock {
- public:
-  virtual ~Lock() {}
-};
-
-// Creates and acquires a lock.
-// |handler| and |serializer| are inputs, |lock| is the output.
-// Returns OK if the lock is acquired (meaning the coroutine is now running as
-// a serialized operation of |serializer|), and INTERRUPTED if the coroutine
-// stack must be unwound immediately (see coroutine::SyncCall for this case).
-FXL_WARN_UNUSED_RESULT coroutine::ContinuationStatus AcquireLock(
-    coroutine::CoroutineHandler* handler,
-    callback::OperationSerializer* serializer, std::unique_ptr<Lock>* lock);
-
-}  // namespace lock
-
-#endif  // PERIDOT_BIN_LEDGER_LOCK_LOCK_H_
diff --git a/bin/ledger/lock/lock_unittest.cc b/bin/ledger/lock/lock_unittest.cc
deleted file mode 100644
index d0cd704..0000000
--- a/bin/ledger/lock/lock_unittest.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/lock/lock.h"
-
-#include <lib/fit/function.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-
-namespace lock {
-namespace {
-size_t Fact(size_t n) {
-  if (n == 0) {
-    return 1;
-  }
-  return Fact(n - 1) * n;
-}
-
-void UseStack() { EXPECT_EQ(120u, Fact(5)); }
-
-TEST(Lock, OneLock) {
-  coroutine::CoroutineServiceImpl coroutine_service;
-  callback::OperationSerializer serializer;
-
-  fit::function<void(size_t)> callback;
-  auto callable = [&callback](fit::function<void(size_t)> called_callback) {
-    callback = std::move(called_callback);
-  };
-
-  size_t received_value = 0;
-  size_t other_value = 0;
-  coroutine_service.StartCoroutine([&serializer, callable, &received_value](
-                                       coroutine::CoroutineHandler* handler) {
-    std::unique_ptr<Lock> lock;
-    EXPECT_EQ(coroutine::ContinuationStatus::OK,
-              AcquireLock(handler, &serializer, &lock));
-    UseStack();
-    size_t value;
-    EXPECT_EQ(coroutine::ContinuationStatus::OK,
-              SyncCall(handler, callable, &value));
-    UseStack();
-    received_value = value;
-  });
-
-  EXPECT_TRUE(callback);
-  EXPECT_EQ(0u, received_value);
-  EXPECT_EQ(0u, other_value);
-
-  serializer.Serialize<>([&other_value] { other_value = 1u; },
-                         [](fit::closure closure) { closure(); });
-
-  EXPECT_EQ(0u, other_value);
-  callback(1);
-
-  EXPECT_EQ(1u, received_value);
-  EXPECT_EQ(1u, other_value);
-}
-
-TEST(Lock, ManyLocks) {
-  constexpr size_t nb_routines = 10;
-  coroutine::CoroutineServiceImpl coroutine_service;
-  callback::OperationSerializer serializer;
-
-  std::queue<fit::function<void(size_t)>> callbacks;
-
-  std::vector<size_t> received_values;
-  for (size_t i = 0; i < nb_routines; i++) {
-    auto callable = [&callbacks](fit::function<void(size_t)> called_callback) {
-      callbacks.push(std::move(called_callback));
-    };
-    coroutine_service.StartCoroutine([&serializer, callable, &received_values](
-                                         coroutine::CoroutineHandler* handler) {
-      std::unique_ptr<Lock> lock;
-      EXPECT_EQ(coroutine::ContinuationStatus::OK,
-                AcquireLock(handler, &serializer, &lock));
-      UseStack();
-      size_t value;
-      EXPECT_EQ(coroutine::ContinuationStatus::OK,
-                SyncCall(handler, callable, &value));
-      UseStack();
-      received_values.push_back(value);
-    });
-  }
-
-  for (size_t i = 0; i < nb_routines; i++) {
-    EXPECT_EQ(1u, callbacks.size());
-    EXPECT_EQ(i, received_values.size());
-    callbacks.front()(i);
-    callbacks.pop();
-    EXPECT_EQ(i, *received_values.rbegin());
-  }
-  EXPECT_EQ(nb_routines, received_values.size());
-}
-
-TEST(Lock, Interrupted) {
-  callback::OperationSerializer serializer;
-  coroutine::CoroutineHandler* handler_ptr = nullptr;
-
-  fit::function<void()> callback;
-  auto callable = [&callback](fit::function<void()> called_callback) {
-    callback = std::move(called_callback);
-  };
-
-  serializer.Serialize<>([] {}, callable);
-
-  bool executed = false;
-  {
-    coroutine::CoroutineServiceImpl coroutine_service;
-    coroutine_service.StartCoroutine([&serializer, &executed, &handler_ptr](
-                                         coroutine::CoroutineHandler* handler) {
-      handler_ptr = handler;
-      std::unique_ptr<Lock> lock;
-      // We are interrupted.
-      EXPECT_EQ(coroutine::ContinuationStatus::INTERRUPTED,
-                AcquireLock(handler, &serializer, &lock));
-      executed = true;
-      return;
-    });
-
-    EXPECT_TRUE(callback);
-    EXPECT_FALSE(executed);
-  }
-
-  EXPECT_TRUE(executed);
-
-  callback();
-
-  callback = nullptr;
-
-  serializer.Serialize<>([] {}, callable);
-  EXPECT_TRUE(callback);
-}
-
-}  // namespace
-}  // namespace lock
diff --git a/bin/ledger/meta/ledger.cmx b/bin/ledger/meta/ledger.cmx
deleted file mode 100644
index b20ae2f..0000000
--- a/bin/ledger/meta/ledger.cmx
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.netconnector.NetConnector",
-            "fuchsia.net.LegacySocketProvider",
-            "fuchsia.net.SocketProvider",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.cobalt.LoggerFactory"
-        ]
-    }
-}
diff --git a/bin/ledger/p2p_provider/impl/BUILD.gn b/bin/ledger/p2p_provider/impl/BUILD.gn
deleted file mode 100644
index 13268d4..0000000
--- a/bin/ledger/p2p_provider/impl/BUILD.gn
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/flatbuffers/flatbuffer.gni")
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("impl") {
-  sources = [
-    "p2p_provider_impl.cc",
-    "p2p_provider_impl.h",
-    "remote_connection.cc",
-    "remote_connection.h",
-    "static_user_id_provider.cc",
-    "static_user_id_provider.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/fidl/fuchsia.netconnector",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/netconnector/cpp",
-    "//peridot/bin/ledger/filesystem",
-    "//peridot/bin/ledger/p2p_provider/public",
-    "//peridot/lib/convert",
-  ]
-
-  deps = [
-    ":envelope",
-    "//garnet/public/lib/backoff",
-    "//garnet/public/lib/callback",
-    "//peridot/bin/ledger/environment",
-    "//peridot/lib/convert",
-    "//peridot/lib/firebase_auth",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-  ]
-}
-
-flatbuffer("envelope") {
-  sources = [
-    "envelope.fbs",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "p2p_provider_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":impl",
-    "//garnet/public/lib/backoff/testing",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/bin/ledger/testing/netconnector",
-
-    # gtest matchers are in gmock.
-    "//third_party/googletest:gmock",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/p2p_provider/impl/envelope.fbs b/bin/ledger/p2p_provider/impl/envelope.fbs
deleted file mode 100644
index 548ab2a..0000000
--- a/bin/ledger/p2p_provider/impl/envelope.fbs
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-namespace p2p_provider;
-
-// Handshake. Gives the host_name of the device. Will be the first message
-// once a connection is established.
-table Handshake {
-  version: ushort;
-  host_name: [ubyte];
-}
-
-table Message {
-  data: [ubyte];
-}
-
-union EnvelopeMessage {
-  Handshake,
-  Message,
-}
-
-// Envelope is the type of messages sent between devices. It contains either a
-// handshake, internal to the P2P provider, or a payload from the
-// synchronization layer.
-table Envelope {
-  message: EnvelopeMessage;
-}
-
-root_type Envelope;
diff --git a/bin/ledger/p2p_provider/impl/p2p_provider_impl.cc b/bin/ledger/p2p_provider/impl/p2p_provider_impl.cc
deleted file mode 100644
index f710fd4..0000000
--- a/bin/ledger/p2p_provider/impl/p2p_provider_impl.cc
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_provider/impl/p2p_provider_impl.h"
-
-#include <algorithm>
-#include <iterator>
-
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/ledger/p2p_provider/impl/envelope_generated.h"
-
-namespace p2p_provider {
-namespace {
-constexpr char kRespondingServiceName[] = "ledger-p2p-";
-const uint16_t kCurrentVersion = 0;
-
-bool ValidateHandshake(const Envelope* envelope, const Handshake** message) {
-  if (envelope->message_type() != EnvelopeMessage_Handshake) {
-    FXL_LOG(ERROR) << "Incorrect message type: " << envelope->message_type();
-    return false;
-  }
-  *message = static_cast<const Handshake*>(envelope->message());
-  if ((*message)->version() != kCurrentVersion) {
-    FXL_LOG(ERROR) << "Incorrect message version: " << (*message)->version();
-    return false;
-  }
-  return true;
-}
-
-}  // namespace
-
-P2PProviderImpl::P2PProviderImpl(
-    std::string host_name, fuchsia::netconnector::NetConnectorPtr net_connector,
-    std::unique_ptr<p2p_provider::UserIdProvider> user_id_provider)
-    : host_name_(std::move(host_name)),
-      net_connector_(std::move(net_connector)),
-      user_id_provider_(std::move(user_id_provider)) {}
-
-P2PProviderImpl::~P2PProviderImpl() {}
-
-void P2PProviderImpl::Start(Client* client) {
-  FXL_DCHECK(!client_);
-  FXL_DCHECK(client);
-  client_ = client;
-  user_id_provider_->GetUserId(
-      [this](UserIdProvider::Status status, std::string user_id) {
-        if (status != UserIdProvider::Status::OK) {
-          FXL_LOG(ERROR) << "Unable to retrieve the user ID necessary to start "
-                            "the peer-to-peer provider.";
-          return;
-        }
-        user_id_ = user_id;
-        StartService();
-      });
-}
-
-bool P2PProviderImpl::SendMessage(fxl::StringView destination,
-                                  fxl::StringView data) {
-  flatbuffers::FlatBufferBuilder buffer;
-  flatbuffers::Offset<Message> message =
-      CreateMessage(buffer, convert::ToFlatBufferVector(&buffer, data));
-  flatbuffers::Offset<Envelope> envelope =
-      CreateEnvelope(buffer, EnvelopeMessage_Message, message.Union());
-  buffer.Finish(envelope);
-
-  char* buf = reinterpret_cast<char*>(buffer.GetBufferPointer());
-  size_t size = buffer.GetSize();
-  auto it = connection_map_.find(destination);
-  if (it == connection_map_.end()) {
-    return false;
-  }
-  it->second->SendMessage(fxl::StringView(buf, size));
-  return true;
-}
-
-void P2PProviderImpl::StartService() {
-  fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> handle;
-  // When the service provider is reset and its connection cut, NetConnector
-  // stops responding for its services.
-  network_service_provider_.AddBinding(handle.NewRequest());
-  network_service_provider_.AddServiceForName(
-      [this](zx::channel channel) {
-        RemoteConnection& connection = connections_.emplace(host_name_);
-        connection.set_on_message(
-            [this, &connection](std::vector<uint8_t> data) {
-              ProcessHandshake(&connection, std::move(data), true,
-                               fxl::StringView());
-            });
-        connection.Start(std::move(channel));
-      },
-      kRespondingServiceName + user_id_);
-  net_connector_->RegisterServiceProvider(kRespondingServiceName + user_id_,
-                                          std::move(handle));
-
-  ListenForNewDevices(fuchsia::netconnector::kInitialKnownDeviceNames);
-}
-
-void P2PProviderImpl::ProcessHandshake(RemoteConnection* connection,
-                                       std::vector<uint8_t> data,
-                                       bool should_send_handshake,
-                                       fxl::StringView network_remote_name) {
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(data.data()), data.size());
-  if (!VerifyEnvelopeBuffer(verifier)) {
-    // Wrong serialization, abort.
-    FXL_LOG(ERROR) << "The message received is malformed.";
-    connection->Disconnect();
-    return;
-  };
-  const Envelope* envelope = GetEnvelope(data.data());
-  const Handshake* message;
-  if (!ValidateHandshake(envelope, &message)) {
-    FXL_LOG(ERROR) << "The message received is not valid.";
-    connection->Disconnect();
-    return;
-  }
-
-  std::string remote_name(message->host_name()->begin(),
-                          message->host_name()->end());
-  if (!network_remote_name.empty() && network_remote_name != remote_name) {
-    // The name of the remote device as given by the network is different from
-    // the self-declared name. Something is wrong here, let's abort.
-    FXL_LOG(ERROR) << "Network name " << network_remote_name
-                   << " different from declared name " << remote_name
-                   << ", aborting.";
-    connection->Disconnect();
-    return;
-  }
-  bool existed_before = false;
-  auto it = connection_map_.find(remote_name);
-  if (it != connection_map_.end()) {
-    if (remote_name < host_name_) {
-      it->second->Disconnect();
-      existed_before = true;
-    } else {
-      connection->Disconnect();
-      return;
-    }
-  }
-
-  connection_map_[remote_name] = connection;
-
-  connection->set_on_close([this, remote_name]() {
-    connection_map_.erase(remote_name);
-    OnDeviceChange(remote_name, DeviceChangeType::DELETED);
-  });
-
-  connection->set_on_message([this, remote_name](std::vector<uint8_t> data) {
-    Dispatch(remote_name, std::move(data));
-  });
-
-  if (should_send_handshake) {
-    // We send an handshake to signal to the other side the connection is
-    // indeed established.
-    flatbuffers::FlatBufferBuilder buffer;
-    flatbuffers::Offset<Handshake> request =
-        CreateHandshake(buffer, kCurrentVersion,
-                        convert::ToFlatBufferVector(&buffer, host_name_));
-    flatbuffers::Offset<Envelope> envelope =
-        CreateEnvelope(buffer, EnvelopeMessage_Handshake, request.Union());
-    buffer.Finish(envelope);
-    char* buf = reinterpret_cast<char*>(buffer.GetBufferPointer());
-    size_t size = buffer.GetSize();
-    connection->SendMessage(fxl::StringView(buf, size));
-  }
-
-  if (!existed_before) {
-    // If the connection existed before, we don't need to notify again.
-    OnDeviceChange(remote_name, DeviceChangeType::NEW);
-  }
-}
-
-void P2PProviderImpl::ListenForNewDevices(uint64_t version) {
-  net_connector_->GetKnownDeviceNames(
-      version,
-      [this](uint64_t new_version, std::vector<std::string> devices) {
-        std::vector<std::string> seen_devices;
-        for (auto& remote_name : devices) {
-          seen_devices.push_back(remote_name);
-          if (contacted_hosts_.find(remote_name) != contacted_hosts_.end()) {
-            continue;
-          }
-          if (remote_name == host_name_) {
-            continue;
-          }
-          std::string remote_name_str(remote_name);
-
-          zx::channel local;
-          zx::channel remote;
-          zx_status_t status = zx::channel::create(0u, &local, &remote);
-
-          FXL_CHECK(status == ZX_OK)
-              << "zx::channel::create failed, status " << status;
-
-          fuchsia::sys::ServiceProviderPtr device_service_provider;
-          net_connector_->GetDeviceServiceProvider(
-              remote_name, device_service_provider.NewRequest());
-
-          device_service_provider->ConnectToService(
-              kRespondingServiceName + user_id_, std::move(remote));
-
-          flatbuffers::FlatBufferBuilder buffer;
-          flatbuffers::Offset<Handshake> request =
-              CreateHandshake(buffer, kCurrentVersion,
-                              convert::ToFlatBufferVector(&buffer, host_name_));
-          flatbuffers::Offset<Envelope> envelope = CreateEnvelope(
-              buffer, EnvelopeMessage_Handshake, request.Union());
-          buffer.Finish(envelope);
-
-          RemoteConnection& connection = connections_.emplace(host_name_);
-          connection.set_on_message(
-              [this, &connection, remote_name_str](std::vector<uint8_t> data) {
-                ProcessHandshake(&connection, std::move(data), false,
-                                 remote_name_str);
-              });
-          connection.Start(std::move(local));
-
-          char* buf = reinterpret_cast<char*>(buffer.GetBufferPointer());
-          size_t size = buffer.GetSize();
-          connection.SendMessage(fxl::StringView(buf, size));
-          contacted_hosts_.insert(std::move(remote_name_str));
-        }
-        // Devices that disappeared can be recontacted again later as they might
-        // have changed.
-        std::vector<fxl::StringView> to_be_removed;
-        std::set_difference(contacted_hosts_.begin(), contacted_hosts_.end(),
-                            seen_devices.begin(), seen_devices.end(),
-                            std::back_inserter(to_be_removed));
-        for (const fxl::StringView& host : to_be_removed) {
-          contacted_hosts_.erase(contacted_hosts_.find(host));
-        }
-        ListenForNewDevices(new_version);
-      });
-}
-
-void P2PProviderImpl::Dispatch(fxl::StringView source,
-                               std::vector<uint8_t> data) {
-  FXL_DCHECK(client_);
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(data.data()), data.size());
-  if (!VerifyEnvelopeBuffer(verifier)) {
-    // Wrong serialization, abort.
-    FXL_LOG(ERROR) << "The message received is malformed.";
-    return;
-  };
-  const Envelope* envelope = GetEnvelope(data.data());
-  if (envelope->message_type() != EnvelopeMessage_Message) {
-    FXL_LOG(ERROR) << "The message received is unexpected at this point.";
-    return;
-  }
-
-  const Message* message = static_cast<const Message*>(envelope->message());
-
-  fxl::StringView data_view(
-      reinterpret_cast<const char*>(message->data()->data()),
-      message->data()->size());
-  client_->OnNewMessage(source, data_view);
-}
-
-void P2PProviderImpl::OnDeviceChange(fxl::StringView remote_device,
-                                     DeviceChangeType change_type) {
-  FXL_DCHECK(client_);
-  client_->OnDeviceChange(remote_device, change_type);
-}
-
-}  // namespace p2p_provider
diff --git a/bin/ledger/p2p_provider/impl/p2p_provider_impl.h b/bin/ledger/p2p_provider/impl/p2p_provider_impl.h
deleted file mode 100644
index fe88966..0000000
--- a/bin/ledger/p2p_provider/impl/p2p_provider_impl.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_PROVIDER_IMPL_P2P_PROVIDER_IMPL_H_
-#define PERIDOT_BIN_LEDGER_P2P_PROVIDER_IMPL_P2P_PROVIDER_IMPL_H_
-
-#include <memory>
-#include <set>
-#include <string>
-
-#include <fuchsia/netconnector/cpp/fidl.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/component/cpp/service_provider_impl.h>
-#include <lib/netconnector/cpp/message_relay.h>
-
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/p2p_provider/impl/remote_connection.h"
-#include "peridot/bin/ledger/p2p_provider/public/p2p_provider.h"
-#include "peridot/bin/ledger/p2p_provider/public/user_id_provider.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace p2p_provider {
-// P2PProviderImpl provides the peer-to-peer communication abstraction for the
-// Ledger, using NetConnector.
-//
-// We deploy a number of strategies to provide a consistent communication layer
-// using NetConnector:
-// - NetConnector exposes services to other devices, and allows one to connect
-// to other devices services. We thus expose a service whose name is
-// ledger-specific, and also depends on the user id. This ensures only Ledgers
-// of the same user communicate.
-// - Netconnector does not provide the connected service with the identity of
-// the device that connects to it. For this, the connecting device sends an
-// handshake as its first message to ascertain its identity.
-// - NetConnector does not allow enumeration of services on remote devices, and
-// there is no built-in connection confirmation: when we connect, we are not
-// sure whether the remote device has the service we want. Thus, the connected
-// device also sends an handshake to confirm the connection.
-class P2PProviderImpl : public P2PProvider {
- public:
-  P2PProviderImpl(
-      std::string host_name,
-      fuchsia::netconnector::NetConnectorPtr net_connector,
-      std::unique_ptr<p2p_provider::UserIdProvider> user_id_provider);
-  ~P2PProviderImpl() override;
-
-  // P2PProvider:
-  void Start(Client* client) override;
-  bool SendMessage(fxl::StringView destination, fxl::StringView data) override;
-
- private:
-  // Starts the listening mDNS service.
-  void StartService();
-  // Processes the first message on a new connection. If
-  // |should_send_handshake|, a handshake is also sent back on the connection;
-  // this happens when the connection was established by the other side.
-  void ProcessHandshake(RemoteConnection* connection, std::vector<uint8_t> data,
-                        bool should_send_handshake,
-                        fxl::StringView network_remote_name);
-  // Retrieves and processes the current devices list
-  void ListenForNewDevices(uint64_t version);
-  // Dispatches an incoming message to the relevant page, or sends an error
-  // back.
-  void Dispatch(fxl::StringView source, std::vector<uint8_t> data);
-  // Callback when we establish a new device connection, or a device breaks its
-  // connection.
-  void OnDeviceChange(fxl::StringView remote_device,
-                      DeviceChangeType change_type);
-
-  Client* client_ = nullptr;
-
-  // ID of a user, used to ensure all connected Ledgers are for the same user.
-  std::string user_id_;
-  // |connection_map_| holds the connections, keyed by the remote host name.
-  std::map<std::string, RemoteConnection*, convert::StringViewComparator>
-      connection_map_;
-  // |connections_| holds the set of all established peer-to-peer connections.
-  // We need both |connections_| and |connection_map_| as inbound connections
-  // don't have an assiociated host name until we receive the handshake.
-  callback::AutoCleanableSet<RemoteConnection> connections_;
-  // |contacted_hosts_| lists all the hosts we tried to contact so far that
-  // remain visible to us. This is useful as, when we open a connection to a
-  // device, we don't know if it holds a ledger for the user we want; this set
-  // allows us to not end up in an infinite loop of: new device->connect->no
-  // ledger for our user->disconnect->new device!->...
-  // Once a device become invisible (disconnected from the local network, shut
-  // down, ...), we remove it from this set.
-  std::set<std::string, convert::StringViewComparator> contacted_hosts_;
-
-  component::ServiceProviderImpl network_service_provider_;
-  std::string const host_name_;
-  fuchsia::netconnector::NetConnectorPtr const net_connector_;
-  std::unique_ptr<p2p_provider::UserIdProvider> const user_id_provider_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(P2PProviderImpl);
-};
-
-}  // namespace p2p_provider
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_PROVIDER_IMPL_P2P_PROVIDER_IMPL_H_
diff --git a/bin/ledger/p2p_provider/impl/p2p_provider_impl_unittest.cc b/bin/ledger/p2p_provider/impl/p2p_provider_impl_unittest.cc
deleted file mode 100644
index 9ede9b2..0000000
--- a/bin/ledger/p2p_provider/impl/p2p_provider_impl_unittest.cc
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_provider/impl/p2p_provider_impl.h"
-
-#include <algorithm>
-#include <ostream>
-#include <string>
-
-#include <lib/fit/function.h>
-
-// gtest matchers are in gmock.
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/p2p_provider/impl/static_user_id_provider.h"
-#include "peridot/bin/ledger/p2p_provider/public/user_id_provider.h"
-#include "peridot/bin/ledger/testing/netconnector/netconnector_factory.h"
-
-namespace p2p_provider {
-namespace {
-
-class RecordingClient : public P2PProvider::Client {
- public:
-  struct DeviceChange {
-    std::string device;
-    DeviceChangeType change;
-
-    bool operator==(const DeviceChange& b) const {
-      return device == b.device && change == b.change;
-    }
-  };
-
-  struct Message {
-    std::string source;
-    std::string data;
-
-    bool operator==(const Message& b) const {
-      return source == b.source && data == b.data;
-    }
-  };
-
-  void OnDeviceChange(fxl::StringView device_name,
-                      DeviceChangeType change_type) override {
-    device_changes.push_back(DeviceChange{device_name.ToString(), change_type});
-  }
-
-  void OnNewMessage(fxl::StringView device_name,
-                    fxl::StringView message) override {
-    messages.push_back(Message{device_name.ToString(), message.ToString()});
-  }
-  std::vector<DeviceChange> device_changes;
-  std::vector<Message> messages;
-};
-
-std::ostream& operator<<(std::ostream& os,
-                         const RecordingClient::DeviceChange& d) {
-  return os << "DeviceChange{" << d.device << ", " << bool(d.change) << "}";
-}
-
-std::ostream& operator<<(std::ostream& os, const RecordingClient::Message& m) {
-  return os << "Message{" << m.source << ", " << m.data << "}";
-}
-
-class P2PProviderImplTest : public gtest::TestLoopFixture {
- public:
-  P2PProviderImplTest() {}
-  ~P2PProviderImplTest() override {}
-
-  std::unique_ptr<P2PProvider> GetProvider(std::string host_name,
-                                           std::string user_name = "user") {
-    fuchsia::netconnector::NetConnectorPtr netconnector;
-    net_connector_factory_.AddBinding(host_name, netconnector.NewRequest());
-    return std::make_unique<p2p_provider::P2PProviderImpl>(
-        std::move(host_name), std::move(netconnector),
-        std::make_unique<StaticUserIdProvider>(std::move(user_name)));
-  }
-
- protected:
-  void SetUp() override { ::testing::Test::SetUp(); }
-
-  ledger::NetConnectorFactory net_connector_factory_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(P2PProviderImplTest);
-};
-
-TEST_F(P2PProviderImplTest, ThreeHosts_SameUser) {
-  std::unique_ptr<P2PProvider> provider1 = GetProvider("host1");
-  RecordingClient client1;
-  provider1->Start(&client1);
-  RunLoopUntilIdle();
-  EXPECT_TRUE(client1.device_changes.empty());
-
-  std::unique_ptr<P2PProvider> provider2 = GetProvider("host2");
-  RecordingClient client2;
-  provider2->Start(&client2);
-  RunLoopUntilIdle();
-
-  EXPECT_THAT(client1.device_changes,
-              testing::UnorderedElementsAre(RecordingClient::DeviceChange{
-                  "host2", DeviceChangeType::NEW}));
-  EXPECT_THAT(client2.device_changes,
-              testing::UnorderedElementsAre(RecordingClient::DeviceChange{
-                  "host1", DeviceChangeType::NEW}));
-
-  std::unique_ptr<P2PProvider> provider3 = GetProvider("host3");
-  RecordingClient client3;
-  provider3->Start(&client3);
-  RunLoopUntilIdle();
-
-  EXPECT_THAT(
-      client1.device_changes,
-      testing::ElementsAre(
-          RecordingClient::DeviceChange{"host2", DeviceChangeType::NEW},
-          RecordingClient::DeviceChange{"host3", DeviceChangeType::NEW}));
-
-  EXPECT_THAT(
-      client2.device_changes,
-      testing::ElementsAre(
-          RecordingClient::DeviceChange{"host1", DeviceChangeType::NEW},
-          RecordingClient::DeviceChange{"host3", DeviceChangeType::NEW}));
-
-  EXPECT_THAT(
-      client3.device_changes,
-      testing::UnorderedElementsAre(
-          RecordingClient::DeviceChange{"host1", DeviceChangeType::NEW},
-          RecordingClient::DeviceChange{"host2", DeviceChangeType::NEW}));
-
-  // Disconnect one host, and verify disconnection notices are sent.
-  provider2.reset();
-  RunLoopUntilIdle();
-
-  EXPECT_THAT(
-      client1.device_changes,
-      testing::ElementsAre(
-          RecordingClient::DeviceChange{"host2", DeviceChangeType::NEW},
-          RecordingClient::DeviceChange{"host3", DeviceChangeType::NEW},
-          RecordingClient::DeviceChange{"host2", DeviceChangeType::DELETED}));
-
-  EXPECT_THAT(
-      client3.device_changes,
-      testing::UnorderedElementsAre(
-          RecordingClient::DeviceChange{"host1", DeviceChangeType::NEW},
-          RecordingClient::DeviceChange{"host2", DeviceChangeType::NEW},
-          RecordingClient::DeviceChange{"host2", DeviceChangeType::DELETED}));
-}
-
-TEST_F(P2PProviderImplTest, FourHosts_TwoUsers) {
-  std::unique_ptr<P2PProvider> provider1 = GetProvider("host1", "user1");
-  RecordingClient client1;
-  provider1->Start(&client1);
-  std::unique_ptr<P2PProvider> provider2 = GetProvider("host2", "user2");
-  RecordingClient client2;
-  provider2->Start(&client2);
-  std::unique_ptr<P2PProvider> provider3 = GetProvider("host3", "user2");
-  RecordingClient client3;
-  provider3->Start(&client3);
-  std::unique_ptr<P2PProvider> provider4 = GetProvider("host4", "user1");
-  RecordingClient client4;
-  provider4->Start(&client4);
-  RunLoopUntilIdle();
-
-  // Verify that only devices with the same user connect together.
-  EXPECT_THAT(client1.device_changes,
-              testing::ElementsAre(RecordingClient::DeviceChange{
-                  "host4", DeviceChangeType::NEW}));
-  EXPECT_THAT(client2.device_changes,
-              testing::ElementsAre(RecordingClient::DeviceChange{
-                  "host3", DeviceChangeType::NEW}));
-  EXPECT_THAT(client3.device_changes,
-              testing::ElementsAre(RecordingClient::DeviceChange{
-                  "host2", DeviceChangeType::NEW}));
-  EXPECT_THAT(client4.device_changes,
-              testing::ElementsAre(RecordingClient::DeviceChange{
-                  "host1", DeviceChangeType::NEW}));
-
-  provider4.reset();
-  RunLoopUntilIdle();
-
-  EXPECT_THAT(
-      client1.device_changes,
-      testing::ElementsAre(
-          RecordingClient::DeviceChange{"host4", DeviceChangeType::NEW},
-          RecordingClient::DeviceChange{"host4", DeviceChangeType::DELETED}));
-  EXPECT_THAT(client2.device_changes,
-              testing::ElementsAre(RecordingClient::DeviceChange{
-                  "host3", DeviceChangeType::NEW}));
-  EXPECT_THAT(client3.device_changes,
-              testing::ElementsAre(RecordingClient::DeviceChange{
-                  "host2", DeviceChangeType::NEW}));
-}
-
-TEST_F(P2PProviderImplTest, TwoHosts_Messages) {
-  std::unique_ptr<P2PProvider> provider1 = GetProvider("host1");
-  RecordingClient client1;
-  provider1->Start(&client1);
-  std::unique_ptr<P2PProvider> provider2 = GetProvider("host2");
-  RecordingClient client2;
-  provider2->Start(&client2);
-
-  RunLoopUntilIdle();
-
-  EXPECT_TRUE(provider1->SendMessage("host2", "datagram"));
-  RunLoopUntilIdle();
-
-  EXPECT_THAT(client1.messages, testing::ElementsAre());
-  EXPECT_THAT(client2.messages, testing::ElementsAre(RecordingClient::Message{
-                                    "host1", "datagram"}));
-}
-}  // namespace
-}  // namespace p2p_provider
diff --git a/bin/ledger/p2p_provider/impl/remote_connection.cc b/bin/ledger/p2p_provider/impl/remote_connection.cc
deleted file mode 100644
index c612640..0000000
--- a/bin/ledger/p2p_provider/impl/remote_connection.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_provider/impl/remote_connection.h"
-
-#include <flatbuffers/flatbuffers.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/ledger/p2p_provider/impl/envelope_generated.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace p2p_provider {
-RemoteConnection::RemoteConnection(std::string local_name)
-    : local_name_(std::move(local_name)) {
-  message_relay_.SetChannelClosedCallback([this] { OnChannelClosed(); });
-  message_relay_.SetMessageReceivedCallback(
-      [this](std::vector<uint8_t> data) { OnNewMessage(std::move(data)); });
-}
-
-void RemoteConnection::Start(zx::channel channel) {
-  FXL_DCHECK(!started_);
-  started_ = true;
-  message_relay_.SetChannel(std::move(channel));
-}
-
-void RemoteConnection::SendMessage(fxl::StringView data) {
-  message_relay_.SendMessage(std::vector<uint8_t>(data.begin(), data.end()));
-}
-
-void RemoteConnection::Disconnect() {
-  FXL_DCHECK(started_);
-  message_relay_.SetChannelClosedCallback(nullptr);
-  message_relay_.CloseChannel();
-
-  if (on_empty_) {
-    on_empty_();
-  }
-}
-
-void RemoteConnection::set_on_empty(fit::closure on_empty) {
-  on_empty_ = std::move(on_empty);
-}
-
-void RemoteConnection::set_on_close(fit::closure on_close) {
-  on_close_ = std::move(on_close);
-}
-
-void RemoteConnection::set_on_message(
-    fit::function<void(std::vector<uint8_t>)> on_message) {
-  on_message_ = std::move(on_message);
-}
-
-void RemoteConnection::OnChannelClosed() {
-  if (on_close_) {
-    on_close_();
-  }
-  if (on_empty_) {
-    auto on_empty = std::move(on_empty_);
-    on_empty();
-  }
-}
-
-void RemoteConnection::OnNewMessage(std::vector<uint8_t> data) {
-  FXL_DCHECK(on_message_)
-      << "No message handler has been set. We would be dropping messages.";
-
-  if (on_message_) {
-    on_message_(std::move(data));
-  }
-}
-
-}  // namespace p2p_provider
diff --git a/bin/ledger/p2p_provider/impl/remote_connection.h b/bin/ledger/p2p_provider/impl/remote_connection.h
deleted file mode 100644
index d33c59b..0000000
--- a/bin/ledger/p2p_provider/impl/remote_connection.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_PROVIDER_IMPL_REMOTE_CONNECTION_H_
-#define PERIDOT_BIN_LEDGER_P2P_PROVIDER_IMPL_REMOTE_CONNECTION_H_
-
-#include <string>
-
-#include <flatbuffers/flatbuffers.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/strings/string_view.h>
-#include <lib/netconnector/cpp/message_relay.h>
-#include <lib/zx/channel.h>
-
-namespace p2p_provider {
-// RemoteConnection holds a connection with a single remote device.
-class RemoteConnection {
- public:
-  explicit RemoteConnection(std::string local_name);
-
-  // Starts listening on the provided channel for new messages.
-  // |channel| is presumed to be sending/receiving messages from/to another
-  // device.
-  void Start(zx::channel channel);
-
-  // Sends |data| to another device through the channel set in |Start|.
-  void SendMessage(fxl::StringView data);
-
-  // Disconnects.
-  void Disconnect();
-
-  // |on_empty| will be called when this connection is no longer valid, either
-  // because we disconnected or because the other side disconnected.
-  void set_on_empty(fit::closure on_empty);
-
-  // |on_close| will be called when the other side closes the connection.
-  void set_on_close(fit::closure on_close);
-
-  // |on_message| will be called for every new message received.
-  void set_on_message(fit::function<void(std::vector<uint8_t>)> on_message);
-
- private:
-  void OnChannelClosed();
-  void OnNewMessage(std::vector<uint8_t> data);
-
-  bool started_ = false;
-
-  const std::string local_name_;
-  netconnector::MessageRelay message_relay_;
-
-  fit::closure on_empty_;
-  fit::closure on_close_;
-  fit::function<void(std::vector<uint8_t>)> on_message_;
-};
-
-}  // namespace p2p_provider
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_PROVIDER_IMPL_REMOTE_CONNECTION_H_
diff --git a/bin/ledger/p2p_provider/impl/static_user_id_provider.cc b/bin/ledger/p2p_provider/impl/static_user_id_provider.cc
deleted file mode 100644
index b0a2ee1..0000000
--- a/bin/ledger/p2p_provider/impl/static_user_id_provider.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_provider/impl/static_user_id_provider.h"
-
-namespace p2p_provider {
-
-StaticUserIdProvider::StaticUserIdProvider(std::string user_id)
-    : user_id_(user_id) {}
-
-StaticUserIdProvider::~StaticUserIdProvider() = default;
-
-void StaticUserIdProvider::GetUserId(
-    fit::function<void(Status, std::string)> callback) {
-  callback(Status::OK, user_id_);
-}
-
-}  // namespace p2p_provider
diff --git a/bin/ledger/p2p_provider/impl/static_user_id_provider.h b/bin/ledger/p2p_provider/impl/static_user_id_provider.h
deleted file mode 100644
index f3a575e..0000000
--- a/bin/ledger/p2p_provider/impl/static_user_id_provider.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_PROVIDER_IMPL_STATIC_USER_ID_PROVIDER_H_
-#define PERIDOT_BIN_LEDGER_P2P_PROVIDER_IMPL_STATIC_USER_ID_PROVIDER_H_
-
-#include <string>
-
-#include "peridot/bin/ledger/p2p_provider/public/user_id_provider.h"
-
-namespace p2p_provider {
-
-// Implementation of |UserIdProvider| that always returns a static value, passed
-// in the constructor.
-class StaticUserIdProvider : public UserIdProvider {
- public:
-  StaticUserIdProvider(std::string user_id);
-  ~StaticUserIdProvider() override;
-
-  void GetUserId(fit::function<void(Status, std::string)> callback) override;
-
- private:
-  const std::string user_id_;
-};
-
-}  // namespace p2p_provider
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_PROVIDER_IMPL_STATIC_USER_ID_PROVIDER_H_
diff --git a/bin/ledger/p2p_provider/public/BUILD.gn b/bin/ledger/p2p_provider/public/BUILD.gn
deleted file mode 100644
index bffd88c..0000000
--- a/bin/ledger/p2p_provider/public/BUILD.gn
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/flatbuffers/flatbuffer.gni")
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("public") {
-  sources = [
-    "p2p_provider.h",
-    "types.h",
-    "user_id_provider.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-  ]
-
-  deps = []
-}
diff --git a/bin/ledger/p2p_provider/public/p2p_provider.h b/bin/ledger/p2p_provider/public/p2p_provider.h
deleted file mode 100644
index 18a53cb..0000000
--- a/bin/ledger/p2p_provider/public/p2p_provider.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_PROVIDER_PUBLIC_P2P_PROVIDER_H_
-#define PERIDOT_BIN_LEDGER_P2P_PROVIDER_PUBLIC_P2P_PROVIDER_H_
-
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/p2p_provider/public/types.h"
-
-namespace p2p_provider {
-// P2PProvider handles the peer-to-peer connections between devices.
-class P2PProvider {
- public:
-  class Client {
-   public:
-    // OnDeviceChange is called for every new connection and
-    // disconnection to devices from the mesh, including the ones already
-    // participating in the mesh when we connect to it.
-    virtual void OnDeviceChange(fxl::StringView device_name,
-                                DeviceChangeType change_type) = 0;
-    // OnNewMessage is called for every message sent to this device.
-    virtual void OnNewMessage(fxl::StringView device_name,
-                              fxl::StringView message) = 0;
-  };
-
-  P2PProvider() {}
-  virtual ~P2PProvider() {}
-
-  // Starts participating in the device mesh.
-  // To stop participating, destroy this class instance.
-  virtual void Start(Client* client) = 0;
-  // Sends the provided message |data| to |destination|. Returns true if the
-  // message was sent, false if the destination is not available.
-  virtual bool SendMessage(fxl::StringView destination,
-                           fxl::StringView data) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(P2PProvider);
-};
-
-}  // namespace p2p_provider
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_PROVIDER_PUBLIC_P2P_PROVIDER_H_
diff --git a/bin/ledger/p2p_provider/public/types.h b/bin/ledger/p2p_provider/public/types.h
deleted file mode 100644
index 852d37f..0000000
--- a/bin/ledger/p2p_provider/public/types.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_PROVIDER_PUBLIC_TYPES_H_
-#define PERIDOT_BIN_LEDGER_P2P_PROVIDER_PUBLIC_TYPES_H_
-
-namespace p2p_provider {
-// Type describing whether the change is a new device or a deleted one.
-enum class DeviceChangeType : bool { NEW, DELETED };
-
-}  // namespace p2p_provider
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_PROVIDER_PUBLIC_TYPES_H_
diff --git a/bin/ledger/p2p_provider/public/user_id_provider.h b/bin/ledger/p2p_provider/public/user_id_provider.h
deleted file mode 100644
index 67c2b34..0000000
--- a/bin/ledger/p2p_provider/public/user_id_provider.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_PROVIDER_PUBLIC_USER_ID_PROVIDER_H_
-#define PERIDOT_BIN_LEDGER_P2P_PROVIDER_PUBLIC_USER_ID_PROVIDER_H_
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-namespace p2p_provider {
-// UserIdProvider abstracts the unique User ID shared accross all devices of a
-// user and used to establish a connection.
-class UserIdProvider {
- public:
-  enum class Status {
-    OK,
-    ERROR,
-  };
-
-  UserIdProvider() {}
-  virtual ~UserIdProvider() {}
-
-  // GetUserId calls its callback with the user id.
-  virtual void GetUserId(fit::function<void(Status, std::string)> callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(UserIdProvider);
-};
-
-}  // namespace p2p_provider
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_PROVIDER_PUBLIC_USER_ID_PROVIDER_H_
diff --git a/bin/ledger/p2p_sync/impl/BUILD.gn b/bin/ledger/p2p_sync/impl/BUILD.gn
deleted file mode 100644
index 81fbf4e..0000000
--- a/bin/ledger/p2p_sync/impl/BUILD.gn
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/flatbuffers/flatbuffer.gni")
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("impl") {
-  sources = [
-    "commit_batch.cc",
-    "commit_batch.h",
-    "device_mesh.h",
-    "flatbuffer_message_factory.cc",
-    "flatbuffer_message_factory.h",
-    "ledger_communicator_impl.cc",
-    "ledger_communicator_impl.h",
-    "message_holder.h",
-    "page_communicator_impl.cc",
-    "page_communicator_impl.h",
-    "user_communicator_factory_impl.cc",
-    "user_communicator_factory_impl.h",
-    "user_communicator_impl.cc",
-    "user_communicator_impl.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/environment",
-    "//peridot/bin/ledger/p2p_provider/impl",
-    "//peridot/bin/ledger/p2p_sync/public",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/lib/convert",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-  ]
-
-  deps = [
-    ":message",
-    "//garnet/public/lib/callback",
-    "//peridot/lib/ledger_client:constants",
-  ]
-}
-
-flatbuffer("message") {
-  sources = [
-    "message.fbs",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "page_communicator_impl_unittest.cc",
-    "user_communicator_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":impl",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/p2p_provider/impl",
-    "//peridot/bin/ledger/storage/fake:lib",
-    "//peridot/bin/ledger/storage/testing",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/bin/ledger/testing/netconnector",
-
-    # gtest matchers are in gmock.
-    "//third_party/googletest:gmock",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/p2p_sync/impl/commit_batch.cc b/bin/ledger/p2p_sync/impl/commit_batch.cc
deleted file mode 100644
index f2b565f..0000000
--- a/bin/ledger/p2p_sync/impl/commit_batch.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_sync/impl/commit_batch.h"
-
-#include <lib/callback/scoped_callback.h>
-
-namespace p2p_sync {
-
-CommitBatch::CommitBatch(std::string device, Delegate* delegate,
-                         storage::PageStorage* storage)
-    : device_(std::move(device)),
-      delegate_(delegate),
-      storage_(storage),
-      weak_factory_(this) {}
-
-void CommitBatch::set_on_empty(fit::closure on_empty) {
-  on_empty_ = std::move(on_empty);
-}
-
-void CommitBatch::AddToBatch(
-    std::vector<storage::PageStorage::CommitIdAndBytes> new_commits) {
-  // New commits are supposed to be the parents of the already inserted ones. We
-  // insert them before to ensure parents are processed before children.
-  //
-  // This insertion may be suboptimal in some cases, for instance when a merge
-  // commit's parents are related to each other. In that case, we may request
-  // (and insert) multiple times the same commit. A better way would be to sort
-  // these commits by generation before inserting, but we don't have access to
-  // this information here.
-  commits_.insert(commits_.begin(),
-                  std::make_move_iterator(new_commits.begin()),
-                  std::make_move_iterator(new_commits.end()));
-
-  std::vector<storage::PageStorage::CommitIdAndBytes> out;
-  out.reserve(commits_.size());
-  for (const auto& commit : commits_) {
-    out.emplace_back(commit.id, commit.bytes);
-  }
-
-  storage_->AddCommitsFromSync(
-      std::move(out), storage::ChangeSource::P2P,
-      callback::MakeScoped(
-          weak_factory_.GetWeakPtr(),
-          [this](storage::Status status,
-                 std::vector<storage::CommitId> missing_ids) {
-            if (status == storage::Status::OK) {
-              if (on_empty_) {
-                on_empty_();
-              }
-              return;
-            }
-            if (status == storage::Status::NOT_FOUND && !missing_ids.empty()) {
-              delegate_->RequestCommits(device_, std::move(missing_ids));
-              return;
-            }
-            FXL_LOG(ERROR) << "Error while adding commits, aborting batch: "
-                           << status;
-            if (on_empty_) {
-              on_empty_();
-            }
-          }));
-}
-
-}  // namespace p2p_sync
diff --git a/bin/ledger/p2p_sync/impl/commit_batch.h b/bin/ledger/p2p_sync/impl/commit_batch.h
deleted file mode 100644
index 9c995e8..0000000
--- a/bin/ledger/p2p_sync/impl/commit_batch.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_COMMIT_BATCH_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_COMMIT_BATCH_H_
-
-#include <list>
-#include <string>
-#include <vector>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace p2p_sync {
-
-// CommitBatch holds all commits that should be added together in PageStorage.
-class CommitBatch {
- public:
-  // Delegate is used by |CommitBatch| to request missing commits.
-  class Delegate {
-   public:
-    // Request missing commits from this batch. Commits will be added later
-    // through CommitBatch::AddBatch.
-    virtual void RequestCommits(fxl::StringView device,
-                                std::vector<storage::CommitId> ids) = 0;
-  };
-
-  CommitBatch(std::string device, Delegate* delegate,
-              storage::PageStorage* storage);
-  CommitBatch(const CommitBatch&) = delete;
-  const CommitBatch& operator=(const CommitBatch&) = delete;
-
-  // Registers a callback to be called when the batch processing is completed,
-  // either through success or an unrecoverable error. Part of the
-  // callback::AutoCleanable* client API.
-  void set_on_empty(fit::closure on_empty);
-
-  // Adds the provided commits to this batch.
-  // This method will attempt to add the whole batch to |PageStorage|, and may
-  // request additional commits through the |Delegate| if needed.
-  void AddToBatch(
-      std::vector<storage::PageStorage::CommitIdAndBytes> new_commits);
-
- private:
-  std::string const device_;
-  Delegate* const delegate_;
-  storage::PageStorage* const storage_;
-  std::list<storage::PageStorage::CommitIdAndBytes> commits_;
-  fit::closure on_empty_;
-
-  // This must be the last member of the class.
-  fxl::WeakPtrFactory<CommitBatch> weak_factory_;
-};
-
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_COMMIT_BATCH_H_
diff --git a/bin/ledger/p2p_sync/impl/device_mesh.h b/bin/ledger/p2p_sync/impl/device_mesh.h
deleted file mode 100644
index f9dff68..0000000
--- a/bin/ledger/p2p_sync/impl/device_mesh.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_DEVICE_MESH_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_DEVICE_MESH_H_
-
-#include <memory>
-#include <set>
-
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/lib/convert/convert.h"
-
-namespace p2p_sync {
-// DeviceMesh is used by PageCommunicators to communicate with the device mesh.
-class DeviceMesh {
- public:
-  using DeviceSet = std::set<std::string, convert::StringViewComparator>;
-
-  DeviceMesh() {}
-  virtual ~DeviceMesh() {}
-
-  // Returns the current active device set.
-  virtual DeviceSet GetDeviceList() = 0;
-
-  // Sends the given buffer to a connected device.
-  virtual void Send(fxl::StringView device_name,
-                    convert::ExtendedStringView data) = 0;
-};
-
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_DEVICE_MESH_H_
diff --git a/bin/ledger/p2p_sync/impl/flatbuffer_message_factory.cc b/bin/ledger/p2p_sync/impl/flatbuffer_message_factory.cc
deleted file mode 100644
index 90f37ef..0000000
--- a/bin/ledger/p2p_sync/impl/flatbuffer_message_factory.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_sync/impl/flatbuffer_message_factory.h"
-
-#include "peridot/lib/convert/convert.h"
-
-namespace p2p_sync {
-
-void CreateUnknownResponseMessage(flatbuffers::FlatBufferBuilder* buffer,
-                                  fxl::StringView namespace_id,
-                                  fxl::StringView page_id,
-                                  ResponseStatus status) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id_offset =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id),
-                            convert::ToFlatBufferVector(buffer, page_id));
-  flatbuffers::Offset<Response> response =
-      CreateResponse(*buffer, status, namespace_page_id_offset);
-  flatbuffers::Offset<Message> message =
-      CreateMessage(*buffer, MessageUnion_Response, response.Union());
-  buffer->Finish(message);
-}
-}  // namespace p2p_sync
diff --git a/bin/ledger/p2p_sync/impl/flatbuffer_message_factory.h b/bin/ledger/p2p_sync/impl/flatbuffer_message_factory.h
deleted file mode 100644
index 8daaa7d..0000000
--- a/bin/ledger/p2p_sync/impl/flatbuffer_message_factory.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_FLATBUFFER_MESSAGE_FACTORY_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_FLATBUFFER_MESSAGE_FACTORY_H_
-
-#include <flatbuffers/flatbuffers.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/p2p_sync/impl/message_generated.h"
-
-namespace p2p_sync {
-
-void CreateUnknownResponseMessage(flatbuffers::FlatBufferBuilder* buffer,
-                                  fxl::StringView namespace_id,
-                                  fxl::StringView page_id,
-                                  ResponseStatus status);
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_FLATBUFFER_MESSAGE_FACTORY_H_
diff --git a/bin/ledger/p2p_sync/impl/ledger_communicator_impl.cc b/bin/ledger/p2p_sync/impl/ledger_communicator_impl.cc
deleted file mode 100644
index dd00103..0000000
--- a/bin/ledger/p2p_sync/impl/ledger_communicator_impl.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_sync/impl/ledger_communicator_impl.h"
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/p2p_sync/impl/flatbuffer_message_factory.h"
-#include "peridot/bin/ledger/p2p_sync/impl/message_generated.h"
-#include "peridot/bin/ledger/p2p_sync/impl/page_communicator_impl.h"
-
-namespace p2p_sync {
-LedgerCommunicatorImpl::LedgerCommunicatorImpl(
-    coroutine::CoroutineService* coroutine_service, std::string namespace_id,
-    DeviceMesh* mesh)
-    : coroutine_service_(coroutine_service),
-      namespace_id_(std::move(namespace_id)),
-      mesh_(mesh) {}
-
-LedgerCommunicatorImpl::~LedgerCommunicatorImpl() {
-  FXL_DCHECK(pages_.empty());
-  if (on_delete_) {
-    on_delete_();
-  }
-}
-
-void LedgerCommunicatorImpl::set_on_delete(fit::closure on_delete) {
-  FXL_DCHECK(!on_delete_) << "on_delete() can only be called once.";
-  on_delete_ = std::move(on_delete);
-}
-
-void LedgerCommunicatorImpl::OnDeviceChange(
-    fxl::StringView remote_device, p2p_provider::DeviceChangeType change_type) {
-  for (const auto& page : pages_) {
-    page.second->OnDeviceChange(remote_device, change_type);
-  }
-}
-
-void LedgerCommunicatorImpl::OnNewRequest(fxl::StringView source,
-                                          fxl::StringView page_id,
-                                          MessageHolder<Request> message) {
-  const auto& it = pages_.find(page_id);
-  if (it == pages_.end()) {
-    // Send unknown page response.
-    flatbuffers::FlatBufferBuilder buffer;
-    CreateUnknownResponseMessage(&buffer, namespace_id_, page_id,
-                                 ResponseStatus_UNKNOWN_PAGE);
-    mesh_->Send(source, convert::ExtendedStringView(buffer));
-    return;
-  }
-
-  it->second->OnNewRequest(source, std::move(message));
-}
-
-void LedgerCommunicatorImpl::OnNewResponse(fxl::StringView source,
-                                           fxl::StringView page_id,
-                                           MessageHolder<Response> message) {
-  const auto& it = pages_.find(page_id);
-  if (it == pages_.end()) {
-    // Page has been deleted between request and response, just discard.
-    return;
-  }
-
-  it->second->OnNewResponse(source, std::move(message));
-}
-
-std::unique_ptr<PageCommunicator> LedgerCommunicatorImpl::GetPageCommunicator(
-    storage::PageStorage* storage, storage::PageSyncClient* sync_client) {
-  storage::PageId page_id = storage->GetId();
-
-  FXL_DCHECK(pages_.find(page_id) == pages_.end());
-
-  std::unique_ptr<PageCommunicatorImpl> page =
-      std::make_unique<PageCommunicatorImpl>(coroutine_service_, storage,
-                                             sync_client, namespace_id_,
-                                             page_id, mesh_);
-  PageCommunicatorImpl* page_ptr = page.get();
-  pages_.emplace(page_id, page_ptr);
-  page->set_on_delete([this, page_id = std::move(page_id), page_ptr] {
-    auto it = pages_.find(page_id);
-    FXL_DCHECK(it != pages_.end());
-    pages_.erase(it);
-  });
-  return page;
-}
-
-}  // namespace p2p_sync
diff --git a/bin/ledger/p2p_sync/impl/ledger_communicator_impl.h b/bin/ledger/p2p_sync/impl/ledger_communicator_impl.h
deleted file mode 100644
index bd60ed8..0000000
--- a/bin/ledger/p2p_sync/impl/ledger_communicator_impl.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_LEDGER_COMMUNICATOR_IMPL_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_LEDGER_COMMUNICATOR_IMPL_H_
-
-#import <map>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/p2p_provider/public/types.h"
-#include "peridot/bin/ledger/p2p_sync/impl/device_mesh.h"
-#include "peridot/bin/ledger/p2p_sync/impl/message_generated.h"
-#include "peridot/bin/ledger/p2p_sync/impl/message_holder.h"
-#include "peridot/bin/ledger/p2p_sync/public/ledger_communicator.h"
-#include "peridot/bin/ledger/p2p_sync/public/page_communicator.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace p2p_sync {
-class PageCommunicatorImpl;
-
-// Ledger-level P2P communicator.
-class LedgerCommunicatorImpl : public LedgerCommunicator {
- public:
-  LedgerCommunicatorImpl(coroutine::CoroutineService* coroutine_service,
-                         std::string namespace_id, DeviceMesh* mesh);
-  ~LedgerCommunicatorImpl() override;
-
-  void set_on_delete(fit::closure on_delete);
-
-  // OnDeviceChange is called each time a device connects or unconnects.
-  void OnDeviceChange(fxl::StringView remote_device,
-                      p2p_provider::DeviceChangeType change_type);
-
-  // Called when a new request arrived for this ledger from device |source|.
-  void OnNewRequest(fxl::StringView source, fxl::StringView page_id,
-                    MessageHolder<Request> message);
-
-  // Called when a new response arrived for this ledger from device |source|.
-  void OnNewResponse(fxl::StringView source, fxl::StringView page_id,
-                     MessageHolder<Response> message);
-
-  // LedgerCommunicator:
-  std::unique_ptr<PageCommunicator> GetPageCommunicator(
-      storage::PageStorage* storage,
-      storage::PageSyncClient* sync_client) override;
-
- private:
-  std::map<std::string, PageCommunicatorImpl*, convert::StringViewComparator>
-      pages_;
-
-  fit::closure on_delete_;
-  coroutine::CoroutineService* const coroutine_service_;
-  const std::string namespace_id_;
-  DeviceMesh* const mesh_;
-};
-
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_LEDGER_COMMUNICATOR_IMPL_H_
diff --git a/bin/ledger/p2p_sync/impl/message.fbs b/bin/ledger/p2p_sync/impl/message.fbs
deleted file mode 100644
index b97f8af..0000000
--- a/bin/ledger/p2p_sync/impl/message.fbs
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-namespace p2p_sync;
-
-// Handshake. Gives the host_name of the device. Will be the first message
-// once a connection is established.
-table Handshake {
-  version: ushort;
-  host_name: [ubyte];
-}
-
-table NamespacePageId {
-  namespace_id: [ubyte];
-  page_id: [ubyte];
-}
-
-// Request that the other side starts sending us new commits.
-// There is no guarantee that the other side actually sends data over, or at
-// which frequency (for instance, if low on battery).
-table WatchStartRequest {}
-
-// Request that the other side stops sending us new commits.
-table WatchStopRequest {}
-
-table Data {
-  bytes: [ubyte];
-}
-
-table CommitId {
-  id: [ubyte];
-}
-
-// Request commit data.
-table CommitRequest {
-  commit_ids: [CommitId];
-}
-
-enum CommitStatus : ushort {
-  OK,
-  // No commit by this id is known.
-  UNKNOWN_COMMIT,
-}
-
-table Commit {
-  id: CommitId;
-  status: CommitStatus;
-  commit: Data;
-}
-
-table CommitResponse {
-  commits: [Commit];
-}
-
-table ObjectId {
-  key_index: uint;
-  deletion_scope_id: uint;
-  digest: [ubyte];
-}
-
-// Request some objects.
-table ObjectRequest {
-  object_ids: [ObjectId];
-}
-
-enum ObjectStatus : ushort {
-  OK,
-  // No object by this id is known.
-  UNKNOWN_OBJECT,
-}
-
-// Whether an object is known to be synced to the cloud.
-enum ObjectSyncStatus : ubyte {
-  // The object is not known to be synced to the cloud.
-  UNSYNCED,
-  // The object is known to be synced to the cloud.
-  SYNCED_TO_CLOUD,
-}
-
-table Object {
-  id: ObjectId;
-  status: ObjectStatus;
-  data: Data;
-  sync_status: ObjectSyncStatus;
-}
-
-table ObjectResponse {
-  objects: [Object];
-}
-
-union RequestMessage {
-  WatchStartRequest,
-  WatchStopRequest,
-  CommitRequest,
-  ObjectRequest,
-}
-
-table Request {
-  namespace_page: NamespacePageId;
-  request: RequestMessage;
-}
-
-union ResponseMessage {
-  CommitResponse,
-  ObjectResponse,
-}
-
-enum ResponseStatus : ushort {
-  OK,
-  // No namespace by this name is known. Requesting side should stop sending
-  // requests for this namespace.
-  UNKNOWN_NAMESPACE,
-  // No page by this name is known in this ledger. Requesting side should stop
-  // sending requests for this page.
-  UNKNOWN_PAGE,
-}
-
-table Response {
-  status: ResponseStatus;
-  namespace_page: NamespacePageId;
-  response: ResponseMessage;
-}
-
-union MessageUnion {
-  Request,
-  Response,
-}
-
-// Message contains the business-logic messages sent between devices.
-table Message {
-  message: MessageUnion;
-}
-
-root_type Message;
diff --git a/bin/ledger/p2p_sync/impl/message_holder.h b/bin/ledger/p2p_sync/impl/message_holder.h
deleted file mode 100644
index 1eff936..0000000
--- a/bin/ledger/p2p_sync/impl/message_holder.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_MESSAGE_HOLDER_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_MESSAGE_HOLDER_H_
-
-#include <functional>
-#include <utility>
-#include <vector>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/strings/string_view.h>
-
-namespace p2p_sync {
-// MessageHolder is used to hold a parsed Flatbuffer message along with its
-// data.
-template <class M>
-class MessageHolder {
- public:
-  // Create a new MessageHolder from the provided data and a parser.
-  MessageHolder(fxl::StringView data,
-                fit::function<const M*(const uint8_t*)> get_message)
-      : data_(data.begin(), data.end()), message_(get_message(data_.data())) {}
-
-  // Create a new MessageHolder from the provided data and a parser.
-  MessageHolder(std::vector<uint8_t> data,
-                fit::function<const M*(const uint8_t*)> get_message)
-      : data_(std::move(data)), message_(get_message(data_.data())) {}
-
-  // Create a new MessageHolder from the current object and a function to
-  // specialize the message. The current message holder is destroyed in the
-  // process. It can be used as follows:
-  // MessageHolder<Message> message = ...;
-  // MessageHolder<Request> request = std::move(message).TakeAndMap<Request>(
-  //         [](const Message* message) {
-  //             return static_cast<const Request*>(message->message());
-  //         });
-  template <class T>
-  MessageHolder<T> TakeAndMap(
-      fit::function<const T*(const M*)> get_message) && {
-    return MessageHolder<T>(std::move(*this), std::move(get_message));
-  }
-
-  // Allow moves.
-  MessageHolder(MessageHolder&& other) noexcept = default;
-  MessageHolder& operator=(MessageHolder&& other) noexcept = default;
-
-  // Delete copy constructor and assignment. We cannot easily copy a
-  // MessageHolder because of the need to re-parse the data and reapply the
-  // chain of specializations to recreate the object.
-  MessageHolder(const MessageHolder& other) = delete;
-  MessageHolder& operator=(const MessageHolder<M>& other) = delete;
-
-  // Allow MessageHolder<T> to be used as a T* for reading data.
-  const M* operator->() const { return message_; }
-  const M& operator*() const { return *message_; }
-
- private:
-  template <typename U>
-  friend class MessageHolder;
-
-  // Equivalent constructor to the TakeAndMap factory. Using the factory allows
-  // to explicitly declare template parameters, permitting the use of a lambda
-  // directly.
-  template <class T>
-  MessageHolder(MessageHolder<T>&& other,
-                fit::function<const M*(const T*)> get_message)
-      : data_(std::move(other.data_)), message_(get_message(other.message_)) {
-    other.message_ = nullptr;
-  }
-
-  std::vector<uint8_t> data_;
-  const M* message_;
-};
-
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_MESSAGE_HOLDER_H_
diff --git a/bin/ledger/p2p_sync/impl/page_communicator_impl.cc b/bin/ledger/p2p_sync/impl/page_communicator_impl.cc
deleted file mode 100644
index b1ec5a7..0000000
--- a/bin/ledger/p2p_sync/impl/page_communicator_impl.cc
+++ /dev/null
@@ -1,679 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_sync/impl/page_communicator_impl.h"
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine_waiter.h"
-#include "peridot/bin/ledger/p2p_sync/impl/message_generated.h"
-#include "peridot/bin/ledger/storage/public/read_data_source.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace p2p_sync {
-namespace {
-storage::ObjectIdentifier ToObjectIdentifier(const ObjectId* fb_object_id) {
-  uint32_t key_index = fb_object_id->key_index();
-  uint32_t deletion_scope_id = fb_object_id->deletion_scope_id();
-  return storage::ObjectIdentifier{
-      key_index, deletion_scope_id,
-      storage::ObjectDigest(fb_object_id->digest())};
-}
-}  // namespace
-
-// PendingObjectRequestHolder holds state for object requests that have been
-// sent to peers and for which we wait for an answer.
-class PageCommunicatorImpl::PendingObjectRequestHolder {
- public:
-  explicit PendingObjectRequestHolder(
-      fit::function<void(storage::Status, storage::ChangeSource,
-                         storage::IsObjectSynced,
-                         std::unique_ptr<storage::DataSource::DataChunk>)>
-          callback)
-      : callback_(std::move(callback)) {}
-
-  void set_on_empty(fit::closure on_empty) { on_empty_ = std::move(on_empty); }
-
-  // Registers a new pending request to device |destination|.
-  void AddNewPendingRequest(std::string destination) {
-    requests_.emplace(std::move(destination));
-  }
-
-  // Processes the response from device |source|.
-  void Complete(fxl::StringView source, const Object* object) {
-    auto it = requests_.find(source);
-    if (it == requests_.end()) {
-      return;
-    }
-    if (object == nullptr || object->status() == ObjectStatus_UNKNOWN_OBJECT) {
-      requests_.erase(it);
-      if (!requests_.empty()) {
-        return;
-      }
-      // All requests have returned and none is valid: return an error.
-      callback_(storage::Status::NOT_FOUND, storage::ChangeSource::P2P,
-                storage::IsObjectSynced::NO, nullptr);
-      if (on_empty_) {
-        on_empty_();
-      }
-      return;
-    }
-
-    std::unique_ptr<storage::DataSource::DataChunk> chunk =
-        storage::DataSource::DataChunk::Create(
-            convert::ToString(object->data()->bytes()));
-    storage::IsObjectSynced is_object_synced;
-    switch (object->sync_status()) {
-      case ObjectSyncStatus_UNSYNCED:
-        is_object_synced = storage::IsObjectSynced::NO;
-        break;
-      case ObjectSyncStatus_SYNCED_TO_CLOUD:
-        is_object_synced = storage::IsObjectSynced::YES;
-        break;
-    }
-    callback_(storage::Status::OK, storage::ChangeSource::P2P, is_object_synced,
-              std::move(chunk));
-    if (on_empty_) {
-      on_empty_();
-    }
-  }
-
- private:
-  fit::function<void(
-      storage::Status, storage::ChangeSource, storage::IsObjectSynced,
-      std::unique_ptr<storage::DataSource::DataChunk>)> const callback_;
-  // Set of devices for which we are waiting an answer.
-  // We might be able to get rid of this list and just use a counter (or even
-  // nothing at all) once we have a timeout on requests.
-  std::set<std::string, convert::StringViewComparator> requests_;
-  fit::closure on_empty_;
-};
-
-// ObjectResponseHolder holds temporary data we collect in order to build
-// ObjectResponses.
-// This is necessary as object data (from |storage::Object|) and synchronization
-// data come from different asynchronous calls.
-struct PageCommunicatorImpl::ObjectResponseHolder {
-  storage::ObjectIdentifier identifier;
-  std::unique_ptr<const storage::Object> object;
-  bool is_synced = false;
-
-  explicit ObjectResponseHolder(storage::ObjectIdentifier identifier)
-      : identifier(std::move(identifier)) {}
-};
-
-PageCommunicatorImpl::PageCommunicatorImpl(
-    coroutine::CoroutineService* coroutine_service,
-    storage::PageStorage* storage, storage::PageSyncClient* sync_client,
-    std::string namespace_id, std::string page_id, DeviceMesh* mesh)
-    : coroutine_manager_(coroutine_service),
-      namespace_id_(std::move(namespace_id)),
-      page_id_(std::move(page_id)),
-      mesh_(mesh),
-      storage_(storage),
-      sync_client_(sync_client),
-      weak_factory_(this) {}
-
-PageCommunicatorImpl::~PageCommunicatorImpl() {
-  FXL_DCHECK(!in_destructor_);
-  in_destructor_ = true;
-
-  flatbuffers::FlatBufferBuilder buffer;
-  if (!started_) {
-    if (on_delete_) {
-      on_delete_();
-    }
-    return;
-  }
-
-  BuildWatchStopBuffer(&buffer);
-  for (const auto& device : interested_devices_) {
-    mesh_->Send(device, buffer);
-  }
-
-  if (on_delete_) {
-    on_delete_();
-  }
-}
-
-void PageCommunicatorImpl::Start() {
-  FXL_DCHECK(!started_);
-  started_ = true;
-  sync_client_->SetSyncDelegate(this);
-  storage_->AddCommitWatcher(this);
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer);
-
-  for (const auto& device : mesh_->GetDeviceList()) {
-    mesh_->Send(device, buffer);
-  }
-}
-
-void PageCommunicatorImpl::set_on_delete(fit::closure on_delete) {
-  FXL_DCHECK(!on_delete_) << "set_on_delete() can only be called once.";
-  on_delete_ = std::move(on_delete);
-}
-
-void PageCommunicatorImpl::OnDeviceChange(
-    fxl::StringView remote_device, p2p_provider::DeviceChangeType change_type) {
-  if (!started_ || in_destructor_) {
-    return;
-  }
-
-  if (change_type == p2p_provider::DeviceChangeType::DELETED) {
-    const auto& it = interested_devices_.find(remote_device);
-    if (it != interested_devices_.end()) {
-      interested_devices_.erase(it);
-    }
-    const auto& it2 = not_interested_devices_.find(remote_device);
-    if (it2 != not_interested_devices_.end()) {
-      not_interested_devices_.erase(it2);
-    }
-    const auto& it3 = pending_commit_batches_.find(remote_device);
-    if (it3 != pending_commit_batches_.end()) {
-      pending_commit_batches_.erase(it3);
-    }
-    return;
-  }
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer);
-  mesh_->Send(remote_device, buffer);
-}
-
-void PageCommunicatorImpl::OnNewRequest(fxl::StringView source,
-                                        MessageHolder<Request> message) {
-  FXL_DCHECK(!in_destructor_);
-  switch (message->request_type()) {
-    case RequestMessage_WatchStartRequest: {
-      MarkSyncedToPeer(
-          [this, source = source.ToString()](storage::Status status) {
-            if (status != storage::Status::OK) {
-              // If we fail to mark the page storage as synced to a peer, we
-              // might end up in a situation of deleting from disk a partially
-              // synced page. Log an error and return.
-              FXL_LOG(ERROR) << "Failed to mark PageStorage as synced to peer";
-              return;
-            }
-            if (interested_devices_.find(source) == interested_devices_.end()) {
-              interested_devices_.insert(source);
-            }
-            auto it = not_interested_devices_.find(source);
-            if (it != not_interested_devices_.end()) {
-              // The device used to be uninterested, but now wants updates.
-              // Let's contact it again.
-              not_interested_devices_.erase(it);
-              flatbuffers::FlatBufferBuilder buffer;
-              BuildWatchStartBuffer(&buffer);
-              mesh_->Send(source, buffer);
-            }
-          });
-      break;
-    }
-    case RequestMessage_WatchStopRequest: {
-      const auto& it = interested_devices_.find(source);
-      if (it != interested_devices_.end()) {
-        interested_devices_.erase(it);
-      }
-      // Device |source| disconnected, thus will not answer any request. We thus
-      // mark all pending requests to |source| to be finished.
-      std::vector<PendingObjectRequestHolder*> requests;
-      requests.reserve(pending_object_requests_.size());
-      for (auto& object_request : pending_object_requests_) {
-        // We cannot call Complete here because it deletes the object, making
-        // the iterator used in this for loop invalid.
-        requests.push_back(&object_request.second);
-      }
-      for (PendingObjectRequestHolder* const request : requests) {
-        request->Complete(source, nullptr);
-      }
-      break;
-    }
-    case RequestMessage_CommitRequest:
-      ProcessCommitRequest(
-          source.ToString(),
-          std::move(message).TakeAndMap<CommitRequest>(
-              [](const Request* request) {
-                return static_cast<const CommitRequest*>(request->request());
-              }));
-      break;
-    case RequestMessage_ObjectRequest:
-      ProcessObjectRequest(
-          source,
-          std::move(message).TakeAndMap<ObjectRequest>(
-              [](const Request* request) {
-                return static_cast<const ObjectRequest*>(request->request());
-              }));
-      break;
-    case RequestMessage_NONE:
-      FXL_LOG(ERROR) << "The message received is malformed";
-      break;
-  }
-}
-
-void PageCommunicatorImpl::OnNewResponse(fxl::StringView source,
-                                         MessageHolder<Response> message) {
-  FXL_DCHECK(!in_destructor_);
-  if (message->status() != ResponseStatus_OK) {
-    // The namespace or page was unknown on the other side. We can probably do
-    // something smart with this information (for instance, stop sending
-    // requests over), but we just ignore it for now.
-    not_interested_devices_.emplace(source.ToString());
-    return;
-  }
-  switch (message->response_type()) {
-    case ResponseMessage_ObjectResponse: {
-      const ObjectResponse* object_response =
-          static_cast<const ObjectResponse*>(message->response());
-      for (const Object* object : *(object_response->objects())) {
-        auto object_id = ToObjectIdentifier(object->id());
-        auto pending_request = pending_object_requests_.find(object_id);
-        if (pending_request == pending_object_requests_.end()) {
-          continue;
-        }
-        pending_request->second.Complete(source, object);
-      }
-      break;
-    }
-    case ResponseMessage_CommitResponse: {
-      const CommitResponse* commit_response =
-          static_cast<const CommitResponse*>(message->response());
-      std::vector<storage::PageStorage::CommitIdAndBytes> commits;
-      for (const Commit* commit : *(commit_response->commits())) {
-        if (commit->status() != CommitStatus_OK) {
-          continue;
-        }
-        commits.emplace_back(convert::ToString(commit->id()->id()),
-                             convert::ToString(commit->commit()->bytes()));
-      }
-      auto it = pending_commit_batches_.find(source);
-      if (it != pending_commit_batches_.end()) {
-        it->second.AddToBatch(std::move(commits));
-      } else {
-        auto it_pair = pending_commit_batches_.emplace(
-            std::piecewise_construct, std::forward_as_tuple(source.ToString()),
-            std::forward_as_tuple(source.ToString(), this, storage_));
-        it_pair.first->second.AddToBatch(std::move(commits));
-      }
-      break;
-    }
-
-    case ResponseMessage_NONE:
-      FXL_LOG(ERROR) << "The message received is malformed";
-      return;
-  }
-}
-
-void PageCommunicatorImpl::GetObject(
-    storage::ObjectIdentifier object_identifier,
-    fit::function<void(storage::Status, storage::ChangeSource,
-                       storage::IsObjectSynced,
-                       std::unique_ptr<storage::DataSource::DataChunk>)>
-        callback) {
-  flatbuffers::FlatBufferBuilder buffer;
-
-  BuildObjectRequestBuffer(&buffer, object_identifier);
-
-  auto request_holder = pending_object_requests_.emplace(
-      std::move(object_identifier), std::move(callback));
-
-  for (const auto& device : interested_devices_) {
-    request_holder.first->second.AddNewPendingRequest(device);
-  }
-  for (const auto& device : interested_devices_) {
-    mesh_->Send(device, buffer);
-  }
-}
-
-void PageCommunicatorImpl::OnNewCommits(
-    const std::vector<std::unique_ptr<const storage::Commit>>& commits,
-    storage::ChangeSource source) {
-  if (source != storage::ChangeSource::LOCAL) {
-    // Don't propagate synced commits.
-    return;
-  }
-  for (const auto& commit : commits) {
-    commits_to_upload_.emplace_back(commit->Clone());
-  }
-  // We need to check if we need to merge first.
-  storage_->GetHeadCommitIds(
-      callback::MakeScoped(weak_factory_.GetWeakPtr(),
-                           [this](storage::Status status,
-                                  std::vector<storage::CommitId> commit_ids) {
-                             if (status != storage::Status::OK) {
-                               return;
-                             }
-                             if (commit_ids.size() != 1) {
-                               // A merge needs to happen, let's wait until we
-                               // have one.
-                               return;
-                             }
-                             if (commits_to_upload_.empty()) {
-                               // Commits have already been sent. Let's stop
-                               // early.
-                               return;
-                             }
-                             flatbuffers::FlatBufferBuilder buffer;
-                             BuildCommitBuffer(&buffer, commits_to_upload_);
-
-                             for (const auto& device : interested_devices_) {
-                               mesh_->Send(device, buffer);
-                             }
-                             commits_to_upload_.clear();
-                           }));
-}
-
-void PageCommunicatorImpl::RequestCommits(fxl::StringView device,
-                                          std::vector<storage::CommitId> ids) {
-  flatbuffers::FlatBufferBuilder buffer;
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(buffer,
-                            convert::ToFlatBufferVector(&buffer, namespace_id_),
-                            convert::ToFlatBufferVector(&buffer, page_id_));
-  std::vector<flatbuffers::Offset<CommitId>> commit_ids;
-  for (const auto& id : ids) {
-    flatbuffers::Offset<CommitId> commit_id =
-        CreateCommitId(buffer, convert::ToFlatBufferVector(&buffer, id));
-    commit_ids.push_back(commit_id);
-  }
-  flatbuffers::Offset<CommitRequest> commit_request =
-      CreateCommitRequest(buffer, buffer.CreateVector(commit_ids));
-  flatbuffers::Offset<Request> request =
-      CreateRequest(buffer, namespace_page_id, RequestMessage_CommitRequest,
-                    commit_request.Union());
-  flatbuffers::Offset<Message> message =
-      CreateMessage(buffer, MessageUnion_Request, request.Union());
-  buffer.Finish(message);
-  mesh_->Send(device, buffer);
-}
-
-void PageCommunicatorImpl::BuildWatchStartBuffer(
-    flatbuffers::FlatBufferBuilder* buffer) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id_),
-                            convert::ToFlatBufferVector(buffer, page_id_));
-  flatbuffers::Offset<Request> request = CreateRequest(
-      *buffer, namespace_page_id, RequestMessage_WatchStartRequest);
-  flatbuffers::Offset<Message> message =
-      CreateMessage(*buffer, MessageUnion_Request, request.Union());
-  buffer->Finish(message);
-}
-
-void PageCommunicatorImpl::BuildWatchStopBuffer(
-    flatbuffers::FlatBufferBuilder* buffer) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id_),
-                            convert::ToFlatBufferVector(buffer, page_id_));
-  flatbuffers::Offset<Request> request = CreateRequest(
-      *buffer, namespace_page_id, RequestMessage_WatchStopRequest);
-  flatbuffers::Offset<Message> message =
-      CreateMessage(*buffer, MessageUnion_Request, request.Union());
-  buffer->Finish(message);
-}
-
-void PageCommunicatorImpl::BuildObjectRequestBuffer(
-    flatbuffers::FlatBufferBuilder* buffer,
-    storage::ObjectIdentifier object_identifier) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id_),
-                            convert::ToFlatBufferVector(buffer, page_id_));
-  flatbuffers::Offset<ObjectId> object_id = CreateObjectId(
-      *buffer, object_identifier.key_index(),
-      object_identifier.deletion_scope_id(),
-      convert::ToFlatBufferVector(
-          buffer, object_identifier.object_digest().Serialize()));
-  flatbuffers::Offset<ObjectRequest> object_request = CreateObjectRequest(
-      *buffer, buffer->CreateVector(
-                   std::vector<flatbuffers::Offset<ObjectId>>({object_id})));
-  flatbuffers::Offset<Request> request =
-      CreateRequest(*buffer, namespace_page_id, RequestMessage_ObjectRequest,
-                    object_request.Union());
-  flatbuffers::Offset<Message> message =
-      CreateMessage(*buffer, MessageUnion_Request, request.Union());
-  buffer->Finish(message);
-}
-
-void PageCommunicatorImpl::BuildCommitBuffer(
-    flatbuffers::FlatBufferBuilder* buffer,
-    const std::vector<std::unique_ptr<const storage::Commit>>& commits) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id_),
-                            convert::ToFlatBufferVector(buffer, page_id_));
-  std::vector<flatbuffers::Offset<Commit>> fb_commits;
-  for (const auto& commit : commits) {
-    flatbuffers::Offset<CommitId> fb_commit_id = CreateCommitId(
-        *buffer, convert::ToFlatBufferVector(buffer, commit->GetId()));
-    flatbuffers::Offset<Data> fb_commit_data = CreateData(
-        *buffer,
-        convert::ToFlatBufferVector(buffer, commit->GetStorageBytes()));
-    fb_commits.emplace_back(
-        CreateCommit(*buffer, fb_commit_id, CommitStatus_OK, fb_commit_data));
-  }
-
-  flatbuffers::Offset<CommitResponse> commit_response =
-      CreateCommitResponse(*buffer, buffer->CreateVector(fb_commits));
-  flatbuffers::Offset<Response> response =
-      CreateResponse(*buffer, ResponseStatus_OK, namespace_page_id,
-                     ResponseMessage_CommitResponse, commit_response.Union());
-  flatbuffers::Offset<Message> message =
-      CreateMessage(*buffer, MessageUnion_Response, response.Union());
-  buffer->Finish(message);
-}
-
-void PageCommunicatorImpl::BuildCommitResponseBuffer(
-    flatbuffers::FlatBufferBuilder* buffer,
-    const std::vector<
-        std::pair<storage::CommitId, std::unique_ptr<const storage::Commit>>>&
-        commits) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id_),
-                            convert::ToFlatBufferVector(buffer, page_id_));
-  std::vector<flatbuffers::Offset<Commit>> fb_commits;
-  for (const auto& commit : commits) {
-    flatbuffers::Offset<CommitId> fb_commit_id = CreateCommitId(
-        *buffer, convert::ToFlatBufferVector(buffer, commit.first));
-    if (commit.second) {
-      flatbuffers::Offset<Data> fb_commit_data =
-          CreateData(*buffer, convert::ToFlatBufferVector(
-                                  buffer, commit.second->GetStorageBytes()));
-      fb_commits.emplace_back(
-          CreateCommit(*buffer, fb_commit_id, CommitStatus_OK, fb_commit_data));
-    } else {
-      fb_commits.emplace_back(
-          CreateCommit(*buffer, fb_commit_id, CommitStatus_UNKNOWN_COMMIT));
-    }
-  }
-
-  flatbuffers::Offset<CommitResponse> commit_response =
-      CreateCommitResponse(*buffer, buffer->CreateVector(fb_commits));
-  flatbuffers::Offset<Response> response =
-      CreateResponse(*buffer, ResponseStatus_OK, namespace_page_id,
-                     ResponseMessage_CommitResponse, commit_response.Union());
-  flatbuffers::Offset<Message> message =
-      CreateMessage(*buffer, MessageUnion_Response, response.Union());
-  buffer->Finish(message);
-}
-
-void PageCommunicatorImpl::ProcessCommitRequest(
-    std::string source, MessageHolder<CommitRequest> request) {
-  coroutine_manager_.StartCoroutine([this, source = std::move(source),
-                                     request = std::move(request)](
-                                        coroutine::CoroutineHandler* handler) {
-    auto commit_waiter = fxl::MakeRefCounted<callback::Waiter<
-        storage::Status,
-        std::pair<storage::CommitId, std::unique_ptr<const storage::Commit>>>>(
-        storage::Status::OK);
-    for (const CommitId* id : *request->commit_ids()) {
-      storage_->GetCommit(
-          id->id(), [commit_id = convert::ToString(id->id()),
-                     callback = commit_waiter->NewCallback()](
-                        storage::Status status,
-                        std::unique_ptr<const storage::Commit> commit) mutable {
-            if (status == storage::Status::NOT_FOUND) {
-              // Not finding an commit is okay in this context: we'll just
-              // reply we don't have it. There is not need to abort
-              // processing the request.
-              callback(storage::Status::OK,
-                       std::make_pair(std::move(commit_id), nullptr));
-              return;
-            }
-            callback(status,
-                     std::make_pair(std::move(commit_id), std::move(commit)));
-          });
-    }
-    storage::Status status;
-    std::vector<
-        std::pair<storage::CommitId, std::unique_ptr<const storage::Commit>>>
-        commits;
-    if (coroutine::Wait(handler, std::move(commit_waiter), &status, &commits) ==
-        coroutine::ContinuationStatus::INTERRUPTED) {
-      return;
-    }
-
-    if (status != storage::Status::OK) {
-      return;
-    }
-
-    flatbuffers::FlatBufferBuilder buffer;
-    BuildCommitResponseBuffer(&buffer, commits);
-    mesh_->Send(source, buffer);
-  });
-}
-
-void PageCommunicatorImpl::ProcessObjectRequest(
-    fxl::StringView source, MessageHolder<ObjectRequest> request) {
-  coroutine_manager_.StartCoroutine(
-      [this, source = source.ToString(),
-       request = std::move(request)](coroutine::CoroutineHandler* handler) {
-        // We use a std::list so that we can keep a reference to an element
-        // while adding new items.
-        std::list<ObjectResponseHolder> object_responses;
-        auto response_waiter =
-            fxl::MakeRefCounted<callback::StatusWaiter<storage::Status>>(
-                storage::Status::OK);
-        for (const ObjectId* object_id : *request->object_ids()) {
-          storage::ObjectIdentifier identifier{
-              object_id->key_index(), object_id->deletion_scope_id(),
-              storage::ObjectDigest(object_id->digest())};
-          object_responses.emplace_back(identifier);
-          auto& response = object_responses.back();
-          storage_->GetPiece(
-              identifier,
-              [callback = response_waiter->NewCallback(), &response](
-                  storage::Status status,
-                  std::unique_ptr<const storage::Object> object) mutable {
-                if (status == storage::Status::NOT_FOUND) {
-                  // Not finding an object is okay in this context: we'll just
-                  // reply we don't have it. There is not need to abort
-                  // processing the request.
-                  callback(storage::Status::OK);
-                  return;
-                }
-                response.object = std::move(object);
-                callback(status);
-              });
-          storage_->IsPieceSynced(
-              std::move(identifier),
-              [callback = response_waiter->NewCallback(), &response](
-                  storage::Status status, bool is_synced) {
-                if (status == storage::Status::NOT_FOUND) {
-                  // Not finding an object is okay in this context: we'll just
-                  // reply we don't have it. There is not need to abort
-                  // processing the request.
-                  callback(storage::Status::OK);
-                  return;
-                }
-                response.is_synced = is_synced;
-                callback(status);
-              });
-        }
-
-        storage::Status status;
-        if (coroutine::Wait(handler, response_waiter, &status) ==
-            coroutine::ContinuationStatus::INTERRUPTED) {
-          return;
-        }
-
-        if (status != storage::Status::OK) {
-          FXL_LOG(WARNING) << "Error while retrieving objects: " << status;
-          return;
-        }
-
-        flatbuffers::FlatBufferBuilder buffer;
-        BuildObjectResponseBuffer(&buffer, std::move(object_responses));
-
-        mesh_->Send(source, buffer);
-      });
-}
-
-void PageCommunicatorImpl::BuildObjectResponseBuffer(
-    flatbuffers::FlatBufferBuilder* buffer,
-    std::list<ObjectResponseHolder> object_responses) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id_),
-                            convert::ToFlatBufferVector(buffer, page_id_));
-  std::vector<flatbuffers::Offset<Object>> fb_objects;
-  for (const ObjectResponseHolder& object_response : object_responses) {
-    flatbuffers::Offset<ObjectId> fb_object_id = CreateObjectId(
-        *buffer, object_response.identifier.key_index(),
-        object_response.identifier.deletion_scope_id(),
-        convert::ToFlatBufferVector(
-            buffer, object_response.identifier.object_digest().Serialize()));
-    if (object_response.object) {
-      fxl::StringView data;
-      storage::Status status = object_response.object->GetData(&data);
-      if (status != storage::Status::OK) {
-        FXL_LOG(ERROR) << "Unable to read object data, aborting: " << status;
-        // We do getData first so that we can continue in case of error
-        // without having written anything in the flatbuffer.
-        continue;
-      }
-      flatbuffers::Offset<Data> fb_data =
-          CreateData(*buffer, convert::ToFlatBufferVector(buffer, data));
-      ObjectSyncStatus sync_status = object_response.is_synced
-                                         ? ObjectSyncStatus_SYNCED_TO_CLOUD
-                                         : ObjectSyncStatus_UNSYNCED;
-      fb_objects.emplace_back(CreateObject(
-          *buffer, fb_object_id, ObjectStatus_OK, fb_data, sync_status));
-    } else {
-      fb_objects.emplace_back(
-          CreateObject(*buffer, fb_object_id, ObjectStatus_UNKNOWN_OBJECT));
-    }
-  }
-  flatbuffers::Offset<ObjectResponse> object_response =
-      CreateObjectResponse(*buffer, buffer->CreateVector(fb_objects));
-  flatbuffers::Offset<Response> response =
-      CreateResponse(*buffer, ResponseStatus_OK, namespace_page_id,
-                     ResponseMessage_ObjectResponse, object_response.Union());
-  flatbuffers::Offset<Message> message =
-      CreateMessage(*buffer, MessageUnion_Response, response.Union());
-  buffer->Finish(message);
-}
-
-void PageCommunicatorImpl::MarkSyncedToPeer(
-    fit::function<void(storage::Status)> callback) {
-  if (marked_as_synced_to_peer_) {
-    callback(storage::Status::OK);
-    return;
-  }
-  storage_->MarkSyncedToPeer(
-      [this, callback = std::move(callback)](storage::Status status) {
-        if (status == storage::Status::OK) {
-          marked_as_synced_to_peer_ = true;
-        }
-        callback(status);
-      });
-}
-
-}  // namespace p2p_sync
diff --git a/bin/ledger/p2p_sync/impl/page_communicator_impl.h b/bin/ledger/p2p_sync/impl/page_communicator_impl.h
deleted file mode 100644
index 025c049..0000000
--- a/bin/ledger/p2p_sync/impl/page_communicator_impl.h
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_PAGE_COMMUNICATOR_IMPL_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_PAGE_COMMUNICATOR_IMPL_H_
-
-#include <flatbuffers/flatbuffers.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/callback/cancellable.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/coroutine/coroutine_manager.h"
-#include "peridot/bin/ledger/p2p_provider/public/types.h"
-#include "peridot/bin/ledger/p2p_sync/impl/commit_batch.h"
-#include "peridot/bin/ledger/p2p_sync/impl/device_mesh.h"
-#include "peridot/bin/ledger/p2p_sync/impl/message_generated.h"
-#include "peridot/bin/ledger/p2p_sync/impl/message_holder.h"
-#include "peridot/bin/ledger/p2p_sync/public/page_communicator.h"
-#include "peridot/bin/ledger/storage/public/commit_watcher.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/page_sync_client.h"
-#include "peridot/bin/ledger/storage/public/page_sync_delegate.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace p2p_sync {
-class PageCommunicatorImplInspectorForTest;
-
-class PageCommunicatorImpl : public PageCommunicator,
-                             public storage::PageSyncDelegate,
-                             public storage::CommitWatcher,
-                             public CommitBatch::Delegate {
- public:
-  PageCommunicatorImpl(coroutine::CoroutineService* coroutine_service,
-                       storage::PageStorage* storage,
-                       storage::PageSyncClient* sync_client,
-                       std::string namespace_id, std::string page_id,
-                       DeviceMesh* mesh);
-  ~PageCommunicatorImpl() override;
-
-  void set_on_delete(fit::closure on_delete);
-
-  // OnDeviceChange is called each time a device connects or unconnects.
-  void OnDeviceChange(fxl::StringView remote_device,
-                      p2p_provider::DeviceChangeType change_type);
-
-  // Called when a new request arrived for this page from device |source|.
-  void OnNewRequest(fxl::StringView source, MessageHolder<Request> message);
-
-  // Called when a new response arrived for this page from device |source|.
-  void OnNewResponse(fxl::StringView source, MessageHolder<Response> message);
-
-  // PageCommunicator:
-  void Start() override;
-
-  // storage::PageSyncDelegate:
-  void GetObject(
-      storage::ObjectIdentifier object_identifier,
-      fit::function<void(storage::Status, storage::ChangeSource,
-                         storage::IsObjectSynced,
-                         std::unique_ptr<storage::DataSource::DataChunk>)>
-          callback) override;
-
-  // storage::CommitWatcher:
-  void OnNewCommits(
-      const std::vector<std::unique_ptr<const storage::Commit>>& commits,
-      storage::ChangeSource source) override;
-
- private:
-  friend class PageCommunicatorImplInspectorForTest;
-  class PendingObjectRequestHolder;
-  struct ObjectResponseHolder;
-
-  void RequestCommits(fxl::StringView device,
-                      std::vector<storage::CommitId> ids) override;
-
-  // These methods build the flatbuffer message corresponding to their name.
-  void BuildWatchStartBuffer(flatbuffers::FlatBufferBuilder* buffer);
-  void BuildWatchStopBuffer(flatbuffers::FlatBufferBuilder* buffer);
-  void BuildObjectRequestBuffer(flatbuffers::FlatBufferBuilder* buffer,
-                                storage::ObjectIdentifier object_identifier);
-  void BuildCommitBuffer(
-      flatbuffers::FlatBufferBuilder* buffer,
-      const std::vector<std::unique_ptr<const storage::Commit>>& commits);
-  void BuildObjectResponseBuffer(
-      flatbuffers::FlatBufferBuilder* buffer,
-      std::list<ObjectResponseHolder> object_responses);
-
-  // Processes an incoming CommitRequest object from device |source|.
-  void ProcessCommitRequest(std::string source,
-                            MessageHolder<CommitRequest> request);
-
-  // Builds a CommitResponse buffer in response to an incoming CommitRequest.
-  // This is different from |BuildCommitBuffer| which builds CommitResponse for
-  // a remote watcher. In particular, |BuildCommitBuffer|'s commits always
-  // exist. In this method, the pair's second element for a commit will be null
-  // if the commit does not exist on this device.
-  void BuildCommitResponseBuffer(
-      flatbuffers::FlatBufferBuilder* buffer,
-      const std::vector<
-          std::pair<storage::CommitId, std::unique_ptr<const storage::Commit>>>&
-          commits);
-
-  // Processes an incoming ObjectRequest object.
-  void ProcessObjectRequest(fxl::StringView source,
-                            MessageHolder<ObjectRequest> request);
-
-  // Marks the PageStorage as synced to a peer. If successful, on the following
-  // call to MarkSyncedToPeer, the given |callback| will be called immediately.
-  void MarkSyncedToPeer(fit::function<void(storage::Status)> callback);
-
-  // Map of pending requests for objects.
-  callback::AutoCleanableMap<storage::ObjectIdentifier,
-                             PendingObjectRequestHolder>
-      pending_object_requests_;
-  // Map of pending commit batch insertions.
-  callback::AutoCleanableMap<std::string, CommitBatch,
-                             convert::StringViewComparator>
-      pending_commit_batches_;
-  // List of devices we know are interested in this page.
-  std::set<std::string, convert::StringViewComparator> interested_devices_;
-  // List of devices we know are not interested in this page.
-  std::set<std::string, convert::StringViewComparator> not_interested_devices_;
-  fit::closure on_delete_;
-  bool marked_as_synced_to_peer_ = false;
-  bool started_ = false;
-  bool in_destructor_ = false;
-
-  // Commit upload: we queue commits to upload here while we check if a
-  // conflict exists. If it exist, we wait until it is resolved before
-  // uploading.
-  std::vector<std::unique_ptr<const storage::Commit>> commits_to_upload_;
-
-  coroutine::CoroutineManager coroutine_manager_;
-  const std::string namespace_id_;
-  const std::string page_id_;
-  DeviceMesh* const mesh_;
-  storage::PageStorage* const storage_;
-  storage::PageSyncClient* const sync_client_;
-
-  // This must be the last member of the class.
-  fxl::WeakPtrFactory<PageCommunicatorImpl> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageCommunicatorImpl);
-};
-
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_PAGE_COMMUNICATOR_IMPL_H_
diff --git a/bin/ledger/p2p_sync/impl/page_communicator_impl_unittest.cc b/bin/ledger/p2p_sync/impl/page_communicator_impl_unittest.cc
deleted file mode 100644
index 0481681..0000000
--- a/bin/ledger/p2p_sync/impl/page_communicator_impl_unittest.cc
+++ /dev/null
@@ -1,1239 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_sync/impl/page_communicator_impl.h"
-
-#include <algorithm>
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <lib/async/cpp/task.h>
-#include <lib/fit/function.h>
-
-// gtest matchers are in gmock and we cannot include the specific header file
-// directly as it is private to the library.
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/gtest/test_loop_fixture.h>
-#include "gmock/gmock.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/p2p_sync/impl/device_mesh.h"
-#include "peridot/bin/ledger/storage/fake/fake_object.h"
-#include "peridot/bin/ledger/storage/testing/commit_empty_impl.h"
-#include "peridot/bin/ledger/storage/testing/page_storage_empty_impl.h"
-#include "peridot/lib/convert/convert.h"
-
-using testing::IsEmpty;
-
-namespace p2p_sync {
-namespace {
-
-// Creates a dummy object identifier.
-// |object_digest| need not be valid (wrt. internal storage constraints) as it
-// is only used as an opaque identifier for p2p.
-storage::ObjectIdentifier MakeObjectIdentifier(std::string object_digest) {
-  return storage::ObjectIdentifier(
-      0, 0, storage::ObjectDigest(std::move(object_digest)));
-}
-
-class FakeCommit : public storage::CommitEmptyImpl {
- public:
-  FakeCommit(std::string id, std::string data,
-             std::vector<storage::CommitId> parents = {})
-      : id_(std::move(id)),
-        data_(std::move(data)),
-        parents_(std::move(parents)) {}
-
-  const storage::CommitId& GetId() const override { return id_; }
-
-  std::vector<storage::CommitIdView> GetParentIds() const override {
-    std::vector<storage::CommitIdView> parent_ids;
-    for (const storage::CommitId& id : parents_) {
-      parent_ids.emplace_back(id);
-    }
-    return parent_ids;
-  }
-
-  fxl::StringView GetStorageBytes() const override { return data_; }
-
-  std::unique_ptr<const storage::Commit> Clone() const override {
-    return std::make_unique<FakeCommit>(id_, data_);
-  }
-
- private:
-  const std::string id_;
-  const std::string data_;
-  const std::vector<storage::CommitId> parents_;
-};
-
-class FakePageStorage : public storage::PageStorageEmptyImpl {
- public:
-  explicit FakePageStorage(async_dispatcher_t* dispatcher, std::string page_id)
-      : dispatcher_(dispatcher), page_id_(std::move(page_id)) {}
-  ~FakePageStorage() override {}
-
-  storage::PageId GetId() override { return page_id_; }
-
-  void GetHeadCommitIds(
-      fit::function<void(storage::Status, std::vector<storage::CommitId>)>
-          callback) override {
-    callback(storage::Status::OK, {"commit_id"});
-  }
-
-  const FakeCommit& AddCommit(std::string id, std::string data) {
-    auto commit =
-        commits_.emplace(std::piecewise_construct, std::forward_as_tuple(id),
-                         std::forward_as_tuple(id, std::move(data)));
-    return commit.first->second;
-  }
-
-  void GetCommit(storage::CommitIdView commit_id,
-                 fit::function<void(storage::Status,
-                                    std::unique_ptr<const storage::Commit>)>
-                     callback) override {
-    auto it = commits_.find(commit_id);
-    if (it == commits_.end()) {
-      callback(storage::Status::NOT_FOUND, nullptr);
-      return;
-    }
-    callback(storage::Status::OK, it->second.Clone());
-  }
-
-  void GetPiece(storage::ObjectIdentifier object_identifier,
-                fit::function<void(storage::Status,
-                                   std::unique_ptr<const storage::Object>)>
-                    callback) override {
-    async::PostTask(dispatcher_, [this, object_identifier,
-                                  callback = std::move(callback)]() {
-      const auto& it = objects_.find(object_identifier);
-      if (it == objects_.end()) {
-        callback(storage::Status::NOT_FOUND, nullptr);
-        return;
-      }
-      callback(storage::Status::OK, std::make_unique<storage::fake::FakeObject>(
-                                        object_identifier, it->second));
-    });
-  }
-
-  void SetPiece(storage::ObjectIdentifier object_identifier,
-                std::string contents, bool is_synced = false) {
-    objects_[object_identifier] = std::move(contents);
-    if (is_synced) {
-      synced_objects_.insert(std::move(object_identifier));
-    }
-  }
-
-  void IsPieceSynced(
-      storage::ObjectIdentifier object_identifier,
-      fit::function<void(storage::Status, bool)> callback) override {
-    async::PostTask(dispatcher_, [this, object_identifier,
-                                  callback = std::move(callback)]() {
-      const auto& it = objects_.find(object_identifier);
-      if (it == objects_.end()) {
-        callback(storage::Status::NOT_FOUND, false);
-        return;
-      }
-      callback(storage::Status::OK, synced_objects_.find(object_identifier) !=
-                                        synced_objects_.end());
-    });
-  }
-
-  void AddCommitsFromSync(
-      std::vector<storage::PageStorage::CommitIdAndBytes> ids_and_bytes,
-      const storage::ChangeSource /*source*/,
-      fit::function<void(storage::Status, std::vector<storage::CommitId>)>
-          callback) override {
-    commits_from_sync_.emplace_back(
-        std::piecewise_construct,
-        std::forward_as_tuple(std::move(ids_and_bytes)),
-        std::forward_as_tuple(std::move(callback)));
-  }
-
-  storage::Status AddCommitWatcher(storage::CommitWatcher* watcher) override {
-    FXL_DCHECK(!watcher_);
-    watcher_ = watcher;
-    return storage::Status::OK;
-  }
-
-  void MarkSyncedToPeer(
-      fit::function<void(storage::Status)> callback) override {
-    callback(mark_synced_to_peer_status);
-  }
-
-  storage::CommitWatcher* watcher_ = nullptr;
-  std::vector<std::pair<
-      std::vector<storage::PageStorage::CommitIdAndBytes>,
-      fit::function<void(storage::Status, std::vector<storage::CommitId>)>>>
-      commits_from_sync_;
-  storage::Status mark_synced_to_peer_status = storage::Status::OK;
-
- private:
-  async_dispatcher_t* const dispatcher_;
-  const std::string page_id_;
-  std::map<storage::ObjectIdentifier, std::string> objects_;
-  std::set<storage::ObjectIdentifier> synced_objects_;
-  std::map<storage::CommitId, FakeCommit, convert::StringViewComparator>
-      commits_;
-};
-
-class FakeDeviceMesh : public DeviceMesh {
- public:
-  FakeDeviceMesh() {}
-  ~FakeDeviceMesh() override {}
-
-  DeviceSet GetDeviceList() override { return devices_; }
-
-  void Send(fxl::StringView device_name,
-            convert::ExtendedStringView data) override {
-    messages_.emplace_back(
-        std::forward_as_tuple(device_name.ToString(), data.ToString()));
-  }
-
-  DeviceSet devices_;
-  std::vector<std::pair<std::string, std::string>> messages_;
-};
-
-void BuildWatchStartBuffer(flatbuffers::FlatBufferBuilder* buffer,
-                           fxl::StringView namespace_id,
-                           fxl::StringView page_id) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id),
-                            convert::ToFlatBufferVector(buffer, page_id));
-  flatbuffers::Offset<Request> request = CreateRequest(
-      *buffer, namespace_page_id, RequestMessage_WatchStartRequest);
-  flatbuffers::Offset<Message> message =
-      CreateMessage(*buffer, MessageUnion_Request, request.Union());
-  buffer->Finish(message);
-}
-
-void BuildWatchStopBuffer(flatbuffers::FlatBufferBuilder* buffer,
-                          fxl::StringView namespace_id,
-                          fxl::StringView page_id) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id),
-                            convert::ToFlatBufferVector(buffer, page_id));
-  flatbuffers::Offset<Request> request = CreateRequest(
-      *buffer, namespace_page_id, RequestMessage_WatchStopRequest);
-  flatbuffers::Offset<Message> message =
-      CreateMessage(*buffer, MessageUnion_Request, request.Union());
-  buffer->Finish(message);
-}
-
-void BuildObjectRequestBuffer(
-    flatbuffers::FlatBufferBuilder* buffer, fxl::StringView namespace_id,
-    fxl::StringView page_id,
-    std::vector<storage::ObjectIdentifier> object_ids) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id),
-                            convert::ToFlatBufferVector(buffer, page_id));
-  std::vector<flatbuffers::Offset<ObjectId>> fb_object_ids;
-  fb_object_ids.reserve(object_ids.size());
-  for (const storage::ObjectIdentifier& object_id : object_ids) {
-    fb_object_ids.emplace_back(CreateObjectId(
-        *buffer, object_id.key_index(), object_id.deletion_scope_id(),
-        convert::ToFlatBufferVector(buffer,
-                                    object_id.object_digest().Serialize())));
-  }
-  flatbuffers::Offset<ObjectRequest> object_request =
-      CreateObjectRequest(*buffer, buffer->CreateVector(fb_object_ids));
-  flatbuffers::Offset<Request> fb_request =
-      CreateRequest(*buffer, namespace_page_id, RequestMessage_ObjectRequest,
-                    object_request.Union());
-  flatbuffers::Offset<Message> fb_message =
-      CreateMessage(*buffer, MessageUnion_Request, fb_request.Union());
-  buffer->Finish(fb_message);
-}
-
-void BuildObjectResponseBuffer(
-    flatbuffers::FlatBufferBuilder* buffer, fxl::StringView namespace_id,
-    fxl::StringView page_id,
-    std::vector<std::tuple<storage::ObjectIdentifier, std::string, bool>>
-        data) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id),
-                            convert::ToFlatBufferVector(buffer, page_id));
-  std::vector<flatbuffers::Offset<Object>> fb_objects;
-  for (const auto& object_tuple : data) {
-    const storage::ObjectIdentifier& object_identifier =
-        std::get<0>(object_tuple);
-    const std::string& data = std::get<1>(object_tuple);
-    bool is_synced = std::get<2>(object_tuple);
-
-    flatbuffers::Offset<ObjectId> fb_object_id = CreateObjectId(
-        *buffer, object_identifier.key_index(),
-        object_identifier.deletion_scope_id(),
-        convert::ToFlatBufferVector(
-            buffer, object_identifier.object_digest().Serialize()));
-    if (!data.empty()) {
-      flatbuffers::Offset<Data> fb_data =
-          CreateData(*buffer, convert::ToFlatBufferVector(buffer, data));
-      fb_objects.emplace_back(
-          CreateObject(*buffer, fb_object_id, ObjectStatus_OK, fb_data,
-                       is_synced ? ObjectSyncStatus_SYNCED_TO_CLOUD
-                                 : ObjectSyncStatus_UNSYNCED));
-    } else {
-      fb_objects.emplace_back(
-          CreateObject(*buffer, fb_object_id, ObjectStatus_UNKNOWN_OBJECT));
-    }
-  }
-  flatbuffers::Offset<ObjectResponse> object_response =
-      CreateObjectResponse(*buffer, buffer->CreateVector(fb_objects));
-  flatbuffers::Offset<Response> response =
-      CreateResponse(*buffer, ResponseStatus_OK, namespace_page_id,
-                     ResponseMessage_ObjectResponse, object_response.Union());
-  flatbuffers::Offset<Message> message =
-      CreateMessage(*buffer, MessageUnion_Response, response.Union());
-  buffer->Finish(message);
-}
-
-void BuildCommitRequestBuffer(flatbuffers::FlatBufferBuilder* buffer,
-                              fxl::StringView namespace_id,
-                              fxl::StringView page_id,
-                              std::vector<storage::CommitId> commit_ids) {
-  flatbuffers::Offset<NamespacePageId> namespace_page_id =
-      CreateNamespacePageId(*buffer,
-                            convert::ToFlatBufferVector(buffer, namespace_id),
-                            convert::ToFlatBufferVector(buffer, page_id));
-  std::vector<flatbuffers::Offset<CommitId>> fb_commit_ids;
-  fb_commit_ids.reserve(commit_ids.size());
-  for (const storage::CommitId& commit_id : commit_ids) {
-    fb_commit_ids.emplace_back(CreateCommitId(
-        *buffer, convert::ToFlatBufferVector(buffer, commit_id)));
-  }
-  flatbuffers::Offset<CommitRequest> commit_request =
-      CreateCommitRequest(*buffer, buffer->CreateVector(fb_commit_ids));
-  flatbuffers::Offset<Request> fb_request =
-      CreateRequest(*buffer, namespace_page_id, RequestMessage_CommitRequest,
-                    commit_request.Union());
-  flatbuffers::Offset<Message> fb_message =
-      CreateMessage(*buffer, MessageUnion_Request, fb_request.Union());
-  buffer->Finish(fb_message);
-}
-
-class PageCommunicatorImplTest : public gtest::TestLoopFixture {
- public:
-  PageCommunicatorImplTest() {}
-  ~PageCommunicatorImplTest() override {}
-
- protected:
-  void SetUp() override { ::testing::Test::SetUp(); }
-
-  coroutine::CoroutineServiceImpl coroutine_service_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageCommunicatorImplTest);
-};
-
-TEST_F(PageCommunicatorImplTest, ConnectToExistingMesh) {
-  FakeDeviceMesh mesh;
-  mesh.devices_.emplace("device2");
-  FakePageStorage storage(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-
-  EXPECT_TRUE(mesh.messages_.empty());
-
-  page_communicator.Start();
-
-  ASSERT_EQ(1u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[0].first);
-
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(mesh.messages_[0].second.data()),
-      mesh.messages_[0].second.size());
-  if (!VerifyMessageBuffer(verifier)) {
-    // Wrong serialization, abort.
-    FXL_LOG(ERROR) << "The message received is malformed.";
-    return;
-  };
-  const Message* message = GetMessage(mesh.messages_[0].second.data());
-  ASSERT_EQ(MessageUnion_Request, message->message_type());
-  const Request* request = static_cast<const Request*>(message->message());
-  const NamespacePageId* namespace_page_id = request->namespace_page();
-  EXPECT_EQ("ledger",
-            convert::ExtendedStringView(namespace_page_id->namespace_id()));
-  EXPECT_EQ("page", convert::ExtendedStringView(namespace_page_id->page_id()));
-  EXPECT_EQ(RequestMessage_WatchStartRequest, request->request_type());
-}
-
-TEST_F(PageCommunicatorImplTest, ConnectToNewMeshParticipant) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  EXPECT_TRUE(mesh.messages_.empty());
-
-  mesh.devices_.emplace("device2");
-  page_communicator.OnDeviceChange("device2",
-                                   p2p_provider::DeviceChangeType::NEW);
-
-  ASSERT_EQ(1u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[0].first);
-
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(mesh.messages_[0].second.data()),
-      mesh.messages_[0].second.size());
-  if (!VerifyMessageBuffer(verifier)) {
-    // Wrong serialization, abort.
-    FXL_LOG(ERROR) << "The message received is malformed.";
-    return;
-  };
-  const Message* message = GetMessage(mesh.messages_[0].second.data());
-  ASSERT_EQ(MessageUnion_Request, message->message_type());
-  const Request* request = static_cast<const Request*>(message->message());
-  const NamespacePageId* namespace_page_id = request->namespace_page();
-  EXPECT_EQ("ledger",
-            convert::ExtendedStringView(namespace_page_id->namespace_id()));
-  EXPECT_EQ("page", convert::ExtendedStringView(namespace_page_id->page_id()));
-  EXPECT_EQ(RequestMessage_WatchStartRequest, request->request_type());
-}
-
-TEST_F(PageCommunicatorImplTest, GetObject) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer, "ledger", "page");
-  MessageHolder<Message> new_device_message(convert::ToStringView(buffer),
-                                            &GetMessage);
-  page_communicator.OnNewRequest(
-      "device2", std::move(new_device_message)
-                     .TakeAndMap<Request>([](const Message* message) {
-                       return static_cast<const Request*>(message->message());
-                     }));
-
-  bool called;
-  storage::Status status;
-  storage::ChangeSource source;
-  storage::IsObjectSynced is_object_synced;
-  std::unique_ptr<storage::DataSource::DataChunk> data;
-  page_communicator.GetObject(
-      MakeObjectIdentifier("foo"),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &source,
-                        &is_object_synced, &data));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-
-  ASSERT_EQ(1u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[0].first);
-
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(mesh.messages_[0].second.data()),
-      mesh.messages_[0].second.size());
-  ASSERT_TRUE(VerifyMessageBuffer(verifier));
-
-  // Verify the message sent to request the object.
-  const Message* message = GetMessage(mesh.messages_[0].second.data());
-  ASSERT_EQ(MessageUnion_Request, message->message_type());
-  const Request* request = static_cast<const Request*>(message->message());
-  const NamespacePageId* namespace_page_id = request->namespace_page();
-  EXPECT_EQ("ledger",
-            convert::ExtendedStringView(namespace_page_id->namespace_id()));
-  EXPECT_EQ("page", convert::ExtendedStringView(namespace_page_id->page_id()));
-  EXPECT_EQ(RequestMessage_ObjectRequest, request->request_type());
-  const ObjectRequest* object_request =
-      static_cast<const ObjectRequest*>(request->request());
-  EXPECT_EQ(1u, object_request->object_ids()->size());
-  EXPECT_EQ(0u, object_request->object_ids()->begin()->key_index());
-  EXPECT_EQ(0u, object_request->object_ids()->begin()->deletion_scope_id());
-  EXPECT_EQ("foo", convert::ExtendedStringView(
-                       object_request->object_ids()->begin()->digest()));
-}
-
-TEST_F(PageCommunicatorImplTest, DontGetObjectsIfMarkPageSyncedToPeerFailed) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer, "ledger", "page");
-  MessageHolder<Message> new_device_message(convert::ToStringView(buffer),
-                                            &GetMessage);
-  // If storage fails to mark the page as synced to a peer, the mesh should not
-  // be updated.
-  storage.mark_synced_to_peer_status = storage::Status::IO_ERROR;
-  page_communicator.OnNewRequest(
-      "device2", std::move(new_device_message)
-                     .TakeAndMap<Request>([](const Message* message) {
-                       return static_cast<const Request*>(message->message());
-                     }));
-  bool called;
-  storage::Status status;
-  storage::ChangeSource source;
-  storage::IsObjectSynced is_object_synced;
-  std::unique_ptr<storage::DataSource::DataChunk> data;
-  page_communicator.GetObject(
-      MakeObjectIdentifier("foo"),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &source,
-                        &is_object_synced, &data));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-  EXPECT_THAT(mesh.messages_, IsEmpty());
-}
-
-TEST_F(PageCommunicatorImplTest, ObjectRequest) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  storage.SetPiece(MakeObjectIdentifier("object_digest"), "some data");
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  // Send request to PageCommunicator. We request two objects: |object_digest|
-  // and |object_digest2|. Only |object_digest| will be present in storage.
-  flatbuffers::FlatBufferBuilder request_buffer;
-  BuildObjectRequestBuffer(&request_buffer, "ledger", "page",
-                           {MakeObjectIdentifier("object_digest"),
-                            MakeObjectIdentifier("object_digest2")});
-  MessageHolder<Message> request_message(convert::ToStringView(request_buffer),
-                                         &GetMessage);
-  page_communicator.OnNewRequest(
-      "device2", std::move(request_message)
-                     .TakeAndMap<Request>([](const Message* message) {
-                       return static_cast<const Request*>(message->message());
-                     }));
-
-  RunLoopUntilIdle();
-
-  // Verify the response.
-  ASSERT_EQ(1u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[0].first);
-
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(mesh.messages_[0].second.data()),
-      mesh.messages_[0].second.size());
-  ASSERT_TRUE(VerifyMessageBuffer(verifier));
-
-  const Message* reply_message = GetMessage(mesh.messages_[0].second.data());
-  ASSERT_EQ(MessageUnion_Response, reply_message->message_type());
-  const Response* response =
-      static_cast<const Response*>(reply_message->message());
-  const NamespacePageId* response_namespace_page_id =
-      response->namespace_page();
-  EXPECT_EQ("ledger", convert::ExtendedStringView(
-                          response_namespace_page_id->namespace_id()));
-  EXPECT_EQ("page",
-            convert::ExtendedStringView(response_namespace_page_id->page_id()));
-  EXPECT_EQ(ResponseMessage_ObjectResponse, response->response_type());
-  const ObjectResponse* object_response =
-      static_cast<const ObjectResponse*>(response->response());
-  ASSERT_EQ(2u, object_response->objects()->size());
-  auto it = object_response->objects()->begin();
-  EXPECT_EQ("object_digest", convert::ExtendedStringView(it->id()->digest()));
-  EXPECT_EQ(ObjectStatus_OK, it->status());
-  EXPECT_EQ("some data", convert::ExtendedStringView(it->data()->bytes()));
-  EXPECT_EQ(ObjectSyncStatus_UNSYNCED, it->sync_status());
-  it++;
-  EXPECT_EQ("object_digest2", convert::ExtendedStringView(it->id()->digest()));
-  EXPECT_EQ(ObjectStatus_UNKNOWN_OBJECT, it->status());
-}
-
-TEST_F(PageCommunicatorImplTest, ObjectRequestSynced) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  storage.SetPiece(MakeObjectIdentifier("object_digest"), "some data", true);
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  // Send request to PageCommunicator. We request two objects: |object_digest|
-  // and |object_digest2|. Only |object_digest| will be present in storage.
-  flatbuffers::FlatBufferBuilder request_buffer;
-  BuildObjectRequestBuffer(&request_buffer, "ledger", "page",
-                           {MakeObjectIdentifier("object_digest")});
-  MessageHolder<Message> request_message(convert::ToStringView(request_buffer),
-                                         &GetMessage);
-  page_communicator.OnNewRequest(
-      "device2", std::move(request_message)
-                     .TakeAndMap<Request>([](const Message* message) {
-                       return static_cast<const Request*>(message->message());
-                     }));
-
-  RunLoopUntilIdle();
-
-  // Verify the response.
-  ASSERT_EQ(1u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[0].first);
-
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(mesh.messages_[0].second.data()),
-      mesh.messages_[0].second.size());
-  ASSERT_TRUE(VerifyMessageBuffer(verifier));
-
-  const Message* reply_message = GetMessage(mesh.messages_[0].second.data());
-  ASSERT_EQ(MessageUnion_Response, reply_message->message_type());
-  const Response* response =
-      static_cast<const Response*>(reply_message->message());
-  const NamespacePageId* response_namespace_page_id =
-      response->namespace_page();
-  EXPECT_EQ("ledger", convert::ExtendedStringView(
-                          response_namespace_page_id->namespace_id()));
-  EXPECT_EQ("page",
-            convert::ExtendedStringView(response_namespace_page_id->page_id()));
-  EXPECT_EQ(ResponseMessage_ObjectResponse, response->response_type());
-  const ObjectResponse* object_response =
-      static_cast<const ObjectResponse*>(response->response());
-  ASSERT_EQ(1u, object_response->objects()->size());
-  auto it = object_response->objects()->begin();
-  EXPECT_EQ("object_digest", convert::ExtendedStringView(it->id()->digest()));
-  EXPECT_EQ(ObjectStatus_OK, it->status());
-  EXPECT_EQ("some data", convert::ExtendedStringView(it->data()->bytes()));
-  EXPECT_EQ(ObjectSyncStatus_SYNCED_TO_CLOUD, it->sync_status());
-}
-
-TEST_F(PageCommunicatorImplTest, GetObjectProcessResponseSuccess) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer, "ledger", "page");
-  MessageHolder<Message> new_device_message(convert::ToStringView(buffer),
-                                            &GetMessage);
-  page_communicator.OnNewRequest(
-      "device2", std::move(new_device_message)
-                     .TakeAndMap<Request>([](const Message* message) {
-                       return static_cast<const Request*>(message->message());
-                     }));
-
-  bool called;
-  storage::Status status;
-  storage::ChangeSource source;
-  storage::IsObjectSynced is_object_synced;
-  std::unique_ptr<storage::DataSource::DataChunk> data;
-  page_communicator.GetObject(
-      MakeObjectIdentifier("foo"),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &source,
-                        &is_object_synced, &data));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-
-  ASSERT_EQ(1u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[0].first);
-
-  flatbuffers::FlatBufferBuilder response_buffer;
-  BuildObjectResponseBuffer(
-      &response_buffer, "ledger", "page",
-      {std::make_tuple(MakeObjectIdentifier("foo"), "foo_data", false),
-       std::make_tuple(MakeObjectIdentifier("bar"), "bar_data", false)});
-  MessageHolder<Message> response_message(
-      convert::ToStringView(response_buffer), &GetMessage);
-  page_communicator.OnNewResponse(
-      "device2", std::move(response_message)
-                     .TakeAndMap<Response>([](const Message* message) {
-                       return static_cast<const Response*>(message->message());
-                     }));
-
-  EXPECT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ("foo_data", data->Get());
-  EXPECT_EQ(storage::IsObjectSynced::NO, is_object_synced);
-}
-
-TEST_F(PageCommunicatorImplTest, GetObjectProcessResponseSynced) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer, "ledger", "page");
-  MessageHolder<Message> new_device_message(convert::ToStringView(buffer),
-                                            &GetMessage);
-  page_communicator.OnNewRequest(
-      "device2", std::move(new_device_message)
-                     .TakeAndMap<Request>([](const Message* message) {
-                       return static_cast<const Request*>(message->message());
-                     }));
-
-  bool called;
-  storage::Status status;
-  storage::ChangeSource source;
-  storage::IsObjectSynced is_object_synced;
-  std::unique_ptr<storage::DataSource::DataChunk> data;
-  page_communicator.GetObject(
-      MakeObjectIdentifier("foo"),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &source,
-                        &is_object_synced, &data));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-
-  ASSERT_EQ(1u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[0].first);
-
-  flatbuffers::FlatBufferBuilder response_buffer;
-  BuildObjectResponseBuffer(
-      &response_buffer, "ledger", "page",
-      {std::make_tuple(MakeObjectIdentifier("foo"), "foo_data", true)});
-  MessageHolder<Message> response_message(
-      convert::ToStringView(response_buffer), &GetMessage);
-  page_communicator.OnNewResponse(
-      "device2", std::move(response_message)
-                     .TakeAndMap<Response>([](const Message* message) {
-                       return static_cast<const Response*>(message->message());
-                     }));
-
-  EXPECT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ("foo_data", data->Get());
-  EXPECT_EQ(storage::IsObjectSynced::YES, is_object_synced);
-}
-
-TEST_F(PageCommunicatorImplTest, GetObjectProcessResponseFail) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer, "ledger", "page");
-  MessageHolder<Message> message(convert::ToStringView(buffer), &GetMessage);
-  page_communicator.OnNewRequest(
-      "device2",
-      std::move(message).TakeAndMap<Request>([](const Message* message) {
-        return static_cast<const Request*>(message->message());
-      }));
-
-  bool called;
-  storage::Status status;
-  storage::ChangeSource source;
-  storage::IsObjectSynced is_object_synced;
-  std::unique_ptr<storage::DataSource::DataChunk> data;
-  page_communicator.GetObject(
-      MakeObjectIdentifier("foo"),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &source,
-                        &is_object_synced, &data));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-
-  ASSERT_EQ(1u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[0].first);
-
-  flatbuffers::FlatBufferBuilder response_buffer;
-  BuildObjectResponseBuffer(
-      &response_buffer, "ledger", "page",
-      {std::make_tuple(MakeObjectIdentifier("foo"), "", false)});
-  MessageHolder<Message> response_message(
-      convert::ToStringView(response_buffer), &GetMessage);
-  page_communicator.OnNewResponse(
-      "device2", std::move(response_message)
-                     .TakeAndMap<Response>([](const Message* message) {
-                       return static_cast<const Response*>(message->message());
-                     }));
-
-  EXPECT_TRUE(called);
-  EXPECT_EQ(storage::Status::NOT_FOUND, status);
-  EXPECT_FALSE(data);
-}
-
-TEST_F(PageCommunicatorImplTest, GetObjectProcessResponseMultiDeviceSuccess) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer, "ledger", "page");
-  MessageHolder<Message> message(convert::ToStringView(buffer), &GetMessage);
-  page_communicator.OnNewRequest(
-      "device2",
-      std::move(message).TakeAndMap<Request>([](const Message* message) {
-        return static_cast<const Request*>(message->message());
-      }));
-  message = MessageHolder<Message>(convert::ToStringView(buffer), &GetMessage);
-  page_communicator.OnNewRequest(
-      "device3",
-      std::move(message).TakeAndMap<Request>([](const Message* message) {
-        return static_cast<const Request*>(message->message());
-      }));
-
-  bool called;
-  storage::Status status;
-  storage::ChangeSource source;
-  storage::IsObjectSynced is_object_synced;
-  std::unique_ptr<storage::DataSource::DataChunk> data;
-  page_communicator.GetObject(
-      MakeObjectIdentifier("foo"),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &source,
-                        &is_object_synced, &data));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-  EXPECT_EQ(2u, mesh.messages_.size());
-
-  flatbuffers::FlatBufferBuilder response_buffer_1;
-  BuildObjectResponseBuffer(
-      &response_buffer_1, "ledger", "page",
-      {std::make_tuple(MakeObjectIdentifier("foo"), "", false)});
-  MessageHolder<Message> message_1(convert::ToStringView(response_buffer_1),
-                                   &GetMessage);
-  page_communicator.OnNewResponse(
-      "device2",
-      std::move(message_1).TakeAndMap<Response>([](const Message* message) {
-        return static_cast<const Response*>(message->message());
-      }));
-  EXPECT_FALSE(called);
-
-  flatbuffers::FlatBufferBuilder response_buffer_2;
-  BuildObjectResponseBuffer(
-      &response_buffer_2, "ledger", "page",
-      {std::make_tuple(MakeObjectIdentifier("foo"), "foo_data", false)});
-  MessageHolder<Message> message_2(convert::ToStringView(response_buffer_2),
-                                   &GetMessage);
-  page_communicator.OnNewResponse(
-      "device3",
-      std::move(message_2).TakeAndMap<Response>([](const Message* message) {
-        return static_cast<const Response*>(message->message());
-      }));
-
-  EXPECT_TRUE(called);
-  EXPECT_EQ(storage::Status::OK, status);
-  EXPECT_EQ("foo_data", data->Get());
-  EXPECT_EQ(storage::ChangeSource::P2P, source);
-  EXPECT_EQ(storage::IsObjectSynced::NO, is_object_synced);
-}
-
-TEST_F(PageCommunicatorImplTest, GetObjectProcessResponseMultiDeviceFail) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer, "ledger", "page");
-  MessageHolder<Message> message(convert::ToStringView(buffer), &GetMessage);
-  page_communicator.OnNewRequest(
-      "device2",
-      std::move(message).TakeAndMap<Request>([](const Message* message) {
-        return static_cast<const Request*>(message->message());
-      }));
-  message = MessageHolder<Message>(convert::ToStringView(buffer), &GetMessage);
-  page_communicator.OnNewRequest(
-      "device3",
-      std::move(message).TakeAndMap<Request>([](const Message* message) {
-        return static_cast<const Request*>(message->message());
-      }));
-
-  bool called;
-  storage::Status status;
-  storage::ChangeSource source;
-  storage::IsObjectSynced is_object_synced;
-  std::unique_ptr<storage::DataSource::DataChunk> data;
-  page_communicator.GetObject(
-      MakeObjectIdentifier("foo"),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &source,
-                        &is_object_synced, &data));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-  EXPECT_EQ(2u, mesh.messages_.size());
-
-  flatbuffers::FlatBufferBuilder response_buffer_1;
-  BuildObjectResponseBuffer(
-      &response_buffer_1, "ledger", "page",
-      {std::make_tuple(MakeObjectIdentifier("foo"), "", false)});
-  MessageHolder<Message> message_1(convert::ToStringView(response_buffer_1),
-                                   &GetMessage);
-  page_communicator.OnNewResponse(
-      "device2",
-      std::move(message_1).TakeAndMap<Response>([](const Message* message) {
-        return static_cast<const Response*>(message->message());
-      }));
-  EXPECT_FALSE(called);
-
-  flatbuffers::FlatBufferBuilder response_buffer_2;
-  BuildObjectResponseBuffer(
-      &response_buffer_2, "ledger", "page",
-      {std::make_tuple(MakeObjectIdentifier("foo"), "", false)});
-  MessageHolder<Message> message_2(convert::ToStringView(response_buffer_2),
-                                   &GetMessage);
-  page_communicator.OnNewResponse(
-      "device3",
-      std::move(message_2).TakeAndMap<Response>([](const Message* message) {
-        return static_cast<const Response*>(message->message());
-      }));
-
-  EXPECT_TRUE(called);
-  EXPECT_EQ(storage::Status::NOT_FOUND, status);
-  EXPECT_FALSE(data);
-}
-
-TEST_F(PageCommunicatorImplTest, CommitUpdate) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage_1(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator_1(&coroutine_service_, &storage_1,
-                                           &storage_1, "ledger", "page", &mesh);
-  page_communicator_1.Start();
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer, "ledger", "page");
-  MessageHolder<Message> message(convert::ToStringView(buffer), &GetMessage);
-  page_communicator_1.OnNewRequest(
-      "device2",
-      std::move(message).TakeAndMap<Request>([](const Message* message) {
-        return static_cast<const Request*>(message->message());
-      }));
-  RunLoopUntilIdle();
-
-  FakePageStorage storage_2(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator_2(&coroutine_service_, &storage_2,
-                                           &storage_2, "ledger", "page", &mesh);
-  page_communicator_2.Start();
-
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.emplace_back(std::make_unique<FakeCommit>("id 1", "data 1"));
-  commits.emplace_back(std::make_unique<FakeCommit>("id 2", "data 2"));
-  ASSERT_NE(nullptr, storage_1.watcher_);
-  storage_1.watcher_->OnNewCommits(commits, storage::ChangeSource::CLOUD);
-
-  RunLoopUntilIdle();
-  // No new message is sent on commits from CLOUD.
-  ASSERT_EQ(0u, mesh.messages_.size());
-
-  storage_1.watcher_->OnNewCommits(commits, storage::ChangeSource::P2P);
-
-  RunLoopUntilIdle();
-  // No new message is sent on commits from P2P either.
-  ASSERT_EQ(0u, mesh.messages_.size());
-
-  storage_1.watcher_->OnNewCommits(commits, storage::ChangeSource::LOCAL);
-  RunLoopUntilIdle();
-
-  // Local commit: a message is sent.
-  ASSERT_EQ(1u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[0].first);
-
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(mesh.messages_[0].second.data()),
-      mesh.messages_[0].second.size());
-  ASSERT_TRUE(VerifyMessageBuffer(verifier));
-
-  MessageHolder<Message> reply_message(mesh.messages_[0].second, &GetMessage);
-  ASSERT_EQ(MessageUnion_Response, reply_message->message_type());
-  MessageHolder<Response> response =
-      std::move(reply_message).TakeAndMap<Response>([](const Message* message) {
-        return static_cast<const Response*>(message->message());
-      });
-  const NamespacePageId* response_namespace_page_id =
-      response->namespace_page();
-  EXPECT_EQ("ledger", convert::ExtendedStringView(
-                          response_namespace_page_id->namespace_id()));
-  EXPECT_EQ("page",
-            convert::ExtendedStringView(response_namespace_page_id->page_id()));
-  EXPECT_EQ(ResponseMessage_CommitResponse, response->response_type());
-
-  // Send it to the other side.
-  page_communicator_2.OnNewResponse("device1", std::move(response));
-  RunLoopUntilIdle();
-
-  // The other side's storage has the commit.
-  ASSERT_EQ(1u, storage_2.commits_from_sync_.size());
-  ASSERT_EQ(2u, storage_2.commits_from_sync_[0].first.size());
-  EXPECT_EQ("id 1", storage_2.commits_from_sync_[0].first[0].id);
-  EXPECT_EQ("data 1", storage_2.commits_from_sync_[0].first[0].bytes);
-  EXPECT_EQ("id 2", storage_2.commits_from_sync_[0].first[1].id);
-  EXPECT_EQ("data 2", storage_2.commits_from_sync_[0].first[1].bytes);
-
-  // Verify we don't crash on response from storage
-  storage_2.commits_from_sync_[0].second(storage::Status::OK, {});
-  RunLoopUntilIdle();
-}
-
-TEST_F(PageCommunicatorImplTest, GetObjectDisconnect) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer, "ledger", "page");
-  MessageHolder<Message> message(convert::ToStringView(buffer), &GetMessage);
-  page_communicator.OnNewRequest(
-      "device2",
-      std::move(message).TakeAndMap<Request>([](const Message* message) {
-        return static_cast<const Request*>(message->message());
-      }));
-
-  bool called1, called2, called3, called4;
-  storage::Status status1, status2, status3, status4;
-  storage::ChangeSource source1, source2, source3, source4;
-  storage::IsObjectSynced is_object_synced1, is_object_synced2,
-      is_object_synced3, is_object_synced4;
-  std::unique_ptr<storage::DataSource::DataChunk> data1, data2, data3, data4;
-  page_communicator.GetObject(
-      MakeObjectIdentifier("foo1"),
-      callback::Capture(callback::SetWhenCalled(&called1), &status1, &source1,
-                        &is_object_synced1, &data1));
-  page_communicator.GetObject(
-      MakeObjectIdentifier("foo2"),
-      callback::Capture(callback::SetWhenCalled(&called2), &status2, &source2,
-                        &is_object_synced2, &data2));
-  page_communicator.GetObject(
-      MakeObjectIdentifier("foo3"),
-      callback::Capture(callback::SetWhenCalled(&called3), &status3, &source3,
-                        &is_object_synced3, &data3));
-  page_communicator.GetObject(
-      MakeObjectIdentifier("foo4"),
-      callback::Capture(callback::SetWhenCalled(&called4), &status4, &source4,
-                        &is_object_synced4, &data4));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called1);
-  EXPECT_FALSE(called2);
-  EXPECT_FALSE(called3);
-  EXPECT_FALSE(called4);
-  EXPECT_EQ(4u, mesh.messages_.size());
-
-  flatbuffers::FlatBufferBuilder stop_buffer;
-  BuildWatchStopBuffer(&stop_buffer, "ledger", "page");
-  MessageHolder<Message> watch_stop_message(convert::ToStringView(stop_buffer),
-                                            &GetMessage);
-  page_communicator.OnNewRequest(
-      "device2", std::move(watch_stop_message)
-                     .TakeAndMap<Request>([](const Message* message) {
-                       return static_cast<const Request*>(message->message());
-                     }));
-  RunLoopUntilIdle();
-
-  // All requests are terminated with a not found status.
-  EXPECT_TRUE(called1);
-  EXPECT_EQ(storage::Status::NOT_FOUND, status1);
-  EXPECT_EQ(storage::ChangeSource::P2P, source1);
-  EXPECT_FALSE(data1);
-
-  EXPECT_TRUE(called2);
-  EXPECT_EQ(storage::Status::NOT_FOUND, status2);
-  EXPECT_EQ(storage::ChangeSource::P2P, source2);
-  EXPECT_FALSE(data2);
-
-  EXPECT_TRUE(called3);
-  EXPECT_EQ(storage::Status::NOT_FOUND, status3);
-  EXPECT_EQ(storage::ChangeSource::P2P, source3);
-  EXPECT_FALSE(data3);
-
-  EXPECT_TRUE(called4);
-  EXPECT_EQ(storage::Status::NOT_FOUND, status4);
-  EXPECT_EQ(storage::ChangeSource::P2P, source4);
-  EXPECT_FALSE(data4);
-}
-
-TEST_F(PageCommunicatorImplTest, CommitRequest) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage(dispatcher(), "page");
-  const storage::Commit& commit_1 = storage.AddCommit("commit1", "data1");
-
-  PageCommunicatorImpl page_communicator(&coroutine_service_, &storage,
-                                         &storage, "ledger", "page", &mesh);
-  page_communicator.Start();
-
-  // Send request to PageCommunicator. We request two objects: |object_digest|
-  // and |object_digest2|. Only |object_digest| will be present in storage.
-  flatbuffers::FlatBufferBuilder request_buffer;
-  BuildCommitRequestBuffer(&request_buffer, "ledger", "page",
-                           {storage::CommitId(commit_1.GetId()),
-                            storage::CommitId("missing_commit")});
-  MessageHolder<Message> request_message(convert::ToStringView(request_buffer),
-                                         &GetMessage);
-  page_communicator.OnNewRequest(
-      "device2", std::move(request_message)
-                     .TakeAndMap<Request>([](const Message* message) {
-                       return static_cast<const Request*>(message->message());
-                     }));
-
-  RunLoopUntilIdle();
-
-  // Verify the response.
-  ASSERT_EQ(1u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[0].first);
-
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(mesh.messages_[0].second.data()),
-      mesh.messages_[0].second.size());
-  ASSERT_TRUE(VerifyMessageBuffer(verifier));
-
-  const Message* reply_message = GetMessage(mesh.messages_[0].second.data());
-  ASSERT_EQ(MessageUnion_Response, reply_message->message_type());
-  const Response* response =
-      static_cast<const Response*>(reply_message->message());
-  const NamespacePageId* response_namespace_page_id =
-      response->namespace_page();
-  EXPECT_EQ("ledger", convert::ExtendedStringView(
-                          response_namespace_page_id->namespace_id()));
-  EXPECT_EQ("page",
-            convert::ExtendedStringView(response_namespace_page_id->page_id()));
-  EXPECT_EQ(ResponseMessage_CommitResponse, response->response_type());
-  const CommitResponse* commit_response =
-      static_cast<const CommitResponse*>(response->response());
-  ASSERT_EQ(2u, commit_response->commits()->size());
-  auto it = commit_response->commits()->begin();
-  EXPECT_EQ("commit1", convert::ExtendedStringView(it->id()->id()));
-  EXPECT_EQ(CommitStatus_OK, it->status());
-  EXPECT_EQ("data1", convert::ExtendedStringView(it->commit()->bytes()));
-  it++;
-  EXPECT_EQ("missing_commit", convert::ExtendedStringView(it->id()->id()));
-  EXPECT_EQ(CommitStatus_UNKNOWN_COMMIT, it->status());
-}
-
-// Sends an update for new commits that triggers a backlog sync.
-TEST_F(PageCommunicatorImplTest, CommitBatchUpdate) {
-  FakeDeviceMesh mesh;
-  FakePageStorage storage_1(dispatcher(), "page");
-  storage_1.AddCommit("id 0", "data 0");
-  PageCommunicatorImpl page_communicator_1(&coroutine_service_, &storage_1,
-                                           &storage_1, "ledger", "page", &mesh);
-  page_communicator_1.Start();
-
-  flatbuffers::FlatBufferBuilder buffer;
-  BuildWatchStartBuffer(&buffer, "ledger", "page");
-  MessageHolder<Message> message(convert::ToStringView(buffer), &GetMessage);
-  page_communicator_1.OnNewRequest(
-      "device2",
-      std::move(message).TakeAndMap<Request>([](const Message* message) {
-        return static_cast<const Request*>(message->message());
-      }));
-  RunLoopUntilIdle();
-
-  FakePageStorage storage_2(dispatcher(), "page");
-  PageCommunicatorImpl page_communicator_2(&coroutine_service_, &storage_2,
-                                           &storage_2, "ledger", "page", &mesh);
-  page_communicator_2.Start();
-
-  std::vector<std::unique_ptr<const storage::Commit>> commits;
-  commits.emplace_back(std::make_unique<FakeCommit>(
-      "id 1", "data 1", std::vector<storage::CommitId>({"id 0"})));
-  commits.emplace_back(std::make_unique<FakeCommit>(
-      "id 2", "data 2", std::vector<storage::CommitId>({"id 1"})));
-
-  storage_1.watcher_->OnNewCommits(commits, storage::ChangeSource::LOCAL);
-  RunLoopUntilIdle();
-
-  // Local commit: a message is sent.
-  ASSERT_EQ(1u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[0].first);
-
-  {
-    flatbuffers::Verifier verifier(
-        reinterpret_cast<const unsigned char*>(mesh.messages_[0].second.data()),
-        mesh.messages_[0].second.size());
-    ASSERT_TRUE(VerifyMessageBuffer(verifier));
-
-    MessageHolder<Message> reply_message(mesh.messages_[0].second, &GetMessage);
-    ASSERT_EQ(MessageUnion_Response, reply_message->message_type());
-    MessageHolder<Response> response =
-        std::move(reply_message)
-            .TakeAndMap<Response>([](const Message* message) {
-              return static_cast<const Response*>(message->message());
-            });
-    const NamespacePageId* response_namespace_page_id =
-        response->namespace_page();
-    EXPECT_EQ("ledger", convert::ExtendedStringView(
-                            response_namespace_page_id->namespace_id()));
-    EXPECT_EQ("page", convert::ExtendedStringView(
-                          response_namespace_page_id->page_id()));
-    EXPECT_EQ(ResponseMessage_CommitResponse, response->response_type());
-
-    // Send it to the other side.
-    page_communicator_2.OnNewResponse("device1", std::move(response));
-  }
-  RunLoopUntilIdle();
-
-  // PageCommunicator should have tried to add the commit.
-  ASSERT_EQ(1u, storage_2.commits_from_sync_.size());
-  EXPECT_EQ(2u, storage_2.commits_from_sync_[0].first.size());
-  // Return that we miss one commit
-  storage_2.commits_from_sync_[0].second(storage::Status::NOT_FOUND, {"id 0"});
-
-  // |page_communicator_2| should ask for the base, "id 0" commit.
-  ASSERT_EQ(2u, mesh.messages_.size());
-  EXPECT_EQ("device1", mesh.messages_[1].first);
-
-  {
-    flatbuffers::Verifier verifier(
-        reinterpret_cast<const unsigned char*>(mesh.messages_[1].second.data()),
-        mesh.messages_[0].second.size());
-    ASSERT_TRUE(VerifyMessageBuffer(verifier));
-
-    MessageHolder<Message> request_message(mesh.messages_[1].second,
-                                           &GetMessage);
-    ASSERT_EQ(MessageUnion_Request, request_message->message_type());
-    MessageHolder<Request> request =
-        std::move(request_message)
-            .TakeAndMap<Request>([](const Message* message) {
-              return static_cast<const Request*>(message->message());
-            });
-    const NamespacePageId* request_namespace_page_id =
-        request->namespace_page();
-    EXPECT_EQ("ledger", convert::ExtendedStringView(
-                            request_namespace_page_id->namespace_id()));
-    EXPECT_EQ("page", convert::ExtendedStringView(
-                          request_namespace_page_id->page_id()));
-    EXPECT_EQ(RequestMessage_CommitRequest, request->request_type());
-
-    // Send it to the other side.
-    page_communicator_1.OnNewRequest("device2", std::move(request));
-  }
-  RunLoopUntilIdle();
-
-  // |page_communicator_1| sends commit "id 0" to device 2.
-  ASSERT_EQ(3u, mesh.messages_.size());
-  EXPECT_EQ("device2", mesh.messages_[2].first);
-
-  {
-    flatbuffers::Verifier verifier(
-        reinterpret_cast<const unsigned char*>(mesh.messages_[2].second.data()),
-        mesh.messages_[0].second.size());
-    ASSERT_TRUE(VerifyMessageBuffer(verifier));
-
-    MessageHolder<Message> reply_message(mesh.messages_[2].second, &GetMessage);
-    ASSERT_EQ(MessageUnion_Response, reply_message->message_type());
-    MessageHolder<Response> response =
-        std::move(reply_message)
-            .TakeAndMap<Response>([](const Message* message) {
-              return static_cast<const Response*>(message->message());
-            });
-    const NamespacePageId* response_namespace_page_id =
-        response->namespace_page();
-    EXPECT_EQ("ledger", convert::ExtendedStringView(
-                            response_namespace_page_id->namespace_id()));
-    EXPECT_EQ("page", convert::ExtendedStringView(
-                          response_namespace_page_id->page_id()));
-    EXPECT_EQ(ResponseMessage_CommitResponse, response->response_type());
-
-    // Send it to the other side.
-    page_communicator_2.OnNewResponse("device1", std::move(response));
-  }
-  RunLoopUntilIdle();
-
-  // Verify that we are truely adding the whole commit batch.
-  ASSERT_EQ(2u, storage_2.commits_from_sync_.size());
-  EXPECT_EQ(3u, storage_2.commits_from_sync_[1].first.size());
-  EXPECT_EQ("id 0", storage_2.commits_from_sync_[1].first[0].id);
-  EXPECT_EQ("data 0", storage_2.commits_from_sync_[1].first[0].bytes);
-  EXPECT_EQ("id 1", storage_2.commits_from_sync_[1].first[1].id);
-  EXPECT_EQ("data 1", storage_2.commits_from_sync_[1].first[1].bytes);
-  EXPECT_EQ("id 2", storage_2.commits_from_sync_[1].first[2].id);
-  EXPECT_EQ("data 2", storage_2.commits_from_sync_[1].first[2].bytes);
-
-  // Verify we don't crash on response from storage
-  storage_2.commits_from_sync_[1].second(storage::Status::OK, {});
-}
-}  // namespace
-}  // namespace p2p_sync
diff --git a/bin/ledger/p2p_sync/impl/user_communicator_factory_impl.cc b/bin/ledger/p2p_sync/impl/user_communicator_factory_impl.cc
deleted file mode 100644
index e84c1c9..0000000
--- a/bin/ledger/p2p_sync/impl/user_communicator_factory_impl.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_sync/impl/user_communicator_factory_impl.h"
-
-#include <fuchsia/modular/auth/cpp/fidl.h>
-#include <fuchsia/netconnector/cpp/fidl.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/ledger/p2p_provider/impl/p2p_provider_impl.h"
-#include "peridot/bin/ledger/p2p_sync/impl/user_communicator_impl.h"
-
-namespace p2p_sync {
-UserCommunicatorFactoryImpl::UserCommunicatorFactoryImpl(
-    ledger::Environment* environment)
-    : environment_(environment) {}
-
-UserCommunicatorFactoryImpl::~UserCommunicatorFactoryImpl() {}
-
-std::unique_ptr<UserCommunicator>
-UserCommunicatorFactoryImpl::GetUserCommunicator(
-    std::unique_ptr<p2p_provider::UserIdProvider> user_id_provider) {
-  char host_name_buffer[HOST_NAME_MAX + 1];
-  int result = gethostname(host_name_buffer, sizeof(host_name_buffer));
-  if (result < 0) {
-    FXL_LOG(ERROR) << "unable to get hostname. errno " << errno;
-    return nullptr;
-  }
-
-  fuchsia::netconnector::NetConnectorPtr net_connector =
-      environment_->startup_context()
-          ->ConnectToEnvironmentService<fuchsia::netconnector::NetConnector>();
-
-  return std::make_unique<p2p_sync::UserCommunicatorImpl>(
-      std::make_unique<p2p_provider::P2PProviderImpl>(
-          host_name_buffer, std::move(net_connector),
-          std::move(user_id_provider)),
-      environment_->coroutine_service());
-}
-
-}  // namespace p2p_sync
diff --git a/bin/ledger/p2p_sync/impl/user_communicator_factory_impl.h b/bin/ledger/p2p_sync/impl/user_communicator_factory_impl.h
deleted file mode 100644
index 852d54f..0000000
--- a/bin/ledger/p2p_sync/impl/user_communicator_factory_impl.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_USER_COMMUNICATOR_FACTORY_IMPL_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_USER_COMMUNICATOR_FACTORY_IMPL_H_
-
-#include <memory>
-#include <string>
-
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/p2p_provider/public/user_id_provider.h"
-#include "peridot/bin/ledger/p2p_sync/public/user_communicator.h"
-#include "peridot/bin/ledger/p2p_sync/public/user_communicator_factory.h"
-
-namespace p2p_sync {
-// Factory for creating UserCommunicators with default configuration.
-class UserCommunicatorFactoryImpl : public UserCommunicatorFactory {
- public:
-  UserCommunicatorFactoryImpl(ledger::Environment* environment);
-  ~UserCommunicatorFactoryImpl() override;
-
-  std::unique_ptr<UserCommunicator> GetUserCommunicator(
-      std::unique_ptr<p2p_provider::UserIdProvider> user_id_provider) override;
-
- private:
-  ledger::Environment* const environment_;
-};
-
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_USER_COMMUNICATOR_FACTORY_IMPL_H_
diff --git a/bin/ledger/p2p_sync/impl/user_communicator_impl.cc b/bin/ledger/p2p_sync/impl/user_communicator_impl.cc
deleted file mode 100644
index e16a5c5..0000000
--- a/bin/ledger/p2p_sync/impl/user_communicator_impl.cc
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_sync/impl/user_communicator_impl.h"
-
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/ledger/p2p_sync/impl/flatbuffer_message_factory.h"
-#include "peridot/bin/ledger/p2p_sync/impl/ledger_communicator_impl.h"
-#include "peridot/bin/ledger/p2p_sync/impl/message_generated.h"
-#include "peridot/bin/ledger/p2p_sync/impl/message_holder.h"
-#include "peridot/lib/ledger_client/constants.h"
-
-namespace p2p_sync {
-
-UserCommunicatorImpl::UserCommunicatorImpl(
-    std::unique_ptr<p2p_provider::P2PProvider> provider,
-    coroutine::CoroutineService* coroutine_service)
-    : p2p_provider_(std::move(provider)),
-      coroutine_service_(coroutine_service) {}
-
-UserCommunicatorImpl::~UserCommunicatorImpl() { FXL_DCHECK(ledgers_.empty()); }
-
-void UserCommunicatorImpl::Start() {
-  FXL_DCHECK(!started_);
-  started_ = true;
-  p2p_provider_->Start(this);
-}
-
-std::unique_ptr<LedgerCommunicator> UserCommunicatorImpl::GetLedgerCommunicator(
-    std::string namespace_id) {
-  FXL_DCHECK(started_);
-  FXL_DCHECK(ledgers_.find(namespace_id) == ledgers_.end())
-      << "UserCommunicatorImpl::GetLedgerCommunicator should be called once "
-         "per active namespace: "
-      << namespace_id;
-
-  std::unique_ptr<LedgerCommunicatorImpl> ledger =
-      std::make_unique<LedgerCommunicatorImpl>(coroutine_service_, namespace_id,
-                                               this);
-  LedgerCommunicatorImpl* ledger_ptr = ledger.get();
-  ledger->set_on_delete(
-      [this, namespace_id]() mutable { ledgers_.erase(namespace_id); });
-  ledgers_[std::move(namespace_id)] = ledger_ptr;
-  return ledger;
-}
-
-void UserCommunicatorImpl::OnNewMessage(fxl::StringView source,
-                                        fxl::StringView data) {
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(data.data()), data.size());
-  if (!VerifyMessageBuffer(verifier)) {
-    // Wrong serialization, abort.
-    FXL_LOG(ERROR) << "The message received is malformed.";
-    return;
-  };
-  MessageHolder<Message> message(data, &GetMessage);
-  const NamespacePageId* namespace_page_id;
-  switch (message->message_type()) {
-    case MessageUnion_NONE:
-      FXL_LOG(ERROR) << "The message received is unexpected at this point.";
-      return;
-      break;
-
-    case MessageUnion_Request: {
-      MessageHolder<Request> request =
-          std::move(message).TakeAndMap<Request>([](const Message* message) {
-            return static_cast<const Request*>(message->message());
-          });
-      namespace_page_id = request->namespace_page();
-
-      std::string namespace_id(namespace_page_id->namespace_id()->begin(),
-                               namespace_page_id->namespace_id()->end());
-      std::string page_id(namespace_page_id->page_id()->begin(),
-                          namespace_page_id->page_id()->end());
-
-      const auto& it = ledgers_.find(namespace_id);
-      if (it == ledgers_.end()) {
-        flatbuffers::FlatBufferBuilder buffer;
-        CreateUnknownResponseMessage(&buffer, namespace_id, page_id,
-                                     ResponseStatus_UNKNOWN_NAMESPACE);
-        p2p_provider_->SendMessage(source, convert::ExtendedStringView(buffer));
-        return;
-      }
-      it->second->OnNewRequest(source, page_id, std::move(request));
-      break;
-    }
-
-    case MessageUnion_Response: {
-      MessageHolder<Response> response =
-          std::move(message).TakeAndMap<Response>([](const Message* message) {
-            return static_cast<const Response*>(message->message());
-          });
-      namespace_page_id = response->namespace_page();
-      std::string namespace_id(namespace_page_id->namespace_id()->begin(),
-                               namespace_page_id->namespace_id()->end());
-      std::string page_id(namespace_page_id->page_id()->begin(),
-                          namespace_page_id->page_id()->end());
-
-      const auto& it = ledgers_.find(namespace_id);
-      if (it == ledgers_.end()) {
-        // We are receiving a response for a ledger that no longer exists. This
-        // can happen in normal operation, and we cannot do anything with this
-        // message: we can't send it to a ledger, and we don't send responses to
-        // responses. So we just drop it here.
-        return;
-      }
-      it->second->OnNewResponse(source, page_id, std::move(response));
-      break;
-    }
-  }
-}
-
-void UserCommunicatorImpl::OnDeviceChange(
-    fxl::StringView remote_device, p2p_provider::DeviceChangeType change_type) {
-  switch (change_type) {
-    case p2p_provider::DeviceChangeType::NEW:
-      devices_.insert(remote_device.ToString());
-      break;
-    case p2p_provider::DeviceChangeType::DELETED:
-      devices_.erase(devices_.find(remote_device));
-      break;
-  }
-  for (const auto& it : ledgers_) {
-    it.second->OnDeviceChange(remote_device, change_type);
-  }
-}
-
-DeviceMesh::DeviceSet UserCommunicatorImpl::GetDeviceList() { return devices_; }
-
-void UserCommunicatorImpl::Send(fxl::StringView device_name,
-                                convert::ExtendedStringView data) {
-  p2p_provider_->SendMessage(device_name, data);
-}
-
-}  // namespace p2p_sync
diff --git a/bin/ledger/p2p_sync/impl/user_communicator_impl.h b/bin/ledger/p2p_sync/impl/user_communicator_impl.h
deleted file mode 100644
index 4fd30f4..0000000
--- a/bin/ledger/p2p_sync/impl/user_communicator_impl.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_USER_COMMUNICATOR_IMPL_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_USER_COMMUNICATOR_IMPL_H_
-
-#include <memory>
-#include <set>
-#include <string>
-
-#include <fuchsia/netconnector/cpp/fidl.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/component/cpp/service_provider_impl.h>
-#include <lib/netconnector/cpp/message_relay.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/p2p_provider/public/p2p_provider.h"
-#include "peridot/bin/ledger/p2p_provider/public/types.h"
-#include "peridot/bin/ledger/p2p_provider/public/user_id_provider.h"
-#include "peridot/bin/ledger/p2p_sync/impl/device_mesh.h"
-#include "peridot/bin/ledger/p2p_sync/public/user_communicator.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace p2p_sync {
-class LedgerCommunicatorImpl;
-
-class UserCommunicatorImpl : public UserCommunicator,
-                             public DeviceMesh,
-                             public p2p_provider::P2PProvider::Client {
- public:
-  explicit UserCommunicatorImpl(
-      std::unique_ptr<p2p_provider::P2PProvider> provider,
-      coroutine::CoroutineService* coroutine_service);
-  ~UserCommunicatorImpl() override;
-
-  // UserCommunicator:
-  void Start() override;
-  std::unique_ptr<LedgerCommunicator> GetLedgerCommunicator(
-      std::string namespace_id) override;
-
-  // DeviceMesh:
-  DeviceSet GetDeviceList() override;
-  void Send(fxl::StringView device_name,
-            convert::ExtendedStringView data) override;
-
- private:
-  // P2PProvider::Client
-  void OnDeviceChange(fxl::StringView remote_device,
-                      p2p_provider::DeviceChangeType change_type) override;
-  void OnNewMessage(fxl::StringView source, fxl::StringView data) override;
-
-  // Set of active ledgers.
-  std::map<std::string, LedgerCommunicatorImpl*, convert::StringViewComparator>
-      ledgers_;
-  std::set<std::string, convert::StringViewComparator> devices_;
-
-  bool started_ = false;
-  std::string user_token_;
-  std::unique_ptr<component::ServiceProviderImpl> network_service_provider_;
-
-  std::unique_ptr<p2p_provider::P2PProvider> p2p_provider_;
-  coroutine::CoroutineService* const coroutine_service_;
-};
-
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_IMPL_USER_COMMUNICATOR_IMPL_H_
diff --git a/bin/ledger/p2p_sync/impl/user_communicator_impl_unittest.cc b/bin/ledger/p2p_sync/impl/user_communicator_impl_unittest.cc
deleted file mode 100644
index 3815b83..0000000
--- a/bin/ledger/p2p_sync/impl/user_communicator_impl_unittest.cc
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/p2p_sync/impl/user_communicator_impl.h"
-
-#include <algorithm>
-#include <string>
-
-#include <lib/fit/function.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-// gtest matchers are in gmock and we cannot include the specific header file
-// directly as it is private to the library.
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/p2p_provider/impl/p2p_provider_impl.h"
-#include "peridot/bin/ledger/p2p_provider/public/user_id_provider.h"
-#include "peridot/bin/ledger/p2p_sync/impl/page_communicator_impl.h"
-#include "peridot/bin/ledger/storage/testing/page_storage_empty_impl.h"
-#include "peridot/bin/ledger/testing/netconnector/netconnector_factory.h"
-
-namespace p2p_sync {
-class PageCommunicatorImplInspectorForTest {
- public:
-  static const std::set<std::string, convert::StringViewComparator>&
-  GetInterestedDevices(const std::unique_ptr<PageCommunicator>& page) {
-    return reinterpret_cast<PageCommunicatorImpl*>(page.get())
-        ->interested_devices_;
-  }
-};
-
-namespace {
-
-class FakePageStorage : public storage::PageStorageEmptyImpl {
- public:
-  explicit FakePageStorage(std::string page_id)
-      : page_id_(std::move(page_id)) {}
-  ~FakePageStorage() override {}
-
-  storage::PageId GetId() override { return page_id_; }
-
-  void MarkSyncedToPeer(
-      fit::function<void(storage::Status)> callback) override {
-    callback(storage::Status::OK);
-  }
-
- private:
-  const std::string page_id_;
-};
-
-class FakeUserIdProvider : public p2p_provider::UserIdProvider {
- public:
-  explicit FakeUserIdProvider(std::string user_id)
-      : user_id_(std::move(user_id)) {}
-
-  void GetUserId(fit::function<void(Status, std::string)> callback) override {
-    callback(Status::OK, user_id_);
-  };
-
- private:
-  std::string user_id_;
-};
-
-class UserCommunicatorImplTest : public gtest::TestLoopFixture {
- public:
-  UserCommunicatorImplTest() {}
-  ~UserCommunicatorImplTest() override {}
-
-  std::unique_ptr<UserCommunicator> GetUserCommunicator(
-      std::string host_name, std::string user_name = "user") {
-    fuchsia::netconnector::NetConnectorPtr netconnector;
-    net_connector_factory_.AddBinding(host_name, netconnector.NewRequest());
-    std::unique_ptr<p2p_provider::P2PProvider> provider =
-        std::make_unique<p2p_provider::P2PProviderImpl>(
-            std::move(host_name), std::move(netconnector),
-            std::make_unique<FakeUserIdProvider>(std::move(user_name)));
-    return std::make_unique<UserCommunicatorImpl>(std::move(provider),
-                                                  &coroutine_service_);
-  }
-
- protected:
-  void SetUp() override { ::testing::Test::SetUp(); }
-
-  ledger::NetConnectorFactory net_connector_factory_;
-
- private:
-  coroutine::CoroutineServiceImpl coroutine_service_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(UserCommunicatorImplTest);
-};
-
-TEST_F(UserCommunicatorImplTest, OneHost_NoCrash) {
-  std::unique_ptr<UserCommunicator> user_communicator =
-      GetUserCommunicator("host1");
-  user_communicator->Start();
-  std::unique_ptr<LedgerCommunicator> ledger =
-      user_communicator->GetLedgerCommunicator("ledger1");
-  FakePageStorage storage("page1");
-  std::unique_ptr<PageCommunicator> page =
-      ledger->GetPageCommunicator(&storage, &storage);
-  page->Start();
-  RunLoopUntilIdle();
-}
-
-TEST_F(UserCommunicatorImplTest, ThreeHosts_SamePage) {
-  std::unique_ptr<UserCommunicator> user_communicator1 =
-      GetUserCommunicator("host1");
-  user_communicator1->Start();
-  std::unique_ptr<LedgerCommunicator> ledger1 =
-      user_communicator1->GetLedgerCommunicator("app");
-  FakePageStorage storage1("page");
-  std::unique_ptr<PageCommunicator> page1 =
-      ledger1->GetPageCommunicator(&storage1, &storage1);
-  page1->Start();
-  RunLoopUntilIdle();
-
-  std::unique_ptr<UserCommunicator> user_communicator2 =
-      GetUserCommunicator("host2");
-  user_communicator2->Start();
-  std::unique_ptr<LedgerCommunicator> ledger2 =
-      user_communicator2->GetLedgerCommunicator("app");
-  FakePageStorage storage2("page");
-  std::unique_ptr<PageCommunicator> page2 =
-      ledger2->GetPageCommunicator(&storage2, &storage2);
-  page2->Start();
-  RunLoopUntilIdle();
-
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page1),
-              testing::UnorderedElementsAre("host2"));
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page2),
-              testing::UnorderedElementsAre("host1"));
-
-  std::unique_ptr<UserCommunicator> user_communicator3 =
-      GetUserCommunicator("host3");
-  user_communicator3->Start();
-  std::unique_ptr<LedgerCommunicator> ledger3 =
-      user_communicator3->GetLedgerCommunicator("app");
-  FakePageStorage storage3("page");
-  std::unique_ptr<PageCommunicator> page3 =
-      ledger3->GetPageCommunicator(&storage3, &storage3);
-  page3->Start();
-  RunLoopUntilIdle();
-
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page1),
-              testing::UnorderedElementsAre("host2", "host3"));
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page2),
-              testing::UnorderedElementsAre("host1", "host3"));
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page3),
-              testing::UnorderedElementsAre("host1", "host2"));
-
-  page2.reset();
-  RunLoopUntilIdle();
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page1),
-              testing::UnorderedElementsAre("host3"));
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page3),
-              testing::UnorderedElementsAre("host1"));
-}
-
-TEST_F(UserCommunicatorImplTest, ThreeHosts_TwoPages) {
-  std::unique_ptr<UserCommunicator> user_communicator1 =
-      GetUserCommunicator("host1");
-  user_communicator1->Start();
-  std::unique_ptr<LedgerCommunicator> ledger1 =
-      user_communicator1->GetLedgerCommunicator("app");
-  FakePageStorage storage1_1("page1");
-  std::unique_ptr<PageCommunicator> page1_1 =
-      ledger1->GetPageCommunicator(&storage1_1, &storage1_1);
-  page1_1->Start();
-  FakePageStorage storage1_2("page2");
-  std::unique_ptr<PageCommunicator> page1_2 =
-      ledger1->GetPageCommunicator(&storage1_2, &storage1_2);
-  page1_2->Start();
-  RunLoopUntilIdle();
-
-  std::unique_ptr<UserCommunicator> user_communicator2 =
-      GetUserCommunicator("host2");
-  user_communicator2->Start();
-  std::unique_ptr<LedgerCommunicator> ledger2 =
-      user_communicator2->GetLedgerCommunicator("app");
-  FakePageStorage storage2_1("page1");
-  std::unique_ptr<PageCommunicator> page2_1 =
-      ledger2->GetPageCommunicator(&storage2_1, &storage2_1);
-  page2_1->Start();
-  RunLoopUntilIdle();
-
-  std::unique_ptr<UserCommunicator> user_communicator3 =
-      GetUserCommunicator("host3");
-  user_communicator3->Start();
-  std::unique_ptr<LedgerCommunicator> ledger3 =
-      user_communicator3->GetLedgerCommunicator("app");
-  FakePageStorage storage3_2("page2");
-  std::unique_ptr<PageCommunicator> page3_2 =
-      ledger3->GetPageCommunicator(&storage3_2, &storage3_2);
-  page3_2->Start();
-  RunLoopUntilIdle();
-
-  EXPECT_THAT(
-      PageCommunicatorImplInspectorForTest::GetInterestedDevices(page1_1),
-      testing::UnorderedElementsAre("host2"));
-  EXPECT_THAT(
-      PageCommunicatorImplInspectorForTest::GetInterestedDevices(page1_2),
-      testing::UnorderedElementsAre("host3"));
-  EXPECT_THAT(
-      PageCommunicatorImplInspectorForTest::GetInterestedDevices(page2_1),
-      testing::UnorderedElementsAre("host1"));
-  EXPECT_THAT(
-      PageCommunicatorImplInspectorForTest::GetInterestedDevices(page3_2),
-      testing::UnorderedElementsAre("host1"));
-}
-
-// This test adds some delay (ie. runs the loop until idle) between the time a
-// device becomes visible and the time the page we are interested in becomes
-// active. This ensure we correctly connect pages that become active after the
-// device is connected.
-TEST_F(UserCommunicatorImplTest, ThreeHosts_WaitBeforePageIsActive) {
-  std::unique_ptr<UserCommunicator> user_communicator1 =
-      GetUserCommunicator("host1");
-  user_communicator1->Start();
-  RunLoopUntilIdle();
-  std::unique_ptr<LedgerCommunicator> ledger1 =
-      user_communicator1->GetLedgerCommunicator("app");
-  FakePageStorage storage1("page");
-  std::unique_ptr<PageCommunicator> page1 =
-      ledger1->GetPageCommunicator(&storage1, &storage1);
-  page1->Start();
-  RunLoopUntilIdle();
-
-  std::unique_ptr<UserCommunicator> user_communicator2 =
-      GetUserCommunicator("host2");
-  user_communicator2->Start();
-  RunLoopUntilIdle();
-  std::unique_ptr<LedgerCommunicator> ledger2 =
-      user_communicator2->GetLedgerCommunicator("app");
-  FakePageStorage storage2("page");
-  std::unique_ptr<PageCommunicator> page2 =
-      ledger2->GetPageCommunicator(&storage2, &storage2);
-  page2->Start();
-  RunLoopUntilIdle();
-
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page1),
-              testing::UnorderedElementsAre("host2"));
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page2),
-              testing::UnorderedElementsAre("host1"));
-
-  std::unique_ptr<UserCommunicator> user_communicator3 =
-      GetUserCommunicator("host3");
-  user_communicator3->Start();
-  RunLoopUntilIdle();
-  std::unique_ptr<LedgerCommunicator> ledger3 =
-      user_communicator3->GetLedgerCommunicator("app");
-  FakePageStorage storage3("page");
-  std::unique_ptr<PageCommunicator> page3 =
-      ledger3->GetPageCommunicator(&storage3, &storage3);
-  page3->Start();
-  RunLoopUntilIdle();
-
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page1),
-              testing::UnorderedElementsAre("host2", "host3"));
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page2),
-              testing::UnorderedElementsAre("host1", "host3"));
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page3),
-              testing::UnorderedElementsAre("host1", "host2"));
-
-  page2.reset();
-  RunLoopUntilIdle();
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page1),
-              testing::UnorderedElementsAre("host3"));
-  EXPECT_THAT(PageCommunicatorImplInspectorForTest::GetInterestedDevices(page3),
-              testing::UnorderedElementsAre("host1"));
-}
-
-}  // namespace
-}  // namespace p2p_sync
diff --git a/bin/ledger/p2p_sync/public/BUILD.gn b/bin/ledger/p2p_sync/public/BUILD.gn
deleted file mode 100644
index 0a718ee..0000000
--- a/bin/ledger/p2p_sync/public/BUILD.gn
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/flatbuffers/flatbuffer.gni")
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("public") {
-  sources = [
-    "ledger_communicator.h",
-    "page_communicator.h",
-    "user_communicator.h",
-    "user_communicator_factory.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/p2p_provider/public",
-    "//peridot/bin/ledger/storage/public",
-  ]
-
-  deps = []
-}
diff --git a/bin/ledger/p2p_sync/public/README.md b/bin/ledger/p2p_sync/public/README.md
deleted file mode 100644
index edf01ed..0000000
--- a/bin/ledger/p2p_sync/public/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Peer-to-peer communication
-
-The Ledger supports peer-to-peer synchronization between devices able to communicate directly.
-
-# Protocol
-The protocol used for P2P communication is based on message passing. Messages
-are defined in //peridot/bin/ledger/p2p_sync/impl/message.fbs. This is not an
-RPC-like system : most messages do not expect any response, and the protocol
-should be resilient to devices not answering.
diff --git a/bin/ledger/p2p_sync/public/ledger_communicator.h b/bin/ledger/p2p_sync/public/ledger_communicator.h
deleted file mode 100644
index 4e170c5..0000000
--- a/bin/ledger/p2p_sync/public/ledger_communicator.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_LEDGER_COMMUNICATOR_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_LEDGER_COMMUNICATOR_H_
-
-#include <memory>
-
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/p2p_sync/public/page_communicator.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace p2p_sync {
-// LedgerCommunicator handles ledger-level data transfer between peers.
-class LedgerCommunicator {
- public:
-  LedgerCommunicator() {}
-  virtual ~LedgerCommunicator() {}
-
-  // Returns a page-specific communicator.
-  // All |PageCommunicator| objects obtained through this method must be
-  // destroyed before |LedgerCommunicator|.
-  virtual std::unique_ptr<PageCommunicator> GetPageCommunicator(
-      storage::PageStorage* storage, storage::PageSyncClient* sync_client) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerCommunicator);
-};
-
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_LEDGER_COMMUNICATOR_H_
diff --git a/bin/ledger/p2p_sync/public/page_communicator.h b/bin/ledger/p2p_sync/public/page_communicator.h
deleted file mode 100644
index bde323d..0000000
--- a/bin/ledger/p2p_sync/public/page_communicator.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_PAGE_COMMUNICATOR_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_PAGE_COMMUNICATOR_H_
-
-#include "peridot/bin/ledger/p2p_sync/public/page_communicator.h"
-
-#include <memory>
-
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-namespace p2p_sync {
-// PageCommunicator handles page-level data transfer between peers.
-class PageCommunicator {
- public:
-  PageCommunicator() {}
-  virtual ~PageCommunicator() {}
-
-  // Start should be called at most once. It signals that this page is active on
-  // this device.
-  virtual void Start() = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageCommunicator);
-};
-
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_PAGE_COMMUNICATOR_H_
diff --git a/bin/ledger/p2p_sync/public/user_communicator.h b/bin/ledger/p2p_sync/public/user_communicator.h
deleted file mode 100644
index 725d4f5..0000000
--- a/bin/ledger/p2p_sync/public/user_communicator.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_USER_COMMUNICATOR_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_USER_COMMUNICATOR_H_
-
-#include <memory>
-
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/p2p_sync/public/ledger_communicator.h"
-
-namespace p2p_sync {
-// UserCommunicator is the user-level object handling peer-to-peer connections
-// with the mesh of devices of a user.
-class UserCommunicator {
- public:
-  UserCommunicator() {}
-  virtual ~UserCommunicator() {}
-
-  // Connects this device to its device mesh. To be called exactly once before
-  // any other method.
-  virtual void Start() = 0;
-  // Returns a ledger-specific communicator.
-  // All |LedgerCommunicator| objects obtained through this method must be
-  // destroyed before |UserCommunicator|.
-  virtual std::unique_ptr<LedgerCommunicator> GetLedgerCommunicator(
-      std::string repository_id) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(UserCommunicator);
-};
-
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_USER_COMMUNICATOR_H_
diff --git a/bin/ledger/p2p_sync/public/user_communicator_factory.h b/bin/ledger/p2p_sync/public/user_communicator_factory.h
deleted file mode 100644
index 5293202..0000000
--- a/bin/ledger/p2p_sync/public/user_communicator_factory.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_USER_COMMUNICATOR_FACTORY_H_
-#define PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_USER_COMMUNICATOR_FACTORY_H_
-
-#include <memory>
-
-#include "peridot/bin/ledger/p2p_provider/public/user_id_provider.h"
-#include "peridot/bin/ledger/p2p_sync/public/user_communicator.h"
-
-namespace p2p_sync {
-// Factory for creating UserCommunicators with default configuration.
-class UserCommunicatorFactory {
- public:
-  UserCommunicatorFactory() {}
-  virtual ~UserCommunicatorFactory() {}
-
-  virtual std::unique_ptr<UserCommunicator> GetUserCommunicator(
-      std::unique_ptr<p2p_provider::UserIdProvider> user_id_provider) = 0;
-};
-
-}  // namespace p2p_sync
-
-#endif  // PERIDOT_BIN_LEDGER_P2P_SYNC_PUBLIC_USER_COMMUNICATOR_FACTORY_H_
diff --git a/bin/ledger/storage/BUILD.gn b/bin/ledger/storage/BUILD.gn
deleted file mode 100644
index 69cb0ea..0000000
--- a/bin/ledger/storage/BUILD.gn
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("storage") {
-  deps = [
-    "//peridot/bin/ledger/storage/impl",
-    "//peridot/bin/ledger/storage/public",
-  ]
-}
diff --git a/bin/ledger/storage/fake/BUILD.gn b/bin/ledger/storage/fake/BUILD.gn
deleted file mode 100644
index d9c7d82..0000000
--- a/bin/ledger/storage/fake/BUILD.gn
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("fake") {
-  testonly = true
-
-  deps = [
-    ":lib",
-  ]
-}
-
-source_set("lib") {
-  testonly = true
-
-  sources = [
-    "fake_commit.cc",
-    "fake_commit.h",
-    "fake_db.cc",
-    "fake_db.h",
-    "fake_db_factory.cc",
-    "fake_db_factory.h",
-    "fake_journal.cc",
-    "fake_journal.h",
-    "fake_journal_delegate.cc",
-    "fake_journal_delegate.h",
-    "fake_object.cc",
-    "fake_object.h",
-    "fake_page_storage.cc",
-    "fake_page_storage.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/environment",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/bin/ledger/storage/testing",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//peridot/bin/ledger/encryption/fake",
-    "//peridot/bin/ledger/encryption/primitives",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/storage/fake/fake_commit.cc b/bin/ledger/storage/fake/fake_commit.cc
deleted file mode 100644
index 26b2c1c..0000000
--- a/bin/ledger/storage/fake/fake_commit.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/fake/fake_commit.h"
-
-#include <memory>
-#include <string>
-
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/storage/fake/fake_journal_delegate.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-#include "peridot/bin/ledger/storage/public/iterator.h"
-
-namespace storage {
-namespace fake {
-
-FakeCommit::FakeCommit(FakeJournalDelegate* journal) : journal_(journal) {}
-FakeCommit::~FakeCommit() {}
-
-std::unique_ptr<const Commit> FakeCommit::Clone() const {
-  return std::make_unique<FakeCommit>(journal_);
-}
-
-const CommitId& FakeCommit::GetId() const { return journal_->GetId(); }
-
-std::vector<CommitIdView> FakeCommit::GetParentIds() const {
-  return journal_->GetParentIds();
-}
-
-zx::time_utc FakeCommit::GetTimestamp() const { return zx::time_utc(); }
-
-uint64_t FakeCommit::GetGeneration() const { return journal_->GetGeneration(); }
-
-ObjectIdentifier FakeCommit::GetRootIdentifier() const {
-  // The object digest is fake here: using journal id is arbitrary.
-  return encryption::MakeDefaultObjectIdentifier(
-      ObjectDigest(journal_->GetId()));
-}
-
-fxl::StringView FakeCommit::GetStorageBytes() const {
-  return fxl::StringView();
-}
-
-}  // namespace fake
-}  // namespace storage
diff --git a/bin/ledger/storage/fake/fake_commit.h b/bin/ledger/storage/fake/fake_commit.h
deleted file mode 100644
index 395e26c..0000000
--- a/bin/ledger/storage/fake/fake_commit.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_COMMIT_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_COMMIT_H_
-
-#include <memory>
-#include <string>
-
-#include "peridot/bin/ledger/storage/fake/fake_journal.h"
-#include "peridot/bin/ledger/storage/fake/fake_journal_delegate.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-
-namespace storage {
-namespace fake {
-
-// A |FakeCommit| is a commit based on a |FakeJournalDelegate|.
-class FakeCommit : public Commit {
- public:
-  explicit FakeCommit(FakeJournalDelegate* journal);
-  ~FakeCommit() override;
-
-  // Commit:
-  std::unique_ptr<const Commit> Clone() const override;
-
-  const CommitId& GetId() const override;
-
-  std::vector<CommitIdView> GetParentIds() const override;
-
-  zx::time_utc GetTimestamp() const override;
-
-  uint64_t GetGeneration() const override;
-
-  ObjectIdentifier GetRootIdentifier() const override;
-
-  fxl::StringView GetStorageBytes() const override;
-
- private:
-  FakeJournalDelegate* journal_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeCommit);
-};
-
-}  // namespace fake
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_COMMIT_H_
diff --git a/bin/ledger/storage/fake/fake_db.cc b/bin/ledger/storage/fake/fake_db.cc
deleted file mode 100644
index e6d40e8..0000000
--- a/bin/ledger/storage/fake/fake_db.cc
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/fake/fake_db.h"
-
-#include <lib/async/cpp/task.h>
-
-#include "peridot/bin/ledger/storage/fake/fake_object.h"
-
-namespace storage {
-namespace fake {
-
-namespace {
-Status MakeEmptySyncCallAndCheck(async_dispatcher_t* dispatcher,
-                                 coroutine::CoroutineHandler* handler) {
-  if (coroutine::SyncCall(handler, [&dispatcher](fit::closure on_done) {
-        async::PostTask(dispatcher, std::move(on_done));
-      }) == coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERRUPTED;
-  }
-  return Status::OK;
-}
-
-bool HasPrefix(const std::string& key, convert::ExtendedStringView prefix) {
-  return key.size() >= prefix.size() &&
-         key.compare(0, prefix.size(), prefix.ToString());
-}
-
-class FakeBatch : public Db::Batch {
- public:
-  FakeBatch(async_dispatcher_t* dispatcher,
-            std::map<std::string, std::string>* key_value_store)
-      : dispatcher_(dispatcher), key_value_store_(key_value_store) {}
-  ~FakeBatch() override {}
-
-  Status Put(coroutine::CoroutineHandler* handler,
-             convert::ExtendedStringView key, fxl::StringView value) override {
-    std::string key_str = key.ToString();
-    entries_to_put_[key_str] = value.ToString();
-
-    // Inserting an entry means that any previous |Delete| operations on that
-    // key are cancelled: erase that key from |entries_to_delete_| if present.
-    auto it = entries_to_delete_.find(key_str);
-    if (it != entries_to_delete_.end()) {
-      entries_to_delete_.erase(it);
-    }
-    return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-  }
-
-  Status Delete(coroutine::CoroutineHandler* handler,
-                convert::ExtendedStringView key) override {
-    std::string key_str = key.ToString();
-    entries_to_delete_.insert(key_str);
-
-    // Deleting an entry means that any previous |Put| operations on that key
-    // is cancelled: erase that entry from |entries_to_put_| if present.
-    auto it = entries_to_put_.find(key_str);
-    if (it != entries_to_put_.end()) {
-      entries_to_put_.erase(it);
-    }
-    return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-  }
-
-  Status DeleteByPrefix(coroutine::CoroutineHandler* handler,
-                        convert::ExtendedStringView prefix) override {
-    for (auto it = key_value_store_->lower_bound(prefix.ToString());
-         it != key_value_store_->end() && HasPrefix(it->first, prefix); ++it) {
-      Delete(handler, it->first);
-    }
-    return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-  }
-
-  Status Execute(coroutine::CoroutineHandler* handler) override {
-    for (const auto& entry : entries_to_put_) {
-      (*key_value_store_)[entry.first] = entry.second;
-    }
-    for (const auto& key : entries_to_delete_) {
-      auto it = key_value_store_->find(key);
-      if (it != key_value_store_->end()) {
-        key_value_store_->erase(it);
-      }
-    }
-    return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-  }
-
- private:
-  async_dispatcher_t* dispatcher_;
-
-  std::map<std::string, std::string> entries_to_put_;
-  std::set<std::string> entries_to_delete_;
-
-  std::map<std::string, std::string>* key_value_store_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeBatch);
-};
-
-// A wrapper storage::Iterator for the elements of an std::map that start with a
-// given prefix.
-class PrefixIterator
-    : public storage::Iterator<const std::pair<convert::ExtendedStringView,
-                                               convert::ExtendedStringView>> {
- public:
-  PrefixIterator(const std::map<std::string, std::string>& key_value_store,
-                 convert::ExtendedStringView prefix)
-      : prefix_(prefix.ToString()),
-        it_(key_value_store.lower_bound(prefix_)),
-        end_(key_value_store.end()) {
-    UpdateCurrentElement();
-  }
-
-  ~PrefixIterator() {}
-
-  storage::Iterator<const std::pair<convert::ExtendedStringView,
-                                    convert::ExtendedStringView>>&
-  Next() override {
-    ++it_;
-    UpdateCurrentElement();
-    return *this;
-  }
-
-  bool Valid() const override {
-    return current_.has_value() &&
-           current_.value().first.substr(0, prefix_.size()) ==
-               convert::ExtendedStringView(prefix_);
-  }
-
-  storage::Status GetStatus() const override { return storage::Status::OK; }
-
-  const std::pair<convert::ExtendedStringView, convert::ExtendedStringView>&
-  operator*() const override {
-    FXL_DCHECK(current_.has_value());
-    return current_.value();
-  }
-
-  const std::pair<convert::ExtendedStringView, convert::ExtendedStringView>*
-  operator->() const override {
-    FXL_DCHECK(current_.has_value());
-    return &current_.value();
-  }
-
- private:
-  void UpdateCurrentElement() {
-    if (it_ != end_) {
-      current_ = {convert::ExtendedStringView(it_->first),
-                  convert::ExtendedStringView(it_->second)};
-    } else {
-      current_.reset();
-    }
-  }
-
-  std::string prefix_;
-  std::optional<
-      std::pair<convert::ExtendedStringView, convert::ExtendedStringView>>
-      current_;
-  std::map<std::string, std::string>::const_iterator it_;
-  std::map<std::string, std::string>::const_iterator end_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PrefixIterator);
-};
-
-}  // namespace
-
-FakeDb::FakeDb(async_dispatcher_t* dispatcher) : dispatcher_(dispatcher) {}
-FakeDb::~FakeDb() {}
-
-Status FakeDb::StartBatch(coroutine::CoroutineHandler* handler,
-                          std::unique_ptr<Batch>* batch) {
-  *batch = std::make_unique<FakeBatch>(dispatcher_, &key_value_store_);
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-Status FakeDb::Get(coroutine::CoroutineHandler* handler,
-                   convert::ExtendedStringView key, std::string* value) {
-  auto it = key_value_store_.find(key.ToString());
-  if (it == key_value_store_.end()) {
-    return Status::NOT_FOUND;
-  }
-  *value = it->second;
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-Status FakeDb::HasKey(coroutine::CoroutineHandler* handler,
-                      convert::ExtendedStringView key, bool* has_key) {
-  auto it = key_value_store_.find(key.ToString());
-  *has_key = it != key_value_store_.end();
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-Status FakeDb::GetObject(coroutine::CoroutineHandler* handler,
-                         convert::ExtendedStringView key,
-                         ObjectIdentifier object_identifier,
-                         std::unique_ptr<const Object>* object) {
-  auto it = key_value_store_.find(key.ToString());
-  if (it == key_value_store_.end()) {
-    return Status::NOT_FOUND;
-  }
-  *object = std::make_unique<FakeObject>(object_identifier, it->second);
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-Status FakeDb::GetByPrefix(coroutine::CoroutineHandler* handler,
-                           convert::ExtendedStringView prefix,
-                           std::vector<std::string>* key_suffixes) {
-  std::vector<std::string> keys_with_prefix;
-  auto it = key_value_store_.lower_bound(prefix.ToString());
-  while (it != key_value_store_.end() && HasPrefix(it->first, prefix)) {
-    keys_with_prefix.push_back(it->first.substr(prefix.size()));
-  }
-  key_suffixes->swap(keys_with_prefix);
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-Status FakeDb::GetEntriesByPrefix(
-    coroutine::CoroutineHandler* handler, convert::ExtendedStringView prefix,
-    std::vector<std::pair<std::string, std::string>>* entries) {
-  std::vector<std::pair<std::string, std::string>> entries_with_prefix;
-
-  auto it = key_value_store_.lower_bound(prefix.ToString());
-  while (it != key_value_store_.end() && HasPrefix(it->first, prefix)) {
-    entries_with_prefix.emplace_back(it->first, it->second);
-  }
-  entries->swap(entries_with_prefix);
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-Status FakeDb::GetIteratorAtPrefix(
-    coroutine::CoroutineHandler* handler, convert::ExtendedStringView prefix,
-    std::unique_ptr<Iterator<const std::pair<
-        convert::ExtendedStringView, convert::ExtendedStringView>>>* iterator) {
-  *iterator = std::make_unique<PrefixIterator>(key_value_store_, prefix);
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-}  // namespace fake
-}  // namespace storage
diff --git a/bin/ledger/storage/fake/fake_db.h b/bin/ledger/storage/fake/fake_db.h
deleted file mode 100644
index 85eef5f..0000000
--- a/bin/ledger/storage/fake/fake_db.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_DB_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_DB_H_
-
-#include <map>
-
-#include <lib/async/dispatcher.h>
-
-#include "peridot/bin/ledger/storage/public/db.h"
-
-namespace storage {
-namespace fake {
-
-class FakeDb : public Db {
- public:
-  explicit FakeDb(async_dispatcher_t* dispatcher);
-  ~FakeDb() override;
-
-  // Db:
-  Status StartBatch(coroutine::CoroutineHandler* handler,
-                    std::unique_ptr<Batch>* batch) override;
-  Status Get(coroutine::CoroutineHandler* handler,
-             convert::ExtendedStringView key, std::string* value) override;
-  Status HasKey(coroutine::CoroutineHandler* handler,
-                convert::ExtendedStringView key, bool* has_key) override;
-  Status GetObject(coroutine::CoroutineHandler* handler,
-                   convert::ExtendedStringView key,
-                   ObjectIdentifier object_identifier,
-                   std::unique_ptr<const Object>* object) override;
-  Status GetByPrefix(coroutine::CoroutineHandler* handler,
-                     convert::ExtendedStringView prefix,
-                     std::vector<std::string>* key_suffixes) override;
-  Status GetEntriesByPrefix(
-      coroutine::CoroutineHandler* handler, convert::ExtendedStringView prefix,
-      std::vector<std::pair<std::string, std::string>>* entries) override;
-  Status GetIteratorAtPrefix(
-      coroutine::CoroutineHandler* handler, convert::ExtendedStringView prefix,
-      std::unique_ptr<Iterator<const std::pair<convert::ExtendedStringView,
-                                               convert::ExtendedStringView>>>*
-          iterator) override;
-
- private:
-  async_dispatcher_t* const dispatcher_;
-
-  std::map<std::string, std::string> key_value_store_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeDb);
-};
-
-}  // namespace fake
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_DB_H_
diff --git a/bin/ledger/storage/fake/fake_db_factory.cc b/bin/ledger/storage/fake/fake_db_factory.cc
deleted file mode 100644
index e23c58d..0000000
--- a/bin/ledger/storage/fake/fake_db_factory.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/fake/fake_db_factory.h"
-
-#include <lib/fxl/files/directory.h>
-
-#include "peridot/bin/ledger/storage/fake/fake_db.h"
-
-namespace storage {
-namespace fake {
-
-void FakeDbFactory::GetOrCreateDb(
-    ledger::DetachedPath db_path, DbFactory::OnDbNotFound on_db_not_found,
-    fit::function<void(Status, std::unique_ptr<Db>)> callback) {
-  if (!files::IsDirectoryAt(db_path.root_fd(), db_path.path())) {
-    if (on_db_not_found == DbFactory::OnDbNotFound::RETURN) {
-      callback(Status::NOT_FOUND, nullptr);
-      return;
-    }
-    // Create the path to fake the creation of the Db at the expected
-    // destination.
-    if (!files::CreateDirectoryAt(db_path.root_fd(), db_path.path())) {
-      FXL_LOG(ERROR) << "Failed to create the storage directory in "
-                     << db_path.path();
-      callback(Status::INTERNAL_IO_ERROR, nullptr);
-      return;
-    }
-  }
-  callback(Status::OK, std::make_unique<FakeDb>(dispatcher_));
-}
-
-}  // namespace fake
-}  // namespace storage
diff --git a/bin/ledger/storage/fake/fake_db_factory.h b/bin/ledger/storage/fake/fake_db_factory.h
deleted file mode 100644
index 7e56a89..0000000
--- a/bin/ledger/storage/fake/fake_db_factory.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_DB_FACTORY_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_DB_FACTORY_H_
-
-#include "peridot/bin/ledger/storage/public/db_factory.h"
-
-namespace storage {
-namespace fake {
-
-// A fake implementation of the DbFactory.
-class FakeDbFactory : public DbFactory {
- public:
-  explicit FakeDbFactory(async_dispatcher_t* dispatcher)
-      : dispatcher_(dispatcher) {}
-
-  void GetOrCreateDb(
-      ledger::DetachedPath db_path, DbFactory::OnDbNotFound on_db_not_found,
-      fit::function<void(Status, std::unique_ptr<Db>)> callback) override;
-
- private:
-  void CreateInitializedDb(
-      fit::function<void(Status, std::unique_ptr<Db>)> callback);
-
-  async_dispatcher_t* dispatcher_;
-};
-
-}  // namespace fake
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_DB_FACTORY_H_
diff --git a/bin/ledger/storage/fake/fake_journal.cc b/bin/ledger/storage/fake/fake_journal.cc
deleted file mode 100644
index 257f6a7..0000000
--- a/bin/ledger/storage/fake/fake_journal.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/fake/fake_journal.h"
-
-#include <string>
-
-#include <lib/fit/function.h>
-
-namespace storage {
-namespace fake {
-
-FakeJournal::FakeJournal(FakeJournalDelegate* delegate) : delegate_(delegate) {}
-
-FakeJournal::~FakeJournal() {}
-
-void FakeJournal::Commit(
-    fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-        callback) {
-  delegate_->Commit(std::move(callback));
-}
-
-Status FakeJournal::Rollback() { return delegate_->Rollback(); }
-
-void FakeJournal::Put(convert::ExtendedStringView key,
-                      ObjectIdentifier object_identifier, KeyPriority priority,
-                      fit::function<void(Status)> callback) {
-  callback(delegate_->SetValue(key, std::move(object_identifier), priority));
-}
-
-void FakeJournal::Delete(convert::ExtendedStringView key,
-                         fit::function<void(Status)> callback) {
-  callback(delegate_->Delete(key));
-}
-
-void FakeJournal::Clear(fit::function<void(Status)> callback) {
-  callback(delegate_->Clear());
-}
-
-const JournalId& FakeJournal::GetId() const { return delegate_->GetId(); }
-
-}  // namespace fake
-}  // namespace storage
diff --git a/bin/ledger/storage/fake/fake_journal.h b/bin/ledger/storage/fake/fake_journal.h
deleted file mode 100644
index f0cbb3e..0000000
--- a/bin/ledger/storage/fake/fake_journal.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_JOURNAL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_JOURNAL_H_
-
-#include <memory>
-#include <string>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/storage/fake/fake_journal_delegate.h"
-#include "peridot/bin/ledger/storage/public/journal.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-namespace fake {
-
-// A |FakeJournal| is an in-memory journal.
-class FakeJournal : public Journal {
- public:
-  explicit FakeJournal(FakeJournalDelegate* delegate);
-  ~FakeJournal() override;
-
-  void Commit(
-      fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-          callback);
-
-  Status Rollback();
-
-  // Journal:
-  void Put(convert::ExtendedStringView key, ObjectIdentifier object_identifier,
-           KeyPriority priority, fit::function<void(Status)> callback) override;
-  void Delete(convert::ExtendedStringView key,
-              fit::function<void(Status)> callback) override;
-  void Clear(fit::function<void(Status)> callback) override;
-  const JournalId& GetId() const override;
-
- private:
-  FakeJournalDelegate* delegate_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeJournal);
-};
-
-}  // namespace fake
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_JOURNAL_H_
diff --git a/bin/ledger/storage/fake/fake_journal_delegate.cc b/bin/ledger/storage/fake/fake_journal_delegate.cc
deleted file mode 100644
index 3c80415..0000000
--- a/bin/ledger/storage/fake/fake_journal_delegate.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/fake/fake_journal_delegate.h"
-
-#include <utility>
-
-#include <lib/fit/function.h>
-#include <zircon/syscalls.h>
-
-#include "peridot/bin/ledger/storage/fake/fake_commit.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-namespace storage {
-namespace fake {
-namespace {
-
-storage::CommitId RandomCommitId(rng::Random* random) {
-  storage::CommitId result;
-  result.resize(kCommitIdSize);
-  random->Draw(&result);
-  return result;
-}
-
-}  // namespace
-
-FakeJournalDelegate::FakeJournalDelegate(rng::Random* random, Data initial_data,
-                                         CommitId parent_id, bool autocommit,
-                                         uint64_t generation = 0)
-    : autocommit_(autocommit),
-      id_(RandomCommitId(random)),
-      parent_id_(std::move(parent_id)),
-      data_(std::move(initial_data)),
-      generation_(generation) {}
-
-FakeJournalDelegate::FakeJournalDelegate(rng::Random* random, Data initial_data,
-                                         CommitId parent_id, CommitId other_id,
-                                         bool autocommit,
-                                         uint64_t generation = 0)
-    : autocommit_(autocommit),
-      id_(RandomCommitId(random)),
-      parent_id_(std::move(parent_id)),
-      other_id_(std::move(other_id)),
-      data_(std::move(initial_data)),
-      generation_(generation) {}
-
-FakeJournalDelegate::~FakeJournalDelegate() {}
-
-Status FakeJournalDelegate::SetValue(convert::ExtendedStringView key,
-                                     ObjectIdentifier value,
-                                     KeyPriority priority) {
-  if (is_committed_ || is_rolled_back_) {
-    return Status::ILLEGAL_STATE;
-  }
-  data_.insert({key.ToString(), {key.ToString(), std::move(value), priority}});
-  return Status::OK;
-}
-
-Status FakeJournalDelegate::Delete(convert::ExtendedStringView key) {
-  if (is_committed_ || is_rolled_back_) {
-    return Status::ILLEGAL_STATE;
-  }
-  auto it = data_.find(key);
-  if (it != data_.end()) {
-    data_.erase(it);
-  }
-  return Status::OK;
-}
-
-Status FakeJournalDelegate::Clear() {
-  if (is_committed_ || is_rolled_back_) {
-    return Status::ILLEGAL_STATE;
-  }
-  data_.clear();
-  return Status::OK;
-}
-
-void FakeJournalDelegate::Commit(
-    fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-        callback) {
-  if (is_committed_ || is_rolled_back_) {
-    callback(Status::ILLEGAL_STATE, nullptr);
-    return;
-  }
-
-  commit_callback_ = std::move(callback);
-
-  if (autocommit_) {
-    ResolvePendingCommit(Status::OK);
-  }
-}
-
-bool FakeJournalDelegate::IsCommitted() const { return is_committed_; }
-
-Status FakeJournalDelegate::Rollback() {
-  if (is_committed_ || is_rolled_back_) {
-    return Status::ILLEGAL_STATE;
-  }
-  is_rolled_back_ = true;
-  return Status::OK;
-}
-
-bool FakeJournalDelegate::IsRolledBack() const { return is_rolled_back_; }
-
-std::vector<CommitIdView> FakeJournalDelegate::GetParentIds() const {
-  if (other_id_.empty()) {
-    return {parent_id_};
-  }
-  return {parent_id_, other_id_};
-}
-
-bool FakeJournalDelegate::IsPendingCommit() {
-  return static_cast<bool>(commit_callback_);
-}
-
-void FakeJournalDelegate::ResolvePendingCommit(Status /*status*/) {
-  is_committed_ = true;
-  auto callback = std::move(commit_callback_);
-  commit_callback_ = nullptr;
-  callback(Status::OK, std::make_unique<const FakeCommit>(this));
-}
-
-const FakeJournalDelegate::Data& FakeJournalDelegate::GetData() const {
-  return data_;
-}
-
-}  // namespace fake
-}  // namespace storage
diff --git a/bin/ledger/storage/fake/fake_journal_delegate.h b/bin/ledger/storage/fake/fake_journal_delegate.h
deleted file mode 100644
index df51f51..0000000
--- a/bin/ledger/storage/fake/fake_journal_delegate.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_JOURNAL_DELEGATE_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_JOURNAL_DELEGATE_H_
-
-#include <map>
-#include <string>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/rng/random.h"
-
-namespace storage {
-namespace fake {
-
-// |FakeJournalDelegate| records the changes made through a journal. This
-// object is owned by |FakePageStorage| and outlives |FakeJournal|.
-class FakeJournalDelegate {
- public:
-  using Data = std::map<std::string, Entry, convert::StringViewComparator>;
-
-  // Regular commit.
-  // |initial_data| must contain the content of the page when the transaction
-  // starts.
-  FakeJournalDelegate(rng::Random* random, Data initial_data,
-                      CommitId parent_id, bool autocommit, uint64_t generation);
-  // Merge commit.
-  // |initial_data| must contain the content of the page when the transaction
-  // starts.
-  FakeJournalDelegate(rng::Random* random, Data initial_data,
-                      CommitId parent_id, CommitId other_id, bool autocommit,
-                      uint64_t generation);
-  ~FakeJournalDelegate();
-
-  const CommitId& GetId() const { return id_; }
-
-  Status SetValue(convert::ExtendedStringView key, ObjectIdentifier value,
-                  KeyPriority priority);
-  Status Delete(convert::ExtendedStringView key);
-  Status Clear();
-
-  void Commit(
-      fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-          callback);
-  bool IsCommitted() const;
-
-  Status Rollback();
-  bool IsRolledBack() const;
-
-  uint64_t GetGeneration() const { return generation_; }
-
-  std::vector<CommitIdView> GetParentIds() const;
-
-  bool IsPendingCommit();
-  void ResolvePendingCommit(Status status);
-
-  const Data& GetData() const;
-
- private:
-  bool autocommit_;
-
-  const CommitId id_;
-  const CommitId parent_id_;
-  const CommitId other_id_;
-  Data data_;
-  uint64_t generation_;
-
-  bool is_committed_ = false;
-  bool is_rolled_back_ = false;
-  fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-      commit_callback_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeJournalDelegate);
-};
-
-}  // namespace fake
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_JOURNAL_DELEGATE_H_
diff --git a/bin/ledger/storage/fake/fake_object.cc b/bin/ledger/storage/fake/fake_object.cc
deleted file mode 100644
index 3a12c26..0000000
--- a/bin/ledger/storage/fake/fake_object.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/fake/fake_object.h"
-
-namespace storage {
-namespace fake {
-
-FakeObject::FakeObject(ObjectIdentifier identifier, fxl::StringView content)
-    : identifier_(std::move(identifier)), content_(content.ToString()) {}
-
-FakeObject::~FakeObject() {}
-
-ObjectIdentifier FakeObject::GetIdentifier() const { return identifier_; }
-
-Status FakeObject::GetData(fxl::StringView* data) const {
-  *data = content_;
-  return Status::OK;
-}
-
-}  // namespace fake
-}  // namespace storage
diff --git a/bin/ledger/storage/fake/fake_object.h b/bin/ledger/storage/fake/fake_object.h
deleted file mode 100644
index 3136f9a..0000000
--- a/bin/ledger/storage/fake/fake_object.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_OBJECT_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_OBJECT_H_
-
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/storage/public/object.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-namespace fake {
-
-class FakeObject : public Object {
- public:
-  FakeObject(ObjectIdentifier identifier, fxl::StringView content);
-  ~FakeObject() override;
-  ObjectIdentifier GetIdentifier() const override;
-  Status GetData(fxl::StringView* data) const override;
-
- private:
-  ObjectIdentifier identifier_;
-  std::string content_;
-};
-
-}  // namespace fake
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_OBJECT_H_
diff --git a/bin/ledger/storage/fake/fake_page_storage.cc b/bin/ledger/storage/fake/fake_page_storage.cc
deleted file mode 100644
index 7fba43e..0000000
--- a/bin/ledger/storage/fake/fake_page_storage.cc
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/fake/fake_page_storage.h"
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/concatenate.h>
-#include <lib/zx/time.h>
-
-#include "peridot/bin/ledger/encryption/primitives/hash.h"
-#include "peridot/bin/ledger/storage/fake/fake_commit.h"
-#include "peridot/bin/ledger/storage/fake/fake_journal.h"
-#include "peridot/bin/ledger/storage/fake/fake_object.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-namespace storage {
-namespace fake {
-
-namespace {
-
-Status ToBuffer(convert::ExtendedStringView value, int64_t offset,
-                int64_t max_size, fsl::SizedVmo* buffer) {
-  size_t start = value.size();
-  // Valid indices are between -N and N-1.
-  if (offset >= -static_cast<int64_t>(value.size()) &&
-      offset < static_cast<int64_t>(value.size())) {
-    start = offset < 0 ? value.size() + offset : offset;
-  }
-  size_t length = max_size < 0 ? value.size() : max_size;
-  bool result = fsl::VmoFromString(value.substr(start, length), buffer);
-  return result ? Status::OK : Status::INTERNAL_IO_ERROR;
-}
-
-}  // namespace
-
-FakePageStorage::FakePageStorage(ledger::Environment* environment,
-                                 PageId page_id)
-    : page_id_(std::move(page_id)),
-      environment_(environment),
-      encryption_service_(environment_->dispatcher()) {}
-
-FakePageStorage::~FakePageStorage() {}
-
-PageId FakePageStorage::GetId() { return page_id_; }
-
-void FakePageStorage::GetHeadCommitIds(
-    fit::function<void(Status, std::vector<CommitId>)> callback) {
-  std::vector<CommitId> commit_ids(heads_.begin(), heads_.end());
-  if (commit_ids.empty()) {
-    commit_ids.emplace_back();
-  }
-  callback(Status::OK, std::move(commit_ids));
-}
-
-void FakePageStorage::GetCommit(
-    CommitIdView commit_id,
-    fit::function<void(Status, std::unique_ptr<const Commit>)> callback) {
-  auto it = journals_.find(commit_id.ToString());
-  if (it == journals_.end()) {
-    callback(Status::NOT_FOUND, nullptr);
-    return;
-  }
-
-  async::PostDelayedTask(
-      environment_->dispatcher(),
-      [this, commit_id = commit_id.ToString(), callback = std::move(callback)] {
-        callback(Status::OK,
-                 std::make_unique<FakeCommit>(journals_[commit_id].get()));
-      },
-      kFakePageStorageDelay);
-}
-
-void FakePageStorage::StartCommit(
-    const CommitId& commit_id, JournalType /*journal_type*/,
-    fit::function<void(Status, std::unique_ptr<Journal>)> callback) {
-  uint64_t next_generation = 0;
-  FakeJournalDelegate::Data data;
-  if (journals_.find(commit_id) != journals_.end()) {
-    next_generation = journals_[commit_id].get()->GetGeneration() + 1;
-    data = journals_[commit_id].get()->GetData();
-  }
-  auto delegate = std::make_unique<FakeJournalDelegate>(
-      environment_->random(), std::move(data), commit_id, autocommit_,
-      next_generation);
-  auto journal = std::make_unique<FakeJournal>(delegate.get());
-  journals_[delegate->GetId()] = std::move(delegate);
-  callback(Status::OK, std::move(journal));
-}
-
-void FakePageStorage::StartMergeCommit(
-    const CommitId& left, const CommitId& right,
-    fit::function<void(Status, std::unique_ptr<Journal>)> callback) {
-  auto delegate = std::make_unique<FakeJournalDelegate>(
-      environment_->random(), journals_[left].get()->GetData(), left, right,
-      autocommit_,
-      1 + std::max(journals_[left].get()->GetGeneration(),
-                   journals_[right].get()->GetGeneration()));
-  auto journal = std::make_unique<FakeJournal>(delegate.get());
-  journals_[delegate->GetId()] = std::move(delegate);
-  callback(Status::OK, std::move(journal));
-}
-
-void FakePageStorage::CommitJournal(
-    std::unique_ptr<Journal> journal,
-    fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-        callback) {
-  static_cast<FakeJournal*>(journal.get())
-      ->Commit([this, callback = std::move(callback)](
-                   Status status,
-                   std::unique_ptr<const storage::Commit> commit) {
-        for (const storage::CommitIdView& parent_id : commit->GetParentIds()) {
-          auto it = heads_.find(parent_id.ToString());
-          if (it != heads_.end()) {
-            heads_.erase(it);
-          }
-        }
-        heads_.emplace(commit->GetId());
-        if (!drop_commit_notifications_) {
-          for (CommitWatcher* watcher : watchers_) {
-            async::PostTask(
-                environment_->dispatcher(),
-                [watcher, commit = commit->Clone()]() mutable {
-                  std::vector<std::unique_ptr<const Commit>> commits;
-                  commits.push_back(std::move(commit));
-                  watcher->OnNewCommits(commits, ChangeSource::LOCAL);
-                });
-          }
-        }
-        callback(status, std::move(commit));
-      });
-}
-
-void FakePageStorage::RollbackJournal(std::unique_ptr<Journal> journal,
-                                      fit::function<void(Status)> callback) {
-  callback(static_cast<FakeJournal*>(journal.get())->Rollback());
-}
-
-Status FakePageStorage::AddCommitWatcher(CommitWatcher* watcher) {
-  watchers_.emplace(watcher);
-  return Status::OK;
-}
-
-Status FakePageStorage::RemoveCommitWatcher(CommitWatcher* watcher) {
-  auto it = watchers_.find(watcher);
-  if (it != watchers_.end()) {
-    watchers_.erase(it);
-  }
-  return Status::OK;
-}
-
-void FakePageStorage::IsSynced(fit::function<void(Status, bool)> callback) {
-  callback(Status::OK, is_synced_);
-}
-
-void FakePageStorage::AddObjectFromLocal(
-    ObjectType /*object_type*/, std::unique_ptr<DataSource> data_source,
-    fit::function<void(Status, ObjectIdentifier)> callback) {
-  auto value = std::make_unique<std::string>();
-  auto data_source_ptr = data_source.get();
-  data_source_ptr->Get([this, data_source = std::move(data_source),
-                        value = std::move(value),
-                        callback = std::move(callback)](
-                           std::unique_ptr<DataSource::DataChunk> chunk,
-                           DataSource::Status status) mutable {
-    if (status == DataSource::Status::ERROR) {
-      callback(Status::IO_ERROR, {});
-      return;
-    }
-    auto view = chunk->Get();
-    value->append(view.data(), view.size());
-    if (status == DataSource::Status::DONE) {
-      ObjectIdentifier object_identifier =
-          encryption_service_.MakeObjectIdentifier(FakeDigest(*value));
-      objects_[object_identifier] = std::move(*value);
-      callback(Status::OK, std::move(object_identifier));
-    }
-  });
-}
-
-void FakePageStorage::GetObject(
-    ObjectIdentifier object_identifier, Location /*location*/,
-    fit::function<void(Status, std::unique_ptr<const Object>)> callback) {
-  GetPiece(object_identifier, std::move(callback));
-}
-
-void FakePageStorage::GetObjectPart(
-    ObjectIdentifier object_identifier, int64_t offset, int64_t max_size,
-    Location location, fit::function<void(Status, fsl::SizedVmo)> callback) {
-  GetPiece(object_identifier,
-           [offset, max_size, callback = std::move(callback)](
-               Status status, std::unique_ptr<const Object> piece) {
-             if (status != Status::OK) {
-               callback(status, nullptr);
-               return;
-             }
-             fxl::StringView data;
-             Status data_status = piece->GetData(&data);
-             if (data_status != Status::OK) {
-               callback(data_status, nullptr);
-               return;
-             }
-             fsl::SizedVmo buffer;
-             Status buffer_status = ToBuffer(data, offset, max_size, &buffer);
-             if (buffer_status != Status::OK) {
-               callback(buffer_status, nullptr);
-               return;
-             }
-             callback(Status::OK, std::move(buffer));
-           });
-}
-
-void FakePageStorage::GetPiece(
-    ObjectIdentifier object_identifier,
-    fit::function<void(Status, std::unique_ptr<const Object>)> callback) {
-  object_requests_.emplace_back(
-      [this, object_identifier = std::move(object_identifier),
-       callback = std::move(callback)] {
-        auto it = objects_.find(object_identifier);
-        if (it == objects_.end()) {
-          callback(Status::NOT_FOUND, nullptr);
-          return;
-        }
-
-        callback(Status::OK,
-                 std::make_unique<FakeObject>(object_identifier, it->second));
-      });
-  async::PostDelayedTask(
-      environment_->dispatcher(), [this] { SendNextObject(); },
-      kFakePageStorageDelay);
-}
-
-void FakePageStorage::GetCommitContents(const Commit& commit,
-                                        std::string min_key,
-                                        fit::function<bool(Entry)> on_next,
-                                        fit::function<void(Status)> on_done) {
-  FakeJournalDelegate* journal = journals_[commit.GetId()].get();
-  if (!journal) {
-    on_done(Status::NOT_FOUND);
-    return;
-  }
-
-  for (auto it = journal->GetData().lower_bound(min_key);
-       it != journal->GetData().end(); ++it) {
-    if (!on_next(it->second)) {
-      break;
-    }
-  }
-  on_done(Status::OK);
-}
-
-void FakePageStorage::GetEntryFromCommit(
-    const Commit& commit, std::string key,
-    fit::function<void(Status, Entry)> callback) {
-  FakeJournalDelegate* journal = journals_[commit.GetId()].get();
-  if (!journal) {
-    callback(Status::NOT_FOUND, Entry());
-    return;
-  }
-  const fake::FakeJournalDelegate::Data& data = journal->GetData();
-  auto it = data.find(key);
-  if (it == data.end()) {
-    callback(Status::NOT_FOUND, Entry());
-    return;
-  }
-  callback(Status::OK, it->second);
-}
-
-const std::map<std::string, std::unique_ptr<FakeJournalDelegate>>&
-FakePageStorage::GetJournals() const {
-  return journals_;
-}
-
-const std::map<ObjectIdentifier, std::string>& FakePageStorage::GetObjects()
-    const {
-  return objects_;
-}
-
-ObjectDigest FakePageStorage::FakeDigest(fxl::StringView value) const {
-  // Builds a fake ObjectDigest by computing the hash of |value|, and prefixes
-  // it with 0xFACEFEED to intentionally make it longer than real object
-  // digests, start with a 1 bit, and easy to spot in logs. This is incompatible
-  // with real object digests, but is enough for a fake because all clients of
-  // the fake should treat object digests as opaque blobs.
-  return ObjectDigest(fxl::Concatenate(
-      {"\xFA\xCE\xFE\xED", encryption::SHA256WithLengthHash(value)}));
-}
-
-void FakePageStorage::SendNextObject() {
-  auto rng = environment_->random()->NewBitGenerator<uint64_t>();
-  std::uniform_int_distribution<size_t> distribution(
-      0u, object_requests_.size() - 1);
-  auto it = object_requests_.begin() + distribution(rng);
-  auto closure = std::move(*it);
-  object_requests_.erase(it);
-  closure();
-}
-
-void FakePageStorage::DeleteObjectFromLocal(
-    const ObjectIdentifier& object_identifier) {
-  objects_.erase(object_identifier);
-}
-
-void FakePageStorage::SetDropCommitNotifications(bool drop) {
-  drop_commit_notifications_ = drop;
-}
-
-}  // namespace fake
-}  // namespace storage
diff --git a/bin/ledger/storage/fake/fake_page_storage.h b/bin/ledger/storage/fake/fake_page_storage.h
deleted file mode 100644
index 836a413..0000000
--- a/bin/ledger/storage/fake/fake_page_storage.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_PAGE_STORAGE_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_PAGE_STORAGE_H_
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/storage/fake/fake_journal_delegate.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/testing/page_storage_empty_impl.h"
-
-namespace storage {
-namespace fake {
-
-// The delay for which tasks are posted by the FakePageStorage methods
-// GetCommit() and GetPiece().
-constexpr zx::duration kFakePageStorageDelay = zx::msec(5);
-
-class FakePageStorage : public PageStorageEmptyImpl {
- public:
-  FakePageStorage(ledger::Environment* environment, PageId page_id);
-  ~FakePageStorage() override;
-
-  // PageStorage:
-  PageId GetId() override;
-  void GetHeadCommitIds(
-      fit::function<void(Status, std::vector<CommitId>)> callback) override;
-  void GetCommit(CommitIdView commit_id,
-                 fit::function<void(Status, std::unique_ptr<const Commit>)>
-                     callback) override;
-  void StartCommit(
-      const CommitId& commit_id, JournalType journal_type,
-      fit::function<void(Status, std::unique_ptr<Journal>)> callback) override;
-  void StartMergeCommit(
-      const CommitId& left, const CommitId& right,
-      fit::function<void(Status, std::unique_ptr<Journal>)> callback) override;
-  void CommitJournal(
-      std::unique_ptr<Journal> journal,
-      fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-          callback) override;
-  void RollbackJournal(std::unique_ptr<Journal> journal,
-                       fit::function<void(Status)> callback) override;
-  Status AddCommitWatcher(CommitWatcher* watcher) override;
-  Status RemoveCommitWatcher(CommitWatcher* watcher) override;
-  void IsSynced(fit::function<void(Status, bool)> callback) override;
-  void AddObjectFromLocal(
-      ObjectType object_type, std::unique_ptr<DataSource> data_source,
-      fit::function<void(Status, ObjectIdentifier)> callback) override;
-  void GetObjectPart(
-      ObjectIdentifier object_identifier, int64_t offset, int64_t max_size,
-      Location location,
-      fit::function<void(Status, fsl::SizedVmo)> callback) override;
-  void GetObject(ObjectIdentifier object_identifier, Location location,
-                 fit::function<void(Status, std::unique_ptr<const Object>)>
-                     callback) override;
-  void GetPiece(ObjectIdentifier object_identifier,
-                fit::function<void(Status, std::unique_ptr<const Object>)>
-                    callback) override;
-  void GetCommitContents(const Commit& commit, std::string min_key,
-                         fit::function<bool(Entry)> on_next,
-                         fit::function<void(Status)> on_done) override;
-  void GetEntryFromCommit(const Commit& commit, std::string key,
-                          fit::function<void(Status, Entry)> callback) override;
-
-  // For testing:
-  void set_autocommit(bool autocommit) { autocommit_ = autocommit; }
-  void set_synced(bool is_synced) { is_synced_ = is_synced; }
-
-  const std::map<std::string, std::unique_ptr<FakeJournalDelegate>>&
-  GetJournals() const;
-
-  const std::map<ObjectIdentifier, std::string>& GetObjects() const;
-
-  // Deletes this object from the fake local storage, but keeps it in its
-  // "network" storage.
-  void DeleteObjectFromLocal(const ObjectIdentifier& object_identifier);
-
-  // If set to true, no commit notification is sent to the commit watchers.
-  void SetDropCommitNotifications(bool drop);
-
- protected:
-  // Returns an ObjectDigest (for use in the object identifier returned by
-  // AddObjectFromLocal).
-  // By default, fake object digests are invalid to ensure external clients do
-  // not rely implicitly on the internal encoding. Specific tests can override
-  // this method if they need valid object digests instead.
-  virtual ObjectDigest FakeDigest(fxl::StringView value) const;
-
-  PageId page_id_;
-
- private:
-  void SendNextObject();
-
-  bool autocommit_ = true;
-  bool drop_commit_notifications_ = false;
-  bool is_synced_ = false;
-
-  ledger::Environment* const environment_;
-  std::map<std::string, std::unique_ptr<FakeJournalDelegate>> journals_;
-  std::map<ObjectIdentifier, std::string> objects_;
-  std::set<CommitId> heads_;
-  std::set<CommitWatcher*> watchers_;
-  std::vector<fit::closure> object_requests_;
-  encryption::FakeEncryptionService encryption_service_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakePageStorage);
-};
-
-}  // namespace fake
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_FAKE_FAKE_PAGE_STORAGE_H_
diff --git a/bin/ledger/storage/impl/BUILD.gn b/bin/ledger/storage/impl/BUILD.gn
deleted file mode 100644
index d903764..0000000
--- a/bin/ledger/storage/impl/BUILD.gn
+++ /dev/null
@@ -1,194 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/flatbuffers/flatbuffer.gni")
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("impl") {
-  deps = [
-    ":lib",
-    "//peridot/bin/ledger/storage/impl/btree",
-  ]
-}
-
-flatbuffer("object_identifier") {
-  sources = [
-    "object_identifier.fbs",
-  ]
-
-  extra_configs = [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-flatbuffer("commit_storage") {
-  sources = [
-    "commit.fbs",
-  ]
-
-  public_deps = [
-    ":object_identifier",
-  ]
-
-  extra_configs = [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-flatbuffer("file_index") {
-  sources = [
-    "file_index.fbs",
-  ]
-
-  extra_configs = [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("object_identifier_lib") {
-  sources = [
-    "constants.h",
-    "object_digest.cc",
-    "object_digest.h",
-    "object_identifier_encoding.cc",
-    "object_identifier_encoding.h",
-  ]
-
-  deps = [
-    "//peridot/bin/ledger/encryption/primitives",
-    "//peridot/bin/ledger/encryption/public",
-  ]
-
-  public_deps = [
-    ":object_identifier",
-    "//peridot/bin/ledger/storage/public",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("lib") {
-  sources = [
-    "commit_impl.cc",
-    "commit_impl.h",
-    "data_serialization.h",
-    "db_serialization.cc",
-    "db_serialization.h",
-    "file_index.cc",
-    "file_index.h",
-    "journal_impl.cc",
-    "journal_impl.h",
-    "ledger_storage_impl.cc",
-    "ledger_storage_impl.h",
-    "leveldb.cc",
-    "leveldb.h",
-    "leveldb_factory.cc",
-    "leveldb_factory.h",
-    "object_impl.cc",
-    "object_impl.h",
-    "page_db.h",
-    "page_db_batch_impl.cc",
-    "page_db_batch_impl.h",
-    "page_db_impl.cc",
-    "page_db_impl.h",
-    "page_storage_impl.cc",
-    "page_storage_impl.h",
-    "split.cc",
-    "split.h",
-  ]
-
-  deps = [
-    ":commit_storage",
-    ":file_index",
-    ":object_identifier_lib",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/cobalt",
-    "//peridot/bin/ledger/encryption/impl",
-    "//peridot/bin/ledger/encryption/primitives",
-    "//peridot/bin/ledger/encryption/public",
-    "//peridot/bin/ledger/environment",
-    "//peridot/bin/ledger/filesystem",
-    "//peridot/bin/ledger/lock",
-    "//peridot/bin/ledger/storage/impl/btree:lib",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/lib/base64url",
-    "//zircon/public/lib/trace",
-  ]
-
-  public_deps = [
-    ":object_identifier_lib",
-    "//peridot/bin/ledger/coroutine",
-    "//peridot/lib/convert",
-    "//peridot/third_party/bup",
-    "//third_party/leveldb",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("test_utils") {
-  testonly = true
-
-  sources = [
-    "storage_test_utils.cc",
-    "storage_test_utils.h",
-  ]
-
-  deps = [
-    ":lib",
-    "//garnet/public/lib/callback",
-    "//peridot/bin/ledger/encryption/fake",
-    "//peridot/bin/ledger/encryption/primitives",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/storage/impl/btree:lib",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/rng",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "commit_impl_unittest.cc",
-    "commit_random_impl.cc",
-    "commit_random_impl.h",
-    "file_index_unittest.cc",
-    "ledger_storage_unittest.cc",
-    "leveldb_factory_unittest.cc",
-    "object_digest_unittest.cc",
-    "object_impl_unittest.cc",
-    "page_db_empty_impl.cc",
-    "page_db_empty_impl.h",
-    "page_db_unittest.cc",
-    "page_storage_unittest.cc",
-    "split_unittest.cc",
-  ]
-
-  deps = [
-    ":file_index",
-    ":lib",
-    ":test_utils",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/fxl/test",
-    "//peridot/bin/ledger/cloud_sync/impl",
-    "//peridot/bin/ledger/encryption/fake",
-    "//peridot/bin/ledger/encryption/primitives",
-    "//peridot/bin/ledger/storage/fake:lib",
-    "//peridot/bin/ledger/storage/impl/btree:lib",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/bin/ledger/storage/testing",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/rng",
-    "//peridot/lib/scoped_tmpfs",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/storage/impl/btree/BUILD.gn b/bin/ledger/storage/impl/btree/BUILD.gn
deleted file mode 100644
index 22070d1..0000000
--- a/bin/ledger/storage/impl/btree/BUILD.gn
+++ /dev/null
@@ -1,117 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fuzzing/fuzzer.gni")
-import("//third_party/flatbuffers/flatbuffer.gni")
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("btree") {
-  deps = [
-    ":lib",
-  ]
-}
-
-source_set("lib") {
-  sources = [
-    "builder.cc",
-    "builder.h",
-    "diff.cc",
-    "diff.h",
-    "encoding.cc",
-    "encoding.h",
-    "entry_change_iterator.h",
-    "iterator.cc",
-    "iterator.h",
-    "synchronous_storage.cc",
-    "synchronous_storage.h",
-    "tree_node.cc",
-    "tree_node.h",
-  ]
-
-  public_deps = [
-    "//peridot/bin/ledger/coroutine",
-  ]
-
-  deps = [
-    ":internal",
-    ":tree_node_storage",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/encryption/primitives",
-    "//peridot/bin/ledger/storage/impl:object_identifier_lib",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/lib/convert",
-    "//third_party/murmurhash",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-flatbuffer("tree_node_storage") {
-  sources = [
-    "tree_node.fbs",
-  ]
-
-  public_deps = [
-    "//peridot/bin/ledger/storage/impl:object_identifier",
-  ]
-
-  extra_configs = [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("internal") {
-  sources = [
-    "internal_helper.cc",
-    "internal_helper.h",
-  ]
-
-  public_deps = [
-    "//peridot/bin/ledger/storage/public",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "btree_utils_unittest.cc",
-    "diff_unittest.cc",
-    "encoding_unittest.cc",
-    "tree_node_unittest.cc",
-  ]
-
-  deps = [
-    ":lib",
-    ":tree_node_storage",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/encryption/fake",
-    "//peridot/bin/ledger/encryption/primitives",
-    "//peridot/bin/ledger/storage/fake:lib",
-    "//peridot/bin/ledger/storage/impl:object_identifier_lib",
-    "//peridot/bin/ledger/storage/impl:test_utils",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/bin/ledger/storage/testing",
-    "//peridot/bin/ledger/testing:lib",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-fuzz_target("encoding_fuzzer") {
-  sources = [
-    "encoding_fuzztest.cc",
-  ]
-  deps = [
-    ":lib",
-    "//peridot/bin/ledger/storage/public",
-  ]
-  corpora =
-      [ "848002de6109d94118c57d79b2a8c0cfbd16ba8691bb390e3eb7437089ad99cc" ]
-}
diff --git a/bin/ledger/storage/impl/btree/btree_utils_unittest.cc b/bin/ledger/storage/impl/btree/btree_utils_unittest.cc
deleted file mode 100644
index 85a2e16..0000000
--- a/bin/ledger/storage/impl/btree/btree_utils_unittest.cc
+++ /dev/null
@@ -1,888 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <algorithm>
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/arraysize.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/storage/fake/fake_page_storage.h"
-#include "peridot/bin/ledger/storage/impl/btree/builder.h"
-#include "peridot/bin/ledger/storage/impl/btree/diff.h"
-#include "peridot/bin/ledger/storage/impl/btree/entry_change_iterator.h"
-#include "peridot/bin/ledger/storage/impl/btree/iterator.h"
-#include "peridot/bin/ledger/storage/impl/btree/tree_node.h"
-#include "peridot/bin/ledger/storage/impl/storage_test_utils.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-namespace btree {
-namespace {
-// Pre-determined node level function.
-uint8_t GetTestNodeLevel(convert::ExtendedStringView key) {
-  if (key == "key03" || key == "key07" || key == "key30" || key == "key60" ||
-      key == "key89") {
-    return 1;
-  }
-
-  if (key == "key50" || key == "key75") {
-    return 2;
-  }
-
-  return 0;
-}
-
-constexpr NodeLevelCalculator kTestNodeLevelCalculator = {&GetTestNodeLevel};
-
-class TrackGetObjectFakePageStorage : public fake::FakePageStorage {
- public:
-  explicit TrackGetObjectFakePageStorage(ledger::Environment* environment,
-                                         PageId id)
-      : fake::FakePageStorage(environment, id) {}
-  ~TrackGetObjectFakePageStorage() override {}
-
-  void GetObject(ObjectIdentifier object_identifier, Location location,
-                 fit::function<void(Status, std::unique_ptr<const Object>)>
-                     callback) override {
-    object_requests.insert(object_identifier);
-    fake::FakePageStorage::GetObject(std::move(object_identifier), location,
-                                     std::move(callback));
-  }
-
-  std::set<ObjectIdentifier> object_requests;
-
- protected:
-  ObjectDigest FakeDigest(fxl::StringView content) const override {
-    // BTree code needs storage to return valid digests.
-    return MakeObjectDigest(content.ToString());
-  }
-};
-
-class BTreeUtilsTest : public StorageTest {
- public:
-  BTreeUtilsTest() : fake_storage_(&environment_, "page_id") {}
-
-  ~BTreeUtilsTest() override {}
-
-  // Test:
-  void SetUp() override {
-    ::testing::Test::SetUp();
-    std::srand(0);
-  }
-
- protected:
-  PageStorage* GetStorage() override { return &fake_storage_; }
-
-  ObjectIdentifier CreateTree(const std::vector<EntryChange>& entries) {
-    ObjectIdentifier base_node_identifier;
-    EXPECT_TRUE(GetEmptyNodeIdentifier(&base_node_identifier));
-
-    ObjectIdentifier new_root_identifier;
-    EXPECT_TRUE(CreateTreeFromChanges(base_node_identifier, entries,
-                                      &new_root_identifier));
-    return new_root_identifier;
-  }
-
-  std::vector<Entry> GetEntriesList(ObjectIdentifier root_identifier) {
-    std::vector<Entry> entries;
-    auto on_next = [&entries](EntryAndNodeIdentifier entry) {
-      entries.push_back(entry.entry);
-      return true;
-    };
-    auto on_done = [this](Status status) {
-      EXPECT_EQ(Status::OK, status);
-      QuitLoop();
-    };
-    ForEachEntry(environment_.coroutine_service(), &fake_storage_,
-                 root_identifier, "", std::move(on_next), std::move(on_done));
-    RunLoopFor(kSufficientDelay);
-    return entries;
-  }
-
-  TrackGetObjectFakePageStorage fake_storage_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(BTreeUtilsTest);
-};
-
-TEST_F(BTreeUtilsTest, GetNodeLevel) {
-  size_t level_distribution[4];
-  memset(level_distribution, 0, sizeof(level_distribution));
-
-  for (size_t i = 0; i < 1000; ++i) {
-    fxl::StringView key(reinterpret_cast<char*>(&i), sizeof(i));
-    uint8_t node_level =
-        std::min(arraysize(level_distribution) - 1,
-                 static_cast<size_t>(
-                     GetDefaultNodeLevelCalculator()->GetNodeLevel(key)));
-    level_distribution[node_level]++;
-  }
-
-  EXPECT_TRUE(std::is_sorted(level_distribution,
-                             level_distribution + arraysize(level_distribution),
-                             [](int v1, int v2) { return v2 < v1; }));
-  EXPECT_NE(0u, level_distribution[1]);
-}
-
-TEST_F(BTreeUtilsTest, ApplyChangesFromEmpty) {
-  ObjectIdentifier root_identifier;
-  ASSERT_TRUE(GetEmptyNodeIdentifier(&root_identifier));
-  std::vector<EntryChange> changes;
-  ASSERT_TRUE(CreateEntryChanges(3, &changes));
-
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  // Expected layout (X is key "keyX"):
-  // [00, 01, 02]
-  ApplyChanges(
-      environment_.coroutine_service(), &fake_storage_, root_identifier,
-      std::make_unique<EntryChangeIterator>(changes.begin(), changes.end()),
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &new_root_identifier, &new_nodes),
-      &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(1u, new_nodes.size());
-  EXPECT_TRUE(new_nodes.find(new_root_identifier) != new_nodes.end());
-
-  std::vector<Entry> entries = GetEntriesList(new_root_identifier);
-  ASSERT_EQ(changes.size(), entries.size());
-  for (size_t i = 0; i < entries.size(); ++i) {
-    EXPECT_EQ(changes[i].entry, entries[i]);
-  }
-}
-
-TEST_F(BTreeUtilsTest, ApplyChangeSingleLevel1Entry) {
-  ObjectIdentifier root_identifier;
-  ASSERT_TRUE(GetEmptyNodeIdentifier(&root_identifier));
-  std::vector<EntryChange> golden_entries;
-  ASSERT_TRUE(CreateEntryChanges(std::vector<size_t>({3}), &golden_entries));
-
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  // Expected layout (XX is key "keyXX"):
-  // [03]
-
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               root_identifier,
-               std::make_unique<EntryChangeIterator>(golden_entries.begin(),
-                                                     golden_entries.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(1u, new_nodes.size());
-  EXPECT_TRUE(new_nodes.find(new_root_identifier) != new_nodes.end());
-
-  std::vector<Entry> entries = GetEntriesList(new_root_identifier);
-  ASSERT_EQ(golden_entries.size(), entries.size());
-  for (size_t i = 0; i < golden_entries.size(); ++i) {
-    EXPECT_EQ(golden_entries[i].entry, entries[i]);
-  }
-}
-
-TEST_F(BTreeUtilsTest, ApplyChangesManyEntries) {
-  ObjectIdentifier root_identifier;
-  ASSERT_TRUE(GetEmptyNodeIdentifier(&root_identifier));
-  std::vector<EntryChange> golden_entries;
-  ASSERT_TRUE(CreateEntryChanges(11, &golden_entries));
-
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  // Expected layout (XX is key "keyXX"):
-  //                 [03, 07]
-  //            /       |            \
-  // [00, 01, 02]  [04, 05, 06] [08, 09, 10]
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               root_identifier,
-               std::make_unique<EntryChangeIterator>(golden_entries.begin(),
-                                                     golden_entries.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(4u, new_nodes.size());
-  EXPECT_TRUE(new_nodes.find(new_root_identifier) != new_nodes.end());
-
-  std::vector<Entry> entries = GetEntriesList(new_root_identifier);
-  ASSERT_EQ(golden_entries.size(), entries.size());
-  for (size_t i = 0; i < golden_entries.size(); ++i) {
-    EXPECT_EQ(golden_entries[i].entry, entries[i]);
-  }
-
-  Entry new_entry = {"key071", MakeObjectIdentifier("object_digest_071"),
-                     KeyPriority::EAGER};
-  std::vector<EntryChange> new_change{EntryChange{new_entry, false}};
-  // Insert key "071" between keys "07" and "08".
-  golden_entries.insert(golden_entries.begin() + 8, new_change[0]);
-
-  new_nodes.clear();
-  ObjectIdentifier new_root_identifier2;
-  // Expected layout (XX is key "keyXX"):
-  //                 [03, 07]
-  //            /       |            \
-  // [00, 01, 02]  [04, 05, 06] [071, 08, 09, 10]
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               new_root_identifier,
-               std::make_unique<EntryChangeIterator>(new_change.begin(),
-                                                     new_change.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier2, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_NE(new_root_identifier, new_root_identifier2);
-  // The root and the 3rd child have changed.
-  EXPECT_EQ(2u, new_nodes.size());
-  EXPECT_TRUE(new_nodes.find(new_root_identifier2) != new_nodes.end());
-
-  entries = GetEntriesList(new_root_identifier2);
-  ASSERT_EQ(golden_entries.size(), entries.size());
-  for (size_t i = 0; i < golden_entries.size(); ++i) {
-    EXPECT_EQ(golden_entries[i].entry, entries[i]);
-  }
-}
-
-TEST_F(BTreeUtilsTest, UpdateValue) {
-  // Expected layout (XX is key "keyXX"):
-  //                 [03, 07]
-  //            /       |            \
-  // [00, 01, 02]  [04, 05, 06] [08, 09, 10, 11]
-  std::vector<EntryChange> golden_entries;
-  ASSERT_TRUE(CreateEntryChanges(11, &golden_entries));
-  ObjectIdentifier root_identifier = CreateTree(golden_entries);
-
-  // Update entry.
-  std::vector<Entry> entries_to_update{golden_entries[2].entry};
-  std::vector<EntryChange> update_changes;
-  for (size_t i = 0; i < entries_to_update.size(); ++i) {
-    std::unique_ptr<const Object> object;
-    ASSERT_TRUE(
-        AddObject(fxl::StringPrintf("new_object%02" PRIuMAX, i), &object));
-    entries_to_update[i].object_identifier = object->GetIdentifier();
-    update_changes.push_back(EntryChange{entries_to_update[i], false});
-  }
-
-  // Expected layout is unchanged.
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               root_identifier,
-               std::make_unique<EntryChangeIterator>(update_changes.begin(),
-                                                     update_changes.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_NE(root_identifier, new_root_identifier);
-  // The root and the first child have changed.
-  EXPECT_EQ(2u, new_nodes.size());
-  EXPECT_TRUE(new_nodes.find(new_root_identifier) != new_nodes.end());
-
-  std::vector<Entry> entries = GetEntriesList(new_root_identifier);
-  ASSERT_EQ(golden_entries.size(), entries.size());
-  size_t updated_index = 0;
-  for (size_t i = 0; i < golden_entries.size(); ++i) {
-    if (updated_index < entries_to_update.size() &&
-        golden_entries[i].entry.key == entries_to_update[updated_index].key) {
-      EXPECT_EQ(entries_to_update[updated_index], entries[i]);
-      // Skip the updated entries.
-      updated_index++;
-      continue;
-    }
-    EXPECT_EQ(golden_entries[i].entry, entries[i]);
-  }
-}
-
-TEST_F(BTreeUtilsTest, UpdateValueLevel1) {
-  // Expected layout (XX is key "keyXX"):
-  //                 [03, 07]
-  //            /       |            \
-  // [00, 01, 02]  [04, 05, 06] [08, 09, 10, 11]
-  std::vector<EntryChange> golden_entries;
-  ASSERT_TRUE(CreateEntryChanges(11, &golden_entries));
-  ObjectIdentifier root_identifier = CreateTree(golden_entries);
-
-  // Update entry.
-  std::vector<Entry> entries_to_update{golden_entries[3].entry};
-  std::vector<EntryChange> update_changes;
-  for (size_t i = 0; i < entries_to_update.size(); ++i) {
-    std::unique_ptr<const Object> object;
-    ASSERT_TRUE(
-        AddObject(fxl::StringPrintf("new_object%02" PRIuMAX, i), &object));
-    entries_to_update[i].object_identifier = object->GetIdentifier();
-    update_changes.push_back(EntryChange{entries_to_update[i], false});
-  }
-
-  // Expected layout is unchanged.
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               root_identifier,
-               std::make_unique<EntryChangeIterator>(update_changes.begin(),
-                                                     update_changes.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_NE(root_identifier, new_root_identifier);
-  // Only the root has changed.
-  EXPECT_EQ(1u, new_nodes.size());
-  EXPECT_TRUE(new_nodes.find(new_root_identifier) != new_nodes.end());
-
-  std::vector<Entry> entries = GetEntriesList(new_root_identifier);
-  ASSERT_EQ(golden_entries.size(), entries.size());
-  size_t updated_index = 0;
-  for (size_t i = 0; i < golden_entries.size(); ++i) {
-    if (updated_index < entries_to_update.size() &&
-        golden_entries[i].entry.key == entries_to_update[updated_index].key) {
-      EXPECT_EQ(entries_to_update[updated_index], entries[i]);
-      // Skip the updated entries.
-      updated_index++;
-      continue;
-    }
-    EXPECT_EQ(golden_entries[i].entry, entries[i]);
-  }
-}
-
-TEST_F(BTreeUtilsTest, UpdateValueSplitChange) {
-  // Expected layout (XX is key "keyXX"):
-  // [00, 04]
-  std::vector<EntryChange> golden_entries;
-  ASSERT_TRUE(CreateEntryChanges(std::vector<size_t>({
-                                     0,
-                                     4,
-                                 }),
-                                 &golden_entries));
-  ObjectIdentifier root_identifier = CreateTree(golden_entries);
-
-  // Add level 1 entry.
-  std::vector<EntryChange> update_changes;
-  ASSERT_TRUE(CreateEntryChanges(std::vector<size_t>({3}), &update_changes));
-  // Expected layout (XX is key "keyXX"):
-  //    [03]
-  //   /    \
-  // [00]  [04]
-
-  // Apply update.
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               root_identifier,
-               std::make_unique<EntryChangeIterator>(update_changes.begin(),
-                                                     update_changes.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_NE(root_identifier, new_root_identifier);
-  // The tree nodes are new.
-  EXPECT_EQ(3u, new_nodes.size());
-  EXPECT_TRUE(new_nodes.find(new_root_identifier) != new_nodes.end());
-
-  std::vector<Entry> entries = GetEntriesList(new_root_identifier);
-  ASSERT_EQ(golden_entries.size() + update_changes.size(), entries.size());
-  size_t updated_index = 0;
-  for (size_t i = 0; i < entries.size(); ++i) {
-    if (updated_index < update_changes.size() &&
-        entries[i] == update_changes[updated_index].entry) {
-      // Skip the updated entries.
-      updated_index++;
-      continue;
-    }
-    ASSERT_GT(golden_entries.size(), i - updated_index);
-    EXPECT_EQ(golden_entries[i - updated_index].entry, entries[i]);
-  }
-}
-
-TEST_F(BTreeUtilsTest, NoOpUpdateChange) {
-  // Expected layout (XX is key "keyXX"):
-  //                 [03, 07]
-  //            /       |            \
-  // [00, 01, 02]  [04, 05, 06] [08, 09, 10, 11]
-  std::vector<EntryChange> golden_entries;
-  ASSERT_TRUE(CreateEntryChanges(11, &golden_entries));
-  ObjectIdentifier root_identifier = CreateTree(golden_entries);
-
-  // Apply all entries again.
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               root_identifier,
-               std::make_unique<EntryChangeIterator>(golden_entries.begin(),
-                                                     golden_entries.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(root_identifier, new_root_identifier);
-  // The root and the first child have changed.
-  EXPECT_EQ(0u, new_nodes.size());
-}
-
-TEST_F(BTreeUtilsTest, DeleteChanges) {
-  // Expected layout (XX is key "keyXX"):
-  //                 [03, 07]
-  //            /       |            \
-  // [00, 01, 02]  [04, 05, 06] [08, 09, 10, 11]
-  std::vector<EntryChange> golden_entries;
-  ASSERT_TRUE(CreateEntryChanges(11, &golden_entries));
-  ObjectIdentifier root_identifier = CreateTree(golden_entries);
-
-  // Delete entries.
-  std::vector<EntryChange> delete_changes;
-  ASSERT_TRUE(
-      CreateEntryChanges(std::vector<size_t>({2, 4}), &delete_changes, true));
-
-  // Expected layout (XX is key "keyXX"):
-  //            [03, 07]
-  //         /     |        \
-  // [00, 01]  [05, 06]    [08, 09, 10, 11]
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               root_identifier,
-               std::make_unique<EntryChangeIterator>(delete_changes.begin(),
-                                                     delete_changes.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_NE(root_identifier, new_root_identifier);
-  // The root and the first 2 children have changed.
-  EXPECT_EQ(3u, new_nodes.size());
-  EXPECT_TRUE(new_nodes.find(new_root_identifier) != new_nodes.end());
-
-  std::vector<Entry> entries = GetEntriesList(new_root_identifier);
-  ASSERT_EQ(golden_entries.size() - delete_changes.size(), entries.size());
-  size_t deleted_index = 0;
-  for (size_t i = 0; i < golden_entries.size(); ++i) {
-    if (deleted_index < delete_changes.size() &&
-        golden_entries[i].entry.key ==
-            delete_changes[deleted_index].entry.key) {
-      // Skip the deleted entries.
-      deleted_index++;
-      continue;
-    }
-    ASSERT_LT(i - deleted_index, entries.size());
-    EXPECT_EQ(golden_entries[i].entry, entries[i - deleted_index]);
-  }
-}
-
-TEST_F(BTreeUtilsTest, DeleteLevel1Changes) {
-  // Expected layout (XX is key "keyXX"):
-  //                 [03, 07]
-  //            /       |            \
-  // [00, 01, 02]  [04, 05, 06] [08, 09, 10, 11]
-  std::vector<EntryChange> golden_entries;
-  ASSERT_TRUE(CreateEntryChanges(11, &golden_entries));
-  ObjectIdentifier root_identifier = CreateTree(golden_entries);
-
-  // Delete entry.
-  std::vector<EntryChange> delete_changes;
-  ASSERT_TRUE(
-      CreateEntryChanges(std::vector<size_t>({3}), &delete_changes, true));
-
-  // Expected layout (XX is key "keyXX"):
-  //                         [07]
-  //                        /    \
-  // [00, 01, 02, 04, 05, 06]    [08, 09, 10, 11]
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               root_identifier,
-               std::make_unique<EntryChangeIterator>(delete_changes.begin(),
-                                                     delete_changes.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_NE(root_identifier, new_root_identifier);
-  // The root and one child have changed.
-  EXPECT_EQ(2u, new_nodes.size());
-  EXPECT_TRUE(new_nodes.find(new_root_identifier) != new_nodes.end());
-
-  std::vector<Entry> entries = GetEntriesList(new_root_identifier);
-  ASSERT_EQ(golden_entries.size() - delete_changes.size(), entries.size());
-  size_t deleted_index = 0;
-  for (size_t i = 0; i < golden_entries.size(); ++i) {
-    if (deleted_index < delete_changes.size() &&
-        golden_entries[i].entry.key ==
-            delete_changes[deleted_index].entry.key) {
-      // Skip the deleted entries.
-      deleted_index++;
-      continue;
-    }
-    ASSERT_LT(i - deleted_index, entries.size());
-    EXPECT_EQ(golden_entries[i].entry, entries[i - deleted_index]);
-  }
-}
-
-TEST_F(BTreeUtilsTest, NoOpDeleteChange) {
-  // Expected layout (XX is key "keyXX"):
-  //                 [03, 07]
-  //            /       |            \
-  // [00, 01, 02]  [04, 05, 06] [08, 09, 10, 11]
-  std::vector<EntryChange> golden_entries;
-  ASSERT_TRUE(CreateEntryChanges(11, &golden_entries));
-  ObjectIdentifier root_identifier = CreateTree(golden_entries);
-
-  // Delete entry.
-  std::vector<EntryChange> delete_changes;
-  ASSERT_TRUE(CreateEntryChanges(std::vector<size_t>({12, 13, 14}),
-                                 &delete_changes, true));
-
-  // Apply deletion.
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               root_identifier,
-               std::make_unique<EntryChangeIterator>(delete_changes.begin(),
-                                                     delete_changes.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(root_identifier, new_root_identifier);
-  // The root and the first child have changed.
-  EXPECT_EQ(0u, new_nodes.size());
-}
-
-TEST_F(BTreeUtilsTest, SplitMergeUpdate) {
-  // Expected layout (XX is key "keyXX"):
-  //        [50]
-  //     /        \
-  // [03]          [60, 89]
-  //            /      |     \
-  //        [55] [65, 74, 76] [99]
-  std::vector<EntryChange> golden_entries;
-  ASSERT_TRUE(CreateEntryChanges(
-      std::vector<size_t>({3, 50, 55, 60, 65, 74, 76, 89, 99}),
-      &golden_entries));
-  ObjectIdentifier root_identifier = CreateTree(golden_entries);
-
-  // Add level 2 entry.
-  std::vector<EntryChange> update_changes;
-  ASSERT_TRUE(CreateEntryChanges(std::vector<size_t>({75}), &update_changes));
-  // Expected layout (XX is key "keyXX"):
-  //          [50, 75]
-  //     /       |       \
-  // [03]     [60]         [89]
-  //         /    \       /   \
-  //      [55] [65, 74] [76] [99]
-
-  // Apply update.
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               root_identifier,
-               std::make_unique<EntryChangeIterator>(update_changes.begin(),
-                                                     update_changes.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_NE(root_identifier, new_root_identifier);
-  // The tree nodes are new.
-  EXPECT_EQ(5u, new_nodes.size());
-  EXPECT_TRUE(new_nodes.find(new_root_identifier) != new_nodes.end());
-
-  std::vector<Entry> entries = GetEntriesList(new_root_identifier);
-  ASSERT_EQ(golden_entries.size() + update_changes.size(), entries.size());
-  size_t updated_index = 0;
-  for (size_t i = 0; i < entries.size(); ++i) {
-    if (updated_index < update_changes.size() &&
-        entries[i] == update_changes[updated_index].entry) {
-      // Skip the updated entries.
-      updated_index++;
-      continue;
-    }
-    ASSERT_LT(i - updated_index, golden_entries.size());
-    EXPECT_EQ(golden_entries[i - updated_index].entry, entries[i]);
-  }
-
-  // Remove the new entry.
-  std::vector<EntryChange> delete_changes;
-  ASSERT_TRUE(
-      CreateEntryChanges(std::vector<size_t>({75}), &delete_changes, true));
-
-  ObjectIdentifier final_node_identifier;
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               new_root_identifier,
-               std::make_unique<EntryChangeIterator>(delete_changes.begin(),
-                                                     delete_changes.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &final_node_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(root_identifier, final_node_identifier);
-}
-
-TEST_F(BTreeUtilsTest, DeleteAll) {
-  // Create an initial tree.
-  std::vector<size_t> values({0, 1, 2, 3, 4, 5, 6, 7});
-  std::vector<EntryChange> golden_entries;
-  ASSERT_TRUE(CreateEntryChanges(values, &golden_entries));
-  ObjectIdentifier root_identifier = CreateTree(golden_entries);
-
-  // Delete everything.
-  std::vector<EntryChange> delete_changes;
-  ASSERT_TRUE(CreateEntryChanges(values, &delete_changes, true));
-  // Apply update.
-  bool called;
-  Status status;
-  ObjectIdentifier new_root_identifier;
-  std::set<ObjectIdentifier> new_nodes;
-  ApplyChanges(environment_.coroutine_service(), &fake_storage_,
-               root_identifier,
-               std::make_unique<EntryChangeIterator>(delete_changes.begin(),
-                                                     delete_changes.end()),
-               callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &new_root_identifier, &new_nodes),
-               &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_NE(root_identifier, new_root_identifier);
-  EXPECT_TRUE(new_root_identifier.object_digest().IsValid());
-  // The empty node is new.
-  EXPECT_EQ(1u, new_nodes.size());
-  EXPECT_TRUE(new_nodes.find(new_root_identifier) != new_nodes.end());
-}
-
-TEST_F(BTreeUtilsTest, GetObjectIdentifiersFromEmpty) {
-  ObjectIdentifier root_identifier;
-  ASSERT_TRUE(GetEmptyNodeIdentifier(&root_identifier));
-  bool called;
-  Status status;
-  std::set<ObjectIdentifier> object_identifiers;
-  GetObjectIdentifiers(environment_.coroutine_service(), &fake_storage_,
-                       root_identifier,
-                       callback::Capture(callback::SetWhenCalled(&called),
-                                         &status, &object_identifiers));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(1u, object_identifiers.size());
-  EXPECT_TRUE(object_identifiers.find(root_identifier) !=
-              object_identifiers.end());
-}
-
-TEST_F(BTreeUtilsTest, GetObjectOneNodeTree) {
-  std::vector<EntryChange> entries;
-  ASSERT_TRUE(CreateEntryChanges(4, &entries));
-  ObjectIdentifier root_identifier = CreateTree(entries);
-
-  bool called;
-  Status status;
-  std::set<ObjectIdentifier> object_identifiers;
-  GetObjectIdentifiers(environment_.coroutine_service(), &fake_storage_,
-                       root_identifier,
-                       callback::Capture(callback::SetWhenCalled(&called),
-                                         &status, &object_identifiers));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(6u, object_identifiers.size());
-  EXPECT_TRUE(object_identifiers.find(root_identifier) !=
-              object_identifiers.end());
-  for (EntryChange& e : entries) {
-    EXPECT_TRUE(object_identifiers.find(e.entry.object_identifier) !=
-                object_identifiers.end());
-  }
-}
-
-TEST_F(BTreeUtilsTest, GetObjectIdentifiersBigTree) {
-  std::vector<EntryChange> entries;
-  ASSERT_TRUE(CreateEntryChanges(99, &entries));
-  ObjectIdentifier root_identifier = CreateTree(entries);
-
-  bool called;
-  Status status;
-  std::set<ObjectIdentifier> object_identifiers;
-  GetObjectIdentifiers(environment_.coroutine_service(), &fake_storage_,
-                       root_identifier,
-                       callback::Capture(callback::SetWhenCalled(&called),
-                                         &status, &object_identifiers));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(99u + 12, object_identifiers.size());
-  EXPECT_TRUE(object_identifiers.find(root_identifier) !=
-              object_identifiers.end());
-  for (EntryChange& e : entries) {
-    EXPECT_TRUE(object_identifiers.find(e.entry.object_identifier) !=
-                object_identifiers.end());
-  }
-}
-
-TEST_F(BTreeUtilsTest, GetObjectsFromSync) {
-  std::vector<EntryChange> entries;
-  ASSERT_TRUE(CreateEntryChanges(5, &entries));
-  entries[3].entry.priority = KeyPriority::LAZY;
-  ObjectIdentifier root_identifier = CreateTree(entries);
-
-  fake_storage_.object_requests.clear();
-  bool called;
-  Status status;
-  // Expected layout (XX is key "keyXX"):
-  //          [03]
-  //       /        \
-  // [00, 01, 02]  [04]
-  GetObjectsFromSync(
-      environment_.coroutine_service(), &fake_storage_, root_identifier,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-
-  std::vector<ObjectIdentifier> object_requests;
-  std::copy(fake_storage_.object_requests.begin(),
-            fake_storage_.object_requests.end(),
-            std::back_inserter(object_requests));
-  // There are 8 objects: 3 nodes and 4 eager values and 1 lazy. Except from the
-  // lazy object, all others should have been requested.
-  EXPECT_EQ(3 + 4u, object_requests.size());
-
-  std::set<ObjectIdentifier> object_identifiers;
-  GetObjectIdentifiers(environment_.coroutine_service(), &fake_storage_,
-                       root_identifier,
-                       callback::Capture(callback::SetWhenCalled(&called),
-                                         &status, &object_identifiers));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  ASSERT_EQ(3 + 5u, object_identifiers.size());
-  for (ObjectIdentifier& identifier : object_requests) {
-    // entries[3] contains the lazy value.
-    if (identifier != entries[3].entry.object_identifier) {
-      EXPECT_TRUE(object_identifiers.find(identifier) !=
-                  object_identifiers.end());
-    }
-  }
-}
-
-TEST_F(BTreeUtilsTest, ForEachEmptyTree) {
-  std::vector<EntryChange> entries = {};
-  ObjectIdentifier root_identifier = CreateTree(entries);
-  auto on_next = [](EntryAndNodeIdentifier e) {
-    // Fail: There are no elements in the tree.
-    EXPECT_TRUE(false);
-    return false;
-  };
-  auto on_done = [this](Status status) {
-    EXPECT_EQ(Status::OK, status);
-    QuitLoop();
-  };
-  ForEachEntry(environment_.coroutine_service(), &fake_storage_,
-               root_identifier, "", std::move(on_next), std::move(on_done));
-  RunLoopFor(kSufficientDelay);
-}
-
-TEST_F(BTreeUtilsTest, ForEachAllEntries) {
-  // Create a tree from entries with keys from 00-99.
-  std::vector<EntryChange> entries;
-  ASSERT_TRUE(CreateEntryChanges(100, &entries));
-  ObjectIdentifier root_identifier = CreateTree(entries);
-
-  int current_key = 0;
-  auto on_next = [&current_key](EntryAndNodeIdentifier e) {
-    EXPECT_EQ(fxl::StringPrintf("key%02d", current_key), e.entry.key);
-    current_key++;
-    return true;
-  };
-  auto on_done = [this](Status status) {
-    EXPECT_EQ(Status::OK, status);
-    QuitLoop();
-  };
-  ForEachEntry(environment_.coroutine_service(), &fake_storage_,
-               root_identifier, "", on_next, on_done);
-  RunLoopFor(kSufficientDelay);
-}
-
-TEST_F(BTreeUtilsTest, ForEachEntryPrefix) {
-  // Create a tree from entries with keys from 00-99.
-  std::vector<EntryChange> entries;
-  ASSERT_TRUE(CreateEntryChanges(100, &entries));
-  ObjectIdentifier root_identifier = CreateTree(entries);
-
-  // Find all entries with "key3" prefix in the key.
-  std::string prefix = "key3";
-  int current_key = 30;
-  auto on_next = [&current_key, &prefix](EntryAndNodeIdentifier e) {
-    if (e.entry.key.substr(0, prefix.length()) != prefix) {
-      return false;
-    }
-    EXPECT_EQ(fxl::StringPrintf("key%02d", current_key++), e.entry.key);
-    return true;
-  };
-  auto on_done = [this, &current_key](Status status) {
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(40, current_key);
-    QuitLoop();
-  };
-  ForEachEntry(environment_.coroutine_service(), &fake_storage_,
-               root_identifier, prefix, on_next, on_done);
-  RunLoopFor(kSufficientDelay);
-}
-
-}  // namespace
-}  // namespace btree
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/btree/builder.cc b/bin/ledger/storage/impl/btree/builder.cc
deleted file mode 100644
index 4874e79..0000000
--- a/bin/ledger/storage/impl/btree/builder.cc
+++ /dev/null
@@ -1,671 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/btree/builder.h"
-
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine_waiter.h"
-#include "peridot/bin/ledger/storage/impl/btree/internal_helper.h"
-#include "peridot/bin/ledger/storage/impl/btree/synchronous_storage.h"
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-#include "third_party/murmurhash/murmurhash.h"
-
-namespace storage {
-namespace btree {
-namespace {
-
-constexpr uint32_t kMurmurHashSeed = 0xbeef;
-
-using HashResultType = decltype(murmurhash(nullptr, 0, 0));
-using HashSliceType = uint8_t;
-
-union Hash {
-  HashResultType hash;
-  HashSliceType slices[sizeof(HashResultType) / sizeof(HashSliceType)];
-};
-
-static_assert(sizeof(Hash::slices) == sizeof(Hash::hash),
-              "Hash size is incorrect.");
-static_assert(sizeof(HashSliceType) < std::numeric_limits<uint8_t>::max(),
-              "Hash size is too big.");
-
-Hash FastHash(convert::ExtendedStringView value) {
-  return {.hash = murmurhash(value.data(), value.size(), kMurmurHashSeed)};
-}
-
-uint8_t GetNodeLevel(convert::ExtendedStringView key) {
-  // Compute the level of a key by computing the hash of the key.
-  // A key is at level k if the first k bytes of the hash of |key| are 0s. This
-  // constructs a tree with an expected node size of |255|.
-  Hash hash = FastHash(key);
-  for (size_t l = 0; l < sizeof(Hash); ++l) {
-    if (hash.slices[l]) {
-      return l;
-    }
-  }
-  return std::numeric_limits<uint8_t>::max();
-}
-
-constexpr NodeLevelCalculator kDefaultNodeLevelCalculator = {&GetNodeLevel};
-
-// Base class for tree nodes during construction. To apply mutations on a tree
-// node, one starts by creating an instance of NodeBuilder from the id of an
-// existing tree node, then applies mutation on it.  Once all mutations are
-// applied, a call to Build will build a TreeNode in the storage.
-class NodeBuilder {
- public:
-  // Creates a NodeBuilder from the id of a tree node.
-  static Status FromIdentifier(SynchronousStorage* page_storage,
-                               ObjectIdentifier object_identifier,
-                               NodeBuilder* node_builder);
-
-  // Creates a null builder.
-  NodeBuilder() { FXL_DCHECK(Validate()); }
-
-  NodeBuilder(NodeBuilder&&) = default;
-
-  NodeBuilder& operator=(NodeBuilder&&) = default;
-
-  // Returns whether the builder is null.
-  explicit operator bool() const { return type_ != BuilderType::NULL_NODE; }
-
-  // Apply the given mutation on |node_builder|.
-  Status Apply(const NodeLevelCalculator* node_level_calculator,
-               SynchronousStorage* page_storage, EntryChange change,
-               bool* did_mutate);
-
-  // Build the tree node represented by the builder |node_builder| in the
-  // storage.
-  Status Build(SynchronousStorage* page_storage,
-               ObjectIdentifier* object_identifier,
-               std::set<ObjectIdentifier>* new_identifiers);
-
- private:
-  enum class BuilderType {
-    EXISTING_NODE,
-    NEW_NODE,
-    NULL_NODE,
-  };
-
-  static NodeBuilder CreateExistingBuilder(uint8_t level,
-                                           ObjectIdentifier object_identifier) {
-    return NodeBuilder(BuilderType::EXISTING_NODE, level,
-                       std::move(object_identifier), {}, {});
-  }
-
-  static NodeBuilder CreateNewBuilder(uint8_t level, std::vector<Entry> entries,
-                                      std::vector<NodeBuilder> children) {
-    if (entries.empty() && !children[0]) {
-      return NodeBuilder();
-    }
-    return NodeBuilder(BuilderType::NEW_NODE, level, {}, std::move(entries),
-                       std::move(children));
-  }
-
-  NodeBuilder(BuilderType type, uint8_t level,
-              ObjectIdentifier object_identifier, std::vector<Entry> entries,
-              std::vector<NodeBuilder> children)
-      : type_(type),
-        level_(level),
-        object_identifier_(std::move(object_identifier)),
-        entries_(std::move(entries)),
-        children_(std::move(children)) {
-    FXL_DCHECK(Validate());
-  }
-
-  // Ensures that the entries and children of this builder are computed.
-  Status ComputeContent(SynchronousStorage* page_storage);
-
-  // Delete the value with the given |key| from the builder. |key_level| must be
-  // greater or equal then the node level.
-  Status Delete(SynchronousStorage* page_storage, uint8_t key_level,
-                std::string key, bool* did_mutate);
-
-  // Update the tree by adding |entry| (or modifying the value associated to
-  // |entry.key| with |entry.value| if |key| is already in the tree).
-  // |change_level| must be greater or equal than the node level.
-  Status Update(SynchronousStorage* page_storage, uint8_t change_level,
-                Entry entry, bool* did_mutate);
-
-  // Split the current tree in 2 according to |key|. This method expects that
-  // |key| is not in the tree. After the call, the left tree will be in the
-  // current builder, and the right tree in |right|.
-  Status Split(SynchronousStorage* page_storage, std::string key,
-               NodeBuilder* right);
-
-  // Merge this tree with |other|. This expects all elements of |other| to be
-  // greather than elements in |this|.
-  Status Merge(SynchronousStorage* page_storage, NodeBuilder other);
-
-  // Extract the entries and children from a TreeNode.
-  static void ExtractContent(const TreeNode& node, std::vector<Entry>* entries,
-                             std::vector<NodeBuilder>* children);
-
-  // Validate that the content of this builder follows the expected constraints.
-  bool Validate() {
-    if (type_ == BuilderType::NULL_NODE &&
-        object_identifier_.object_digest().IsValid()) {
-      return false;
-    }
-    if (type_ == BuilderType::EXISTING_NODE &&
-        !object_identifier_.object_digest().IsValid()) {
-      return false;
-    }
-    if (type_ == BuilderType::NEW_NODE && children_.empty()) {
-      return false;
-    }
-    if ((!children_.empty() || !entries_.empty()) &&
-        children_.size() != entries_.size() + 1) {
-      return false;
-    }
-    if (type_ == BuilderType::NEW_NODE && entries_.empty() && !children_[0]) {
-      return false;
-    }
-    return true;
-  }
-
-  // Add needed parent to |node| to produce a new tree of level |target_level|.
-  NodeBuilder& ToLevel(uint8_t target_level) {
-    if (!*this) {
-      return *this;
-    }
-    FXL_DCHECK(target_level >= level_);
-    while (level_ < target_level) {
-      std::vector<NodeBuilder> children;
-      children.push_back(std::move(*this));
-      *this =
-          NodeBuilder::CreateNewBuilder(level_ + 1, {}, std::move(children));
-    }
-    return *this;
-  }
-
-  // Collect the maximal set of nodes in the tree root at this builder than can
-  // currently be built. A node can be built if and only if all its children are
-  // already built. Add the buildable nodes to |output|. Return if at least a
-  // node has been added to |output|.
-  bool CollectNodesToBuild(std::vector<NodeBuilder*>* output) {
-    if (type_ != BuilderType::NEW_NODE) {
-      return false;
-    }
-    bool found_nodes_to_build = false;
-    for (auto& child : children_) {
-      found_nodes_to_build |= child.CollectNodesToBuild(output);
-    }
-    if (!found_nodes_to_build) {
-      output->push_back(this);
-    }
-    return true;
-  }
-
-  BuilderType type_ = BuilderType::NULL_NODE;
-  uint8_t level_;
-  ObjectIdentifier object_identifier_;
-  std::vector<Entry> entries_;
-  std::vector<NodeBuilder> children_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(NodeBuilder);
-};
-
-Status NodeBuilder::FromIdentifier(SynchronousStorage* page_storage,
-                                   ObjectIdentifier object_identifier,
-                                   NodeBuilder* node_builder) {
-  std::unique_ptr<const TreeNode> node;
-  RETURN_ON_ERROR(
-      page_storage->TreeNodeFromIdentifier(object_identifier, &node));
-  FXL_DCHECK(node);
-
-  std::vector<Entry> entries;
-  std::vector<NodeBuilder> children;
-  ExtractContent(*node, &entries, &children);
-  *node_builder = NodeBuilder(BuilderType::EXISTING_NODE, node->level(),
-                              std::move(object_identifier), std::move(entries),
-                              std::move(children));
-  return Status::OK;
-}
-
-Status NodeBuilder::Apply(const NodeLevelCalculator* node_level_calculator,
-                          SynchronousStorage* page_storage, EntryChange change,
-                          bool* did_mutate) {
-  if (!*this) {
-    // If the change is a deletion, and the tree is null, the result is still
-    // null.
-    if (change.deleted) {
-      *did_mutate = false;
-      return Status::OK;
-    }
-
-    // Otherwise, create a node of the right level that contains only entry.
-    std::vector<Entry> entries;
-    uint8_t level = node_level_calculator->GetNodeLevel(change.entry.key);
-    entries.push_back(std::move(change.entry));
-    *this = NodeBuilder::CreateNewBuilder(level, std::move(entries),
-                                          std::vector<NodeBuilder>(2));
-    *did_mutate = true;
-    return Status::OK;
-  }
-
-  uint8_t change_level = node_level_calculator->GetNodeLevel(change.entry.key);
-
-  if (change_level < level_) {
-    // The change is at a lower level than the current node. Find the children
-    // to apply the change, transform it and reconstruct the new node.
-    RETURN_ON_ERROR(ComputeContent(page_storage));
-
-    size_t index = GetEntryOrChildIndex(entries_, change.entry.key);
-    FXL_DCHECK(index == entries_.size() ||
-               entries_[index].key != change.entry.key);
-
-    NodeBuilder& child = children_[index];
-    RETURN_ON_ERROR(child.Apply(node_level_calculator, page_storage,
-                                std::move(change), did_mutate));
-    // Suppress warning that |did_mutate| might not be initialized.
-    if (!*did_mutate) {  // NOLINT
-      return Status::OK;
-    }
-
-    type_ = BuilderType::NEW_NODE;
-    if (entries_.empty() && !children_[0]) {
-      *this = NodeBuilder();
-    } else {
-      child.ToLevel(level_ - 1);
-    }
-    return Status::OK;
-  }
-
-  if (change.deleted) {
-    return Delete(page_storage, change_level, std::move(change.entry.key),
-                  did_mutate);
-  }
-
-  return Update(page_storage, change_level, std::move(change.entry),
-                did_mutate);
-}
-
-Status NodeBuilder::Build(SynchronousStorage* page_storage,
-                          ObjectIdentifier* object_identifier,
-                          std::set<ObjectIdentifier>* new_identifiers) {
-  if (!*this) {
-    RETURN_ON_ERROR(
-        page_storage->TreeNodeFromEntries(0, {}, {}, &object_identifier_));
-
-    *object_identifier = object_identifier_;
-    new_identifiers->insert(object_identifier_);
-    type_ = BuilderType::EXISTING_NODE;
-    return Status::OK;
-  }
-  if (type_ == BuilderType::EXISTING_NODE) {
-    *object_identifier = object_identifier_;
-    return Status::OK;
-  }
-
-  std::vector<NodeBuilder*> to_build;
-  while (CollectNodesToBuild(&to_build)) {
-    auto waiter =
-        fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-    for (NodeBuilder* child : to_build) {
-      std::map<size_t, ObjectIdentifier> children;
-      for (size_t index = 0; index < child->children_.size(); ++index) {
-        const auto& sub_child = child->children_[index];
-        FXL_DCHECK(sub_child.type_ != BuilderType::NEW_NODE);
-        if (sub_child) {
-          children[index] = sub_child.object_identifier_;
-        }
-      }
-      TreeNode::FromEntries(
-          page_storage->page_storage(), child->level_, child->entries_,
-          children,
-          [new_identifiers, child, callback = waiter->NewCallback()](
-              Status status, ObjectIdentifier object_identifier) {
-            if (status == Status::OK) {
-              child->type_ = BuilderType::EXISTING_NODE;
-              child->object_identifier_ = object_identifier;
-              new_identifiers->insert(child->object_identifier_);
-            }
-            callback(status);
-          });
-    }
-    Status status;
-
-    if (coroutine::Wait(page_storage->handler(), std::move(waiter), &status) ==
-        coroutine::ContinuationStatus::INTERRUPTED) {
-      return Status::INTERRUPTED;
-    }
-    if (status != Status::OK) {
-      return status;
-    }
-    to_build.clear();
-  }
-
-  FXL_DCHECK(type_ == BuilderType::EXISTING_NODE);
-  *object_identifier = object_identifier_;
-
-  return Status::OK;
-}
-
-Status NodeBuilder::ComputeContent(SynchronousStorage* page_storage) {
-  FXL_DCHECK(*this);
-
-  if (!children_.empty()) {
-    return Status::OK;
-  }
-
-  FXL_DCHECK(type_ == BuilderType::EXISTING_NODE);
-
-  std::unique_ptr<const TreeNode> node;
-  RETURN_ON_ERROR(
-      page_storage->TreeNodeFromIdentifier(object_identifier_, &node));
-  FXL_DCHECK(node);
-
-  ExtractContent(*node, &entries_, &children_);
-  return Status::OK;
-}
-
-Status NodeBuilder::Delete(SynchronousStorage* page_storage, uint8_t key_level,
-                           std::string key, bool* did_mutate) {
-  FXL_DCHECK(*this);
-  FXL_DCHECK(key_level >= level_);
-
-  // If the change is at a higher level than this node, then it is a no-op.
-  if (key_level > level_) {
-    return Status::OK;
-  }
-
-  RETURN_ON_ERROR(ComputeContent(page_storage));
-
-  size_t index = GetEntryOrChildIndex(entries_, key);
-
-  // The key must be in the current node if it is in the tree.
-  if (index == entries_.size() || entries_[index].key != key) {
-    // The key is not found. Return the current node.
-    *did_mutate = false;
-    return Status::OK;
-  }
-
-  // Element at |index| must be removed.
-  RETURN_ON_ERROR(
-      children_[index].Merge(page_storage, std::move(children_[index + 1])));
-
-  type_ = BuilderType::NEW_NODE;
-  *did_mutate = true;
-  entries_.erase(entries_.begin() + index);
-  children_.erase(children_.begin() + index + 1);
-
-  // Check if this makes this node null.
-  if (entries_.empty() && !children_[0]) {
-    *this = NodeBuilder();
-  }
-
-  return Status::OK;
-}
-
-Status NodeBuilder::Update(SynchronousStorage* page_storage,
-                           uint8_t change_level, Entry entry,
-                           bool* did_mutate) {
-  FXL_DCHECK(*this);
-  FXL_DCHECK(change_level >= level_);
-
-  // If the change is at a greater level than the node level, the current node
-  // must be splitted in 2, and the new root is composed of the new entry and
-  // the 2 children.
-  if (change_level > level_) {
-    NodeBuilder right;
-    RETURN_ON_ERROR(Split(page_storage, entry.key, &right));
-
-    std::vector<Entry> entries;
-    entries.push_back(std::move(entry));
-    std::vector<NodeBuilder> children;
-    children.push_back(std::move(this->ToLevel(change_level - 1)));
-    children.push_back(std::move(right.ToLevel(change_level - 1)));
-    *this = NodeBuilder::CreateNewBuilder(change_level, std::move(entries),
-                                          std::move(children));
-    *did_mutate = true;
-    return Status::OK;
-  }
-
-  RETURN_ON_ERROR(ComputeContent(page_storage));
-
-  // The change is at the current level. The entries must be splitted
-  // according to the key of the change.
-  size_t split_index = GetEntryOrChildIndex(entries_, entry.key);
-
-  if (split_index < entries_.size() && entries_[split_index].key == entry.key) {
-    // The key is already present in the current entries of the node. The
-    // value must be replaced.
-
-    // Entries are identical, the change is a no-op.
-    if (entries_[split_index].object_identifier == entry.object_identifier &&
-        entries_[split_index].priority == entry.priority) {
-      *did_mutate = false;
-      return Status::OK;
-    }
-
-    type_ = BuilderType::NEW_NODE;
-    *did_mutate = true;
-    entries_[split_index].object_identifier =
-        std::move(entry.object_identifier);
-    entries_[split_index].priority = entry.priority;
-    return Status::OK;
-  }
-
-  type_ = BuilderType::NEW_NODE;
-  *did_mutate = true;
-
-  // Split the child that encompass |entry.key|.
-  NodeBuilder right;
-  RETURN_ON_ERROR(
-      children_[split_index].Split(page_storage, entry.key, &right));
-
-  // Add |entry| to the list of entries of the result node.
-  entries_.insert(entries_.begin() + split_index, std::move(entry));
-  // Append the right node to the list of children.
-  children_.insert(children_.begin() + split_index + 1, std::move(right));
-  return Status::OK;
-}
-
-Status NodeBuilder::Split(SynchronousStorage* page_storage, std::string key,
-                          NodeBuilder* right) {
-  if (!*this) {
-    *right = NodeBuilder();
-    return Status::OK;
-  }
-
-  RETURN_ON_ERROR(ComputeContent(page_storage));
-
-  // Find the index at which to split.
-  size_t split_index = GetEntryOrChildIndex(entries_, key);
-
-  // Ensure that |key| is not part of the entries.
-  FXL_DCHECK(split_index == entries_.size() ||
-             entries_[split_index].key != key);
-
-  auto& child_to_split = children_[split_index];
-
-  if (split_index == 0 && !child_to_split) {
-    *right = std::move(*this);
-    *this = NodeBuilder();
-    return Status::OK;
-  }
-
-  if (split_index == entries_.size() && !child_to_split) {
-    *right = NodeBuilder();
-    return Status::OK;
-  }
-
-  type_ = BuilderType::NEW_NODE;
-
-  // Recursively call |Split| on the child.
-  NodeBuilder sub_right;
-  RETURN_ON_ERROR(
-      child_to_split.Split(page_storage, std::move(key), &sub_right));
-
-  std::vector<Entry> right_entries;
-
-  right_entries.reserve(entries_.size() - split_index);
-  right_entries.insert(right_entries.end(),
-                       std::make_move_iterator(entries_.begin() + split_index),
-                       std::make_move_iterator(entries_.end()));
-
-  std::vector<NodeBuilder> right_children;
-  right_children.reserve(children_.size() - split_index);
-  right_children.push_back(std::move(sub_right));
-  right_children.insert(
-      right_children.end(),
-      std::make_move_iterator(children_.begin() + split_index + 1),
-      std::make_move_iterator(children_.end()));
-
-  *right = NodeBuilder::CreateNewBuilder(level_, std::move(right_entries),
-                                         std::move(right_children));
-
-  entries_.erase(entries_.begin() + split_index, entries_.end());
-  children_.erase(children_.begin() + split_index + 1, children_.end());
-
-  if (entries_.empty() && !children_[0]) {
-    *this = NodeBuilder();
-  }
-  FXL_DCHECK(Validate());
-
-  return Status::OK;
-}
-
-Status NodeBuilder::Merge(SynchronousStorage* page_storage, NodeBuilder other) {
-  if (!other) {
-    return Status::OK;
-  }
-
-  if (!*this) {
-    *this = std::move(other);
-    return Status::OK;
-  }
-
-  // |NULL_NODE|s do not have the level_ assigned. Only check the level if both
-  // are non-null.
-  FXL_DCHECK(level_ == other.level_);
-
-  RETURN_ON_ERROR(ComputeContent(page_storage));
-  RETURN_ON_ERROR(other.ComputeContent(page_storage));
-
-  type_ = BuilderType::NEW_NODE;
-
-  // Merge the right-most child from |left| with the left-most child
-  // from |right|.
-  RETURN_ON_ERROR(
-      children_.back().Merge(page_storage, std::move(other.children_.front())));
-
-  // Concatenate entries.
-  entries_.insert(entries_.end(),
-                  std::make_move_iterator(other.entries_.begin()),
-                  std::make_move_iterator(other.entries_.end()));
-
-  // Concatenate children, skipping the first child from other.
-  children_.insert(children_.end(),
-                   std::make_move_iterator(other.children_.begin() + 1),
-                   std::make_move_iterator(other.children_.end()));
-  return Status::OK;
-}
-
-void NodeBuilder::ExtractContent(const TreeNode& node,
-                                 std::vector<Entry>* entries,
-                                 std::vector<NodeBuilder>* children) {
-  FXL_DCHECK(entries);
-  FXL_DCHECK(children);
-  *entries = std::vector<Entry>(node.entries().begin(), node.entries().end());
-  children->clear();
-  size_t next_index = 0;
-  for (const auto& child : node.children_identifiers()) {
-    for (; next_index < child.first; ++next_index) {
-      children->push_back(NodeBuilder());
-    }
-    children->push_back(
-        NodeBuilder::CreateExistingBuilder(node.level() - 1, child.second));
-    ++next_index;
-  }
-  for (; next_index <= entries->size(); ++next_index) {
-    children->push_back(NodeBuilder());
-  }
-}
-
-// Apply |changes| on |root|. This is called recursively until |changes| is not
-// valid anymore. At this point, build is called on |root|.
-Status ApplyChangesOnRoot(const NodeLevelCalculator* node_level_calculator,
-                          SynchronousStorage* page_storage, NodeBuilder root,
-                          std::unique_ptr<Iterator<const EntryChange>> changes,
-                          ObjectIdentifier* object_identifier,
-                          std::set<ObjectIdentifier>* new_identifiers) {
-  Status status;
-  while (changes->Valid()) {
-    EntryChange change = **changes;
-    changes->Next();
-
-    bool did_mutate;
-    status = root.Apply(node_level_calculator, page_storage, std::move(change),
-                        &did_mutate);
-    if (status != Status::OK) {
-      return status;
-    }
-  }
-
-  if (changes->GetStatus() != Status::OK) {
-    return changes->GetStatus();
-  }
-  return root.Build(page_storage, object_identifier, new_identifiers);
-}
-
-}  // namespace
-
-const NodeLevelCalculator* GetDefaultNodeLevelCalculator() {
-  return &kDefaultNodeLevelCalculator;
-}
-
-void ApplyChanges(
-    coroutine::CoroutineService* coroutine_service, PageStorage* page_storage,
-    ObjectIdentifier root_identifier,
-    std::unique_ptr<Iterator<const EntryChange>> changes,
-    fit::function<void(Status, ObjectIdentifier, std::set<ObjectIdentifier>)>
-        callback,
-    const NodeLevelCalculator* node_level_calculator) {
-  FXL_DCHECK(storage::IsDigestValid(root_identifier.object_digest()));
-  coroutine_service->StartCoroutine(
-      [page_storage, root_identifier = std::move(root_identifier),
-       changes = std::move(changes), callback = std::move(callback),
-       node_level_calculator](coroutine::CoroutineHandler* handler) mutable {
-        SynchronousStorage storage(page_storage, handler);
-
-        NodeBuilder root;
-        Status status = NodeBuilder::FromIdentifier(
-            &storage, std::move(root_identifier), &root);
-        if (status != Status::OK) {
-          callback(status, {}, {});
-          return;
-        }
-        ObjectIdentifier object_identifier;
-        std::set<ObjectIdentifier> new_identifiers;
-        status = ApplyChangesOnRoot(node_level_calculator, &storage,
-                                    std::move(root), std::move(changes),
-                                    &object_identifier, &new_identifiers);
-        if (status != Status::OK) {
-          callback(status, {}, {});
-          return;
-        }
-
-        if (object_identifier.object_digest().IsValid()) {
-          callback(Status::OK, std::move(object_identifier),
-                   std::move(new_identifiers));
-          return;
-        }
-
-        TreeNode::Empty(page_storage, [callback = std::move(callback)](
-                                          Status status,
-                                          ObjectIdentifier object_identifier) {
-          std::set<ObjectIdentifier> new_identifiers({object_identifier});
-          callback(status, std::move(object_identifier),
-                   std::move(new_identifiers));
-        });
-      });
-}
-
-}  // namespace btree
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/btree/builder.h b/bin/ledger/storage/impl/btree/builder.h
deleted file mode 100644
index 9e64629..0000000
--- a/bin/ledger/storage/impl/btree/builder.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_BUILDER_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_BUILDER_H_
-
-#include <memory>
-#include <set>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/storage/public/iterator.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-namespace btree {
-
-struct NodeLevelCalculator {
-  // Returns the level in the tree where a node containing |key| must be
-  // located. The leaves are located on level 0.
-  uint8_t (*GetNodeLevel)(convert::ExtendedStringView key);
-};
-
-// Returns the default algorithm to compute the node level.
-const NodeLevelCalculator* GetDefaultNodeLevelCalculator();
-
-// Applies changes provided by |changes| to the B-Tree starting at
-// |root_identifier|. |changes| must provide |EntryChange| objects sorted by
-// their key. The callback will provide the status of the operation, the id of
-// the new root and the list of ids of all new nodes created after the changes.
-void ApplyChanges(
-    coroutine::CoroutineService* coroutine_service, PageStorage* page_storage,
-    ObjectIdentifier root_identifier,
-    std::unique_ptr<Iterator<const EntryChange>> changes,
-    fit::function<void(Status, ObjectIdentifier, std::set<ObjectIdentifier>)>
-        callback,
-    const NodeLevelCalculator* node_level_calculator =
-        GetDefaultNodeLevelCalculator());
-
-}  // namespace btree
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_BUILDER_H_
diff --git a/bin/ledger/storage/impl/btree/diff.cc b/bin/ledger/storage/impl/btree/diff.cc
deleted file mode 100644
index c02fdde..0000000
--- a/bin/ledger/storage/impl/btree/diff.cc
+++ /dev/null
@@ -1,603 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/btree/diff.h"
-
-#include <utility>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/storage/impl/btree/internal_helper.h"
-#include "peridot/bin/ledger/storage/impl/btree/iterator.h"
-#include "peridot/bin/ledger/storage/impl/btree/synchronous_storage.h"
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-
-namespace storage {
-namespace btree {
-namespace {
-// Aggregates 2 |BTreeIterator|s and allows to walk through these concurrently
-// to compute the diff. |on_next| will be called for each diff entry.
-class IteratorPair {
- public:
-  IteratorPair(
-      SynchronousStorage* storage,
-      fit::function<bool(std::unique_ptr<Entry>, std::unique_ptr<Entry>)>
-          on_next)
-      : on_next_(std::move(on_next)), left_(storage), right_(storage) {}
-
-  // Initialize the pair with the ids of both roots.
-  Status Init(ObjectIdentifier left_node_identifier,
-              ObjectIdentifier right_node_identifier, fxl::StringView min_key) {
-    RETURN_ON_ERROR(left_.Init(left_node_identifier));
-    RETURN_ON_ERROR(right_.Init(right_node_identifier));
-    if (!min_key.empty()) {
-      RETURN_ON_ERROR(SkipIteratorsTo(min_key));
-    }
-    Normalize();
-    if (!Finished() && !HasDiff()) {
-      RETURN_ON_ERROR(Advance());
-    }
-
-    return Status::OK;
-  }
-
-  bool Finished() const {
-    FXL_DCHECK(IsNormalized());
-    return right_.Finished();
-  }
-
-  // Send the actual diff to the client. Returns |false| if the iteration must
-  // be stopped.
-  bool SendDiff() {
-    FXL_DCHECK(HasDiff());
-
-    // If the 2 iterators are on 2 equals values, nothing to do.
-    if (left_.HasValue() && right_.HasValue() &&
-        left_.CurrentEntry() == right_.CurrentEntry()) {
-      return true;
-    }
-
-    if (HasSameNextChild()) {
-      // If the 2 iterators are on the same child, send a diff for each
-      // iterator that is currently on a value.
-      if (right_.HasValue()) {
-        if (!SendRight()) {
-          return false;
-        }
-      }
-      if (left_.HasValue() &&
-          (!right_.HasValue() ||
-           left_.CurrentEntry().key != right_.CurrentEntry().key)) {
-        if (!SendLeft()) {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    // Otherwise, just send the diff of the right node.
-    return SendRight();
-  }
-
-  // Advance the iterator until there is potentially a diff to send.
-  Status Advance() {
-    FXL_DCHECK(!Finished());
-    do {
-      FXL_DCHECK(IsNormalized());
-
-      // If the 2 next children are identical, skip these.
-      if (HasSameNextChild()) {
-        right_.SkipNextSubTree();
-        left_.SkipNextSubTree();
-        Normalize();
-        continue;
-      }
-
-      // If both iterators are sitting on a value for the same key, both need
-      // to be advanced.
-      if (right_.HasValue() && left_.HasValue() &&
-          right_.CurrentEntry().key == left_.CurrentEntry().key) {
-        RETURN_ON_ERROR(right_.Advance());
-        Swap();
-      }
-
-      RETURN_ON_ERROR(right_.Advance());
-      Normalize();
-    } while (!Finished() && !HasDiff());
-    return Status::OK;
-  }
-
- private:
-  // Advances the two iterators so that they are both in the first entry that 1)
-  // is greater than or equal to min_key and 2) might be different between the
-  // two iterators. We consider that the two entries might be different, if they
-  // are in btree nodes with different ids.
-  Status SkipIteratorsTo(fxl::StringView min_key) {
-    for (;;) {
-      if (left_.SkipToIndex(min_key)) {
-        right_.SkipTo(min_key);
-        return Status::OK;
-      }
-      if (right_.SkipToIndex(min_key)) {
-        left_.SkipToIndex(min_key);
-        return Status::OK;
-      }
-
-      auto left_child = left_.GetNextChild();
-      auto right_child = right_.GetNextChild();
-      if (!left_child) {
-        right_.SkipTo(min_key);
-        return Status::OK;
-      }
-      if (!right_child) {
-        left_.SkipTo(min_key);
-        return Status::OK;
-      }
-      if (left_child == right_child) {
-        return Status::OK;
-      }
-      // Same nodes might be in different depths of the btrees. Only descend in
-      // each if their current level is the same as or greater than the other
-      // one's.
-      uint8_t level_left = left_.GetLevel();
-      uint8_t level_right = right_.GetLevel();
-      if (level_left >= level_right) {
-        RETURN_ON_ERROR(left_.Advance());
-      }
-      if (level_right >= level_left) {
-        RETURN_ON_ERROR(right_.Advance());
-      }
-    }
-  }
-
-  // Ensure that the representation of the pair of iterator is normalized
-  // according to the following rules:
-  // If only one iterator is finished, it is always the left one.
-  // If only one iterator is on a value, it is always the left one.
-  // If both iterator are on a value, the left one has a key greater or equals
-  //     to the right one, and if the keys are equals, the iterator are in
-  //     their original order.
-  // If none of the iterators is on a value, the right one has a level
-  //     greather or equals to the left one.
-  //
-  // When the iterator is normalized, the different algorithms can cut the
-  // number of case it needs to consider.
-  void Normalize() {
-    if (left_.Finished()) {
-      return;
-    }
-    if (right_.Finished()) {
-      Swap();
-      return;
-    }
-
-    if (right_.HasValue() && left_.HasValue()) {
-      if (left_.CurrentEntry().key < right_.CurrentEntry().key) {
-        Swap();
-        return;
-      }
-      if (left_.CurrentEntry().key == right_.CurrentEntry().key) {
-        ResetSwap();
-      }
-      return;
-    }
-
-    if (left_.HasValue()) {
-      return;
-    }
-    if (right_.HasValue()) {
-      Swap();
-      return;
-    }
-
-    if (left_.GetLevel() > right_.GetLevel()) {
-      Swap();
-    }
-  }
-
-  // Returns if the iterator is normalized. See |Normalize| for the
-  // definition. This is only used in DCHECKs.
-  bool IsNormalized() const {
-    if (left_.Finished() || right_.Finished()) {
-      return left_.Finished();
-    }
-
-    if (left_.HasValue()) {
-      if (!right_.HasValue()) {
-        return true;
-      }
-
-      if (right_.CurrentEntry().key > left_.CurrentEntry().key) {
-        return false;
-      }
-
-      if (right_.CurrentEntry().key == left_.CurrentEntry().key) {
-        if (!diff_from_left_to_right_)
-          return diff_from_left_to_right_;
-      }
-
-      return true;
-    }
-
-    if (right_.HasValue()) {
-      return false;
-    }
-
-    return right_.GetLevel() >= left_.GetLevel();
-  }
-
-  // Returns whether there is a potential diff to send at the current state.
-  bool HasDiff() const {
-    FXL_DCHECK(IsNormalized());
-    return (right_.HasValue() && (left_.Finished() || left_.HasValue())) ||
-           (left_.HasValue() && HasSameNextChild());
-  }
-
-  // Returns whether the 2 iterators have the same next child in the
-  // iteration. This allows to skip part of the 2 btrees when they are
-  // identicals.
-  bool HasSameNextChild() const {
-    if (left_.Finished()) {
-      return false;
-    }
-    auto right_child = right_.GetNextChild();
-    if (!right_child) {
-      return false;
-    }
-    auto left_child = left_.GetNextChild();
-    if (!left_child) {
-      return false;
-    }
-    return *right_child == *left_child;
-  }
-
-  // Swaps the 2 iterators. This is useful to reduce the number of case to
-  // consider during the iteration.
-  void Swap() {
-    std::swap(left_, right_);
-    diff_from_left_to_right_ = !diff_from_left_to_right_;
-  }
-
-  // Reset the iterators so that they are back in the original order.
-  void ResetSwap() {
-    if (!diff_from_left_to_right_) {
-      Swap();
-    }
-  }
-
-  // Send a diff using the right iterator.
-  bool SendRight() { return Send(&right_, &left_, !diff_from_left_to_right_); }
-
-  // Send a diff using the left iterator.
-  bool SendLeft() { return Send(&left_, &right_, diff_from_left_to_right_); }
-
-  bool Send(BTreeIterator* it1, BTreeIterator* it2, bool it1_to_it2) {
-    std::unique_ptr<Entry> it1_entry, it2_entry;
-    it1_entry = std::make_unique<Entry>(it1->CurrentEntry());
-    if (!it2->Finished() && it2->HasValue() &&
-        it1->CurrentEntry().key == it2->CurrentEntry().key) {
-      it2_entry = std::make_unique<Entry>(it2->CurrentEntry());
-    }
-
-    if (it1_to_it2) {
-      return on_next_(std::move(it1_entry), std::move(it2_entry));
-    }
-    return on_next_(std::move(it2_entry), std::move(it1_entry));
-  }
-
-  fit::function<bool(std::unique_ptr<Entry>, std::unique_ptr<Entry>)> on_next_;
-  BTreeIterator left_;
-  BTreeIterator right_;
-  // Keep track whether the change is from left to right, or right to left.
-  // This allows to switch left and right during the algorithm to handle less
-  // cases.
-  bool diff_from_left_to_right_ = true;
-};
-
-// Iterator that does a three-way diff by using two IteratorPair objects in
-// parallel.
-// Here is an attempt to convey what this iterator should be doing:
-// - It creates an IteratorPair (IP thereafter) for each side of the diff
-//   (base-to-left and base-to-right).
-// - At the initialization time, it advances each internal IP to their first
-//   diff. Each IP (as viewed from here) is on one key: the key of the latest
-//   diff it returned.
-// - We always advance the IP with the lowest key, or the one not finished yet.
-//   If both are on the same key, we advance both.
-// - The current key considered by the ThreeWayIterator is the lowest key of the
-//   latest left and right diffs. If one IP is finished, then the current key is
-//   the key of the other IP's diff.
-// - When sending the ThreeWayIterator diff, we consider the current key (per
-//   above). If both IPs are on the same key, the diff is easy (we just send
-//   everything). However, if the IPs are on different keys, or one of them is
-//   finished, we have to consider multiple cases:
-//   - If the base entry is present, it means the key/value was present in the
-//     base revision. Given that the other IP moved past this key, there is no
-//     diff on that side and we copy the base entry to that side entry within
-//     the tree-way diff change.
-//   - If the base entry is not present, it means the key/value was not present
-//     in the base revision and it is an addition.
-class ThreeWayIterator {
- public:
-  explicit ThreeWayIterator(SynchronousStorage* storage) {
-    base_left_iterators_ = std::make_unique<IteratorPair>(
-        storage,
-        [this](std::unique_ptr<Entry> base, std::unique_ptr<Entry> left) {
-          left_advanced_ = true;
-          base_left_.swap(base);
-          left_.swap(left);
-          return true;
-        });
-    base_right_iterators_ = std::make_unique<IteratorPair>(
-        storage,
-        [this](std::unique_ptr<Entry> base, std::unique_ptr<Entry> right) {
-          right_advanced_ = true;
-          base_right_.swap(base);
-          right_.swap(right);
-          return true;
-        });
-  }
-
-  Status Init(ObjectIdentifier base_node_identifier,
-              ObjectIdentifier left_node_identifier,
-              ObjectIdentifier right_node_identifier, fxl::StringView min_key) {
-    RETURN_ON_ERROR(base_left_iterators_->Init(base_node_identifier,
-                                               left_node_identifier, min_key));
-    RETURN_ON_ERROR(base_right_iterators_->Init(
-        base_node_identifier, right_node_identifier, min_key));
-    if (!Finished()) {
-      RETURN_ON_ERROR(AdvanceLeft());
-      RETURN_ON_ERROR(AdvanceRight());
-    }
-    return Status::OK;
-  }
-
-  bool Finished() const {
-    return base_left_iterators_->Finished() &&
-           base_right_iterators_->Finished() && !base_left_ && !left_ &&
-           !base_right_ && !right_;
-  }
-
-  Status Advance() {
-    FXL_DCHECK(!Finished());
-    if (base_left_iterators_->Finished() && !base_left_ && !left_) {
-      RETURN_ON_ERROR(AdvanceRight());
-    } else if (base_right_iterators_->Finished() && !base_right_ && !right_) {
-      RETURN_ON_ERROR(AdvanceLeft());
-    } else if (GetLeftKey() < GetRightKey()) {
-      RETURN_ON_ERROR(AdvanceLeft());
-    } else if (GetLeftKey() > GetRightKey()) {
-      RETURN_ON_ERROR(AdvanceRight());
-    } else {
-      RETURN_ON_ERROR(AdvanceLeft());
-      RETURN_ON_ERROR(AdvanceRight());
-    }
-    return Status::OK;
-  }
-
-  ThreeWayChange GetCurrentDiff() {
-    FXL_DCHECK(!Finished());
-    ThreeWayChange change;
-    change.base = GetBase();
-    change.left = GetEntry(change.base, base_left_iterators_, left_, right_);
-    change.right = GetEntry(change.base, base_right_iterators_, right_, left_);
-    return change;
-  }
-
- private:
-  // GetLeftKey (resp. GetRightKey) should not be called if the left (resp.
-  // right) IteratorPair is finished.
-  const std::string& GetLeftKey() {
-    FXL_DCHECK(base_left_ || left_);
-    if (base_left_) {
-      return base_left_->key;
-    }
-    return left_->key;
-  }
-
-  const std::string& GetRightKey() {
-    FXL_DCHECK(base_right_ || right_);
-    if (base_right_) {
-      return base_right_->key;
-    }
-    return right_->key;
-  }
-
-  Status AdvanceLeft() {
-    left_advanced_ = false;
-    while (!base_left_iterators_->Finished() && !left_advanced_) {
-      if (!base_left_iterators_->SendDiff()) {
-        return Status::OK;
-      }
-      RETURN_ON_ERROR(base_left_iterators_->Advance());
-    }
-    if (!left_advanced_ && base_left_iterators_->Finished()) {
-      base_left_.reset();
-      left_.reset();
-    }
-    return Status::OK;
-  }
-
-  Status AdvanceRight() {
-    right_advanced_ = false;
-    while (!base_right_iterators_->Finished() && !right_advanced_) {
-      if (!base_right_iterators_->SendDiff()) {
-        return Status::OK;
-      }
-      RETURN_ON_ERROR(base_right_iterators_->Advance());
-    }
-    if (!right_advanced_ && base_right_iterators_->Finished()) {
-      base_right_.reset();
-      right_.reset();
-    }
-    return Status::OK;
-  }
-
-  std::unique_ptr<Entry> GetBase() {
-    if (base_left_ && base_right_) {
-      if (base_left_->key < base_right_->key) {
-        return std::make_unique<Entry>(*base_left_);
-      }
-      return std::make_unique<Entry>(*base_right_);
-    }
-    if (!base_right_ && base_left_ &&
-        (!right_ || base_left_->key < right_->key)) {
-      return std::make_unique<Entry>(*base_left_);
-    }
-    if (!base_left_ && base_right_ &&
-        (!left_ || base_right_->key < left_->key)) {
-      return std::make_unique<Entry>(*base_right_);
-    }
-    return std::unique_ptr<Entry>();
-  }
-
-  std::unique_ptr<Entry> GetEntry(
-      const std::unique_ptr<Entry>& base,
-      const std::unique_ptr<IteratorPair>& this_iterator,
-      const std::unique_ptr<Entry>& this_entry,
-      const std::unique_ptr<Entry>& other_entry) {
-    if (base) {
-      if (this_entry && base->key == this_entry->key) {
-        return std::make_unique<Entry>(*this_entry);
-      }
-      if (this_entry && base->key < this_entry->key) {
-        return std::make_unique<Entry>(*base);
-      }
-      if (this_iterator->Finished()) {
-        return std::make_unique<Entry>(*base);
-      }
-      return std::unique_ptr<Entry>();
-    }
-    if (!this_entry || (other_entry && other_entry->key < this_entry->key)) {
-      return std::unique_ptr<Entry>();
-    }
-    return std::make_unique<Entry>(*this_entry);
-  }
-
-  bool left_advanced_ = false;
-  bool right_advanced_ = false;
-
-  std::unique_ptr<Entry> base_left_;
-  std::unique_ptr<Entry> base_right_;
-  std::unique_ptr<Entry> left_;
-  std::unique_ptr<Entry> right_;
-
-  std::unique_ptr<IteratorPair> base_left_iterators_;
-  std::unique_ptr<IteratorPair> base_right_iterators_;
-};
-
-Status ForEachDiffInternal(SynchronousStorage* storage,
-                           ObjectIdentifier left_node_identifier,
-                           ObjectIdentifier right_node_identifier,
-                           std::string min_key,
-                           fit::function<bool(EntryChange)> on_next) {
-  FXL_DCHECK(storage::IsDigestValid(left_node_identifier.object_digest()));
-  FXL_DCHECK(storage::IsDigestValid(right_node_identifier.object_digest()));
-
-  if (left_node_identifier == right_node_identifier) {
-    return Status::OK;
-  }
-
-  auto wrapped_next = [on_next = std::move(on_next)](
-                          std::unique_ptr<Entry> base,
-                          std::unique_ptr<Entry> other) {
-    if (other) {
-      return on_next({std::move(*other), false});
-    }
-    return on_next({std::move(*base), true});
-  };
-
-  IteratorPair iterators(storage, std::move(wrapped_next));
-  RETURN_ON_ERROR(
-      iterators.Init(left_node_identifier, right_node_identifier, min_key));
-
-  while (!iterators.Finished()) {
-    if (!iterators.SendDiff()) {
-      return Status::OK;
-    }
-    RETURN_ON_ERROR(iterators.Advance());
-  }
-
-  return Status::OK;
-}  // namespace
-
-Status ForEachThreeWayDiffInternal(
-    SynchronousStorage* storage, ObjectIdentifier base_node_identifier,
-    ObjectIdentifier left_node_identifier,
-    ObjectIdentifier right_node_identifier, std::string min_key,
-    fit::function<bool(ThreeWayChange)> on_next) {
-  FXL_DCHECK(IsDigestValid(base_node_identifier.object_digest()));
-  FXL_DCHECK(IsDigestValid(left_node_identifier.object_digest()));
-  FXL_DCHECK(IsDigestValid(right_node_identifier.object_digest()));
-
-  if (left_node_identifier == right_node_identifier) {
-    return Status::OK;
-  }
-
-  ThreeWayIterator iterator(storage);
-  RETURN_ON_ERROR(iterator.Init(base_node_identifier, left_node_identifier,
-                                right_node_identifier, min_key));
-
-  while (!iterator.Finished()) {
-    if (!on_next(iterator.GetCurrentDiff())) {
-      return Status::OK;
-    }
-    RETURN_ON_ERROR(iterator.Advance());
-  }
-
-  return Status::OK;
-}
-
-}  // namespace
-
-void ForEachDiff(coroutine::CoroutineService* coroutine_service,
-                 PageStorage* page_storage,
-                 ObjectIdentifier base_root_identifier,
-                 ObjectIdentifier other_root_identifier, std::string min_key,
-                 fit::function<bool(EntryChange)> on_next,
-                 fit::function<void(Status)> on_done) {
-  FXL_DCHECK(storage::IsDigestValid(base_root_identifier.object_digest()));
-  FXL_DCHECK(storage::IsDigestValid(other_root_identifier.object_digest()));
-  coroutine_service->StartCoroutine(
-      [page_storage, base_root_identifier = std::move(base_root_identifier),
-       other_root_identifier = std::move(other_root_identifier),
-       on_next = std::move(on_next), min_key = std::move(min_key),
-       on_done =
-           std::move(on_done)](coroutine::CoroutineHandler* handler) mutable {
-        SynchronousStorage storage(page_storage, handler);
-
-        on_done(ForEachDiffInternal(&storage, base_root_identifier,
-                                    other_root_identifier, std::move(min_key),
-                                    std::move(on_next)));
-      });
-}
-
-void ForEachThreeWayDiff(coroutine::CoroutineService* coroutine_service,
-                         PageStorage* page_storage,
-                         ObjectIdentifier base_root_identifier,
-                         ObjectIdentifier left_root_identifier,
-                         ObjectIdentifier right_root_identifier,
-                         std::string min_key,
-                         fit::function<bool(ThreeWayChange)> on_next,
-                         fit::function<void(Status)> on_done) {
-  FXL_DCHECK(storage::IsDigestValid(base_root_identifier.object_digest()));
-  FXL_DCHECK(storage::IsDigestValid(left_root_identifier.object_digest()));
-  FXL_DCHECK(storage::IsDigestValid(right_root_identifier.object_digest()));
-  coroutine_service->StartCoroutine(
-      [page_storage, base_root_identifier = std::move(base_root_identifier),
-       left_root_identifier = std::move(left_root_identifier),
-       right_root_identifier = std::move(right_root_identifier),
-       on_next = std::move(on_next), min_key = std::move(min_key),
-       on_done =
-           std::move(on_done)](coroutine::CoroutineHandler* handler) mutable {
-        SynchronousStorage storage(page_storage, handler);
-
-        on_done(ForEachThreeWayDiffInternal(
-            &storage, base_root_identifier, left_root_identifier,
-            right_root_identifier, std::move(min_key), std::move(on_next)));
-      });
-}
-
-}  // namespace btree
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/btree/diff.h b/bin/ledger/storage/impl/btree/diff.h
deleted file mode 100644
index c3e5aef..0000000
--- a/bin/ledger/storage/impl/btree/diff.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_DIFF_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_DIFF_H_
-
-#include <functional>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/storage/impl/btree/tree_node.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-namespace btree {
-
-// Iterates through the differences between two trees given their root ids
-// |base_root_id| and |other_root_id| and calls |on_next| on found differences.
-// Returning false from |on_next| will immediately stop the iteration. |on_done|
-// is called once, upon successfull completion, i.e. when there are no more
-// differences or iteration was interrupted, or if an error occurs.
-void ForEachDiff(coroutine::CoroutineService* coroutine_service,
-                 PageStorage* page_storage,
-                 ObjectIdentifier base_root_identifier,
-                 ObjectIdentifier other_root_identifier, std::string min_key,
-                 fit::function<bool(EntryChange)> on_next,
-                 fit::function<void(Status)> on_done);
-
-// Iterates through the differences between three trees given their root ids and
-// calls |on_next| if any difference is found between any pair.
-// Returning false from |on_next| will immediately stop the iteration. |on_done|
-// is called once, upon successful completion, i.e. when there are no more
-// differences or iteration was interrupted, or if an error occurs.
-void ForEachThreeWayDiff(coroutine::CoroutineService* coroutine_service,
-                         PageStorage* page_storage,
-                         ObjectIdentifier base_root_identifier,
-                         ObjectIdentifier left_root_identifier,
-                         ObjectIdentifier right_root_identifier,
-                         std::string min_key,
-                         fit::function<bool(ThreeWayChange)> on_next,
-                         fit::function<void(Status)> on_done);
-
-}  // namespace btree
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_DIFF_H_
diff --git a/bin/ledger/storage/impl/btree/diff_unittest.cc b/bin/ledger/storage/impl/btree/diff_unittest.cc
deleted file mode 100644
index 97630e0..0000000
--- a/bin/ledger/storage/impl/btree/diff_unittest.cc
+++ /dev/null
@@ -1,576 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/btree/diff.h"
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fxl/macros.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/storage/fake/fake_page_storage.h"
-#include "peridot/bin/ledger/storage/impl/btree/builder.h"
-#include "peridot/bin/ledger/storage/impl/btree/entry_change_iterator.h"
-#include "peridot/bin/ledger/storage/impl/storage_test_utils.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-namespace btree {
-namespace {
-std::unique_ptr<Entry> CreateEntryPtr(std::string key,
-                                      ObjectIdentifier object_identifier,
-                                      KeyPriority priority) {
-  auto e = std::make_unique<Entry>();
-  e->key = key;
-  e->object_identifier = std::move(object_identifier);
-  e->priority = priority;
-  return e;
-}
-
-std::unique_ptr<Entry> CreateEntryPtr() { return std::unique_ptr<Entry>(); }
-
-class FakePageStorageValidDigest : public fake::FakePageStorage {
- public:
-  using fake::FakePageStorage::FakePageStorage;
-
- protected:
-  ObjectDigest FakeDigest(fxl::StringView content) const override {
-    // BTree code needs storage to return valid digests.
-    return MakeObjectDigest(content.ToString());
-  }
-};
-
-class DiffTest : public StorageTest {
- public:
-  DiffTest() : fake_storage_(&environment_, "page_id") {}
-
-  ~DiffTest() override {}
-
-  // Test:
-  void SetUp() override {
-    StorageTest::SetUp();
-    std::srand(0);
-  }
-
- protected:
-  PageStorage* GetStorage() override { return &fake_storage_; }
-
-  ObjectIdentifier CreateTree(const std::vector<EntryChange>& entries) {
-    ObjectIdentifier root_identifier;
-    EXPECT_TRUE(GetEmptyNodeIdentifier(&root_identifier));
-
-    ObjectIdentifier identifier;
-    EXPECT_TRUE(CreateTreeFromChanges(root_identifier, entries, &identifier));
-    return identifier;
-  }
-
-  FakePageStorageValidDigest fake_storage_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(DiffTest);
-};
-
-TEST_F(DiffTest, ForEachDiff) {
-  std::unique_ptr<const Object> object;
-  ASSERT_TRUE(AddObject("change1", &object));
-  ObjectIdentifier object_identifier = object->GetIdentifier();
-
-  std::vector<EntryChange> base_changes;
-  ASSERT_TRUE(CreateEntryChanges(50, &base_changes));
-  ObjectIdentifier base_root_identifier = CreateTree(base_changes);
-
-  std::vector<EntryChange> other_changes;
-  // Update value for key1.
-  other_changes.push_back(
-      EntryChange{Entry{"key1", object_identifier, KeyPriority::LAZY}, false});
-  // Add entry key255.
-  other_changes.push_back(EntryChange{
-      Entry{"key255", object_identifier, KeyPriority::LAZY}, false});
-  // Remove entry key40.
-  other_changes.push_back(
-      EntryChange{Entry{"key40", {}, KeyPriority::LAZY}, true});
-  ObjectIdentifier other_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, other_changes,
-                                    &other_root_identifier));
-
-  // ForEachDiff should return all changes just applied.
-  bool called;
-  Status status;
-  size_t current_change = 0;
-  ForEachDiff(
-      environment_.coroutine_service(), &fake_storage_, base_root_identifier,
-      other_root_identifier, "",
-      [&other_changes, &current_change](EntryChange e) {
-        EXPECT_EQ(other_changes[current_change].deleted, e.deleted);
-        if (e.deleted) {
-          EXPECT_EQ(other_changes[current_change].entry.key, e.entry.key);
-        } else {
-          EXPECT_EQ(other_changes[current_change].entry, e.entry);
-        }
-        ++current_change;
-        return true;
-      },
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(other_changes.size(), current_change);
-}
-
-TEST_F(DiffTest, ForEachDiffWithMinKey) {
-  // Expected base tree layout (XX is key "keyXX"):
-  //                     [50]
-  //                   /     \
-  //       [03, 07, 30]      [65, 76]
-  //     /
-  // [01, 02]
-  std::vector<EntryChange> base_entries;
-  ASSERT_TRUE(CreateEntryChanges(
-      std::vector<size_t>({1, 2, 3, 7, 30, 50, 65, 76}), &base_entries));
-  // Expected other tree layout (XX is key "keyXX"):
-  //               [50, 75]
-  //             /    |    \
-  //    [03, 07, 30] [65]  [76]
-  //     /           /
-  // [01, 02]      [51]
-  std::vector<EntryChange> changes;
-  ASSERT_TRUE(CreateEntryChanges(std::vector<size_t>({51, 75}), &changes));
-
-  bool called;
-  Status status;
-  ObjectIdentifier base_root_identifier = CreateTree(base_entries);
-  ObjectIdentifier other_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, changes,
-                                    &other_root_identifier));
-
-  // ForEachDiff with a "key0" as min_key should return both changes.
-  size_t current_change = 0;
-  ForEachDiff(
-      environment_.coroutine_service(), &fake_storage_, base_root_identifier,
-      other_root_identifier, "key0",
-      [&changes, &current_change](EntryChange e) {
-        EXPECT_EQ(changes[current_change++].entry, e.entry);
-        return true;
-      },
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(changes.size(), current_change);
-
-  // With "key60" as min_key, only key75 should be returned.
-  ForEachDiff(
-      environment_.coroutine_service(), &fake_storage_, base_root_identifier,
-      other_root_identifier, "key60",
-      [&changes](EntryChange e) {
-        EXPECT_EQ(changes[1].entry, e.entry);
-        return true;
-      },
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-}
-
-TEST_F(DiffTest, ForEachDiffWithMinKeySkipNodes) {
-  // Expected base tree layout (XX is key "keyXX"):
-  //       [03, 07, 30]
-  //     /
-  // [01, 02]
-  std::vector<EntryChange> base_entries;
-  ASSERT_TRUE(
-      CreateEntryChanges(std::vector<size_t>({1, 2, 3, 7, 30}), &base_entries));
-  // Expected other tree layout (XX is key "keyXX"):
-  //               [50]
-  //             /
-  //    [03, 07, 30]
-  //     /
-  // [01, 02]
-  std::vector<EntryChange> changes;
-  ASSERT_TRUE(CreateEntryChanges(std::vector<size_t>({50}), &changes));
-
-  bool called;
-  Status status;
-  ObjectIdentifier base_root_identifier = CreateTree(base_entries);
-  ObjectIdentifier other_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, changes,
-                                    &other_root_identifier));
-
-  ForEachDiff(
-      environment_.coroutine_service(), &fake_storage_, base_root_identifier,
-      other_root_identifier, "key01",
-      [&changes](EntryChange e) {
-        EXPECT_EQ(changes[0].entry, e.entry);
-        return true;
-      },
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-}
-
-TEST_F(DiffTest, ForEachDiffPriorityChange) {
-  std::vector<EntryChange> base_changes;
-  ASSERT_TRUE(CreateEntryChanges(50, &base_changes));
-  ObjectIdentifier base_root_identifier = CreateTree(base_changes);
-  Entry base_entry = base_changes[10].entry;
-
-  std::vector<EntryChange> other_changes;
-  // Update priority for a key.
-  other_changes.push_back(EntryChange{
-      Entry{base_entry.key, base_entry.object_identifier, KeyPriority::LAZY},
-      false});
-
-  bool called;
-  Status status;
-  ObjectIdentifier other_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, other_changes,
-                                    &other_root_identifier));
-
-  // ForEachDiff should return all changes just applied.
-  size_t change_count = 0;
-  EntryChange actual_change;
-  ForEachDiff(
-      environment_.coroutine_service(), &fake_storage_, base_root_identifier,
-      other_root_identifier, "",
-      [&actual_change, &change_count](EntryChange e) {
-        actual_change = e;
-        ++change_count;
-        return true;
-      },
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(1u, change_count);
-  EXPECT_FALSE(actual_change.deleted);
-  EXPECT_EQ(base_entry.key, actual_change.entry.key);
-  EXPECT_EQ(base_entry.object_identifier,
-            actual_change.entry.object_identifier);
-  EXPECT_EQ(KeyPriority::LAZY, actual_change.entry.priority);
-}
-
-TEST_F(DiffTest, ForEachThreeWayDiff) {
-  // Base tree.
-  std::vector<EntryChange> base_changes;
-  ASSERT_TRUE(CreateEntryChanges(50, &base_changes));
-  ObjectIdentifier base_object01_identifier =
-      base_changes[1].entry.object_identifier;
-  ObjectIdentifier base_object02_identifier =
-      base_changes[2].entry.object_identifier;
-  ObjectIdentifier base_object40_identifier =
-      base_changes[40].entry.object_identifier;
-  ObjectIdentifier base_root_identifier = CreateTree(base_changes);
-
-  std::unique_ptr<const Object> object;
-  ASSERT_TRUE(AddObject("change1", &object));
-  ObjectIdentifier object_identifier = object->GetIdentifier();
-
-  // Left tree.
-  std::vector<EntryChange> left_changes;
-  // Update value for key1.
-  left_changes.push_back(
-      EntryChange{Entry{"key01", object_identifier, KeyPriority::LAZY}, false});
-  // Add entry key255.
-  left_changes.push_back(EntryChange{
-      Entry{"key255", object_identifier, KeyPriority::LAZY}, false});
-  // Remove entry key40.
-  left_changes.push_back(
-      EntryChange{Entry{"key40", {}, KeyPriority::LAZY}, true});
-
-  ObjectIdentifier left_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, left_changes,
-                                    &left_root_identifier));
-
-  // Right tree.
-  std::unique_ptr<const Object> object2;
-  ASSERT_TRUE(AddObject("change2", &object2));
-  ObjectIdentifier object_identifier2 = object2->GetIdentifier();
-  std::vector<EntryChange> right_changes;
-  // Update to same value for key1.
-  right_changes.push_back(
-      EntryChange{Entry{"key01", object_identifier, KeyPriority::LAZY}, false});
-  // Update to different value for key2
-  right_changes.push_back(EntryChange{
-      Entry{"key02", object_identifier2, KeyPriority::LAZY}, false});
-  // Add entry key258.
-  right_changes.push_back(EntryChange{
-      Entry{"key258", object_identifier, KeyPriority::LAZY}, false});
-
-  ObjectIdentifier right_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, right_changes,
-                                    &right_root_identifier));
-
-  std::vector<ThreeWayChange> expected_three_way_changes;
-  expected_three_way_changes.push_back(ThreeWayChange{
-      CreateEntryPtr("key01", base_object01_identifier, KeyPriority::EAGER),
-      CreateEntryPtr("key01", object_identifier, KeyPriority::LAZY),
-      CreateEntryPtr("key01", object_identifier, KeyPriority::LAZY)});
-  expected_three_way_changes.push_back(ThreeWayChange{
-      CreateEntryPtr("key02", base_object02_identifier, KeyPriority::EAGER),
-      CreateEntryPtr("key02", base_object02_identifier, KeyPriority::EAGER),
-      CreateEntryPtr("key02", object_identifier2, KeyPriority::LAZY)});
-  expected_three_way_changes.push_back(ThreeWayChange{
-      CreateEntryPtr(),
-      CreateEntryPtr("key255", object_identifier, KeyPriority::LAZY),
-      CreateEntryPtr()});
-  expected_three_way_changes.push_back(ThreeWayChange{
-      CreateEntryPtr(), CreateEntryPtr(),
-      CreateEntryPtr("key258", object_identifier, KeyPriority::LAZY)});
-  expected_three_way_changes.push_back(ThreeWayChange{
-      CreateEntryPtr("key40", base_object40_identifier, KeyPriority::EAGER),
-      CreateEntryPtr(),
-      CreateEntryPtr("key40", base_object40_identifier, KeyPriority::EAGER)});
-
-  bool called;
-  Status status;
-  unsigned int current_change = 0;
-  ForEachThreeWayDiff(
-      environment_.coroutine_service(), &fake_storage_, base_root_identifier,
-      left_root_identifier, right_root_identifier, "",
-      [&expected_three_way_changes, &current_change](ThreeWayChange e) {
-        EXPECT_LT(current_change, expected_three_way_changes.size());
-        if (current_change >= expected_three_way_changes.size()) {
-          return false;
-        }
-        EXPECT_EQ(expected_three_way_changes[current_change], e);
-        current_change++;
-        return true;
-      },
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(current_change, expected_three_way_changes.size());
-}
-
-TEST_F(DiffTest, ForEachThreeWayDiffMinKey) {
-  // Base tree.
-  std::vector<EntryChange> base_changes;
-  ASSERT_TRUE(CreateEntryChanges(50, &base_changes));
-  ObjectIdentifier base_object01_identifier =
-      base_changes[1].entry.object_identifier;
-  ObjectIdentifier base_object02_identifier =
-      base_changes[2].entry.object_identifier;
-  ObjectIdentifier base_object40_identifier =
-      base_changes[40].entry.object_identifier;
-  ObjectIdentifier base_root_identifier = CreateTree(base_changes);
-
-  std::unique_ptr<const Object> object;
-  ASSERT_TRUE(AddObject("change1", &object));
-  ObjectIdentifier object_identifier = object->GetIdentifier();
-
-  // Left tree.
-  std::vector<EntryChange> left_changes;
-  // Update value for key1.
-  left_changes.push_back(
-      EntryChange{Entry{"key01", object_identifier, KeyPriority::LAZY}, false});
-  // Add entry key255.
-  left_changes.push_back(EntryChange{
-      Entry{"key255", object_identifier, KeyPriority::LAZY}, false});
-  // Remove entry key40.
-  left_changes.push_back(
-      EntryChange{Entry{"key40", {}, KeyPriority::LAZY}, true});
-
-  ObjectIdentifier left_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, left_changes,
-                                    &left_root_identifier));
-
-  // Right tree.
-  std::unique_ptr<const Object> object2;
-  ASSERT_TRUE(AddObject("change2", &object2));
-  ObjectIdentifier object_identifier2 = object2->GetIdentifier();
-  std::vector<EntryChange> right_changes;
-  // Update to same value for key1.
-  right_changes.push_back(
-      EntryChange{Entry{"key01", object_identifier, KeyPriority::LAZY}, false});
-  // Update to different value for key2
-  right_changes.push_back(EntryChange{
-      Entry{"key02", object_identifier2, KeyPriority::LAZY}, false});
-  // Add entry key258.
-  right_changes.push_back(EntryChange{
-      Entry{"key258", object_identifier, KeyPriority::LAZY}, false});
-
-  ObjectIdentifier right_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, right_changes,
-                                    &right_root_identifier));
-
-  std::vector<ThreeWayChange> expected_three_way_changes;
-  expected_three_way_changes.push_back(ThreeWayChange{
-      CreateEntryPtr(), CreateEntryPtr(),
-      CreateEntryPtr("key258", object_identifier, KeyPriority::LAZY)});
-  expected_three_way_changes.push_back(ThreeWayChange{
-      CreateEntryPtr("key40", base_object40_identifier, KeyPriority::EAGER),
-      CreateEntryPtr(),
-      CreateEntryPtr("key40", base_object40_identifier, KeyPriority::EAGER)});
-
-  bool called;
-  Status status;
-  unsigned int current_change = 0;
-  ForEachThreeWayDiff(
-      environment_.coroutine_service(), &fake_storage_, base_root_identifier,
-      left_root_identifier, right_root_identifier, "key257",
-      [&expected_three_way_changes, &current_change](ThreeWayChange e) {
-        EXPECT_LT(current_change, expected_three_way_changes.size());
-        if (current_change >= expected_three_way_changes.size()) {
-          return false;
-        }
-        EXPECT_EQ(expected_three_way_changes[current_change], e);
-        current_change++;
-        return true;
-      },
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(current_change, expected_three_way_changes.size());
-}
-
-TEST_F(DiffTest, ForEachThreeWayDiffNoDiff) {
-  // Base tree.
-  std::vector<EntryChange> base_changes;
-  ASSERT_TRUE(CreateEntryChanges(50, &base_changes));
-  ObjectIdentifier base_object01_identifier =
-      base_changes[1].entry.object_identifier;
-  ObjectIdentifier base_object02_identifier =
-      base_changes[2].entry.object_identifier;
-  ObjectIdentifier base_object40_identifier =
-      base_changes[40].entry.object_identifier;
-  ObjectIdentifier base_root_identifier = CreateTree(base_changes);
-
-  std::unique_ptr<const Object> object;
-  ASSERT_TRUE(AddObject("change1", &object));
-  ObjectIdentifier object_identifier = object->GetIdentifier();
-
-  // Left tree.
-  std::vector<EntryChange> left_changes;
-  // Update value for key1.
-  left_changes.push_back(
-      EntryChange{Entry{"key01", object_identifier, KeyPriority::LAZY}, false});
-  // Add entry key255.
-  left_changes.push_back(EntryChange{
-      Entry{"key255", object_identifier, KeyPriority::LAZY}, false});
-  // Remove entry key40.
-  left_changes.push_back(
-      EntryChange{Entry{"key40", {}, KeyPriority::LAZY}, true});
-
-  ObjectIdentifier left_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, left_changes,
-                                    &left_root_identifier));
-
-  // Right tree.
-  std::unique_ptr<const Object> object2;
-  ASSERT_TRUE(AddObject("change2", &object2));
-  ObjectIdentifier object_identifier2 = object2->GetIdentifier();
-  std::vector<EntryChange> right_changes;
-  // Update to same value for key1.
-  right_changes.push_back(
-      EntryChange{Entry{"key01", object_identifier, KeyPriority::LAZY}, false});
-  // Update to different value for key2
-  right_changes.push_back(EntryChange{
-      Entry{"key02", object_identifier2, KeyPriority::LAZY}, false});
-  // Add entry key258.
-  right_changes.push_back(EntryChange{
-      Entry{"key258", object_identifier, KeyPriority::LAZY}, false});
-
-  ObjectIdentifier right_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, right_changes,
-                                    &right_root_identifier));
-
-  bool called;
-  Status status;
-  // No change is expected.
-  ForEachThreeWayDiff(
-      environment_.coroutine_service(), &fake_storage_, base_root_identifier,
-      left_root_identifier, right_root_identifier, "key5",
-      [](ThreeWayChange e) {
-        ADD_FAILURE();
-        return true;
-      },
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-}
-
-TEST_F(DiffTest, ForEachThreeWayNoBaseChange) {
-  // Base tree.
-  std::vector<EntryChange> base_changes;
-  ObjectIdentifier base_root_identifier = CreateTree(base_changes);
-
-  std::unique_ptr<const Object> object1, object2, object3, object4;
-  ASSERT_TRUE(AddObject("change1", &object1));
-  ObjectIdentifier object1_identifier = object1->GetIdentifier();
-  ASSERT_TRUE(AddObject("change2", &object2));
-  ObjectIdentifier object2_identifier = object2->GetIdentifier();
-  ASSERT_TRUE(AddObject("change3", &object3));
-  ObjectIdentifier object3_identifier = object3->GetIdentifier();
-  ASSERT_TRUE(AddObject("change4", &object4));
-  ObjectIdentifier object4_identifier = object4->GetIdentifier();
-
-  // Left tree.
-  std::vector<EntryChange> left_changes;
-  left_changes.push_back(EntryChange{
-      Entry{"key01", object1_identifier, KeyPriority::EAGER}, false});
-  left_changes.push_back(EntryChange{
-      Entry{"key03", object3_identifier, KeyPriority::EAGER}, false});
-
-  ObjectIdentifier left_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, left_changes,
-                                    &left_root_identifier));
-
-  // Right tree.
-  std::vector<EntryChange> right_changes;
-  right_changes.push_back(EntryChange{
-      Entry{"key02", object2_identifier, KeyPriority::EAGER}, false});
-  right_changes.push_back(EntryChange{
-      Entry{"key04", object4_identifier, KeyPriority::EAGER}, false});
-
-  ObjectIdentifier right_root_identifier;
-  ASSERT_TRUE(CreateTreeFromChanges(base_root_identifier, right_changes,
-                                    &right_root_identifier));
-
-  std::vector<ThreeWayChange> expected_three_way_changes;
-  expected_three_way_changes.push_back(ThreeWayChange{
-      CreateEntryPtr(),
-      CreateEntryPtr("key01", object1_identifier, KeyPriority::EAGER),
-      CreateEntryPtr()});
-  expected_three_way_changes.push_back(ThreeWayChange{
-      CreateEntryPtr(), CreateEntryPtr(),
-      CreateEntryPtr("key02", object2_identifier, KeyPriority::EAGER)});
-  expected_three_way_changes.push_back(ThreeWayChange{
-      CreateEntryPtr(),
-      CreateEntryPtr("key03", object3_identifier, KeyPriority::EAGER),
-      CreateEntryPtr()});
-  expected_three_way_changes.push_back(ThreeWayChange{
-      CreateEntryPtr(), CreateEntryPtr(),
-      CreateEntryPtr("key04", object4_identifier, KeyPriority::EAGER)});
-
-  bool called;
-  Status status;
-  unsigned int current_change = 0;
-  ForEachThreeWayDiff(
-      environment_.coroutine_service(), &fake_storage_, base_root_identifier,
-      left_root_identifier, right_root_identifier, "",
-      [&expected_three_way_changes, &current_change](ThreeWayChange e) {
-        EXPECT_LT(current_change, expected_three_way_changes.size());
-        if (current_change >= expected_three_way_changes.size()) {
-          return false;
-        }
-        EXPECT_EQ(expected_three_way_changes[current_change], e);
-        current_change++;
-        return true;
-      },
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  EXPECT_EQ(current_change, expected_three_way_changes.size());
-}
-
-}  // namespace
-}  // namespace btree
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/btree/encoding.cc b/bin/ledger/storage/impl/btree/encoding.cc
deleted file mode 100644
index b5a1855..0000000
--- a/bin/ledger/storage/impl/btree/encoding.cc
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/btree/encoding.h"
-
-#include <algorithm>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/ledger/storage/impl/btree/tree_node_generated.h"
-#include "peridot/bin/ledger/storage/impl/object_identifier_encoding.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace storage {
-namespace btree {
-namespace {
-KeyPriority ToKeyPriority(KeyPriorityStorage priority_storage) {
-  switch (priority_storage) {
-    case KeyPriorityStorage_EAGER:
-      return KeyPriority::EAGER;
-    case KeyPriorityStorage_LAZY:
-      return KeyPriority::LAZY;
-  }
-}
-
-bool IsKeyPriorityStorageValid(KeyPriorityStorage priority_storage) {
-  return priority_storage == KeyPriorityStorage_EAGER ||
-    priority_storage == KeyPriorityStorage_LAZY;
-}
-
-KeyPriorityStorage ToKeyPriorityStorage(KeyPriority priority) {
-  switch (priority) {
-    case KeyPriority::EAGER:
-      return KeyPriorityStorage_EAGER;
-    case KeyPriority::LAZY:
-      return KeyPriorityStorage_LAZY;
-  }
-}
-
-bool IsTreeNodeEntryValid(const EntryStorage* entry) {
-  return entry && entry->key() &&
-         IsObjectIdentifierStorageValid(entry->object_id()) &&
-         IsKeyPriorityStorageValid(entry->priority());
-}
-
-Entry ToEntry(const EntryStorage* entry_storage) {
-  FXL_DCHECK(IsTreeNodeEntryValid(entry_storage));
-  return Entry{convert::ToString(entry_storage->key()),
-               ToObjectIdentifier(entry_storage->object_id()),
-               ToKeyPriority(entry_storage->priority())};
-}
-}  // namespace
-
-bool CheckValidTreeNodeSerialization(fxl::StringView data) {
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(data.data()), data.size());
-  if (!VerifyTreeNodeStorageBuffer(verifier)) {
-    return false;
-  }
-
-  const TreeNodeStorage* tree_node =
-      GetTreeNodeStorage(reinterpret_cast<const unsigned char*>(data.data()));
-
-  if (!tree_node->children() || !tree_node->entries()) {
-    return false;
-  }
-
-  if (tree_node->children()->size() > tree_node->entries()->size() + 1) {
-    return false;
-  }
-
-  // Check that the indexes are strictly increasing.
-  size_t expected_min_next_index = 0;
-  for (const auto* child : *(tree_node->children())) {
-    if (child->index() < expected_min_next_index) {
-      return false;
-    }
-    if (!IsObjectIdentifierStorageValid(child->object_id())) {
-      return false;
-    }
-    expected_min_next_index = child->index() + 1;
-  }
-
-  // Check that all index are in [0, tree_node->entries()->size()]
-  if (expected_min_next_index > tree_node->entries()->size() + 1) {
-    return false;
-  }
-
-  // Check that the first entry is correct.
-  if (tree_node->entries()->size() > 0) {
-    const auto* entry = *tree_node->entries()->begin();
-    if (!IsTreeNodeEntryValid(entry)) {
-      return false;
-    }
-  }
-  // Check that the rest of the entries are correct and that the keys are in
-  // order.
-  auto it = std::adjacent_find(
-      tree_node->entries()->begin(), tree_node->entries()->end(),
-      [](const auto* e1, const auto* e2) {
-        FXL_DCHECK(IsTreeNodeEntryValid(e1));
-        if (!IsTreeNodeEntryValid(e2)) {
-          return true;
-        }
-        return convert::ExtendedStringView(e1->key()) >=
-               convert::ExtendedStringView(e2->key());
-      });
-  return it == tree_node->entries()->end();
-}
-
-std::string EncodeNode(uint8_t level, const std::vector<Entry>& entries,
-                       const std::map<size_t, ObjectIdentifier>& children) {
-  flatbuffers::FlatBufferBuilder builder;
-
-  auto entries_offsets = builder.CreateVector(
-      entries.size(),
-      static_cast<std::function<flatbuffers::Offset<EntryStorage>(size_t)>>(
-          [&builder, &entries](size_t i) {
-            const auto& entry = entries[i];
-            return CreateEntryStorage(
-                builder, convert::ToFlatBufferVector(&builder, entry.key),
-                ToObjectIdentifierStorage(&builder, entry.object_identifier),
-                ToKeyPriorityStorage(entry.priority));
-          }));
-
-  size_t children_count = children.size();
-  auto current_children = children.begin();
-  auto children_offsets = builder.CreateVector(
-      children_count,
-      static_cast<std::function<flatbuffers::Offset<ChildStorage>(size_t)>>(
-          [&builder, &current_children](size_t i) {
-            size_t index = current_children->first;
-            auto object_identifier_storage =
-                ToObjectIdentifierStorage(&builder, current_children->second);
-            ++current_children;
-            return CreateChildStorage(builder, index,
-                                      object_identifier_storage);
-          }));
-
-  builder.Finish(
-      CreateTreeNodeStorage(builder, entries_offsets, children_offsets, level));
-
-  return std::string(reinterpret_cast<const char*>(builder.GetBufferPointer()),
-                     builder.GetSize());
-}
-
-bool DecodeNode(fxl::StringView data, uint8_t* level,
-                std::vector<Entry>* res_entries,
-                std::map<size_t, ObjectIdentifier>* res_children) {
-  if (!CheckValidTreeNodeSerialization(data)) {
-    return false;
-  }
-
-  const TreeNodeStorage* tree_node =
-      GetTreeNodeStorage(reinterpret_cast<const unsigned char*>(data.data()));
-
-  *level = tree_node->level();
-  res_entries->clear();
-  res_entries->reserve(tree_node->entries()->size());
-  for (const auto* entry_storage : *(tree_node->entries())) {
-    res_entries->push_back(ToEntry(entry_storage));
-  }
-  res_children->clear();
-  for (const auto* child_storage : *(tree_node->children())) {
-    (*res_children)[child_storage->index()] =
-        ToObjectIdentifier(child_storage->object_id());
-  }
-
-  return true;
-}
-}  // namespace btree
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/btree/encoding.h b/bin/ledger/storage/impl/btree/encoding.h
deleted file mode 100644
index 355c781..0000000
--- a/bin/ledger/storage/impl/btree/encoding.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_ENCODING_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_ENCODING_H_
-
-#include <map>
-#include <string>
-
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-namespace btree {
-
-bool CheckValidTreeNodeSerialization(fxl::StringView data);
-
-std::string EncodeNode(uint8_t level, const std::vector<Entry>& entries,
-                       const std::map<size_t, ObjectIdentifier>& children);
-
-bool DecodeNode(fxl::StringView data, uint8_t* level,
-                std::vector<Entry>* res_entries,
-                std::map<size_t, ObjectIdentifier>* res_children);
-
-}  // namespace btree
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_ENCODING_H_
diff --git a/bin/ledger/storage/impl/btree/encoding_fuzztest.cc b/bin/ledger/storage/impl/btree/encoding_fuzztest.cc
deleted file mode 100644
index 9f570e1..0000000
--- a/bin/ledger/storage/impl/btree/encoding_fuzztest.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/btree/encoding.h"
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "peridot/bin/ledger/storage/public/types.h"
-
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
-  std::string bytes(reinterpret_cast<const char *>(Data), Size);
-
-  if (storage::btree::CheckValidTreeNodeSerialization(bytes)) {
-    uint8_t res_level;
-    std::vector<storage::Entry> res_entries;
-    std::map<size_t, storage::ObjectIdentifier> res_children;
-    storage::btree::DecodeNode(bytes, &res_level, &res_entries, &res_children);
-  }
-  return 0;
-}
diff --git a/bin/ledger/storage/impl/btree/encoding_unittest.cc b/bin/ledger/storage/impl/btree/encoding_unittest.cc
deleted file mode 100644
index 7595eec..0000000
--- a/bin/ledger/storage/impl/btree/encoding_unittest.cc
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/btree/encoding.h"
-
-#include <lib/fit/function.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/storage/impl/btree/tree_node_generated.h"
-#include "peridot/bin/ledger/storage/impl/object_identifier_encoding.h"
-#include "peridot/bin/ledger/storage/impl/storage_test_utils.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-namespace storage {
-namespace btree {
-namespace {
-
-// Allows to create correct std::strings with \0 bytes inside from C-style
-// string constants.
-std::string operator"" _s(const char* str, size_t size) {
-  return std::string(str, size);
-}
-
-TEST(EncodingTest, EmptyData) {
-  uint8_t level = 0u;
-  std::vector<Entry> entries;
-  std::map<size_t, ObjectIdentifier> children;
-
-  std::string bytes = EncodeNode(level, entries, children);
-
-  uint8_t res_level;
-  std::vector<Entry> res_entries;
-  std::map<size_t, ObjectIdentifier> res_children;
-  EXPECT_TRUE(DecodeNode(bytes, &res_level, &res_entries, &res_children));
-  EXPECT_EQ(level, res_level);
-  EXPECT_EQ(entries, res_entries);
-  EXPECT_EQ(children, res_children);
-}
-
-TEST(EncodingTest, SingleEntry) {
-  uint8_t level = 1u;
-  std::vector<Entry> entries = {
-      {"key", MakeObjectIdentifier("object_digest"), KeyPriority::EAGER}};
-  std::map<size_t, ObjectIdentifier> children = {
-      {0u, MakeObjectIdentifier("child_1")},
-      {1u, MakeObjectIdentifier("child_2")}};
-
-  std::string bytes = EncodeNode(level, entries, children);
-
-  uint8_t res_level;
-  std::vector<Entry> res_entries;
-  std::map<size_t, ObjectIdentifier> res_children;
-  EXPECT_TRUE(DecodeNode(bytes, &res_level, &res_entries, &res_children));
-  EXPECT_EQ(level, res_level);
-  EXPECT_EQ(entries, res_entries);
-  EXPECT_EQ(children, res_children);
-}
-
-TEST(EncodingTest, MoreEntries) {
-  uint8_t level = 5;
-  std::vector<Entry> entries = {
-      {"key1", MakeObjectIdentifier("abc"), KeyPriority::EAGER},
-      {"key2", MakeObjectIdentifier("def"), KeyPriority::LAZY},
-      {"key3", MakeObjectIdentifier("geh"), KeyPriority::EAGER},
-      {"key4", MakeObjectIdentifier("ijk"), KeyPriority::LAZY}};
-  std::map<size_t, ObjectIdentifier> children = {
-      {0, MakeObjectIdentifier("child_1")},
-      {1, MakeObjectIdentifier("child_2")},
-      {2, MakeObjectIdentifier("child_3")},
-      {3, MakeObjectIdentifier("child_4")},
-      {4, MakeObjectIdentifier("child_5")}};
-
-  std::string bytes = EncodeNode(level, entries, children);
-
-  uint8_t res_level;
-  std::vector<Entry> res_entries;
-  std::map<size_t, ObjectIdentifier> res_children;
-  EXPECT_TRUE(DecodeNode(bytes, &res_level, &res_entries, &res_children));
-  EXPECT_EQ(level, res_level);
-  EXPECT_EQ(entries, res_entries);
-  EXPECT_EQ(children, res_children);
-}
-
-TEST(EncodingTest, SparsedEntriesWithBeginAndEnd) {
-  uint8_t level = 5;
-  std::vector<Entry> entries = {
-      {"key1", MakeObjectIdentifier("abc"), KeyPriority::EAGER},
-      {"key2", MakeObjectIdentifier("def"), KeyPriority::LAZY},
-      {"key3", MakeObjectIdentifier("geh"), KeyPriority::EAGER},
-      {"key4", MakeObjectIdentifier("ijk"), KeyPriority::LAZY}};
-  std::map<size_t, ObjectIdentifier> children = {
-      {0, MakeObjectIdentifier("child_1")},
-      {2, MakeObjectIdentifier("child_2")},
-      {4, MakeObjectIdentifier("child_3")}};
-
-  std::string bytes = EncodeNode(level, entries, children);
-
-  uint8_t res_level;
-  std::vector<Entry> res_entries;
-  std::map<size_t, ObjectIdentifier> res_children;
-  EXPECT_TRUE(DecodeNode(bytes, &res_level, &res_entries, &res_children));
-  EXPECT_EQ(level, res_level);
-  EXPECT_EQ(entries, res_entries);
-  EXPECT_EQ(children, res_children);
-}
-
-TEST(EncodingTest, SparsedEntriesWithoutBeginAndEnd) {
-  uint8_t level = 5;
-  std::vector<Entry> entries = {
-      {"key1", MakeObjectIdentifier("abc"), KeyPriority::EAGER},
-      {"key2", MakeObjectIdentifier("def"), KeyPriority::LAZY},
-      {"key3", MakeObjectIdentifier("geh"), KeyPriority::EAGER},
-      {"key4", MakeObjectIdentifier("ijk"), KeyPriority::LAZY}};
-  std::map<size_t, ObjectIdentifier> children = {
-      {1, MakeObjectIdentifier("child_1")},
-      {3, MakeObjectIdentifier("child_2")}};
-
-  std::string bytes = EncodeNode(level, entries, children);
-
-  uint8_t res_level;
-  std::vector<Entry> res_entries;
-  std::map<size_t, ObjectIdentifier> res_children;
-  EXPECT_TRUE(DecodeNode(bytes, &res_level, &res_entries, &res_children));
-  EXPECT_EQ(level, res_level);
-  EXPECT_EQ(entries, res_entries);
-  EXPECT_EQ(children, res_children);
-}
-
-TEST(EncodingTest, ZeroByte) {
-  uint8_t level = 13;
-  std::vector<Entry> entries = {
-      {"k\0ey"_s, MakeObjectIdentifier("\0a\0\0"_s), KeyPriority::EAGER}};
-  std::map<size_t, ObjectIdentifier> children = {
-      {0u, MakeObjectIdentifier("ch\0ld_1"_s)},
-      {1u, MakeObjectIdentifier("child_\0"_s)}};
-
-  std::string bytes = EncodeNode(level, entries, children);
-
-  uint8_t res_level;
-  std::vector<Entry> res_entries;
-  std::map<size_t, ObjectIdentifier> res_children;
-  EXPECT_TRUE(DecodeNode(bytes, &res_level, &res_entries, &res_children));
-  EXPECT_EQ(level, res_level);
-  EXPECT_EQ(entries, res_entries);
-  EXPECT_EQ(children, res_children);
-}
-
-std::string ToString(flatbuffers::FlatBufferBuilder* builder) {
-  return std::string(reinterpret_cast<const char*>(builder->GetBufferPointer()),
-                     builder->GetSize());
-}
-
-TEST(EncodingTest, Errors) {
-  flatbuffers::FlatBufferBuilder builder;
-
-  auto create_children = [&builder](size_t size) {
-    std::vector<flatbuffers::Offset<ChildStorage>> children;
-
-    for (size_t i = 0; i < size; ++i) {
-      children.push_back(CreateChildStorage(
-          builder, 1,
-          ToObjectIdentifierStorage(
-              &builder, MakeObjectIdentifier(fxl::StringPrintf("c%lu", i)))));
-    }
-    return builder.CreateVector(children);
-  };
-
-  // An empty string is not a valid serialization.
-  EXPECT_FALSE(CheckValidTreeNodeSerialization(""));
-
-  // 2 children without entries is not a valid serialization.
-  builder.Finish(CreateTreeNodeStorage(
-      builder,
-      builder.CreateVector(std::vector<flatbuffers::Offset<EntryStorage>>()),
-      create_children(2)));
-  EXPECT_FALSE(CheckValidTreeNodeSerialization(ToString(&builder)));
-
-  // A single child with index 1 is not a valid serialization.
-  builder.Clear();
-  builder.Finish(CreateTreeNodeStorage(
-      builder,
-      builder.CreateVector(std::vector<flatbuffers::Offset<EntryStorage>>()),
-      create_children(1)));
-  EXPECT_FALSE(CheckValidTreeNodeSerialization(ToString(&builder)));
-
-  // 2 children with the same index is not a valid serialization.
-  builder.Clear();
-  builder.Finish(CreateTreeNodeStorage(
-      builder,
-      builder.CreateVector(
-          1,
-          static_cast<std::function<flatbuffers::Offset<EntryStorage>(size_t)>>(
-              [&](size_t i) {
-                return CreateEntryStorage(
-                    builder, convert::ToFlatBufferVector(&builder, "hello"),
-                    ToObjectIdentifierStorage(&builder,
-                                              MakeObjectIdentifier("world")),
-                    KeyPriorityStorage::KeyPriorityStorage_EAGER);
-              })),
-      create_children(2)));
-  EXPECT_FALSE(CheckValidTreeNodeSerialization(ToString(&builder)));
-
-  // 2 entries not sorted.
-  builder.Clear();
-  builder.Finish(CreateTreeNodeStorage(
-      builder,
-      builder.CreateVector(
-          2,
-          static_cast<std::function<flatbuffers::Offset<EntryStorage>(size_t)>>(
-              [&](size_t i) {
-                return CreateEntryStorage(
-                    builder, convert::ToFlatBufferVector(&builder, "hello"),
-                    ToObjectIdentifierStorage(&builder,
-                                              MakeObjectIdentifier("world")),
-                    KeyPriorityStorage::KeyPriorityStorage_EAGER);
-              })),
-      create_children(0)));
-  EXPECT_FALSE(CheckValidTreeNodeSerialization(ToString(&builder)));
-}
-
-}  // namespace
-}  // namespace btree
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/btree/entry_change_iterator.h b/bin/ledger/storage/impl/btree/entry_change_iterator.h
deleted file mode 100644
index 9fd55df..0000000
--- a/bin/ledger/storage/impl/btree/entry_change_iterator.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_ENTRY_CHANGE_ITERATOR_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_ENTRY_CHANGE_ITERATOR_H_
-
-#include <vector>
-
-#include "peridot/bin/ledger/storage/public/iterator.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-namespace btree {
-
-class EntryChangeIterator : public Iterator<const storage::EntryChange> {
- public:
-  EntryChangeIterator(std::vector<EntryChange>::const_iterator it,
-                      std::vector<EntryChange>::const_iterator end)
-      : it_(it), end_(end) {}
-
-  ~EntryChangeIterator() override {}
-
-  Iterator<const storage::EntryChange>& Next() override {
-    FXL_DCHECK(Valid()) << "Iterator::Next iterator not valid";
-    ++it_;
-    return *this;
-  }
-
-  bool Valid() const override { return it_ != end_; }
-
-  Status GetStatus() const override { return Status::OK; }
-
-  const storage::EntryChange& operator*() const override { return *it_; }
-  const storage::EntryChange* operator->() const override { return &(*it_); }
-
- private:
-  std::vector<EntryChange>::const_iterator it_;
-  std::vector<EntryChange>::const_iterator end_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(EntryChangeIterator);
-};
-
-}  // namespace btree
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_ENTRY_CHANGE_ITERATOR_H_
diff --git a/bin/ledger/storage/impl/btree/internal_helper.cc b/bin/ledger/storage/impl/btree/internal_helper.cc
deleted file mode 100644
index aae70e0..0000000
--- a/bin/ledger/storage/impl/btree/internal_helper.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/btree/internal_helper.h"
-
-#include <algorithm>
-
-namespace storage {
-namespace btree {
-
-// Returns the index of |entries| that contains |key|, or the first entry that
-// has key greather than |key|. In the second case, the key, if present, will
-// be found in the children at the returned index.
-size_t GetEntryOrChildIndex(const std::vector<Entry>& entries,
-                            fxl::StringView key) {
-  auto lower = std::lower_bound(
-      entries.begin(), entries.end(), key,
-      [](const Entry& entry, fxl::StringView key) { return entry.key < key; });
-  FXL_DCHECK(lower == entries.end() || lower->key >= key);
-  return lower - entries.begin();
-}
-
-}  // namespace btree
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/btree/internal_helper.h b/bin/ledger/storage/impl/btree/internal_helper.h
deleted file mode 100644
index 16f00b6..0000000
--- a/bin/ledger/storage/impl/btree/internal_helper.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_INTERNAL_HELPER_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_INTERNAL_HELPER_H_
-
-#include <vector>
-
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/storage/public/types.h"
-
-#define RETURN_ON_ERROR(expr)   \
-  do {                          \
-    Status status = (expr);     \
-    if (status != Status::OK) { \
-      return status;            \
-    }                           \
-  } while (0)
-
-namespace storage {
-namespace btree {
-
-// Returns the index of |entries| that contains |key|, or the first entry that
-// has a key greather than |key|. In the second case, the key, if present, will
-// be found in the children at the returned index.
-size_t GetEntryOrChildIndex(const std::vector<Entry>& entries,
-                            fxl::StringView key);
-
-}  // namespace btree
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_INTERNAL_HELPER_H_
diff --git a/bin/ledger/storage/impl/btree/iterator.cc b/bin/ledger/storage/impl/btree/iterator.cc
deleted file mode 100644
index 0d48b4b..0000000
--- a/bin/ledger/storage/impl/btree/iterator.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/btree/iterator.h"
-
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/storage/impl/btree/internal_helper.h"
-
-namespace storage {
-namespace btree {
-
-namespace {
-
-Status ForEachEntryInternal(
-    SynchronousStorage* storage, ObjectIdentifier root_identifier,
-    fxl::StringView min_key,
-    fit::function<bool(EntryAndNodeIdentifier)> on_next) {
-  BTreeIterator iterator(storage);
-  RETURN_ON_ERROR(iterator.Init(root_identifier));
-  RETURN_ON_ERROR(iterator.SkipTo(min_key));
-  while (!iterator.Finished()) {
-    RETURN_ON_ERROR(iterator.AdvanceToValue());
-    if (iterator.HasValue()) {
-      if (!on_next({iterator.CurrentEntry(), iterator.GetIdentifier()})) {
-        return Status::OK;
-      }
-      RETURN_ON_ERROR(iterator.Advance());
-    }
-  }
-  return Status::OK;
-}
-
-}  // namespace
-
-BTreeIterator::BTreeIterator(SynchronousStorage* storage) : storage_(storage) {}
-
-BTreeIterator::BTreeIterator(BTreeIterator&& other) noexcept = default;
-
-BTreeIterator& BTreeIterator::operator=(BTreeIterator&& other) noexcept =
-    default;
-
-Status BTreeIterator::Init(ObjectIdentifier node_identifier) {
-  return Descend(node_identifier);
-}
-
-Status BTreeIterator::SkipTo(fxl::StringView min_key) {
-  descending_ = true;
-  for (;;) {
-    if (SkipToIndex(min_key)) {
-      return Status::OK;
-    }
-    auto next_child = GetNextChild();
-    if (!next_child) {
-      return Status::OK;
-    }
-    RETURN_ON_ERROR(Descend(*next_child));
-  }
-}
-
-bool BTreeIterator::SkipToIndex(fxl::StringView key) {
-  auto& entries = CurrentNode().entries();
-  size_t skip_count = GetEntryOrChildIndex(entries, key);
-  if (skip_count < CurrentIndex()) {
-    return true;
-  }
-  CurrentIndex() = skip_count;
-  if (CurrentIndex() < entries.size() && entries[CurrentIndex()].key == key) {
-    descending_ = false;
-    return true;
-  }
-  return false;
-}
-
-const ObjectIdentifier* BTreeIterator::GetNextChild() const {
-  auto index = CurrentIndex();
-  auto& children_identifiers = CurrentNode().children_identifiers();
-  auto children_index = descending_ ? index : index + 1;
-  auto it = children_identifiers.find(children_index);
-  return it == children_identifiers.end() ? nullptr : &(it->second);
-}
-
-bool BTreeIterator::HasValue() const {
-  return !stack_.empty() && !descending_ &&
-         CurrentIndex() < CurrentNode().entries().size();
-}
-
-bool BTreeIterator::Finished() const { return stack_.empty(); }
-
-const Entry& BTreeIterator::CurrentEntry() const {
-  FXL_DCHECK(HasValue());
-  return CurrentNode().entries()[CurrentIndex()];
-}
-
-const ObjectIdentifier& BTreeIterator::GetIdentifier() const {
-  return CurrentNode().GetIdentifier();
-}
-
-uint8_t BTreeIterator::GetLevel() const { return CurrentNode().level(); }
-
-Status BTreeIterator::Advance() {
-  if (descending_) {
-    auto child = GetNextChild();
-    if (!child) {
-      descending_ = false;
-      return Status::OK;
-    }
-    return Descend(*child);
-  }
-
-  auto& index = CurrentIndex();
-  ++index;
-  if (index <= CurrentNode().entries().size()) {
-    descending_ = true;
-  } else {
-    stack_.pop_back();
-  }
-
-  return Status::OK;
-}
-
-Status BTreeIterator::AdvanceToValue() {
-  while (!Finished() && !HasValue()) {
-    RETURN_ON_ERROR(Advance());
-  }
-  return Status::OK;
-}
-
-void BTreeIterator::SkipNextSubTree() {
-  if (descending_) {
-    descending_ = false;
-  } else {
-    ++CurrentIndex();
-  }
-}
-
-size_t& BTreeIterator::CurrentIndex() { return stack_.back().second; }
-
-size_t BTreeIterator::CurrentIndex() const { return stack_.back().second; }
-
-const TreeNode& BTreeIterator::CurrentNode() const {
-  return *stack_.back().first;
-}
-
-Status BTreeIterator::Descend(const ObjectIdentifier& node_identifier) {
-  FXL_DCHECK(descending_);
-  std::unique_ptr<const TreeNode> node;
-  RETURN_ON_ERROR(storage_->TreeNodeFromIdentifier(node_identifier, &node));
-  stack_.emplace_back(std::move(node), 0);
-  return Status::OK;
-}
-
-void GetObjectIdentifiers(
-    coroutine::CoroutineService* coroutine_service, PageStorage* page_storage,
-    ObjectIdentifier root_identifier,
-    fit::function<void(Status, std::set<ObjectIdentifier>)> callback) {
-  FXL_DCHECK(root_identifier.object_digest().IsValid());
-  auto object_digests = std::make_unique<std::set<ObjectIdentifier>>();
-  object_digests->insert(root_identifier);
-
-  auto on_next = [object_digests =
-                      object_digests.get()](EntryAndNodeIdentifier e) {
-    object_digests->insert(e.entry.object_identifier);
-    object_digests->insert(e.node_identifier);
-    return true;
-  };
-  auto on_done = [object_digests = std::move(object_digests),
-                  callback = std::move(callback)](Status status) {
-    if (status != Status::OK) {
-      callback(status, std::set<ObjectIdentifier>());
-      return;
-    }
-    callback(status, std::move(*object_digests));
-  };
-  ForEachEntry(coroutine_service, page_storage, root_identifier, "",
-               std::move(on_next), std::move(on_done));
-}
-
-void GetObjectsFromSync(coroutine::CoroutineService* coroutine_service,
-                        PageStorage* page_storage,
-                        ObjectIdentifier root_identifier,
-                        fit::function<void(Status)> callback) {
-  auto waiter = fxl::MakeRefCounted<
-      callback::Waiter<Status, std::unique_ptr<const Object>>>(Status::OK);
-  auto on_next = [page_storage, waiter](EntryAndNodeIdentifier e) {
-    if (e.entry.priority == KeyPriority::EAGER) {
-      page_storage->GetObject(e.entry.object_identifier,
-                              PageStorage::Location::NETWORK,
-                              waiter->NewCallback());
-    }
-    return true;
-  };
-  auto on_done = [callback = std::move(callback),
-                  waiter](Status status) mutable {
-    if (status != Status::OK) {
-      callback(status);
-      return;
-    }
-    waiter->Finalize(
-        [callback = std::move(callback)](
-            Status s, std::vector<std::unique_ptr<const Object>> objects) {
-          callback(s);
-        });
-  };
-  ForEachEntry(coroutine_service, page_storage, root_identifier, "",
-               std::move(on_next), std::move(on_done));
-}
-
-void ForEachEntry(coroutine::CoroutineService* coroutine_service,
-                  PageStorage* page_storage, ObjectIdentifier root_identifier,
-                  std::string min_key,
-                  fit::function<bool(EntryAndNodeIdentifier)> on_next,
-                  fit::function<void(Status)> on_done) {
-  FXL_DCHECK(root_identifier.object_digest().IsValid());
-  coroutine_service->StartCoroutine(
-      [page_storage, root_identifier = std::move(root_identifier),
-       min_key = std::move(min_key), on_next = std::move(on_next),
-       on_done =
-           std::move(on_done)](coroutine::CoroutineHandler* handler) mutable {
-        SynchronousStorage storage(page_storage, handler);
-
-        on_done(ForEachEntryInternal(&storage, root_identifier, min_key,
-                                     std::move(on_next)));
-      });
-}
-
-}  // namespace btree
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/btree/iterator.h b/bin/ledger/storage/impl/btree/iterator.h
deleted file mode 100644
index 6e3e2a4..0000000
--- a/bin/ledger/storage/impl/btree/iterator.h
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_ITERATOR_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_ITERATOR_H_
-
-#include <functional>
-#include <memory>
-#include <set>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/storage/impl/btree/synchronous_storage.h"
-#include "peridot/bin/ledger/storage/impl/btree/tree_node.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-namespace btree {
-
-// An entry and the id of the tree node in which it is stored.
-struct EntryAndNodeIdentifier {
-  const Entry& entry;                       // NOLINT
-  const ObjectIdentifier& node_identifier;  // NOLINT
-};
-
-// Iterator over a B-Tree. This iterator exposes the internal of the iteration
-// to allow to skip part of the tree.
-class BTreeIterator {
- public:
-  explicit BTreeIterator(SynchronousStorage* storage);
-
-  BTreeIterator(BTreeIterator&& other) noexcept;
-  BTreeIterator& operator=(BTreeIterator&& other) noexcept;
-
-  // Initializes the iterator with the root node of the tree.
-  Status Init(ObjectIdentifier node_identifier);
-
-  // Skips the iteration until the first key that is greater than or equal to
-  // |min_key|.
-  Status SkipTo(fxl::StringView min_key);
-
-  // Skips to the index where key could be found, within the current node. The
-  // current index will only be updated if the new index is after the current
-  // one. Returns true if either the key was found in this node, or if it is
-  // guaranteed not to be found in any of this nodes children; false otherwise.
-  bool SkipToIndex(fxl::StringView key);
-
-  // Returns the identifier of the next child that will be explored, or
-  // |nullptr| if it doesn't exist.
-  const ObjectIdentifier* GetNextChild() const;
-
-  // Returns whether the iterator is currently on a value. The method
-  // |CurrentEntry| is only valid when |HasValue| is true.
-  bool HasValue() const;
-
-  // Returns whether the iteration is finished.
-  bool Finished() const;
-
-  // Returns the current value of the iterator. It is only valid when
-  // |HasValue| is true.
-  const Entry& CurrentEntry() const;
-
-  // Returns the identifier of the node at the top of the stack.
-  const storage::ObjectIdentifier& GetIdentifier() const;
-
-  // Returns the level of the node at the top of the stack.
-  uint8_t GetLevel() const;
-
-  // Advances the iterator by a single step.
-  Status Advance();
-
-  // Advances the iterator until it has a value or it finishes.
-  Status AdvanceToValue();
-
-  // Skips the next sub tree in the iteration.
-  void SkipNextSubTree();
-
- private:
-  size_t& CurrentIndex();
-  size_t CurrentIndex() const;
-  const TreeNode& CurrentNode() const;
-  Status Descend(const ObjectIdentifier& node_identifier);
-
-  SynchronousStorage* storage_;
-  // Stack representing the current iteration state. Each level represents the
-  // current node in the B-Tree, and the index currently looked at. If
-  // |descending_| is |true|, the index is the child index, otherwise it is the
-  // entry index.
-  std::vector<std::pair<std::unique_ptr<const TreeNode>, size_t>> stack_;
-  bool descending_ = true;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(BTreeIterator);
-};
-
-// Retrieves the ids of all objects in the B-Tree, i.e tree nodes and values of
-// entries in the tree. After a successfull call, |callback| will be called
-// with the set of results.
-void GetObjectIdentifiers(
-    coroutine::CoroutineService* coroutine_service, PageStorage* page_storage,
-    ObjectIdentifier root_identifier,
-    fit::function<void(Status, std::set<ObjectIdentifier>)> callback);
-
-// Tries to download all tree nodes and values with |EAGER| priority that are
-// not locally available from sync. To do this |PageStorage::GetObject| is
-// called for all corresponding objects.
-void GetObjectsFromSync(coroutine::CoroutineService* coroutine_service,
-                        PageStorage* page_storage,
-                        ObjectIdentifier root_identifier,
-                        fit::function<void(Status)> callback);
-
-// Iterates through the nodes of the tree with the given root and calls
-// |on_next| on found entries with a key equal to or greater than |min_key|. The
-// return value of |on_next| can be used to stop the iteration: returning false
-// will interrupt the iteration in progress and no more |on_next| calls will be
-// made. |on_done| is called once, upon successfull completion, i.e. when there
-// are no more elements or iteration was interrupted, or if an error occurs.
-void ForEachEntry(coroutine::CoroutineService* coroutine_service,
-                  PageStorage* page_storage, ObjectIdentifier root_identifier,
-                  std::string min_key,
-                  fit::function<bool(EntryAndNodeIdentifier)> on_next,
-                  fit::function<void(Status)> on_done);
-
-}  // namespace btree
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_ITERATOR_H_
diff --git a/bin/ledger/storage/impl/btree/synchronous_storage.cc b/bin/ledger/storage/impl/btree/synchronous_storage.cc
deleted file mode 100644
index ecef403..0000000
--- a/bin/ledger/storage/impl/btree/synchronous_storage.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/btree/synchronous_storage.h"
-
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine_waiter.h"
-
-namespace storage {
-namespace btree {
-
-SynchronousStorage::SynchronousStorage(PageStorage* page_storage,
-                                       coroutine::CoroutineHandler* handler)
-    : page_storage_(page_storage), handler_(handler) {}
-
-Status SynchronousStorage::TreeNodeFromIdentifier(
-    ObjectIdentifier object_identifier,
-    std::unique_ptr<const TreeNode>* result) {
-  Status status;
-  if (coroutine::SyncCall(
-          handler_,
-          [this, &object_identifier](
-              fit::function<void(Status, std::unique_ptr<const TreeNode>)>
-                  callback) {
-            TreeNode::FromIdentifier(page_storage_, object_identifier,
-                                     std::move(callback));
-          },
-          &status, result) == coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERRUPTED;
-  }
-  return status;
-}
-
-Status SynchronousStorage::TreeNodesFromIdentifiers(
-    std::vector<ObjectIdentifier> object_identifiers,
-    std::vector<std::unique_ptr<const TreeNode>>* result) {
-  auto waiter = fxl::MakeRefCounted<
-      callback::Waiter<Status, std::unique_ptr<const TreeNode>>>(Status::OK);
-  for (const auto& object_identifier : object_identifiers) {
-    TreeNode::FromIdentifier(page_storage_, object_identifier,
-                             waiter->NewCallback());
-  }
-  Status status;
-  if (coroutine::Wait(handler_, std::move(waiter), &status, result) ==
-      coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERRUPTED;
-  }
-  return status;
-}
-
-Status SynchronousStorage::TreeNodeFromEntries(
-    uint8_t level, const std::vector<Entry>& entries,
-    const std::map<size_t, ObjectIdentifier>& children,
-    ObjectIdentifier* result) {
-  Status status;
-  if (coroutine::SyncCall(
-          handler_,
-          [this, level, &entries,
-           &children](fit::function<void(Status, ObjectIdentifier)> callback) {
-            TreeNode::FromEntries(page_storage_, level, entries, children,
-                                  std::move(callback));
-          },
-          &status, result) == coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERRUPTED;
-  }
-  return status;
-}
-
-}  // namespace btree
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/btree/synchronous_storage.h b/bin/ledger/storage/impl/btree/synchronous_storage.h
deleted file mode 100644
index 4a56646..0000000
--- a/bin/ledger/storage/impl/btree/synchronous_storage.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_SYNCHRONOUS_STORAGE_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_SYNCHRONOUS_STORAGE_H_
-
-#include <memory>
-#include <vector>
-
-#include <lib/callback/waiter.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/storage/impl/btree/tree_node.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-namespace btree {
-
-// Wrapper for TreeNode and PageStorage that uses coroutines to make
-// asynchronous calls look like synchronous ones.
-class SynchronousStorage {
- public:
-  SynchronousStorage(PageStorage* page_storage,
-                     coroutine::CoroutineHandler* handler);
-
-  PageStorage* page_storage() { return page_storage_; }
-  coroutine::CoroutineHandler* handler() { return handler_; }
-
-  Status TreeNodeFromIdentifier(ObjectIdentifier object_identifier,
-                                std::unique_ptr<const TreeNode>* result);
-
-  Status TreeNodesFromIdentifiers(
-      std::vector<ObjectIdentifier> object_identifiers,
-      std::vector<std::unique_ptr<const TreeNode>>* result);
-
-  Status TreeNodeFromEntries(uint8_t level, const std::vector<Entry>& entries,
-                             const std::map<size_t, ObjectIdentifier>& children,
-                             ObjectIdentifier* result);
-
- private:
-  PageStorage* page_storage_;
-  coroutine::CoroutineHandler* handler_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SynchronousStorage);
-};
-
-}  // namespace btree
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_SYNCHRONOUS_STORAGE_H_
diff --git a/bin/ledger/storage/impl/btree/tree_node.cc b/bin/ledger/storage/impl/btree/tree_node.cc
deleted file mode 100644
index 2c22f68..0000000
--- a/bin/ledger/storage/impl/btree/tree_node.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/btree/tree_node.h"
-
-#include <algorithm>
-#include <utility>
-
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/ref_counted.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "peridot/bin/ledger/storage/impl/btree/encoding.h"
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace storage {
-namespace btree {
-
-TreeNode::TreeNode(PageStorage* page_storage, ObjectIdentifier identifier,
-                   uint8_t level, std::vector<Entry> entries,
-                   std::map<size_t, ObjectIdentifier> children)
-    : page_storage_(page_storage),
-      identifier_(std::move(identifier)),
-      level_(level),
-      entries_(std::move(entries)),
-      children_(std::move(children)) {
-  FXL_DCHECK(children_.empty() || children_.cbegin()->first <= entries_.size());
-}
-
-TreeNode::~TreeNode() {}
-
-void TreeNode::FromIdentifier(
-    PageStorage* page_storage, ObjectIdentifier identifier,
-    fit::function<void(Status, std::unique_ptr<const TreeNode>)> callback) {
-  page_storage->GetObject(
-      identifier, PageStorage::Location::NETWORK,
-      [page_storage, identifier, callback = std::move(callback)](
-          Status status, std::unique_ptr<const Object> object) mutable {
-        if (status != Status::OK) {
-          callback(status, nullptr);
-          return;
-        }
-        std::unique_ptr<const TreeNode> node;
-        status = FromObject(page_storage, std::move(identifier),
-                            std::move(object), &node);
-        callback(status, std::move(node));
-      });
-}
-
-void TreeNode::Empty(PageStorage* page_storage,
-                     fit::function<void(Status, ObjectIdentifier)> callback) {
-  FromEntries(page_storage, 0u, std::vector<Entry>(),
-              std::map<size_t, ObjectIdentifier>(), std::move(callback));
-}
-
-void TreeNode::FromEntries(
-    PageStorage* page_storage, uint8_t level, const std::vector<Entry>& entries,
-    const std::map<size_t, ObjectIdentifier>& children,
-    fit::function<void(Status, ObjectIdentifier)> callback) {
-  FXL_DCHECK(children.begin() == children.end() ||
-             children.cbegin()->first <= entries.size());
-#ifndef NDEBUG
-  for (const auto& identifier : children) {
-    FXL_DCHECK(storage::IsDigestValid(identifier.second.object_digest()));
-  }
-#endif
-  std::string encoding = EncodeNode(level, entries, children);
-  page_storage->AddObjectFromLocal(
-      ObjectType::TREE_NODE, storage::DataSource::Create(std::move(encoding)),
-      std::move(callback));
-}
-
-int TreeNode::GetKeyCount() const { return entries_.size(); }
-
-Status TreeNode::GetEntry(int index, Entry* entry) const {
-  FXL_DCHECK(index >= 0 && index < GetKeyCount());
-  *entry = entries_[index];
-  return Status::OK;
-}
-
-void TreeNode::GetChild(
-    int index,
-    fit::function<void(Status, std::unique_ptr<const TreeNode>)> callback)
-    const {
-  FXL_DCHECK(index >= 0 && index <= GetKeyCount());
-  const auto it = children_.find(index);
-  if (it == children_.end()) {
-    callback(Status::NO_SUCH_CHILD, nullptr);
-    return;
-  }
-  return FromIdentifier(page_storage_, it->second, std::move(callback));
-}
-
-Status TreeNode::FindKeyOrChild(convert::ExtendedStringView key,
-                                int* index) const {
-  if (key.empty()) {
-    *index = 0;
-    return !entries_.empty() && entries_[0].key.empty() ? Status::OK
-                                                        : Status::NOT_FOUND;
-  }
-  auto it =
-      std::lower_bound(entries_.begin(), entries_.end(), key,
-                       [](const Entry& entry, convert::ExtendedStringView key) {
-                         return entry.key < key;
-                       });
-  if (it == entries_.end()) {
-    *index = entries_.size();
-    return Status::NOT_FOUND;
-  }
-  *index = it - entries_.begin();
-  if (it->key == key) {
-    return Status::OK;
-  }
-  return Status::NOT_FOUND;
-}
-
-const ObjectIdentifier& TreeNode::GetIdentifier() const { return identifier_; }
-
-Status TreeNode::FromObject(PageStorage* page_storage,
-                            ObjectIdentifier identifier,
-                            std::unique_ptr<const Object> object,
-                            std::unique_ptr<const TreeNode>* node) {
-  fxl::StringView data;
-  Status status = object->GetData(&data);
-  if (status != Status::OK) {
-    return status;
-  }
-  uint8_t level;
-  std::vector<Entry> entries;
-  std::map<size_t, ObjectIdentifier> children;
-  if (!DecodeNode(data, &level, &entries, &children)) {
-    return Status::FORMAT_ERROR;
-  }
-  node->reset(new TreeNode(page_storage, std::move(identifier), level,
-                           std::move(entries), std::move(children)));
-  return Status::OK;
-}
-
-}  // namespace btree
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/btree/tree_node.fbs b/bin/ledger/storage/impl/btree/tree_node.fbs
deleted file mode 100644
index 83925aa..0000000
--- a/bin/ledger/storage/impl/btree/tree_node.fbs
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-include "peridot/bin/ledger/storage/impl/object_identifier.fbs";
-
-namespace storage;
-
-enum KeyPriorityStorage : byte { EAGER = 0, LAZY = 1 }
-
-table EntryStorage {
-  key: [ubyte];
-  object_id: ObjectIdentifierStorage;
-  priority: KeyPriorityStorage;
-}
-
-table ChildStorage {
-  index:  ushort (key);
-  object_id: ObjectIdentifierStorage;
-}
-
-table TreeNodeStorage {
-  entries: [EntryStorage];
-  children: [ChildStorage];
-  level: ubyte;
-}
-
-root_type TreeNodeStorage;
diff --git a/bin/ledger/storage/impl/btree/tree_node.h b/bin/ledger/storage/impl/btree/tree_node.h
deleted file mode 100644
index 399ca65..0000000
--- a/bin/ledger/storage/impl/btree/tree_node.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_TREE_NODE_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_TREE_NODE_H_
-
-#include <memory>
-#include <vector>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/storage/public/object.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace storage {
-namespace btree {
-
-// A node of the B-Tree holding the commit contents.
-class TreeNode {
- public:
-  ~TreeNode();
-
-  // Creates a |TreeNode| object for an existing node and calls the given
-  // |callback| with the returned status and node.
-  static void FromIdentifier(
-      PageStorage* page_storage, ObjectIdentifier identifier,
-      fit::function<void(Status, std::unique_ptr<const TreeNode>)> callback);
-
-  // Creates a |TreeNode| object with the given entries and children. |children|
-  // is a map from the index of the child to the identfiier of the child. It
-  // only contains non-empty children. It is expected that all child index are
-  // between |0| and |size(entries)| (included). The |callback| will be called
-  // with the success or error status and the id of the new node.
-  static void FromEntries(
-      PageStorage* page_storage, uint8_t level,
-      const std::vector<Entry>& entries,
-      const std::map<size_t, ObjectIdentifier>& children,
-      fit::function<void(Status, ObjectIdentifier)> callback);
-
-  // Creates an empty node, i.e. a TreeNode with no entries and an empty child
-  // at index 0 and calls the callback with the result.
-  static void Empty(PageStorage* page_storage,
-                    fit::function<void(Status, ObjectIdentifier)> callback);
-
-  // Returns the number of entries stored in this tree node.
-  int GetKeyCount() const;
-
-  // Finds the entry at position |index| and stores it in |entry|. |index| has
-  // to be in [0, GetKeyCount() - 1].
-  Status GetEntry(int index, Entry* entry) const;
-
-  // Finds the child node at position |index| and calls the |callback| with the
-  // result. |index| has to be in [0, GetKeyCount()]. If the child at the given
-  // index is empty |NO_SUCH_CHILD| is returned and the value of |child| is not
-  // updated.
-  void GetChild(int index,
-                fit::function<void(Status, std::unique_ptr<const TreeNode>)>
-                    callback) const;
-
-  // Searches for the given |key| in this node. If it is found, |OK| is
-  // returned and index contains the index of the entry. If not, |NOT_FOUND|
-  // is returned and index stores the index of the child node where the key
-  // might be found.
-  Status FindKeyOrChild(convert::ExtendedStringView key, int* index) const;
-
-  const ObjectIdentifier& GetIdentifier() const;
-
-  uint8_t level() const { return level_; }
-
-  const std::vector<Entry>& entries() const { return entries_; }
-
-  const std::map<size_t, ObjectIdentifier>& children_identifiers() const {
-    return children_;
-  }
-
- private:
-  TreeNode(PageStorage* page_storage, ObjectIdentifier identifier,
-           uint8_t level, std::vector<Entry> entries,
-           std::map<size_t, ObjectIdentifier> children);
-
-  // Creates a |TreeNode| object for an existing |object| and stores it in the
-  // given |node|.
-  static Status FromObject(PageStorage* page_storage,
-                           ObjectIdentifier identifier,
-                           std::unique_ptr<const Object> object,
-                           std::unique_ptr<const TreeNode>* node);
-
-  PageStorage* page_storage_;
-  ObjectIdentifier identifier_;
-  const uint8_t level_;
-  const std::vector<Entry> entries_;
-  const std::map<size_t, ObjectIdentifier> children_;
-};
-
-}  // namespace btree
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_BTREE_TREE_NODE_H_
diff --git a/bin/ledger/storage/impl/btree/tree_node_unittest.cc b/bin/ledger/storage/impl/btree/tree_node_unittest.cc
deleted file mode 100644
index 93218fa..0000000
--- a/bin/ledger/storage/impl/btree/tree_node_unittest.cc
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/btree/tree_node.h"
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fxl/logging.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/storage/fake/fake_page_storage.h"
-#include "peridot/bin/ledger/storage/impl/btree/encoding.h"
-#include "peridot/bin/ledger/storage/impl/storage_test_utils.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-namespace storage {
-namespace btree {
-namespace {
-
-class FakePageStorageValidDigest : public fake::FakePageStorage {
- public:
-  using fake::FakePageStorage::FakePageStorage;
-
- protected:
-  ObjectDigest FakeDigest(fxl::StringView content) const override {
-    // BTree code needs storage to return valid digests.
-    return MakeObjectDigest(content.ToString());
-  }
-};
-
-class TreeNodeTest : public StorageTest {
- public:
-  TreeNodeTest() : fake_storage_(&environment_, "page_id") {}
-
-  ~TreeNodeTest() override {}
-
-  // Test:
-  void SetUp() override {
-    ::testing::Test::SetUp();
-    std::srand(0);
-  }
-
- protected:
-  PageStorage* GetStorage() override { return &fake_storage_; }
-
-  std::unique_ptr<const TreeNode> CreateEmptyNode() {
-    ObjectIdentifier root_identifier;
-    EXPECT_TRUE(GetEmptyNodeIdentifier(&root_identifier));
-    std::unique_ptr<const TreeNode> node;
-    EXPECT_TRUE(CreateNodeFromIdentifier(root_identifier, &node));
-    return node;
-  }
-
-  Entry GetEntry(const TreeNode* node, int index) {
-    Entry found_entry;
-    EXPECT_EQ(Status::OK, node->GetEntry(index, &found_entry));
-    return found_entry;
-  }
-
-  std::map<size_t, ObjectIdentifier> CreateChildren(int size) {
-    std::map<size_t, ObjectIdentifier> children;
-    for (int i = 0; i < size; ++i) {
-      children[i] = CreateEmptyNode()->GetIdentifier();
-    }
-    return children;
-  }
-
-  FakePageStorageValidDigest fake_storage_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(TreeNodeTest);
-};
-
-TEST_F(TreeNodeTest, CreateGetTreeNode) {
-  std::unique_ptr<const TreeNode> node = CreateEmptyNode();
-
-  bool called;
-  Status status;
-  std::unique_ptr<const TreeNode> found_node;
-  TreeNode::FromIdentifier(&fake_storage_, node->GetIdentifier(),
-                           callback::Capture(callback::SetWhenCalled(&called),
-                                             &status, &found_node));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_NE(nullptr, found_node);
-
-  TreeNode::FromIdentifier(&fake_storage_,
-                           RandomObjectIdentifier(environment_.random()),
-                           callback::Capture(callback::SetWhenCalled(&called),
-                                             &status, &found_node));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::NOT_FOUND, status);
-}
-
-TEST_F(TreeNodeTest, GetEntryChild) {
-  int size = 10;
-  std::vector<Entry> entries;
-  ASSERT_TRUE(CreateEntries(size, &entries));
-  std::unique_ptr<const TreeNode> node;
-  ASSERT_TRUE(CreateNodeFromEntries(entries, {}, &node));
-  EXPECT_EQ(size, node->GetKeyCount());
-  for (int i = 0; i < size; ++i) {
-    EXPECT_EQ(entries[i], GetEntry(node.get(), i));
-  }
-
-  bool called;
-  for (int i = 0; i <= size; ++i) {
-    Status status;
-    std::unique_ptr<const TreeNode> child;
-    node->GetChild(i, callback::Capture(callback::SetWhenCalled(&called),
-                                        &status, &child));
-    RunLoopFor(kSufficientDelay);
-    ASSERT_TRUE(called);
-    ASSERT_EQ(Status::NO_SUCH_CHILD, status);
-    EXPECT_EQ(node->children_identifiers().find(i),
-              node->children_identifiers().end());
-  }
-}
-
-TEST_F(TreeNodeTest, FindKeyOrChild) {
-  int size = 10;
-  std::vector<Entry> entries;
-  ASSERT_TRUE(CreateEntries(size, &entries));
-  std::unique_ptr<const TreeNode> node;
-  ASSERT_TRUE(CreateNodeFromEntries(entries, {}, &node));
-
-  int index;
-  EXPECT_EQ(Status::OK, node->FindKeyOrChild("key00", &index));
-  EXPECT_EQ(0, index);
-
-  EXPECT_EQ(Status::OK, node->FindKeyOrChild("key02", &index));
-  EXPECT_EQ(2, index);
-
-  EXPECT_EQ(Status::OK, node->FindKeyOrChild("key09", &index));
-  EXPECT_EQ(9, index);
-
-  EXPECT_EQ(Status::NOT_FOUND, node->FindKeyOrChild("0", &index));
-  EXPECT_EQ(0, index);
-
-  EXPECT_EQ(Status::NOT_FOUND, node->FindKeyOrChild("key001", &index));
-  EXPECT_EQ(1, index);
-
-  EXPECT_EQ(Status::NOT_FOUND, node->FindKeyOrChild("key020", &index));
-  EXPECT_EQ(3, index);
-
-  EXPECT_EQ(Status::NOT_FOUND, node->FindKeyOrChild("key999", &index));
-  EXPECT_EQ(10, index);
-}
-
-TEST_F(TreeNodeTest, Serialization) {
-  int size = 3;
-  std::vector<Entry> entries;
-  ASSERT_TRUE(CreateEntries(size, &entries));
-  std::map<size_t, ObjectIdentifier> children = CreateChildren(size + 1);
-  std::unique_ptr<const TreeNode> node;
-  ASSERT_TRUE(CreateNodeFromEntries(entries, children, &node));
-
-  bool called;
-  Status status;
-  std::unique_ptr<const Object> object;
-  fake_storage_.GetObject(
-      node->GetIdentifier(), PageStorage::Location::LOCAL,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &object));
-  RunLoopFor(kSufficientDelay);
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  std::unique_ptr<const TreeNode> retrieved_node;
-  EXPECT_EQ(node->GetIdentifier(), object->GetIdentifier());
-  ASSERT_TRUE(CreateNodeFromIdentifier(node->GetIdentifier(), &retrieved_node));
-
-  fxl::StringView data;
-  EXPECT_EQ(Status::OK, object->GetData(&data));
-  uint8_t level;
-  std::vector<Entry> parsed_entries;
-  std::map<size_t, ObjectIdentifier> parsed_children;
-  EXPECT_TRUE(DecodeNode(data, &level, &parsed_entries, &parsed_children));
-  EXPECT_EQ(entries, parsed_entries);
-  EXPECT_EQ(children, parsed_children);
-}
-
-}  // namespace
-}  // namespace btree
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/commit.fbs b/bin/ledger/storage/impl/commit.fbs
deleted file mode 100644
index 8a496c3..0000000
--- a/bin/ledger/storage/impl/commit.fbs
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-include "peridot/bin/ledger/storage/impl/object_identifier.fbs";
-
-namespace storage;
-
-struct IdStorage {
-  b00: ubyte;
-  b01: ubyte;
-  b02: ubyte;
-  b03: ubyte;
-  b04: ubyte;
-  b05: ubyte;
-  b06: ubyte;
-  b07: ubyte;
-  b08: ubyte;
-  b09: ubyte;
-  b10: ubyte;
-  b11: ubyte;
-  b12: ubyte;
-  b13: ubyte;
-  b14: ubyte;
-  b15: ubyte;
-  b16: ubyte;
-  b17: ubyte;
-  b18: ubyte;
-  b19: ubyte;
-  b20: ubyte;
-  b21: ubyte;
-  b22: ubyte;
-  b23: ubyte;
-  b24: ubyte;
-  b25: ubyte;
-  b26: ubyte;
-  b27: ubyte;
-  b28: ubyte;
-  b29: ubyte;
-  b30: ubyte;
-  b31: ubyte;
-}
-
-table CommitStorage {
-  timestamp: long;
-  generation: ulong;
-  root_node_id: ObjectIdentifierStorage;
-  parents: [storage.IdStorage];
-}
-
-root_type CommitStorage;
diff --git a/bin/ledger/storage/impl/commit_impl.cc b/bin/ledger/storage/impl/commit_impl.cc
deleted file mode 100644
index 47c81d9..0000000
--- a/bin/ledger/storage/impl/commit_impl.cc
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/commit_impl.h"
-
-#include <sys/time.h>
-#include <algorithm>
-#include <utility>
-
-#include <flatbuffers/flatbuffers.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/build_config.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/ref_counted.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/encryption/primitives/hash.h"
-#include "peridot/bin/ledger/storage/impl/btree/tree_node.h"
-#include "peridot/bin/ledger/storage/impl/commit_generated.h"
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-#include "peridot/bin/ledger/storage/impl/object_identifier_encoding.h"
-#include "peridot/bin/ledger/storage/impl/object_identifier_generated.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-namespace storage {
-
-namespace {
-
-static_assert(sizeof(IdStorage) == kCommitIdSize,
-              "storage size for id is incorrect");
-
-const IdStorage* ToIdStorage(CommitIdView id) {
-  return reinterpret_cast<const IdStorage*>(id.data());
-}
-
-CommitIdView ToCommitIdView(const IdStorage* id_storage) {
-  return CommitIdView(fxl::StringView(reinterpret_cast<const char*>(id_storage),
-                                      sizeof(IdStorage)));
-}
-
-}  // namespace
-
-class CommitImpl::SharedStorageBytes
-    : public fxl::RefCountedThreadSafe<SharedStorageBytes> {
- public:
-  const std::string& bytes() { return bytes_; }
-
- private:
-  FRIEND_REF_COUNTED_THREAD_SAFE(SharedStorageBytes);
-  FRIEND_MAKE_REF_COUNTED(SharedStorageBytes);
-  explicit SharedStorageBytes(std::string bytes) : bytes_(std::move(bytes)) {}
-  ~SharedStorageBytes() {}
-
-  std::string bytes_;
-};
-
-namespace {
-// Checks whether the given |storage_bytes| are a valid serialization of a
-// commit.
-bool CheckValidSerialization(fxl::StringView storage_bytes) {
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(storage_bytes.data()),
-      storage_bytes.size());
-
-  if (!VerifyCommitStorageBuffer(verifier)) {
-    return false;
-  };
-
-  const CommitStorage* commit_storage = GetCommitStorage(storage_bytes.data());
-  auto parents = commit_storage->parents();
-  return parents && parents->size() >= 1 && parents->size() <= 2;
-}
-
-std::string SerializeCommit(
-    uint64_t generation, zx::time_utc timestamp,
-    const ObjectIdentifier& root_node_identifier,
-    std::vector<std::unique_ptr<const Commit>> parent_commits) {
-  flatbuffers::FlatBufferBuilder builder;
-
-  auto parents_id = builder.CreateVectorOfStructs(
-      parent_commits.size(),
-      static_cast<std::function<void(size_t, IdStorage*)>>(
-          [&parent_commits](size_t i, IdStorage* child_storage) {
-            *child_storage = *ToIdStorage(parent_commits[i]->GetId());
-          }));
-
-  auto root_node_storage =
-      ToObjectIdentifierStorage(&builder, root_node_identifier);
-  auto storage = CreateCommitStorage(builder, timestamp.get(), generation,
-                                     root_node_storage, parents_id);
-  builder.Finish(storage);
-  return std::string(reinterpret_cast<const char*>(builder.GetBufferPointer()),
-                     builder.GetSize());
-}
-}  // namespace
-
-CommitImpl::CommitImpl(Token /* token */, PageStorage* page_storage,
-                       CommitId id, zx::time_utc timestamp, uint64_t generation,
-                       ObjectIdentifier root_node_identifier,
-                       std::vector<CommitIdView> parent_ids,
-                       fxl::RefPtr<SharedStorageBytes> storage_bytes)
-    : page_storage_(page_storage),
-      id_(std::move(id)),
-      timestamp_(timestamp),
-      generation_(generation),
-      root_node_identifier_(std::move(root_node_identifier)),
-      parent_ids_(std::move(parent_ids)),
-      storage_bytes_(std::move(storage_bytes)) {
-  FXL_DCHECK(page_storage_ != nullptr);
-  FXL_DCHECK(id_ == kFirstPageCommitId ||
-             (!parent_ids_.empty() && parent_ids_.size() <= 2));
-}
-
-CommitImpl::~CommitImpl() {}
-
-Status CommitImpl::FromStorageBytes(PageStorage* page_storage, CommitId id,
-                                    std::string storage_bytes,
-                                    std::unique_ptr<const Commit>* commit) {
-  FXL_DCHECK(id != kFirstPageCommitId);
-
-  if (!CheckValidSerialization(storage_bytes)) {
-    return Status::FORMAT_ERROR;
-  }
-
-  auto storage_ptr =
-      fxl::MakeRefCounted<SharedStorageBytes>(std::move(storage_bytes));
-
-  const CommitStorage* commit_storage =
-      GetCommitStorage(storage_ptr->bytes().data());
-
-  ObjectIdentifier root_node_identifier =
-      ToObjectIdentifier(commit_storage->root_node_id());
-  std::vector<CommitIdView> parent_ids;
-
-  for (size_t i = 0; i < commit_storage->parents()->size(); ++i) {
-    parent_ids.emplace_back(ToCommitIdView(commit_storage->parents()->Get(i)));
-  }
-  *commit = std::make_unique<CommitImpl>(
-      Token(), page_storage, std::move(id),
-      zx::time_utc(commit_storage->timestamp()), commit_storage->generation(),
-      std::move(root_node_identifier), parent_ids, std::move(storage_ptr));
-  return Status::OK;
-}
-
-std::unique_ptr<const Commit> CommitImpl::FromContentAndParents(
-    timekeeper::Clock* clock, PageStorage* page_storage,
-    ObjectIdentifier root_node_identifier,
-    std::vector<std::unique_ptr<const Commit>> parent_commits) {
-  FXL_DCHECK(parent_commits.size() == 1 || parent_commits.size() == 2);
-
-  uint64_t parent_generation = 0;
-  for (const auto& commit : parent_commits) {
-    parent_generation = std::max(parent_generation, commit->GetGeneration());
-  }
-  uint64_t generation = parent_generation + 1;
-
-  // Sort commit ids for uniqueness.
-  std::sort(parent_commits.begin(), parent_commits.end(),
-            [](const std::unique_ptr<const Commit>& c1,
-               const std::unique_ptr<const Commit>& c2) {
-              return c1->GetId() < c2->GetId();
-            });
-  // Compute timestamp.
-  zx::time_utc timestamp;
-  if (parent_commits.size() == 2) {
-    timestamp = std::max(parent_commits[0]->GetTimestamp(),
-                         parent_commits[1]->GetTimestamp());
-  } else {
-    zx_status_t status = clock->Now(&timestamp);
-    FXL_CHECK(status == ZX_OK);
-  }
-
-  std::string storage_bytes = SerializeCommit(
-      generation, timestamp, root_node_identifier, std::move(parent_commits));
-
-  CommitId id = encryption::SHA256WithLengthHash(storage_bytes);
-
-  std::unique_ptr<const Commit> commit;
-  Status status = FromStorageBytes(page_storage, std::move(id),
-                                   std::move(storage_bytes), &commit);
-  FXL_DCHECK(status == Status::OK);
-  return commit;
-}
-
-void CommitImpl::Empty(
-    PageStorage* page_storage,
-    fit::function<void(Status, std::unique_ptr<const Commit>)> callback) {
-  btree::TreeNode::Empty(
-      page_storage, [page_storage, callback = std::move(callback)](
-                        Status s, ObjectIdentifier root_identifier) {
-        if (s != Status::OK) {
-          callback(s, nullptr);
-          return;
-        }
-
-        FXL_DCHECK(IsDigestValid(root_identifier.object_digest()));
-
-        auto storage_ptr = fxl::MakeRefCounted<SharedStorageBytes>("");
-
-        auto ptr = std::make_unique<CommitImpl>(
-            Token(), page_storage, kFirstPageCommitId.ToString(),
-            zx::time_utc(), 0, std::move(root_identifier),
-            std::vector<CommitIdView>(), std::move(storage_ptr));
-        callback(Status::OK, std::move(ptr));
-      });
-}
-
-std::unique_ptr<const Commit> CommitImpl::Clone() const {
-  return std::make_unique<CommitImpl>(Token(), page_storage_, id_, timestamp_,
-                                      generation_, root_node_identifier_,
-                                      parent_ids_, storage_bytes_);
-}
-
-const CommitId& CommitImpl::GetId() const { return id_; }
-
-std::vector<CommitIdView> CommitImpl::GetParentIds() const {
-  return parent_ids_;
-}
-
-zx::time_utc CommitImpl::GetTimestamp() const { return timestamp_; }
-
-uint64_t CommitImpl::GetGeneration() const { return generation_; }
-
-ObjectIdentifier CommitImpl::GetRootIdentifier() const {
-  return root_node_identifier_;
-}
-
-fxl::StringView CommitImpl::GetStorageBytes() const {
-  return storage_bytes_->bytes();
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/commit_impl.h b/bin/ledger/storage/impl/commit_impl.h
deleted file mode 100644
index eb35cb9..0000000
--- a/bin/ledger/storage/impl/commit_impl.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_COMMIT_IMPL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_COMMIT_IMPL_H_
-
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/timekeeper/clock.h>
-
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace storage {
-
-class CommitImpl : public Commit {
- private:
-  // Passkey idiom to restrict access to the constructor to static factories.
-  class Token;
-  class SharedStorageBytes;
-
- public:
-  // Creates a new |CommitImpl| object with the given contents.
-  CommitImpl(Token token, PageStorage* page_storage, CommitId id,
-             zx::time_utc timestamp, uint64_t generation,
-             ObjectIdentifier root_node_identifier,
-             std::vector<CommitIdView> parent_ids,
-             fxl::RefPtr<SharedStorageBytes> storage_bytes);
-
-  ~CommitImpl() override;
-
-  // Factory method for creating a |CommitImpl| object given its storage
-  // representation. If the format is incorrect, |nullptr| will be returned.
-  static Status FromStorageBytes(PageStorage* page_storage, CommitId id,
-                                 std::string storage_bytes,
-                                 std::unique_ptr<const Commit>* commit);
-
-  static std::unique_ptr<const Commit> FromContentAndParents(
-      timekeeper::Clock* clock, PageStorage* page_storage,
-      ObjectIdentifier root_node_identifier,
-      std::vector<std::unique_ptr<const Commit>> parent_commits);
-
-  // Factory method for creating an empty |CommitImpl| object, i.e. without
-  // parents and with empty contents.
-  static void Empty(
-      PageStorage* page_storage,
-      fit::function<void(Status, std::unique_ptr<const Commit>)> callback);
-
-  // Commit:
-  std::unique_ptr<const Commit> Clone() const override;
-  const CommitId& GetId() const override;
-  std::vector<CommitIdView> GetParentIds() const override;
-  zx::time_utc GetTimestamp() const override;
-  uint64_t GetGeneration() const override;
-  ObjectIdentifier GetRootIdentifier() const override;
-  fxl::StringView GetStorageBytes() const override;
-
- private:
-  class Token {
-   private:
-    Token() {}
-    friend CommitImpl;
-  };
-
-  PageStorage* page_storage_;
-  const CommitId id_;
-  const zx::time_utc timestamp_;
-  const uint64_t generation_;
-  const ObjectIdentifier root_node_identifier_;
-  const std::vector<CommitIdView> parent_ids_;
-  const fxl::RefPtr<SharedStorageBytes> storage_bytes_;
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_COMMIT_IMPL_H_
diff --git a/bin/ledger/storage/impl/commit_impl_unittest.cc b/bin/ledger/storage/impl/commit_impl_unittest.cc
deleted file mode 100644
index 6bf2b34..0000000
--- a/bin/ledger/storage/impl/commit_impl_unittest.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/commit_impl.h"
-
-#include <tuple>
-
-#include <lib/fxl/macros.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/storage/fake/fake_page_storage.h"
-#include "peridot/bin/ledger/storage/impl/commit_random_impl.h"
-#include "peridot/bin/ledger/storage/impl/storage_test_utils.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-namespace storage {
-namespace {
-
-class CommitImplTest : public StorageTest {
- public:
-  CommitImplTest() : page_storage_(&environment_, "page_id") {}
-
-  ~CommitImplTest() override {}
-
- protected:
-  PageStorage* GetStorage() override { return &page_storage_; }
-
-  bool CheckCommitEquals(const Commit& expected, const Commit& commit) {
-    return std::forward_as_tuple(expected.GetId(), expected.GetTimestamp(),
-                                 expected.GetParentIds(),
-                                 expected.GetRootIdentifier()) ==
-           std::forward_as_tuple(commit.GetId(), commit.GetTimestamp(),
-                                 commit.GetParentIds(),
-                                 commit.GetRootIdentifier());
-  }
-
-  bool CheckCommitStorageBytes(const std::unique_ptr<const Commit>& commit) {
-    std::unique_ptr<const Commit> copy;
-    Status status = CommitImpl::FromStorageBytes(
-        &page_storage_, commit->GetId(), commit->GetStorageBytes().ToString(),
-        &copy);
-    EXPECT_EQ(Status::OK, status);
-
-    return CheckCommitEquals(*commit, *copy);
-  }
-
-  fake::FakePageStorage page_storage_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(CommitImplTest);
-};
-
-TEST_F(CommitImplTest, CommitStorageBytes) {
-  ObjectIdentifier root_node_identifier =
-      RandomObjectIdentifier(environment_.random());
-
-  std::vector<std::unique_ptr<const Commit>> parents;
-
-  // A commit with one parent.
-  parents.emplace_back(
-      std::make_unique<CommitRandomImpl>(environment_.random()));
-  std::unique_ptr<const Commit> commit = CommitImpl::FromContentAndParents(
-      environment_.clock(), &page_storage_, root_node_identifier,
-      std::move(parents));
-  EXPECT_TRUE(CheckCommitStorageBytes(commit));
-
-  // A commit with two parents.
-  parents = std::vector<std::unique_ptr<const Commit>>();
-  parents.emplace_back(
-      std::make_unique<CommitRandomImpl>(environment_.random()));
-  parents.emplace_back(
-      std::make_unique<CommitRandomImpl>(environment_.random()));
-  std::unique_ptr<const Commit> commit2 = CommitImpl::FromContentAndParents(
-      environment_.clock(), &page_storage_, root_node_identifier,
-      std::move(parents));
-  EXPECT_TRUE(CheckCommitStorageBytes(commit2));
-}
-
-TEST_F(CommitImplTest, CloneCommit) {
-  ObjectIdentifier root_node_identifier =
-      RandomObjectIdentifier(environment_.random());
-
-  std::vector<std::unique_ptr<const Commit>> parents;
-  parents.emplace_back(
-      std::make_unique<CommitRandomImpl>(environment_.random()));
-  std::unique_ptr<const Commit> commit = CommitImpl::FromContentAndParents(
-      environment_.clock(), &page_storage_, root_node_identifier,
-      std::move(parents));
-  std::unique_ptr<const Commit> copy;
-  Status status =
-      CommitImpl::FromStorageBytes(&page_storage_, commit->GetId(),
-                                   commit->GetStorageBytes().ToString(), &copy);
-  ASSERT_EQ(Status::OK, status);
-  std::unique_ptr<const Commit> clone = commit->Clone();
-  EXPECT_TRUE(CheckCommitEquals(*copy, *clone));
-}
-
-TEST_F(CommitImplTest, MergeCommitTimestamp) {
-  ObjectIdentifier root_node_identifier =
-      RandomObjectIdentifier(environment_.random());
-
-  std::vector<std::unique_ptr<const Commit>> parents;
-  parents.emplace_back(
-      std::make_unique<CommitRandomImpl>(environment_.random()));
-  parents.emplace_back(
-      std::make_unique<CommitRandomImpl>(environment_.random()));
-  EXPECT_NE(parents[0]->GetTimestamp(), parents[1]->GetTimestamp());
-  auto max_timestamp =
-      std::max(parents[0]->GetTimestamp(), parents[1]->GetTimestamp());
-  std::unique_ptr<const Commit> commit = CommitImpl::FromContentAndParents(
-      environment_.clock(), &page_storage_, root_node_identifier,
-      std::move(parents));
-
-  EXPECT_EQ(max_timestamp, commit->GetTimestamp());
-}
-
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/commit_random_impl.cc b/bin/ledger/storage/impl/commit_random_impl.cc
deleted file mode 100644
index 6a8c76c..0000000
--- a/bin/ledger/storage/impl/commit_random_impl.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/commit_random_impl.h"
-
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/ledger/storage/impl/storage_test_utils.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-namespace storage {
-
-CommitRandomImpl::CommitRandomImpl(rng::Random* random)
-    : id_(RandomCommitId(random)),
-      timestamp_(random->Draw<zx::time_utc>()),
-      generation_(random->Draw<uint64_t>()),
-      root_node_identifier_(RandomObjectIdentifier(random)),
-      parent_ids_{RandomCommitId(random)},
-      parent_ids_views_{parent_ids_[0]},
-      storage_bytes_(RandomString(random, 64)) {}
-
-CommitRandomImpl::~CommitRandomImpl() = default;
-
-CommitRandomImpl::CommitRandomImpl(const CommitRandomImpl& other) {
-  *this = other;
-}
-
-CommitRandomImpl& CommitRandomImpl::operator=(const CommitRandomImpl& other) {
-  id_ = other.id_;
-  timestamp_ = other.timestamp_;
-  generation_ = other.generation_;
-  root_node_identifier_ = other.root_node_identifier_;
-  parent_ids_ = other.parent_ids_;
-  storage_bytes_ = other.storage_bytes_;
-  parent_ids_views_ = {parent_ids_[0]};
-  return *this;
-}
-
-std::unique_ptr<const Commit> CommitRandomImpl::Clone() const {
-  return std::make_unique<CommitRandomImpl>(*this);
-}
-
-const CommitId& CommitRandomImpl::GetId() const { return id_; }
-
-std::vector<CommitIdView> CommitRandomImpl::GetParentIds() const {
-  return parent_ids_views_;
-}
-
-zx::time_utc CommitRandomImpl::GetTimestamp() const { return timestamp_; }
-
-uint64_t CommitRandomImpl::GetGeneration() const { return generation_; }
-
-ObjectIdentifier CommitRandomImpl::GetRootIdentifier() const {
-  return root_node_identifier_;
-}
-
-fxl::StringView CommitRandomImpl::GetStorageBytes() const {
-  return storage_bytes_;
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/commit_random_impl.h b/bin/ledger/storage/impl/commit_random_impl.h
deleted file mode 100644
index dd7afe5..0000000
--- a/bin/ledger/storage/impl/commit_random_impl.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_COMMIT_RANDOM_IMPL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_COMMIT_RANDOM_IMPL_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/lib/rng/random.h"
-
-namespace storage {
-
-// Implementaton of Commit returning random values (fixed for each instance).
-class CommitRandomImpl : public Commit {
- public:
-  CommitRandomImpl(rng::Random* random);
-  ~CommitRandomImpl() override;
-  CommitRandomImpl(const CommitRandomImpl& other);
-  CommitRandomImpl& operator=(const CommitRandomImpl& other);
-
-  // Commit:
-  std::unique_ptr<const Commit> Clone() const override;
-
-  const CommitId& GetId() const override;
-
-  std::vector<CommitIdView> GetParentIds() const override;
-
-  zx::time_utc GetTimestamp() const override;
-
-  uint64_t GetGeneration() const override;
-
-  ObjectIdentifier GetRootIdentifier() const override;
-
-  fxl::StringView GetStorageBytes() const override;
-
- private:
-  CommitId id_;
-  zx::time_utc timestamp_;
-  uint64_t generation_;
-  ObjectIdentifier root_node_identifier_;
-  std::vector<CommitId> parent_ids_;
-  std::vector<CommitIdView> parent_ids_views_;
-  std::string storage_bytes_;
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_COMMIT_RANDOM_IMPL_H_
diff --git a/bin/ledger/storage/impl/constants.h b/bin/ledger/storage/impl/constants.h
deleted file mode 100644
index cad4fa7..0000000
--- a/bin/ledger/storage/impl/constants.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_CONSTANTS_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_CONSTANTS_H_
-
-namespace storage {
-
-inline constexpr size_t kStorageHashSize = 32;
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_CONSTANTS_H_
diff --git a/bin/ledger/storage/impl/data_serialization.h b/bin/ledger/storage/impl/data_serialization.h
deleted file mode 100644
index 6370510..0000000
--- a/bin/ledger/storage/impl/data_serialization.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_DATA_SERIALIZATION_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_DATA_SERIALIZATION_H_
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace storage {
-
-template <typename I>
-I DeserializeData(fxl::StringView value) {
-  static_assert(std::is_trivially_copyable<I>::value,
-                "The return type must be trivially copyable.");
-  FXL_DCHECK(value.size() == sizeof(I));
-  I result;
-  memcpy(&result, value.data(), sizeof(I));
-  return result;
-}
-
-template <typename I>
-fxl::StringView SerializeData(const I& value) {
-  static_assert(std::is_trivially_copyable<I>::value,
-                "The parameter type must be trivially copyable.");
-  return fxl::StringView(reinterpret_cast<const char*>(&value), sizeof(I));
-}
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_DATA_SERIALIZATION_H_
diff --git a/bin/ledger/storage/impl/db_serialization.cc b/bin/ledger/storage/impl/db_serialization.cc
deleted file mode 100644
index 31395dc..0000000
--- a/bin/ledger/storage/impl/db_serialization.cc
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/db_serialization.h"
-
-#include <lib/fxl/strings/concatenate.h>
-#include <lib/fxl/strings/string_view.h>
-#include <zircon/syscalls.h>
-
-#include "peridot/bin/ledger/storage/impl/object_identifier_encoding.h"
-
-namespace storage {
-
-// HeadRow.
-
-constexpr fxl::StringView HeadRow::kPrefix;
-
-std::string HeadRow::GetKeyFor(CommitIdView head) {
-  return fxl::Concatenate({kPrefix, head});
-}
-
-// CommitRow.
-
-constexpr fxl::StringView CommitRow::kPrefix;
-
-std::string CommitRow::GetKeyFor(CommitIdView commit_id) {
-  return fxl::Concatenate({kPrefix, commit_id});
-}
-
-// ObjectRow.
-
-constexpr fxl::StringView ObjectRow::kPrefix;
-
-std::string ObjectRow::GetKeyFor(const ObjectDigest& object_digest) {
-  return fxl::Concatenate({kPrefix, object_digest.Serialize()});
-}
-
-// UnsyncedCommitRow.
-
-constexpr fxl::StringView UnsyncedCommitRow::kPrefix;
-
-std::string UnsyncedCommitRow::GetKeyFor(const CommitId& commit_id) {
-  return fxl::Concatenate({kPrefix, commit_id});
-}
-
-// ObjectStatusRow.
-
-constexpr fxl::StringView ObjectStatusRow::kTransientPrefix;
-constexpr fxl::StringView ObjectStatusRow::kLocalPrefix;
-constexpr fxl::StringView ObjectStatusRow::kSyncedPrefix;
-
-std::string ObjectStatusRow::GetKeyFor(
-    PageDbObjectStatus object_status,
-    const ObjectIdentifier& object_identifier) {
-  return fxl::Concatenate(
-      {GetPrefixFor(object_status), EncodeObjectIdentifier(object_identifier)});
-}
-
-fxl::StringView ObjectStatusRow::GetPrefixFor(
-    PageDbObjectStatus object_status) {
-  switch (object_status) {
-    case PageDbObjectStatus::UNKNOWN:
-      FXL_NOTREACHED();
-      return "";
-    case PageDbObjectStatus::TRANSIENT:
-      return kTransientPrefix;
-    case PageDbObjectStatus::LOCAL:
-      return kLocalPrefix;
-    case PageDbObjectStatus::SYNCED:
-      return kSyncedPrefix;
-  }
-}
-
-// ImplicitJournalMetadataRow.
-
-constexpr fxl::StringView ImplicitJournalMetadataRow::kPrefix;
-
-std::string ImplicitJournalMetadataRow::GetKeyFor(const JournalId& journal_id) {
-  return fxl::Concatenate({kPrefix, journal_id});
-}
-
-// SyncMetadataRow.
-
-constexpr fxl::StringView SyncMetadataRow::kPrefix;
-
-std::string SyncMetadataRow::GetKeyFor(fxl::StringView key) {
-  return fxl::Concatenate({kPrefix, key});
-}
-
-// JournalEntryRow.
-
-constexpr fxl::StringView JournalEntryRow::kPrefix;
-constexpr fxl::StringView JournalEntryRow::kJournalEntry;
-constexpr fxl::StringView JournalEntryRow::kDeletePrefix;
-constexpr char JournalEntryRow::kImplicitPrefix;
-constexpr char JournalEntryRow::kExplicitPrefix;
-constexpr char JournalEntryRow::kAddPrefix;
-constexpr char JournalEntryRow::kClear;
-
-std::string JournalEntryRow::NewJournalId(rng::Random* random,
-                                          JournalType journal_type) {
-  std::string id;
-  id.resize(kJournalIdSize);
-  id[0] = (journal_type == JournalType::IMPLICIT ? kImplicitPrefix
-                                                 : kExplicitPrefix);
-  random->Draw(&id[1], kJournalIdSize - 1);
-  return id;
-}
-
-std::string JournalEntryRow::GetPrefixFor(const JournalId& journal_id) {
-  return fxl::Concatenate({kPrefix, journal_id, "/"});
-}
-
-std::string JournalEntryRow::GetEntriesPrefixFor(const JournalId& journal_id) {
-  return fxl::Concatenate(
-      {JournalEntryRow::GetPrefixFor(journal_id), kJournalEntry});
-}
-
-std::string JournalEntryRow::GetKeyFor(const JournalId& id,
-                                       fxl::StringView key) {
-  return fxl::Concatenate({JournalEntryRow::GetEntriesPrefixFor(id), key});
-}
-
-std::string JournalEntryRow::GetClearMarkerKey(const JournalId& id) {
-  return fxl::Concatenate({JournalEntryRow::GetPrefixFor(id), {&kClear, 1}});
-}
-
-std::string JournalEntryRow::GetValueFor(
-    const ObjectIdentifier& object_identifier, KeyPriority priority) {
-  char priority_byte =
-      (priority == KeyPriority::EAGER) ? kEagerPrefix : kLazyPrefix;
-  return fxl::Concatenate({{&kAddPrefix, 1},
-                           {&priority_byte, 1},
-                           EncodeObjectIdentifier(object_identifier)});
-}
-
-Status JournalEntryRow::ExtractObjectIdentifier(
-    fxl::StringView db_value, ObjectIdentifier* object_identifier) {
-  if (db_value[0] == kDeletePrefix[0]) {
-    return Status::NOT_FOUND;
-  }
-  if (!DecodeObjectIdentifier(db_value.substr(kAddPrefixSize),
-                              object_identifier)) {
-    return Status::FORMAT_ERROR;
-  }
-  return Status::OK;
-}
-
-// PageIsOnlineRow.
-
-constexpr fxl::StringView PageIsOnlineRow::kKey;
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/db_serialization.h b/bin/ledger/storage/impl/db_serialization.h
deleted file mode 100644
index ee2c49e..0000000
--- a/bin/ledger/storage/impl/db_serialization.h
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_DB_SERIALIZATION_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_DB_SERIALIZATION_H_
-
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/storage/impl/page_db.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/lib/rng/random.h"
-
-namespace storage {
-
-class HeadRow {
- public:
-  static constexpr fxl::StringView kPrefix = "heads/";
-
-  static std::string GetKeyFor(CommitIdView head);
-};
-
-class CommitRow {
- public:
-  static constexpr fxl::StringView kPrefix = "commits/";
-
-  static std::string GetKeyFor(CommitIdView commit_id);
-};
-
-class ObjectRow {
- public:
-  static constexpr fxl::StringView kPrefix = "objects/";
-
-  static std::string GetKeyFor(const ObjectDigest& object_digest);
-};
-
-class UnsyncedCommitRow {
- public:
-  static constexpr fxl::StringView kPrefix = "unsynced/commits/";
-
-  static std::string GetKeyFor(const CommitId& commit_id);
-};
-
-class ObjectStatusRow {
- public:
-  static constexpr fxl::StringView kTransientPrefix =
-      "transient/object_digests/";
-  static constexpr fxl::StringView kLocalPrefix = "local/object_digests/";
-  static constexpr fxl::StringView kSyncedPrefix = "synced/object_digests/";
-
-  static std::string GetKeyFor(PageDbObjectStatus object_status,
-                               const ObjectIdentifier& object_identifier);
-
- private:
-  static fxl::StringView GetPrefixFor(PageDbObjectStatus object_status);
-};
-
-class ImplicitJournalMetadataRow {
- public:
-  static constexpr fxl::StringView kPrefix = "journals/implicit_metadata/";
-
-  static std::string GetKeyFor(const JournalId& journal_id);
-};
-
-class SyncMetadataRow {
- public:
-  static constexpr fxl::StringView kPrefix = "sync_metadata/";
-
-  static std::string GetKeyFor(fxl::StringView key);
-};
-
-class JournalEntryRow {
- public:
-  // Journal keys
-  static const size_t kJournalIdSize = 16;
-  static constexpr fxl::StringView kPrefix = "journals/";
-
-  static constexpr fxl::StringView kJournalEntry = "entry/";
-  static constexpr char kImplicitPrefix = 'I';
-  static constexpr char kExplicitPrefix = 'E';
-  static const size_t kPrefixSize =
-      kPrefix.size() + kJournalIdSize + 1 + kJournalEntry.size();
-
-  // Journal values
-  static constexpr char kClear = 'C';
-  static constexpr char kAddPrefix = 'A';
-  static constexpr fxl::StringView kDeletePrefix = "D";
-  static const char kLazyPrefix = 'L';
-  static const char kEagerPrefix = 'E';
-  static const size_t kAddPrefixSize = 2;
-
-  static std::string NewJournalId(rng::Random* random,
-                                  JournalType journal_type);
-
-  static std::string GetPrefixFor(const JournalId& journal_id);
-
-  static std::string GetEntriesPrefixFor(const JournalId& journal_id);
-
-  static std::string GetKeyFor(const JournalId& id, fxl::StringView key);
-
-  static std::string GetValueFor(const ObjectIdentifier& object_identifier,
-                                 KeyPriority priority);
-
-  static std::string GetClearMarkerKey(const JournalId& id);
-
-  static Status ExtractObjectIdentifier(fxl::StringView db_value,
-                                        ObjectIdentifier* object_identifier);
-};
-
-class PageIsOnlineRow {
- public:
-  static constexpr fxl::StringView kKey = "page_is_online";
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_DB_SERIALIZATION_H_
diff --git a/bin/ledger/storage/impl/file_index.cc b/bin/ledger/storage/impl/file_index.cc
deleted file mode 100644
index 85ed804..0000000
--- a/bin/ledger/storage/impl/file_index.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/file_index.h"
-
-#include "peridot/bin/ledger/storage/impl/object_identifier_encoding.h"
-
-namespace storage {
-
-bool FileIndexSerialization::CheckValidFileIndexSerialization(
-    fxl::StringView data) {
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(data.data()), data.size());
-  return VerifyFileIndexBuffer(verifier);
-}
-
-Status FileIndexSerialization::ParseFileIndex(fxl::StringView content,
-                                              const FileIndex** file_index) {
-  if (!CheckValidFileIndexSerialization(content)) {
-    return Status::FORMAT_ERROR;
-  }
-  *file_index = GetFileIndex(content.data());
-  return Status::OK;
-}
-
-void FileIndexSerialization::BuildFileIndex(
-    const std::vector<ObjectIdentifierAndSize>& children,
-    std::unique_ptr<DataSource::DataChunk>* output, size_t* total_size) {
-  auto builder = std::make_unique<flatbuffers::FlatBufferBuilder>();
-  size_t local_total_size = 0u;
-
-  std::vector<flatbuffers::Offset<ObjectChild>> object_children;
-  for (const auto& identifier_and_size : children) {
-    local_total_size += identifier_and_size.size;
-    object_children.push_back(
-        CreateObjectChild(*builder, identifier_and_size.size,
-                          ToObjectIdentifierStorage(
-                              builder.get(), identifier_and_size.identifier)));
-  }
-  FinishFileIndexBuffer(
-      *builder, CreateFileIndex(*builder, local_total_size,
-                                builder->CreateVector(object_children.data(),
-                                                      object_children.size())));
-
-  *output = DataSource::DataChunk::Create(std::move(builder));
-  *total_size = local_total_size;
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/file_index.fbs b/bin/ledger/storage/impl/file_index.fbs
deleted file mode 100644
index f851fc1..0000000
--- a/bin/ledger/storage/impl/file_index.fbs
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-include "peridot/bin/ledger/storage/impl/object_identifier.fbs";
-
-namespace storage;
-
-// An entry for the identifier of a part of a file.
-table ObjectChild {
-  size: ulong;
-  object_identifier: ObjectIdentifierStorage;
-}
-
-// The index of a chunked file.
-table FileIndex {
-  size: ulong;
-  children: [ObjectChild];
-}
-
-root_type FileIndex;
diff --git a/bin/ledger/storage/impl/file_index.h b/bin/ledger/storage/impl/file_index.h
deleted file mode 100644
index bf6607f..0000000
--- a/bin/ledger/storage/impl/file_index.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_FILE_INDEX_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_FILE_INDEX_H_
-
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/storage/impl/file_index_generated.h"
-#include "peridot/bin/ledger/storage/public/data_source.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-// Wrappers over flatbuffer serialization of FileIndex that ensures additional
-// validation.
-class FileIndexSerialization {
- public:
-  struct ObjectIdentifierAndSize {
-    ObjectIdentifier identifier;
-    uint64_t size;
-  };
-
-  // Checks that |data| is a correct encoding for a |FileIndex|.
-  static bool CheckValidFileIndexSerialization(fxl::StringView data);
-
-  // Parses a |FileIndex| from |content|.
-  static Status ParseFileIndex(fxl::StringView content,
-                               const FileIndex** file_index);
-
-  // Builds the |FileIndex| representing the given children.
-  static void BuildFileIndex(
-      const std::vector<ObjectIdentifierAndSize>& children,
-      std::unique_ptr<DataSource::DataChunk>* output, size_t* total_size);
-
- private:
-  FileIndexSerialization() {}
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_FILE_INDEX_H_
diff --git a/bin/ledger/storage/impl/file_index_unittest.cc b/bin/ledger/storage/impl/file_index_unittest.cc
deleted file mode 100644
index 283cb96..0000000
--- a/bin/ledger/storage/impl/file_index_unittest.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/file_index.h"
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/storage/impl/object_identifier_encoding.h"
-#include "peridot/bin/ledger/storage/impl/storage_test_utils.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-
-namespace storage {
-namespace {
-
-using FileIndexSerializationTest = ledger::TestWithEnvironment;
-
-TEST_F(FileIndexSerializationTest, CheckInvalid) {
-  EXPECT_FALSE(FileIndexSerialization::CheckValidFileIndexSerialization(""));
-
-  std::string ones(200, '\1');
-  EXPECT_FALSE(FileIndexSerialization::CheckValidFileIndexSerialization(ones));
-}
-
-TEST_F(FileIndexSerializationTest, SerializationDeserialization) {
-  const std::vector<FileIndexSerialization::ObjectIdentifierAndSize> elements =
-      {
-          {RandomObjectIdentifier(environment_.random()), 1},
-          {RandomObjectIdentifier(environment_.random()), 2},
-          {RandomObjectIdentifier(environment_.random()), 3},
-          {RandomObjectIdentifier(environment_.random()), 4},
-          {RandomObjectIdentifier(environment_.random()), 3},
-          {RandomObjectIdentifier(environment_.random()), 2},
-          {RandomObjectIdentifier(environment_.random()), 1},
-      };
-
-  constexpr size_t expected_total_size = 16;
-
-  std::unique_ptr<DataSource::DataChunk> chunk;
-  size_t total_size;
-  FileIndexSerialization::BuildFileIndex(elements, &chunk, &total_size);
-
-  EXPECT_EQ(expected_total_size, total_size);
-
-  const FileIndex* file_index;
-  Status status =
-      FileIndexSerialization::ParseFileIndex(chunk->Get(), &file_index);
-  ASSERT_EQ(Status::OK, status);
-
-  EXPECT_EQ(expected_total_size, file_index->size());
-  ASSERT_EQ(elements.size(), file_index->children()->size());
-  const auto& children = *(file_index->children());
-  for (size_t i = 0; i < elements.size(); ++i) {
-    EXPECT_EQ(elements[i].size, children[i]->size());
-    EXPECT_EQ(elements[i].identifier,
-              ToObjectIdentifier(children[i]->object_identifier()));
-  }
-}
-
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/journal_impl.cc b/bin/ledger/storage/impl/journal_impl.cc
deleted file mode 100644
index 3fe3451..0000000
--- a/bin/ledger/storage/impl/journal_impl.cc
+++ /dev/null
@@ -1,362 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/journal_impl.h"
-
-#include <functional>
-#include <map>
-#include <string>
-#include <utility>
-
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/storage/impl/btree/builder.h"
-#include "peridot/bin/ledger/storage/impl/btree/tree_node.h"
-#include "peridot/bin/ledger/storage/impl/commit_impl.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-
-namespace storage {
-
-JournalImpl::JournalImpl(Token /* token */, JournalType type,
-                         ledger::Environment* environment,
-                         PageStorageImpl* page_storage, JournalId id,
-                         CommitId base)
-    : type_(type),
-      environment_(environment),
-      page_storage_(page_storage),
-      id_(std::move(id)),
-      base_(std::move(base)),
-      valid_(true),
-      failed_operation_(false) {}
-
-JournalImpl::~JournalImpl() {
-  // Log a warning if the journal was not committed or rolled back.
-  if (valid_) {
-    FXL_LOG(WARNING) << "Journal not committed or rolled back.";
-  }
-}
-
-std::unique_ptr<Journal> JournalImpl::Simple(JournalType type,
-                                             ledger::Environment* environment,
-                                             PageStorageImpl* page_storage,
-                                             const JournalId& id,
-                                             const CommitId& base) {
-  return std::make_unique<JournalImpl>(Token(), type, environment, page_storage,
-                                       id, base);
-}
-
-std::unique_ptr<Journal> JournalImpl::Merge(ledger::Environment* environment,
-                                            PageStorageImpl* page_storage,
-                                            const JournalId& id,
-                                            const CommitId& base,
-                                            const CommitId& other) {
-  auto journal = std::make_unique<JournalImpl>(
-      Token(), JournalType::EXPLICIT, environment, page_storage, id, base);
-  journal->other_ = std::make_unique<CommitId>(other);
-  return journal;
-}
-
-const JournalId& JournalImpl::GetId() const { return id_; }
-
-void JournalImpl::Commit(
-    fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-        callback) {
-  serializer_.Serialize<Status, std::unique_ptr<const storage::Commit>>(
-      std::move(callback),
-      [this](fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-                 callback) {
-        if (!StateAllowsMutation()) {
-          callback(Status::ILLEGAL_STATE, nullptr);
-          return;
-        }
-
-        GetParents([this, callback = std::move(callback)](
-                       Status status,
-                       std::vector<std::unique_ptr<const storage::Commit>>
-                           parents) mutable {
-          if (status != Status::OK) {
-            callback(status, nullptr);
-            return;
-          }
-          page_storage_->GetJournalEntries(
-              id_, [this, parents = std::move(parents),
-                    callback = std::move(callback)](
-                       Status status,
-                       std::unique_ptr<Iterator<const EntryChange>> changes,
-                       JournalContainsClearOperation
-                           contains_clear_operation) mutable {
-                if (status != Status::OK) {
-                  callback(status, nullptr);
-                  return;
-                }
-                if (contains_clear_operation ==
-                    JournalContainsClearOperation::NO) {
-                  // The journal doesn't contain the clear operation. The
-                  // changes recorded on the journal need to be executed
-                  // over the content of the first parent.
-                  ObjectIdentifier root_identifier =
-                      parents[0]->GetRootIdentifier();
-                  CreateCommitFromChanges(
-                      std::move(parents), std::move(root_identifier),
-                      std::move(changes), std::move(callback));
-                  return;
-                }
-
-                // The journal contains the clear operation. The changes
-                // recorded on the journal need to be executed over an empty
-                // page.
-                btree::TreeNode::Empty(
-                    page_storage_,
-                    [this, parents = std::move(parents),
-                     changes = std::move(changes),
-                     callback = std::move(callback)](
-                        Status status,
-                        ObjectIdentifier root_identifier) mutable {
-                      if (status != Status::OK) {
-                        callback(status, nullptr);
-                        return;
-                      }
-                      CreateCommitFromChanges(
-                          std::move(parents), std::move(root_identifier),
-                          std::move(changes), std::move(callback));
-                    });
-              });
-        });
-      });
-}
-
-void JournalImpl::Rollback(fit::function<void(Status)> callback) {
-  serializer_.Serialize<Status>(std::move(callback),
-                                [this](fit::function<void(Status)> callback) {
-                                  RollbackInternal(std::move(callback));
-                                });
-}
-
-void JournalImpl::Put(convert::ExtendedStringView key,
-                      ObjectIdentifier object_identifier, KeyPriority priority,
-                      fit::function<void(Status)> callback) {
-  serializer_.Serialize<Status>(
-      std::move(callback),
-      [this, key = key.ToString(),
-       object_identifier = std::move(object_identifier),
-       priority](fit::function<void(Status)> callback) mutable {
-        if (!StateAllowsMutation()) {
-          callback(Status::ILLEGAL_STATE);
-          return;
-        }
-        page_storage_->AddJournalEntry(
-            id_, key, std::move(object_identifier), priority,
-            [this, callback = std::move(callback)](Status s) {
-              if (s != Status::OK) {
-                failed_operation_ = true;
-              }
-              callback(s);
-            });
-      });
-}
-
-void JournalImpl::Delete(convert::ExtendedStringView key,
-                         fit::function<void(Status)> callback) {
-  serializer_.Serialize<Status>(
-      std::move(callback),
-      [this, key = key.ToString()](fit::function<void(Status)> callback) {
-        if (!StateAllowsMutation()) {
-          callback(Status::ILLEGAL_STATE);
-          return;
-        }
-
-        page_storage_->RemoveJournalEntry(
-            id_, key, [this, callback = std::move(callback)](Status s) {
-              if (s != Status::OK) {
-                failed_operation_ = true;
-              }
-              callback(s);
-            });
-      });
-}
-
-void JournalImpl::Clear(fit::function<void(Status)> callback) {
-  serializer_.Serialize<Status>(
-      std::move(callback), [this](fit::function<void(Status)> callback) {
-        if (!StateAllowsMutation()) {
-          callback(Status::ILLEGAL_STATE);
-          return;
-        }
-
-        page_storage_->EmptyJournalAndMarkContainsClearOperation(
-            id_, [this, callback = std::move(callback)](Status s) {
-              if (s != Status::OK) {
-                failed_operation_ = true;
-              }
-              callback(s);
-            });
-      });
-}
-
-void JournalImpl::GetParents(
-    fit::function<void(Status,
-                       std::vector<std::unique_ptr<const storage::Commit>>)>
-        callback) {
-  auto waiter = fxl::MakeRefCounted<
-      callback::Waiter<Status, std::unique_ptr<const storage::Commit>>>(
-      Status::OK);
-  page_storage_->GetCommit(base_, waiter->NewCallback());
-  if (other_) {
-    page_storage_->GetCommit(*other_, waiter->NewCallback());
-  }
-  waiter->Finalize(std::move(callback));
-}
-
-void JournalImpl::CreateCommitFromChanges(
-    std::vector<std::unique_ptr<const storage::Commit>> parents,
-    ObjectIdentifier root_identifier,
-    std::unique_ptr<Iterator<const EntryChange>> changes,
-    fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-        callback) {
-  btree::ApplyChanges(
-      environment_->coroutine_service(), page_storage_,
-      std::move(root_identifier), std::move(changes),
-      [this, parents = std::move(parents), callback = std::move(callback)](
-          Status status, ObjectIdentifier object_identifier,
-          std::set<ObjectIdentifier> new_nodes) mutable {
-        if (status != Status::OK) {
-          callback(status, nullptr);
-          return;
-        }
-        // If the commit is a no-op, return early.
-        if (parents.size() == 1 &&
-            parents.front()->GetRootIdentifier() == object_identifier) {
-          // |new_nodes| can be ignored here. If a clear operation has been
-          // executed and the state has then been restored to the one before the
-          // transaction, |ApplyChanges| might have re-created some nodes that
-          // already exist. Because they already exist in a pre-existing commit,
-          // there is no need to update their state.
-
-          // We are in an operation from the serializer: make sure not to sent
-          // the rollback operation in the serializer as well, or a deadlock
-          // will be created.
-          RollbackInternal(
-              [parent = std::move(parents.front()),
-               callback = std::move(callback)](Status status) mutable {
-                callback(status, std::move(parent));
-              });
-          return;
-        }
-        std::unique_ptr<const storage::Commit> commit =
-            CommitImpl::FromContentAndParents(environment_->clock(),
-                                              page_storage_, object_identifier,
-                                              std::move(parents));
-        GetObjectsToSync([this, new_nodes = std::move(new_nodes),
-                          commit = std::move(commit),
-                          callback = std::move(callback)](
-                             Status status, std::vector<ObjectIdentifier>
-                                                objects_to_sync) mutable {
-          if (status != Status::OK) {
-            callback(status, nullptr);
-            return;
-          }
-
-          objects_to_sync.reserve(objects_to_sync.size() + new_nodes.size());
-          // TODO(qsr): When using C++17, move data out of the set using
-          // extract.
-          objects_to_sync.insert(objects_to_sync.end(), new_nodes.begin(),
-                                 new_nodes.end());
-          page_storage_->AddCommitFromLocal(
-              commit->Clone(), std::move(objects_to_sync),
-              [this, commit = std::move(commit),
-               callback = std::move(callback)](Status status) mutable {
-                valid_ = false;
-                if (status != Status::OK) {
-                  callback(status, nullptr);
-                  return;
-                }
-                page_storage_->RemoveJournal(
-                    id_,
-                    [commit = std::move(commit),
-                     callback = std::move(callback)](Status status) mutable {
-                      if (status != Status::OK) {
-                        FXL_LOG(INFO)
-                            << "Commit created, but failed to delete journal.";
-                      }
-                      callback(Status::OK, std::move(commit));
-                    });
-              });
-        });
-      });
-}
-
-void JournalImpl::GetObjectsToSync(
-    fit::function<void(Status status,
-                       std::vector<ObjectIdentifier> objects_to_sync)>
-        callback) {
-  page_storage_->GetJournalEntries(
-      id_, [this, callback = std::move(callback)](
-               Status s, std::unique_ptr<Iterator<const EntryChange>> entries,
-               JournalContainsClearOperation contains_clear_operation) mutable {
-        if (s != Status::OK) {
-          callback(s, {});
-          return;
-        }
-        // Compute the key-value pairs added in this journal.
-        std::map<std::string, ObjectIdentifier> key_values;
-        while (entries->Valid()) {
-          const Entry& entry = (*entries)->entry;
-          if ((*entries)->deleted) {
-            key_values.erase(entry.key);
-          } else {
-            key_values[entry.key] = entry.object_identifier;
-          }
-          entries->Next();
-        }
-        auto waiter =
-            fxl::MakeRefCounted<callback::Waiter<Status, bool>>(Status::OK);
-        for (const auto& key_value : key_values) {
-          page_storage_->ObjectIsUntracked(key_value.second,
-                                           waiter->NewCallback());
-        }
-        waiter->Finalize([key_values = std::move(key_values),
-                          callback = std::move(callback)](
-                             Status s, std::vector<bool> is_untracked) {
-          if (s != Status::OK) {
-            callback(s, {});
-            return;
-          }
-          // Compute the set of values.
-          std::set<ObjectIdentifier> result_set;
-          size_t i = 0;
-          for (const auto& key_value : key_values) {
-            // Only untracked objects should be synced.
-            if (is_untracked[i++]) {
-              result_set.insert(key_value.second);
-            }
-          }
-          std::vector<ObjectIdentifier> objects_to_sync;
-          std::copy(result_set.begin(), result_set.end(),
-                    std::back_inserter(objects_to_sync));
-          callback(Status::OK, std::move(objects_to_sync));
-        });
-      });
-}
-
-void JournalImpl::RollbackInternal(fit::function<void(Status)> callback) {
-  if (!valid_) {
-    callback(Status::ILLEGAL_STATE);
-    return;
-  }
-  page_storage_->RemoveJournal(
-      id_, [this, callback = std::move(callback)](Status s) {
-        if (s == Status::OK) {
-          valid_ = false;
-        }
-        callback(s);
-      });
-}
-
-bool JournalImpl::StateAllowsMutation() {
-  return valid_ && (type_ == JournalType::IMPLICIT || !failed_operation_);
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/journal_impl.h b/bin/ledger/storage/impl/journal_impl.h
deleted file mode 100644
index b00c49c..0000000
--- a/bin/ledger/storage/impl/journal_impl.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_JOURNAL_IMPL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_JOURNAL_IMPL_H_
-
-#include <functional>
-#include <memory>
-#include <string>
-
-#include <lib/callback/operation_serializer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/storage/impl/page_storage_impl.h"
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/journal.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-// A |JournalImpl| represents a commit in progress.
-class JournalImpl : public Journal {
- private:
-  // Passkey idiom to restrict access to the constructor to static factories.
-  class Token;
-
- public:
-  JournalImpl(Token token, JournalType type, ledger::Environment* environment,
-              PageStorageImpl* page_storage, JournalId id, CommitId base);
-  ~JournalImpl() override;
-
-  // Creates a new Journal for a simple commit.
-  static std::unique_ptr<Journal> Simple(JournalType type,
-                                         ledger::Environment* environment,
-                                         PageStorageImpl* page_storage,
-                                         const JournalId& id,
-                                         const CommitId& base);
-
-  // Creates a new Journal for a merge commit.
-  static std::unique_ptr<Journal> Merge(ledger::Environment* environment,
-                                        PageStorageImpl* page_storage,
-                                        const JournalId& id,
-                                        const CommitId& base,
-                                        const CommitId& other);
-
-  // Commits the changes of this |Journal|. Trying to update entries or rollback
-  // will fail after a successful commit. The callback will be called with the
-  // returned status and the new commit. This Journal object should not be
-  // deleted before |callback| is called.
-  void Commit(
-      fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-          callback);
-
-  // Rolls back all changes to this |Journal|. Trying to update entries or
-  // commit will fail with an |ILLEGAL_STATE| after a successful rollback. This
-  // Journal object should not be deleted before |callback| is called.
-  void Rollback(fit::function<void(Status)> callback);
-
-  // Journal:
-  void Put(convert::ExtendedStringView key, ObjectIdentifier object_identifier,
-           KeyPriority priority, fit::function<void(Status)> callback) override;
-  void Delete(convert::ExtendedStringView key,
-              fit::function<void(Status)> callback) override;
-  void Clear(fit::function<void(Status)> callback) override;
-  const JournalId& GetId() const override;
-
- private:
-  class Token {
-   private:
-    Token() {}
-    friend JournalImpl;
-  };
-
-  void GetParents(
-      fit::function<void(Status,
-                         std::vector<std::unique_ptr<const storage::Commit>>)>
-          callback);
-
-  // Creates a new commit. The commit parents are |parents|. The content of the
-  // commit is built by executing |changes| over the content pointed by
-  // |root_identifier|.
-  void CreateCommitFromChanges(
-      std::vector<std::unique_ptr<const storage::Commit>> parents,
-      ObjectIdentifier root_identifier,
-      std::unique_ptr<Iterator<const EntryChange>> changes,
-      fit::function<void(Status, std::unique_ptr<const storage::Commit>)>
-          callback);
-
-  void GetObjectsToSync(
-      fit::function<void(Status status,
-                         std::vector<ObjectIdentifier> objects_to_sync)>
-          callback);
-
-  void RollbackInternal(fit::function<void(Status)> callback);
-
-  // Returns whether the journal is in a state where it is legal to call |Put|,
-  // |Delete| or |Clear|.
-  bool StateAllowsMutation();
-
-  const JournalType type_;
-  ledger::Environment* const environment_;
-  PageStorageImpl* const page_storage_;
-  const JournalId id_;
-  CommitId base_;
-  std::unique_ptr<CommitId> other_;
-  // A journal is no longer valid if either commit or rollback have been
-  // executed.
-  bool valid_;
-  // |failed_operation_| is true if any of the Put or Delete methods in this
-  // journal have failed. In this case, any operation on EXPLICIT journals
-  // other than rolling back will fail. IMPLICIT journals can still be commited
-  // even if some operations have failed.
-  bool failed_operation_;
-  // Serializes all update operations so that entries are inserted in the
-  // journal in the order calls to put and delete were received.
-  callback::OperationSerializer serializer_;
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_JOURNAL_IMPL_H_
diff --git a/bin/ledger/storage/impl/ledger_storage_impl.cc b/bin/ledger/storage/impl/ledger_storage_impl.cc
deleted file mode 100644
index dca3246..0000000
--- a/bin/ledger/storage/impl/ledger_storage_impl.cc
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/ledger_storage_impl.h"
-
-#include <string>
-
-#include <dirent.h>
-#include <algorithm>
-#include <iterator>
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/callback/trace_callback.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/path.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/concatenate.h>
-
-#include "peridot/bin/ledger/filesystem/directory_reader.h"
-#include "peridot/bin/ledger/storage/impl/page_storage_impl.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-#include "peridot/lib/base64url/base64url.h"
-
-namespace storage {
-
-namespace {
-
-constexpr fxl::StringView kStagingPathPrefix = "staging";
-
-// Encodes opaque bytes in a way that is usable as a directory name.
-std::string GetDirectoryName(fxl::StringView bytes) {
-  return base64url::Base64UrlEncode(bytes);
-}
-
-// Decodes opaque bytes used as a directory names into an id. This is the
-// opposite transformation of GetDirectoryName.
-std::string GetId(fxl::StringView bytes) {
-  std::string decoded;
-  bool result = base64url::Base64UrlDecode(bytes, &decoded);
-  FXL_DCHECK(result);
-  return decoded;
-}
-
-}  // namespace
-
-LedgerStorageImpl::LedgerStorageImpl(
-    ledger::Environment* environment,
-    encryption::EncryptionService* encryption_service, DbFactory* db_factory,
-    ledger::DetachedPath content_dir)
-    : environment_(environment),
-      encryption_service_(encryption_service),
-      db_factory_(db_factory),
-      storage_dir_(std::move(content_dir)),
-      weak_factory_(this) {}
-
-LedgerStorageImpl::~LedgerStorageImpl() {}
-
-Status LedgerStorageImpl::Init() {
-  if (!files::CreateDirectoryAt(storage_dir_.root_fd(), storage_dir_.path())) {
-    FXL_LOG(ERROR) << "Failed to create the storage directory in "
-                   << storage_dir_.path();
-    return Status::INTERNAL_IO_ERROR;
-  }
-  return Status::OK;
-}
-
-void LedgerStorageImpl::CreatePageStorage(
-    PageId page_id,
-    fit::function<void(Status, std::unique_ptr<PageStorage>)> callback) {
-  auto timed_callback = TRACE_CALLBACK(std::move(callback), "ledger",
-                                       "ledger_storage_create_page_storage");
-  GetOrCreateDb(GetPathFor(page_id), std::move(page_id),
-                DbFactory::OnDbNotFound::CREATE, std::move(timed_callback));
-}
-
-void LedgerStorageImpl::GetPageStorage(
-    PageId page_id,
-    fit::function<void(Status, std::unique_ptr<PageStorage>)> callback) {
-  auto timed_callback = TRACE_CALLBACK(std::move(callback), "ledger",
-                                       "ledger_storage_get_page_storage");
-  GetOrCreateDb(GetPathFor(page_id), std::move(page_id),
-                DbFactory::OnDbNotFound::RETURN, std::move(timed_callback));
-}
-
-void LedgerStorageImpl::DeletePageStorage(
-    PageIdView page_id, fit::function<void(Status)> callback) {
-  ledger::DetachedPath path = GetPathFor(page_id);
-  ledger::DetachedPath staging_path = GetStagingPathFor(page_id);
-  // |final_callback| will be called from the I/O loop and call the original
-  // |callback| in the main one. The main loop outlives the I/O one, so it's
-  // safe to capture environment_->dispatcher() here.
-  auto final_callback = [dispatcher = environment_->dispatcher(),
-                         callback =
-                             std::move(callback)](Status status) mutable {
-    // Call the callback in the main thread.
-    async::PostTask(dispatcher, [status, callback = std::move(callback)] {
-      callback(status);
-    });
-  };
-
-  async::PostTask(
-      environment_->io_dispatcher(),
-      [path = std::move(path), staging_path = std::move(staging_path),
-       callback = std::move(final_callback)]() mutable {
-        if (!files::IsDirectoryAt(path.root_fd(), path.path())) {
-          callback(Status::NOT_FOUND);
-          return;
-        }
-        files::ScopedTempDirAt tmp_directory(staging_path.root_fd(),
-                                             staging_path.path());
-        std::string destination = tmp_directory.path() + "/content";
-
-        if (renameat(path.root_fd(), path.path().c_str(),
-                     tmp_directory.root_fd(), destination.c_str()) != 0) {
-          FXL_LOG(ERROR) << "Unable to move local page storage to "
-                         << destination << ". Error: " << strerror(errno);
-          callback(Status::IO_ERROR);
-          return;
-        }
-
-        if (!files::DeletePathAt(tmp_directory.root_fd(), destination, true)) {
-          FXL_LOG(ERROR) << "Unable to delete local staging storage at: "
-                         << destination;
-          callback(Status::IO_ERROR);
-          return;
-        }
-        callback(Status::OK);
-      });
-}
-
-std::vector<PageId> LedgerStorageImpl::ListLocalPages() {
-  std::vector<PageId> local_pages;
-  ledger::GetDirectoryEntries(
-      storage_dir_, [&local_pages](fxl::StringView encoded_page_id) {
-        local_pages.emplace_back(GetId(encoded_page_id));
-        return true;
-      });
-  return local_pages;
-}
-
-void LedgerStorageImpl::InitializePageStorage(
-    PageId page_id, std::unique_ptr<Db> db,
-    fit::function<void(Status, std::unique_ptr<PageStorage>)> callback) {
-  auto storage = std::make_unique<PageStorageImpl>(
-      environment_, encryption_service_, std::move(db), std::move(page_id));
-  PageStorageImpl* storage_ptr = storage.get();
-  storage_ptr->Init([callback = std::move(callback),
-                     storage = std::move(storage)](Status status) mutable {
-    if (status != Status::OK) {
-      FXL_LOG(ERROR) << "Failed to initialize PageStorage. Status: " << status;
-      callback(status, nullptr);
-      return;
-    }
-    callback(Status::OK, std::move(storage));
-  });
-}
-
-void LedgerStorageImpl::GetOrCreateDb(
-    ledger::DetachedPath path, PageId page_id,
-    DbFactory::OnDbNotFound on_db_not_found,
-    fit::function<void(Status, std::unique_ptr<PageStorage>)> callback) {
-  db_factory_->GetOrCreateDb(
-      std::move(path), on_db_not_found,
-      callback::MakeScoped(
-          weak_factory_.GetWeakPtr(),
-          [this, page_id = std::move(page_id), callback = std::move(callback)](
-              Status status, std::unique_ptr<Db> db) mutable {
-            if (status != Status::OK) {
-              callback(status, nullptr);
-              return;
-            }
-            InitializePageStorage(std::move(page_id), std::move(db),
-                                  std::move(callback));
-          }));
-}
-
-ledger::DetachedPath LedgerStorageImpl::GetPathFor(PageIdView page_id) {
-  FXL_DCHECK(!page_id.empty());
-  return storage_dir_.SubPath(GetDirectoryName(page_id));
-}
-
-ledger::DetachedPath LedgerStorageImpl::GetStagingPathFor(PageIdView page_id) {
-  FXL_DCHECK(!page_id.empty());
-  return storage_dir_.SubPath(
-      fxl::Concatenate({kStagingPathPrefix, GetDirectoryName(page_id)}));
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/ledger_storage_impl.h b/bin/ledger/storage/impl/ledger_storage_impl.h
deleted file mode 100644
index b1f77aa..0000000
--- a/bin/ledger/storage/impl/ledger_storage_impl.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_LEDGER_STORAGE_IMPL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_LEDGER_STORAGE_IMPL_H_
-
-#include <lib/async/dispatcher.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-#include "peridot/bin/ledger/storage/public/db.h"
-#include "peridot/bin/ledger/storage/public/db_factory.h"
-#include "peridot/bin/ledger/storage/public/ledger_storage.h"
-
-namespace storage {
-
-class LedgerStorageImpl : public LedgerStorage {
- public:
-  LedgerStorageImpl(ledger::Environment* environment,
-                    encryption::EncryptionService* encryption_service,
-                    storage::DbFactory* db_factory,
-                    ledger::DetachedPath content_dir);
-  ~LedgerStorageImpl() override;
-
-  // Initializes this LedgerStorageImpl by creating the |content_dir| directory
-  // given in the constructor.
-  Status Init();
-
-  // LedgerStorage:
-  void CreatePageStorage(
-      PageId page_id,
-      fit::function<void(Status, std::unique_ptr<PageStorage>)> callback)
-      override;
-
-  void GetPageStorage(PageId page_id,
-                      fit::function<void(Status, std::unique_ptr<PageStorage>)>
-                          callback) override;
-
-  void DeletePageStorage(PageIdView page_id,
-                         fit::function<void(Status)> callback) override;
-
-  // For debugging only.
-  std::vector<PageId> ListLocalPages();
-
- private:
-  // Creates and returns through the callback, an initialized |PageStorageImpl|
-  // object.
-  void InitializePageStorage(
-      PageId page_id, std::unique_ptr<Db> db,
-      fit::function<void(Status, std::unique_ptr<PageStorage>)> callback);
-
-  // Gets or creates a new PageStorage at the given |path| for the page with the
-  // given |page_id|.
-  void GetOrCreateDb(
-      ledger::DetachedPath path, PageId page_id,
-      DbFactory::OnDbNotFound on_db_not_found,
-      fit::function<void(Status, std::unique_ptr<PageStorage>)> callback);
-
-  ledger::DetachedPath GetPathFor(PageIdView page_id);
-  ledger::DetachedPath GetDeprecatedPathFor(PageIdView page_id);
-
-  // Returns the staging path for the given |page_id|.
-  ledger::DetachedPath GetStagingPathFor(PageIdView page_id);
-
-  ledger::Environment* const environment_;
-  encryption::EncryptionService* const encryption_service_;
-  storage::DbFactory* const db_factory_;
-  ledger::DetachedPath storage_dir_;
-
-  // This must be the last member of the class.
-  fxl::WeakPtrFactory<LedgerStorageImpl> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerStorageImpl);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_LEDGER_STORAGE_IMPL_H_
diff --git a/bin/ledger/storage/impl/ledger_storage_unittest.cc b/bin/ledger/storage/impl/ledger_storage_unittest.cc
deleted file mode 100644
index 59e2fa8..0000000
--- a/bin/ledger/storage/impl/ledger_storage_unittest.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/storage/fake/fake_db_factory.h"
-#include "peridot/bin/ledger/storage/impl/ledger_storage_impl.h"
-#include "peridot/bin/ledger/storage/public/db_factory.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace storage {
-namespace {
-
-class LedgerStorageTest : public ledger::TestWithEnvironment {
- public:
-  LedgerStorageTest()
-      : encryption_service_(dispatcher()),
-        db_factory_(dispatcher()),
-        storage_(&environment_, &encryption_service_, &db_factory_,
-                 ledger::DetachedPath(tmpfs_.root_fd())) {}
-
-  ~LedgerStorageTest() override {}
-
-  // ledger::TestWithEnvironment:
-  void SetUp() override {
-    ledger::TestWithEnvironment::SetUp();
-
-    ASSERT_EQ(Status::OK, storage_.Init());
-  }
-
- private:
-  scoped_tmpfs::ScopedTmpFS tmpfs_;
-  encryption::FakeEncryptionService encryption_service_;
-
- protected:
-  fake::FakeDbFactory db_factory_;
-  LedgerStorageImpl storage_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerStorageTest);
-};
-
-TEST_F(LedgerStorageTest, CreateGetCreatePageStorage) {
-  PageId page_id = "1234";
-  Status status;
-  std::unique_ptr<PageStorage> page_storage;
-  bool called;
-  storage_.GetPageStorage(
-      page_id, callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &page_storage));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::NOT_FOUND, status);
-  EXPECT_EQ(nullptr, page_storage);
-
-  storage_.CreatePageStorage(
-      page_id, callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &page_storage));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  ASSERT_NE(nullptr, page_storage);
-  ASSERT_EQ(page_id, page_storage->GetId());
-
-  page_storage.reset();
-  storage_.GetPageStorage(
-      page_id, callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &page_storage));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_NE(nullptr, page_storage);
-}
-
-TEST_F(LedgerStorageTest, CreateDeletePageStorage) {
-  PageId page_id = "1234";
-  Status status;
-  bool called;
-  std::unique_ptr<PageStorage> page_storage;
-  storage_.CreatePageStorage(
-      page_id, callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &page_storage));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::OK, status);
-  ASSERT_NE(nullptr, page_storage);
-  ASSERT_EQ(page_id, page_storage->GetId());
-  page_storage.reset();
-
-  storage_.GetPageStorage(
-      page_id, callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &page_storage));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_NE(nullptr, page_storage);
-
-  storage_.DeletePageStorage(
-      page_id, callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  storage_.GetPageStorage(
-      page_id, callback::Capture(callback::SetWhenCalled(&called), &status,
-                                 &page_storage));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::NOT_FOUND, status);
-  EXPECT_EQ(nullptr, page_storage);
-}
-
-TEST_F(LedgerStorageTest, DeletePageStorageNotFound) {
-  PageId page_id = "1234";
-  Status status;
-  bool called;
-
-  storage_.DeletePageStorage(
-      page_id, callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::NOT_FOUND, status);
-}
-
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/leveldb.cc b/bin/ledger/storage/impl/leveldb.cc
deleted file mode 100644
index 95ae61d..0000000
--- a/bin/ledger/storage/impl/leveldb.cc
+++ /dev/null
@@ -1,347 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/leveldb.h"
-
-#include <utility>
-
-#include <lib/async/cpp/task.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/path.h>
-#include <lib/fxl/logging.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/cobalt/cobalt.h"
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/storage/impl/object_impl.h"
-#include "util/env_fuchsia.h"
-
-namespace storage {
-
-using coroutine::CoroutineHandler;
-
-namespace {
-
-Status MakeEmptySyncCallAndCheck(async_dispatcher_t* dispatcher,
-                                 coroutine::CoroutineHandler* handler) {
-  if (coroutine::SyncCall(handler, [&dispatcher](fit::closure on_done) {
-        async::PostTask(dispatcher, std::move(on_done));
-      }) == coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERRUPTED;
-  }
-  return Status::OK;
-}
-
-Status ConvertStatus(leveldb::Status s) {
-  if (s.IsNotFound()) {
-    return Status::NOT_FOUND;
-  }
-  if (!s.ok()) {
-    FXL_LOG(ERROR) << "LevelDB error: " << s.ToString();
-    return Status::INTERNAL_IO_ERROR;
-  }
-  return Status::OK;
-}
-
-class BatchImpl : public Db::Batch {
- public:
-  // Creates a new Batch based on a leveldb batch. Once |Execute| is called,
-  // |callback| will be called with the same batch, ready to be written in
-  // leveldb. If the destructor is called without a previous execution of the
-  // batch, |callback| will be called with a |nullptr|.
-  BatchImpl(
-      async_dispatcher_t* dispatcher,
-      std::unique_ptr<leveldb::WriteBatch> batch, leveldb::DB* db,
-      fit::function<Status(std::unique_ptr<leveldb::WriteBatch>)> callback)
-      : dispatcher_(dispatcher),
-        batch_(std::move(batch)),
-        db_(db),
-        callback_(std::move(callback)) {}
-
-  ~BatchImpl() override {
-    if (batch_)
-      callback_(nullptr);
-  }
-
-  Status Put(CoroutineHandler* handler, convert::ExtendedStringView key,
-             fxl::StringView value) override {
-    FXL_DCHECK(batch_);
-    if (MakeEmptySyncCallAndCheck(dispatcher_, handler) ==
-        Status::INTERRUPTED) {
-      return Status::INTERRUPTED;
-    }
-    batch_->Put(key, convert::ToSlice(value));
-    return Status::OK;
-  }
-
-  Status Delete(CoroutineHandler* handler,
-                convert::ExtendedStringView key) override {
-    FXL_DCHECK(batch_);
-    batch_->Delete(key);
-    return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-  }
-
-  Status DeleteByPrefix(CoroutineHandler* handler,
-                        convert::ExtendedStringView prefix) override {
-    FXL_DCHECK(batch_);
-    std::unique_ptr<leveldb::Iterator> it(db_->NewIterator(read_options_));
-    for (it->Seek(prefix); it->Valid() && it->key().starts_with(prefix);
-         it->Next()) {
-      batch_->Delete(it->key());
-    }
-    if (MakeEmptySyncCallAndCheck(dispatcher_, handler) ==
-        Status::INTERRUPTED) {
-      return Status::INTERRUPTED;
-    }
-    return ConvertStatus(it->status());
-  }
-
-  Status Execute(CoroutineHandler* handler) override {
-    FXL_DCHECK(batch_);
-    if (MakeEmptySyncCallAndCheck(dispatcher_, handler) ==
-        Status::INTERRUPTED) {
-      return Status::INTERRUPTED;
-    }
-    return callback_(std::move(batch_));
-  }
-
- private:
-  async_dispatcher_t* const dispatcher_;
-  std::unique_ptr<leveldb::WriteBatch> batch_;
-
-  const leveldb::ReadOptions read_options_;
-  leveldb::DB* db_;
-
-  fit::function<Status(std::unique_ptr<leveldb::WriteBatch>)> callback_;
-};
-
-class RowIterator
-    : public Iterator<const std::pair<convert::ExtendedStringView,
-                                      convert::ExtendedStringView>> {
- public:
-  RowIterator(std::unique_ptr<leveldb::Iterator> it, std::string prefix)
-      : it_(std::move(it)), prefix_(std::move(prefix)) {
-    PrepareEntry();
-  }
-
-  ~RowIterator() override {}
-
-  Iterator<const std::pair<convert::ExtendedStringView,
-                           convert::ExtendedStringView>>&
-  Next() override {
-    it_->Next();
-    PrepareEntry();
-    return *this;
-  }
-
-  bool Valid() const final {
-    return it_->Valid() && it_->key().starts_with(prefix_);
-  }
-
-  Status GetStatus() const override {
-    return it_->status().ok() ? Status::OK : Status::INTERNAL_IO_ERROR;
-  }
-
-  const std::pair<convert::ExtendedStringView, convert::ExtendedStringView>&
-  operator*() const override {
-    return *(row_.get());
-  }
-
-  const std::pair<convert::ExtendedStringView, convert::ExtendedStringView>*
-  operator->() const override {
-    return row_.get();
-  }
-
- private:
-  void PrepareEntry() {
-    if (!Valid()) {
-      row_.reset(nullptr);
-      return;
-    }
-    row_ = std::make_unique<
-        std::pair<convert::ExtendedStringView, convert::ExtendedStringView>>(
-        it_->key(), it_->value());
-  }
-
-  std::unique_ptr<leveldb::Iterator> it_;
-  const std::string prefix_;
-
-  std::unique_ptr<
-      std::pair<convert::ExtendedStringView, convert::ExtendedStringView>>
-      row_;
-};
-
-}  // namespace
-
-LevelDb::LevelDb(async_dispatcher_t* dispatcher, ledger::DetachedPath db_path)
-    : dispatcher_(dispatcher), db_path_(std::move(db_path)) {}
-
-LevelDb::~LevelDb() {
-  FXL_DCHECK(!active_batches_count_)
-      << "Not all LevelDb batches have been executed or rolled back.";
-}
-
-Status LevelDb::Init() {
-  TRACE_DURATION("ledger", "leveldb_init");
-  if (!files::CreateDirectoryAt(db_path_.root_fd(), db_path_.path())) {
-    FXL_LOG(ERROR) << "Failed to create directory under " << db_path_.path();
-    return Status::INTERNAL_IO_ERROR;
-  }
-  fxl::UniqueFD unique_fd;
-  ledger::DetachedPath db_path = db_path_;
-  if (db_path_.path() != ".") {
-    // Open a UniqueFD at the db path.
-    unique_fd = db_path_.OpenFD(&db_path);
-    if (!unique_fd.is_valid()) {
-      FXL_LOG(ERROR) << "Unable to open directory at " << db_path_.path()
-                     << ". errno: " << errno;
-      return Status::INTERNAL_IO_ERROR;
-    }
-  }
-  env_ = leveldb::MakeFuchsiaEnv(db_path.root_fd());
-  leveldb::Options options;
-  options.env = env_.get();
-  options.create_if_missing = true;
-  leveldb::DB* db = nullptr;
-  leveldb::Status status = leveldb::DB::Open(options, db_path.path(), &db);
-  if (status.IsCorruption()) {
-    FXL_LOG(ERROR) << "Ledger state corrupted at " << db_path_.path()
-                   << " with leveldb status: " << status.ToString();
-    FXL_LOG(WARNING) << "Trying to recover by erasing the local state.";
-    FXL_LOG(WARNING)
-        << "***** ALL LOCAL CHANGES IN THIS PAGE WILL BE LOST *****";
-    ledger::ReportEvent(ledger::CobaltEvent::LEDGER_LEVELDB_STATE_CORRUPTED);
-
-    if (!files::DeletePathAt(db_path_.root_fd(), db_path_.path(), true)) {
-      FXL_LOG(ERROR) << "Failed to delete corrupted ledger at "
-                     << db_path_.path();
-      return Status::INTERNAL_IO_ERROR;
-    }
-    leveldb::Status status = leveldb::DB::Open(options, db_path.path(), &db);
-    if (!status.ok()) {
-      FXL_LOG(ERROR) << "Failed to create a new LevelDB at " << db_path_.path()
-                     << " with leveldb status: " << status.ToString();
-      return Status::INTERNAL_IO_ERROR;
-    }
-  } else if (!status.ok()) {
-    FXL_LOG(ERROR) << "Failed to open ledger at " << db_path_.path()
-                   << " with leveldb status: " << status.ToString();
-    return Status::INTERNAL_IO_ERROR;
-  }
-  db_.reset(db);
-  return Status::OK;
-}
-
-Status LevelDb::StartBatch(CoroutineHandler* handler,
-                           std::unique_ptr<Db::Batch>* batch) {
-  auto db_batch = std::make_unique<leveldb::WriteBatch>();
-  active_batches_count_++;
-  *batch = std::make_unique<BatchImpl>(
-      dispatcher_, std::move(db_batch), db_.get(),
-      [this](std::unique_ptr<leveldb::WriteBatch> db_batch) {
-        active_batches_count_--;
-        if (db_batch) {
-          leveldb::Status status = db_->Write(write_options_, db_batch.get());
-          if (!status.ok()) {
-            FXL_LOG(ERROR) << "Failed to execute batch with status: "
-                           << status.ToString();
-            return Status::INTERNAL_IO_ERROR;
-          }
-        }
-        return Status::OK;
-      });
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-Status LevelDb::Get(CoroutineHandler* handler, convert::ExtendedStringView key,
-                    std::string* value) {
-  if (MakeEmptySyncCallAndCheck(dispatcher_, handler) == Status::INTERRUPTED) {
-    return Status::INTERRUPTED;
-  }
-  return ConvertStatus(db_->Get(read_options_, key, value));
-}
-
-Status LevelDb::HasKey(CoroutineHandler* handler,
-                       convert::ExtendedStringView key, bool* has_key) {
-  std::unique_ptr<leveldb::Iterator> iterator(db_->NewIterator(read_options_));
-  iterator->Seek(key);
-
-  *has_key = iterator->Valid() && iterator->key() == key;
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-Status LevelDb::GetObject(CoroutineHandler* handler,
-                          convert::ExtendedStringView key,
-                          ObjectIdentifier object_identifier,
-                          std::unique_ptr<const Object>* object) {
-  std::unique_ptr<leveldb::Iterator> iterator(db_->NewIterator(read_options_));
-  iterator->Seek(key);
-
-  if (!iterator->Valid() || iterator->key() != key) {
-    return Status::NOT_FOUND;
-  }
-
-  if (object) {
-    *object = std::make_unique<LevelDBObject>(std::move(object_identifier),
-                                              std::move(iterator));
-  }
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-Status LevelDb::GetByPrefix(CoroutineHandler* handler,
-                            convert::ExtendedStringView prefix,
-                            std::vector<std::string>* key_suffixes) {
-  std::vector<std::string> result;
-  std::unique_ptr<leveldb::Iterator> it(db_->NewIterator(read_options_));
-  for (it->Seek(prefix); it->Valid() && it->key().starts_with(prefix);
-       it->Next()) {
-    leveldb::Slice key = it->key();
-    key.remove_prefix(prefix.size());
-    result.push_back(key.ToString());
-  }
-  if (!it->status().ok()) {
-    return ConvertStatus(it->status());
-  }
-  key_suffixes->swap(result);
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-Status LevelDb::GetEntriesByPrefix(
-    CoroutineHandler* handler, convert::ExtendedStringView prefix,
-    std::vector<std::pair<std::string, std::string>>* entries) {
-  std::vector<std::pair<std::string, std::string>> result;
-  std::unique_ptr<leveldb::Iterator> it(db_->NewIterator(read_options_));
-  for (it->Seek(prefix); it->Valid() && it->key().starts_with(prefix);
-       it->Next()) {
-    leveldb::Slice key = it->key();
-    key.remove_prefix(prefix.size());
-    result.emplace_back(key.ToString(), it->value().ToString());
-  }
-  if (!it->status().ok()) {
-    return ConvertStatus(it->status());
-  }
-  entries->swap(result);
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-Status LevelDb::GetIteratorAtPrefix(
-    CoroutineHandler* handler, convert::ExtendedStringView prefix,
-    std::unique_ptr<Iterator<const std::pair<
-        convert::ExtendedStringView, convert::ExtendedStringView>>>* iterator) {
-  std::unique_ptr<leveldb::Iterator> local_iterator(
-      db_->NewIterator(read_options_));
-  local_iterator->Seek(prefix);
-
-  if (iterator) {
-    std::unique_ptr<Iterator<const std::pair<convert::ExtendedStringView,
-                                             convert::ExtendedStringView>>>
-        row_iterator = std::make_unique<RowIterator>(std::move(local_iterator),
-                                                     prefix.ToString());
-    iterator->swap(row_iterator);
-  }
-  return MakeEmptySyncCallAndCheck(dispatcher_, handler);
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/leveldb.h b/bin/ledger/storage/impl/leveldb.h
deleted file mode 100644
index 4fe2283..0000000
--- a/bin/ledger/storage/impl/leveldb.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_LEVELDB_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_LEVELDB_H_
-
-#include <utility>
-
-#include <lib/async/dispatcher.h>
-
-#include "leveldb/db.h"
-#include "leveldb/write_batch.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-#include "peridot/bin/ledger/storage/public/db.h"
-
-namespace storage {
-
-class LevelDb : public Db {
- public:
-  explicit LevelDb(async_dispatcher_t* dispatcher,
-                   ledger::DetachedPath db_path);
-
-  ~LevelDb() override;
-
-  Status Init();
-
-  // Db:
-  Status StartBatch(coroutine::CoroutineHandler* handler,
-                    std::unique_ptr<Batch>* batch) override;
-  Status Get(coroutine::CoroutineHandler* handler,
-             convert::ExtendedStringView key, std::string* value) override;
-  Status HasKey(coroutine::CoroutineHandler* handler,
-                convert::ExtendedStringView key, bool* has_key) override;
-  Status GetObject(coroutine::CoroutineHandler* handler,
-                   convert::ExtendedStringView key,
-                   ObjectIdentifier object_identifier,
-                   std::unique_ptr<const Object>* object) override;
-  Status GetByPrefix(coroutine::CoroutineHandler* handler,
-                     convert::ExtendedStringView prefix,
-                     std::vector<std::string>* key_suffixes) override;
-  Status GetEntriesByPrefix(
-      coroutine::CoroutineHandler* handler, convert::ExtendedStringView prefix,
-      std::vector<std::pair<std::string, std::string>>* entries) override;
-  Status GetIteratorAtPrefix(
-      coroutine::CoroutineHandler* handler, convert::ExtendedStringView prefix,
-      std::unique_ptr<Iterator<const std::pair<convert::ExtendedStringView,
-                                               convert::ExtendedStringView>>>*
-          iterator) override;
-
- private:
-  async_dispatcher_t* const dispatcher_;
-  const ledger::DetachedPath db_path_;
-  std::unique_ptr<leveldb::Env> env_;
-  std::unique_ptr<leveldb::DB> db_;
-
-  const leveldb::WriteOptions write_options_;
-  const leveldb::ReadOptions read_options_;
-
-  uint64_t active_batches_count_ = 0;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LevelDb);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_LEVELDB_H_
diff --git a/bin/ledger/storage/impl/leveldb_factory.cc b/bin/ledger/storage/impl/leveldb_factory.cc
deleted file mode 100644
index 4434077..0000000
--- a/bin/ledger/storage/impl/leveldb_factory.cc
+++ /dev/null
@@ -1,317 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/leveldb_factory.h"
-
-#include <mutex>
-
-#include <lib/async/cpp/task.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/callback/trace_callback.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/memory/ref_counted.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/strings/string_view.h>
-#include <lib/fxl/synchronization/thread_annotations.h>
-
-#include "peridot/lib/convert/convert.h"
-
-// LevelDbFactory tries to keep an empty, initialized instance of LevelDb always
-// available. It stores this cached instance under cached_db/.
-//
-// On requests for new LevelDb instances (see |GetOrCreateDb|), if the cached
-// instance is ready, it is moved to the requested destination and then a new
-// LevelDb is prepared to be cached. If the cached instance is not yet
-// available, the request is queued, and will be handled when the cached db is
-// ready.
-//
-// Note that if multiple requests are received while waiting for the LevelDb
-// initialization, only the first one is queued up. The rest directly request a
-// new LevelDb instance at the final destination.
-
-namespace storage {
-namespace {
-
-// TODO(LE-635): We need to clean the staging path, so that we don't leave
-// unreachable storage on disk.
-constexpr fxl::StringView kStagingPath = "staging";
-constexpr fxl::StringView kCachedDbPath = "cached_db";
-
-constexpr size_t kRandomBytesCount = 16;
-
-// Returns whether the parent directory of |path| exists. If it is not possible
-// to access the parent directory, returns whether the given |path| exists.
-bool ParentDirectoryExists(ledger::DetachedPath path) {
-  size_t last_slash = path.path().find_last_of('/');
-  return files::IsDirectoryAt(path.root_fd(),
-                              last_slash == std::string::npos
-                                  ? path.path()
-                                  : path.path().substr(0, last_slash));
-}
-
-}  // namespace
-
-enum class LevelDbFactory::CreateInStagingPath : bool {
-  NO,
-  YES,
-};
-
-// Holds the LevelDb object together with the information on its initialization
-// state, allowing the coordination between the main and the I/O thread for
-// the creation of new LevelDb objects.
-struct LevelDbFactory::DbWithInitializationState
-    : public fxl::RefCountedThreadSafe<
-          LevelDbFactory::DbWithInitializationState> {
- public:
-  // The mutex used to avoid concurrency issues during initialization.
-  std::mutex mutex;
-
-  // Whether the initialization has been cancelled. This information is known on
-  // the main thread, which is the only one that should update this field if
-  // needed. The I/O thread should read |cancelled| to know whether to proceed
-  // with completing the requested initialization.
-  bool cancelled FXL_GUARDED_BY(mutex) = false;
-
-  // The LevelDb object itself should only be initialized while holding the
-  // mutex, to prevent a race condition when cancelling from the main thread.
-  std::unique_ptr<LevelDb> db FXL_GUARDED_BY(mutex) = nullptr;
-
- private:
-  FRIEND_REF_COUNTED_THREAD_SAFE(DbWithInitializationState);
-  FRIEND_MAKE_REF_COUNTED(DbWithInitializationState);
-
-  DbWithInitializationState() {}
-  ~DbWithInitializationState() {}
-};
-
-LevelDbFactory::LevelDbFactory(ledger::Environment* environment,
-                               ledger::DetachedPath cache_path)
-    : environment_(environment),
-      staging_path_(cache_path.SubPath(kStagingPath)),
-      cached_db_path_(cache_path.SubPath(kCachedDbPath)),
-      coroutine_manager_(environment->coroutine_service()),
-      weak_factory_(this) {}
-
-void LevelDbFactory::Init() {
-  // If there is already a LevelDb instance in the cache directory, initialize
-  // that one, instead of creating a new one.
-  CreateInStagingPath create_in_staging_path = static_cast<CreateInStagingPath>(
-      !files::IsDirectoryAt(cached_db_path_.root_fd(), cached_db_path_.path()));
-  PrepareCachedDb(create_in_staging_path);
-}
-
-void LevelDbFactory::GetOrCreateDb(
-    ledger::DetachedPath db_path, DbFactory::OnDbNotFound on_db_not_found,
-    fit::function<void(Status, std::unique_ptr<Db>)> callback) {
-  if (files::IsDirectoryAt(db_path.root_fd(), db_path.path())) {
-    // If the path exists, there is a LevelDb instance already there. Open and
-    // return it.
-    GetOrCreateDbAtPath(std::move(db_path), CreateInStagingPath::NO,
-                        std::move(callback));
-    return;
-  }
-  if (on_db_not_found == DbFactory::OnDbNotFound::RETURN) {
-    callback(Status::NOT_FOUND, nullptr);
-    return;
-  }
-  // If creating the pre-cached db failed at some point it will likely fail
-  // again. Don't retry caching anymore.
-  if (cached_db_status_ == Status::OK) {
-    if (cached_db_is_ready_) {
-      // A cached instance is available. Use that one for the given callback.
-      ReturnPrecachedDb(std::move(db_path), std::move(callback));
-      return;
-    }
-    if (!pending_request_) {
-      // The cached instance is not ready yet, and there are no other pending
-      // requests. Store this one as pending until the cached db is ready.
-      pending_request_path_ = std::move(db_path);
-      pending_request_ = std::move(callback);
-      return;
-    }
-  }
-  // Either creation of a cached db has failed or a previous request is already
-  // waiting for the cached instance. Request a new LevelDb at the final
-  // destination.
-  GetOrCreateDbAtPath(std::move(db_path), CreateInStagingPath::YES,
-                      std::move(callback));
-}
-
-void LevelDbFactory::GetOrCreateDbAtPath(
-    ledger::DetachedPath db_path, CreateInStagingPath create_in_staging_path,
-    fit::function<void(Status, std::unique_ptr<Db>)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, db_path = std::move(db_path), create_in_staging_path](
-          coroutine::CoroutineHandler* handler,
-          fit::function<void(Status, std::unique_ptr<Db>)> callback) {
-        auto db_with_initialization_state =
-            fxl::MakeRefCounted<DbWithInitializationState>();
-        Status status;
-        if (coroutine::SyncCall(
-                handler,
-                [&](fit::function<void(Status)> callback) {
-                  async::PostTask(
-                      environment_->io_dispatcher(),
-                      [this, db_path = std::move(db_path),
-                       create_in_staging_path, db_with_initialization_state,
-                       callback = std::move(callback)]() mutable {
-                        GetOrCreateDbAtPathOnIOThread(
-                            std::move(db_path), create_in_staging_path,
-                            std::move(db_with_initialization_state),
-                            std::move(callback));
-                      });
-                },
-                &status) == coroutine::ContinuationStatus::OK) {
-          // The coroutine returned normally, the initialization was done
-          // completely on the I/O thread, return normally.
-          std::lock_guard<std::mutex> guard(
-              db_with_initialization_state->mutex);
-          callback(status, std::move(db_with_initialization_state->db));
-          return;
-        }
-        // The coroutine is interrupted, but the initialization has been posted
-        // on the I/O thread. The lock must be acquired and |cancelled| must be
-        // set to |true|.
-        //
-        // There are 3 cases to consider:
-        // 1. The lock is acquired before |GetOrCreateDbAtPathOnIOThread| is
-        //    called. |cancelled| will be set to |true| and when
-        //    |GetOrCreateDbAtPathOnIOThread| is executed, it will return early.
-        // 2. The lock is acquired after |GetOrCreateDbAtPathOnIOThread| is
-        //    executed. |GetOrCreateDbAtPathOnIOThread| will not be called
-        //    again, and there is no concurrency issue anymore.
-        // 3. The lock is tentatively acquired while
-        //    |GetOrCreateDbAtPathOnIOThread| is run. Because
-        //    |GetOrCreateDbAtPathOnIOThread| is guarded by the same mutex, this
-        //    will block until |GetOrCreateDbAtPathOnIOThread| is executed, and
-        //    the case is the same as 2.
-
-        std::lock_guard<std::mutex> guard(db_with_initialization_state->mutex);
-        db_with_initialization_state->cancelled = true;
-        db_with_initialization_state->db.reset();
-        callback(Status::INTERRUPTED, nullptr);
-      });
-}
-
-void LevelDbFactory::GetOrCreateDbAtPathOnIOThread(
-    ledger::DetachedPath db_path, CreateInStagingPath create_in_staging_path,
-    fxl::RefPtr<DbWithInitializationState> db_with_initialization_state,
-    fit::function<void(Status)> callback) {
-  std::lock_guard<std::mutex> guard(db_with_initialization_state->mutex);
-  if (db_with_initialization_state->cancelled) {
-    return;
-  }
-  Status status;
-  if (create_in_staging_path == CreateInStagingPath::YES) {
-    status = CreateDbThroughStagingPathOnIOThread(
-        std::move(db_path), &db_with_initialization_state->db);
-  } else {
-    FXL_DCHECK(files::IsDirectoryAt(db_path.root_fd(), db_path.path()));
-    db_with_initialization_state->db = std::make_unique<LevelDb>(
-        environment_->dispatcher(), std::move(db_path));
-    status = db_with_initialization_state->db->Init();
-  }
-  if (status != Status::OK) {
-    // Don't return the created db instance if initialization failed.
-    db_with_initialization_state->db.reset();
-  }
-  async::PostTask(
-      environment_->dispatcher(),
-      [status, callback = std::move(callback)]() mutable { callback(status); });
-}
-
-Status LevelDbFactory::CreateDbThroughStagingPathOnIOThread(
-    ledger::DetachedPath db_path, std::unique_ptr<LevelDb>* db) {
-  char name[kRandomBytesCount];
-  environment_->random()->Draw(name, kRandomBytesCount);
-  ledger::DetachedPath tmp_destination = staging_path_.SubPath(
-      convert::ToHex(fxl::StringView(name, kRandomBytesCount)));
-  // Create a LevelDb instance in a temporary path.
-  auto result =
-      std::make_unique<LevelDb>(environment_->dispatcher(), tmp_destination);
-  Status status = result->Init();
-  if (status != Status::OK) {
-    return status;
-  }
-  // If the parent directory doesn't exist, renameat will fail.
-  // Note that |cached_db_path_| will also be created throught the staging path
-  // and thus, this code path will be reached. Its parent directory is lazily
-  // created when result->Init() (see code above) is called:
-  // - |staging_path_| and |cached_db_path_| share the same parent (the
-  //   |cache_path| given on the constructor), and
-  // - in LevelDb initialization, the directories up to the db path are created.
-  FXL_DCHECK(ParentDirectoryExists(db_path))
-      << "Parent directory does not exit for path: " << db_path.path();
-  // Move it to the final destination.
-  if (renameat(tmp_destination.root_fd(), tmp_destination.path().c_str(),
-               db_path.root_fd(), db_path.path().c_str()) != 0) {
-    FXL_LOG(ERROR) << "Unable to move LevelDb from staging path to final "
-                      "destination: "
-                   << db_path.path() << ". Error: " << strerror(errno);
-    return Status::IO_ERROR;
-  }
-  *db = std::move(result);
-  return Status::OK;
-}
-
-void LevelDbFactory::PrepareCachedDb(
-    CreateInStagingPath create_in_staging_path) {
-  TRACE_ASYNC_BEGIN("ledger", "prepare_cached_db", 0);
-  FXL_DCHECK(!cached_db_is_ready_);
-  FXL_DCHECK(cached_db_ == nullptr);
-  GetOrCreateDbAtPath(
-      cached_db_path_, create_in_staging_path,
-      callback::MakeScoped(weak_factory_.GetWeakPtr(),
-                           [this](Status status, std::unique_ptr<Db> db) {
-                             TRACE_ASYNC_END("ledger", "prepare_cached_db", 0);
-                             cached_db_status_ = status;
-                             cached_db_ = std::move(db);
-                             cached_db_is_ready_ = true;
-                             if (pending_request_) {
-                               auto path = std::move(pending_request_path_);
-                               auto callback = std::move(pending_request_);
-                               pending_request_ = nullptr;
-                               ReturnPrecachedDb(std::move(path),
-                                                 std::move(callback));
-                             }
-                           }));
-}
-
-void LevelDbFactory::ReturnPrecachedDb(
-    ledger::DetachedPath db_path,
-    fit::function<void(Status, std::unique_ptr<Db>)> callback) {
-  FXL_DCHECK(cached_db_is_ready_);
-
-  if (cached_db_status_ != Status::OK) {
-    // If we failed to create a cached db instance, any future attempts will
-    // likely fail as well: just return the status and don't update
-    // |cached_db_is_ready_| or call |PrepareCachedDb|.
-    callback(cached_db_status_, nullptr);
-    return;
-  }
-  // Move the cached db to the final destination.
-  if (renameat(cached_db_path_.root_fd(), cached_db_path_.path().c_str(),
-               db_path.root_fd(), db_path.path().c_str()) != 0) {
-    FXL_LOG(ERROR) << "Unable to move LevelDb from: " << cached_db_path_.path()
-                   << " to final destination: " << db_path.path()
-                   << ". Error: " << strerror(errno);
-    // Moving to the final destination failed, but the cached db was created
-    // succesfully: no need to update |cached_db_is_ready_|, |cached_db_status_|
-    // or |cached_db_|.
-    callback(Status::IO_ERROR, nullptr);
-    return;
-  }
-
-  // We know the |cached_db_status_| is |OK| and the db is already in the final
-  // destination. Asynchronously start preparing the next cached db and then
-  // call the callback.
-  auto cached_db = std::move(cached_db_);
-  cached_db_is_ready_ = false;
-  PrepareCachedDb(CreateInStagingPath::YES);
-  callback(Status::OK, std::move(cached_db));
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/leveldb_factory.h b/bin/ledger/storage/impl/leveldb_factory.h
deleted file mode 100644
index 43aae40..0000000
--- a/bin/ledger/storage/impl/leveldb_factory.h
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_LEVELDB_FACTORY_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_LEVELDB_FACTORY_H_
-
-#include "peridot/bin/ledger/storage/public/db_factory.h"
-
-#include <memory>
-
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine_manager.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-#include "peridot/bin/ledger/storage/impl/leveldb.h"
-
-namespace storage {
-
-// A factory for LevelDb instances.
-//
-// This factory tries to always keep a new empty instance of LevelDb,
-// initialized and pre-cached, in order to immediately respond to requests for
-// new Db instances.
-//
-// When creating new LevelDb instances, using |GetOrCreateDb|, the caller should
-// make sure that there is no live LevelDb instance for the same path.
-class LevelDbFactory : public DbFactory {
- public:
-  LevelDbFactory(ledger::Environment* environment,
-                 ledger::DetachedPath cache_path);
-
-  // Initializes the LevelDbFactory by preparing the cached instance of LevelDb.
-  void Init();
-
-  // DbFactory:
-  void GetOrCreateDb(
-      ledger::DetachedPath db_path, DbFactory::OnDbNotFound on_db_not_found,
-      fit::function<void(Status, std::unique_ptr<Db>)> callback) override;
-
- private:
-  struct DbWithInitializationState;
-  enum class CreateInStagingPath : bool;
-
-  // Gets or creates a new LevelDb instance in the given |db_path|,
-  // initializes it in the I/O thread and then returns it through the
-  // |callback|.
-  void GetOrCreateDbAtPath(
-      ledger::DetachedPath db_path, CreateInStagingPath create_in_staging_path,
-      fit::function<void(Status, std::unique_ptr<Db>)> callback);
-
-  // Gets or creates a new LevelDb instance. This method should be
-  // called from the I/O thread. When initialization is complete, it makes sure
-  // to update the |db_with_initialization_state| with the created LevelDb
-  // instance, and then call the |callback| from the main thread.
-  void GetOrCreateDbAtPathOnIOThread(
-      ledger::DetachedPath db_path, CreateInStagingPath create_in_staging_path,
-      fxl::RefPtr<DbWithInitializationState> db_with_initialization_state,
-      fit::function<void(Status)> callback);
-
-  // Synchronously creates and initializes a new LevelDb instance in a two-step
-  // process: the new instance is created in a temporary directory under the
-  // staging path and, if successful, it is then moved to the given |db_path|.
-  // This way, if initialization is interrupted, the potentially corrupted
-  // database will be in the staging area.
-  Status CreateDbThroughStagingPathOnIOThread(ledger::DetachedPath db_path,
-                                              std::unique_ptr<LevelDb>* db);
-
-  // Asynchronously creates and initializes a new LevelDb instance. Once done,
-  // if there is a pending request, it responds to it.
-  void PrepareCachedDb(CreateInStagingPath create_in_staging_path);
-
-  // Uses the cached LevelDb instance to respond to the given request and
-  // initializes a new LevelDb for the cache directory.
-  void ReturnPrecachedDb(
-      ledger::DetachedPath db_path,
-      fit::function<void(Status, std::unique_ptr<Db>)> callback);
-
-  // If the cached LevelDb instance is available, |cached_db_is_ready_| is set
-  // to |true| and |cached_db_status_| and |cached_db_| are updated to hold the
-  // returned values from the LevelDb creation.
-  // If at any point there is failure in initializing cached db, i.e. when
-  // |cached_db_status_| is not |OK|, LevelDbFactory stops trying to pre-cache
-  // instances, and only tries to create them at the final destination.
-  bool cached_db_is_ready_ = false;
-  Status cached_db_status_ = Status::OK;
-  std::unique_ptr<Db> cached_db_;
-
-  // If a request is received before the cached db is ready, it is queued up, by
-  // storing the requester's callback (|pending_request_|) and the path of the
-  // final destination (|pending_request_path_|).
-  fit::function<void(Status, std::unique_ptr<Db>)> pending_request_;
-  ledger::DetachedPath pending_request_path_;
-
-  ledger::Environment* environment_;
-  // The path where new LevelDb instances are created, before they are moved to
-  // their final destination, or the cached db path.
-  const ledger::DetachedPath staging_path_;
-  // The path that keeps the initialized cached instance of LevelDb.
-  const ledger::DetachedPath cached_db_path_;
-  coroutine::CoroutineManager coroutine_manager_;
-
-  // This must be the last member of the class.
-  fxl::WeakPtrFactory<LevelDbFactory> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LevelDbFactory);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_LEVELDB_FACTORY_H_
diff --git a/bin/ledger/storage/impl/leveldb_factory_unittest.cc b/bin/ledger/storage/impl/leveldb_factory_unittest.cc
deleted file mode 100644
index e93ec77..0000000
--- a/bin/ledger/storage/impl/leveldb_factory_unittest.cc
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/path.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-#include "peridot/bin/ledger/storage/impl/leveldb_factory.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace storage {
-namespace {
-
-class LevelDbFactoryTest : public ledger::TestWithEnvironment {
- public:
-  LevelDbFactoryTest()
-      : base_path_(tmpfs_.root_fd()),
-        cache_path_(base_path_.SubPath("cache")),
-        db_path_(base_path_.SubPath("databases")),
-        db_factory_(&environment_, cache_path_) {}
-
-  ~LevelDbFactoryTest() override {}
-
-  // ledger::TestWithEnvironment:
-  void SetUp() override {
-    ledger::TestWithEnvironment::SetUp();
-
-    ASSERT_TRUE(
-        files::CreateDirectoryAt(cache_path_.root_fd(), cache_path_.path()));
-    ASSERT_TRUE(files::CreateDirectoryAt(db_path_.root_fd(), db_path_.path()));
-
-    db_factory_.Init();
-    RunLoopUntilIdle();
-  }
-
- private:
-  scoped_tmpfs::ScopedTmpFS tmpfs_;
-  ledger::DetachedPath base_path_;
-
- protected:
-  ledger::DetachedPath cache_path_;
-  ledger::DetachedPath db_path_;
-  LevelDbFactory db_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LevelDbFactoryTest);
-};
-
-TEST_F(LevelDbFactoryTest, GetOrCreateDb) {
-  // Create a new instance.
-  Status status;
-  std::unique_ptr<Db> db;
-  bool called;
-  db_factory_.GetOrCreateDb(
-      db_path_.SubPath("db"), DbFactory::OnDbNotFound::CREATE,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &db));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_NE(nullptr, db);
-  // Write one key-value pair.
-  RunInCoroutine([&](coroutine::CoroutineHandler* handler) {
-    std::unique_ptr<Db::Batch> batch;
-    EXPECT_EQ(Status::OK, db->StartBatch(handler, &batch));
-    EXPECT_EQ(Status::OK, batch->Put(handler, "key", "value"));
-    EXPECT_EQ(Status::OK, batch->Execute(handler));
-  });
-
-  // Close the previous instance and open it again.
-  db.reset();
-  db_factory_.GetOrCreateDb(
-      db_path_.SubPath("db"), DbFactory::OnDbNotFound::RETURN,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &db));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_NE(nullptr, db);
-  // Expect to find the previously written key-value pair.
-  RunInCoroutine([&](coroutine::CoroutineHandler* handler) {
-    std::string value;
-    EXPECT_EQ(Status::OK, db->Get(handler, "key", &value));
-    EXPECT_EQ("value", value);
-  });
-}
-
-TEST_F(LevelDbFactoryTest, GetDbOnNotFound) {
-  // Try to get a non existing Db and expect a |NOT_FOUND| status.
-  Status status;
-  std::unique_ptr<Db> db;
-  bool called;
-  db_factory_.GetOrCreateDb(
-      db_path_.SubPath("db"), DbFactory::OnDbNotFound::RETURN,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &db));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::NOT_FOUND, status);
-  EXPECT_EQ(nullptr, db);
-}
-
-TEST_F(LevelDbFactoryTest, CreateMultipleDbs) {
-  int N = 5;
-  Status status;
-  std::unique_ptr<Db> db;
-  bool called;
-
-  // Create N LevelDb instances, one after the other. All of them will use the
-  // existing cached instance and then, initialize the creation of a new one.
-  for (int i = 0; i < N; ++i) {
-    ledger::DetachedPath path = db_path_.SubPath(fxl::NumberToString(i));
-    EXPECT_FALSE(files::IsDirectoryAt(path.root_fd(), path.path()));
-
-    db_factory_.GetOrCreateDb(
-        path, DbFactory::OnDbNotFound::CREATE,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &db));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_NE(nullptr, db);
-    // Check that the directory was created.
-    EXPECT_TRUE(files::IsDirectoryAt(path.root_fd(), path.path()));
-  }
-}
-
-TEST_F(LevelDbFactoryTest, CreateMultipleDbsConcurrently) {
-  int N = 5;
-  Status statuses[N];
-  std::unique_ptr<Db> dbs[N];
-  bool called[N];
-
-  // Create N LevelDb instances concurrently. The first one will use the cached
-  // instance, the 2nd one will be queued up to get the cached one when it's
-  // initialized, and all the others will be created directly at the destination
-  // directory.
-  for (int i = 0; i < N; ++i) {
-    ledger::DetachedPath path = db_path_.SubPath(fxl::NumberToString(i));
-    EXPECT_FALSE(files::IsDirectoryAt(path.root_fd(), path.path()));
-
-    db_factory_.GetOrCreateDb(
-        db_path_.SubPath(fxl::NumberToString(i)),
-        DbFactory::OnDbNotFound::CREATE,
-        callback::Capture(callback::SetWhenCalled(&called[i]), &statuses[i],
-                          &dbs[i]));
-  }
-  RunLoopUntilIdle();
-
-  for (int i = 0; i < N; ++i) {
-    ledger::DetachedPath path = db_path_.SubPath(fxl::NumberToString(i));
-    EXPECT_TRUE(called[i]);
-    EXPECT_EQ(Status::OK, statuses[i]);
-    EXPECT_NE(nullptr, dbs[i]);
-    // Check that the directory was created.
-    EXPECT_TRUE(files::IsDirectoryAt(path.root_fd(), path.path()));
-  }
-}
-
-TEST_F(LevelDbFactoryTest, GetOrCreateDbInCallback) {
-  bool called1;
-  ledger::DetachedPath path1 = db_path_.SubPath("1");
-
-  bool called2;
-  ledger::DetachedPath path2 = db_path_.SubPath("2");
-  Status status2;
-  std::unique_ptr<Db> db2;
-
-  db_factory_.GetOrCreateDb(
-      path1, DbFactory::OnDbNotFound::CREATE,
-      [&](Status status1, std::unique_ptr<Db> db1) {
-        called1 = true;
-        EXPECT_EQ(Status::OK, status1);
-        EXPECT_NE(nullptr, db1);
-        db_factory_.GetOrCreateDb(
-            path2, DbFactory::OnDbNotFound::CREATE,
-            callback::Capture(callback::SetWhenCalled(&called2), &status2,
-                              &db2));
-      });
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called1);
-  EXPECT_TRUE(called2);
-  EXPECT_EQ(Status::OK, status2);
-  EXPECT_NE(nullptr, db2);
-
-  // Check that the directories were created.
-  EXPECT_TRUE(files::IsDirectoryAt(path1.root_fd(), path1.path()));
-  EXPECT_TRUE(files::IsDirectoryAt(path2.root_fd(), path2.path()));
-}
-
-TEST_F(LevelDbFactoryTest, InitWithCachedDbAvailable) {
-  // When an empty LevelDb instance is already cached from a previous
-  // LevelDbFactory execution, don't create a new instance, but use the existing
-  // one directly.
-  scoped_tmpfs::ScopedTmpFS tmpfs;
-  ledger::DetachedPath cache_path(tmpfs.root_fd(), "cache");
-  // Must be the same as |kCachedDbPath| in leveldb_factory.cc.
-  ledger::DetachedPath cached_db_path = cache_path.SubPath("cached_db");
-
-  auto db_factory = std::make_unique<LevelDbFactory>(&environment_, cache_path);
-
-  // The cached db directory should not be created, yet.
-  EXPECT_FALSE(
-      files::IsDirectoryAt(cached_db_path.root_fd(), cached_db_path.path()));
-
-  // Initialize and wait for the cached instance to be created.
-  db_factory->Init();
-  RunLoopUntilIdle();
-
-  // Close the factory. This will not affect the created cached instance, which
-  // was created under |cached_db_path|.
-  db_factory.reset();
-  EXPECT_TRUE(
-      files::IsDirectoryAt(cached_db_path.root_fd(), cached_db_path.path()));
-
-  // Reset and re-initialize the factory object. It should now use the
-  // previously created instance.
-  db_factory = std::make_unique<LevelDbFactory>(&environment_, cache_path);
-  db_factory->Init();
-  RunLoopUntilIdle();
-}
-
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/object_digest.cc b/bin/ledger/storage/impl/object_digest.cc
deleted file mode 100644
index fe0e65b..0000000
--- a/bin/ledger/storage/impl/object_digest.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <bitset>
-
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-
-#include <lib/fxl/strings/concatenate.h>
-
-#include "peridot/bin/ledger/encryption/primitives/hash.h"
-#include "peridot/bin/ledger/storage/impl/constants.h"
-
-namespace storage {
-
-namespace {
-
-static_assert(kStorageHashSize == encryption::kHashSize,
-              "Unexpected kStorageHashSize value");
-
-// The first bit is 1 for inlined values and 0 otherwise.
-constexpr size_t kInlineBit = 0;
-
-// The second bit is 0 for CHUNK and 1 for INDEX.
-constexpr size_t kTypeBit = 1;
-
-// The third bit is 1 for a tree node and 0 otherwise.
-constexpr char kTreeNodeBit = 2;
-
-// Builds an object digest by concatenating |prefix| and |data|.
-ObjectDigest BuildDigest(std::bitset<8> prefix,
-                         convert::ExtendedStringView data) {
-  std::string result;
-  result.reserve(data.size() + 1);
-  result.push_back(prefix.to_ulong());
-  result.append(data.data(), data.size());
-  return ObjectDigest(std::move(result));
-}
-
-}  // namespace
-
-bool IsDigestValid(convert::ExtendedStringView object_digest) {
-  // All object digests should have a prefix.
-  if (object_digest.size() == 0) {
-    FXL_LOG(INFO) << "Invalid object digest: empty.";
-    return false;
-  }
-  std::bitset<8> prefix(object_digest[0]);
-  // Check inline bit.
-  if (prefix[kInlineBit] && object_digest.size() > kStorageHashSize + 1) {
-    FXL_LOG(INFO) << "Invalid object digest: inline but size="
-                  << object_digest.size()
-                  << "; digest=" << convert::ToHex(object_digest);
-    return false;
-  }
-  if (!prefix[kInlineBit] && object_digest.size() != kStorageHashSize + 1) {
-    FXL_LOG(INFO) << "Invalid object digest: not inline but size="
-                  << object_digest.size()
-                  << "; digest=" << convert::ToHex(object_digest);
-    return false;
-  }
-  // All bits must be zero except the ones we use for ObjectDigestInfo.
-  prefix.reset(kInlineBit);
-  prefix.reset(kTypeBit);
-  prefix.reset(kTreeNodeBit);
-  return prefix.none();
-}
-
-bool IsDigestValid(const ObjectDigest& object_digest) {
-  return object_digest.IsValid() && IsDigestValid(object_digest.Serialize());
-}
-
-ObjectDigestInfo GetObjectDigestInfo(const ObjectDigest& object_digest) {
-  FXL_DCHECK(IsDigestValid(object_digest));
-
-  const std::string& digest = object_digest.Serialize();
-  std::bitset<8> prefix(digest[0]);
-  ObjectDigestInfo result;
-  result.object_type =
-      prefix[kTreeNodeBit] ? ObjectType::TREE_NODE : ObjectType::BLOB;
-  result.piece_type = prefix[kTypeBit] ? PieceType::INDEX : PieceType::CHUNK;
-  result.inlined = prefix[kInlineBit] ? InlinedPiece::YES : InlinedPiece::NO;
-  return result;
-}
-
-fxl::StringView ExtractObjectDigestData(const ObjectDigest& object_digest) {
-  FXL_DCHECK(IsDigestValid(object_digest));
-
-  fxl::StringView digest = object_digest.Serialize();
-  return digest.substr(1);
-}
-
-ObjectDigest ComputeObjectDigest(PieceType piece_type, ObjectType object_type,
-                                 convert::ExtendedStringView content) {
-  std::bitset<8> prefix;
-  prefix[kTypeBit] = piece_type == PieceType::INDEX;
-  prefix[kTreeNodeBit] = object_type == ObjectType::TREE_NODE;
-  if (content.size() <= kStorageHashSize) {
-    prefix[kInlineBit] = true;
-    return BuildDigest(prefix, content);
-  }
-  return BuildDigest(prefix, encryption::SHA256WithLengthHash(content));
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/object_digest.h b/bin/ledger/storage/impl/object_digest.h
deleted file mode 100644
index fd63d21..0000000
--- a/bin/ledger/storage/impl/object_digest.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_OBJECT_DIGEST_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_OBJECT_DIGEST_H_
-
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace storage {
-
-// The two types of pieces. When an object is split into multiple pieces, it
-// produces a tree made of:
-// - chunks, at the leaves, that hold the actual values to be concatenated to
-// reconstruct the object,
-// - indices, that reference other pieces.
-// Note that an object that is small enough might not need to be split into
-// multiple pieces (see split.h for the splitting algorithm). In that case, the
-// tree of pieces degenerates to the simple case of single chunk encoding the
-// whole object.
-enum class PieceType {
-  CHUNK,
-  INDEX,
-};
-
-// Whether the piece is stored inline. Inlined pieces are small-enough pieces
-// that are embedded directly in the |ObjectDigest| representing them. If a
-// piece is not inlined, it is stored as a separate blob object, and is
-// referenced by the |ObjectDigest|, which is a hash of its content.
-enum class InlinedPiece { NO, YES };
-
-// Details about the piece represented by an |ObjectDigest|.
-// This information is encoded in the first byte of the digest.
-struct ObjectDigestInfo {
-  // The type of the object encoded by the piece. |object_type| is |TREE_NODE|,
-  // if this piece refers to a tree node object that was not split into pieces,
-  // or if it refers to the root-index of a chunked tree node object; |BLOB|
-  // otherwise.
-  // Consequently, there is no way to distinguish between a piece encoding a
-  // blob object, and an internal piece of a split tree node; deduplication even
-  // means that a single piece may represent both depending on context.
-  ObjectType object_type;
-
-  // The type of the piece.
-  PieceType piece_type;
-
-  // Whether the piece is stored inline.
-  InlinedPiece inlined;
-
-  bool is_inlined() { return inlined == InlinedPiece::YES; }
-  bool is_chunk() { return piece_type == PieceType::CHUNK; }
-};
-
-// Returns whether the given digest is valid.
-bool IsDigestValid(convert::ExtendedStringView object_digest);
-
-// Returns whether the given digest is valid.
-bool IsDigestValid(const ObjectDigest& object_digest);
-
-// Returns the type of |object_digest|.
-ObjectDigestInfo GetObjectDigestInfo(const ObjectDigest& object_digest);
-
-// Extracts the data from |object_digest|. If |object_digest| type is |INLINE|,
-// the returned data is the content of the object, otherwise, it is the hash of
-// the object. The returned view is valid for as long as |object digest|.
-fxl::StringView ExtractObjectDigestData(const ObjectDigest& object_digest);
-
-// Computes the id of a piece with the given |piece_type|, |object_type| and
-// |content|. The inlined bit of ObjectDigestInfo does not need to be provided
-// because it is derived from |content|'s length.
-ObjectDigest ComputeObjectDigest(PieceType piece_type, ObjectType object_type,
-                                 convert::ExtendedStringView content);
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_OBJECT_DIGEST_H_
diff --git a/bin/ledger/storage/impl/object_digest_unittest.cc b/bin/ledger/storage/impl/object_digest_unittest.cc
deleted file mode 100644
index acc6908..0000000
--- a/bin/ledger/storage/impl/object_digest_unittest.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/encryption/primitives/hash.h"
-
-namespace storage {
-namespace {
-
-fxl::StringView operator"" _s(const char* str, size_t size) {
-  return fxl::StringView(str, size);
-}
-
-// Test for object ids smaller than the inlining threshold.
-using ObjectDigestSmallTest = ::testing::TestWithParam<fxl::StringView>;
-
-TEST_P(ObjectDigestSmallTest, Index) {
-  ObjectDigest object_digest =
-      ComputeObjectDigest(PieceType::INDEX, ObjectType::BLOB, GetParam());
-  ASSERT_TRUE(IsDigestValid(object_digest));
-  ObjectDigestInfo info = GetObjectDigestInfo(object_digest);
-  EXPECT_EQ(PieceType::INDEX, info.piece_type);
-  EXPECT_EQ(ObjectType::BLOB, info.object_type);
-  EXPECT_EQ(InlinedPiece::YES, info.inlined);
-  EXPECT_EQ(GetParam(), ExtractObjectDigestData(object_digest));
-}
-
-TEST_P(ObjectDigestSmallTest, Value) {
-  ObjectDigest object_digest =
-      ComputeObjectDigest(PieceType::CHUNK, ObjectType::TREE_NODE, GetParam());
-  ASSERT_TRUE(IsDigestValid(object_digest));
-  ObjectDigestInfo info = GetObjectDigestInfo(object_digest);
-  EXPECT_EQ(PieceType::CHUNK, info.piece_type);
-  EXPECT_EQ(InlinedPiece::YES, info.inlined);
-  EXPECT_EQ(ObjectType::TREE_NODE, info.object_type);
-  EXPECT_EQ(GetParam(), ExtractObjectDigestData(object_digest));
-}
-
-INSTANTIATE_TEST_CASE_P(ObjectDigestTest, ObjectDigestSmallTest,
-                        ::testing::Values("", "hello", "world\0withzero"_s,
-                                          "01234567890123456789012345678901"));
-
-// Test for object ids bigger than the inlining threshold.
-using ObjectDigestBigTest = ::testing::TestWithParam<fxl::StringView>;
-
-TEST_P(ObjectDigestBigTest, Index) {
-  ObjectDigest object_digest =
-      ComputeObjectDigest(PieceType::INDEX, ObjectType::TREE_NODE, GetParam());
-  ASSERT_TRUE(IsDigestValid(object_digest));
-  ObjectDigestInfo info = GetObjectDigestInfo(object_digest);
-  EXPECT_EQ(PieceType::INDEX, info.piece_type);
-  EXPECT_EQ(ObjectType::TREE_NODE, info.object_type);
-  EXPECT_EQ(InlinedPiece::NO, info.inlined);
-  EXPECT_EQ(encryption::SHA256WithLengthHash(GetParam()),
-            ExtractObjectDigestData(object_digest));
-}
-
-TEST_P(ObjectDigestBigTest, Value) {
-  ObjectDigest object_digest =
-      ComputeObjectDigest(PieceType::CHUNK, ObjectType::BLOB, GetParam());
-  ASSERT_TRUE(IsDigestValid(object_digest));
-  ObjectDigestInfo info = GetObjectDigestInfo(object_digest);
-  EXPECT_EQ(PieceType::CHUNK, info.piece_type);
-  EXPECT_EQ(ObjectType::BLOB, info.object_type);
-  EXPECT_EQ(InlinedPiece::NO, info.inlined);
-  EXPECT_EQ(encryption::SHA256WithLengthHash(GetParam()),
-            ExtractObjectDigestData(object_digest));
-}
-
-INSTANTIATE_TEST_CASE_P(ObjectDigestTest, ObjectDigestBigTest,
-                        ::testing::Values("012345678901234567890123456789012",
-                                          "012345678900123456789001234567890012"
-                                          "345678900123456789001234567890012345"
-                                          "67890"));
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/object_identifier.fbs b/bin/ledger/storage/impl/object_identifier.fbs
deleted file mode 100644
index 762cc8f..0000000
--- a/bin/ledger/storage/impl/object_identifier.fbs
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-namespace storage;
-
-// The identifier of an object. This contains the digest of the object, as well
-// as the information needed to hide its name and encrypt its content.
-table ObjectIdentifierStorage {
-  key_index: uint;
-  deletion_scope_id: uint;
-  object_digest: [ubyte];
-}
-
-root_type ObjectIdentifierStorage;
diff --git a/bin/ledger/storage/impl/object_identifier_encoding.cc b/bin/ledger/storage/impl/object_identifier_encoding.cc
deleted file mode 100644
index 623f0e7..0000000
--- a/bin/ledger/storage/impl/object_identifier_encoding.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/object_identifier_encoding.h"
-
-#include <limits>
-
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-
-namespace storage {
-ObjectIdentifier ToObjectIdentifier(
-    const ObjectIdentifierStorage* object_identifier_storage) {
-  return {object_identifier_storage->key_index(),
-          object_identifier_storage->deletion_scope_id(),
-          ObjectDigest(object_identifier_storage->object_digest())};
-}
-
-flatbuffers::Offset<ObjectIdentifierStorage> ToObjectIdentifierStorage(
-    flatbuffers::FlatBufferBuilder* builder,
-    const ObjectIdentifier& object_identifier) {
-  return CreateObjectIdentifierStorage(
-      *builder, object_identifier.key_index(),
-      object_identifier.deletion_scope_id(),
-      convert::ToFlatBufferVector(
-          builder, object_identifier.object_digest().Serialize()));
-}
-
-std::string EncodeObjectIdentifier(const ObjectIdentifier& object_identifier) {
-  flatbuffers::FlatBufferBuilder builder;
-  builder.Finish(ToObjectIdentifierStorage(&builder, object_identifier));
-  return std::string(reinterpret_cast<const char*>(builder.GetBufferPointer()),
-                     builder.GetSize());
-}
-
-bool DecodeObjectIdentifier(fxl::StringView data,
-                            ObjectIdentifier* object_identifier) {
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(data.data()), data.size());
-  if (!VerifyObjectIdentifierStorageBuffer(verifier)) {
-    return false;
-  }
-  const ObjectIdentifierStorage* storage = GetObjectIdentifierStorage(
-      reinterpret_cast<const unsigned char*>(data.data()));
-  if (!IsObjectIdentifierStorageValid(storage)) {
-    return false;
-  }
-  *object_identifier = ToObjectIdentifier(storage);
-  return true;
-}
-
-bool IsObjectIdentifierStorageValid(const ObjectIdentifierStorage* storage) {
-  return storage && storage->object_digest() &&
-         IsDigestValid(storage->object_digest());
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/object_identifier_encoding.h b/bin/ledger/storage/impl/object_identifier_encoding.h
deleted file mode 100644
index 51460bf..0000000
--- a/bin/ledger/storage/impl/object_identifier_encoding.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_OBJECT_IDENTIFIER_ENCODING_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_OBJECT_IDENTIFIER_ENCODING_H_
-
-#include "peridot/bin/ledger/storage/impl/object_identifier_generated.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "third_party/flatbuffers/include/flatbuffers/flatbuffers.h"
-
-namespace storage {
-
-// Converts a |ObjectIdentifierStorage| to an |ObjectIdentifier|.
-ObjectIdentifier ToObjectIdentifier(
-    const ObjectIdentifierStorage* object_identifier_storage);
-
-// Converts a |ObjectIdentifier| to an |ObjectIdentifierStorage|.
-flatbuffers::Offset<ObjectIdentifierStorage> ToObjectIdentifierStorage(
-    flatbuffers::FlatBufferBuilder* builder,
-    const ObjectIdentifier& object_identifier);
-
-// Encode an ObjectIdentifier into a string.
-std::string EncodeObjectIdentifier(const ObjectIdentifier& object_identifier);
-
-// Decode an ObjectIdentifier from a string. Return |true| in case of success,
-// |false| otherwise.
-bool DecodeObjectIdentifier(fxl::StringView data,
-                            ObjectIdentifier* object_identifier);
-
-// Returns whether a |ObjectIdentifierStorage| obtained from flatbuffer is
-// valid.
-bool IsObjectIdentifierStorageValid(const ObjectIdentifierStorage* storage);
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_OBJECT_IDENTIFIER_ENCODING_H_
diff --git a/bin/ledger/storage/impl/object_impl.cc b/bin/ledger/storage/impl/object_impl.cc
deleted file mode 100644
index b29e3d0..0000000
--- a/bin/ledger/storage/impl/object_impl.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/object_impl.h"
-
-#include <utility>
-
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-
-namespace storage {
-
-namespace {
-uint64_t ToFullPages(uint64_t value) {
-  return (value + PAGE_SIZE - 1) & (~(PAGE_SIZE - 1));
-}
-}  // namespace
-
-InlinedObject::InlinedObject(ObjectIdentifier identifier)
-    : identifier_(std::move(identifier)) {}
-InlinedObject::~InlinedObject() {}
-
-ObjectIdentifier InlinedObject::GetIdentifier() const { return identifier_; }
-
-Status InlinedObject::GetData(fxl::StringView* data) const {
-  *data = ExtractObjectDigestData(identifier_.object_digest());
-  return Status::OK;
-}
-
-StringObject::StringObject(ObjectIdentifier identifier, std::string content)
-    : identifier_(std::move(identifier)), content_(std::move(content)) {}
-
-StringObject::~StringObject() {}
-
-ObjectIdentifier StringObject::GetIdentifier() const { return identifier_; }
-
-Status StringObject::GetData(fxl::StringView* data) const {
-  *data = content_;
-  return Status::OK;
-}
-
-LevelDBObject::LevelDBObject(ObjectIdentifier identifier,
-                             std::unique_ptr<leveldb::Iterator> iterator)
-    : identifier_(std::move(identifier)), iterator_(std::move(iterator)) {}
-
-LevelDBObject::~LevelDBObject() {}
-
-ObjectIdentifier LevelDBObject::GetIdentifier() const { return identifier_; }
-
-Status LevelDBObject::GetData(fxl::StringView* data) const {
-  *data = convert::ExtendedStringView(iterator_->value());
-  return Status::OK;
-}
-
-VmoObject::VmoObject(ObjectIdentifier identifier, fsl::SizedVmo vmo)
-    : identifier_(std::move(identifier)), vmo_(std::move(vmo)) {}
-
-VmoObject::~VmoObject() {
-  if (vmar_) {
-    vmar_.destroy();
-  }
-}
-
-ObjectIdentifier VmoObject::GetIdentifier() const { return identifier_; }
-
-Status VmoObject::GetData(fxl::StringView* data) const {
-  Status status = Initialize();
-  if (status != Status::OK) {
-    return status;
-  }
-  *data = data_;
-  return Status::OK;
-}
-
-Status VmoObject::GetVmo(fsl::SizedVmo* vmo) const {
-  Status status = Initialize();
-  if (status != Status::OK) {
-    return status;
-  }
-
-  zx_status_t zx_status =
-      vmo_.Duplicate(ZX_RIGHTS_BASIC | ZX_RIGHT_READ | ZX_RIGHT_MAP, vmo);
-  if (zx_status != ZX_OK) {
-    FXL_LOG(ERROR) << "Unable to duplicate a vmo. Status: " << zx_status;
-    return Status::INTERNAL_IO_ERROR;
-  }
-  return Status::OK;
-}
-
-Status VmoObject::Initialize() const {
-  if (initialized_) {
-    return Status::OK;
-  }
-
-  uintptr_t allocate_address;
-  zx_status_t zx_status = zx::vmar::root_self()->allocate(
-      0, ToFullPages(vmo_.size()),
-      ZX_VM_CAN_MAP_READ | ZX_VM_CAN_MAP_WRITE | ZX_VM_CAN_MAP_SPECIFIC, &vmar_,
-      &allocate_address);
-  if (zx_status != ZX_OK) {
-    FXL_LOG(ERROR) << "Unable to allocate VMAR. Error: " << zx_status;
-    return Status::INTERNAL_IO_ERROR;
-  }
-
-  char* mapped_address;
-  zx_status = vmar_.map(0, vmo_.vmo(), 0, vmo_.size(),
-                        ZX_VM_PERM_READ | ZX_VM_PERM_WRITE | ZX_VM_SPECIFIC,
-                        reinterpret_cast<uintptr_t*>(&mapped_address));
-  if (zx_status != ZX_OK) {
-    FXL_LOG(ERROR) << "Unable to map VMO. Error: " << zx_status;
-    vmar_.reset();
-    return Status::INTERNAL_IO_ERROR;
-  }
-
-  data_ = fxl::StringView(mapped_address, vmo_.size());
-  initialized_ = true;
-
-  return Status::OK;
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/object_impl.h b/bin/ledger/storage/impl/object_impl.h
deleted file mode 100644
index 79a2e4d..0000000
--- a/bin/ledger/storage/impl/object_impl.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_OBJECT_IMPL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_OBJECT_IMPL_H_
-
-#include <memory>
-
-#include <lib/zx/vmar.h>
-
-#include "peridot/bin/ledger/storage/public/object.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/lib/convert/convert.h"
-#include "third_party/leveldb/include/leveldb/iterator.h"
-
-namespace storage {
-
-// Object whose data is equal to its id.
-class InlinedObject : public Object {
- public:
-  explicit InlinedObject(ObjectIdentifier identifier);
-  ~InlinedObject() override;
-
-  // Object:
-  ObjectIdentifier GetIdentifier() const override;
-  Status GetData(fxl::StringView* data) const override;
-
- private:
-  const ObjectIdentifier identifier_;
-};
-
-// Object whose data is backed by a string.
-class StringObject : public Object {
- public:
-  StringObject(ObjectIdentifier identifier, std::string content);
-  ~StringObject() override;
-
-  // Object:
-  ObjectIdentifier GetIdentifier() const override;
-  Status GetData(fxl::StringView* data) const override;
-
- private:
-  const ObjectIdentifier identifier_;
-  std::string content_;
-};
-
-// Object whose data is backed by a value in LevelDB.
-class LevelDBObject : public Object {
- public:
-  LevelDBObject(ObjectIdentifier identifier,
-                std::unique_ptr<leveldb::Iterator> iterator);
-  ~LevelDBObject() override;
-
-  // Object:
-  ObjectIdentifier GetIdentifier() const override;
-  Status GetData(fxl::StringView* data) const override;
-
- private:
-  const ObjectIdentifier identifier_;
-  std::unique_ptr<leveldb::Iterator> iterator_;
-};
-
-// Object whose data is backed by a VMO.
-class VmoObject : public Object {
- public:
-  VmoObject(ObjectIdentifier identifier, fsl::SizedVmo vmo);
-  ~VmoObject() override;
-
-  // Object:
-  ObjectIdentifier GetIdentifier() const override;
-  Status GetData(fxl::StringView* data) const override;
-  Status GetVmo(fsl::SizedVmo* vmo) const override;
-
- private:
-  Status Initialize() const;
-
-  mutable bool initialized_ = false;
-  const ObjectIdentifier identifier_;
-  fsl::SizedVmo vmo_;
-  mutable zx::vmar vmar_;
-  mutable fxl::StringView data_;
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_OBJECT_IMPL_H_
diff --git a/bin/ledger/storage/impl/object_impl_unittest.cc b/bin/ledger/storage/impl/object_impl_unittest.cc
deleted file mode 100644
index c66e120..0000000
--- a/bin/ledger/storage/impl/object_impl_unittest.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/object_impl.h"
-
-#include <lib/fsl/vmo/strings.h>
-#include <zircon/syscalls.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-#include "third_party/leveldb/include/leveldb/db.h"
-#include "util/env_fuchsia.h"
-
-namespace storage {
-namespace {
-
-ObjectIdentifier CreateObjectIdentifier(ObjectDigest digest) {
-  return {1u, 2u, std::move(digest)};
-}
-
-::testing::AssertionResult CheckObjectValue(const Object& object,
-                                            ObjectIdentifier identifier,
-                                            fxl::StringView data) {
-  if (object.GetIdentifier() != identifier) {
-    return ::testing::AssertionFailure()
-           << "Expected id: " << identifier
-           << ", but got: " << object.GetIdentifier();
-  }
-
-  fxl::StringView found_data;
-  Status status = object.GetData(&found_data);
-  if (status != Status::OK) {
-    return ::testing::AssertionFailure()
-           << "Unable to call GetData on object, status: " << status;
-  }
-
-  if (data != found_data) {
-    return ::testing::AssertionFailure()
-           << "Expected data: " << convert::ToHex(data)
-           << ", but got: " << convert::ToHex(found_data);
-  }
-
-  fsl::SizedVmo vmo;
-  status = object.GetVmo(&vmo);
-  if (status != Status::OK) {
-    return ::testing::AssertionFailure()
-           << "Unable to call GetVmo on object, status: " << status;
-  }
-
-  std::string found_data_in_vmo;
-  if (!fsl::StringFromVmo(vmo, &found_data_in_vmo)) {
-    return ::testing::AssertionFailure() << "Unable to read from VMO.";
-  }
-
-  if (data != found_data_in_vmo) {
-    return ::testing::AssertionFailure()
-           << "Expected data in vmo: " << convert::ToHex(data)
-           << ", but got: " << convert::ToHex(found_data_in_vmo);
-  }
-
-  return ::testing::AssertionSuccess();
-}
-
-class ObjectImplTest : public ledger::TestWithEnvironment {
- public:
-  std::string RandomString(size_t size) {
-    std::string result;
-    result.resize(size);
-    environment_.random()->Draw(&result);
-    return result;
-  }
-};
-
-TEST_F(ObjectImplTest, InlinedObject) {
-  std::string data = RandomString(12);
-  ObjectIdentifier identifier = CreateObjectIdentifier(
-      ComputeObjectDigest(PieceType::CHUNK, ObjectType::BLOB, data));
-
-  InlinedObject object(identifier);
-  EXPECT_TRUE(CheckObjectValue(object, identifier, data));
-}
-
-TEST_F(ObjectImplTest, StringObject) {
-  std::string data = RandomString(256);
-  ObjectIdentifier identifier = CreateObjectIdentifier(
-      ComputeObjectDigest(PieceType::CHUNK, ObjectType::BLOB, data));
-
-  StringObject object(identifier, data);
-  EXPECT_TRUE(CheckObjectValue(object, identifier, data));
-}
-
-TEST_F(ObjectImplTest, LevelDBObject) {
-  scoped_tmpfs::ScopedTmpFS tmpfs;
-  auto env = leveldb::MakeFuchsiaEnv(tmpfs.root_fd());
-
-  leveldb::DB* db = nullptr;
-  leveldb::Options options;
-  options.env = env.get();
-  options.create_if_missing = true;
-  leveldb::Status status = leveldb::DB::Open(options, "db", &db);
-  ASSERT_TRUE(status.ok());
-  std::unique_ptr<leveldb::DB> db_ptr(db);
-
-  leveldb::WriteOptions write_options_;
-  leveldb::ReadOptions read_options_;
-
-  std::string data = RandomString(256);
-  ObjectIdentifier identifier = CreateObjectIdentifier(
-      ComputeObjectDigest(PieceType::CHUNK, ObjectType::BLOB, data));
-
-  status = db_ptr->Put(write_options_, "", data);
-  ASSERT_TRUE(status.ok());
-  std::unique_ptr<leveldb::Iterator> iterator(
-      db_ptr->NewIterator(read_options_));
-  iterator->Seek("");
-  ASSERT_TRUE(iterator->Valid());
-  ASSERT_TRUE(iterator->key() == "");
-
-  LevelDBObject object(identifier, std::move(iterator));
-  EXPECT_TRUE(CheckObjectValue(object, identifier, data));
-}
-
-TEST_F(ObjectImplTest, VmoObject) {
-  std::string data = RandomString(256);
-  ObjectIdentifier identifier = CreateObjectIdentifier(
-      ComputeObjectDigest(PieceType::CHUNK, ObjectType::BLOB, data));
-
-  fsl::SizedVmo vmo;
-  ASSERT_TRUE(fsl::VmoFromString(data, &vmo));
-
-  VmoObject object(identifier, std::move(vmo));
-  EXPECT_TRUE(CheckObjectValue(object, identifier, data));
-}
-
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/page_db.h b/bin/ledger/storage/impl/page_db.h
deleted file mode 100644
index c840196..0000000
--- a/bin/ledger/storage/impl/page_db.h
+++ /dev/null
@@ -1,264 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_view.h>
-#include <lib/zx/time.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/storage/public/data_source.h"
-#include "peridot/bin/ledger/storage/public/db.h"
-#include "peridot/bin/ledger/storage/public/iterator.h"
-#include "peridot/bin/ledger/storage/public/journal.h"
-#include "peridot/bin/ledger/storage/public/object.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-class PageStorageImpl;
-
-// Status of an object in the database.
-enum class PageDbObjectStatus {
-  // The object is not in the database.
-  UNKNOWN,
-  // The object is in the database, but not in any commit.
-  TRANSIENT,
-  // The object is associated to a commit, but not yet synced.
-  LOCAL,
-  // The object is synced.
-  SYNCED,
-};
-
-// |PageDbMutator| provides all update (insertion and deletion) operations
-// over |PageDb|.
-class PageDbMutator {
- public:
-  PageDbMutator() {}
-  virtual ~PageDbMutator() {}
-
-  // Heads.
-  // Adds the given |head| in the set of commit heads.
-  FXL_WARN_UNUSED_RESULT virtual Status AddHead(
-      coroutine::CoroutineHandler* handler, CommitIdView head,
-      zx::time_utc timestamp) = 0;
-
-  // Removes the given |head| from the head commits.
-  FXL_WARN_UNUSED_RESULT virtual Status RemoveHead(
-      coroutine::CoroutineHandler* handler, CommitIdView head) = 0;
-
-  // Commits.
-  // Adds the given |commit| in the database.
-  FXL_WARN_UNUSED_RESULT virtual Status AddCommitStorageBytes(
-      coroutine::CoroutineHandler* handler, const CommitId& commit_id,
-      fxl::StringView storage_bytes) = 0;
-
-  // Removes the commit with the given |commit_id| from the commits.
-  FXL_WARN_UNUSED_RESULT virtual Status RemoveCommit(
-      coroutine::CoroutineHandler* handler, const CommitId& commit_id) = 0;
-
-  // Journals.
-  // Creates a new id for a journal with the given type and base commit. In a
-  // merge journal, the base commit is always the left one.
-  FXL_WARN_UNUSED_RESULT virtual Status CreateJournalId(
-      coroutine::CoroutineHandler* handler, JournalType journal_type,
-      const CommitId& base, JournalId* journal_id) = 0;
-
-  // Removes all information on explicit journals from the database.
-  FXL_WARN_UNUSED_RESULT virtual Status RemoveExplicitJournals(
-      coroutine::CoroutineHandler* handler) = 0;
-
-  // Removes all information on the journal with the given |journal_id| from the
-  // database.
-  FXL_WARN_UNUSED_RESULT virtual Status RemoveJournal(
-      coroutine::CoroutineHandler* handler, const JournalId& journal_id) = 0;
-
-  // Adds a new |key|-|value| pair with the given |priority| to the journal with
-  // the given |journal_id|.
-  FXL_WARN_UNUSED_RESULT virtual Status AddJournalEntry(
-      coroutine::CoroutineHandler* handler, const JournalId& journal_id,
-      fxl::StringView key, const ObjectIdentifier& object_identifier,
-      KeyPriority priority) = 0;
-
-  // Removes the given key from the journal with the given |journal_id|.
-  FXL_WARN_UNUSED_RESULT virtual Status RemoveJournalEntry(
-      coroutine::CoroutineHandler* handler, const JournalId& journal_id,
-      convert::ExtendedStringView key) = 0;
-
-  // Marks the journal with the given |journal_id| as containing a clear
-  // operation and removes all entries.
-  FXL_WARN_UNUSED_RESULT virtual Status
-  EmptyJournalAndMarkContainsClearOperation(
-      coroutine::CoroutineHandler* handler, const JournalId& journal_id) = 0;
-
-  // Object data.
-  // Writes the content of the given object.
-  FXL_WARN_UNUSED_RESULT virtual Status WriteObject(
-      coroutine::CoroutineHandler* handler, ObjectIdentifier object_identifier,
-      std::unique_ptr<DataSource::DataChunk> content,
-      PageDbObjectStatus object_status) = 0;
-
-  // Object sync metadata.
-  // Sets the status of the object with the given id.
-  FXL_WARN_UNUSED_RESULT virtual Status SetObjectStatus(
-      coroutine::CoroutineHandler* handler, ObjectIdentifier object_identifier,
-      PageDbObjectStatus object_status) = 0;
-
-  // Commit sync metadata.
-  // Marks the given |commit_id| as synced.
-  FXL_WARN_UNUSED_RESULT virtual Status MarkCommitIdSynced(
-      coroutine::CoroutineHandler* handler, const CommitId& commit_id) = 0;
-
-  // Marks the given |commit_id| as unsynced.
-  FXL_WARN_UNUSED_RESULT virtual Status MarkCommitIdUnsynced(
-      coroutine::CoroutineHandler* handler, const CommitId& commit_id,
-      uint64_t generation) = 0;
-
-  // Sets the opaque sync metadata associated with this page for the given key.
-  FXL_WARN_UNUSED_RESULT virtual Status SetSyncMetadata(
-      coroutine::CoroutineHandler* handler, fxl::StringView key,
-      fxl::StringView value) = 0;
-
-  // Updates the online state of the page.
-  FXL_WARN_UNUSED_RESULT virtual Status MarkPageOnline(
-      coroutine::CoroutineHandler* handler) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageDbMutator);
-};
-
-// |PageDb| manages all Ledger related data that are locally stored. This
-// includes commit, value and tree node objects, information on head commits, as
-// well as metadata on which objects and commits are not yet synchronized to the
-// cloud.
-class PageDb : public PageDbMutator {
- public:
-  // A |Batch| can be used to execute a number of updates in |PageDb|
-  // atomically.
-  class Batch : public PageDbMutator {
-   public:
-    Batch() {}
-    ~Batch() override {}
-
-    // Executes this batch. No further operations in this batch are supported
-    // after a successful execution.
-    FXL_WARN_UNUSED_RESULT virtual Status Execute(
-        coroutine::CoroutineHandler* handler) = 0;
-
-   private:
-    FXL_DISALLOW_COPY_AND_ASSIGN(Batch);
-  };
-
-  PageDb() {}
-  ~PageDb() override {}
-
-  // Starts a new batch. The batch will be written when Execute is called on the
-  // returned object. The PageDb object must outlive the batch object. If the
-  // coroutine is interrupted, |INTERRUPTED| status is returned.
-  FXL_WARN_UNUSED_RESULT virtual Status StartBatch(
-      coroutine::CoroutineHandler* handler, std::unique_ptr<Batch>* batch) = 0;
-
-  // Heads.
-  // Finds all head commits and replaces the contents of |heads| with their ids.
-  // Returns |OK| on success or |IO_ERROR| in case of an error reading the
-  // values. It is not an error if no heads are found. The resulting |heads| are
-  // ordered by the timestamp given at their insertion and if identical, by
-  // their id.
-  FXL_WARN_UNUSED_RESULT virtual Status GetHeads(
-      coroutine::CoroutineHandler* handler, std::vector<CommitId>* heads) = 0;
-
-  // Commits.
-  // Finds the commit with the given |commit_id| and stores its represenation in
-  // storage bytes in the |storage_bytes| string.
-  FXL_WARN_UNUSED_RESULT virtual Status GetCommitStorageBytes(
-      coroutine::CoroutineHandler* handler, CommitIdView commit_id,
-      std::string* storage_bytes) = 0;
-
-  // Journals.
-  // Finds all implicit journal ids and replaces the contents of |journal_ids|
-  // with their ids.
-  FXL_WARN_UNUSED_RESULT virtual Status GetImplicitJournalIds(
-      coroutine::CoroutineHandler* handler,
-      std::vector<JournalId>* journal_ids) = 0;
-
-  // Stores the id of the base commit for the journal with the given |base|
-  // parameter.
-  FXL_WARN_UNUSED_RESULT virtual Status GetBaseCommitForJournal(
-      coroutine::CoroutineHandler* handler, const JournalId& journal_id,
-      CommitId* base) = 0;
-
-  // Finds all the entries of the journal with the given |journal_id| and stores
-  // an interator over the results on |entires|. Also returns a flag indicating
-  // if the journal contains a clear operation, in which case we need to delete
-  // all pre-existing data from the page upon commit.
-  FXL_WARN_UNUSED_RESULT virtual Status GetJournalEntries(
-      coroutine::CoroutineHandler* handler, const JournalId& journal_id,
-      std::unique_ptr<Iterator<const EntryChange>>* entries,
-      JournalContainsClearOperation* contains_clear_operation) = 0;
-
-  // Object data.
-  // Reads the content of the given object. To check whether an object is stored
-  // in the PageDb without retrieving its value, |nullptr| can be given for the
-  // |object| argument.
-  FXL_WARN_UNUSED_RESULT virtual Status ReadObject(
-      coroutine::CoroutineHandler* handler, ObjectIdentifier object_identifier,
-      std::unique_ptr<const Object>* object) = 0;
-
-  // Checks whether the object with the given |object_digest| is stored in the
-  // database.
-  FXL_WARN_UNUSED_RESULT virtual Status HasObject(
-      coroutine::CoroutineHandler* handler, const ObjectDigest& object_digest,
-      bool* has_object) = 0;
-
-  // Returns the status of the object with the given id.
-  FXL_WARN_UNUSED_RESULT virtual Status GetObjectStatus(
-      coroutine::CoroutineHandler* handler, ObjectIdentifier object_identifier,
-      PageDbObjectStatus* object_status) = 0;
-
-  // Commit sync metadata.
-  // Finds the set of unsynced commits and replaces the contents of |commit_ids|
-  // with their ids. The result is ordered by the timestamps given when calling
-  // |MarkCommitIdUnsynced|.
-  FXL_WARN_UNUSED_RESULT virtual Status GetUnsyncedCommitIds(
-      coroutine::CoroutineHandler* handler,
-      std::vector<CommitId>* commit_ids) = 0;
-
-  // Checks if the commit with the given |commit_id| is synced.
-  FXL_WARN_UNUSED_RESULT virtual Status IsCommitSynced(
-      coroutine::CoroutineHandler* handler, const CommitId& commit_id,
-      bool* is_synced) = 0;
-
-  // Object sync metadata.
-  // Finds the set of unsynced pieces and replaces the contents of
-  // |object_identifiers| with their identifiers.
-  FXL_WARN_UNUSED_RESULT virtual Status GetUnsyncedPieces(
-      coroutine::CoroutineHandler* handler,
-      std::vector<ObjectIdentifier>* object_identifiers) = 0;
-
-  // Sync metadata.
-  // Retrieves the opaque sync metadata associated with this page for the given
-  // key.
-  FXL_WARN_UNUSED_RESULT virtual Status GetSyncMetadata(
-      coroutine::CoroutineHandler* handler, fxl::StringView key,
-      std::string* value) = 0;
-
-  // Returns whether the page is online, i.e. has been synced to the cloud or a
-  // peer at least once from this device. By default, the state of a page is
-  // offline. Once the state is set to online, it cannot be unset.
-  FXL_WARN_UNUSED_RESULT virtual Status IsPageOnline(
-      coroutine::CoroutineHandler* handler, bool* page_is_online) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageDb);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_H_
diff --git a/bin/ledger/storage/impl/page_db_batch_impl.cc b/bin/ledger/storage/impl/page_db_batch_impl.cc
deleted file mode 100644
index 20a132c..0000000
--- a/bin/ledger/storage/impl/page_db_batch_impl.cc
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/page_db_batch_impl.h"
-
-#include <memory>
-
-#include <lib/fxl/strings/concatenate.h>
-
-#include "peridot/bin/ledger/storage/impl/data_serialization.h"
-#include "peridot/bin/ledger/storage/impl/db_serialization.h"
-#include "peridot/bin/ledger/storage/impl/journal_impl.h"
-
-#define RETURN_ON_ERROR(expr)   \
-  do {                          \
-    Status status = (expr);     \
-    if (status != Status::OK) { \
-      return status;            \
-    }                           \
-  } while (0)
-
-namespace storage {
-
-using coroutine::CoroutineHandler;
-
-PageDbBatchImpl::PageDbBatchImpl(rng::Random* random,
-                                 std::unique_ptr<Db::Batch> batch, PageDb* db)
-    : random_(random), batch_(std::move(batch)), db_(db) {}
-
-PageDbBatchImpl::~PageDbBatchImpl() {}
-
-Status PageDbBatchImpl::AddHead(CoroutineHandler* handler, CommitIdView head,
-                                zx::time_utc timestamp) {
-  return batch_->Put(handler, HeadRow::GetKeyFor(head),
-                     SerializeData(timestamp));
-}
-
-Status PageDbBatchImpl::RemoveHead(CoroutineHandler* handler,
-                                   CommitIdView head) {
-  return batch_->Delete(handler, HeadRow::GetKeyFor(head));
-}
-
-Status PageDbBatchImpl::AddCommitStorageBytes(CoroutineHandler* handler,
-                                              const CommitId& commit_id,
-                                              fxl::StringView storage_bytes) {
-  return batch_->Put(handler, CommitRow::GetKeyFor(commit_id), storage_bytes);
-}
-
-Status PageDbBatchImpl::RemoveCommit(CoroutineHandler* handler,
-                                     const CommitId& commit_id) {
-  return batch_->Delete(handler, CommitRow::GetKeyFor(commit_id));
-}
-
-Status PageDbBatchImpl::CreateJournalId(coroutine::CoroutineHandler* handler,
-                                        JournalType journal_type,
-                                        const CommitId& base,
-                                        JournalId* journal_id) {
-  JournalId id = JournalEntryRow::NewJournalId(random_, journal_type);
-
-  Status status = Status::OK;
-  if (journal_type == JournalType::IMPLICIT) {
-    status =
-        batch_->Put(handler, ImplicitJournalMetadataRow::GetKeyFor(id), base);
-  }
-
-  if (status == Status::OK) {
-    journal_id->swap(id);
-  }
-  return status;
-}
-
-Status PageDbBatchImpl::RemoveExplicitJournals(CoroutineHandler* handler) {
-  static std::string kExplicitJournalPrefix =
-      fxl::Concatenate({JournalEntryRow::kPrefix,
-                        fxl::StringView(&JournalEntryRow::kExplicitPrefix, 1)});
-  return batch_->DeleteByPrefix(handler, kExplicitJournalPrefix);
-}
-
-Status PageDbBatchImpl::RemoveJournal(CoroutineHandler* handler,
-                                      const JournalId& journal_id) {
-  if (journal_id[0] == JournalEntryRow::kImplicitPrefix) {
-    RETURN_ON_ERROR(batch_->Delete(
-        handler, ImplicitJournalMetadataRow::GetKeyFor(journal_id)));
-  }
-  return batch_->DeleteByPrefix(handler,
-                                JournalEntryRow::GetPrefixFor(journal_id));
-}
-
-Status PageDbBatchImpl::AddJournalEntry(
-    coroutine::CoroutineHandler* handler, const JournalId& journal_id,
-    fxl::StringView key, const ObjectIdentifier& object_identifier,
-    KeyPriority priority) {
-  return batch_->Put(handler, JournalEntryRow::GetKeyFor(journal_id, key),
-                     JournalEntryRow::GetValueFor(object_identifier, priority));
-}
-
-Status PageDbBatchImpl::RemoveJournalEntry(coroutine::CoroutineHandler* handler,
-                                           const JournalId& journal_id,
-                                           convert::ExtendedStringView key) {
-  return batch_->Put(handler, JournalEntryRow::GetKeyFor(journal_id, key),
-                     JournalEntryRow::kDeletePrefix);
-}
-
-Status PageDbBatchImpl::EmptyJournalAndMarkContainsClearOperation(
-    CoroutineHandler* handler, const JournalId& journal_id) {
-  Status status = batch_->DeleteByPrefix(
-      handler, JournalEntryRow::GetPrefixFor(journal_id));
-  if (status != Status::OK) {
-    return status;
-  }
-  return batch_->Put(handler, JournalEntryRow::GetClearMarkerKey(journal_id),
-                     "");
-}
-
-Status PageDbBatchImpl::WriteObject(
-    CoroutineHandler* handler, ObjectIdentifier object_identifier,
-    std::unique_ptr<DataSource::DataChunk> content,
-    PageDbObjectStatus object_status) {
-  FXL_DCHECK(object_status > PageDbObjectStatus::UNKNOWN);
-
-  bool has_key;
-  RETURN_ON_ERROR(
-      db_->HasObject(handler, object_identifier.object_digest(), &has_key));
-  if (has_key) {
-    if (object_status == PageDbObjectStatus::TRANSIENT) {
-      return Status::OK;
-    }
-    return SetObjectStatus(handler, std::move(object_identifier),
-                           object_status);
-  }
-
-  RETURN_ON_ERROR(batch_->Put(
-      handler, ObjectRow::GetKeyFor(object_identifier.object_digest()),
-      content->Get()));
-  return batch_->Put(
-      handler, ObjectStatusRow::GetKeyFor(object_status, object_identifier),
-      "");
-}
-
-Status PageDbBatchImpl::SetObjectStatus(CoroutineHandler* handler,
-                                        ObjectIdentifier object_identifier,
-                                        PageDbObjectStatus object_status) {
-  FXL_DCHECK(object_status >= PageDbObjectStatus::LOCAL);
-  RETURN_ON_ERROR(DCheckHasObject(handler, object_identifier.object_digest()));
-
-  PageDbObjectStatus previous_object_status;
-  RETURN_ON_ERROR(db_->GetObjectStatus(handler, object_identifier,
-                                       &previous_object_status));
-  if (previous_object_status >= object_status) {
-    return Status::OK;
-  }
-  RETURN_ON_ERROR(batch_->Delete(
-      handler,
-      ObjectStatusRow::GetKeyFor(previous_object_status, object_identifier)));
-  return batch_->Put(
-      handler, ObjectStatusRow::GetKeyFor(object_status, object_identifier),
-      "");
-}
-
-Status PageDbBatchImpl::MarkCommitIdSynced(CoroutineHandler* handler,
-                                           const CommitId& commit_id) {
-  return batch_->Delete(handler, UnsyncedCommitRow::GetKeyFor(commit_id));
-}
-
-Status PageDbBatchImpl::MarkCommitIdUnsynced(CoroutineHandler* handler,
-                                             const CommitId& commit_id,
-                                             uint64_t generation) {
-  return batch_->Put(handler, UnsyncedCommitRow::GetKeyFor(commit_id),
-                     SerializeData(generation));
-}
-
-Status PageDbBatchImpl::SetSyncMetadata(CoroutineHandler* handler,
-                                        fxl::StringView key,
-                                        fxl::StringView value) {
-  return batch_->Put(handler, SyncMetadataRow::GetKeyFor(key), value);
-}
-
-Status PageDbBatchImpl::MarkPageOnline(coroutine::CoroutineHandler* handler) {
-  return batch_->Put(handler, PageIsOnlineRow::kKey, "");
-}
-
-Status PageDbBatchImpl::Execute(CoroutineHandler* handler) {
-  return batch_->Execute(handler);
-}
-
-Status PageDbBatchImpl::DCheckHasObject(CoroutineHandler* handler,
-                                        const ObjectDigest& key) {
-#ifdef NDEBUG
-  return Status::OK;
-#else
-  bool result;
-  Status status = db_->HasObject(handler, key, &result);
-  if (status == Status::INTERRUPTED) {
-    return status;
-  }
-  FXL_DCHECK(status == Status::OK && result);
-  return Status::OK;
-#endif
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/page_db_batch_impl.h b/bin/ledger/storage/impl/page_db_batch_impl.h
deleted file mode 100644
index 5550959..0000000
--- a/bin/ledger/storage/impl/page_db_batch_impl.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_BATCH_IMPL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_BATCH_IMPL_H_
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/storage/impl/page_db.h"
-#include "peridot/bin/ledger/storage/public/db.h"
-#include "peridot/lib/rng/random.h"
-
-namespace storage {
-
-class PageDbBatchImpl : public PageDb::Batch {
- public:
-  explicit PageDbBatchImpl(rng::Random* random,
-                           std::unique_ptr<Db::Batch> batch, PageDb* db);
-  ~PageDbBatchImpl() override;
-
-  // Heads.
-  Status AddHead(coroutine::CoroutineHandler* handler, CommitIdView head,
-                 zx::time_utc timestamp) override;
-  Status RemoveHead(coroutine::CoroutineHandler* handler,
-                    CommitIdView head) override;
-
-  // Commits.
-  Status AddCommitStorageBytes(coroutine::CoroutineHandler* handler,
-                               const CommitId& commit_id,
-                               fxl::StringView storage_bytes) override;
-  Status RemoveCommit(coroutine::CoroutineHandler* handler,
-                      const CommitId& commit_id) override;
-
-  // Journals.
-  Status CreateJournalId(coroutine::CoroutineHandler* handler,
-                         JournalType journal_type, const CommitId& base,
-                         JournalId* journal_id) override;
-  Status RemoveExplicitJournals(coroutine::CoroutineHandler* handler) override;
-  Status RemoveJournal(coroutine::CoroutineHandler* handler,
-                       const JournalId& journal_id) override;
-
-  // Journal entries.
-  Status AddJournalEntry(coroutine::CoroutineHandler* handler,
-                         const JournalId& journal_id, fxl::StringView key,
-                         const ObjectIdentifier& object_identifier,
-                         KeyPriority priority) override;
-  Status RemoveJournalEntry(coroutine::CoroutineHandler* handler,
-                            const JournalId& journal_id,
-                            convert::ExtendedStringView key) override;
-  Status EmptyJournalAndMarkContainsClearOperation(
-      coroutine::CoroutineHandler* handler,
-      const JournalId& journal_id) override;
-
-  // Object data.
-  Status WriteObject(coroutine::CoroutineHandler* handler,
-                     ObjectIdentifier object_identifier,
-                     std::unique_ptr<DataSource::DataChunk> content,
-                     PageDbObjectStatus object_status) override;
-  Status SetObjectStatus(coroutine::CoroutineHandler* handler,
-                         ObjectIdentifier object_identifier,
-                         PageDbObjectStatus object_status) override;
-
-  // Commit sync metadata.
-  Status MarkCommitIdSynced(coroutine::CoroutineHandler* handler,
-                            const CommitId& commit_id) override;
-  Status MarkCommitIdUnsynced(coroutine::CoroutineHandler* handler,
-                              const CommitId& commit_id,
-                              uint64_t generation) override;
-
-  // Object sync metadata.
-  Status SetSyncMetadata(coroutine::CoroutineHandler* handler,
-                         fxl::StringView key, fxl::StringView value) override;
-
-  // Page online state.
-  Status MarkPageOnline(coroutine::CoroutineHandler* handler) override;
-
-  Status Execute(coroutine::CoroutineHandler* handler) override;
-
- private:
-  Status DCheckHasObject(coroutine::CoroutineHandler* handler,
-                         const ObjectDigest& key);
-
-  rng::Random* const random_;
-  std::unique_ptr<Db::Batch> batch_;
-  PageDb* const db_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageDbBatchImpl);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_BATCH_IMPL_H_
diff --git a/bin/ledger/storage/impl/page_db_empty_impl.cc b/bin/ledger/storage/impl/page_db_empty_impl.cc
deleted file mode 100644
index 5c84ba8..0000000
--- a/bin/ledger/storage/impl/page_db_empty_impl.cc
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/page_db_empty_impl.h"
-
-namespace storage {
-
-using coroutine::CoroutineHandler;
-
-Status PageDbEmptyImpl::StartBatch(CoroutineHandler* /*handler*/,
-                                   std::unique_ptr<PageDb::Batch>* /*batch*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::GetHeads(CoroutineHandler* /*handler*/,
-                                 std::vector<CommitId>* /*heads*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::GetCommitStorageBytes(CoroutineHandler* /*handler*/,
-                                              CommitIdView /*commit_id*/,
-                                              std::string* /*storage_bytes*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::GetImplicitJournalIds(
-    CoroutineHandler* /*handler*/, std::vector<JournalId>* /*journal_ids*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::GetBaseCommitForJournal(CoroutineHandler* /*handler*/,
-                                                const JournalId& /*journal_id*/,
-                                                CommitId* /*base*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::GetJournalEntries(
-    CoroutineHandler* /*handler*/, const JournalId& /*journal_id*/,
-    std::unique_ptr<Iterator<const EntryChange>>* /*entries*/,
-    JournalContainsClearOperation* /*contains_clear_operation*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::ReadObject(CoroutineHandler* /*handler*/,
-                                   ObjectIdentifier /*object_identifier*/,
-                                   std::unique_ptr<const Object>* /*object*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::HasObject(CoroutineHandler* /*handler*/,
-                                  const ObjectDigest& /*object_digest*/,
-                                  bool* /*has_object*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::GetObjectStatus(CoroutineHandler* /*handler*/,
-                                        ObjectIdentifier /*object_identifier*/,
-                                        PageDbObjectStatus* /*object_status*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::GetUnsyncedCommitIds(
-    CoroutineHandler* /*handler*/, std::vector<CommitId>* /*commit_ids*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::IsCommitSynced(CoroutineHandler* /*handler*/,
-                                       const CommitId& /*commit_id*/,
-                                       bool* /*is_synced*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::GetUnsyncedPieces(
-    CoroutineHandler* /*handler*/,
-    std::vector<ObjectIdentifier>* /*object_identifiers*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::GetSyncMetadata(CoroutineHandler* /*handler*/,
-                                        fxl::StringView /*key*/,
-                                        std::string* /*value*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::IsPageOnline(coroutine::CoroutineHandler* /*handler*/,
-                                     bool* /*page_is_online*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::AddHead(CoroutineHandler* /*handler*/,
-                                CommitIdView /*head*/,
-                                zx::time_utc /*timestamp*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::RemoveHead(CoroutineHandler* /*handler*/,
-                                   CommitIdView /*head*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::AddCommitStorageBytes(
-    CoroutineHandler* /*handler*/, const CommitId& /*commit_id*/,
-    fxl::StringView /*storage_bytes*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::RemoveCommit(CoroutineHandler* /*handler*/,
-                                     const CommitId& /*commit_id*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::CreateJournalId(CoroutineHandler* /*handler*/,
-                                        JournalType /*journal_type*/,
-                                        const CommitId& /*base*/,
-                                        JournalId* /*journal*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::RemoveExplicitJournals(CoroutineHandler* /*handler*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::RemoveJournal(CoroutineHandler* /*handler*/,
-                                      const JournalId& /*journal_id*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::AddJournalEntry(
-    CoroutineHandler* /*handler*/, const JournalId& /*journal_id*/,
-    fxl::StringView /*key*/, const ObjectIdentifier& /*object_identifier*/,
-    KeyPriority /*priority*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::RemoveJournalEntry(
-    CoroutineHandler* /*handler*/, const JournalId& /*journal_id*/,
-    convert::ExtendedStringView /*key*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::EmptyJournalAndMarkContainsClearOperation(
-    coroutine::CoroutineHandler* /*handler*/, const JournalId& /*journal_id*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::WriteObject(
-    CoroutineHandler* /*handler*/, ObjectIdentifier /*object_identifier*/,
-    std::unique_ptr<DataSource::DataChunk> /*content*/,
-    PageDbObjectStatus /*object_status*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::SetObjectStatus(CoroutineHandler* /*handler*/,
-                                        ObjectIdentifier /*object_identifier*/,
-                                        PageDbObjectStatus /*object_status*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::MarkCommitIdSynced(CoroutineHandler* /*handler*/,
-                                           const CommitId& /*commit_id*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::MarkCommitIdUnsynced(CoroutineHandler* /*handler*/,
-                                             const CommitId& /*commit_id*/,
-                                             uint64_t /*generation*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-Status PageDbEmptyImpl::SetSyncMetadata(CoroutineHandler* /*handler*/,
-                                        fxl::StringView /*key*/,
-                                        fxl::StringView /*value*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-
-Status PageDbEmptyImpl::MarkPageOnline(
-    coroutine::CoroutineHandler* /*handlers*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-
-Status PageDbEmptyImpl::Execute(CoroutineHandler* /*handler*/) {
-  return Status::NOT_IMPLEMENTED;
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/page_db_empty_impl.h b/bin/ledger/storage/impl/page_db_empty_impl.h
deleted file mode 100644
index bb7e48e..0000000
--- a/bin/ledger/storage/impl/page_db_empty_impl.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_EMPTY_IMPL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_EMPTY_IMPL_H_
-
-#include "peridot/bin/ledger/storage/impl/page_db.h"
-
-namespace storage {
-
-class PageDbEmptyImpl : public PageDb, public PageDb::Batch {
- public:
-  PageDbEmptyImpl() {}
-  ~PageDbEmptyImpl() override {}
-
-  // PageDb:
-  Status StartBatch(coroutine::CoroutineHandler* handler,
-                    std::unique_ptr<PageDb::Batch>* batch) override;
-  Status GetHeads(coroutine::CoroutineHandler* handler,
-                  std::vector<CommitId>* heads) override;
-  Status GetCommitStorageBytes(coroutine::CoroutineHandler* handler,
-                               CommitIdView commit_id,
-                               std::string* storage_bytes) override;
-  Status GetImplicitJournalIds(coroutine::CoroutineHandler* handler,
-                               std::vector<JournalId>* journal_ids) override;
-  Status GetBaseCommitForJournal(coroutine::CoroutineHandler* handler,
-                                 const JournalId& journal_id,
-                                 CommitId* base) override;
-  Status GetJournalEntries(
-      coroutine::CoroutineHandler* handler, const JournalId& journal_id,
-      std::unique_ptr<Iterator<const EntryChange>>* entries,
-      JournalContainsClearOperation* contains_clear_operation) override;
-
-  // PageDb and PageDb::Batch:
-  Status ReadObject(coroutine::CoroutineHandler* handler,
-                    ObjectIdentifier object_identifier,
-                    std::unique_ptr<const Object>* object) override;
-  Status HasObject(coroutine::CoroutineHandler* handler,
-                   const ObjectDigest& object_digest,
-                   bool* has_object) override;
-  Status GetUnsyncedCommitIds(coroutine::CoroutineHandler* handler,
-                              std::vector<CommitId>* commit_ids) override;
-  Status IsCommitSynced(coroutine::CoroutineHandler* handler,
-                        const CommitId& commit_id, bool* is_synced) override;
-  Status GetUnsyncedPieces(
-      coroutine::CoroutineHandler* handler,
-      std::vector<ObjectIdentifier>* object_identifiers) override;
-  Status GetObjectStatus(coroutine::CoroutineHandler* handler,
-                         ObjectIdentifier object_identifier,
-                         PageDbObjectStatus* object_status) override;
-  Status GetSyncMetadata(coroutine::CoroutineHandler* handler,
-                         fxl::StringView key, std::string* value) override;
-
-  Status IsPageOnline(coroutine::CoroutineHandler* handler,
-                      bool* page_is_online) override;
-
-  Status AddHead(coroutine::CoroutineHandler* handler, CommitIdView head,
-                 zx::time_utc timestamp) override;
-  Status RemoveHead(coroutine::CoroutineHandler* handler,
-                    CommitIdView head) override;
-  Status AddCommitStorageBytes(coroutine::CoroutineHandler* handler,
-                               const CommitId& commit_id,
-                               fxl::StringView storage_bytes) override;
-  Status RemoveCommit(coroutine::CoroutineHandler* handler,
-                      const CommitId& commit_id) override;
-  Status CreateJournalId(coroutine::CoroutineHandler* handler,
-                         JournalType journal_type, const CommitId& base,
-                         JournalId* journal) override;
-  Status RemoveExplicitJournals(coroutine::CoroutineHandler* handler) override;
-  Status RemoveJournal(coroutine::CoroutineHandler* handler,
-                       const JournalId& journal_id) override;
-  Status AddJournalEntry(coroutine::CoroutineHandler* handler,
-                         const JournalId& journal_id, fxl::StringView key,
-                         const ObjectIdentifier& object_identifier,
-                         KeyPriority priority) override;
-  Status RemoveJournalEntry(coroutine::CoroutineHandler* handler,
-                            const JournalId& journal_id,
-                            convert::ExtendedStringView key) override;
-  Status EmptyJournalAndMarkContainsClearOperation(
-      coroutine::CoroutineHandler* handler,
-      const JournalId& journal_id) override;
-  Status WriteObject(coroutine::CoroutineHandler* handler,
-                     ObjectIdentifier object_identifier,
-                     std::unique_ptr<DataSource::DataChunk> content,
-                     PageDbObjectStatus object_status) override;
-  Status MarkCommitIdSynced(coroutine::CoroutineHandler* handler,
-                            const CommitId& commit_id) override;
-  Status MarkCommitIdUnsynced(coroutine::CoroutineHandler* handler,
-                              const CommitId& commit_id,
-                              uint64_t generation) override;
-  Status SetObjectStatus(coroutine::CoroutineHandler* handler,
-                         ObjectIdentifier object_identifier,
-                         PageDbObjectStatus object_status) override;
-  Status SetSyncMetadata(coroutine::CoroutineHandler* handler,
-                         fxl::StringView key, fxl::StringView value) override;
-
-  Status MarkPageOnline(coroutine::CoroutineHandler* handler) override;
-
-  // PageDb::Batch:
-  Status Execute(coroutine::CoroutineHandler* handler) override;
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_EMPTY_IMPL_H_
diff --git a/bin/ledger/storage/impl/page_db_impl.cc b/bin/ledger/storage/impl/page_db_impl.cc
deleted file mode 100644
index f425c04..0000000
--- a/bin/ledger/storage/impl/page_db_impl.cc
+++ /dev/null
@@ -1,423 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/page_db_impl.h"
-
-#include <algorithm>
-#include <string>
-
-#include <lib/fxl/strings/concatenate.h>
-
-#include "peridot/bin/ledger/storage/impl/data_serialization.h"
-#include "peridot/bin/ledger/storage/impl/db_serialization.h"
-#include "peridot/bin/ledger/storage/impl/journal_impl.h"
-#include "peridot/bin/ledger/storage/impl/object_identifier_encoding.h"
-#include "peridot/bin/ledger/storage/impl/object_impl.h"
-#include "peridot/bin/ledger/storage/impl/page_db_batch_impl.h"
-#include "peridot/lib/convert/convert.h"
-
-#define RETURN_ON_ERROR(expr)   \
-  do {                          \
-    Status status = (expr);     \
-    if (status != Status::OK) { \
-      return status;            \
-    }                           \
-  } while (0)
-
-namespace storage {
-
-using coroutine::CoroutineHandler;
-
-namespace {
-
-// Extracts a sorted list of commit its from |entries|. Entries must be a map
-// from commit ids to serialized |A|.
-template <typename A>
-void ExtractSortedCommitsIds(
-    std::vector<std::pair<std::string, std::string>>* entries,
-    std::vector<CommitId>* commit_ids) {
-  std::sort(entries->begin(), entries->end(),
-            [&](const std::pair<std::string, std::string>& p1,
-                const std::pair<std::string, std::string>& p2) {
-              auto t1 = DeserializeData<A>(p1.second);
-              auto t2 = DeserializeData<A>(p2.second);
-              if (t1 != t2) {
-                return t1 < t2;
-              }
-              return p1.first < p2.first;
-            });
-  commit_ids->clear();
-  commit_ids->reserve(entries->size());
-  for (std::pair<std::string, std::string>& entry : *entries) {
-    commit_ids->push_back(std::move(entry.first));
-  }
-}
-
-class JournalEntryIterator final : public Iterator<const EntryChange> {
- public:
-  explicit JournalEntryIterator(
-      std::unique_ptr<Iterator<const std::pair<convert::ExtendedStringView,
-                                               convert::ExtendedStringView>>>
-          it)
-      : it_(std::move(it)) {
-    PrepareEntry();
-  }
-
-  ~JournalEntryIterator() override {}
-
-  Iterator<const EntryChange>& Next() override {
-    it_->Next();
-    PrepareEntry();
-    return *this;
-  }
-
-  bool Valid() const override { return it_->Valid(); }
-
-  Status GetStatus() const override { return it_->GetStatus(); }
-
-  const EntryChange& operator*() const override { return *(change_.get()); }
-  const EntryChange* operator->() const override { return change_.get(); }
-
- private:
-  void PrepareEntry() {
-    if (!JournalEntryIterator::Valid()) {
-      change_.reset(nullptr);
-      return;
-    }
-    change_ = std::make_unique<EntryChange>();
-
-    const std::pair<convert::ExtendedStringView, convert::ExtendedStringView>&
-        key_value = **it_;
-    change_->entry.key =
-        key_value.first.substr(JournalEntryRow::kPrefixSize).ToString();
-
-    if (key_value.second[0] == JournalEntryRow::kAddPrefix) {
-      Status status = JournalEntryRow::ExtractObjectIdentifier(
-          key_value.second, &change_->entry.object_identifier);
-      FXL_DCHECK(status == Status::OK);
-      change_->deleted = false;
-      change_->entry.priority =
-          (key_value.second[1] == JournalEntryRow::kLazyPrefix)
-              ? KeyPriority::LAZY
-              : KeyPriority::EAGER;
-    } else {
-      change_->deleted = true;
-    }
-  }
-
-  std::unique_ptr<Iterator<const std::pair<convert::ExtendedStringView,
-                                           convert::ExtendedStringView>>>
-      it_;
-
-  std::unique_ptr<EntryChange> change_;
-};
-
-}  // namespace
-
-PageDbImpl::PageDbImpl(ledger::Environment* environment, std::unique_ptr<Db> db)
-    : environment_(environment), db_(std::move(db)) {
-  FXL_DCHECK(environment_);
-  FXL_DCHECK(db_);
-}
-
-PageDbImpl::~PageDbImpl() {}
-
-Status PageDbImpl::StartBatch(coroutine::CoroutineHandler* handler,
-                              std::unique_ptr<Batch>* batch) {
-  std::unique_ptr<Db::Batch> db_batch;
-  RETURN_ON_ERROR(db_->StartBatch(handler, &db_batch));
-  *batch = std::make_unique<PageDbBatchImpl>(environment_->random(),
-                                             std::move(db_batch), this);
-  return Status::OK;
-}
-
-Status PageDbImpl::GetHeads(CoroutineHandler* handler,
-                            std::vector<CommitId>* heads) {
-  std::vector<std::pair<std::string, std::string>> entries;
-  RETURN_ON_ERROR(db_->GetEntriesByPrefix(
-      handler, convert::ToSlice(HeadRow::kPrefix), &entries));
-  ExtractSortedCommitsIds<zx::time_utc>(&entries, heads);
-  return Status::OK;
-}
-
-Status PageDbImpl::GetCommitStorageBytes(CoroutineHandler* handler,
-                                         CommitIdView commit_id,
-                                         std::string* storage_bytes) {
-  return db_->Get(handler, CommitRow::GetKeyFor(commit_id), storage_bytes);
-}
-
-Status PageDbImpl::GetImplicitJournalIds(CoroutineHandler* handler,
-                                         std::vector<JournalId>* journal_ids) {
-  return db_->GetByPrefix(handler,
-                          convert::ToSlice(ImplicitJournalMetadataRow::kPrefix),
-                          journal_ids);
-}
-
-Status PageDbImpl::GetBaseCommitForJournal(CoroutineHandler* handler,
-                                           const JournalId& journal_id,
-                                           CommitId* base) {
-  FXL_DCHECK(journal_id.size() == JournalEntryRow::kJournalIdSize);
-  FXL_DCHECK(journal_id[0] == JournalEntryRow::kImplicitPrefix);
-  return db_->Get(handler, ImplicitJournalMetadataRow::GetKeyFor(journal_id),
-                  base);
-}
-
-Status PageDbImpl::GetJournalEntries(
-    CoroutineHandler* handler, const JournalId& journal_id,
-    std::unique_ptr<Iterator<const EntryChange>>* entries,
-    JournalContainsClearOperation* contains_clear_operation) {
-  std::unique_ptr<Iterator<const std::pair<convert::ExtendedStringView,
-                                           convert::ExtendedStringView>>>
-      it;
-  RETURN_ON_ERROR(db_->GetIteratorAtPrefix(
-      handler, JournalEntryRow::GetEntriesPrefixFor(journal_id), &it));
-  bool contains_clear_operation_key;
-  RETURN_ON_ERROR(db_->HasKey(handler,
-                              JournalEntryRow::GetClearMarkerKey(journal_id),
-                              &contains_clear_operation_key));
-
-  *entries = std::make_unique<JournalEntryIterator>(std::move(it));
-  *contains_clear_operation = contains_clear_operation_key
-                                  ? JournalContainsClearOperation::YES
-                                  : JournalContainsClearOperation::NO;
-  return Status::OK;
-}
-
-Status PageDbImpl::ReadObject(CoroutineHandler* handler,
-                              ObjectIdentifier object_identifier,
-                              std::unique_ptr<const Object>* object) {
-  return db_->GetObject(handler,
-                        ObjectRow::GetKeyFor(object_identifier.object_digest()),
-                        object_identifier, object);
-}
-
-Status PageDbImpl::HasObject(CoroutineHandler* handler,
-                             const ObjectDigest& object_digest,
-                             bool* has_object) {
-  return db_->HasKey(handler, ObjectRow::GetKeyFor(object_digest), has_object);
-}
-
-Status PageDbImpl::GetObjectStatus(CoroutineHandler* handler,
-                                   ObjectIdentifier object_identifier,
-                                   PageDbObjectStatus* object_status) {
-  // Check must be done in ascending order of status, so that a change of status
-  // between 2 reads does not create the case where no key is found.
-  // That said, the most common expected status is SYNCED, so for performance
-  // reasons, it is better to check it first.
-  // By checking it first and then checking all statuses in ascending order we
-  // both ensure correctness and performant lookup.
-  // The only case that would generate a spurious lookup is when the status is
-  // changed concurrently, which is a rare occurence.
-  for (PageDbObjectStatus possible_status :
-       {PageDbObjectStatus::SYNCED, PageDbObjectStatus::TRANSIENT,
-        PageDbObjectStatus::LOCAL, PageDbObjectStatus::SYNCED}) {
-    bool has_key;
-    RETURN_ON_ERROR(db_->HasKey(
-        handler, ObjectStatusRow::GetKeyFor(possible_status, object_identifier),
-        &has_key));
-    if (has_key) {
-      *object_status = possible_status;
-      return Status::OK;
-    }
-  }
-
-  *object_status = PageDbObjectStatus::UNKNOWN;
-  return Status::OK;
-}
-
-Status PageDbImpl::GetUnsyncedCommitIds(CoroutineHandler* handler,
-                                        std::vector<CommitId>* commit_ids) {
-  std::vector<std::pair<std::string, std::string>> entries;
-  RETURN_ON_ERROR(db_->GetEntriesByPrefix(
-      handler, convert::ToSlice(UnsyncedCommitRow::kPrefix), &entries));
-  // Unsynced commit row values are the commit's generation.
-  ExtractSortedCommitsIds<uint64_t>(&entries, commit_ids);
-  return Status::OK;
-}
-
-Status PageDbImpl::IsCommitSynced(CoroutineHandler* handler,
-                                  const CommitId& commit_id, bool* is_synced) {
-  bool has_key;
-  RETURN_ON_ERROR(
-      db_->HasKey(handler, UnsyncedCommitRow::GetKeyFor(commit_id), &has_key));
-  *is_synced = !has_key;
-  return Status::OK;
-}
-
-Status PageDbImpl::GetUnsyncedPieces(
-    CoroutineHandler* handler,
-    std::vector<ObjectIdentifier>* object_identifiers) {
-  std::vector<std::string> encoded_identifiers;
-  Status status =
-      db_->GetByPrefix(handler, convert::ToSlice(ObjectStatusRow::kLocalPrefix),
-                       &encoded_identifiers);
-  if (status != Status::OK) {
-    return status;
-  }
-
-  object_identifiers->clear();
-  ObjectIdentifier object_identifier;
-  for (auto& encoded_identifier : encoded_identifiers) {
-    if (!DecodeObjectIdentifier(encoded_identifier, &object_identifier)) {
-      return Status::FORMAT_ERROR;
-    }
-    object_identifiers->emplace_back(std::move(object_identifier));
-  }
-
-  return Status::OK;
-}
-
-Status PageDbImpl::GetSyncMetadata(CoroutineHandler* handler,
-                                   fxl::StringView key, std::string* value) {
-  return db_->Get(handler, SyncMetadataRow::GetKeyFor(key), value);
-}
-
-Status PageDbImpl::IsPageOnline(coroutine::CoroutineHandler* handler,
-                                bool* page_is_online) {
-  return db_->HasKey(handler, PageIsOnlineRow::kKey, page_is_online);
-}
-
-Status PageDbImpl::AddHead(CoroutineHandler* handler, CommitIdView head,
-                           zx::time_utc timestamp) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->AddHead(handler, head, timestamp));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::RemoveHead(CoroutineHandler* handler, CommitIdView head) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->RemoveHead(handler, head));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::AddCommitStorageBytes(CoroutineHandler* handler,
-                                         const CommitId& commit_id,
-                                         fxl::StringView storage_bytes) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(
-      batch->AddCommitStorageBytes(handler, commit_id, storage_bytes));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::RemoveCommit(CoroutineHandler* handler,
-                                const CommitId& commit_id) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->RemoveCommit(handler, commit_id));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::CreateJournalId(CoroutineHandler* handler,
-                                   JournalType journal_type,
-                                   const CommitId& base,
-                                   JournalId* journal_id) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(
-      batch->CreateJournalId(handler, journal_type, base, journal_id));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::RemoveExplicitJournals(CoroutineHandler* handler) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->RemoveExplicitJournals(handler));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::RemoveJournal(CoroutineHandler* handler,
-                                 const JournalId& journal_id) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->RemoveJournal(handler, journal_id));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::AddJournalEntry(CoroutineHandler* handler,
-                                   const JournalId& journal_id,
-                                   fxl::StringView key,
-                                   const ObjectIdentifier& object_identifier,
-                                   KeyPriority priority) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->AddJournalEntry(handler, journal_id, key,
-                                         object_identifier, priority));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::RemoveJournalEntry(CoroutineHandler* handler,
-                                      const JournalId& journal_id,
-                                      convert::ExtendedStringView key) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->RemoveJournalEntry(handler, journal_id, key));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::EmptyJournalAndMarkContainsClearOperation(
-    coroutine::CoroutineHandler* handler, const JournalId& journal_id) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(
-      batch->EmptyJournalAndMarkContainsClearOperation(handler, journal_id));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::WriteObject(CoroutineHandler* handler,
-                               ObjectIdentifier object_identifier,
-                               std::unique_ptr<DataSource::DataChunk> content,
-                               PageDbObjectStatus object_status) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->WriteObject(handler, object_identifier,
-                                     std::move(content), object_status));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::SetObjectStatus(CoroutineHandler* handler,
-                                   ObjectIdentifier object_identifier,
-                                   PageDbObjectStatus object_status) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(
-      batch->SetObjectStatus(handler, object_identifier, object_status));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::MarkCommitIdSynced(CoroutineHandler* handler,
-                                      const CommitId& commit_id) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->MarkCommitIdSynced(handler, commit_id));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::MarkCommitIdUnsynced(CoroutineHandler* handler,
-                                        const CommitId& commit_id,
-                                        uint64_t generation) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->MarkCommitIdUnsynced(handler, commit_id, generation));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::SetSyncMetadata(CoroutineHandler* handler,
-                                   fxl::StringView key, fxl::StringView value) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->SetSyncMetadata(handler, key, value));
-  return batch->Execute(handler);
-}
-
-Status PageDbImpl::MarkPageOnline(coroutine::CoroutineHandler* handler) {
-  std::unique_ptr<Batch> batch;
-  RETURN_ON_ERROR(StartBatch(handler, &batch));
-  RETURN_ON_ERROR(batch->MarkPageOnline(handler));
-  return batch->Execute(handler);
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/page_db_impl.h b/bin/ledger/storage/impl/page_db_impl.h
deleted file mode 100644
index 79016c0..0000000
--- a/bin/ledger/storage/impl/page_db_impl.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_IMPL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_IMPL_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-#include "peridot/bin/ledger/storage/impl/page_db.h"
-#include "peridot/bin/ledger/storage/public/db.h"
-
-namespace storage {
-
-class PageStorageImpl;
-
-// TODO(qsr): LE-250 There must be a mechanism to clean the database from
-// TRANSIENT objects.
-class PageDbImpl : public PageDb {
- public:
-  PageDbImpl(ledger::Environment* environment, std::unique_ptr<Db> db);
-  ~PageDbImpl() override;
-
-  Status StartBatch(coroutine::CoroutineHandler* handler,
-                    std::unique_ptr<PageDb::Batch>* batch) override;
-  Status GetHeads(coroutine::CoroutineHandler* handler,
-                  std::vector<CommitId>* heads) override;
-  Status GetCommitStorageBytes(coroutine::CoroutineHandler* handler,
-                               CommitIdView commit_id,
-                               std::string* storage_bytes) override;
-  Status GetImplicitJournalIds(coroutine::CoroutineHandler* handler,
-                               std::vector<JournalId>* journal_ids) override;
-  Status GetBaseCommitForJournal(coroutine::CoroutineHandler* handler,
-                                 const JournalId& journal_id,
-                                 CommitId* base) override;
-  Status GetJournalEntries(
-      coroutine::CoroutineHandler* handler, const JournalId& journal_id,
-      std::unique_ptr<Iterator<const EntryChange>>* entries,
-      JournalContainsClearOperation* contains_clear_operation) override;
-  Status ReadObject(coroutine::CoroutineHandler* handler,
-                    ObjectIdentifier object_identifier,
-                    std::unique_ptr<const Object>* object) override;
-  Status HasObject(coroutine::CoroutineHandler* handler,
-                   const ObjectDigest& object_digest,
-                   bool* has_object) override;
-  Status GetUnsyncedCommitIds(coroutine::CoroutineHandler* handler,
-                              std::vector<CommitId>* commit_ids) override;
-  Status IsCommitSynced(coroutine::CoroutineHandler* handler,
-                        const CommitId& commit_id, bool* is_synced) override;
-  Status GetUnsyncedPieces(
-      coroutine::CoroutineHandler* handler,
-      std::vector<ObjectIdentifier>* object_identifiers) override;
-  Status GetObjectStatus(coroutine::CoroutineHandler* handler,
-                         ObjectIdentifier object_identifier,
-                         PageDbObjectStatus* object_status) override;
-  Status GetSyncMetadata(coroutine::CoroutineHandler* handler,
-                         fxl::StringView key, std::string* value) override;
-  Status IsPageOnline(coroutine::CoroutineHandler* handler,
-                      bool* page_is_online) override;
-
-  Status AddHead(coroutine::CoroutineHandler* handler, CommitIdView head,
-                 zx::time_utc timestamp) override;
-  Status RemoveHead(coroutine::CoroutineHandler* handler,
-                    CommitIdView head) override;
-  Status AddCommitStorageBytes(coroutine::CoroutineHandler* handler,
-                               const CommitId& commit_id,
-                               fxl::StringView storage_bytes) override;
-  Status RemoveCommit(coroutine::CoroutineHandler* handler,
-                      const CommitId& commit_id) override;
-  Status CreateJournalId(coroutine::CoroutineHandler* handler,
-                         JournalType journal_type, const CommitId& base,
-                         JournalId* journal_id) override;
-  Status RemoveExplicitJournals(coroutine::CoroutineHandler* handler) override;
-  Status RemoveJournal(coroutine::CoroutineHandler* handler,
-                       const JournalId& journal_id) override;
-  Status AddJournalEntry(coroutine::CoroutineHandler* handler,
-                         const JournalId& journal_id, fxl::StringView key,
-                         const ObjectIdentifier& object_identifier,
-                         KeyPriority priority) override;
-  Status RemoveJournalEntry(coroutine::CoroutineHandler* handler,
-                            const JournalId& journal_id,
-                            convert::ExtendedStringView key) override;
-  Status EmptyJournalAndMarkContainsClearOperation(
-      coroutine::CoroutineHandler* handler,
-      const JournalId& journal_id) override;
-  Status WriteObject(coroutine::CoroutineHandler* handler,
-                     ObjectIdentifier object_identifier,
-                     std::unique_ptr<DataSource::DataChunk> content,
-                     PageDbObjectStatus object_status) override;
-  Status MarkCommitIdSynced(coroutine::CoroutineHandler* handler,
-                            const CommitId& commit_id) override;
-  Status MarkCommitIdUnsynced(coroutine::CoroutineHandler* handler,
-                              const CommitId& commit_id,
-                              uint64_t generation) override;
-  Status SetObjectStatus(coroutine::CoroutineHandler* handler,
-                         ObjectIdentifier object_identifier,
-                         PageDbObjectStatus object_status) override;
-  Status SetSyncMetadata(coroutine::CoroutineHandler* handler,
-                         fxl::StringView key, fxl::StringView value) override;
-  Status MarkPageOnline(coroutine::CoroutineHandler* handler) override;
-
- private:
-  ledger::Environment* environment_;
-  std::unique_ptr<Db> db_;
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_DB_IMPL_H_
diff --git a/bin/ledger/storage/impl/page_db_unittest.cc b/bin/ledger/storage/impl/page_db_unittest.cc
deleted file mode 100644
index b920b08..0000000
--- a/bin/ledger/storage/impl/page_db_unittest.cc
+++ /dev/null
@@ -1,562 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/page_db.h"
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <lib/async/cpp/task.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fxl/macros.h>
-#include <lib/zx/time.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/storage/impl/commit_impl.h"
-#include "peridot/bin/ledger/storage/impl/commit_random_impl.h"
-#include "peridot/bin/ledger/storage/impl/journal_impl.h"
-#include "peridot/bin/ledger/storage/impl/leveldb.h"
-#include "peridot/bin/ledger/storage/impl/page_db_impl.h"
-#include "peridot/bin/ledger/storage/impl/page_storage_impl.h"
-#include "peridot/bin/ledger/storage/impl/storage_test_utils.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace storage {
-namespace {
-
-using coroutine::CoroutineHandler;
-
-void ExpectChangesEqual(const EntryChange& expected, const EntryChange& found) {
-  EXPECT_EQ(expected.deleted, found.deleted);
-  EXPECT_EQ(expected.entry.key, found.entry.key);
-  if (!expected.deleted) {
-    // If the entry is deleted, object_identifier and priority are not valid.
-    EXPECT_EQ(expected.entry, found.entry);
-  }
-}
-
-std::unique_ptr<LevelDb> GetLevelDb(async_dispatcher_t* dispatcher,
-                                    ledger::DetachedPath db_path) {
-  auto db = std::make_unique<LevelDb>(dispatcher, std::move(db_path));
-  EXPECT_EQ(Status::OK, db->Init());
-  return db;
-}
-
-class PageDbTest : public ledger::TestWithEnvironment {
- public:
-  PageDbTest()
-      : encryption_service_(dispatcher()),
-        base_path(tmpfs_.root_fd()),
-        page_storage_(&environment_, &encryption_service_,
-                      GetLevelDb(dispatcher(), base_path.SubPath("storage")),
-                      "page_id"),
-        page_db_(&environment_,
-                 GetLevelDb(dispatcher(), base_path.SubPath("page_db"))) {}
-
-  ~PageDbTest() override {}
-
-  // Test:
-  void SetUp() override {
-    std::srand(0);
-
-    Status status;
-    bool called;
-    page_storage_.Init(
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    ASSERT_EQ(Status::OK, status);
-  }
-
- protected:
-  scoped_tmpfs::ScopedTmpFS tmpfs_;
-  encryption::FakeEncryptionService encryption_service_;
-  ledger::DetachedPath base_path;
-  PageStorageImpl page_storage_;
-  PageDbImpl page_db_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageDbTest);
-};
-
-TEST_F(PageDbTest, HeadCommits) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    std::vector<CommitId> heads;
-    EXPECT_EQ(Status::OK, page_db_.GetHeads(handler, &heads));
-    EXPECT_TRUE(heads.empty());
-
-    CommitId cid = RandomCommitId(environment_.random());
-    EXPECT_EQ(Status::OK,
-              page_db_.AddHead(handler, cid,
-                               environment_.random()->Draw<zx::time_utc>()));
-    EXPECT_EQ(Status::OK, page_db_.GetHeads(handler, &heads));
-    EXPECT_EQ(1u, heads.size());
-    EXPECT_EQ(cid, heads[0]);
-
-    EXPECT_EQ(Status::OK, page_db_.RemoveHead(handler, cid));
-    EXPECT_EQ(Status::OK, page_db_.GetHeads(handler, &heads));
-    EXPECT_TRUE(heads.empty());
-  });
-}
-
-TEST_F(PageDbTest, OrderHeadCommitsByTimestamp) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    std::vector<zx::time_utc> timestamps = {zx::time_utc::infinite_past(),
-                                            zx::time_utc::infinite(),
-                                            zx::time_utc()};
-
-    for (size_t i = 0; i < 10; ++i) {
-      zx::time_utc ts;
-      do {
-        ts = environment_.random()->Draw<zx::time_utc>();
-      } while (std::find(timestamps.begin(), timestamps.end(), ts) !=
-               timestamps.end());
-      timestamps.push_back(ts);
-    }
-
-    auto sorted_timestamps = timestamps;
-    std::sort(sorted_timestamps.begin(), sorted_timestamps.end());
-    auto random_ordered_timestamps = timestamps;
-    auto rng = environment_.random()->NewBitGenerator<uint64_t>();
-    std::shuffle(random_ordered_timestamps.begin(),
-                 random_ordered_timestamps.end(), rng);
-
-    std::map<zx::time_utc, CommitId> commits;
-    for (auto ts : random_ordered_timestamps) {
-      commits[ts] = RandomCommitId(environment_.random());
-      EXPECT_EQ(Status::OK, page_db_.AddHead(handler, commits[ts], ts));
-    }
-
-    std::vector<CommitId> heads;
-    EXPECT_EQ(Status::OK, page_db_.GetHeads(handler, &heads));
-    EXPECT_EQ(timestamps.size(), heads.size());
-
-    for (size_t i = 0; i < heads.size(); ++i) {
-      EXPECT_EQ(commits[sorted_timestamps[i]], heads[i]);
-    }
-  });
-}
-
-TEST_F(PageDbTest, Commits) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    std::vector<std::unique_ptr<const Commit>> parents;
-    parents.emplace_back(
-        std::make_unique<CommitRandomImpl>(environment_.random()));
-
-    std::unique_ptr<const Commit> commit = CommitImpl::FromContentAndParents(
-        environment_.clock(), &page_storage_,
-        RandomObjectIdentifier(environment_.random()), std::move(parents));
-
-    std::string storage_bytes;
-    EXPECT_EQ(Status::NOT_FOUND, page_db_.GetCommitStorageBytes(
-                                     handler, commit->GetId(), &storage_bytes));
-
-    EXPECT_EQ(Status::OK,
-              page_db_.AddCommitStorageBytes(handler, commit->GetId(),
-                                             commit->GetStorageBytes()));
-    EXPECT_EQ(Status::OK, page_db_.GetCommitStorageBytes(
-                              handler, commit->GetId(), &storage_bytes));
-    EXPECT_EQ(storage_bytes, commit->GetStorageBytes());
-
-    EXPECT_EQ(Status::OK, page_db_.RemoveCommit(handler, commit->GetId()));
-    EXPECT_EQ(Status::NOT_FOUND, page_db_.GetCommitStorageBytes(
-                                     handler, commit->GetId(), &storage_bytes));
-  });
-}
-
-TEST_F(PageDbTest, Journals) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    CommitId commit_id = RandomCommitId(environment_.random());
-
-    JournalId implicit_journal_id;
-    JournalId explicit_journal_id;
-    std::unique_ptr<Journal> explicit_journal;
-    EXPECT_EQ(Status::OK,
-              page_db_.CreateJournalId(handler, JournalType::IMPLICIT,
-                                       commit_id, &implicit_journal_id));
-    EXPECT_EQ(Status::OK,
-              page_db_.CreateJournalId(handler, JournalType::EXPLICIT,
-                                       commit_id, &explicit_journal_id));
-
-    EXPECT_EQ(Status::OK, page_db_.RemoveExplicitJournals(handler));
-
-    // Removing explicit journals should not affect the implicit ones.
-    std::vector<JournalId> journal_ids;
-    EXPECT_EQ(Status::OK,
-              page_db_.GetImplicitJournalIds(handler, &journal_ids));
-    ASSERT_EQ(1u, journal_ids.size());
-    EXPECT_EQ(implicit_journal_id, journal_ids[0]);
-
-    CommitId found_base_id;
-    EXPECT_EQ(Status::OK, page_db_.GetBaseCommitForJournal(
-                              handler, journal_ids[0], &found_base_id));
-    EXPECT_EQ(commit_id, found_base_id);
-    EXPECT_EQ(Status::OK, page_db_.RemoveJournal(handler, journal_ids[0]));
-    EXPECT_EQ(Status::NOT_FOUND, page_db_.GetBaseCommitForJournal(
-                                     handler, journal_ids[0], &found_base_id));
-    EXPECT_EQ(Status::OK,
-              page_db_.GetImplicitJournalIds(handler, &journal_ids));
-    EXPECT_EQ(0u, journal_ids.size());
-  });
-}
-
-TEST_F(PageDbTest, JournalEntries) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    CommitId commit_id = RandomCommitId(environment_.random());
-
-    JournalId journal_id;
-    EXPECT_EQ(Status::OK,
-              page_db_.CreateJournalId(handler, JournalType::IMPLICIT,
-                                       commit_id, &journal_id));
-    EXPECT_EQ(Status::OK,
-              page_db_.AddJournalEntry(handler, journal_id, "add-key-1",
-                                       MakeObjectIdentifier("value1"),
-                                       KeyPriority::LAZY));
-    EXPECT_EQ(Status::OK,
-              page_db_.AddJournalEntry(handler, journal_id, "add-key-2",
-                                       MakeObjectIdentifier("value2"),
-                                       KeyPriority::EAGER));
-    EXPECT_EQ(Status::OK,
-              page_db_.AddJournalEntry(handler, journal_id, "add-key-1",
-                                       MakeObjectIdentifier("value3"),
-                                       KeyPriority::LAZY));
-    EXPECT_EQ(Status::OK,
-              page_db_.RemoveJournalEntry(handler, journal_id, "remove-key"));
-
-    EntryChange expected_changes[] = {
-        NewEntryChange("add-key-1", "value3", KeyPriority::LAZY),
-        NewEntryChange("add-key-2", "value2", KeyPriority::EAGER),
-        NewRemoveEntryChange("remove-key"),
-    };
-    std::unique_ptr<Iterator<const EntryChange>> entries;
-    JournalContainsClearOperation contains_clear_operation;
-    EXPECT_EQ(Status::OK,
-              page_db_.GetJournalEntries(handler, journal_id, &entries,
-                                         &contains_clear_operation));
-    for (const auto& expected_change : expected_changes) {
-      EXPECT_TRUE(entries->Valid());
-      ExpectChangesEqual(expected_change, **entries);
-      entries->Next();
-    }
-    EXPECT_FALSE(entries->Valid());
-    EXPECT_EQ(JournalContainsClearOperation::NO, contains_clear_operation);
-    EXPECT_EQ(Status::OK, entries->GetStatus());
-  });
-}
-
-TEST_F(PageDbTest, JournalEntriesWithClear) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    CommitId commit_id = RandomCommitId(environment_.random());
-
-    JournalId journal_id;
-    EXPECT_EQ(Status::OK,
-              page_db_.CreateJournalId(handler, JournalType::IMPLICIT,
-                                       commit_id, &journal_id));
-    EXPECT_EQ(Status::OK,
-              page_db_.AddJournalEntry(handler, journal_id, "add-key-1",
-                                       MakeObjectIdentifier("value1"),
-                                       KeyPriority::LAZY));
-    EXPECT_EQ(Status::OK, page_db_.EmptyJournalAndMarkContainsClearOperation(
-                              handler, journal_id));
-    EXPECT_EQ(Status::OK,
-              page_db_.AddJournalEntry(handler, journal_id, "add-key-2",
-                                       MakeObjectIdentifier("value2"),
-                                       KeyPriority::EAGER));
-    EXPECT_EQ(Status::OK,
-              page_db_.RemoveJournalEntry(handler, journal_id, "remove-key"));
-
-    EntryChange expected_changes[] = {
-        NewEntryChange("add-key-2", "value2", KeyPriority::EAGER),
-        NewRemoveEntryChange("remove-key"),
-    };
-    std::unique_ptr<Iterator<const EntryChange>> entries;
-    JournalContainsClearOperation contains_clear_operation;
-    EXPECT_EQ(Status::OK,
-              page_db_.GetJournalEntries(handler, journal_id, &entries,
-                                         &contains_clear_operation));
-    for (const auto& expected_change : expected_changes) {
-      EXPECT_TRUE(entries->Valid());
-      ExpectChangesEqual(expected_change, **entries);
-      entries->Next();
-    }
-    EXPECT_FALSE(entries->Valid());
-    EXPECT_EQ(JournalContainsClearOperation::YES, contains_clear_operation);
-    EXPECT_EQ(Status::OK, entries->GetStatus());
-  });
-}
-
-TEST_F(PageDbTest, ObjectStorage) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    ObjectIdentifier object_identifier =
-        RandomObjectIdentifier(environment_.random());
-    std::string content = RandomString(environment_.random(), 32 * 1024);
-    std::unique_ptr<const Object> object;
-    PageDbObjectStatus object_status;
-
-    EXPECT_EQ(Status::NOT_FOUND,
-              page_db_.ReadObject(handler, object_identifier, &object));
-    ASSERT_EQ(Status::OK,
-              page_db_.WriteObject(handler, object_identifier,
-                                   DataSource::DataChunk::Create(content),
-                                   PageDbObjectStatus::TRANSIENT));
-    page_db_.GetObjectStatus(handler, object_identifier, &object_status);
-    EXPECT_EQ(PageDbObjectStatus::TRANSIENT, object_status);
-    ASSERT_EQ(Status::OK,
-              page_db_.ReadObject(handler, object_identifier, &object));
-    fxl::StringView object_content;
-    EXPECT_EQ(Status::OK, object->GetData(&object_content));
-    EXPECT_EQ(content, object_content);
-    // Update the object to LOCAL. The new content should be ignored.
-    std::string new_content = RandomString(environment_.random(), 32 * 1024);
-    ASSERT_EQ(Status::OK,
-              page_db_.WriteObject(handler, object_identifier,
-                                   DataSource::DataChunk::Create(new_content),
-                                   PageDbObjectStatus::LOCAL));
-    page_db_.GetObjectStatus(handler, object_identifier, &object_status);
-    EXPECT_EQ(PageDbObjectStatus::LOCAL, object_status);
-    EXPECT_EQ(Status::OK, object->GetData(&object_content));
-    EXPECT_EQ(content, object_content);
-    EXPECT_NE(new_content, object_content);
-  });
-}
-
-TEST_F(PageDbTest, UnsyncedCommits) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    CommitId commit_id = RandomCommitId(environment_.random());
-    std::vector<CommitId> commit_ids;
-    EXPECT_EQ(Status::OK, page_db_.GetUnsyncedCommitIds(handler, &commit_ids));
-    EXPECT_TRUE(commit_ids.empty());
-
-    EXPECT_EQ(Status::OK, page_db_.MarkCommitIdUnsynced(handler, commit_id, 0));
-    EXPECT_EQ(Status::OK, page_db_.GetUnsyncedCommitIds(handler, &commit_ids));
-    EXPECT_EQ(1u, commit_ids.size());
-    EXPECT_EQ(commit_id, commit_ids[0]);
-    bool is_synced;
-    EXPECT_EQ(Status::OK,
-              page_db_.IsCommitSynced(handler, commit_id, &is_synced));
-    EXPECT_FALSE(is_synced);
-
-    EXPECT_EQ(Status::OK, page_db_.MarkCommitIdSynced(handler, commit_id));
-    EXPECT_EQ(Status::OK, page_db_.GetUnsyncedCommitIds(handler, &commit_ids));
-    EXPECT_TRUE(commit_ids.empty());
-    EXPECT_EQ(Status::OK,
-              page_db_.IsCommitSynced(handler, commit_id, &is_synced));
-    EXPECT_TRUE(is_synced);
-  });
-}
-
-TEST_F(PageDbTest, OrderUnsyncedCommitsByTimestamp) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    CommitId commit_ids[] = {RandomCommitId(environment_.random()),
-                             RandomCommitId(environment_.random()),
-                             RandomCommitId(environment_.random())};
-    // Add three unsynced commits with timestamps 200, 300 and 100.
-    EXPECT_EQ(Status::OK,
-              page_db_.MarkCommitIdUnsynced(handler, commit_ids[0], 200));
-    EXPECT_EQ(Status::OK,
-              page_db_.MarkCommitIdUnsynced(handler, commit_ids[1], 300));
-    EXPECT_EQ(Status::OK,
-              page_db_.MarkCommitIdUnsynced(handler, commit_ids[2], 100));
-
-    // The result should be ordered by the given timestamps.
-    std::vector<CommitId> found_ids;
-    EXPECT_EQ(Status::OK, page_db_.GetUnsyncedCommitIds(handler, &found_ids));
-    EXPECT_EQ(3u, found_ids.size());
-    EXPECT_EQ(found_ids[0], commit_ids[2]);
-    EXPECT_EQ(found_ids[1], commit_ids[0]);
-    EXPECT_EQ(found_ids[2], commit_ids[1]);
-  });
-}
-
-TEST_F(PageDbTest, UnsyncedPieces) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    auto object_identifier = RandomObjectIdentifier(environment_.random());
-    std::vector<ObjectIdentifier> object_identifiers;
-    EXPECT_EQ(Status::OK,
-              page_db_.GetUnsyncedPieces(handler, &object_identifiers));
-    EXPECT_TRUE(object_identifiers.empty());
-
-    EXPECT_EQ(Status::OK,
-              page_db_.WriteObject(handler, object_identifier,
-                                   DataSource::DataChunk::Create(""),
-                                   PageDbObjectStatus::LOCAL));
-    EXPECT_EQ(Status::OK, page_db_.SetObjectStatus(handler, object_identifier,
-                                                   PageDbObjectStatus::LOCAL));
-    EXPECT_EQ(Status::OK,
-              page_db_.GetUnsyncedPieces(handler, &object_identifiers));
-    EXPECT_EQ(1u, object_identifiers.size());
-    EXPECT_EQ(object_identifier, object_identifiers[0]);
-    PageDbObjectStatus object_status;
-    EXPECT_EQ(Status::OK, page_db_.GetObjectStatus(handler, object_identifier,
-                                                   &object_status));
-    EXPECT_EQ(PageDbObjectStatus::LOCAL, object_status);
-
-    EXPECT_EQ(Status::OK, page_db_.SetObjectStatus(handler, object_identifier,
-                                                   PageDbObjectStatus::SYNCED));
-    EXPECT_EQ(Status::OK,
-              page_db_.GetUnsyncedPieces(handler, &object_identifiers));
-    EXPECT_TRUE(object_identifiers.empty());
-    EXPECT_EQ(Status::OK, page_db_.GetObjectStatus(handler, object_identifier,
-                                                   &object_status));
-    EXPECT_EQ(PageDbObjectStatus::SYNCED, object_status);
-  });
-}
-
-TEST_F(PageDbTest, Batch) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    std::unique_ptr<PageDb::Batch> batch;
-    ASSERT_EQ(Status::OK, page_db_.StartBatch(handler, &batch));
-    ASSERT_TRUE(batch);
-
-    auto object_identifier = RandomObjectIdentifier(environment_.random());
-    EXPECT_EQ(Status::OK, batch->WriteObject(handler, object_identifier,
-                                             DataSource::DataChunk::Create(""),
-                                             PageDbObjectStatus::LOCAL));
-
-    std::vector<ObjectIdentifier> object_identifiers;
-    EXPECT_EQ(Status::OK,
-              page_db_.GetUnsyncedPieces(handler, &object_identifiers));
-    EXPECT_TRUE(object_identifiers.empty());
-
-    EXPECT_EQ(Status::OK, batch->Execute(handler));
-
-    EXPECT_EQ(Status::OK,
-              page_db_.GetUnsyncedPieces(handler, &object_identifiers));
-    EXPECT_EQ(1u, object_identifiers.size());
-    EXPECT_EQ(object_identifier, object_identifiers[0]);
-  });
-}
-
-TEST_F(PageDbTest, PageDbObjectStatus) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    PageDbObjectStatus initial_statuses[] = {PageDbObjectStatus::TRANSIENT,
-                                             PageDbObjectStatus::LOCAL,
-                                             PageDbObjectStatus::SYNCED};
-    PageDbObjectStatus next_statuses[] = {PageDbObjectStatus::LOCAL,
-                                          PageDbObjectStatus::SYNCED};
-    for (auto initial_status : initial_statuses) {
-      for (auto next_status : next_statuses) {
-        auto object_identifier = RandomObjectIdentifier(environment_.random());
-        PageDbObjectStatus object_status;
-        ASSERT_EQ(Status::OK, page_db_.GetObjectStatus(
-                                  handler, object_identifier, &object_status));
-        EXPECT_EQ(PageDbObjectStatus::UNKNOWN, object_status);
-        ASSERT_EQ(Status::OK,
-                  page_db_.WriteObject(handler, object_identifier,
-                                       DataSource::DataChunk::Create(""),
-                                       initial_status));
-        ASSERT_EQ(Status::OK, page_db_.GetObjectStatus(
-                                  handler, object_identifier, &object_status));
-        EXPECT_EQ(initial_status, object_status);
-        ASSERT_EQ(Status::OK, page_db_.SetObjectStatus(
-                                  handler, object_identifier, next_status));
-
-        PageDbObjectStatus expected_status =
-            std::max(initial_status, next_status);
-        ASSERT_EQ(Status::OK, page_db_.GetObjectStatus(
-                                  handler, object_identifier, &object_status));
-        EXPECT_EQ(expected_status, object_status);
-      }
-    }
-  });
-}
-
-TEST_F(PageDbTest, SyncMetadata) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    std::vector<std::pair<fxl::StringView, fxl::StringView>> keys_and_values = {
-        {"foo1", "foo2"}, {"bar1", " bar2 "}};
-    for (const auto& key_and_value : keys_and_values) {
-      auto key = key_and_value.first;
-      auto value = key_and_value.second;
-      std::string returned_value;
-      EXPECT_EQ(Status::NOT_FOUND,
-                page_db_.GetSyncMetadata(handler, key, &returned_value));
-
-      EXPECT_EQ(Status::OK, page_db_.SetSyncMetadata(handler, key, value));
-      EXPECT_EQ(Status::OK,
-                page_db_.GetSyncMetadata(handler, key, &returned_value));
-      EXPECT_EQ(value, returned_value);
-    }
-  });
-}
-
-TEST_F(PageDbTest, PageIsOnline) {
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    bool page_is_online;
-
-    // Check that the initial state is not online.
-    page_db_.IsPageOnline(handler, &page_is_online);
-    EXPECT_FALSE(page_is_online);
-
-    // Mark page as online and check it was updated.
-    EXPECT_EQ(Status::OK, page_db_.MarkPageOnline(handler));
-    page_db_.IsPageOnline(handler, &page_is_online);
-    EXPECT_TRUE(page_is_online);
-  });
-}
-
-// This test reproduces the crash of LE-451. The crash is due to a subtle
-// ordering of coroutine execution that is exactly reproduced here.
-TEST_F(PageDbTest, LE_451_ReproductionTest) {
-  auto id = RandomObjectIdentifier(environment_.random());
-  RunInCoroutine([&](CoroutineHandler* handler) {
-    EXPECT_EQ(Status::OK, page_db_.WriteObject(
-                              handler, id, DataSource::DataChunk::Create(""),
-                              PageDbObjectStatus::LOCAL));
-  });
-  CoroutineHandler* handler1 = nullptr;
-  CoroutineHandler* handler2 = nullptr;
-  environment_.coroutine_service()->StartCoroutine(
-      [&](CoroutineHandler* handler) {
-        handler1 = handler;
-        std::unique_ptr<PageDb::Batch> batch;
-        EXPECT_EQ(Status::OK, page_db_.StartBatch(handler, &batch));
-        EXPECT_EQ(Status::OK, batch->SetObjectStatus(
-                                  handler, id, PageDbObjectStatus::SYNCED));
-        if (handler->Yield() == coroutine::ContinuationStatus::INTERRUPTED) {
-          return;
-        }
-        EXPECT_EQ(Status::OK, batch->Execute(handler));
-        handler1 = nullptr;
-      });
-  environment_.coroutine_service()->StartCoroutine(
-      [&](CoroutineHandler* handler) {
-        handler2 = handler;
-        std::unique_ptr<PageDb::Batch> batch;
-        EXPECT_EQ(Status::OK, page_db_.StartBatch(handler, &batch));
-        if (handler->Yield() == coroutine::ContinuationStatus::INTERRUPTED) {
-          return;
-        }
-        EXPECT_EQ(Status::OK, batch->SetObjectStatus(
-                                  handler, id, PageDbObjectStatus::LOCAL));
-        EXPECT_EQ(Status::OK, batch->Execute(handler));
-        handler2 = nullptr;
-      });
-  ASSERT_TRUE(handler1);
-  ASSERT_TRUE(handler2);
-
-  // Reach the 2 yield points.
-  RunLoopUntilIdle();
-
-  // Posting a task at this level ensures that the right interleaving between
-  // reading and writing object status happens.
-  async::PostTask(dispatcher(),
-                  [&] { handler1->Resume(coroutine::ContinuationStatus::OK); });
-  handler2->Resume(coroutine::ContinuationStatus::OK);
-
-  // Finish the test.
-  RunLoopUntilIdle();
-
-  // Ensures both coroutines are terminated.
-  ASSERT_FALSE(handler1);
-  ASSERT_FALSE(handler2);
-}
-
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/page_storage_impl.cc b/bin/ledger/storage/impl/page_storage_impl.cc
deleted file mode 100644
index fe3d9d7..0000000
--- a/bin/ledger/storage/impl/page_storage_impl.cc
+++ /dev/null
@@ -1,1541 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/page_storage_impl.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <algorithm>
-#include <iterator>
-#include <map>
-#include <set>
-#include <utility>
-
-#include <lib/callback/trace_callback.h>
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/arraysize.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/files/file_descriptor.h>
-#include <lib/fxl/files/path.h>
-#include <lib/fxl/files/unique_fd.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <lib/fxl/strings/concatenate.h>
-#include <lib/zx/vmar.h>
-#include <lib/zx/vmo.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/cobalt/cobalt.h"
-#include "peridot/bin/ledger/coroutine/coroutine_waiter.h"
-#include "peridot/bin/ledger/lock/lock.h"
-#include "peridot/bin/ledger/storage/impl/btree/diff.h"
-#include "peridot/bin/ledger/storage/impl/btree/iterator.h"
-#include "peridot/bin/ledger/storage/impl/commit_impl.h"
-#include "peridot/bin/ledger/storage/impl/constants.h"
-#include "peridot/bin/ledger/storage/impl/file_index.h"
-#include "peridot/bin/ledger/storage/impl/file_index_generated.h"
-#include "peridot/bin/ledger/storage/impl/journal_impl.h"
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-#include "peridot/bin/ledger/storage/impl/object_identifier_encoding.h"
-#include "peridot/bin/ledger/storage/impl/object_impl.h"
-#include "peridot/bin/ledger/storage/impl/split.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-namespace storage {
-
-using coroutine::CoroutineHandler;
-
-namespace {
-
-struct StringPointerComparator {
-  using is_transparent = std::true_type;
-
-  bool operator()(const std::string* str1, const std::string* str2) const {
-    return *str1 < *str2;
-  }
-
-  bool operator()(const std::string* str1, const CommitIdView* str2) const {
-    return *str1 < *str2;
-  }
-
-  bool operator()(const CommitIdView* str1, const std::string* str2) const {
-    return *str1 < *str2;
-  }
-};
-
-size_t GetObjectPartStart(int64_t offset, size_t object_size) {
-  size_t start = object_size;
-  // Valid indices are between -N and N-1.
-  if (offset >= -static_cast<int64_t>(object_size) &&
-      offset < static_cast<int64_t>(object_size)) {
-    start = offset < 0 ? object_size + offset : offset;
-  }
-  return start;
-}
-
-size_t GetObjectPartLength(int64_t max_size, size_t object_size, size_t start) {
-  size_t adjusted_max_size = max_size < 0 ? object_size : max_size;
-  return start > object_size ? 0
-                             : std::min(adjusted_max_size, object_size - start);
-}
-
-}  // namespace
-
-PageStorageImpl::PageStorageImpl(
-    ledger::Environment* environment,
-    encryption::EncryptionService* encryption_service, std::unique_ptr<Db> db,
-    PageId page_id)
-    : PageStorageImpl(environment, encryption_service,
-                      std::make_unique<PageDbImpl>(environment, std::move(db)),
-                      std::move(page_id)) {}
-
-PageStorageImpl::PageStorageImpl(
-    ledger::Environment* environment,
-    encryption::EncryptionService* encryption_service,
-    std::unique_ptr<PageDb> page_db, PageId page_id)
-    : environment_(environment),
-      encryption_service_(encryption_service),
-      page_id_(std::move(page_id)),
-      db_(std::move(page_db)),
-      page_sync_(nullptr),
-      coroutine_manager_(environment->coroutine_service()) {}
-
-PageStorageImpl::~PageStorageImpl() {}
-
-void PageStorageImpl::Init(fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this](CoroutineHandler* handler, fit::function<void(Status)> callback) {
-        callback(SynchronousInit(handler));
-      });
-}
-
-PageId PageStorageImpl::GetId() { return page_id_; }
-
-void PageStorageImpl::SetSyncDelegate(PageSyncDelegate* page_sync) {
-  page_sync_ = page_sync;
-}
-
-void PageStorageImpl::GetHeadCommitIds(
-    fit::function<void(Status, std::vector<CommitId>)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this](CoroutineHandler* handler,
-             fit::function<void(Status, std::vector<CommitId>)> callback) {
-        std::vector<CommitId> commit_ids;
-        Status status = db_->GetHeads(handler, &commit_ids);
-        callback(status, std::move(commit_ids));
-      });
-}
-
-void PageStorageImpl::GetCommit(
-    CommitIdView commit_id,
-    fit::function<void(Status, std::unique_ptr<const Commit>)> callback) {
-  FXL_DCHECK(commit_id.size());
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, commit_id = commit_id.ToString()](
-          CoroutineHandler* handler,
-          fit::function<void(Status, std::unique_ptr<const Commit>)> callback) {
-        std::unique_ptr<const Commit> commit;
-        Status status = SynchronousGetCommit(handler, commit_id, &commit);
-        callback(status, std::move(commit));
-      });
-}
-
-void PageStorageImpl::AddCommitFromLocal(
-    std::unique_ptr<const Commit> commit,
-    std::vector<ObjectIdentifier> new_objects,
-    fit::function<void(Status)> callback) {
-  FXL_DCHECK(IsDigestValid(commit->GetRootIdentifier().object_digest()));
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, commit = std::move(commit), new_objects = std::move(new_objects)](
-          CoroutineHandler* handler,
-          fit::function<void(Status)> callback) mutable {
-        callback(SynchronousAddCommitFromLocal(handler, std::move(commit),
-                                               std::move(new_objects)));
-      });
-}
-
-void PageStorageImpl::AddCommitsFromSync(
-    std::vector<CommitIdAndBytes> ids_and_bytes, ChangeSource source,
-    fit::function<void(Status, std::vector<CommitId>)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, ids_and_bytes = std::move(ids_and_bytes), source](
-          CoroutineHandler* handler,
-          fit::function<void(Status, std::vector<CommitId>)> callback) mutable {
-        std::vector<CommitId> missing_ids;
-        Status status = SynchronousAddCommitsFromSync(
-            handler, std::move(ids_and_bytes), source, &missing_ids);
-        callback(status, std::move(missing_ids));
-      });
-}
-
-void PageStorageImpl::StartCommit(
-    const CommitId& commit_id, JournalType journal_type,
-    fit::function<void(Status, std::unique_ptr<Journal>)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, commit_id, journal_type](
-          CoroutineHandler* handler,
-          fit::function<void(Status, std::unique_ptr<Journal>)> callback) {
-        JournalId journal_id;
-        Status status =
-            db_->CreateJournalId(handler, journal_type, commit_id, &journal_id);
-        if (status != Status::OK) {
-          callback(status, nullptr);
-          return;
-        }
-
-        std::unique_ptr<Journal> journal = JournalImpl::Simple(
-            journal_type, environment_, this, journal_id, commit_id);
-        callback(Status::OK, std::move(journal));
-      });
-}
-
-void PageStorageImpl::StartMergeCommit(
-    const CommitId& left, const CommitId& right,
-    fit::function<void(Status, std::unique_ptr<Journal>)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, left, right](
-          CoroutineHandler* handler,
-          fit::function<void(Status, std::unique_ptr<Journal>)> callback) {
-        JournalId journal_id;
-        Status status = db_->CreateJournalId(handler, JournalType::EXPLICIT,
-                                             left, &journal_id);
-        if (status != Status::OK) {
-          callback(status, nullptr);
-          return;
-        }
-
-        std::unique_ptr<Journal> journal =
-            JournalImpl::Merge(environment_, this, journal_id, left, right);
-        callback(Status::OK, std::move(journal));
-      });
-}
-
-void PageStorageImpl::CommitJournal(
-    std::unique_ptr<Journal> journal,
-    fit::function<void(Status, std::unique_ptr<const Commit>)> callback) {
-  FXL_DCHECK(journal);
-
-  auto managed_journal = managed_container_.Manage(std::move(journal));
-  JournalImpl* journal_ptr = static_cast<JournalImpl*>(managed_journal->get());
-
-  journal_ptr->Commit(
-      [journal_ptr, managed_journal = std::move(managed_journal),
-       callback = std::move(callback)](
-          Status status, std::unique_ptr<const Commit> commit) mutable {
-        if (status != Status::OK) {
-          // Commit failed, roll the journal back.
-          journal_ptr->Rollback(
-              [status, managed_journal = std::move(managed_journal),
-               callback = std::move(callback)](Status /*rollback_status*/) {
-                callback(status, nullptr);
-              });
-          return;
-        }
-        callback(Status::OK, std::move(commit));
-      });
-}
-
-void PageStorageImpl::RollbackJournal(std::unique_ptr<Journal> journal,
-                                      fit::function<void(Status)> callback) {
-  FXL_DCHECK(journal);
-
-  auto managed_journal = managed_container_.Manage(std::move(journal));
-  JournalImpl* journal_ptr = static_cast<JournalImpl*>(managed_journal->get());
-
-  journal_ptr->Rollback(
-      [managed_journal = std::move(managed_journal),
-       callback = std::move(callback)](Status status) { callback(status); });
-}
-
-Status PageStorageImpl::AddCommitWatcher(CommitWatcher* watcher) {
-  watchers_.push_back(watcher);
-  return Status::OK;
-}
-
-Status PageStorageImpl::RemoveCommitWatcher(CommitWatcher* watcher) {
-  auto watcher_it =
-      std::find_if(watchers_.begin(), watchers_.end(),
-                   [watcher](CommitWatcher* w) { return w == watcher; });
-  if (watcher_it == watchers_.end()) {
-    return Status::NOT_FOUND;
-  }
-  watchers_.erase(watcher_it);
-  return Status::OK;
-}
-
-void PageStorageImpl::IsSynced(fit::function<void(Status, bool)> callback) {
-  auto waiter = fxl::MakeRefCounted<callback::Waiter<Status, bool>>(Status::OK);
-  // Check for unsynced commits.
-  coroutine_manager_.StartCoroutine(
-      waiter->NewCallback(),
-      [this](CoroutineHandler* handler,
-             fit::function<void(Status, bool)> callback) {
-        std::vector<CommitId> commit_ids;
-        Status status = db_->GetUnsyncedCommitIds(handler, &commit_ids);
-        if (status != Status::OK) {
-          callback(status, false);
-        } else {
-          callback(Status::OK, commit_ids.empty());
-        }
-      });
-
-  // Check for unsynced pieces.
-  GetUnsyncedPieces([pieces_callback = waiter->NewCallback()](
-                        Status status, std::vector<ObjectIdentifier> pieces) {
-    if (status != Status::OK) {
-      pieces_callback(status, false);
-    } else {
-      pieces_callback(Status::OK, pieces.empty());
-    }
-  });
-
-  waiter->Finalize([callback = std::move(callback)](
-                       Status status, std::vector<bool> is_synced) {
-    if (status != Status::OK) {
-      callback(status, false);
-      return;
-    }
-    FXL_DCHECK(is_synced.size() == 2);
-    callback(Status::OK, is_synced[0] && is_synced[1]);
-  });
-}
-
-bool PageStorageImpl::IsOnline() { return page_is_online_; }
-
-void PageStorageImpl::IsEmpty(fit::function<void(Status, bool)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback), [this](CoroutineHandler* handler,
-                                  fit::function<void(Status, bool)> callback) {
-        // Check there is a single head.
-        std::vector<CommitId> commit_ids;
-        Status status = db_->GetHeads(handler, &commit_ids);
-        if (status != Status::OK) {
-          callback(status, false);
-          return;
-        }
-        FXL_DCHECK(!commit_ids.empty());
-        if (commit_ids.size() > 1) {
-          // A page is not empty if there is more than one head commit.
-          callback(Status::OK, false);
-          return;
-        }
-        // Compare the root node of the head commit to that of the empty node.
-        std::unique_ptr<const Commit> commit;
-        status = SynchronousGetCommit(handler, commit_ids[0], &commit);
-        ObjectIdentifier* empty_node_id;
-        status = SynchronousGetEmptyNodeIdentifier(handler, &empty_node_id);
-        if (status != Status::OK) {
-          callback(status, false);
-          return;
-        }
-        callback(Status::OK, commit->GetRootIdentifier() == *empty_node_id);
-      });
-}
-
-void PageStorageImpl::GetUnsyncedCommits(
-    fit::function<void(Status, std::vector<std::unique_ptr<const Commit>>)>
-        callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this](CoroutineHandler* handler,
-             fit::function<void(Status,
-                                std::vector<std::unique_ptr<const Commit>>)>
-                 callback) {
-        std::vector<std::unique_ptr<const Commit>> unsynced_commits;
-        Status s = SynchronousGetUnsyncedCommits(handler, &unsynced_commits);
-        callback(s, std::move(unsynced_commits));
-      });
-}
-
-void PageStorageImpl::MarkCommitSynced(const CommitId& commit_id,
-                                       fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, commit_id](CoroutineHandler* handler,
-                        fit::function<void(Status)> callback) {
-        callback(SynchronousMarkCommitSynced(handler, commit_id));
-      });
-}
-
-void PageStorageImpl::GetUnsyncedPieces(
-    fit::function<void(Status, std::vector<ObjectIdentifier>)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this](
-          CoroutineHandler* handler,
-          fit::function<void(Status, std::vector<ObjectIdentifier>)> callback) {
-        std::vector<ObjectIdentifier> unsynced_object_identifiers;
-        Status s =
-            db_->GetUnsyncedPieces(handler, &unsynced_object_identifiers);
-        callback(s, unsynced_object_identifiers);
-      });
-}
-
-void PageStorageImpl::MarkPieceSynced(ObjectIdentifier object_identifier,
-                                      fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, object_identifier = std::move(object_identifier)](
-          CoroutineHandler* handler, fit::function<void(Status)> callback) {
-        callback(db_->SetObjectStatus(handler, object_identifier,
-                                      PageDbObjectStatus::SYNCED));
-      });
-}
-
-void PageStorageImpl::IsPieceSynced(
-    ObjectIdentifier object_identifier,
-    fit::function<void(Status, bool)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, object_identifier = std::move(object_identifier)](
-          CoroutineHandler* handler,
-          fit::function<void(Status, bool)> callback) {
-        PageDbObjectStatus object_status;
-        Status status =
-            db_->GetObjectStatus(handler, object_identifier, &object_status);
-        callback(status, object_status == PageDbObjectStatus::SYNCED);
-      });
-}
-
-void PageStorageImpl::MarkSyncedToPeer(fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      [this, callback = std::move(callback)](CoroutineHandler* handler) {
-        std::unique_ptr<PageDb::Batch> batch;
-        Status status = db_->StartBatch(handler, &batch);
-        if (status != Status::OK) {
-          callback(status);
-          return;
-        }
-        status = SynchronousMarkPageOnline(handler, batch.get());
-        if (status != Status::OK) {
-          callback(status);
-          return;
-        }
-        callback(batch->Execute(handler));
-      });
-}
-
-void PageStorageImpl::AddObjectFromLocal(
-    ObjectType object_type, std::unique_ptr<DataSource> data_source,
-    fit::function<void(Status, ObjectIdentifier)> callback) {
-  auto traced_callback =
-      TRACE_CALLBACK(std::move(callback), "ledger", "page_storage_add_object");
-
-  auto managed_data_source = managed_container_.Manage(std::move(data_source));
-  auto managed_data_source_ptr = managed_data_source->get();
-  auto waiter = fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-  SplitDataSource(
-      managed_data_source_ptr, object_type,
-      [this](ObjectDigest object_digest) {
-        FXL_DCHECK(IsDigestValid(object_digest));
-        return encryption_service_->MakeObjectIdentifier(
-            std::move(object_digest));
-      },
-      [this, waiter, managed_data_source = std::move(managed_data_source),
-       callback = std::move(traced_callback)](
-          IterationStatus status, ObjectIdentifier identifier,
-          std::unique_ptr<DataSource::DataChunk> chunk) mutable {
-        if (status == IterationStatus::ERROR) {
-          callback(Status::IO_ERROR, ObjectIdentifier());
-          return;
-        }
-
-        FXL_DCHECK(chunk != nullptr);
-
-        if (!GetObjectDigestInfo(identifier.object_digest()).is_inlined()) {
-          AddPiece(identifier, ChangeSource::LOCAL, IsObjectSynced::NO,
-                   std::move(chunk), waiter->NewCallback());
-        }
-        if (status == IterationStatus::IN_PROGRESS)
-          return;
-
-        FXL_DCHECK(status == IterationStatus::DONE);
-        waiter->Finalize(
-            [identifier = std::move(identifier),
-             callback = std::move(callback)](Status status) mutable {
-              callback(status, std::move(identifier));
-            });
-      });
-}
-
-void PageStorageImpl::GetObjectPart(
-    ObjectIdentifier object_identifier, int64_t offset, int64_t max_size,
-    Location location, fit::function<void(Status, fsl::SizedVmo)> callback) {
-  FXL_DCHECK(IsDigestValid(object_identifier.object_digest()));
-  GetPiece(
-      object_identifier,
-      [this, object_identifier, offset, max_size, location,
-       callback = std::move(callback)](
-          Status status, std::unique_ptr<const Object> object) mutable {
-        if (status == Status::NOT_FOUND) {
-          if (location == Location::NETWORK) {
-            GetObjectPartFromSync(object_identifier, offset, max_size,
-                                  std::move(callback));
-          } else {
-            callback(Status::NOT_FOUND, nullptr);
-          }
-          return;
-        }
-
-        if (status != Status::OK) {
-          callback(status, nullptr);
-          return;
-        }
-
-        FXL_DCHECK(object);
-        ObjectDigestInfo digest_info =
-            GetObjectDigestInfo(object_identifier.object_digest());
-        fxl::StringView data;
-        Status get_data_status = object->GetData(&data);
-        if (get_data_status != Status::OK) {
-          callback(get_data_status, nullptr);
-          return;
-        }
-
-        if (digest_info.is_inlined() || digest_info.is_chunk()) {
-          fsl::SizedVmo buffer;
-          size_t start = GetObjectPartStart(offset, data.size());
-          size_t length = GetObjectPartLength(max_size, data.size(), start);
-
-          if (!fsl::VmoFromString(data.substr(start, length), &buffer)) {
-            callback(Status::INTERNAL_IO_ERROR, nullptr);
-            return;
-          }
-          callback(Status::OK, std::move(buffer));
-          return;
-        }
-
-        FXL_DCHECK(digest_info.piece_type == PieceType::INDEX);
-        const FileIndex* file_index;
-        status = FileIndexSerialization::ParseFileIndex(data, &file_index);
-        if (status != Status::OK) {
-          callback(Status::FORMAT_ERROR, nullptr);
-          return;
-        }
-        size_t start = GetObjectPartStart(offset, file_index->size());
-        size_t length =
-            GetObjectPartLength(max_size, file_index->size(), start);
-
-        zx::vmo raw_vmo;
-        zx_status_t zx_status = zx::vmo::create(length, 0, &raw_vmo);
-        if (zx_status != ZX_OK) {
-          FXL_LOG(WARNING) << "Unable to create VMO of size: " << length;
-          callback(Status::INTERNAL_IO_ERROR, nullptr);
-          return;
-        }
-        fsl::SizedVmo vmo(std::move(raw_vmo), length);
-
-        if (length == 0) {
-          callback(Status::OK, std::move(vmo));
-        }
-
-        fsl::SizedVmo vmo_copy;
-        zx_status = vmo.Duplicate(ZX_RIGHTS_BASIC | ZX_RIGHT_WRITE, &vmo_copy);
-        if (zx_status != ZX_OK) {
-          FXL_LOG(ERROR) << "Unable to duplicate vmo. Status: " << zx_status;
-          callback(Status::INTERNAL_IO_ERROR, nullptr);
-          return;
-        }
-        FillBufferWithObjectContent(
-            std::move(object), std::move(vmo_copy), start, length, 0,
-            file_index->size(),
-            [vmo = std::move(vmo), callback = std::move(callback)](
-                Status status) mutable { callback(status, std::move(vmo)); });
-      });
-}
-
-void PageStorageImpl::GetObject(
-    ObjectIdentifier object_identifier, Location location,
-    fit::function<void(Status, std::unique_ptr<const Object>)> callback) {
-  GetObjectPart(object_identifier, 0, -1, location,
-                [object_identifier = std::move(object_identifier),
-                 callback = std::move(callback)](Status status,
-                                                 fsl::SizedVmo vmo) mutable {
-                  callback(status,
-                           std::make_unique<VmoObject>(
-                               std::move(object_identifier), std::move(vmo)));
-                });
-}
-
-void PageStorageImpl::GetPiece(
-    ObjectIdentifier object_identifier,
-    fit::function<void(Status, std::unique_ptr<const Object>)> callback) {
-  ObjectDigestInfo digest_info =
-      GetObjectDigestInfo(object_identifier.object_digest());
-  if (digest_info.is_inlined()) {
-    callback(Status::OK,
-             std::make_unique<InlinedObject>(std::move(object_identifier)));
-    return;
-  }
-
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, object_identifier = std::move(object_identifier)](
-          CoroutineHandler* handler,
-          fit::function<void(Status, std::unique_ptr<const Object>)>
-              callback) mutable {
-        std::unique_ptr<const Object> object;
-        Status status =
-            db_->ReadObject(handler, std::move(object_identifier), &object);
-        callback(status, std::move(object));
-      });
-}
-
-void PageStorageImpl::SetSyncMetadata(fxl::StringView key,
-                                      fxl::StringView value,
-                                      fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, key = key.ToString(), value = value.ToString()](
-          CoroutineHandler* handler, fit::function<void(Status)> callback) {
-        callback(db_->SetSyncMetadata(handler, key, value));
-      });
-}
-
-void PageStorageImpl::GetSyncMetadata(
-    fxl::StringView key, fit::function<void(Status, std::string)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, key = key.ToString()](
-          CoroutineHandler* handler,
-          fit::function<void(Status, std::string)> callback) {
-        std::string value;
-        Status status = db_->GetSyncMetadata(handler, key, &value);
-        callback(status, std::move(value));
-      });
-}
-
-void PageStorageImpl::GetCommitContents(const Commit& commit,
-                                        std::string min_key,
-                                        fit::function<bool(Entry)> on_next,
-                                        fit::function<void(Status)> on_done) {
-  btree::ForEachEntry(
-      environment_->coroutine_service(), this, commit.GetRootIdentifier(),
-      min_key,
-      [on_next = std::move(on_next)](btree::EntryAndNodeIdentifier next) {
-        return on_next(next.entry);
-      },
-      std::move(on_done));
-}
-
-void PageStorageImpl::GetEntryFromCommit(
-    const Commit& commit, std::string key,
-    fit::function<void(Status, Entry)> callback) {
-  std::unique_ptr<bool> key_found = std::make_unique<bool>(false);
-  auto on_next = [key, key_found = key_found.get(),
-                  callback =
-                      callback.share()](btree::EntryAndNodeIdentifier next) {
-    if (next.entry.key == key) {
-      *key_found = true;
-      callback(Status::OK, next.entry);
-    }
-    return false;
-  };
-
-  auto on_done = [key_found = std::move(key_found),
-                  callback = std::move(callback)](Status s) {
-    if (*key_found) {
-      return;
-    }
-    if (s == Status::OK) {
-      callback(Status::NOT_FOUND, Entry());
-      return;
-    }
-    callback(s, Entry());
-  };
-  btree::ForEachEntry(environment_->coroutine_service(), this,
-                      commit.GetRootIdentifier(), std::move(key),
-                      std::move(on_next), std::move(on_done));
-}
-
-void PageStorageImpl::GetCommitContentsDiff(
-    const Commit& base_commit, const Commit& other_commit, std::string min_key,
-    fit::function<bool(EntryChange)> on_next_diff,
-    fit::function<void(Status)> on_done) {
-  btree::ForEachDiff(environment_->coroutine_service(), this,
-                     base_commit.GetRootIdentifier(),
-                     other_commit.GetRootIdentifier(), std::move(min_key),
-                     std::move(on_next_diff), std::move(on_done));
-}
-
-void PageStorageImpl::GetThreeWayContentsDiff(
-    const Commit& base_commit, const Commit& left_commit,
-    const Commit& right_commit, std::string min_key,
-    fit::function<bool(ThreeWayChange)> on_next_diff,
-    fit::function<void(Status)> on_done) {
-  btree::ForEachThreeWayDiff(
-      environment_->coroutine_service(), this, base_commit.GetRootIdentifier(),
-      left_commit.GetRootIdentifier(), right_commit.GetRootIdentifier(),
-      std::move(min_key), std::move(on_next_diff), std::move(on_done));
-}
-
-void PageStorageImpl::GetJournalEntries(
-    const JournalId& journal_id,
-    fit::function<void(Status, std::unique_ptr<Iterator<const EntryChange>>,
-                       JournalContainsClearOperation contains_clear_operation)>
-        callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, journal_id](
-          CoroutineHandler* handler,
-          fit::function<void(
-              Status, std::unique_ptr<Iterator<const EntryChange>>,
-              JournalContainsClearOperation contains_clear_operation)>
-              callback) {
-        std::unique_ptr<Iterator<const EntryChange>> entries;
-        JournalContainsClearOperation contains_clear_operation;
-        Status s = db_->GetJournalEntries(handler, journal_id, &entries,
-                                          &contains_clear_operation);
-        callback(s, std::move(entries), contains_clear_operation);
-      });
-}
-
-void PageStorageImpl::AddJournalEntry(const JournalId& journal_id,
-                                      fxl::StringView key,
-                                      ObjectIdentifier object_identifier,
-                                      KeyPriority priority,
-                                      fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, journal_id, key = key.ToString(),
-       object_identifier = std::move(object_identifier), priority](
-          CoroutineHandler* handler, fit::function<void(Status)> callback) {
-        callback(db_->AddJournalEntry(handler, journal_id, key,
-                                      object_identifier, priority));
-      });
-}
-
-void PageStorageImpl::RemoveJournalEntry(const JournalId& journal_id,
-                                         convert::ExtendedStringView key,
-                                         fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, journal_id, key = key.ToString()](
-          CoroutineHandler* handler, fit::function<void(Status)> callback) {
-        callback(db_->RemoveJournalEntry(handler, journal_id, key));
-      });
-}
-
-void PageStorageImpl::EmptyJournalAndMarkContainsClearOperation(
-    const JournalId& journal_id, fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, journal_id](CoroutineHandler* handler,
-                         fit::function<void(Status)> callback) {
-        callback(db_->EmptyJournalAndMarkContainsClearOperation(handler,
-                                                                journal_id));
-      });
-}
-
-void PageStorageImpl::RemoveJournal(const JournalId& journal_id,
-                                    fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, journal_id](CoroutineHandler* handler,
-                         fit::function<void(Status)> callback) {
-        callback(db_->RemoveJournal(handler, journal_id));
-      });
-}
-
-void PageStorageImpl::NotifyWatchersOfNewCommits(
-    const std::vector<std::unique_ptr<const Commit>>& new_commits,
-    ChangeSource source) {
-  for (CommitWatcher* watcher : watchers_) {
-    watcher->OnNewCommits(new_commits, source);
-  }
-}
-
-Status PageStorageImpl::MarkAllPiecesLocal(
-    CoroutineHandler* handler, PageDb::Batch* batch,
-    std::vector<ObjectIdentifier> object_identifiers) {
-  std::set<ObjectIdentifier> seen_identifiers;
-  while (!object_identifiers.empty()) {
-    auto it = seen_identifiers.insert(std::move(object_identifiers.back()));
-    object_identifiers.pop_back();
-    const ObjectIdentifier& object_identifier = *(it.first);
-    FXL_DCHECK(
-        !GetObjectDigestInfo(object_identifier.object_digest()).is_inlined());
-    Status status = batch->SetObjectStatus(handler, object_identifier,
-                                           PageDbObjectStatus::LOCAL);
-    if (status != Status::OK) {
-      return status;
-    }
-    if (GetObjectDigestInfo(object_identifier.object_digest()).piece_type ==
-        PieceType::INDEX) {
-      std::unique_ptr<const Object> object;
-      status = db_->ReadObject(handler, object_identifier, &object);
-      if (status != Status::OK) {
-        return status;
-      }
-
-      fxl::StringView content;
-      status = object->GetData(&content);
-      if (status != Status::OK) {
-        return status;
-      }
-
-      const FileIndex* file_index;
-      status = FileIndexSerialization::ParseFileIndex(content, &file_index);
-      if (status != Status::OK) {
-        return status;
-      }
-
-      object_identifiers.reserve(object_identifiers.size() +
-                                 file_index->children()->size());
-      for (const auto* child : *file_index->children()) {
-        ObjectIdentifier new_object_identifier =
-            ToObjectIdentifier(child->object_identifier());
-        if (!GetObjectDigestInfo(new_object_identifier.object_digest())
-                 .is_inlined()) {
-          if (!seen_identifiers.count(new_object_identifier)) {
-            object_identifiers.push_back(std::move(new_object_identifier));
-          }
-        }
-      }
-    }
-  }
-  return Status::OK;
-}
-
-Status PageStorageImpl::ContainsCommit(CoroutineHandler* handler,
-                                       CommitIdView id) {
-  if (IsFirstCommit(id)) {
-    return Status::OK;
-  }
-  std::string bytes;
-  return db_->GetCommitStorageBytes(handler, id, &bytes);
-}
-
-bool PageStorageImpl::IsFirstCommit(CommitIdView id) {
-  return id == kFirstPageCommitId;
-}
-
-void PageStorageImpl::AddPiece(ObjectIdentifier object_identifier,
-                               ChangeSource source,
-                               IsObjectSynced is_object_synced,
-                               std::unique_ptr<DataSource::DataChunk> data,
-                               fit::function<void(Status)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, object_identifier = std::move(object_identifier),
-       data = std::move(data), source,
-       is_object_synced](CoroutineHandler* handler,
-                         fit::function<void(Status)> callback) mutable {
-        callback(SynchronousAddPiece(handler, std::move(object_identifier),
-                                     source, is_object_synced,
-                                     std::move(data)));
-      });
-}
-
-void PageStorageImpl::DownloadFullObject(ObjectIdentifier object_identifier,
-                                         fit::function<void(Status)> callback) {
-  FXL_DCHECK(page_sync_);
-  FXL_DCHECK(
-      !GetObjectDigestInfo(object_identifier.object_digest()).is_inlined());
-
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, object_identifier = std::move(object_identifier)](
-          CoroutineHandler* handler,
-          fit::function<void(Status)> callback) mutable {
-        Status status;
-        ChangeSource source;
-        IsObjectSynced is_object_synced;
-        std::unique_ptr<DataSource::DataChunk> chunk;
-
-        if (coroutine::SyncCall(
-                handler,
-                [this, object_identifier](
-                    fit::function<void(Status, ChangeSource, IsObjectSynced,
-                                       std::unique_ptr<DataSource::DataChunk>)>
-                        callback) mutable {
-                  page_sync_->GetObject(std::move(object_identifier),
-                                        std::move(callback));
-                },
-                &status, &source, &is_object_synced,
-                &chunk) == coroutine::ContinuationStatus::INTERRUPTED) {
-          callback(Status::INTERRUPTED);
-          return;
-        }
-
-        if (status != Status::OK) {
-          callback(status);
-          return;
-        }
-        auto digest_info =
-            GetObjectDigestInfo(object_identifier.object_digest());
-        FXL_DCHECK(!digest_info.is_inlined());
-
-        if (object_identifier.object_digest() !=
-            ComputeObjectDigest(digest_info.piece_type, digest_info.object_type,
-                                chunk->Get())) {
-          callback(Status::OBJECT_DIGEST_MISMATCH);
-          return;
-        }
-
-        if (digest_info.is_chunk()) {
-          callback(SynchronousAddPiece(handler, std::move(object_identifier),
-                                       source, is_object_synced,
-                                       std::move(chunk)));
-          return;
-        }
-
-        auto waiter =
-            fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-        status = ForEachPiece(chunk->Get(), [&](ObjectIdentifier identifier) {
-          if (GetObjectDigestInfo(identifier.object_digest()).is_inlined()) {
-            return Status::OK;
-          }
-
-          Status status = db_->ReadObject(handler, identifier, nullptr);
-          if (status == Status::NOT_FOUND) {
-            DownloadFullObject(std::move(identifier), waiter->NewCallback());
-            return Status::OK;
-          }
-          return status;
-        });
-        if (status != Status::OK) {
-          callback(status);
-          return;
-        }
-
-        if (coroutine::Wait(handler, std::move(waiter), &status) ==
-            coroutine::ContinuationStatus::INTERRUPTED) {
-          callback(Status::INTERRUPTED);
-          return;
-        }
-
-        if (status != Status::OK) {
-          callback(status);
-          return;
-        }
-
-        callback(SynchronousAddPiece(handler, std::move(object_identifier),
-                                     source, is_object_synced,
-                                     std::move(chunk)));
-      });
-}
-
-void PageStorageImpl::GetObjectPartFromSync(
-    ObjectIdentifier object_identifier, size_t offset, size_t size,
-    fit::function<void(Status, fsl::SizedVmo)> callback) {
-  if (!page_sync_) {
-    callback(Status::NOT_CONNECTED_ERROR, nullptr);
-    return;
-  }
-
-  // TODO(LE-239): download only the needed part.
-  DownloadFullObject(object_identifier,
-                     [this, object_identifier, offset, size,
-                      callback = std::move(callback)](Status status) mutable {
-                       if (status != Status::OK) {
-                         callback(status, nullptr);
-                         return;
-                       }
-
-                       GetObjectPart(object_identifier, offset, size,
-                                     Location::LOCAL, std::move(callback));
-                     });
-}
-
-void PageStorageImpl::ObjectIsUntracked(
-    ObjectIdentifier object_identifier,
-    fit::function<void(Status, bool)> callback) {
-  coroutine_manager_.StartCoroutine(
-      std::move(callback),
-      [this, object_identifier = std::move(object_identifier)](
-          CoroutineHandler* handler,
-          fit::function<void(Status, bool)> callback) mutable {
-        if (GetObjectDigestInfo(object_identifier.object_digest())
-                .is_inlined()) {
-          callback(Status::OK, false);
-          return;
-        }
-
-        PageDbObjectStatus object_status;
-        Status status =
-            db_->GetObjectStatus(handler, object_identifier, &object_status);
-        callback(status, object_status == PageDbObjectStatus::TRANSIENT);
-      });
-}
-
-void PageStorageImpl::FillBufferWithObjectContent(
-    ObjectIdentifier object_identifier, fsl::SizedVmo vmo,
-    int64_t global_offset, size_t global_size, int64_t current_position,
-    size_t object_size, fit::function<void(Status)> callback) {
-  GetPiece(object_identifier,
-           [this, vmo = std::move(vmo), global_offset, global_size,
-            current_position, object_size, callback = std::move(callback)](
-               Status status, std::unique_ptr<const Object> object) mutable {
-             if (status != Status::OK) {
-               callback(status);
-               return;
-             }
-
-             FXL_DCHECK(object);
-             FillBufferWithObjectContent(
-                 std::move(object), std::move(vmo), global_offset, global_size,
-                 current_position, object_size, std::move(callback));
-           });
-}
-
-void PageStorageImpl::FillBufferWithObjectContent(
-    std::unique_ptr<const Object> object, fsl::SizedVmo vmo,
-    int64_t global_offset, size_t global_size, int64_t current_position,
-    size_t object_size, fit::function<void(Status)> callback) {
-  fxl::StringView content;
-  Status status = object->GetData(&content);
-  if (status != Status::OK) {
-    callback(status);
-    return;
-  }
-  ObjectDigestInfo digest_info =
-      GetObjectDigestInfo(object->GetIdentifier().object_digest());
-  if (digest_info.is_inlined() || digest_info.is_chunk()) {
-    if (object_size != content.size()) {
-      FXL_LOG(ERROR) << "Error in serialization format. Expecting object: "
-                     << object->GetIdentifier()
-                     << " to have size: " << object_size
-                     << ", but found an object of size: " << content.size();
-      callback(Status::FORMAT_ERROR);
-      return;
-    }
-    // Distance is negative if the offset is ahead and positive if behind.
-    int64_t distance_from_global_offset = current_position - global_offset;
-    // Read offset can be non-zero on first read; in that case, we need to skip
-    // bytes coming before global offset.
-    size_t read_offset = std::max(-distance_from_global_offset, 0L);
-    // Write offset is zero on the first write; otherwise we need to skip number
-    // of bytes corresponding to what we have already written.
-    size_t write_offset = std::max(distance_from_global_offset, 0L);
-    // Read and write until reaching either size of the object, or global size.
-    size_t read_write_size =
-        std::min(content.size() - read_offset, global_size - write_offset);
-    FXL_DCHECK(read_write_size > 0);
-    fxl::StringView read_substr = content.substr(read_offset, read_write_size);
-    zx_status_t zx_status =
-        vmo.vmo().write(read_substr.data(), write_offset, read_write_size);
-    if (zx_status != ZX_OK) {
-      FXL_LOG(ERROR) << "Unable to write to vmo. Status: " << zx_status;
-      callback(Status::INTERNAL_IO_ERROR);
-      return;
-    }
-    callback(Status::OK);
-    return;
-  }
-
-  const FileIndex* file_index;
-  status = FileIndexSerialization::ParseFileIndex(content, &file_index);
-  if (status != Status::OK) {
-    callback(Status::FORMAT_ERROR);
-    return;
-  }
-  if (file_index->size() != object_size) {
-    FXL_LOG(ERROR) << "Error in serialization format. Expecting object: "
-                   << object->GetIdentifier() << " to have size " << object_size
-                   << ", but found an index object of size: "
-                   << file_index->size();
-    callback(Status::FORMAT_ERROR);
-    return;
-  }
-
-  int64_t sub_offset = 0;
-  auto waiter = fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-  for (const auto* child : *file_index->children()) {
-    if (sub_offset + child->size() > file_index->size()) {
-      callback(Status::FORMAT_ERROR);
-      return;
-    }
-    int64_t child_position = current_position + sub_offset;
-    ObjectIdentifier child_identifier =
-        ToObjectIdentifier(child->object_identifier());
-    if (child_position + static_cast<int64_t>(child->size()) < global_offset) {
-      sub_offset += child->size();
-      continue;
-    }
-    if (global_offset + static_cast<int64_t>(global_size) < child_position) {
-      break;
-    }
-    fsl::SizedVmo vmo_copy;
-    zx_status_t zx_status =
-        vmo.Duplicate(ZX_RIGHTS_BASIC | ZX_RIGHT_WRITE, &vmo_copy);
-    if (zx_status != ZX_OK) {
-      FXL_LOG(ERROR) << "Unable to duplicate vmo. Status: " << zx_status;
-      callback(Status::INTERNAL_IO_ERROR);
-      return;
-    }
-    FillBufferWithObjectContent(child_identifier, std::move(vmo_copy),
-                                global_offset, global_size, child_position,
-                                child->size(), waiter->NewCallback());
-    sub_offset += child->size();
-  }
-  waiter->Finalize(std::move(callback));
-}
-
-Status PageStorageImpl::SynchronousInit(CoroutineHandler* handler) {
-  // Add the default page head if this page is empty.
-  std::vector<CommitId> heads;
-  Status s = db_->GetHeads(handler, &heads);
-  if (s != Status::OK) {
-    return s;
-  }
-  if (heads.empty()) {
-    s = db_->AddHead(handler, kFirstPageCommitId, zx::time_utc());
-    if (s != Status::OK) {
-      return s;
-    }
-  }
-
-  // Cache whether this page is online or not.
-  s = db_->IsPageOnline(handler, &page_is_online_);
-  if (s != Status::OK) {
-    return s;
-  }
-
-  // Remove uncommited explicit journals.
-  if (db_->RemoveExplicitJournals(handler) == Status::INTERRUPTED) {
-    // Only fail if the handler is invalidated. Otherwise, failure to remove
-    // explicit journals should not block the initalization.
-    return Status::INTERRUPTED;
-  }
-
-  // Commit uncommited implicit journals.
-  std::vector<JournalId> journal_ids;
-  s = db_->GetImplicitJournalIds(handler, &journal_ids);
-  if (s != Status::OK) {
-    return s;
-  }
-
-  auto waiter = fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-  for (JournalId& id : journal_ids) {
-    CommitId base;
-    s = db_->GetBaseCommitForJournal(handler, id, &base);
-    if (s != Status::OK) {
-      FXL_LOG(ERROR) << "Failed to get implicit journal with status " << s
-                     << ". journal id: " << id;
-      return s;
-    }
-    std::unique_ptr<Journal> journal = JournalImpl::Simple(
-        JournalType::IMPLICIT, environment_, this, id, base);
-
-    CommitJournal(
-        std::move(journal), [status_callback = waiter->NewCallback()](
-                                Status status, std::unique_ptr<const Commit>) {
-          if (status != Status::OK) {
-            FXL_LOG(ERROR) << "Failed to commit implicit journal created in "
-                              "previous Ledger execution.";
-          }
-          status_callback(status);
-        });
-  }
-
-  if (coroutine::Wait(handler, std::move(waiter), &s) ==
-      coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERRUPTED;
-  }
-  return s;
-}
-
-Status PageStorageImpl::SynchronousGetCommit(
-    CoroutineHandler* handler, CommitId commit_id,
-    std::unique_ptr<const Commit>* commit) {
-  if (IsFirstCommit(commit_id)) {
-    Status s;
-    if (coroutine::SyncCall(
-            handler,
-            [this](fit::function<void(Status, std::unique_ptr<const Commit>)>
-                       callback) {
-              CommitImpl::Empty(this, std::move(callback));
-            },
-            &s, commit) == coroutine::ContinuationStatus::INTERRUPTED) {
-      return Status::INTERRUPTED;
-    }
-    return s;
-  }
-  std::string bytes;
-  Status s = db_->GetCommitStorageBytes(handler, commit_id, &bytes);
-  if (s != Status::OK) {
-    return s;
-  }
-  return CommitImpl::FromStorageBytes(this, commit_id, std::move(bytes),
-                                      commit);
-}
-
-Status PageStorageImpl::SynchronousAddCommitFromLocal(
-    CoroutineHandler* handler, std::unique_ptr<const Commit> commit,
-    std::vector<ObjectIdentifier> new_objects) {
-  std::vector<std::unique_ptr<const Commit>> commits;
-  commits.reserve(1);
-  commits.push_back(std::move(commit));
-
-  return SynchronousAddCommits(handler, std::move(commits), ChangeSource::LOCAL,
-                               std::move(new_objects), nullptr);
-}
-
-Status PageStorageImpl::SynchronousAddCommitsFromSync(
-    CoroutineHandler* handler, std::vector<CommitIdAndBytes> ids_and_bytes,
-    ChangeSource source, std::vector<CommitId>* missing_ids) {
-  std::vector<std::unique_ptr<const Commit>> commits;
-
-  std::map<const CommitId*, const Commit*, StringPointerComparator> leaves;
-  commits.reserve(ids_and_bytes.size());
-
-  // The locked section below contains asynchronous operations reading the
-  // database, and branches depending on those reads. This section is thus a
-  // critical section and we need to ensure it is not executed concurrently by
-  // several coroutines. The locked sections (and only those) are thus executed
-  // serially.
-  std::unique_ptr<lock::Lock> lock;
-  if (lock::AcquireLock(handler, &commit_serializer_, &lock) ==
-      coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERRUPTED;
-  }
-
-  for (auto& id_and_bytes : ids_and_bytes) {
-    CommitId id = std::move(id_and_bytes.id);
-    std::string storage_bytes = std::move(id_and_bytes.bytes);
-    Status status = ContainsCommit(handler, id);
-    if (status == Status::OK) {
-      // We only mark cloud-sourced commits as synced.
-      if (source == ChangeSource::CLOUD) {
-        Status status = SynchronousMarkCommitSynced(handler, id);
-        if (status != Status::OK) {
-          return status;
-        }
-      }
-      continue;
-    }
-
-    if (status != Status::NOT_FOUND) {
-      return status;
-    }
-
-    std::unique_ptr<const Commit> commit;
-    status = CommitImpl::FromStorageBytes(this, id, std::move(storage_bytes),
-                                          &commit);
-    if (status != Status::OK) {
-      FXL_LOG(ERROR) << "Unable to add commit. Id: " << convert::ToHex(id);
-      return status;
-    }
-
-    // Remove parents from leaves.
-    for (const auto& parent_id : commit->GetParentIds()) {
-      auto it = leaves.find(&parent_id);
-      if (it != leaves.end()) {
-        leaves.erase(it);
-      }
-    }
-    leaves[&commit->GetId()] = commit.get();
-    commits.push_back(std::move(commit));
-  }
-
-  if (commits.empty()) {
-    return Status::OK;
-  }
-
-  lock.reset();
-
-  auto waiter = fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-  // Get all objects from sync and then add the commit objects.
-  for (const auto& leaf : leaves) {
-    btree::GetObjectsFromSync(environment_->coroutine_service(), this,
-                              leaf.second->GetRootIdentifier(),
-                              waiter->NewCallback());
-  }
-
-  Status waiter_status;
-  if (coroutine::Wait(handler, std::move(waiter), &waiter_status) ==
-      coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERRUPTED;
-  }
-  if (waiter_status != Status::OK) {
-    return waiter_status;
-  }
-
-  return SynchronousAddCommits(handler, std::move(commits), source,
-                               std::vector<ObjectIdentifier>(), missing_ids);
-}
-
-Status PageStorageImpl::SynchronousGetUnsyncedCommits(
-    CoroutineHandler* handler,
-    std::vector<std::unique_ptr<const Commit>>* unsynced_commits) {
-  std::vector<CommitId> commit_ids;
-  Status s = db_->GetUnsyncedCommitIds(handler, &commit_ids);
-  if (s != Status::OK) {
-    return s;
-  }
-
-  auto waiter = fxl::MakeRefCounted<
-      callback::Waiter<Status, std::unique_ptr<const Commit>>>(Status::OK);
-  for (const auto& commit_id : commit_ids) {
-    GetCommit(commit_id, waiter->NewCallback());
-  }
-
-  std::vector<std::unique_ptr<const Commit>> result;
-  if (coroutine::Wait(handler, std::move(waiter), &s, &result) ==
-      coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERRUPTED;
-  }
-  if (s != Status::OK) {
-    return s;
-  }
-  unsynced_commits->swap(result);
-  return Status::OK;
-}
-
-Status PageStorageImpl::SynchronousMarkCommitSynced(CoroutineHandler* handler,
-                                                    const CommitId& commit_id) {
-  std::unique_ptr<PageDb::Batch> batch;
-  Status status = db_->StartBatch(handler, &batch);
-  if (status != Status::OK) {
-    return status;
-  }
-  status = SynchronousMarkCommitSyncedInBatch(handler, batch.get(), commit_id);
-  if (status != Status::OK) {
-    return status;
-  }
-  return batch->Execute(handler);
-}
-
-Status PageStorageImpl::SynchronousMarkCommitSyncedInBatch(
-    CoroutineHandler* handler, PageDb::Batch* batch,
-    const CommitId& commit_id) {
-  Status status = SynchronousMarkPageOnline(handler, batch);
-  if (status != Status::OK) {
-    return status;
-  }
-  return batch->MarkCommitIdSynced(handler, commit_id);
-}
-
-Status PageStorageImpl::SynchronousAddCommits(
-    CoroutineHandler* handler,
-    std::vector<std::unique_ptr<const Commit>> commits, ChangeSource source,
-    std::vector<ObjectIdentifier> new_objects,
-    std::vector<CommitId>* missing_ids) {
-  // Make sure that only one AddCommits operation is executed at a time.
-  // Otherwise, if db_ operations are asynchronous, ContainsCommit (below) may
-  // return NOT_FOUND while another commit is added, and batch->Execute() will
-  // break the invariants of this system (in particular, that synced commits
-  // cannot become unsynced).
-  std::unique_ptr<lock::Lock> lock;
-  if (lock::AcquireLock(handler, &commit_serializer_, &lock) ==
-      coroutine::ContinuationStatus::INTERRUPTED) {
-    return Status::INTERRUPTED;
-  }
-
-  // Apply all changes atomically.
-  std::unique_ptr<PageDb::Batch> batch;
-  Status status = db_->StartBatch(handler, &batch);
-  if (status != Status::OK) {
-    return status;
-  }
-  std::set<const CommitId*, StringPointerComparator> added_commits;
-  std::vector<std::unique_ptr<const Commit>> commits_to_send;
-
-  std::map<CommitId, zx::time_utc> heads_to_add;
-
-  int orphaned_commits = 0;
-  for (auto& commit : commits) {
-    // We need to check if we are adding an already present remote commit here
-    // because we might both download and locally commit the same commit at
-    // roughly the same time. As commit writing is asynchronous, the previous
-    // check in AddCommitsFromSync may have not matched any commit, while a
-    // commit got added in between.
-    Status s = ContainsCommit(handler, commit->GetId());
-    if (s == Status::OK) {
-      if (source == ChangeSource::CLOUD) {
-        s = SynchronousMarkCommitSyncedInBatch(handler, batch.get(),
-                                               commit->GetId());
-        if (s != Status::OK) {
-          return s;
-        }
-      }
-      // The commit is already here. We can safely skip it.
-      continue;
-    }
-    if (s != Status::NOT_FOUND) {
-      return s;
-    }
-    // Now, we know we are adding a new commit.
-
-    // Commits should arrive in order. Check that the parents are either
-    // present in PageDb or in the list of already processed commits.
-    // If the commit arrive out of order, print an error, but skip it
-    // temporarly so that the Ledger can recover if all the needed commits
-    // are received in a single batch.
-    bool orphaned_commit = false;
-    for (const CommitIdView& parent_id : commit->GetParentIds()) {
-      if (added_commits.find(&parent_id) == added_commits.end()) {
-        s = ContainsCommit(handler, parent_id);
-        if (s != Status::OK) {
-          FXL_LOG(ERROR) << "Failed to find parent commit \""
-                         << ToHex(parent_id) << "\" of commit \""
-                         << convert::ToHex(commit->GetId()) << "\".";
-          if (s == Status::NOT_FOUND) {
-            if (missing_ids) {
-              missing_ids->push_back(parent_id.ToString());
-            }
-            orphaned_commit = true;
-            continue;
-          }
-          return Status::INTERNAL_IO_ERROR;
-        }
-      }
-      // Remove the parent from the list of heads.
-      if (!heads_to_add.erase(parent_id.ToString())) {
-        // parent_id was not added in the batch: remove it from heads in Db.
-        s = batch->RemoveHead(handler, parent_id);
-        if (s != Status::OK) {
-          return s;
-        }
-      }
-    }
-
-    // The commit could not be added. Skip it.
-    if (orphaned_commit) {
-      orphaned_commits++;
-      continue;
-    }
-
-    s = batch->AddCommitStorageBytes(handler, commit->GetId(),
-                                     commit->GetStorageBytes());
-    if (s != Status::OK) {
-      return s;
-    }
-
-    if (source != ChangeSource::CLOUD) {
-      s = batch->MarkCommitIdUnsynced(handler, commit->GetId(),
-                                      commit->GetGeneration());
-      if (s != Status::OK) {
-        return s;
-      }
-    }
-
-    // Update heads_to_add.
-    heads_to_add[commit->GetId()] = commit->GetTimestamp();
-
-    added_commits.insert(&commit->GetId());
-    commits_to_send.push_back(std::move(commit));
-  }
-
-  if (orphaned_commits > 0) {
-    if (source != ChangeSource::P2P) {
-      ledger::ReportEvent(
-          ledger::CobaltEvent::COMMITS_RECEIVED_OUT_OF_ORDER_NOT_RECOVERED);
-      FXL_LOG(ERROR)
-          << "Failed adding commits. Found " << orphaned_commits
-          << " orphaned commits (one of their parent was not found).";
-    }
-    return Status::NOT_FOUND;
-  }
-
-  // Update heads in Db.
-  for (const auto& head_timestamp : heads_to_add) {
-    Status s =
-        batch->AddHead(handler, head_timestamp.first, head_timestamp.second);
-    if (s != Status::OK) {
-      return s;
-    }
-  }
-
-  // If adding local commits, mark all new pieces as local.
-  Status s = MarkAllPiecesLocal(handler, batch.get(), std::move(new_objects));
-  if (s != Status::OK) {
-    return s;
-  }
-
-  s = batch->Execute(handler);
-
-  NotifyWatchersOfNewCommits(commits_to_send, source);
-
-  return s;
-}
-
-Status PageStorageImpl::SynchronousAddPiece(
-    CoroutineHandler* handler, ObjectIdentifier object_identifier,
-    ChangeSource source, IsObjectSynced is_object_synced,
-    std::unique_ptr<DataSource::DataChunk> data) {
-  FXL_DCHECK(
-      !GetObjectDigestInfo(object_identifier.object_digest()).is_inlined());
-  FXL_DCHECK(
-      object_identifier.object_digest() ==
-      ComputeObjectDigest(
-          GetObjectDigestInfo(object_identifier.object_digest()).piece_type,
-          GetObjectDigestInfo(object_identifier.object_digest()).object_type,
-          data->Get()));
-
-  std::unique_ptr<const Object> object;
-  Status status = db_->ReadObject(handler, object_identifier, &object);
-  if (status == Status::NOT_FOUND) {
-    PageDbObjectStatus object_status;
-    switch (is_object_synced) {
-      case IsObjectSynced::NO:
-        object_status =
-            (source == ChangeSource::LOCAL ? PageDbObjectStatus::TRANSIENT
-                                           : PageDbObjectStatus::LOCAL);
-        break;
-      case IsObjectSynced::YES:
-        object_status = PageDbObjectStatus::SYNCED;
-        break;
-    }
-    return db_->WriteObject(handler, object_identifier, std::move(data),
-                            object_status);
-  }
-  return status;
-}
-
-Status PageStorageImpl::SynchronousMarkPageOnline(
-    coroutine::CoroutineHandler* handler, PageDb::Batch* batch) {
-  if (page_is_online_) {
-    return Status::OK;
-  }
-  Status status = batch->MarkPageOnline(handler);
-  if (status == Status::OK) {
-    page_is_online_ = true;
-  }
-  return status;
-}
-
-FXL_WARN_UNUSED_RESULT Status
-PageStorageImpl::SynchronousGetEmptyNodeIdentifier(
-    coroutine::CoroutineHandler* handler, ObjectIdentifier** empty_node_id) {
-  if (!empty_node_id_) {
-    // Get the empty node identifier and cache it.
-    Status status;
-    ObjectIdentifier object_identifier;
-    if (coroutine::SyncCall(
-            handler,
-            [this](fit::function<void(Status, ObjectIdentifier)> callback) {
-              btree::TreeNode::Empty(this, std::move(callback));
-            },
-            &status,
-            &object_identifier) == coroutine::ContinuationStatus::INTERRUPTED) {
-      return Status::INTERRUPTED;
-    }
-    if (status != Status::OK) {
-      return status;
-    }
-    empty_node_id_ =
-        std::make_unique<ObjectIdentifier>(std::move(object_identifier));
-  }
-  *empty_node_id = empty_node_id_.get();
-  return Status::OK;
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/page_storage_impl.h b/bin/ledger/storage/impl/page_storage_impl.h
deleted file mode 100644
index 1210757..0000000
--- a/bin/ledger/storage/impl/page_storage_impl.h
+++ /dev/null
@@ -1,277 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_STORAGE_IMPL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_STORAGE_IMPL_H_
-
-#include <vector>
-
-#include <lib/async/dispatcher.h>
-#include <lib/callback/managed_container.h>
-#include <lib/callback/operation_serializer.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/sized_vmo.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/coroutine/coroutine_manager.h"
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/environment/environment.h"
-#include "peridot/bin/ledger/storage/impl/page_db_impl.h"
-#include "peridot/bin/ledger/storage/public/db.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/page_sync_delegate.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace storage {
-
-class PageStorageImpl : public PageStorage {
- public:
-  PageStorageImpl(ledger::Environment* environment,
-                  encryption::EncryptionService* encryption_service,
-                  std::unique_ptr<Db> db, PageId page_id);
-  PageStorageImpl(ledger::Environment* environment,
-                  encryption::EncryptionService* encryption_service,
-                  std::unique_ptr<PageDb> page_db, PageId page_id);
-
-  ~PageStorageImpl() override;
-
-  // Initializes this PageStorageImpl. This includes initializing the underlying
-  // database, adding the default page head if the page is empty, removing
-  // uncommitted explicit and committing implicit journals.
-  void Init(fit::function<void(Status)> callback);
-
-  // Adds the given locally created |commit| in this |PageStorage|.
-  void AddCommitFromLocal(std::unique_ptr<const Commit> commit,
-                          std::vector<ObjectIdentifier> new_objects,
-                          fit::function<void(Status)> callback);
-
-  // Checks whether the given |object_identifier| is untracked, i.e. has been
-  // created using |AddObjectFromLocal()|, but is not yet part of any commit.
-  // Untracked objects are invalid after the PageStorageImpl object is
-  // destroyed.
-  void ObjectIsUntracked(ObjectIdentifier object_identifier,
-                         fit::function<void(Status, bool)> callback);
-
-  // PageStorage:
-  PageId GetId() override;
-  void SetSyncDelegate(PageSyncDelegate* page_sync) override;
-  void GetHeadCommitIds(
-      fit::function<void(Status, std::vector<CommitId>)> callback) override;
-  void GetCommit(CommitIdView commit_id,
-                 fit::function<void(Status, std::unique_ptr<const Commit>)>
-                     callback) override;
-  void AddCommitsFromSync(
-      std::vector<CommitIdAndBytes> ids_and_bytes, ChangeSource source,
-      fit::function<void(Status, std::vector<CommitId>)> callback) override;
-  void StartCommit(
-      const CommitId& commit_id, JournalType journal_type,
-      fit::function<void(Status, std::unique_ptr<Journal>)> callback) override;
-  void StartMergeCommit(
-      const CommitId& left, const CommitId& right,
-      fit::function<void(Status, std::unique_ptr<Journal>)> callback) override;
-  void CommitJournal(std::unique_ptr<Journal> journal,
-                     fit::function<void(Status, std::unique_ptr<const Commit>)>
-                         callback) override;
-  void RollbackJournal(std::unique_ptr<Journal> journal,
-                       fit::function<void(Status)> callback) override;
-  Status AddCommitWatcher(CommitWatcher* watcher) override;
-  Status RemoveCommitWatcher(CommitWatcher* watcher) override;
-  void IsSynced(fit::function<void(Status, bool)> callback) override;
-  bool IsOnline() override;
-  void IsEmpty(fit::function<void(Status, bool)> callback) override;
-  void GetUnsyncedCommits(
-      fit::function<void(Status, std::vector<std::unique_ptr<const Commit>>)>
-          callback) override;
-  void MarkCommitSynced(const CommitId& commit_id,
-                        fit::function<void(Status)> callback) override;
-  void GetUnsyncedPieces(
-      fit::function<void(Status, std::vector<ObjectIdentifier>)> callback)
-      override;
-  void MarkPieceSynced(ObjectIdentifier object_identifier,
-                       fit::function<void(Status)> callback) override;
-  void IsPieceSynced(ObjectIdentifier object_identifier,
-                     fit::function<void(Status, bool)> callback) override;
-  void MarkSyncedToPeer(fit::function<void(Status)> callback) override;
-  void AddObjectFromLocal(
-      ObjectType object_type, std::unique_ptr<DataSource> data_source,
-      fit::function<void(Status, ObjectIdentifier)> callback) override;
-  void GetObjectPart(
-      ObjectIdentifier object_identifier, int64_t offset, int64_t max_size,
-      Location location,
-      fit::function<void(Status, fsl::SizedVmo)> callback) override;
-  void GetObject(ObjectIdentifier object_identifier, Location location,
-                 fit::function<void(Status, std::unique_ptr<const Object>)>
-                     callback) override;
-  void GetPiece(ObjectIdentifier object_identifier,
-                fit::function<void(Status, std::unique_ptr<const Object>)>
-                    callback) override;
-  void SetSyncMetadata(fxl::StringView key, fxl::StringView value,
-                       fit::function<void(Status)> callback) override;
-  void GetSyncMetadata(
-      fxl::StringView key,
-      fit::function<void(Status, std::string)> callback) override;
-
-  // Methods to be used by JournalImpl.
-  void GetJournalEntries(
-      const JournalId& journal_id,
-      fit::function<
-          void(Status, std::unique_ptr<Iterator<const EntryChange>>,
-               JournalContainsClearOperation contains_clear_operation)>
-          callback);
-
-  void AddJournalEntry(const JournalId& journal_id, fxl::StringView key,
-                       ObjectIdentifier object_identifier, KeyPriority priority,
-                       fit::function<void(Status)> callback);
-
-  void RemoveJournalEntry(const JournalId& journal_id,
-                          convert::ExtendedStringView key,
-                          fit::function<void(Status)> callback);
-
-  void EmptyJournalAndMarkContainsClearOperation(
-      const JournalId& journal_id, fit::function<void(Status)> callback);
-
-  void RemoveJournal(const JournalId& journal_id,
-                     fit::function<void(Status)> callback);
-
-  // Commit contents.
-  void GetCommitContents(const Commit& commit, std::string min_key,
-                         fit::function<bool(Entry)> on_next,
-                         fit::function<void(Status)> on_done) override;
-  void GetEntryFromCommit(const Commit& commit, std::string key,
-                          fit::function<void(Status, Entry)> callback) override;
-  void GetCommitContentsDiff(const Commit& base_commit,
-                             const Commit& other_commit, std::string min_key,
-                             fit::function<bool(EntryChange)> on_next_diff,
-                             fit::function<void(Status)> on_done) override;
-  void GetThreeWayContentsDiff(const Commit& base_commit,
-                               const Commit& left_commit,
-                               const Commit& right_commit, std::string min_key,
-                               fit::function<bool(ThreeWayChange)> on_next_diff,
-                               fit::function<void(Status)> on_done) override;
-
- private:
-  friend class PageStorageImplAccessorForTest;
-
-  // Marks all pieces needed for the given objects as local.
-  FXL_WARN_UNUSED_RESULT Status
-  MarkAllPiecesLocal(coroutine::CoroutineHandler* handler, PageDb::Batch* batch,
-                     std::vector<ObjectIdentifier> object_identifiers);
-
-  FXL_WARN_UNUSED_RESULT Status
-  ContainsCommit(coroutine::CoroutineHandler* handler, CommitIdView id);
-
-  bool IsFirstCommit(CommitIdView id);
-
-  // Adds the given synced object. |object_identifier| is expected to match the
-  // given |data|.
-  void AddPiece(ObjectIdentifier object_identifier, ChangeSource source,
-                IsObjectSynced is_object_synced,
-                std::unique_ptr<DataSource::DataChunk> data,
-                fit::function<void(Status)> callback);
-
-  // Download all the chunks of the object with the given id.
-  void DownloadFullObject(ObjectIdentifier object_identifier,
-                          fit::function<void(Status)> callback);
-
-  void GetObjectPartFromSync(
-      ObjectIdentifier object_identifier, size_t offset, size_t size,
-      fit::function<void(Status, fsl::SizedVmo)> callback);
-
-  // Reads the content of an object into a provided VMO. Takes into
-  // account the global offset and size in order to be able to read only the
-  // requested part of an object.
-  // |global_offset| is the offset from the beginning of the full object in
-  // bytes. |global_size| is the maximum size requested to be read into the vmo.
-  // |current_position| is the position of the currently read piece (defined by
-  // |object_identifier|) in the full object. |object_size| is the size of the
-  // currently read piece.
-  void FillBufferWithObjectContent(ObjectIdentifier object_identifier,
-                                   fsl::SizedVmo vmo, int64_t global_offset,
-                                   size_t global_size, int64_t current_position,
-                                   size_t object_size,
-                                   fit::function<void(Status)> callback);
-  void FillBufferWithObjectContent(std::unique_ptr<const Object> object,
-                                   fsl::SizedVmo vmo, int64_t global_offset,
-                                   size_t global_size, int64_t current_position,
-                                   size_t object_size,
-                                   fit::function<void(Status)> callback);
-
-  // Notifies the registered watchers of |new_commits|.
-  void NotifyWatchersOfNewCommits(
-
-      const std::vector<std::unique_ptr<const Commit>>& new_commits,
-      ChangeSource source);
-
-  // Synchronous versions of API methods using coroutines.
-  FXL_WARN_UNUSED_RESULT Status
-  SynchronousInit(coroutine::CoroutineHandler* handler);
-
-  FXL_WARN_UNUSED_RESULT Status
-  SynchronousGetCommit(coroutine::CoroutineHandler* handler, CommitId commit_id,
-                       std::unique_ptr<const Commit>* commit);
-
-  FXL_WARN_UNUSED_RESULT Status
-  SynchronousAddCommitFromLocal(coroutine::CoroutineHandler* handler,
-                                std::unique_ptr<const Commit> commit,
-                                std::vector<ObjectIdentifier> new_objects);
-
-  FXL_WARN_UNUSED_RESULT Status SynchronousAddCommitsFromSync(
-      coroutine::CoroutineHandler* handler,
-      std::vector<CommitIdAndBytes> ids_and_bytes, ChangeSource source,
-      std::vector<CommitId>* missing_ids);
-
-  FXL_WARN_UNUSED_RESULT Status SynchronousGetUnsyncedCommits(
-      coroutine::CoroutineHandler* handler,
-      std::vector<std::unique_ptr<const Commit>>* unsynced_commits);
-
-  FXL_WARN_UNUSED_RESULT Status SynchronousMarkCommitSynced(
-      coroutine::CoroutineHandler* handler, const CommitId& commit_id);
-
-  FXL_WARN_UNUSED_RESULT Status SynchronousMarkCommitSyncedInBatch(
-      coroutine::CoroutineHandler* handler, PageDb::Batch* batch,
-      const CommitId& commit_id);
-
-  FXL_WARN_UNUSED_RESULT Status SynchronousAddCommits(
-      coroutine::CoroutineHandler* handler,
-      std::vector<std::unique_ptr<const Commit>> commits, ChangeSource source,
-      std::vector<ObjectIdentifier> new_objects,
-      std::vector<CommitId>* missing_ids);
-
-  FXL_WARN_UNUSED_RESULT Status SynchronousAddPiece(
-      coroutine::CoroutineHandler* handler, ObjectIdentifier object_identifier,
-      ChangeSource source, IsObjectSynced is_object_synced,
-      std::unique_ptr<DataSource::DataChunk> data);
-
-  // Synchronous helper methods.
-
-  // Marks this page as online.
-  FXL_WARN_UNUSED_RESULT Status SynchronousMarkPageOnline(
-      coroutine::CoroutineHandler* handler, PageDb::Batch* batch);
-
-  // Updates the given |empty_node_id| to point to the empty node's
-  // ObjectIdentifier.
-  FXL_WARN_UNUSED_RESULT Status SynchronousGetEmptyNodeIdentifier(
-      coroutine::CoroutineHandler* handler, ObjectIdentifier** empty_node_id);
-
-  ledger::Environment* environment_;
-  encryption::EncryptionService* const encryption_service_;
-  const PageId page_id_;
-  std::unique_ptr<PageDb> db_;
-  std::vector<CommitWatcher*> watchers_;
-  callback::ManagedContainer managed_container_;
-  PageSyncDelegate* page_sync_;
-  bool page_is_online_ = false;
-  std::unique_ptr<ObjectIdentifier> empty_node_id_ = nullptr;
-
-  callback::OperationSerializer commit_serializer_;
-  coroutine::CoroutineManager coroutine_manager_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageStorageImpl);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_PAGE_STORAGE_IMPL_H_
diff --git a/bin/ledger/storage/impl/page_storage_unittest.cc b/bin/ledger/storage/impl/page_storage_unittest.cc
deleted file mode 100644
index a4384b2..0000000
--- a/bin/ledger/storage/impl/page_storage_unittest.cc
+++ /dev/null
@@ -1,2319 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <dirent.h>
-#include <chrono>
-#include <memory>
-#include <queue>
-#include <set>
-
-#include <lib/async/cpp/task.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/arraysize.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/files/path.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/encryption/primitives/hash.h"
-#include "peridot/bin/ledger/storage/impl/btree/encoding.h"
-#include "peridot/bin/ledger/storage/impl/btree/tree_node.h"
-#include "peridot/bin/ledger/storage/impl/commit_impl.h"
-#include "peridot/bin/ledger/storage/impl/commit_random_impl.h"
-#include "peridot/bin/ledger/storage/impl/constants.h"
-#include "peridot/bin/ledger/storage/impl/journal_impl.h"
-#include "peridot/bin/ledger/storage/impl/leveldb.h"
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-#include "peridot/bin/ledger/storage/impl/page_db_empty_impl.h"
-#include "peridot/bin/ledger/storage/impl/page_storage_impl.h"
-#include "peridot/bin/ledger/storage/impl/split.h"
-#include "peridot/bin/ledger/storage/impl/storage_test_utils.h"
-#include "peridot/bin/ledger/storage/public/commit_watcher.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-using testing::ElementsAre;
-
-namespace storage {
-
-class PageStorageImplAccessorForTest {
- public:
-  static void AddPiece(const std::unique_ptr<PageStorageImpl>& storage,
-                       ObjectIdentifier object_identifier, ChangeSource source,
-                       IsObjectSynced is_object_synced,
-                       std::unique_ptr<DataSource::DataChunk> chunk,
-                       fit::function<void(Status)> callback) {
-    storage->AddPiece(std::move(object_identifier), source, is_object_synced,
-                      std::move(chunk), std::move(callback));
-  }
-
-  static PageDb& GetDb(const std::unique_ptr<PageStorageImpl>& storage) {
-    return *(storage->db_);
-  }
-};
-
-namespace {
-
-using coroutine::CoroutineHandler;
-
-std::vector<PageStorage::CommitIdAndBytes> CommitAndBytesFromCommit(
-    const Commit& commit) {
-  std::vector<PageStorage::CommitIdAndBytes> result;
-  result.emplace_back(commit.GetId(), commit.GetStorageBytes().ToString());
-  return result;
-}
-
-// DataSource that returns an error on the callback to Get().
-class FakeErrorDataSource : public DataSource {
- public:
-  explicit FakeErrorDataSource(async_dispatcher_t* dispatcher)
-      : dispatcher_(dispatcher) {}
-
-  uint64_t GetSize() override { return 1; }
-
-  void Get(fit::function<void(std::unique_ptr<DataChunk>, Status)> callback)
-      override {
-    async::PostTask(dispatcher_, [callback = std::move(callback)] {
-      callback(nullptr, DataSource::Status::ERROR);
-    });
-  }
-
-  async_dispatcher_t* const dispatcher_;
-};
-
-class FakeCommitWatcher : public CommitWatcher {
- public:
-  FakeCommitWatcher() {}
-
-  void OnNewCommits(const std::vector<std::unique_ptr<const Commit>>& commits,
-                    ChangeSource source) override {
-    ++commit_count;
-    last_commit_id = commits.back()->GetId();
-    last_source = source;
-  }
-
-  int commit_count = 0;
-  CommitId last_commit_id;
-  ChangeSource last_source;
-};
-
-class DelayingFakeSyncDelegate : public PageSyncDelegate {
- public:
-  explicit DelayingFakeSyncDelegate(
-      fit::function<void(fit::closure)> on_get_object)
-      : on_get_object_(std::move(on_get_object)) {}
-
-  void AddObject(ObjectIdentifier object_identifier, const std::string& value) {
-    digest_to_value_[std::move(object_identifier)] = value;
-  }
-
-  void GetObject(ObjectIdentifier object_identifier,
-                 fit::function<void(Status, ChangeSource, IsObjectSynced,
-                                    std::unique_ptr<DataSource::DataChunk>)>
-                     callback) override {
-    std::string& value = digest_to_value_[object_identifier];
-    object_requests.insert(std::move(object_identifier));
-    on_get_object_([callback = std::move(callback), value] {
-      callback(Status::OK, ChangeSource::CLOUD, IsObjectSynced::YES,
-               DataSource::DataChunk::Create(value));
-    });
-  }
-
-  std::set<ObjectIdentifier> object_requests;
-
- private:
-  fit::function<void(fit::closure)> on_get_object_;
-  std::map<ObjectIdentifier, std::string> digest_to_value_;
-};
-
-class FakeSyncDelegate : public DelayingFakeSyncDelegate {
- public:
-  FakeSyncDelegate()
-      : DelayingFakeSyncDelegate([](fit::closure callback) { callback(); }) {}
-};
-
-// Implements |Init()|, |CreateJournalId() and |StartBatch()| and fails with a
-// |NOT_IMPLEMENTED| error in all other cases.
-class FakePageDbImpl : public PageDbEmptyImpl {
- public:
-  FakePageDbImpl(rng::Random* random) : random_(random) {}
-
-  Status CreateJournalId(CoroutineHandler* /*handler*/,
-                         JournalType /*journal_type*/, const CommitId& /*base*/,
-                         JournalId* journal_id) override {
-    *journal_id = RandomString(random_, 10);
-    return Status::OK;
-  }
-
-  Status StartBatch(CoroutineHandler* /*handler*/,
-                    std::unique_ptr<PageDb::Batch>* batch) override {
-    *batch = std::make_unique<FakePageDbImpl>(random_);
-    return Status::OK;
-  }
-
- private:
-  rng::Random* const random_;
-};
-
-class PageStorageTest : public ledger::TestWithEnvironment {
- public:
-  PageStorageTest() : encryption_service_(dispatcher()) {}
-
-  ~PageStorageTest() override {}
-
-  // Test:
-  void SetUp() override { ResetStorage(); }
-
-  void ResetStorage() {
-    if (storage_) {
-      storage_->SetSyncDelegate(nullptr);
-      storage_.reset();
-    }
-    tmpfs_ = std::make_unique<scoped_tmpfs::ScopedTmpFS>();
-    PageId id = RandomString(environment_.random(), 10);
-    auto db = std::make_unique<LevelDb>(
-        dispatcher(), ledger::DetachedPath(tmpfs_->root_fd()));
-    ASSERT_EQ(Status::OK, db->Init());
-    storage_ = std::make_unique<PageStorageImpl>(
-        &environment_, &encryption_service_, std::move(db), id);
-
-    bool called;
-    Status status;
-    storage_->Init(
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(id, storage_->GetId());
-  }
-
- protected:
-  PageStorage* GetStorage() { return storage_.get(); }
-
-  std::vector<CommitId> GetHeads() {
-    bool called;
-    Status status;
-    std::vector<CommitId> ids;
-    storage_->GetHeadCommitIds(
-        callback::Capture(callback::SetWhenCalled(&called), &status, &ids));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    return ids;
-  }
-
-  std::unique_ptr<const Commit> GetFirstHead() {
-    std::vector<CommitId> ids = GetHeads();
-    EXPECT_FALSE(ids.empty());
-    return GetCommit(ids[0]);
-  }
-
-  std::unique_ptr<const Commit> GetCommit(const CommitId& id) {
-    bool called;
-    Status status;
-    std::unique_ptr<const Commit> commit;
-    storage_->GetCommit(id, callback::Capture(callback::SetWhenCalled(&called),
-                                              &status, &commit));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    return commit;
-  }
-
-  ::testing::AssertionResult PutInJournal(Journal* journal,
-                                          const std::string& key,
-                                          ObjectIdentifier object_identifier,
-                                          KeyPriority priority) {
-    bool called;
-    Status status;
-    journal->Put(key, std::move(object_identifier), priority,
-                 callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-
-    if (!called) {
-      return ::testing::AssertionFailure()
-             << "Journal::Put for key " << key << " didn't return.";
-    }
-    if (status != Status::OK) {
-      return ::testing::AssertionFailure() << "Journal::Put for key " << key
-                                           << " returned status: " << status;
-    }
-    return ::testing::AssertionSuccess();
-  }
-
-  ::testing::AssertionResult DeleteFromJournal(Journal* journal,
-                                               const std::string& key) {
-    bool called;
-    Status status;
-    journal->Delete(
-        key, callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-
-    if (!called) {
-      return ::testing::AssertionFailure()
-             << "Journal::Delete for key " << key << " didn't return.";
-    }
-    if (status != Status::OK) {
-      return ::testing::AssertionFailure() << "Journal::Delete for key " << key
-                                           << " returned status: " << status;
-    }
-    return ::testing::AssertionSuccess();
-  }
-
-  std::unique_ptr<const Commit> TryCommitFromSync() {
-    ObjectIdentifier root_identifier;
-    EXPECT_TRUE(GetEmptyNodeIdentifier(&root_identifier));
-
-    std::vector<std::unique_ptr<const Commit>> parent;
-    parent.emplace_back(GetFirstHead());
-    std::unique_ptr<const Commit> commit =
-        CommitImpl::FromContentAndParents(environment_.clock(), storage_.get(),
-                                          root_identifier, std::move(parent));
-
-    bool called;
-    Status status;
-    std::vector<CommitId> missing_ids;
-    storage_->AddCommitsFromSync(
-        CommitAndBytesFromCommit(*commit), ChangeSource::CLOUD,
-        callback::Capture(callback::SetWhenCalled(&called), &status,
-                          &missing_ids));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    return commit;
-  }
-
-  // Returns an empty pointer if |CommitJournal| times out.
-  FXL_WARN_UNUSED_RESULT std::unique_ptr<const Commit> TryCommitJournal(
-      std::unique_ptr<Journal> journal, Status expected_status) {
-    bool called;
-    Status status;
-    std::unique_ptr<const Commit> commit;
-    storage_->CommitJournal(
-        std::move(journal),
-        callback::Capture(callback::SetWhenCalled(&called), &status, &commit));
-
-    RunLoopUntilIdle();
-    EXPECT_EQ(expected_status, status);
-    if (!called) {
-      return std::unique_ptr<const Commit>();
-    }
-    return commit;
-  }
-
-  // Returns an empty pointer if |TryCommitJournal| failed.
-  FXL_WARN_UNUSED_RESULT std::unique_ptr<const Commit> TryCommitFromLocal(
-      JournalType type, int keys, size_t min_key_size = 0) {
-    bool called;
-    Status status;
-    std::unique_ptr<Journal> journal;
-    storage_->StartCommit(
-        GetFirstHead()->GetId(), type,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_NE(nullptr, journal);
-
-    for (int i = 0; i < keys; ++i) {
-      auto key = fxl::StringPrintf("key%05d", i);
-      if (key.size() < min_key_size) {
-        key.resize(min_key_size);
-      }
-      EXPECT_TRUE(PutInJournal(journal.get(), key,
-                               RandomObjectIdentifier(environment_.random()),
-                               KeyPriority::EAGER));
-    }
-
-    EXPECT_TRUE(DeleteFromJournal(journal.get(), "key_does_not_exist"));
-
-    std::unique_ptr<const Commit> commit =
-        TryCommitJournal(std::move(journal), Status::OK);
-    if (!commit) {
-      return commit;
-    }
-
-    // Check the contents.
-    std::vector<Entry> entries = GetCommitContents(*commit);
-    EXPECT_EQ(static_cast<size_t>(keys), entries.size());
-    for (int i = 0; i < keys; ++i) {
-      auto key = fxl::StringPrintf("key%05d", i);
-      if (key.size() < min_key_size) {
-        key.resize(min_key_size);
-      }
-      EXPECT_EQ(key, entries[i].key);
-    }
-
-    return commit;
-  }
-
-  void TryAddFromLocal(std::string content,
-                       const ObjectIdentifier& expected_identifier) {
-    bool called;
-    Status status;
-    ObjectIdentifier object_identifier;
-    storage_->AddObjectFromLocal(
-        ObjectType::BLOB, DataSource::Create(std::move(content)),
-        callback::Capture(callback::SetWhenCalled(&called), &status,
-                          &object_identifier));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(expected_identifier, object_identifier);
-  }
-
-  std::unique_ptr<const Object> TryGetObject(
-      const ObjectIdentifier& object_identifier, PageStorage::Location location,
-      Status expected_status = Status::OK) {
-    bool called;
-    Status status;
-    std::unique_ptr<const Object> object;
-    storage_->GetObject(
-        object_identifier, location,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &object));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(expected_status, status);
-    return object;
-  }
-
-  fsl::SizedVmo TryGetObjectPart(const ObjectIdentifier& object_identifier,
-                                 size_t offset, size_t max_size,
-                                 PageStorage::Location location,
-                                 Status expected_status = Status::OK) {
-    bool called;
-    Status status;
-    fsl::SizedVmo vmo;
-    storage_->GetObjectPart(
-        object_identifier, offset, max_size, location,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &vmo));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(expected_status, status);
-    return vmo;
-  }
-
-  std::unique_ptr<const Object> TryGetPiece(
-      const ObjectIdentifier& object_identifier,
-      Status expected_status = Status::OK) {
-    bool called;
-    Status status;
-    std::unique_ptr<const Object> object;
-    storage_->GetPiece(
-        object_identifier,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &object));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(expected_status, status);
-    return object;
-  }
-
-  std::vector<Entry> GetCommitContents(const Commit& commit) {
-    bool called;
-    Status status;
-    std::vector<Entry> result;
-    auto on_next = [&result](Entry e) {
-      result.push_back(e);
-      return true;
-    };
-    storage_->GetCommitContents(
-        commit, "", std::move(on_next),
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    return result;
-  }
-
-  std::vector<std::unique_ptr<const Commit>> GetUnsyncedCommits() {
-    bool called;
-    Status status;
-    std::vector<std::unique_ptr<const Commit>> commits;
-    storage_->GetUnsyncedCommits(
-        callback::Capture(callback::SetWhenCalled(&called), &status, &commits));
-    RunLoopUntilIdle();
-    EXPECT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    return commits;
-  }
-
-  Status WriteObject(
-      CoroutineHandler* handler, ObjectData* data,
-      PageDbObjectStatus object_status = PageDbObjectStatus::TRANSIENT) {
-    return PageStorageImplAccessorForTest::GetDb(storage_).WriteObject(
-        handler, data->object_identifier, data->ToChunk(), object_status);
-  }
-
-  Status ReadObject(CoroutineHandler* handler,
-                    ObjectIdentifier object_identifier,
-                    std::unique_ptr<const Object>* object) {
-    return PageStorageImplAccessorForTest::GetDb(storage_).ReadObject(
-        handler, object_identifier, object);
-  }
-
-  ::testing::AssertionResult ObjectIsUntracked(
-      ObjectIdentifier object_identifier, bool expected_untracked) {
-    bool called;
-    Status status;
-    bool is_untracked;
-    storage_->ObjectIsUntracked(
-        object_identifier, callback::Capture(callback::SetWhenCalled(&called),
-                                             &status, &is_untracked));
-    RunLoopUntilIdle();
-
-    if (!called) {
-      return ::testing::AssertionFailure()
-             << "ObjectIsUntracked for id " << object_identifier
-             << " didn't return.";
-    }
-    if (status != Status::OK) {
-      return ::testing::AssertionFailure()
-             << "ObjectIsUntracked for id " << object_identifier
-             << " returned status " << status;
-    }
-    if (is_untracked != expected_untracked) {
-      return ::testing::AssertionFailure()
-             << "For id " << object_identifier
-             << " expected to find the object " << (is_untracked ? "un" : "")
-             << "tracked, but was " << (expected_untracked ? "un" : "")
-             << "tracked, instead.";
-    }
-    return ::testing::AssertionSuccess();
-  }
-
-  ::testing::AssertionResult IsPieceSynced(ObjectIdentifier object_identifier,
-                                           bool expected_synced) {
-    bool called;
-    Status status;
-    bool is_synced;
-    storage_->IsPieceSynced(object_identifier,
-                            callback::Capture(callback::SetWhenCalled(&called),
-                                              &status, &is_synced));
-    RunLoopUntilIdle();
-
-    if (!called) {
-      return ::testing::AssertionFailure()
-             << "IsPieceSynced for id " << object_identifier
-             << " didn't return.";
-    }
-    if (status != Status::OK) {
-      return ::testing::AssertionFailure()
-             << "IsPieceSynced for id " << object_identifier
-             << " returned status " << status;
-    }
-    if (is_synced != expected_synced) {
-      return ::testing::AssertionFailure()
-             << "For id " << object_identifier
-             << " expected to find the object " << (is_synced ? "un" : "")
-             << "synced, but was " << (expected_synced ? "un" : "")
-             << "synced, instead.";
-    }
-    return ::testing::AssertionSuccess();
-  }
-
-  ::testing::AssertionResult CreateNodeFromIdentifier(
-      ObjectIdentifier identifier,
-      std::unique_ptr<const btree::TreeNode>* node) {
-    bool called;
-    Status status;
-    std::unique_ptr<const btree::TreeNode> result;
-    btree::TreeNode::FromIdentifier(
-        GetStorage(), std::move(identifier),
-        callback::Capture(callback::SetWhenCalled(&called), &status, &result));
-    RunLoopUntilIdle();
-
-    if (!called) {
-      return ::testing::AssertionFailure()
-             << "TreeNode::FromIdentifier callback was not executed.";
-    }
-    if (status != Status::OK) {
-      return ::testing::AssertionFailure()
-             << "TreeNode::FromIdentifier failed with status " << status;
-    }
-    node->swap(result);
-    return ::testing::AssertionSuccess();
-  }
-
-  ::testing::AssertionResult CreateNodeFromEntries(
-      const std::vector<Entry>& entries,
-      const std::map<size_t, ObjectIdentifier>& children,
-      std::unique_ptr<const btree::TreeNode>* node) {
-    bool called;
-    Status status;
-    ObjectIdentifier identifier;
-    btree::TreeNode::FromEntries(
-        GetStorage(), 0u, entries, children,
-        callback::Capture(callback::SetWhenCalled(&called), &status,
-                          &identifier));
-    RunLoopUntilIdle();
-    if (!called) {
-      return ::testing::AssertionFailure()
-             << "TreeNode::FromEntries callback was not executed.";
-    }
-    if (status != Status::OK) {
-      return ::testing::AssertionFailure()
-             << "TreeNode::FromEntries failed with status " << status;
-    }
-    return CreateNodeFromIdentifier(identifier, node);
-  }
-
-  ::testing::AssertionResult GetEmptyNodeIdentifier(
-      ObjectIdentifier* empty_node_identifier) {
-    bool called;
-    Status status;
-    btree::TreeNode::Empty(GetStorage(),
-                           callback::Capture(callback::SetWhenCalled(&called),
-                                             &status, empty_node_identifier));
-    RunLoopUntilIdle();
-    if (!called) {
-      return ::testing::AssertionFailure()
-             << "TreeNode::Empty callback was not executed.";
-    }
-    if (status != Status::OK) {
-      return ::testing::AssertionFailure()
-             << "TreeNode::Empty failed with status " << status;
-    }
-    return ::testing::AssertionSuccess();
-  }
-
-  std::unique_ptr<scoped_tmpfs::ScopedTmpFS> tmpfs_;
-  encryption::FakeEncryptionService encryption_service_;
-  std::unique_ptr<PageStorageImpl> storage_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageStorageTest);
-};
-
-TEST_F(PageStorageTest, AddGetLocalCommits) {
-  // Search for a commit id that doesn't exist and see the error.
-  bool called;
-  Status status;
-  std::unique_ptr<const Commit> lookup_commit;
-  storage_->GetCommit(RandomCommitId(environment_.random()),
-                      callback::Capture(callback::SetWhenCalled(&called),
-                                        &status, &lookup_commit));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::NOT_FOUND, status);
-  EXPECT_FALSE(lookup_commit);
-
-  std::vector<std::unique_ptr<const Commit>> parent;
-  parent.emplace_back(GetFirstHead());
-  std::unique_ptr<const Commit> commit = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(),
-      RandomObjectIdentifier(environment_.random()), std::move(parent));
-  CommitId id = commit->GetId();
-  std::string storage_bytes = commit->GetStorageBytes().ToString();
-
-  // Search for a commit that exist and check the content.
-  storage_->AddCommitFromLocal(
-      std::move(commit), {},
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  std::unique_ptr<const Commit> found = GetCommit(id);
-  EXPECT_EQ(storage_bytes, found->GetStorageBytes());
-}
-
-TEST_F(PageStorageTest, AddCommitFromLocalDoNotMarkUnsynedAlreadySyncedCommit) {
-  std::vector<std::unique_ptr<const Commit>> parent;
-  parent.emplace_back(GetFirstHead());
-  std::unique_ptr<const Commit> commit = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(),
-      RandomObjectIdentifier(environment_.random()), std::move(parent));
-  CommitId id = commit->GetId();
-  std::string storage_bytes = commit->GetStorageBytes().ToString();
-
-  bool called;
-  Status status;
-  storage_->AddCommitFromLocal(
-      commit->Clone(), {},
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  auto commits = GetUnsyncedCommits();
-  EXPECT_EQ(1u, commits.size());
-  EXPECT_EQ(id, commits[0]->GetId());
-
-  storage_->MarkCommitSynced(
-      id, callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  // Add the commit again.
-  storage_->AddCommitFromLocal(
-      commit->Clone(), {},
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  // Check that the commit is not marked unsynced.
-  commits = GetUnsyncedCommits();
-  EXPECT_EQ(0u, commits.size());
-}
-
-TEST_F(PageStorageTest, AddCommitBeforeParentsError) {
-  // Try to add a commit before its parent and see the error.
-  std::vector<std::unique_ptr<const Commit>> parent;
-  parent.emplace_back(
-      std::make_unique<CommitRandomImpl>(environment_.random()));
-  std::unique_ptr<const Commit> commit = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(),
-      RandomObjectIdentifier(environment_.random()), std::move(parent));
-
-  bool called;
-  Status status;
-  storage_->AddCommitFromLocal(
-      std::move(commit), {},
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::NOT_FOUND, status);
-}
-
-TEST_F(PageStorageTest, AddCommitsOutOfOrderError) {
-  std::unique_ptr<const btree::TreeNode> node;
-  ASSERT_TRUE(CreateNodeFromEntries({}, {}, &node));
-  ObjectIdentifier root_identifier = node->GetIdentifier();
-
-  std::vector<std::unique_ptr<const Commit>> parent;
-  parent.emplace_back(GetFirstHead());
-  auto commit1 = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(), root_identifier, std::move(parent));
-  parent.clear();
-  parent.push_back(commit1->Clone());
-  auto commit2 = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(), root_identifier, std::move(parent));
-
-  std::vector<PageStorage::CommitIdAndBytes> commits_and_bytes;
-  commits_and_bytes.emplace_back(commit2->GetId(),
-                                 commit2->GetStorageBytes().ToString());
-  commits_and_bytes.emplace_back(commit1->GetId(),
-                                 commit1->GetStorageBytes().ToString());
-
-  bool called;
-  Status status;
-  std::vector<CommitId> missing_ids;
-  storage_->AddCommitsFromSync(
-      std::move(commits_and_bytes), ChangeSource::CLOUD,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &missing_ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::NOT_FOUND, status);
-}
-
-TEST_F(PageStorageTest, AddGetSyncedCommits) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    FakeSyncDelegate sync;
-    storage_->SetSyncDelegate(&sync);
-
-    // Create a node with 2 values.
-    ObjectData lazy_value("Some data", InlineBehavior::PREVENT);
-    ObjectData eager_value("More data", InlineBehavior::PREVENT);
-    std::vector<Entry> entries = {
-        Entry{"key0", lazy_value.object_identifier, KeyPriority::LAZY},
-        Entry{"key1", eager_value.object_identifier, KeyPriority::EAGER},
-    };
-    std::unique_ptr<const btree::TreeNode> node;
-    ASSERT_TRUE(CreateNodeFromEntries(entries, {}, &node));
-    ObjectIdentifier root_identifier = node->GetIdentifier();
-
-    // Add the three objects to FakeSyncDelegate.
-    sync.AddObject(lazy_value.object_identifier, lazy_value.value);
-    sync.AddObject(eager_value.object_identifier, eager_value.value);
-
-    {
-      // Ensure root_object is not kept, as the storage it depends on will be
-      // deleted.
-      std::unique_ptr<const Object> root_object =
-          TryGetObject(root_identifier, PageStorage::Location::NETWORK);
-
-      fxl::StringView root_data;
-      ASSERT_EQ(Status::OK, root_object->GetData(&root_data));
-      sync.AddObject(root_identifier, root_data.ToString());
-    }
-
-    // Reset and clear the storage.
-    ResetStorage();
-    storage_->SetSyncDelegate(&sync);
-
-    std::vector<std::unique_ptr<const Commit>> parent;
-    parent.emplace_back(GetFirstHead());
-    std::unique_ptr<const Commit> commit =
-        CommitImpl::FromContentAndParents(environment_.clock(), storage_.get(),
-                                          root_identifier, std::move(parent));
-    CommitId id = commit->GetId();
-
-    // Adding the commit should only request the tree node and the eager value.
-    sync.object_requests.clear();
-    bool called;
-    Status status;
-    std::vector<CommitId> missing_ids;
-    storage_->AddCommitsFromSync(
-        CommitAndBytesFromCommit(*commit), ChangeSource::CLOUD,
-        callback::Capture(callback::SetWhenCalled(&called), &status,
-                          &missing_ids));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(2u, sync.object_requests.size());
-    EXPECT_TRUE(sync.object_requests.find(root_identifier) !=
-                sync.object_requests.end());
-    EXPECT_TRUE(sync.object_requests.find(eager_value.object_identifier) !=
-                sync.object_requests.end());
-
-    // Adding the same commit twice should not request any objects from sync.
-    sync.object_requests.clear();
-    storage_->AddCommitsFromSync(
-        CommitAndBytesFromCommit(*commit), ChangeSource::CLOUD,
-        callback::Capture(callback::SetWhenCalled(&called), &status,
-                          &missing_ids));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_TRUE(sync.object_requests.empty());
-
-    std::unique_ptr<const Commit> found = GetCommit(id);
-    EXPECT_EQ(commit->GetStorageBytes(), found->GetStorageBytes());
-
-    // Check that the commit is not marked as unsynced.
-    std::vector<std::unique_ptr<const Commit>> commits = GetUnsyncedCommits();
-    EXPECT_TRUE(commits.empty());
-  });
-}
-
-// Check that receiving a remote commit that is already present locally but not
-// synced will mark the commit as synced.
-TEST_F(PageStorageTest, MarkRemoteCommitSynced) {
-  FakeSyncDelegate sync;
-  storage_->SetSyncDelegate(&sync);
-
-  std::unique_ptr<const btree::TreeNode> node;
-  ASSERT_TRUE(CreateNodeFromEntries({}, {}, &node));
-  ObjectIdentifier root_identifier = node->GetIdentifier();
-
-  std::unique_ptr<const Object> root_object =
-      TryGetObject(root_identifier, PageStorage::Location::NETWORK);
-
-  fxl::StringView root_data;
-  ASSERT_EQ(Status::OK, root_object->GetData(&root_data));
-  sync.AddObject(root_identifier, root_data.ToString());
-
-  std::vector<std::unique_ptr<const Commit>> parent;
-  parent.emplace_back(GetFirstHead());
-  std::unique_ptr<const Commit> commit = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(), root_identifier, std::move(parent));
-  CommitId id = commit->GetId();
-
-  bool called;
-  Status status;
-  storage_->AddCommitFromLocal(
-      std::move(commit), {},
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  EXPECT_EQ(1u, GetUnsyncedCommits().size());
-  storage_->GetCommit(id, callback::Capture(callback::SetWhenCalled(&called),
-                                            &status, &commit));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  std::vector<PageStorage::CommitIdAndBytes> commits_and_bytes;
-  commits_and_bytes.emplace_back(commit->GetId(),
-                                 commit->GetStorageBytes().ToString());
-  std::vector<CommitId> missing_ids;
-  storage_->AddCommitsFromSync(
-      std::move(commits_and_bytes), ChangeSource::CLOUD,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &missing_ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-
-  EXPECT_EQ(0u, GetUnsyncedCommits().size());
-}
-
-TEST_F(PageStorageTest, SyncCommits) {
-  std::vector<std::unique_ptr<const Commit>> commits = GetUnsyncedCommits();
-
-  // Initially there should be no unsynced commits.
-  EXPECT_TRUE(commits.empty());
-
-  std::vector<std::unique_ptr<const Commit>> parent;
-  parent.emplace_back(GetFirstHead());
-  // After adding a commit it should marked as unsynced.
-  std::unique_ptr<const Commit> commit = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(),
-      RandomObjectIdentifier(environment_.random()), std::move(parent));
-  CommitId id = commit->GetId();
-  std::string storage_bytes = commit->GetStorageBytes().ToString();
-
-  bool called;
-  Status status;
-  storage_->AddCommitFromLocal(
-      std::move(commit), {},
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  commits = GetUnsyncedCommits();
-  EXPECT_EQ(1u, commits.size());
-  EXPECT_EQ(storage_bytes, commits[0]->GetStorageBytes());
-
-  // Mark it as synced.
-  storage_->MarkCommitSynced(
-      id, callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  commits = GetUnsyncedCommits();
-  EXPECT_TRUE(commits.empty());
-}
-
-TEST_F(PageStorageTest, HeadCommits) {
-  // Every page should have one initial head commit.
-  std::vector<CommitId> heads = GetHeads();
-  EXPECT_EQ(1u, heads.size());
-
-  std::vector<std::unique_ptr<const Commit>> parent;
-  parent.emplace_back(GetFirstHead());
-  // Adding a new commit with the previous head as its parent should replace the
-  // old head.
-  std::unique_ptr<const Commit> commit = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(),
-      RandomObjectIdentifier(environment_.random()), std::move(parent));
-  CommitId id = commit->GetId();
-
-  bool called;
-  Status status;
-  storage_->AddCommitFromLocal(
-      std::move(commit), {},
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  heads = GetHeads();
-  ASSERT_EQ(1u, heads.size());
-  EXPECT_EQ(id, heads[0]);
-}
-
-TEST_F(PageStorageTest, CreateJournals) {
-  // Explicit journal.
-  auto left_commit = TryCommitFromLocal(JournalType::EXPLICIT, 5);
-  ASSERT_TRUE(left_commit);
-  auto right_commit = TryCommitFromLocal(JournalType::IMPLICIT, 10);
-  ASSERT_TRUE(right_commit);
-
-  // Journal for merge commit.
-  bool called;
-  Status status;
-  std::unique_ptr<Journal> journal;
-  storage_->StartMergeCommit(
-      left_commit->GetId(), right_commit->GetId(),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_NE(nullptr, journal);
-
-  storage_->RollbackJournal(
-      std::move(journal),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-}
-
-TEST_F(PageStorageTest, CreateJournalHugeNode) {
-  std::unique_ptr<const Commit> commit =
-      TryCommitFromLocal(JournalType::EXPLICIT, 500, 1024);
-  ASSERT_TRUE(commit);
-  std::vector<Entry> entries = GetCommitContents(*commit);
-
-  EXPECT_EQ(500u, entries.size());
-  for (const auto& entry : entries) {
-    EXPECT_EQ(1024u, entry.key.size());
-  }
-
-  // Check that all node's parts are marked as unsynced.
-  bool called;
-  Status status;
-  std::vector<ObjectIdentifier> object_identifiers;
-  storage_->GetUnsyncedPieces(callback::Capture(
-      callback::SetWhenCalled(&called), &status, &object_identifiers));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-
-  bool found_index = false;
-  std::set<ObjectIdentifier> unsynced_identifiers(object_identifiers.begin(),
-                                                  object_identifiers.end());
-  for (const auto& identifier : unsynced_identifiers) {
-    EXPECT_FALSE(GetObjectDigestInfo(identifier.object_digest()).is_inlined());
-
-    if (GetObjectDigestInfo(identifier.object_digest()).piece_type ==
-        PieceType::INDEX) {
-      found_index = true;
-      std::set<ObjectIdentifier> sub_identifiers;
-      IterationStatus iteration_status = IterationStatus::ERROR;
-      CollectPieces(
-          identifier,
-          [this](ObjectIdentifier identifier,
-                 fit::function<void(Status, fxl::StringView)> callback) {
-            storage_->GetPiece(
-                std::move(identifier),
-                [callback = std::move(callback)](
-                    Status status, std::unique_ptr<const Object> object) {
-                  if (status != Status::OK) {
-                    callback(status, "");
-                    return;
-                  }
-                  fxl::StringView data;
-                  status = object->GetData(&data);
-                  callback(status, data);
-                });
-          },
-          [&iteration_status, &sub_identifiers](IterationStatus status,
-                                                ObjectIdentifier identifier) {
-            iteration_status = status;
-            if (status == IterationStatus::IN_PROGRESS) {
-              EXPECT_TRUE(sub_identifiers.insert(identifier).second);
-            }
-            return true;
-          });
-      RunLoopUntilIdle();
-      EXPECT_EQ(IterationStatus::DONE, iteration_status);
-      for (const auto& identifier : sub_identifiers) {
-        EXPECT_EQ(1u, unsynced_identifiers.count(identifier));
-      }
-    }
-  }
-  EXPECT_TRUE(found_index);
-}
-
-TEST_F(PageStorageTest, JournalCommitFailsAfterFailedOperation) {
-  // Using FakePageDbImpl will cause all PageDb operations that have to do
-  // with journal entry update, to fail with a NOT_IMPLEMENTED error.
-  auto test_storage = std::make_unique<PageStorageImpl>(
-      &environment_, &encryption_service_,
-      std::make_unique<FakePageDbImpl>(environment_.random()),
-      RandomString(environment_.random(), 10));
-
-  bool called;
-  Status status;
-  std::unique_ptr<Journal> journal;
-  // Explicit journals.
-  // The first call will fail because FakePageDbImpl::AddJournalEntry()
-  // returns an error. After a failed call all other Put/Delete/Commit
-  // operations should fail with ILLEGAL_STATE.
-  test_storage->StartCommit(
-      RandomCommitId(environment_.random()), JournalType::EXPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  ObjectIdentifier random_identifier =
-      RandomObjectIdentifier(environment_.random());
-
-  journal->Put("key", random_identifier, KeyPriority::EAGER,
-               callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_NE(Status::OK, status);
-
-  journal->Put("key", random_identifier, KeyPriority::EAGER,
-               callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::ILLEGAL_STATE, status);
-
-  journal->Delete("key",
-                  callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::ILLEGAL_STATE, status);
-
-  journal->Clear(callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::ILLEGAL_STATE, status);
-
-  ASSERT_FALSE(TryCommitJournal(std::move(journal), Status::ILLEGAL_STATE));
-
-  // Implicit journals.
-  // All calls will fail because of FakePageDbImpl implementation, not because
-  // of an ILLEGAL_STATE error.
-  test_storage->StartCommit(
-      RandomCommitId(environment_.random()), JournalType::IMPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  journal->Put("key", random_identifier, KeyPriority::EAGER,
-               callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_NE(Status::OK, status);
-
-  journal->Put("key", random_identifier, KeyPriority::EAGER,
-               callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_NE(Status::ILLEGAL_STATE, status);
-
-  journal->Delete("key",
-                  callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_NE(Status::ILLEGAL_STATE, status);
-
-  journal->Clear(callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_NE(Status::ILLEGAL_STATE, status);
-
-  std::unique_ptr<const Commit> commit;
-  test_storage->CommitJournal(
-      std::move(journal),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &commit));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_NE(Status::ILLEGAL_STATE, status);
-}
-
-TEST_F(PageStorageTest, DestroyUncommittedJournal) {
-  // It is not an error if a journal is not committed or rolled back.
-  bool called;
-  Status status;
-  std::unique_ptr<Journal> journal;
-  storage_->StartCommit(
-      GetFirstHead()->GetId(), JournalType::EXPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_NE(nullptr, journal);
-  EXPECT_TRUE(PutInJournal(journal.get(), "key",
-                           RandomObjectIdentifier(environment_.random()),
-                           KeyPriority::EAGER));
-}
-
-TEST_F(PageStorageTest, AddObjectFromLocal) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    ObjectData data("Some data", InlineBehavior::PREVENT);
-
-    bool called;
-    Status status;
-    ObjectIdentifier object_identifier;
-    storage_->AddObjectFromLocal(
-        ObjectType::BLOB, data.ToDataSource(),
-        callback::Capture(callback::SetWhenCalled(&called), &status,
-                          &object_identifier));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(data.object_identifier, object_identifier);
-
-    std::unique_ptr<const Object> object;
-    ASSERT_EQ(Status::OK, ReadObject(handler, object_identifier, &object));
-    fxl::StringView content;
-    ASSERT_EQ(Status::OK, object->GetData(&content));
-    EXPECT_EQ(data.value, content);
-    EXPECT_TRUE(ObjectIsUntracked(object_identifier, true));
-    EXPECT_TRUE(IsPieceSynced(object_identifier, false));
-  });
-}
-
-TEST_F(PageStorageTest, AddSmallObjectFromLocal) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    ObjectData data("Some data");
-
-    bool called;
-    Status status;
-    ObjectIdentifier object_identifier;
-    storage_->AddObjectFromLocal(
-        ObjectType::BLOB, data.ToDataSource(),
-        callback::Capture(callback::SetWhenCalled(&called), &status,
-                          &object_identifier));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(data.object_identifier, object_identifier);
-    EXPECT_EQ(data.value,
-              ExtractObjectDigestData(object_identifier.object_digest()));
-
-    std::unique_ptr<const Object> object;
-    EXPECT_EQ(Status::NOT_FOUND,
-              ReadObject(handler, object_identifier, &object));
-    // Inline objects do not need to ever be tracked.
-    EXPECT_TRUE(ObjectIsUntracked(object_identifier, false));
-  });
-}
-
-TEST_F(PageStorageTest, InterruptAddObjectFromLocal) {
-  ObjectData data("Some data");
-
-  storage_->AddObjectFromLocal(
-      ObjectType::BLOB, data.ToDataSource(),
-      [](Status returned_status, ObjectIdentifier object_identifier) {});
-
-  // Checking that we do not crash when deleting the storage while an AddObject
-  // call is in progress.
-  storage_.reset();
-}
-
-TEST_F(PageStorageTest, AddObjectFromLocalError) {
-  auto data_source = std::make_unique<FakeErrorDataSource>(dispatcher());
-  bool called;
-  Status status;
-  ObjectIdentifier object_identifier;
-  storage_->AddObjectFromLocal(
-      ObjectType::BLOB, std::move(data_source),
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &object_identifier));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::IO_ERROR, status);
-}
-
-TEST_F(PageStorageTest, AddLocalPiece) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    ObjectData data("Some data", InlineBehavior::PREVENT);
-
-    bool called;
-    Status status;
-    PageStorageImplAccessorForTest::AddPiece(
-        storage_, data.object_identifier, ChangeSource::LOCAL,
-        IsObjectSynced::NO, data.ToChunk(),
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-
-    std::unique_ptr<const Object> object;
-    ASSERT_EQ(Status::OK, ReadObject(handler, data.object_identifier, &object));
-    fxl::StringView content;
-    ASSERT_EQ(Status::OK, object->GetData(&content));
-    EXPECT_EQ(data.value, content);
-    EXPECT_TRUE(ObjectIsUntracked(data.object_identifier, true));
-    EXPECT_TRUE(IsPieceSynced(data.object_identifier, false));
-  });
-}
-
-TEST_F(PageStorageTest, AddSyncPiece) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    ObjectData data("Some data", InlineBehavior::PREVENT);
-
-    bool called;
-    Status status;
-    PageStorageImplAccessorForTest::AddPiece(
-        storage_, data.object_identifier, ChangeSource::CLOUD,
-        IsObjectSynced::YES, data.ToChunk(),
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-
-    std::unique_ptr<const Object> object;
-    ASSERT_EQ(Status::OK, ReadObject(handler, data.object_identifier, &object));
-    fxl::StringView content;
-    ASSERT_EQ(Status::OK, object->GetData(&content));
-    EXPECT_EQ(data.value, content);
-    EXPECT_TRUE(ObjectIsUntracked(data.object_identifier, false));
-    EXPECT_TRUE(IsPieceSynced(data.object_identifier, true));
-  });
-}
-
-TEST_F(PageStorageTest, AddP2PPiece) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    ObjectData data("Some data", InlineBehavior::PREVENT);
-
-    bool called;
-    Status status;
-    PageStorageImplAccessorForTest::AddPiece(
-        storage_, data.object_identifier, ChangeSource::P2P, IsObjectSynced::NO,
-        data.ToChunk(),
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-
-    std::unique_ptr<const Object> object;
-    ASSERT_EQ(Status::OK, ReadObject(handler, data.object_identifier, &object));
-    fxl::StringView content;
-    ASSERT_EQ(Status::OK, object->GetData(&content));
-    EXPECT_EQ(data.value, content);
-    EXPECT_TRUE(ObjectIsUntracked(data.object_identifier, false));
-    EXPECT_TRUE(IsPieceSynced(data.object_identifier, false));
-  });
-}
-
-TEST_F(PageStorageTest, GetObject) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    ObjectData data("Some data");
-    ASSERT_EQ(Status::OK, WriteObject(handler, &data));
-
-    std::unique_ptr<const Object> object =
-        TryGetObject(data.object_identifier, PageStorage::Location::LOCAL);
-    EXPECT_EQ(data.object_identifier, object->GetIdentifier());
-    fxl::StringView object_data;
-    ASSERT_EQ(Status::OK, object->GetData(&object_data));
-    EXPECT_EQ(data.value, convert::ToString(object_data));
-  });
-}
-
-TEST_F(PageStorageTest, GetObjectPart) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    ObjectData data("_Some data_");
-    ASSERT_EQ(Status::OK, WriteObject(handler, &data));
-
-    fsl::SizedVmo object_part = TryGetObjectPart(
-        data.object_identifier, 1, data.size - 2, PageStorage::Location::LOCAL);
-    std::string object_part_data;
-    ASSERT_TRUE(fsl::StringFromVmo(object_part, &object_part_data));
-    EXPECT_EQ(data.value.substr(1, data.size - 2),
-              convert::ToString(object_part_data));
-  });
-}
-
-TEST_F(PageStorageTest, GetObjectPartLargeOffset) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    ObjectData data("_Some data_");
-    ASSERT_EQ(Status::OK, WriteObject(handler, &data));
-
-    fsl::SizedVmo object_part =
-        TryGetObjectPart(data.object_identifier, data.size * 2, data.size,
-                         PageStorage::Location::LOCAL);
-    std::string object_part_data;
-    ASSERT_TRUE(fsl::StringFromVmo(object_part, &object_part_data));
-    EXPECT_EQ("", convert::ToString(object_part_data));
-  });
-}
-
-TEST_F(PageStorageTest, GetObjectPartLargeMaxSize) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    ObjectData data("_Some data_");
-    ASSERT_EQ(Status::OK, WriteObject(handler, &data));
-
-    fsl::SizedVmo object_part = TryGetObjectPart(
-        data.object_identifier, 0, data.size * 2, PageStorage::Location::LOCAL);
-    std::string object_part_data;
-    ASSERT_TRUE(fsl::StringFromVmo(object_part, &object_part_data));
-    EXPECT_EQ(data.value, convert::ToString(object_part_data));
-  });
-}
-
-TEST_F(PageStorageTest, GetObjectPartNegativeArgs) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    ObjectData data("_Some data_");
-    ASSERT_EQ(Status::OK, WriteObject(handler, &data));
-
-    fsl::SizedVmo object_part =
-        TryGetObjectPart(data.object_identifier, -data.size + 1, -1,
-                         PageStorage::Location::LOCAL);
-    std::string object_part_data;
-    ASSERT_TRUE(fsl::StringFromVmo(object_part, &object_part_data));
-    EXPECT_EQ(data.value.substr(1, data.size - 1),
-              convert::ToString(object_part_data));
-  });
-}
-
-TEST_F(PageStorageTest, GetLargeObjectPart) {
-  std::string data_str = RandomString(environment_.random(), 65536);
-  size_t offset = 6144;
-  size_t size = 49152;
-
-  ObjectData data(std::move(data_str), ObjectType::TREE_NODE,
-                  InlineBehavior::PREVENT);
-
-  ASSERT_EQ(
-      PieceType::INDEX,
-      GetObjectDigestInfo(data.object_identifier.object_digest()).piece_type);
-
-  bool called;
-  Status status;
-  ObjectIdentifier object_identifier;
-  storage_->AddObjectFromLocal(
-      ObjectType::TREE_NODE, data.ToDataSource(),
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &object_identifier));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(data.object_identifier, object_identifier);
-
-  fsl::SizedVmo object_part = TryGetObjectPart(object_identifier, offset, size,
-                                               PageStorage::Location::LOCAL);
-  std::string object_part_data;
-  ASSERT_TRUE(fsl::StringFromVmo(object_part, &object_part_data));
-  std::string result_str = convert::ToString(object_part_data);
-  EXPECT_EQ(size, result_str.size());
-  EXPECT_EQ(data.value.substr(offset, size), result_str);
-}
-
-TEST_F(PageStorageTest, GetObjectPartFromSync) {
-  ObjectData data("_Some data_", InlineBehavior::PREVENT);
-  FakeSyncDelegate sync;
-  sync.AddObject(data.object_identifier, data.value);
-  storage_->SetSyncDelegate(&sync);
-
-  fsl::SizedVmo object_part = TryGetObjectPart(
-      data.object_identifier, 1, data.size - 2, PageStorage::Location::NETWORK);
-  std::string object_part_data;
-  ASSERT_TRUE(fsl::StringFromVmo(object_part, &object_part_data));
-  EXPECT_EQ(data.value.substr(1, data.size - 2),
-            convert::ToString(object_part_data));
-
-  storage_->SetSyncDelegate(nullptr);
-  ObjectData other_data("_Some other data_", InlineBehavior::PREVENT);
-  TryGetObjectPart(other_data.object_identifier, 1, other_data.size - 2,
-                   PageStorage::Location::LOCAL, Status::NOT_FOUND);
-  TryGetObjectPart(other_data.object_identifier, 1, other_data.size - 2,
-                   PageStorage::Location::NETWORK, Status::NOT_CONNECTED_ERROR);
-}
-
-TEST_F(PageStorageTest, GetObjectFromSync) {
-  ObjectData data("Some data", InlineBehavior::PREVENT);
-  FakeSyncDelegate sync;
-  sync.AddObject(data.object_identifier, data.value);
-  storage_->SetSyncDelegate(&sync);
-
-  std::unique_ptr<const Object> object =
-      TryGetObject(data.object_identifier, PageStorage::Location::NETWORK);
-  EXPECT_EQ(data.object_identifier, object->GetIdentifier());
-  fxl::StringView object_data;
-  ASSERT_EQ(Status::OK, object->GetData(&object_data));
-  EXPECT_EQ(data.value, convert::ToString(object_data));
-
-  storage_->SetSyncDelegate(nullptr);
-  ObjectData other_data("Some other data", InlineBehavior::PREVENT);
-  TryGetObject(other_data.object_identifier, PageStorage::Location::LOCAL,
-               Status::NOT_FOUND);
-  TryGetObject(other_data.object_identifier, PageStorage::Location::NETWORK,
-               Status::NOT_CONNECTED_ERROR);
-}
-
-TEST_F(PageStorageTest, GetObjectFromSyncWrongId) {
-  ObjectData data("Some data", InlineBehavior::PREVENT);
-  ObjectData data2("Some data2", InlineBehavior::PREVENT);
-  FakeSyncDelegate sync;
-  sync.AddObject(data.object_identifier, data2.value);
-  storage_->SetSyncDelegate(&sync);
-
-  TryGetObject(data.object_identifier, PageStorage::Location::NETWORK,
-               Status::OBJECT_DIGEST_MISMATCH);
-}
-
-TEST_F(PageStorageTest, AddAndGetHugeTreenodeFromLocal) {
-  std::string data_str = RandomString(environment_.random(), 65536);
-
-  ObjectData data(std::move(data_str), ObjectType::TREE_NODE,
-                  InlineBehavior::PREVENT);
-  ASSERT_EQ(
-      ObjectType::TREE_NODE,
-      GetObjectDigestInfo(data.object_identifier.object_digest()).object_type);
-  ASSERT_EQ(
-      PieceType::INDEX,
-      GetObjectDigestInfo(data.object_identifier.object_digest()).piece_type);
-  ASSERT_EQ(
-      InlinedPiece::NO,
-      GetObjectDigestInfo(data.object_identifier.object_digest()).inlined);
-
-  bool called;
-  Status status;
-  ObjectIdentifier object_identifier;
-  storage_->AddObjectFromLocal(
-      ObjectType::TREE_NODE, data.ToDataSource(),
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &object_identifier));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(data.object_identifier, object_identifier);
-
-  std::unique_ptr<const Object> object =
-      TryGetObject(object_identifier, PageStorage::Location::LOCAL);
-  fxl::StringView content;
-  ASSERT_EQ(Status::OK, object->GetData(&content));
-  EXPECT_EQ(data.value, content);
-  EXPECT_TRUE(ObjectIsUntracked(object_identifier, true));
-  EXPECT_TRUE(IsPieceSynced(object_identifier, false));
-
-  // Check that the object is encoded with an index, and is different than the
-  // piece obtained at |object_identifier|.
-  std::unique_ptr<const Object> piece = TryGetPiece(object_identifier);
-  fxl::StringView piece_content;
-  ASSERT_EQ(Status::OK, piece->GetData(&piece_content));
-  EXPECT_NE(content, piece_content);
-}
-
-TEST_F(PageStorageTest, UnsyncedPieces) {
-  ObjectData data_array[] = {
-      ObjectData("Some data", InlineBehavior::PREVENT),
-      ObjectData("Some more data", InlineBehavior::PREVENT),
-      ObjectData("Even more data", InlineBehavior::PREVENT),
-  };
-  constexpr size_t size = arraysize(data_array);
-  for (auto& data : data_array) {
-    TryAddFromLocal(data.value, data.object_identifier);
-    EXPECT_TRUE(ObjectIsUntracked(data.object_identifier, true));
-    EXPECT_TRUE(IsPieceSynced(data.object_identifier, false));
-  }
-
-  std::vector<CommitId> commits;
-
-  // Add one key-value pair per commit.
-  for (size_t i = 0; i < size; ++i) {
-    bool called;
-    Status status;
-    std::unique_ptr<Journal> journal;
-    storage_->StartCommit(
-        GetFirstHead()->GetId(), JournalType::IMPLICIT,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-
-    EXPECT_TRUE(PutInJournal(journal.get(), fxl::StringPrintf("key%lu", i),
-                             data_array[i].object_identifier,
-                             KeyPriority::LAZY));
-    EXPECT_TRUE(TryCommitJournal(std::move(journal), Status::OK));
-    commits.push_back(GetFirstHead()->GetId());
-  }
-
-  // GetUnsyncedPieces should return the ids of all objects: 3 values and
-  // the 3 root nodes of the 3 commits.
-  bool called;
-  Status status;
-  std::vector<ObjectIdentifier> object_identifiers;
-  storage_->GetUnsyncedPieces(callback::Capture(
-      callback::SetWhenCalled(&called), &status, &object_identifiers));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(6u, object_identifiers.size());
-  for (size_t i = 0; i < size; ++i) {
-    std::unique_ptr<const Commit> commit = GetCommit(commits[i]);
-    EXPECT_TRUE(std::find_if(object_identifiers.begin(),
-                             object_identifiers.end(),
-                             [&](const auto& identifier) {
-                               return identifier == commit->GetRootIdentifier();
-                             }) != object_identifiers.end());
-  }
-  for (auto& data : data_array) {
-    EXPECT_TRUE(std::find(object_identifiers.begin(), object_identifiers.end(),
-                          data.object_identifier) != object_identifiers.end());
-  }
-
-  // Mark the 2nd object as synced. We now expect to still find the 2 unsynced
-  // values and the (also unsynced) root node.
-  storage_->MarkPieceSynced(
-      data_array[1].object_identifier,
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  std::vector<ObjectIdentifier> objects;
-  storage_->GetUnsyncedPieces(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &objects));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(5u, objects.size());
-  std::unique_ptr<const Commit> commit = GetCommit(commits[2]);
-  EXPECT_TRUE(std::find(objects.begin(), objects.end(),
-                        commit->GetRootIdentifier()) != objects.end());
-  EXPECT_TRUE(std::find(objects.begin(), objects.end(),
-                        data_array[0].object_identifier) != objects.end());
-  EXPECT_TRUE(std::find(objects.begin(), objects.end(),
-                        data_array[2].object_identifier) != objects.end());
-}
-
-TEST_F(PageStorageTest, PageIsSynced) {
-  ObjectData data_array[] = {
-      ObjectData("Some data", InlineBehavior::PREVENT),
-      ObjectData("Some more data", InlineBehavior::PREVENT),
-      ObjectData("Even more data", InlineBehavior::PREVENT),
-  };
-  constexpr size_t size = arraysize(data_array);
-  for (auto& data : data_array) {
-    TryAddFromLocal(data.value, data.object_identifier);
-    EXPECT_TRUE(ObjectIsUntracked(data.object_identifier, true));
-    EXPECT_TRUE(IsPieceSynced(data.object_identifier, false));
-  }
-
-  // The objects have not been added in a commit: there is nothing to sync and
-  // the page is considered synced.
-  bool called;
-  Status status;
-  bool is_synced;
-  storage_->IsSynced(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &is_synced));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(true, is_synced);
-
-  // Add all objects in one commit.
-  called = false;
-  std::unique_ptr<Journal> journal;
-  storage_->StartCommit(
-      GetFirstHead()->GetId(), JournalType::IMPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  for (size_t i = 0; i < size; ++i) {
-    EXPECT_TRUE(PutInJournal(journal.get(), fxl::StringPrintf("key%lu", i),
-                             data_array[i].object_identifier,
-                             KeyPriority::LAZY));
-  }
-  EXPECT_TRUE(TryCommitJournal(std::move(journal), Status::OK));
-  CommitId commit_id = GetFirstHead()->GetId();
-
-  // After commiting, the page is unsynced.
-  called = false;
-  storage_->IsSynced(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &is_synced));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(is_synced);
-  // Mark objects (and the root tree node) as synced and expect that the page is
-  // still unsynced.
-  for (const auto& data : data_array) {
-    called = false;
-    storage_->MarkPieceSynced(
-        data.object_identifier,
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-  }
-
-  called = false;
-  storage_->MarkPieceSynced(
-      GetFirstHead()->GetRootIdentifier(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  called = false;
-  storage_->IsSynced(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &is_synced));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(is_synced);
-
-  // Mark the commit as synced and expect that the page is synced.
-  called = false;
-  storage_->MarkCommitSynced(
-      commit_id, callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  called = false;
-  storage_->IsSynced(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &is_synced));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(is_synced);
-
-  // All objects should be synced now.
-  for (auto& data : data_array) {
-    EXPECT_TRUE(IsPieceSynced(data.object_identifier, true));
-  }
-}
-
-TEST_F(PageStorageTest, PageIsMarkedOnlineAfterCloudSync) {
-  // Check that the page is initially not marked as online.
-  EXPECT_FALSE(storage_->IsOnline());
-
-  // Create a local commit: the page is still not online.
-  int size = 10;
-  std::unique_ptr<const Commit> commit =
-      TryCommitFromLocal(JournalType::EXPLICIT, size);
-  EXPECT_FALSE(storage_->IsOnline());
-
-  // Mark all objects as synced. The page is still not online: other devices
-  // will only see these objects if the corresponding commit is also synced to
-  // the cloud.
-  bool called;
-  Status status;
-  std::vector<ObjectIdentifier> object_identifiers;
-  storage_->GetUnsyncedPieces(callback::Capture(
-      callback::SetWhenCalled(&called), &status, &object_identifiers));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  for (ObjectIdentifier& object_identifier : object_identifiers) {
-    storage_->MarkPieceSynced(
-        object_identifier,
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-  }
-  EXPECT_FALSE(storage_->IsOnline());
-
-  // Mark the commit as synced. The page should now be marked as online.
-  storage_->MarkCommitSynced(
-      commit->GetId(),
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(storage_->IsOnline());
-}
-
-TEST_F(PageStorageTest, PageIsMarkedOnlineSyncWithPeer) {
-  // Check that the page is initially not marked as online.
-  EXPECT_FALSE(storage_->IsOnline());
-
-  // Mark the page as synced to peer and expect that it is marked as online.
-  bool called;
-  Status status;
-  storage_->MarkSyncedToPeer(
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(storage_->IsOnline());
-}
-
-TEST_F(PageStorageTest, PageIsEmpty) {
-  ObjectData value("Some value", InlineBehavior::PREVENT);
-  bool called;
-  Status status;
-  bool is_empty;
-
-  // Initially the page is empty.
-  storage_->IsEmpty(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &is_empty));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(is_empty);
-
-  // Add an entry and expect that the page is not empty any more.
-  std::unique_ptr<Journal> journal;
-  storage_->StartCommit(
-      GetFirstHead()->GetId(), JournalType::IMPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(PutInJournal(journal.get(), "key", value.object_identifier,
-                           KeyPriority::LAZY));
-  EXPECT_TRUE(TryCommitJournal(std::move(journal), Status::OK));
-
-  storage_->IsEmpty(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &is_empty));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_FALSE(is_empty);
-
-  // Clear the page and expect it to be empty again.
-  storage_->StartCommit(
-      GetFirstHead()->GetId(), JournalType::IMPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(DeleteFromJournal(journal.get(), "key"));
-  EXPECT_TRUE(TryCommitJournal(std::move(journal), Status::OK));
-
-  storage_->IsEmpty(
-      callback::Capture(callback::SetWhenCalled(&called), &status, &is_empty));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(is_empty);
-}
-
-TEST_F(PageStorageTest, UntrackedObjectsSimple) {
-  ObjectData data("Some data", InlineBehavior::PREVENT);
-
-  // The object is not yet created and its id should not be marked as untracked.
-  EXPECT_TRUE(ObjectIsUntracked(data.object_identifier, false));
-
-  // After creating the object it should be marked as untracked.
-  TryAddFromLocal(data.value, data.object_identifier);
-  EXPECT_TRUE(ObjectIsUntracked(data.object_identifier, true));
-
-  // After adding the object in a commit it should not be untracked any more.
-  bool called;
-  Status status;
-  std::unique_ptr<Journal> journal;
-  storage_->StartCommit(
-      GetFirstHead()->GetId(), JournalType::IMPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(PutInJournal(journal.get(), "key", data.object_identifier,
-                           KeyPriority::EAGER));
-  EXPECT_TRUE(ObjectIsUntracked(data.object_identifier, true));
-  ASSERT_TRUE(TryCommitJournal(std::move(journal), Status::OK));
-  EXPECT_TRUE(ObjectIsUntracked(data.object_identifier, false));
-}
-
-TEST_F(PageStorageTest, UntrackedObjectsComplex) {
-  ObjectData data_array[] = {
-      ObjectData("Some data", InlineBehavior::PREVENT),
-      ObjectData("Some more data", InlineBehavior::PREVENT),
-      ObjectData("Even more data", InlineBehavior::PREVENT),
-  };
-  for (auto& data : data_array) {
-    TryAddFromLocal(data.value, data.object_identifier);
-    EXPECT_TRUE(ObjectIsUntracked(data.object_identifier, true));
-  }
-
-  // Add a first commit containing data_array[0].
-  bool called;
-  Status status;
-  std::unique_ptr<Journal> journal;
-  storage_->StartCommit(
-      GetFirstHead()->GetId(), JournalType::IMPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(PutInJournal(journal.get(), "key0",
-                           data_array[0].object_identifier, KeyPriority::LAZY));
-  EXPECT_TRUE(ObjectIsUntracked(data_array[0].object_identifier, true));
-  ASSERT_TRUE(TryCommitJournal(std::move(journal), Status::OK));
-  EXPECT_TRUE(ObjectIsUntracked(data_array[0].object_identifier, false));
-  EXPECT_TRUE(ObjectIsUntracked(data_array[1].object_identifier, true));
-  EXPECT_TRUE(ObjectIsUntracked(data_array[2].object_identifier, true));
-
-  // Create a second commit. After calling Put for "key1" for the second time
-  // data_array[1] is no longer part of this commit: it should remain
-  // untracked after committing.
-  journal.reset();
-  storage_->StartCommit(
-      GetFirstHead()->GetId(), JournalType::IMPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(PutInJournal(journal.get(), "key1",
-                           data_array[1].object_identifier, KeyPriority::LAZY));
-  EXPECT_TRUE(PutInJournal(journal.get(), "key2",
-                           data_array[2].object_identifier, KeyPriority::LAZY));
-  EXPECT_TRUE(PutInJournal(journal.get(), "key1",
-                           data_array[2].object_identifier, KeyPriority::LAZY));
-  EXPECT_TRUE(PutInJournal(journal.get(), "key3",
-                           data_array[0].object_identifier, KeyPriority::LAZY));
-  ASSERT_TRUE(TryCommitJournal(std::move(journal), Status::OK));
-  EXPECT_TRUE(ObjectIsUntracked(data_array[0].object_identifier, false));
-  EXPECT_TRUE(ObjectIsUntracked(data_array[1].object_identifier, true));
-  EXPECT_TRUE(ObjectIsUntracked(data_array[2].object_identifier, false));
-}
-
-TEST_F(PageStorageTest, CommitWatchers) {
-  FakeCommitWatcher watcher;
-  storage_->AddCommitWatcher(&watcher);
-
-  // Add a watcher and receive the commit.
-  auto expected = TryCommitFromLocal(JournalType::EXPLICIT, 10);
-  ASSERT_TRUE(expected);
-  EXPECT_EQ(1, watcher.commit_count);
-  EXPECT_EQ(expected->GetId(), watcher.last_commit_id);
-  EXPECT_EQ(ChangeSource::LOCAL, watcher.last_source);
-
-  // Add a second watcher.
-  FakeCommitWatcher watcher2;
-  storage_->AddCommitWatcher(&watcher2);
-  expected = TryCommitFromLocal(JournalType::IMPLICIT, 10);
-  ASSERT_TRUE(expected);
-  EXPECT_EQ(2, watcher.commit_count);
-  EXPECT_EQ(expected->GetId(), watcher.last_commit_id);
-  EXPECT_EQ(ChangeSource::LOCAL, watcher.last_source);
-  EXPECT_EQ(1, watcher2.commit_count);
-  EXPECT_EQ(expected->GetId(), watcher2.last_commit_id);
-  EXPECT_EQ(ChangeSource::LOCAL, watcher2.last_source);
-
-  // Remove one watcher.
-  storage_->RemoveCommitWatcher(&watcher2);
-  expected = TryCommitFromSync();
-  EXPECT_EQ(3, watcher.commit_count);
-  EXPECT_EQ(expected->GetId(), watcher.last_commit_id);
-  EXPECT_EQ(ChangeSource::CLOUD, watcher.last_source);
-  EXPECT_EQ(1, watcher2.commit_count);
-}
-
-TEST_F(PageStorageTest, SyncMetadata) {
-  std::vector<std::pair<fxl::StringView, fxl::StringView>> keys_and_values = {
-      {"foo1", "foo2"}, {"bar1", " bar2 "}};
-  for (const auto& key_and_value : keys_and_values) {
-    auto key = key_and_value.first;
-    auto value = key_and_value.second;
-    bool called;
-    Status status;
-    std::string returned_value;
-    storage_->GetSyncMetadata(
-        key, callback::Capture(callback::SetWhenCalled(&called), &status,
-                               &returned_value));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::NOT_FOUND, status);
-
-    storage_->SetSyncMetadata(
-        key, value,
-        callback::Capture(callback::SetWhenCalled(&called), &status));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-
-    storage_->GetSyncMetadata(
-        key, callback::Capture(callback::SetWhenCalled(&called), &status,
-                               &returned_value));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-    EXPECT_EQ(value, returned_value);
-  }
-}
-
-TEST_F(PageStorageTest, AddMultipleCommitsFromSync) {
-  RunInCoroutine([this](CoroutineHandler* handler) {
-    FakeSyncDelegate sync;
-    storage_->SetSyncDelegate(&sync);
-
-    // Build the commit Tree with:
-    //         0
-    //         |
-    //         1  2
-    std::vector<ObjectIdentifier> object_identifiers;
-    object_identifiers.resize(3);
-    for (size_t i = 0; i < object_identifiers.size(); ++i) {
-      ObjectData value("value" + std::to_string(i), InlineBehavior::PREVENT);
-      std::vector<Entry> entries = {Entry{"key" + std::to_string(i),
-                                          value.object_identifier,
-                                          KeyPriority::EAGER}};
-      std::unique_ptr<const btree::TreeNode> node;
-      ASSERT_TRUE(CreateNodeFromEntries(entries, {}, &node));
-      object_identifiers[i] = node->GetIdentifier();
-      sync.AddObject(value.object_identifier, value.value);
-      std::unique_ptr<const Object> root_object =
-          TryGetObject(object_identifiers[i], PageStorage::Location::NETWORK);
-      fxl::StringView root_data;
-      ASSERT_EQ(Status::OK, root_object->GetData(&root_data));
-      sync.AddObject(object_identifiers[i], root_data.ToString());
-    }
-
-    // Reset and clear the storage.
-    ResetStorage();
-    storage_->SetSyncDelegate(&sync);
-
-    std::vector<std::unique_ptr<const Commit>> parent;
-    parent.emplace_back(GetFirstHead());
-    std::unique_ptr<const Commit> commit0 = CommitImpl::FromContentAndParents(
-        environment_.clock(), storage_.get(), object_identifiers[0],
-        std::move(parent));
-    parent.clear();
-
-    parent.emplace_back(GetFirstHead());
-    std::unique_ptr<const Commit> commit1 = CommitImpl::FromContentAndParents(
-        environment_.clock(), storage_.get(), object_identifiers[1],
-        std::move(parent));
-    parent.clear();
-
-    parent.emplace_back(commit1->Clone());
-    std::unique_ptr<const Commit> commit2 = CommitImpl::FromContentAndParents(
-        environment_.clock(), storage_.get(), object_identifiers[2],
-        std::move(parent));
-
-    std::vector<PageStorage::CommitIdAndBytes> commits_and_bytes;
-    commits_and_bytes.emplace_back(commit0->GetId(),
-                                   commit0->GetStorageBytes().ToString());
-    commits_and_bytes.emplace_back(commit1->GetId(),
-                                   commit1->GetStorageBytes().ToString());
-    commits_and_bytes.emplace_back(commit2->GetId(),
-                                   commit2->GetStorageBytes().ToString());
-
-    bool called;
-    Status status;
-    std::vector<CommitId> missing_ids;
-    storage_->AddCommitsFromSync(
-        std::move(commits_and_bytes), ChangeSource::CLOUD,
-        callback::Capture(callback::SetWhenCalled(&called), &status,
-                          &missing_ids));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    EXPECT_EQ(Status::OK, status);
-
-    EXPECT_EQ(4u, sync.object_requests.size());
-    EXPECT_NE(sync.object_requests.find(object_identifiers[0]),
-              sync.object_requests.end());
-    EXPECT_EQ(sync.object_requests.find(object_identifiers[1]),
-              sync.object_requests.end());
-    EXPECT_NE(sync.object_requests.find(object_identifiers[2]),
-              sync.object_requests.end());
-  });
-}
-
-TEST_F(PageStorageTest, Generation) {
-  std::unique_ptr<const Commit> commit1 =
-      TryCommitFromLocal(JournalType::EXPLICIT, 3);
-  ASSERT_TRUE(commit1);
-  EXPECT_EQ(1u, commit1->GetGeneration());
-
-  std::unique_ptr<const Commit> commit2 =
-      TryCommitFromLocal(JournalType::EXPLICIT, 3);
-  ASSERT_TRUE(commit2);
-  EXPECT_EQ(2u, commit2->GetGeneration());
-
-  bool called;
-  Status status;
-  std::unique_ptr<Journal> journal;
-  storage_->StartMergeCommit(
-      commit1->GetId(), commit2->GetId(),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  std::unique_ptr<const Commit> commit3 =
-      TryCommitJournal(std::move(journal), Status::OK);
-  ASSERT_TRUE(commit3);
-  EXPECT_EQ(3u, commit3->GetGeneration());
-}
-
-TEST_F(PageStorageTest, GetEntryFromCommit) {
-  int size = 10;
-  std::unique_ptr<const Commit> commit =
-      TryCommitFromLocal(JournalType::EXPLICIT, size);
-  ASSERT_TRUE(commit);
-
-  bool called;
-  Status status;
-  Entry entry;
-  storage_->GetEntryFromCommit(
-      *commit, "key not found",
-      callback::Capture(callback::SetWhenCalled(&called), &status, &entry));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  ASSERT_EQ(Status::NOT_FOUND, status);
-
-  for (int i = 0; i < size; ++i) {
-    std::string expected_key = fxl::StringPrintf("key%05d", i);
-    storage_->GetEntryFromCommit(
-        *commit, expected_key,
-        callback::Capture(callback::SetWhenCalled(&called), &status, &entry));
-    RunLoopUntilIdle();
-    ASSERT_TRUE(called);
-    ASSERT_EQ(Status::OK, status);
-    EXPECT_EQ(expected_key, entry.key);
-  }
-}
-
-TEST_F(PageStorageTest, WatcherForReEntrantCommits) {
-  std::vector<std::unique_ptr<const Commit>> parent;
-  parent.emplace_back(GetFirstHead());
-
-  std::unique_ptr<const Commit> commit1 = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(),
-      RandomObjectIdentifier(environment_.random()), std::move(parent));
-  CommitId id1 = commit1->GetId();
-
-  parent.clear();
-  parent.emplace_back(commit1->Clone());
-
-  std::unique_ptr<const Commit> commit2 = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(),
-      RandomObjectIdentifier(environment_.random()), std::move(parent));
-  CommitId id2 = commit2->GetId();
-
-  FakeCommitWatcher watcher;
-  storage_->AddCommitWatcher(&watcher);
-
-  bool called;
-  Status status;
-  storage_->AddCommitFromLocal(
-      std::move(commit1), {},
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  storage_->AddCommitFromLocal(
-      std::move(commit2), {},
-      callback::Capture(callback::SetWhenCalled(&called), &status));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  EXPECT_EQ(2, watcher.commit_count);
-  EXPECT_EQ(id2, watcher.last_commit_id);
-}
-
-TEST_F(PageStorageTest, NoOpCommit) {
-  std::vector<CommitId> heads = GetHeads();
-  ASSERT_FALSE(heads.empty());
-
-  bool called;
-  Status status;
-  std::unique_ptr<Journal> journal;
-  storage_->StartCommit(
-      heads[0], JournalType::EXPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  // Create a key, and delete it.
-  EXPECT_TRUE(PutInJournal(journal.get(), "key",
-                           RandomObjectIdentifier(environment_.random()),
-                           KeyPriority::EAGER));
-  EXPECT_TRUE(DeleteFromJournal(journal.get(), "key"));
-
-  // Commit the journal.
-  std::unique_ptr<const Commit> commit;
-  storage_->CommitJournal(
-      std::move(journal),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &commit));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-
-  ASSERT_EQ(Status::OK, status);
-  ASSERT_TRUE(commit);
-  // Expect that the commit id is the same as the original one.
-  EXPECT_EQ(heads[0], commit->GetId());
-}
-
-// Check that receiving a remote commit and commiting locally at the same time
-// do not prevent the commit to be marked as unsynced.
-TEST_F(PageStorageTest, MarkRemoteCommitSyncedRace) {
-  bool sync_delegate_called;
-  fit::closure sync_delegate_call;
-  DelayingFakeSyncDelegate sync(callback::Capture(
-      callback::SetWhenCalled(&sync_delegate_called), &sync_delegate_call));
-  storage_->SetSyncDelegate(&sync);
-
-  // We need to create new nodes for the storage to be asynchronous. The empty
-  // node is already there, so we create two (child, which is empty, and root,
-  // which contains child).
-  std::string child_data = btree::EncodeNode(0u, std::vector<Entry>(), {});
-  ObjectIdentifier child_identifier = encryption_service_.MakeObjectIdentifier(
-      ComputeObjectDigest(PieceType::CHUNK, ObjectType::TREE_NODE, child_data));
-  sync.AddObject(child_identifier, child_data);
-
-  std::string root_data =
-      btree::EncodeNode(0u, std::vector<Entry>(), {{0u, child_identifier}});
-  ObjectIdentifier root_identifier = encryption_service_.MakeObjectIdentifier(
-      ComputeObjectDigest(PieceType::CHUNK, ObjectType::TREE_NODE, root_data));
-  sync.AddObject(root_identifier, root_data);
-
-  std::vector<std::unique_ptr<const Commit>> parent;
-  parent.emplace_back(GetFirstHead());
-
-  std::unique_ptr<const Commit> commit = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(), root_identifier, std::move(parent));
-  CommitId id = commit->GetId();
-
-  // Start adding the remote commit.
-  bool commits_from_sync_called;
-  Status commits_from_sync_status;
-  std::vector<PageStorage::CommitIdAndBytes> commits_and_bytes;
-  commits_and_bytes.emplace_back(commit->GetId(),
-                                 commit->GetStorageBytes().ToString());
-  std::vector<CommitId> missing_ids;
-  storage_->AddCommitsFromSync(
-      std::move(commits_and_bytes), ChangeSource::CLOUD,
-      callback::Capture(callback::SetWhenCalled(&commits_from_sync_called),
-                        &commits_from_sync_status, &missing_ids));
-
-  // Make the loop run until GetObject is called in sync, and before
-  // AddCommitsFromSync finishes.
-  RunLoopUntilIdle();
-  EXPECT_TRUE(sync_delegate_called);
-  EXPECT_FALSE(commits_from_sync_called);
-
-  // Add the local commit.
-  bool commits_from_local_called;
-  Status commits_from_local_status;
-  storage_->AddCommitFromLocal(
-      std::move(commit), {},
-      callback::Capture(callback::SetWhenCalled(&commits_from_local_called),
-                        &commits_from_local_status));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(commits_from_sync_called);
-  // The local commit should be commited.
-  EXPECT_TRUE(commits_from_local_called);
-  ASSERT_TRUE(sync_delegate_call);
-  sync_delegate_call();
-
-  // Let the two AddCommit finish.
-  RunLoopUntilIdle();
-  EXPECT_TRUE(commits_from_sync_called);
-  EXPECT_TRUE(commits_from_local_called);
-  EXPECT_EQ(Status::OK, commits_from_sync_status);
-  EXPECT_EQ(Status::OK, commits_from_local_status);
-
-  // Verify that the commit is added correctly.
-  bool called;
-  Status status;
-  storage_->GetCommit(id, callback::Capture(callback::SetWhenCalled(&called),
-                                            &status, &commit));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  // The commit should be marked as synced.
-  EXPECT_EQ(0u, GetUnsyncedCommits().size());
-}
-
-// Verifies that GetUnsyncedCommits() returns commits ordered by their
-// generation, and not by the timestamp.
-//
-// In this test the commits have the following structure:
-//              (root)
-//             /   |   \
-//           (A)  (B)  (C)
-//             \  /
-//           (merge)
-// C is the last commit to be created. The test verifies that the unsynced
-// commits are returned in the generation order, with the merge commit being the
-// last despite not being the most recent.
-TEST_F(PageStorageTest, GetUnsyncedCommits) {
-  const CommitId root_id = GetFirstHead()->GetId();
-
-  bool called;
-  Status status;
-  std::unique_ptr<Journal> journal_a;
-  storage_->StartCommit(
-      root_id, JournalType::EXPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal_a));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(PutInJournal(journal_a.get(), "a",
-                           RandomObjectIdentifier(environment_.random()),
-                           KeyPriority::EAGER));
-  std::unique_ptr<const Commit> commit_a =
-      TryCommitJournal(std::move(journal_a), Status::OK);
-  ASSERT_TRUE(commit_a);
-  EXPECT_EQ(1u, commit_a->GetGeneration());
-
-  std::unique_ptr<Journal> journal_b;
-  storage_->StartCommit(
-      root_id, JournalType::EXPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal_b));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(PutInJournal(journal_b.get(), "b",
-                           RandomObjectIdentifier(environment_.random()),
-                           KeyPriority::EAGER));
-  std::unique_ptr<const Commit> commit_b =
-      TryCommitJournal(std::move(journal_b), Status::OK);
-  ASSERT_TRUE(commit_b);
-  EXPECT_EQ(1u, commit_b->GetGeneration());
-
-  std::unique_ptr<Journal> journal_merge;
-  storage_->StartMergeCommit(commit_a->GetId(), commit_b->GetId(),
-                             callback::Capture(callback::SetWhenCalled(&called),
-                                               &status, &journal_merge));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-
-  std::unique_ptr<const Commit> commit_merge =
-      TryCommitJournal(std::move(journal_merge), Status::OK);
-  ASSERT_TRUE(commit_merge);
-  EXPECT_EQ(2u, commit_merge->GetGeneration());
-
-  std::unique_ptr<Journal> journal_c;
-  storage_->StartCommit(
-      root_id, JournalType::EXPLICIT,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &journal_c));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_TRUE(PutInJournal(journal_c.get(), "c",
-                           RandomObjectIdentifier(environment_.random()),
-                           KeyPriority::EAGER));
-  std::unique_ptr<const Commit> commit_c =
-      TryCommitJournal(std::move(journal_c), Status::OK);
-  ASSERT_TRUE(commit_c);
-  EXPECT_EQ(1u, commit_c->GetGeneration());
-
-  // Verify that the merge commit is returned as last, even though commit C is
-  // older.
-  std::vector<std::unique_ptr<const Commit>> unsynced_commits =
-      GetUnsyncedCommits();
-  EXPECT_EQ(4u, unsynced_commits.size());
-  EXPECT_EQ(commit_merge->GetId(), unsynced_commits.back()->GetId());
-  EXPECT_LT(commit_merge->GetTimestamp(), commit_c->GetTimestamp());
-}
-
-// Add a commit for which we don't have its parent. Verify that an error is
-// returned, along with the id of the missing parent.
-TEST_F(PageStorageTest, AddCommitsMissingParent) {
-  std::unique_ptr<const btree::TreeNode> node;
-  ASSERT_TRUE(CreateNodeFromEntries({}, {}, &node));
-  ObjectIdentifier root_identifier = node->GetIdentifier();
-
-  std::vector<std::unique_ptr<const Commit>> parent;
-  parent.emplace_back(GetFirstHead());
-  auto commit_parent = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(), root_identifier, std::move(parent));
-  parent.clear();
-  parent.push_back(commit_parent->Clone());
-  auto commit_child = CommitImpl::FromContentAndParents(
-      environment_.clock(), storage_.get(), root_identifier, std::move(parent));
-
-  std::vector<PageStorage::CommitIdAndBytes> commits_and_bytes;
-  commits_and_bytes.emplace_back(commit_child->GetId(),
-                                 commit_child->GetStorageBytes().ToString());
-
-  bool called;
-  Status status;
-  std::vector<CommitId> missing_ids;
-  storage_->AddCommitsFromSync(
-      std::move(commits_and_bytes), ChangeSource::P2P,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &missing_ids));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::NOT_FOUND, status);
-  EXPECT_THAT(missing_ids, ElementsAre(commit_parent->GetId()));
-}
-
-}  // namespace
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/split.cc b/bin/ledger/storage/impl/split.cc
deleted file mode 100644
index dedcaa9..0000000
--- a/bin/ledger/storage/impl/split.cc
+++ /dev/null
@@ -1,441 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/split.h"
-
-#include <limits>
-#include <sstream>
-
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/storage/impl/constants.h"
-#include "peridot/bin/ledger/storage/impl/file_index.h"
-#include "peridot/bin/ledger/storage/impl/file_index_generated.h"
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-#include "peridot/bin/ledger/storage/impl/object_identifier_encoding.h"
-#include "peridot/bin/ledger/storage/public/data_source.h"
-#include "peridot/third_party/bup/bupsplit.h"
-
-namespace storage {
-
-namespace {
-constexpr size_t kMinChunkSize = 4 * 1024;
-constexpr size_t kMaxChunkSize = std::numeric_limits<uint16_t>::max();
-constexpr size_t kBitsPerLevel = 4;
-// Empiric maximal size for an identifier in an index file. This should be the
-// smallest possible number that allow the Split tests to pass.
-constexpr size_t kMaxIdentifierSize = 77;
-// The max number of identifiers that an index can contain so that the file size
-// is less than |kMaxChunkSize|.
-constexpr size_t kMaxIdentifiersPerIndex = kMaxChunkSize / kMaxIdentifierSize;
-
-using ObjectIdentifierAndSize = FileIndexSerialization::ObjectIdentifierAndSize;
-
-struct ChunkAndSize {
-  std::unique_ptr<DataSource::DataChunk> chunk;
-  uint64_t size;
-};
-
-// Handles the successive callbacks from the DataSource.
-//
-// Algorithm:
-// This class keeps track of a list of identifiers per level. For each level,
-// the list must be aggregated into an index file, or if alone at the highest
-// level when the algorithm ends, sent to the client.
-// The algorithm reads data from the source and feeds it to the rolling hash.
-// For each chunk cut by the rolling hash, the identifier of the chunk is added
-// at level 0. The rolling hash algorithm also returns the number of index files
-// that need to be built. An index file is also built as soon as a level
-// contains |kMaxIdentifiersPerIndex| identifiers.
-// When the algorithm builds the index at level |n| it does the following:
-// For all levels from 0 to |n|:
-//   - Build the index file at the given level. As a special case, if there is
-//     a single object at the given level, just move it to the next level and
-//     continue.
-//   - Send the index file to the client.
-//   - Add the identifier of the index file at the next level.
-class SplitContext {
- public:
-  explicit SplitContext(
-      fit::function<ObjectIdentifier(ObjectDigest)> make_object_identifier,
-      fit::function<void(IterationStatus, ObjectIdentifier,
-                         std::unique_ptr<DataSource::DataChunk>)>
-          callback,
-      ObjectType object_type)
-      : make_object_identifier_(std::move(make_object_identifier)),
-        callback_(std::move(callback)),
-        object_type_(object_type),
-        roll_sum_split_(kMinChunkSize, kMaxChunkSize) {}
-  SplitContext(SplitContext&& other) = default;
-  ~SplitContext() {}
-
-  void AddChunk(std::unique_ptr<DataSource::DataChunk> chunk,
-                DataSource::Status status) {
-    if (status == DataSource::Status::ERROR) {
-      callback_(IterationStatus::ERROR, ObjectIdentifier(), nullptr);
-      return;
-    }
-
-    FXL_DCHECK(chunk || status == DataSource::Status::DONE);
-
-    if (chunk) {
-      ProcessChunk(std::move(chunk));
-    }
-
-    if (status != DataSource::Status::DONE) {
-      return;
-    }
-
-    if (!current_chunks_.empty()) {
-      // The remaining data needs to be sent even if it is not chunked at an
-      // expected cut point.
-      BuildAndSendNextChunk(views_.back().size());
-    }
-
-    // No data remains.
-    FXL_DCHECK(current_chunks_.empty());
-
-    // The final id to send exists.
-    FXL_DCHECK(!current_identifiers_per_level_.back().empty());
-
-    // This traverses the stack of indices, sending each level until a single
-    // top level index is produced.
-    for (size_t i = 0; i < current_identifiers_per_level_.size(); ++i) {
-      if (current_identifiers_per_level_[i].empty()) {
-        continue;
-      }
-
-      // At the top of the stack with a single element, the algorithm is
-      // finished. The top-level object_identifier is the unique element.
-      if (i == current_identifiers_per_level_.size() - 1 &&
-          current_identifiers_per_level_[i].size() == 1) {
-        // This identifier may be recomputed by SendDone, so this is not
-        // necessarily the final value that we are going to send, but we check
-        // that we last called |SendInProgress| on it for consistency.
-        FXL_DCHECK(current_identifiers_per_level_[i][0].identifier ==
-                   latest_identifier_);
-        SendDone();
-        return;
-      }
-
-      BuildIndexAtLevel(i);
-    }
-    FXL_NOTREACHED();
-  }
-
- private:
-  // Returns the object identifier for |data| of the given |type|, and invokes
-  // |callback_| with IN_PROGRESS status. Actually defers sending the object
-  // until the next call of this method, because the last object needs to be
-  // treated differently in |SendDone|.
-  ObjectIdentifier SendInProgress(PieceType type,
-                                  std::unique_ptr<DataSource::DataChunk> data) {
-    if (latest_piece_) {
-      callback_(IterationStatus::IN_PROGRESS, latest_identifier_,
-                std::move(latest_piece_));
-    }
-    auto data_view = data->Get();
-    // object_type for inner (IN_PROGRESS) pieces is always BLOB, regardless of
-    // the overall |object_type_|. It may need to be TREE_NODE if this is the
-    // very last piece (DONE), but we do not know it at this stage. We account
-    // for this by recomputing the object digest in |SendDone|. It does not
-    // matter if we return a wrong identifier here, because it will not be used
-    // at all if we are at the root piece.
-    ObjectDigest object_digest =
-        ComputeObjectDigest(type, ObjectType::BLOB, data_view);
-    auto identifier = make_object_identifier_(object_digest);
-    latest_identifier_ = identifier;
-    latest_piece_ = std::move(data);
-    return identifier;
-  }
-
-  // Recomputes the object identifier for the last object to send: since it is
-  // the root of the piece hierarchy, it needs to have the |tree_node| bit set
-  // if we are splitting a TreeNode. Then sends this object identifier as DONE.
-  void SendDone() {
-    FXL_DCHECK(latest_piece_);
-    auto data_view = latest_piece_->Get();
-    ObjectDigest object_digest = ComputeObjectDigest(
-        GetObjectDigestInfo(latest_identifier_.object_digest()).piece_type,
-        object_type_, data_view);
-    latest_identifier_ = make_object_identifier_(object_digest);
-    callback_(IterationStatus::DONE, latest_identifier_,
-              std::move(latest_piece_));
-  }
-
-  std::vector<ObjectIdentifierAndSize>& GetCurrentIdentifiersAtLevel(
-      size_t level) {
-    if (level >= current_identifiers_per_level_.size()) {
-      FXL_DCHECK(level == current_identifiers_per_level_.size());
-      current_identifiers_per_level_.resize(level + 1);
-    }
-    return current_identifiers_per_level_[level];
-  }
-
-  // Appends the given chunk to the unprocessed data and processes as much data
-  // as possible using the rolling hash to determine where to cut the stream in
-  // pieces.
-  void ProcessChunk(std::unique_ptr<DataSource::DataChunk> chunk) {
-    views_.push_back(chunk->Get());
-    current_chunks_.push_back(std::move(chunk));
-
-    while (!views_.empty()) {
-      size_t bits;
-      size_t split_index = roll_sum_split_.Feed(views_.back(), &bits);
-
-      if (split_index == 0) {
-        return;
-      }
-
-      BuildAndSendNextChunk(split_index);
-
-      size_t level = GetLevel(bits);
-      for (size_t i = 0; i < level; ++i) {
-        FXL_DCHECK(!current_identifiers_per_level_[i].empty());
-        BuildIndexAtLevel(i);
-      }
-    }
-  }
-
-  void BuildAndSendNextChunk(size_t split_index) {
-    auto data = BuildNextChunk(split_index);
-    auto size = data->Get().size();
-    auto identifier = SendInProgress(PieceType::CHUNK, std::move(data));
-    AddIdentifierAtLevel(0, {std::move(identifier), size});
-  }
-
-  void AddIdentifierAtLevel(size_t level, ObjectIdentifierAndSize data) {
-    GetCurrentIdentifiersAtLevel(level).push_back(std::move(data));
-
-    if (current_identifiers_per_level_[level].size() <
-        kMaxIdentifiersPerIndex) {
-      // The level is not full, more identifiers can be added.
-      return;
-    }
-
-    FXL_DCHECK(current_identifiers_per_level_[level].size() ==
-               kMaxIdentifiersPerIndex);
-    // The level contains the max number of identifiers. Creating the index
-    // file.
-
-    AddIdentifierAtLevel(
-        level + 1,
-        BuildAndSendIndex(std::move(current_identifiers_per_level_[level])));
-    current_identifiers_per_level_[level].clear();
-  }
-
-  void BuildIndexAtLevel(size_t level) {
-    auto objects = std::move(current_identifiers_per_level_[level]);
-    current_identifiers_per_level_[level].clear();
-
-    if (objects.size() == 1) {
-      AddIdentifierAtLevel(level + 1, std::move(objects.front()));
-    } else {
-      auto id_and_size = BuildAndSendIndex(std::move(objects));
-      AddIdentifierAtLevel(level + 1, std::move(id_and_size));
-    }
-  }
-
-  ObjectIdentifierAndSize BuildAndSendIndex(
-      std::vector<ObjectIdentifierAndSize> identifiers_and_sizes) {
-    FXL_DCHECK(identifiers_and_sizes.size() > 1);
-    FXL_DCHECK(identifiers_and_sizes.size() <= kMaxIdentifiersPerIndex);
-
-    std::unique_ptr<DataSource::DataChunk> chunk;
-    size_t total_size;
-    FileIndexSerialization::BuildFileIndex(identifiers_and_sizes, &chunk,
-                                           &total_size);
-
-    FXL_DCHECK(chunk->Get().size() <= kMaxChunkSize)
-        << "Expected maximum of: " << kMaxChunkSize
-        << ", but got: " << chunk->Get().size();
-    auto identifier = SendInProgress(PieceType::INDEX, std::move(chunk));
-    return {std::move(identifier), total_size};
-  }
-
-  static size_t GetLevel(size_t bits) {
-    FXL_DCHECK(bits >= bup::kBlobBits);
-    return (bits - bup::kBlobBits) / kBitsPerLevel;
-  }
-
-  std::unique_ptr<DataSource::DataChunk> BuildNextChunk(size_t index) {
-    FXL_DCHECK(current_chunks_.size() == views_.size());
-    FXL_DCHECK(!current_chunks_.empty());
-    FXL_DCHECK(views_.back().size() >= index);
-
-    if (views_.size() == 1 && views_.front().size() == index &&
-        views_.front().size() == current_chunks_.front()->Get().size()) {
-      std::unique_ptr<DataSource::DataChunk> result =
-          std::move(current_chunks_.front());
-      views_.clear();
-      current_chunks_.clear();
-      return result;
-    }
-
-    std::string data;
-    size_t total_size = index;
-
-    for (size_t i = 0; i + 1 < views_.size(); ++i) {
-      total_size += views_[i].size();
-    }
-    data.reserve(total_size);
-    for (size_t i = 0; i + 1 < views_.size(); ++i) {
-      data.append(views_[i].data(), views_[i].size());
-    }
-
-    fxl::StringView last = views_.back();
-    data.append(last.data(), index);
-
-    if (index < last.size()) {
-      views_.clear();
-      if (current_chunks_.size() > 1) {
-        std::swap(current_chunks_.front(), current_chunks_.back());
-        current_chunks_.resize(1);
-      }
-      views_.push_back(last.substr(index));
-    } else {
-      current_chunks_.clear();
-      views_.clear();
-    }
-
-    FXL_DCHECK(current_chunks_.size() == views_.size());
-    return DataSource::DataChunk::Create(std::move(data));
-  }
-
-  fit::function<ObjectIdentifier(ObjectDigest)> make_object_identifier_;
-  fit::function<void(IterationStatus, ObjectIdentifier,
-                     std::unique_ptr<DataSource::DataChunk>)>
-      callback_;
-  // The object encoded by DataSource.
-  const ObjectType object_type_;
-  bup::RollSumSplit roll_sum_split_;
-  // The list of chunks from the initial source that are not yet entirely
-  // consumed.
-  std::vector<std::unique_ptr<DataSource::DataChunk>> current_chunks_;
-  // The list of data that has not yet been consumed. For all indexes, the view
-  // at the given index is a view to the chunk at the same index.
-  std::vector<fxl::StringView> views_;
-  // List of unsent indices per level.
-  std::vector<std::vector<ObjectIdentifierAndSize>>
-      current_identifiers_per_level_;
-  // The most recent piece of data (chunk or index) that is entirely consumed
-  // but not yet sent to |callback_|.
-  std::unique_ptr<DataSource::DataChunk> latest_piece_;
-  // The identifier of |latest_piece_|.
-  ObjectIdentifier latest_identifier_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SplitContext);
-};
-
-class CollectPiecesState
-    : public fxl::RefCountedThreadSafe<CollectPiecesState> {
- public:
-  fit::function<void(ObjectIdentifier,
-                     fit::function<void(Status, fxl::StringView)>)>
-      data_accessor;
-  fit::function<bool(IterationStatus, ObjectIdentifier)> callback;
-  bool running = true;
-};
-
-void CollectPiecesInternal(ObjectIdentifier root,
-                           fxl::RefPtr<CollectPiecesState> state,
-                           fit::closure on_done) {
-  if (!state->callback(IterationStatus::IN_PROGRESS, root)) {
-    on_done();
-    return;
-  }
-
-  if (GetObjectDigestInfo(root.object_digest()).piece_type !=
-      PieceType::INDEX) {
-    on_done();
-    return;
-  }
-
-  state->data_accessor(root, [state, on_done = std::move(on_done)](
-                                 Status status, fxl::StringView data) mutable {
-    if (!state->running) {
-      on_done();
-      return;
-    }
-
-    if (status != Status::OK) {
-      FXL_LOG(WARNING) << "Unable to read object content.";
-      state->running = false;
-      on_done();
-      return;
-    }
-
-    auto waiter = fxl::MakeRefCounted<callback::CompletionWaiter>();
-    status = ForEachPiece(data, [&](ObjectIdentifier identifier) {
-      CollectPiecesInternal(std::move(identifier), state,
-                            waiter->NewCallback());
-      return Status::OK;
-    });
-    if (status != Status::OK) {
-      state->running = false;
-      on_done();
-      return;
-    }
-
-    waiter->Finalize(std::move(on_done));
-  });
-}
-
-}  // namespace
-
-void SplitDataSource(
-    DataSource* source, ObjectType object_type,
-    fit::function<ObjectIdentifier(ObjectDigest)> make_object_identifier,
-    fit::function<void(IterationStatus, ObjectIdentifier,
-                       std::unique_ptr<DataSource::DataChunk>)>
-        callback) {
-  SplitContext context(std::move(make_object_identifier), std::move(callback),
-                       object_type);
-  source->Get([context = std::move(context)](
-                  std::unique_ptr<DataSource::DataChunk> chunk,
-                  DataSource::Status status) mutable {
-    context.AddChunk(std::move(chunk), status);
-  });
-}
-
-Status ForEachPiece(fxl::StringView index_content,
-                    fit::function<Status(ObjectIdentifier)> callback) {
-  const FileIndex* file_index;
-  Status status =
-      FileIndexSerialization::ParseFileIndex(index_content, &file_index);
-  if (status != Status::OK) {
-    return status;
-  }
-
-  for (const auto* child : *file_index->children()) {
-    Status status = callback(ToObjectIdentifier(child->object_identifier()));
-    if (status != Status::OK) {
-      return status;
-    }
-  }
-
-  return Status::OK;
-}
-
-void CollectPieces(
-    ObjectIdentifier root,
-    fit::function<void(ObjectIdentifier,
-                       fit::function<void(Status, fxl::StringView)>)>
-        data_accessor,
-    fit::function<bool(IterationStatus, ObjectIdentifier)> callback) {
-  auto state = fxl::MakeRefCounted<CollectPiecesState>();
-  state->data_accessor = std::move(data_accessor);
-  state->callback = std::move(callback);
-
-  CollectPiecesInternal(root, state, [state] {
-    IterationStatus final_status =
-        state->running ? IterationStatus::DONE : IterationStatus::ERROR;
-    state->callback(final_status, {});
-  });
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/split.h b/bin/ledger/storage/impl/split.h
deleted file mode 100644
index b34f66a..0000000
--- a/bin/ledger/storage/impl/split.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_SPLIT_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_SPLIT_H_
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-#include "peridot/bin/ledger/storage/public/data_source.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-// Status for the |SplitDataSource| and |CollectXXXPieces| callbacks.
-enum class IterationStatus {
-  DONE,
-  IN_PROGRESS,
-  ERROR,
-};
-
-// Splits the data from |source| representing an object of some |type| and
-// builds a multi-level index from the content. The |source| is consumed and
-// split using a rolling hash. Each chunk and each index file is returned. On
-// each iteration, |make_object_identifier| is called first and must return the
-// |ObjectIdentifier| to use to reference the given content id. This identifier
-// is then passed to |callback|, along with the content itself and a status of
-// |IN_PROGRESS|, except for the last chunk which has a status of |DONE|.
-// |callback| is not called anymore once |source| is deleted.
-void SplitDataSource(
-    DataSource* source, ObjectType type,
-    fit::function<ObjectIdentifier(ObjectDigest)> make_object_identifier,
-    fit::function<void(IterationStatus, ObjectIdentifier,
-                       std::unique_ptr<DataSource::DataChunk>)>
-        callback);
-
-// Iterates over the pieces of an index object.
-Status ForEachPiece(fxl::StringView index_content,
-                    fit::function<Status(ObjectIdentifier)> callback);
-
-// Collects all pieces ids needed to build the object with id |root|. This
-// returns the id of the object itself, and recurse inside any index if the
-// |callback| returned true for the given id.
-void CollectPieces(
-    ObjectIdentifier root,
-    fit::function<void(ObjectIdentifier,
-                       fit::function<void(Status, fxl::StringView)>)>
-        data_accessor,
-    fit::function<bool(IterationStatus, ObjectIdentifier)> callback);
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_SPLIT_H_
diff --git a/bin/ledger/storage/impl/split_unittest.cc b/bin/ledger/storage/impl/split_unittest.cc
deleted file mode 100644
index 8b79d6b..0000000
--- a/bin/ledger/storage/impl/split_unittest.cc
+++ /dev/null
@@ -1,366 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/split.h"
-
-#include <string.h>
-
-#include <lib/fit/function.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/encryption/primitives/hash.h"
-#include "peridot/bin/ledger/storage/impl/constants.h"
-#include "peridot/bin/ledger/storage/impl/file_index.h"
-#include "peridot/bin/ledger/storage/impl/file_index_generated.h"
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-#include "peridot/bin/ledger/storage/public/data_source.h"
-
-namespace storage {
-namespace {
-
-constexpr size_t kMinChunkSize = 4 * 1024;
-constexpr size_t kMaxChunkSize = std::numeric_limits<uint16_t>::max();
-
-// DataSource that produces 0.
-class PathologicalDataSource : public DataSource {
- public:
-  explicit PathologicalDataSource(size_t size) : size_(size) {}
-
-  uint64_t GetSize() override { return size_; }
-  void Get(fit::function<void(std::unique_ptr<DataChunk>, Status)> callback)
-      override {
-    size_t remaining = size_;
-    while (remaining) {
-      size_t to_send = std::min<size_t>(remaining, 1024u);
-      remaining -= to_send;
-      callback(DataChunk::Create(std::string(to_send, '\0')),
-               Status::TO_BE_CONTINUED);
-    }
-    callback(nullptr, Status::DONE);
-  }
-
- private:
-  size_t size_;
-};
-
-// DataSource that returns an error.
-class ErrorDataSource : public DataSource {
- public:
-  ErrorDataSource() {}
-
-  uint64_t GetSize() override { return 1; }
-  void Get(fit::function<void(std::unique_ptr<DataChunk>, Status)> callback)
-      override {
-    callback(nullptr, Status::ERROR);
-  }
-};
-
-std::string NewString(size_t size) {
-  std::string content;
-  content.resize(size);
-  size_t i;
-  for (i = 0; i + sizeof(size_t) < content.size(); i += sizeof(size_t)) {
-    memcpy(&content[0] + i, &i, sizeof(i));
-  }
-  memcpy(&content[0] + i, &i, size % sizeof(size_t));
-  return content;
-}
-
-struct Call {
-  IterationStatus status;
-  ObjectDigest digest;
-};
-
-struct SplitResult {
-  std::vector<Call> calls;
-  std::map<ObjectDigest, std::unique_ptr<DataSource::DataChunk>> data;
-};
-
-void DoSplit(DataSource* source, ObjectType object_type,
-             fit::function<void(SplitResult)> callback) {
-  auto result = std::make_unique<SplitResult>();
-  SplitDataSource(
-      source, object_type,
-      [](ObjectDigest digest) {
-        return encryption::MakeDefaultObjectIdentifier(std::move(digest));
-      },
-      [result = std::move(result), callback = std::move(callback)](
-          IterationStatus status, ObjectIdentifier identifier,
-          std::unique_ptr<DataSource::DataChunk> data) mutable {
-        EXPECT_TRUE(result);
-        auto digest = identifier.object_digest();
-        if (status != IterationStatus::ERROR) {
-          EXPECT_LE(data->Get().size(), kMaxChunkSize);
-          if (result->data.count(digest) != 0) {
-            EXPECT_EQ(result->data[digest]->Get(), data->Get());
-          } else {
-            result->data[digest] = std::move(data);
-          }
-        }
-        result->calls.push_back({status, digest});
-        if (status != IterationStatus::IN_PROGRESS) {
-          auto to_send = std::move(*result);
-          result.reset();
-          callback(std::move(to_send));
-        }
-      });
-}
-
-::testing::AssertionResult ReadFile(
-    const ObjectDigest& digest,
-    const std::map<ObjectDigest, std::unique_ptr<DataSource::DataChunk>>& data,
-    std::string* result, size_t expected_size) {
-  size_t start_size = result->size();
-  ObjectDigestInfo digest_info = GetObjectDigestInfo(digest);
-  if (digest_info.is_inlined()) {
-    auto content = ExtractObjectDigestData(digest);
-    result->append(content.data(), content.size());
-  } else if (digest_info.is_chunk()) {
-    if (data.count(digest) == 0) {
-      return ::testing::AssertionFailure() << "Unknown object.";
-    }
-    auto content = data.at(digest)->Get();
-    result->append(content.data(), content.size());
-  } else {
-    FXL_DCHECK(digest_info.piece_type == PieceType::INDEX);
-    if (data.count(digest) == 0) {
-      return ::testing::AssertionFailure() << "Unknown object.";
-    }
-    auto content = data.at(digest)->Get();
-    const FileIndex* file_index = GetFileIndex(content.data());
-    for (const auto* child : *file_index->children()) {
-      auto r =
-          ReadFile(ObjectDigest(child->object_identifier()->object_digest()),
-                   data, result, child->size());
-      if (!r) {
-        return r;
-      }
-    }
-  }
-  if (result->size() - start_size != expected_size) {
-    return ::testing::AssertionFailure()
-           << "Expected an object of size: " << expected_size
-           << " but found an object of size: " << (result->size() - start_size);
-  }
-  return ::testing::AssertionSuccess();
-}
-
-// The first paramater is the size of the value, the second its type.
-using SplitSmallValueTest =
-    ::testing::TestWithParam<std::tuple<size_t, ObjectType>>;
-using SplitBigValueTest =
-    ::testing::TestWithParam<std::tuple<size_t, ObjectType>>;
-
-TEST_P(SplitSmallValueTest, SmallValue) {
-  const std::string content = NewString(std::get<0>(GetParam()));
-  const ObjectType object_type = std::get<1>(GetParam());
-  auto source = DataSource::Create(content);
-  SplitResult split_result;
-  DoSplit(source.get(), object_type,
-          [&split_result](SplitResult c) { split_result = std::move(c); });
-
-  ASSERT_EQ(1u, split_result.calls.size());
-  EXPECT_EQ(IterationStatus::DONE, split_result.calls[0].status);
-  ASSERT_EQ(1u, split_result.data.size());
-  EXPECT_EQ(content, split_result.data.begin()->second->Get());
-  EXPECT_EQ(split_result.calls[0].digest,
-            ComputeObjectDigest(PieceType::CHUNK, object_type, content));
-
-  std::string found_content;
-  ASSERT_TRUE(ReadFile(split_result.calls.back().digest, split_result.data,
-                       &found_content, content.size()));
-  EXPECT_EQ(content, found_content);
-}
-
-TEST_P(SplitBigValueTest, BigValues) {
-  const std::string content = NewString(std::get<0>(GetParam()));
-  const ObjectType object_type = std::get<1>(GetParam());
-  auto source = DataSource::Create(content);
-  SplitResult split_result;
-  DoSplit(source.get(), object_type,
-          [&split_result](SplitResult c) { split_result = std::move(c); });
-
-  EXPECT_EQ(IterationStatus::DONE, split_result.calls.back().status);
-  // There is at least 3 calls:
-  // 1 index
-  // 2 contents (including 1 termination)
-  ASSERT_GE(split_result.calls.size(), 3u);
-
-  fxl::StringView current = content;
-  for (const auto& call : split_result.calls) {
-    if (call.status == IterationStatus::IN_PROGRESS &&
-        GetObjectDigestInfo(call.digest).is_chunk()) {
-      EXPECT_EQ(current.substr(0, split_result.data[call.digest]->Get().size()),
-                split_result.data[call.digest]->Get());
-      // Check that object digest is always computed with object_type BLOB for
-      // inner pieces (and in particular for chunks here). Only the root must
-      // have it set to |object_type|.
-      EXPECT_EQ(call.digest,
-                ComputeObjectDigest(PieceType::CHUNK, ObjectType::BLOB,
-                                    split_result.data[call.digest]->Get()));
-      current = current.substr(split_result.data[call.digest]->Get().size());
-    }
-    if (call.status == IterationStatus::DONE) {
-      EXPECT_EQ(GetObjectDigestInfo(call.digest).piece_type, PieceType::INDEX);
-      EXPECT_EQ(GetObjectDigestInfo(call.digest).object_type, object_type);
-    }
-  }
-
-  EXPECT_EQ(0u, current.size());
-
-  std::string found_content;
-  ASSERT_TRUE(ReadFile(split_result.calls.back().digest, split_result.data,
-                       &found_content, content.size()));
-  EXPECT_EQ(content, found_content);
-}
-
-INSTANTIATE_TEST_CASE_P(
-    SplitTest, SplitSmallValueTest,
-    ::testing::Combine(
-        ::testing::Values(0, 12, kStorageHashSize, kStorageHashSize + 1, 100,
-                          1024, kMinChunkSize),
-        ::testing::Values(ObjectType::TREE_NODE, ObjectType::BLOB)));
-
-INSTANTIATE_TEST_CASE_P(
-    SplitTest, SplitBigValueTest,
-    ::testing::Combine(::testing::Values(kMaxChunkSize + 1, 32 * kMaxChunkSize),
-                       ::testing::Values(ObjectType::TREE_NODE,
-                                         ObjectType::BLOB)));
-
-// A stream of 0s is only cut at the maximal size.
-TEST(SplitTest, PathologicalCase) {
-  constexpr size_t kDataSize = 1024 * 1024 * 128;
-  auto source = std::make_unique<PathologicalDataSource>(kDataSize);
-  SplitResult split_result;
-  DoSplit(source.get(), ObjectType::TREE_NODE,
-          [&split_result](SplitResult c) { split_result = std::move(c); });
-
-  ASSERT_EQ(IterationStatus::DONE, split_result.calls.back().status);
-
-  size_t total_size = 0u;
-  for (const auto& call : split_result.calls) {
-    if (call.status == IterationStatus::IN_PROGRESS &&
-        GetObjectDigestInfo(call.digest).is_chunk()) {
-      total_size += split_result.data[call.digest]->Get().size();
-      EXPECT_EQ(std::string(split_result.data[call.digest]->Get().size(), '\0'),
-                split_result.data[call.digest]->Get());
-    }
-  }
-
-  EXPECT_EQ(kDataSize, total_size);
-}
-
-TEST(SplitTest, Error) {
-  auto source = std::make_unique<ErrorDataSource>();
-  SplitResult split_result;
-  DoSplit(source.get(), ObjectType::TREE_NODE,
-          [&split_result](SplitResult c) { split_result = std::move(c); });
-
-  ASSERT_EQ(1u, split_result.calls.size());
-  ASSERT_EQ(IterationStatus::ERROR, split_result.calls.back().status);
-}
-
-ObjectIdentifier MakeIndexId(size_t i) {
-  std::string value;
-  value.resize(sizeof(i));
-  memcpy(&value[0], &i, sizeof(i));
-  return encryption::MakeDefaultObjectIdentifier(
-      ComputeObjectDigest(PieceType::INDEX, ObjectType::BLOB, value));
-}
-
-TEST(SplitTest, CollectPieces) {
-  // Define indexed files. Each index represents an index file. The content is
-  // itself a of index in |parts| that represent the children of the entry.
-  std::vector<std::vector<size_t>> parts = {
-      // clang-format off
-      {1, 2, 3},
-      {4, 5},
-      {4, 6, 7},
-      {7, 8, 9},
-      {10, 11},
-      {},
-      {},
-      {},
-      {},
-      {},
-      {},
-      {}
-      // clang-format on
-  };
-
-  for (const auto& children : parts) {
-    for (size_t child : children) {
-      EXPECT_LT(child, parts.size());
-    }
-  }
-
-  std::map<ObjectIdentifier, std::unique_ptr<DataSource::DataChunk>> objects;
-
-  for (size_t i = 0; i < parts.size(); ++i) {
-    std::vector<FileIndexSerialization::ObjectIdentifierAndSize> children;
-    for (size_t child : parts[i]) {
-      children.push_back({MakeIndexId(child), 1});
-    }
-    size_t total_size;
-    FileIndexSerialization::BuildFileIndex(children, &objects[MakeIndexId(i)],
-                                           &total_size);
-  }
-  IterationStatus status;
-  std::set<ObjectIdentifier> identifiers;
-  CollectPieces(
-      MakeIndexId(0),
-      [&objects](ObjectIdentifier object_identifier,
-                 fit::function<void(Status, fxl::StringView)> callback) {
-        callback(Status::OK, objects[object_identifier]->Get());
-      },
-      [&status, &identifiers](IterationStatus received_status,
-                              ObjectIdentifier identifier) {
-        status = received_status;
-        if (status == IterationStatus::IN_PROGRESS) {
-          identifiers.insert(identifier);
-        }
-        return true;
-      });
-
-  ASSERT_EQ(IterationStatus::DONE, status);
-  ASSERT_EQ(objects.size(), identifiers.size());
-  for (const auto& identifier : identifiers) {
-    EXPECT_EQ(1u, objects.count(identifier)) << "Unknown id: " << identifier;
-  }
-}
-
-// Test behavior of CollectPieces when the data accessor function returns an
-// error in the middle of the iteration.
-TEST(SplitTest, CollectPiecesError) {
-  const size_t nb_successfull_called = 128;
-  IterationStatus status;
-  size_t called = 0;
-  CollectPieces(
-      MakeIndexId(0),
-      [&called](ObjectIdentifier identifier,
-                fit::function<void(Status, fxl::StringView)> callback) {
-        if (called >= nb_successfull_called) {
-          callback(Status::INTERNAL_IO_ERROR, "");
-          return;
-        }
-        ++called;
-        std::vector<FileIndexSerialization::ObjectIdentifierAndSize> children;
-        children.push_back({MakeIndexId(2 * called), 1});
-        children.push_back({MakeIndexId(2 * called + 1), 1});
-        std::unique_ptr<DataSource::DataChunk> data;
-        size_t total_size;
-        FileIndexSerialization::BuildFileIndex(children, &data, &total_size);
-        callback(Status::OK, data->Get());
-      },
-      [&status](IterationStatus received_status, ObjectIdentifier identifier) {
-        status = received_status;
-        return true;
-      });
-  EXPECT_GE(called, nb_successfull_called);
-  ASSERT_EQ(IterationStatus::ERROR, status);
-}
-
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/storage_test_utils.cc b/bin/ledger/storage/impl/storage_test_utils.cc
deleted file mode 100644
index fff8c8e..0000000
--- a/bin/ledger/storage/impl/storage_test_utils.cc
+++ /dev/null
@@ -1,321 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/impl/storage_test_utils.h"
-
-#include <inttypes.h>
-#include <numeric>
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fxl/strings/string_printf.h>
-#include <zircon/syscalls.h>
-
-#include "peridot/bin/ledger/encryption/fake/fake_encryption_service.h"
-#include "peridot/bin/ledger/storage/impl/btree/builder.h"
-#include "peridot/bin/ledger/storage/impl/btree/entry_change_iterator.h"
-#include "peridot/bin/ledger/storage/impl/constants.h"
-#include "peridot/bin/ledger/storage/impl/object_digest.h"
-#include "peridot/bin/ledger/storage/impl/split.h"
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-namespace storage {
-
-namespace {
-
-std::vector<size_t> GetEnumeration(size_t size) {
-  FXL_CHECK(size <= 100);
-
-  std::vector<size_t> values(size);
-  std::iota(values.begin(), values.end(), 0u);
-
-  return values;
-}
-
-std::string ResizeForBehavior(std::string value,
-                              InlineBehavior inline_behavior) {
-  if (inline_behavior == InlineBehavior::PREVENT &&
-      value.size() <= kStorageHashSize) {
-    value.resize(kStorageHashSize + 1);
-  }
-  return value;
-}
-
-ObjectIdentifier GetObjectIdentifier(std::string value,
-                                     ObjectType object_type) {
-  ObjectDigest result;
-  auto data_source = DataSource::Create(std::move(value));
-  SplitDataSource(
-      data_source.get(), object_type,
-      [](ObjectDigest object_digest) {
-        return encryption::MakeDefaultObjectIdentifier(
-            std::move(object_digest));
-      },
-      [&result](IterationStatus status, ObjectIdentifier object_identifier,
-                std::unique_ptr<DataSource::DataChunk> chunk) {
-        if (status == IterationStatus::DONE) {
-          result = object_identifier.object_digest();
-        }
-      });
-  return encryption::MakeDefaultObjectIdentifier(std::move(result));
-}
-
-// Pre-determined node level function.
-uint8_t GetTestNodeLevel(convert::ExtendedStringView key) {
-  if (key == "key03" || key == "key07" || key == "key30" || key == "key60" ||
-      key == "key89") {
-    return 1;
-  }
-
-  if (key == "key50" || key == "key75") {
-    return 2;
-  }
-
-  return 0;
-}
-
-constexpr btree::NodeLevelCalculator kTestNodeLevelCalculator = {
-    &GetTestNodeLevel};
-
-}  // namespace
-
-ObjectData::ObjectData(std::string value, ObjectType object_type,
-                       InlineBehavior inline_behavior)
-    : value(ResizeForBehavior(std::move(value), inline_behavior)),
-      size(this->value.size()),
-      object_identifier(GetObjectIdentifier(this->value, object_type)) {}
-
-std::unique_ptr<DataSource> ObjectData::ToDataSource() {
-  return DataSource::Create(value);
-}
-
-std::unique_ptr<DataSource::DataChunk> ObjectData::ToChunk() {
-  return DataSource::DataChunk::Create(value);
-}
-
-ObjectDigest MakeObjectDigest(std::string content,
-                              InlineBehavior inline_behavior) {
-  return MakeObjectIdentifier(std::move(content), inline_behavior)
-      .object_digest();
-}
-
-ObjectIdentifier MakeObjectIdentifier(std::string content,
-                                      InlineBehavior inline_behavior) {
-  ObjectData data(std::move(content), inline_behavior);
-  return data.object_identifier;
-}
-
-std::string RandomString(rng::Random* random, size_t size) {
-  std::string value;
-  value.resize(size);
-  random->Draw(&value);
-  return value;
-}
-
-CommitId RandomCommitId(rng::Random* random) {
-  return RandomString(random, kCommitIdSize);
-}
-
-ObjectDigest RandomObjectDigest(rng::Random* random) {
-  ObjectData data(RandomString(random, 16), InlineBehavior::PREVENT);
-  return data.object_identifier.object_digest();
-}
-
-ObjectIdentifier RandomObjectIdentifier(rng::Random* random) {
-  return encryption::MakeDefaultObjectIdentifier(RandomObjectDigest(random));
-}
-
-EntryChange NewEntryChange(std::string key, std::string object_digest,
-                           KeyPriority priority) {
-  return EntryChange{
-      Entry{std::move(key), MakeObjectIdentifier(std::move(object_digest)),
-            priority},
-      false};
-}
-
-EntryChange NewRemoveEntryChange(std::string key) {
-  return EntryChange{
-      Entry{std::move(key), MakeObjectIdentifier(""), KeyPriority::EAGER},
-      true};
-}
-
-StorageTest::StorageTest() {}
-
-StorageTest::~StorageTest() {}
-
-::testing::AssertionResult StorageTest::AddObject(
-    std::string value, std::unique_ptr<const Object>* object) {
-  bool called;
-  Status status;
-  ObjectIdentifier object_identifier;
-  GetStorage()->AddObjectFromLocal(
-      ObjectType::BLOB, DataSource::Create(value),
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &object_identifier));
-  RunLoopFor(kSufficientDelay);
-  if (!called) {
-    return ::testing::AssertionFailure()
-           << "AddObjectFromLocal callback wasn't called.";
-  }
-  if (status != Status::OK) {
-    return ::testing::AssertionFailure()
-           << "AddObjectFromLocal failed with status " << status
-           << ". value: " << value;
-  }
-
-  std::unique_ptr<const Object> result;
-  GetStorage()->GetObject(
-      object_identifier, PageStorage::Location::LOCAL,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &result));
-  RunLoopFor(kSufficientDelay);
-  if (!called) {
-    return ::testing::AssertionFailure() << "GetObject callback wasn't called.";
-  }
-  if (status != Status::OK) {
-    return ::testing::AssertionFailure()
-           << "GetObject failed with status " << status << ". value: " << value
-           << ", object_identifier: " << object_identifier;
-  }
-  object->swap(result);
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult StorageTest::CreateEntries(
-    size_t size, std::vector<Entry>* entries) {
-  return CreateEntries(GetEnumeration(size), entries);
-}
-
-::testing::AssertionResult StorageTest::CreateEntries(
-    std::vector<size_t> values, std::vector<Entry>* entries) {
-  std::vector<Entry> result;
-  for (auto i : values) {
-    FXL_DCHECK(i < 100);
-    std::unique_ptr<const Object> object;
-    ::testing::AssertionResult assertion_result =
-        AddObject(fxl::StringPrintf("object%02" PRIuMAX, i), &object);
-    if (!assertion_result) {
-      return assertion_result;
-    }
-    result.push_back(Entry{fxl::StringPrintf("key%02" PRIuMAX, i),
-                           object->GetIdentifier(), KeyPriority::EAGER});
-  }
-  entries->swap(result);
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult StorageTest::CreateEntryChanges(
-    size_t size, std::vector<EntryChange>* changes) {
-  return CreateEntryChanges(GetEnumeration(size), changes, false);
-}
-
-::testing::AssertionResult StorageTest::CreateEntryChanges(
-    std::vector<size_t> values, std::vector<EntryChange>* changes,
-    bool deletion) {
-  std::vector<Entry> entries;
-  ::testing::AssertionResult assertion_result =
-      CreateEntries(std::move(values), &entries);
-  if (!assertion_result) {
-    return assertion_result;
-  }
-  std::vector<EntryChange> result;
-
-  result.reserve(entries.size());
-  for (auto& entry : entries) {
-    result.push_back(EntryChange{std::move(entry), deletion});
-  }
-  changes->swap(result);
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult StorageTest::GetEmptyNodeIdentifier(
-    ObjectIdentifier* empty_node_identifier) {
-  bool called;
-  Status status;
-  btree::TreeNode::Empty(
-      GetStorage(), callback::Capture(callback::SetWhenCalled(&called), &status,
-                                      empty_node_identifier));
-  RunLoopFor(kSufficientDelay);
-  if (!called) {
-    return ::testing::AssertionFailure()
-           << "TreeNode::Empty callback wasn't called.";
-  }
-  if (status != Status::OK) {
-    return ::testing::AssertionFailure()
-           << "TreeNode::Empty failed with status " << status;
-  }
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult StorageTest::CreateNodeFromIdentifier(
-    ObjectIdentifier identifier, std::unique_ptr<const btree::TreeNode>* node) {
-  bool called;
-  Status status;
-  std::unique_ptr<const btree::TreeNode> result;
-  btree::TreeNode::FromIdentifier(
-      GetStorage(), identifier,
-      callback::Capture(callback::SetWhenCalled(&called), &status, &result));
-  RunLoopFor(kSufficientDelay);
-  if (!called) {
-    return ::testing::AssertionFailure()
-           << "TreeNode::FromIdentifier callback wasn't called.";
-  }
-  if (status != Status::OK) {
-    return ::testing::AssertionFailure()
-           << "TreeNode::FromIdentifier failed with status " << status;
-  }
-  node->swap(result);
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult StorageTest::CreateNodeFromEntries(
-    const std::vector<Entry>& entries,
-    const std::map<size_t, ObjectIdentifier>& children,
-    std::unique_ptr<const btree::TreeNode>* node) {
-  bool called;
-  Status status;
-  ObjectIdentifier identifier;
-  btree::TreeNode::FromEntries(
-      GetStorage(), 0u, entries, children,
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        &identifier));
-
-  RunLoopFor(kSufficientDelay);
-  if (!called) {
-    return ::testing::AssertionFailure()
-           << "TreeNode::FromEntries callback wasn't called.";
-  }
-  if (status != Status::OK) {
-    return ::testing::AssertionFailure()
-           << "TreeNode::FromEntries failed with status " << status;
-  }
-  return CreateNodeFromIdentifier(std::move(identifier), node);
-}
-
-::testing::AssertionResult StorageTest::CreateTreeFromChanges(
-    const ObjectIdentifier& base_node_identifier,
-    const std::vector<EntryChange>& entries,
-    ObjectIdentifier* new_root_identifier) {
-  bool called;
-  Status status;
-  std::set<ObjectIdentifier> new_nodes;
-  btree::ApplyChanges(
-      environment_.coroutine_service(), GetStorage(), base_node_identifier,
-      std::make_unique<btree::EntryChangeIterator>(entries.begin(),
-                                                   entries.end()),
-      callback::Capture(callback::SetWhenCalled(&called), &status,
-                        new_root_identifier, &new_nodes),
-      &kTestNodeLevelCalculator);
-  RunLoopFor(kSufficientDelay);
-  if (!called) {
-    return ::testing::AssertionFailure()
-           << "btree::ApplyChanges callback wasn't called.";
-  }
-  if (status != Status::OK) {
-    return ::testing::AssertionFailure()
-           << "btree::ApplyChanges failed with status " << status;
-  }
-  return ::testing::AssertionSuccess();
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/impl/storage_test_utils.h b/bin/ledger/storage/impl/storage_test_utils.h
deleted file mode 100644
index 51c23e9..0000000
--- a/bin/ledger/storage/impl/storage_test_utils.h
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_IMPL_STORAGE_TEST_UTILS_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_IMPL_STORAGE_TEST_UTILS_H_
-
-#include <string>
-
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/functional/closure.h>
-
-#include "peridot/bin/ledger/storage/impl/btree/tree_node.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-#include "peridot/lib/rng/random.h"
-
-namespace storage {
-
-// A sufficiently large delay, such that if a storagemethod posts a delayed
-// task, the task will be due after associated amount of time.
-inline constexpr zx::duration kSufficientDelay = zx::hour(1);
-
-// Enum describing the expected behavior for identifier, allowing or preventing
-// to be inlined values.
-enum class InlineBehavior {
-  ALLOW,
-  PREVENT,
-};
-
-// This class stores an object, computes its identifier and
-// provides accessor to transform into a data source and data chunks.
-class ObjectData {
- public:
-  explicit ObjectData(std::string value)
-      : ObjectData(value, InlineBehavior::ALLOW) {}
-  explicit ObjectData(std::string value, InlineBehavior inline_behavior)
-      : ObjectData(value, ObjectType::BLOB, inline_behavior) {}
-  explicit ObjectData(std::string value, ObjectType object_type,
-                      InlineBehavior inline_behavior);
-  std::unique_ptr<DataSource> ToDataSource();
-  std::unique_ptr<DataSource::DataChunk> ToChunk();
-
-  const std::string value;
-  const size_t size;
-  const ObjectIdentifier object_identifier;
-};
-
-// Builder the object digest for the given content. If |inline_behavior| is
-// InlineBehavior::PREVENT, resize |content| so that it cannot be inlined.
-ObjectDigest MakeObjectDigest(
-    std::string content,
-    InlineBehavior inline_behavior = InlineBehavior::ALLOW);
-
-// Builder the object identifier for the given content. If |inline_behavior| is
-// InlineBehavior::PREVENT, resize |content| so that it cannot be inlined.
-ObjectIdentifier MakeObjectIdentifier(
-    std::string content,
-    InlineBehavior inline_behavior = InlineBehavior::ALLOW);
-
-// Returns a random string of the given length.
-std::string RandomString(rng::Random* random, size_t size);
-
-// Create a new random commit id.
-CommitId RandomCommitId(rng::Random* random);
-
-// Create a new random object digest.
-ObjectDigest RandomObjectDigest(rng::Random* random);
-
-// Create a new random object identifier.
-ObjectIdentifier RandomObjectIdentifier(rng::Random* random);
-
-// Creates and returns a new EntryChange adding or updating the entry with the
-// given information.
-EntryChange NewEntryChange(std::string key, std::string object_digest,
-                           KeyPriority priority);
-
-// Creates and returns a new EntryChange removing the entry with the given key.
-EntryChange NewRemoveEntryChange(std::string key);
-
-// A TestLoopFixture providing some additional utility functions on PageStorage.
-//
-// All utility functions in this class return an |AssertionResult| meaning that
-// they can be used in an EXPECT/ASSERT_TRUE: E.g.
-//     ASSERT_TRUE(AddObject("value", &object));
-// or an EXPECT/ASSERT_FALSE if the function is expected to fail.
-//     ASSERT_FALSE(AddObject("value", &object));
-class StorageTest : public ledger::TestWithEnvironment {
- protected:
-  StorageTest();
-
-  ~StorageTest() override;
-
-  virtual PageStorage* GetStorage() = 0;
-
-  // Adds a new BLOB object with the given value in the page storage and updates
-  // |object| with the new value.
-  ::testing::AssertionResult AddObject(std::string value,
-                                       std::unique_ptr<const Object>* object);
-
-  // Creates a vector of entries, each of which has a key from "key00" to
-  // "keyXX" where XX is |size-1|. A new value is created for each entry and the
-  // corresponding object_digest is set on the entry. |entries| vector will be
-  // swapped with the result.
-  ::testing::AssertionResult CreateEntries(size_t size,
-                                           std::vector<Entry>* entries);
-
-  // Creates a vector of entries, each of which has a key "keyXX", were "XX" is
-  // taken from the |values| vector. A new value is created for each entry and
-  // the corresponding object_digest is set on the entry. |entries| vector will
-  // be swapped with the result.
-  ::testing::AssertionResult CreateEntries(std::vector<size_t> values,
-                                           std::vector<Entry>* entries);
-
-  // Creates a vector of entry changes adding or updating the given number of
-  // entries. See |CreateEntries| for information on the created entries.
-  // |changes| vector will be swapped with the result.
-  ::testing::AssertionResult CreateEntryChanges(
-      size_t size, std::vector<EntryChange>* changes);
-
-  // Creates a vector of entry changes adding or updating the given number of
-  // entries. See |CreateEntries| for information on the created entries.
-  // |changes| vector will be swapped with the result. If |deletion| is true,
-  // the changes will be deletions, otherwise the changes will be updates.
-  ::testing::AssertionResult CreateEntryChanges(
-      std::vector<size_t> values, std::vector<EntryChange>* changes,
-      bool deletion = false);
-
-  // Creates an empty tree node and updates |empty_node_identifier| with the
-  // result.
-  ::testing::AssertionResult GetEmptyNodeIdentifier(
-      ObjectIdentifier* empty_node_identifier);
-
-  // Returns the tree node corresponding to the given id.
-  ::testing::AssertionResult CreateNodeFromIdentifier(
-      ObjectIdentifier identifier,
-      std::unique_ptr<const btree::TreeNode>* node);
-
-  // Creates a new tree node from the given entries and children and updates
-  // |node| with the result.
-  ::testing::AssertionResult CreateNodeFromEntries(
-      const std::vector<Entry>& entries,
-      const std::map<size_t, ObjectIdentifier>& children,
-      std::unique_ptr<const btree::TreeNode>* node);
-
-  // Creates a BTree applying changes from the base node and gives back the
-  // digest of its new root node.
-  ::testing::AssertionResult CreateTreeFromChanges(
-      const ObjectIdentifier& base_node_identifier,
-      const std::vector<EntryChange>& entries,
-      ObjectIdentifier* new_root_identifier);
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(StorageTest);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_IMPL_STORAGE_TEST_UTILS_H_
diff --git a/bin/ledger/storage/public/BUILD.gn b/bin/ledger/storage/public/BUILD.gn
deleted file mode 100644
index 4761f5c..0000000
--- a/bin/ledger/storage/public/BUILD.gn
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("public") {
-  sources = [
-    "commit.h",
-    "commit_watcher.h",
-    "constants.cc",
-    "constants.h",
-    "data_source.cc",
-    "data_source.h",
-    "db.h",
-    "db_factory.h",
-    "iterator.h",
-    "journal.h",
-    "ledger_storage.h",
-    "object.cc",
-    "object.h",
-    "page_storage.cc",
-    "page_storage.h",
-    "page_sync_client.h",
-    "page_sync_delegate.h",
-    "read_data_source.cc",
-    "read_data_source.h",
-    "types.cc",
-    "types.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/coroutine",
-    "//peridot/bin/ledger/filesystem",
-    "//peridot/lib/convert",
-    "//peridot/lib/util:ptr",
-    "//third_party/flatbuffers",
-    "//zircon/public/lib/zx",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "data_source_unittest.cc",
-    "object_unittest.cc",
-    "read_data_source_unittest.cc",
-  ]
-
-  deps = [
-    ":public",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/socket",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/storage/public/commit.h b/bin/ledger/storage/public/commit.h
deleted file mode 100644
index 7a10523..0000000
--- a/bin/ledger/storage/public/commit.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_COMMIT_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_COMMIT_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <lib/fxl/macros.h>
-#include <zx/time.h>
-
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-class Commit {
- public:
-  Commit() {}
-  virtual ~Commit() {}
-
-  // Returns a copy of the commit.
-  virtual std::unique_ptr<const Commit> Clone() const = 0;
-
-  // Returns the id of this commit.
-  virtual const CommitId& GetId() const = 0;
-
-  // Returns the ids of this commit's parents.
-  virtual std::vector<CommitIdView> GetParentIds() const = 0;
-
-  // Returns the creation timestamp of this commit in nanoseconds since epoch.
-  virtual zx::time_utc GetTimestamp() const = 0;
-
-  // Returns the generation of this commit (ie. the number of commits to the
-  // root).
-  virtual uint64_t GetGeneration() const = 0;
-
-  // Returns the id of the root node of this commit.
-  virtual ObjectIdentifier GetRootIdentifier() const = 0;
-
-  // Returns the byte representation of this |Commit| as they will be synced to
-  // the cloud.
-  virtual fxl::StringView GetStorageBytes() const = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(Commit);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_COMMIT_H_
diff --git a/bin/ledger/storage/public/commit_watcher.h b/bin/ledger/storage/public/commit_watcher.h
deleted file mode 100644
index d5a1111..0000000
--- a/bin/ledger/storage/public/commit_watcher.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_COMMIT_WATCHER_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_COMMIT_WATCHER_H_
-
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-class CommitWatcher {
- public:
-  CommitWatcher() {}
-  virtual ~CommitWatcher() {}
-
-  // Called when new commits have been created.
-  virtual void OnNewCommits(
-      const std::vector<std::unique_ptr<const Commit>>& commits,
-      ChangeSource source) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(CommitWatcher);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_COMMIT_WATCHER_H_
diff --git a/bin/ledger/storage/public/constants.cc b/bin/ledger/storage/public/constants.cc
deleted file mode 100644
index 81e4ec9..0000000
--- a/bin/ledger/storage/public/constants.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/public/constants.h"
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace storage {
-
-namespace {
-constexpr char kFirstPageCommitIdArray[kCommitIdSize] = {};
-}  // namespace
-
-constexpr fxl::StringView kFirstPageCommitId(kFirstPageCommitIdArray,
-                                             kCommitIdSize);
-}  // namespace storage
diff --git a/bin/ledger/storage/public/constants.h b/bin/ledger/storage/public/constants.h
deleted file mode 100644
index 925823b..0000000
--- a/bin/ledger/storage/public/constants.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_CONSTANTS_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_CONSTANTS_H_
-
-#include <stdint.h>
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace storage {
-
-// The size of a commit id in number of bytes.
-inline constexpr uint64_t kCommitIdSize = 32;
-
-// The ID of the first commit of a page.
-extern const fxl::StringView kFirstPageCommitId;
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_CONSTANTS_H_
diff --git a/bin/ledger/storage/public/data_source.cc b/bin/ledger/storage/public/data_source.cc
deleted file mode 100644
index 405624a..0000000
--- a/bin/ledger/storage/public/data_source.cc
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/public/data_source.h"
-
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/socket_drainer.h>
-#include <lib/zx/vmar.h>
-
-#include "peridot/lib/convert/convert.h"
-
-namespace storage {
-
-namespace {
-
-template <typename S>
-class StringLikeDataChunk : public DataSource::DataChunk {
- public:
-  explicit StringLikeDataChunk(S value) : value_(std::move(value)) {}
-
- private:
-  fxl::StringView Get() override { return convert::ExtendedStringView(value_); }
-
-  S value_;
-};
-
-template <typename S>
-class StringLikeDataSource : public DataSource {
- public:
-  explicit StringLikeDataSource(S value)
-      : value_(std::move(value)), size_(value_.size()) {}
-
- private:
-  uint64_t GetSize() override { return size_; }
-
-  void Get(fit::function<void(std::unique_ptr<DataChunk>, Status)> callback)
-      override {
-#ifndef NDEBUG
-    FXL_DCHECK(!called_);
-    called_ = true;
-#endif
-    callback(std::make_unique<StringLikeDataChunk<S>>(std::move(value_)),
-             Status::DONE);
-  }
-
-  S value_;
-  uint64_t size_;
-#ifndef NDEBUG
-  bool called_ = false;
-#endif
-};
-
-class VmoDataChunk : public DataSource::DataChunk {
- public:
-  explicit VmoDataChunk(fsl::SizedVmo vmo) : vmo_(std::move(vmo)) {}
-
-  zx_status_t Init() {
-    uintptr_t allocate_address;
-    zx_status_t status = zx::vmar::root_self()->allocate(
-        0, ToFullPages(vmo_.size()), ZX_VM_CAN_MAP_READ, &vmar_,
-        &allocate_address);
-    if (status != ZX_OK) {
-      return status;
-    }
-
-    return vmar_.map(0, vmo_.vmo(), 0, vmo_.size(), ZX_VM_PERM_READ,
-                     &mapped_address_);
-  }
-
- private:
-  uint64_t ToFullPages(uint64_t value) {
-    return (value + PAGE_SIZE - 1) & (~(PAGE_SIZE - 1));
-  }
-
-  fxl::StringView Get() override {
-    return fxl::StringView(reinterpret_cast<char*>(mapped_address_),
-                           vmo_.size());
-  }
-
-  fsl::SizedVmo vmo_;
-  zx::vmar vmar_;
-  uintptr_t mapped_address_;
-};
-
-class VmoDataSource : public DataSource {
- public:
-  explicit VmoDataSource(fsl::SizedVmo vmo) : vmo_(std::move(vmo)) {
-    FXL_DCHECK(vmo_);
-  }
-
- private:
-  uint64_t GetSize() override { return vmo_.size(); }
-
-  void Get(fit::function<void(std::unique_ptr<DataChunk>, Status)> callback)
-      override {
-#ifndef NDEBUG
-    FXL_DCHECK(!called_);
-    called_ = true;
-#endif
-    if (!vmo_) {
-      callback(nullptr, Status::ERROR);
-      return;
-    }
-    auto data = std::make_unique<VmoDataChunk>(std::move(vmo_));
-    if (data->Init() != ZX_OK) {
-      callback(nullptr, Status::ERROR);
-      return;
-    }
-    callback(std::move(data), Status::DONE);
-  }
-
-  fsl::SizedVmo vmo_;
-#ifndef NDEBUG
-  bool called_ = false;
-#endif
-};
-
-class SocketDataSource : public DataSource, public fsl::SocketDrainer::Client {
- public:
-  SocketDataSource(zx::socket socket, uint64_t expected_size)
-      : socket_(std::move(socket)),
-        expected_size_(expected_size),
-        remaining_bytes_(expected_size) {
-    FXL_DCHECK(socket_);
-  }
-
- private:
-  uint64_t GetSize() override { return expected_size_; }
-
-  void Get(fit::function<void(std::unique_ptr<DataChunk>, Status)> callback)
-      override {
-    FXL_DCHECK(socket_);
-    callback_ = std::move(callback);
-    socket_drainer_ = std::make_unique<fsl::SocketDrainer>(this);
-    socket_drainer_->Start(std::move(socket_));
-    socket_.reset();
-  }
-
-  void OnDataAvailable(const void* data, size_t num_bytes) override {
-    if (num_bytes > remaining_bytes_) {
-      FXL_LOG(ERROR) << "Received incorrect number of bytes. Expected: "
-                     << expected_size_ << ", but received at least "
-                     << (num_bytes - remaining_bytes_) << " more.";
-      socket_drainer_.reset();
-      callback_(nullptr, Status::ERROR);
-      return;
-    }
-
-    remaining_bytes_ -= num_bytes;
-    callback_(std::make_unique<StringLikeDataChunk<std::string>>(
-                  std::string(reinterpret_cast<const char*>(data), num_bytes)),
-              Status::TO_BE_CONTINUED);
-  }
-
-  void OnDataComplete() override {
-    socket_drainer_.reset();
-    if (remaining_bytes_ != 0) {
-      FXL_LOG(ERROR) << "Received incorrect number of bytes. Expected: "
-                     << expected_size_ << ", but received "
-                     << (expected_size_ - remaining_bytes_);
-      callback_(nullptr, Status::ERROR);
-      return;
-    }
-
-    callback_(std::make_unique<StringLikeDataChunk<std::string>>(std::string()),
-              Status::DONE);
-  }
-
-  zx::socket socket_;
-  uint64_t expected_size_;
-  uint64_t remaining_bytes_;
-  std::unique_ptr<fsl::SocketDrainer> socket_drainer_;
-  fit::function<void(std::unique_ptr<DataChunk>, Status)> callback_;
-};
-
-class FlatBufferDataChunk : public DataSource::DataChunk {
- public:
-  explicit FlatBufferDataChunk(
-      std::unique_ptr<flatbuffers::FlatBufferBuilder> value)
-      : value_(std::move(value)) {}
-
- private:
-  fxl::StringView Get() override {
-    return fxl::StringView(reinterpret_cast<char*>(value_->GetBufferPointer()),
-                           value_->GetSize());
-  }
-
-  std::unique_ptr<flatbuffers::FlatBufferBuilder> value_;
-};
-
-}  // namespace
-
-std::unique_ptr<DataSource::DataChunk> DataSource::DataChunk::Create(
-    std::string value) {
-  return std::make_unique<StringLikeDataChunk<std::string>>(std::move(value));
-}
-
-std::unique_ptr<DataSource::DataChunk> DataSource::DataChunk::Create(
-    std::unique_ptr<flatbuffers::FlatBufferBuilder> builder) {
-  return std::make_unique<FlatBufferDataChunk>(std::move(builder));
-}
-
-std::unique_ptr<DataSource> DataSource::Create(std::string value) {
-  return std::make_unique<StringLikeDataSource<std::string>>(std::move(value));
-}
-
-std::unique_ptr<DataSource> DataSource::Create(std::vector<uint8_t> value) {
-  return std::make_unique<StringLikeDataSource<std::vector<uint8_t>>>(
-      std::move(value));
-}
-
-std::unique_ptr<DataSource> DataSource::Create(fsl::SizedVmo vmo) {
-  return std::make_unique<VmoDataSource>(std::move(vmo));
-}
-
-std::unique_ptr<DataSource> DataSource::Create(zx::socket socket,
-                                               uint64_t size) {
-  return std::make_unique<SocketDataSource>(std::move(socket), size);
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/public/data_source.h b/bin/ledger/storage/public/data_source.h
deleted file mode 100644
index 616c89d..0000000
--- a/bin/ledger/storage/public/data_source.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_DATA_SOURCE_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_DATA_SOURCE_H_
-
-#include <stdint.h>
-#include <functional>
-#include <memory>
-
-#include <lib/fidl/cpp/array.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/sized_vmo.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-#include <lib/zx/socket.h>
-
-#include "third_party/flatbuffers/include/flatbuffers/flatbuffers.h"
-
-namespace storage {
-
-// Represents a source of Data that can be read asynchronously.
-class DataSource {
- public:
-  // A chunk of Data returned by the DataSource. Ownership is given to the
-  // recipient.
-  class DataChunk {
-   public:
-    DataChunk() {}
-    virtual ~DataChunk() {}
-
-    virtual fxl::StringView Get() = 0;
-
-    // Factory methods.
-    static std::unique_ptr<DataChunk> Create(std::string value);
-    static std::unique_ptr<DataChunk> Create(
-        std::unique_ptr<flatbuffers::FlatBufferBuilder> builder);
-
-   private:
-    FXL_DISALLOW_COPY_AND_ASSIGN(DataChunk);
-  };
-
-  enum Status {
-    DONE,
-    TO_BE_CONTINUED,
-    ERROR,
-  };
-
-  // Factory methods.
-  static std::unique_ptr<DataSource> Create(std::string value);
-  static std::unique_ptr<DataSource> Create(std::vector<uint8_t> value);
-  static std::unique_ptr<DataSource> Create(fsl::SizedVmo vmo);
-  static std::unique_ptr<DataSource> Create(zx::socket socket, uint64_t size);
-
-  DataSource() {}
-  virtual ~DataSource() {}
-
-  // Returns the total size of the data in the DataSource.
-  virtual uint64_t GetSize() = 0;
-  // Fetches the data. This must only be called once. |callback| will later be
-  // called one or more times with subsequent chunks of data. If |Status| is
-  // |TO_BE_CONTINUED|, |callback| will be called again with the next chunk of
-  // data. If |Status| is |DONE|, all the data has been received. In case of
-  // error, |callback| will be called with an |ERROR| status and a null |Data|.
-  virtual void Get(
-      fit::function<void(std::unique_ptr<DataChunk>, Status)> callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(DataSource);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_DATA_SOURCE_H_
diff --git a/bin/ledger/storage/public/data_source_unittest.cc b/bin/ledger/storage/public/data_source_unittest.cc
deleted file mode 100644
index 96c467d..0000000
--- a/bin/ledger/storage/public/data_source_unittest.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/public/data_source.h"
-
-#include <lib/fsl/socket/strings.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/socket/socket_pair.h"
-
-namespace storage {
-namespace {
-
-class DataSourceTest : public gtest::TestLoopFixture {
- protected:
-  ::testing::AssertionResult TestDataSource(
-      std::string expected, std::unique_ptr<DataSource> source) {
-    std::string result;
-    DataSource::Status status;
-
-    source->Get([&result, &status](std::unique_ptr<DataSource::DataChunk> data,
-                                   DataSource::Status received_status) {
-      status = received_status;
-      if (received_status == DataSource::Status::ERROR) {
-        return;
-      }
-      result += data->Get().ToString();
-    });
-
-    RunLoopUntilIdle();
-
-    if (status != DataSource::Status::DONE) {
-      return ::testing::AssertionFailure()
-             << "Expected: " << DataSource::Status::DONE
-             << ", but got: " << status;
-    }
-
-    if (expected != result) {
-      return ::testing::AssertionFailure()
-             << "Expected: " << expected << ", but got: " << result;
-    }
-
-    return ::testing::AssertionSuccess();
-  }
-};
-
-TEST_F(DataSourceTest, String) {
-  std::string value = "Hello World";
-
-  EXPECT_TRUE(TestDataSource(value, DataSource::Create(value)));
-}
-
-TEST_F(DataSourceTest, Array) {
-  std::string value = "Hello World";
-
-  fidl::VectorPtr<uint8_t> array;
-  array.resize(value.size());
-  memcpy(&array->at(0), value.data(), value.size());
-
-  EXPECT_TRUE(TestDataSource(value, DataSource::Create(std::move(array))));
-}
-
-TEST_F(DataSourceTest, Vmo) {
-  std::string value = "Hello World";
-
-  fsl::SizedVmo vmo;
-  EXPECT_TRUE(fsl::VmoFromString(value, &vmo));
-
-  EXPECT_TRUE(TestDataSource(value, DataSource::Create(std::move(vmo))));
-}
-
-TEST_F(DataSourceTest, Socket) {
-  std::string value = "Hello World";
-
-  EXPECT_TRUE(TestDataSource(
-      value,
-      DataSource::Create(fsl::WriteStringToSocket(value), value.size())));
-}
-
-TEST_F(DataSourceTest, SocketWrongSize) {
-  std::string value = "Hello World";
-
-  EXPECT_FALSE(TestDataSource(
-      value,
-      DataSource::Create(fsl::WriteStringToSocket(value), value.size() - 1)));
-  EXPECT_FALSE(TestDataSource(
-      value,
-      DataSource::Create(fsl::WriteStringToSocket(value), value.size() + 1)));
-}
-
-TEST_F(DataSourceTest, SocketMultipleChunk) {
-  const size_t nb_iterations = 2;
-  std::string value = "Hello World";
-  std::vector<std::string> chunks;
-  DataSource::Status status;
-
-  socket::SocketPair socket_pair;
-  auto data_source = DataSource::Create(std::move(socket_pair.socket2),
-                                        nb_iterations * value.size());
-
-  data_source->Get(
-      [&chunks, &status](std::unique_ptr<DataSource::DataChunk> chunk,
-                         DataSource::Status new_status) {
-        EXPECT_NE(DataSource::Status::ERROR, new_status);
-        if (new_status == DataSource::Status::TO_BE_CONTINUED) {
-          chunks.push_back(chunk->Get().ToString());
-        }
-        status = new_status;
-      });
-
-  for (size_t i = 0; i < nb_iterations; ++i) {
-    EXPECT_EQ(i, chunks.size());
-
-    size_t actual = 0;
-    EXPECT_EQ(ZX_OK, socket_pair.socket1.write(0, value.c_str(), value.size(),
-                                               &actual));
-    EXPECT_EQ(value.size(), actual);
-
-    RunLoopUntilIdle();
-  }
-
-  socket_pair.socket1.reset();
-  RunLoopUntilIdle();
-  EXPECT_EQ(DataSource::Status::DONE, status);
-
-  EXPECT_EQ(nb_iterations, chunks.size());
-  for (const auto& string : chunks) {
-    EXPECT_EQ(value, string);
-  }
-}
-
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/storage/public/db.h b/bin/ledger/storage/public/db.h
deleted file mode 100644
index 1f9a0f4..0000000
--- a/bin/ledger/storage/public/db.h
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_DB_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_DB_H_
-
-#include "peridot/bin/ledger/coroutine/coroutine.h"
-#include "peridot/bin/ledger/storage/public/iterator.h"
-#include "peridot/bin/ledger/storage/public/object.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-class Db {
- public:
-  class Batch {
-   public:
-    // A |Batch| can be used to execute a number of updates in |Db| atomically.
-    Batch() {}
-    virtual ~Batch() {}
-
-    // Inserts the given key-value pair in the database.
-    FXL_WARN_UNUSED_RESULT virtual Status Put(
-        coroutine::CoroutineHandler* handler, convert::ExtendedStringView key,
-        fxl::StringView value) = 0;
-
-    // Deletes the entry in the database with the given |key|.
-    FXL_WARN_UNUSED_RESULT virtual Status Delete(
-        coroutine::CoroutineHandler* handler,
-        convert::ExtendedStringView key) = 0;
-
-    // Deletes all entries whose keys match the given |prefix|.
-    FXL_WARN_UNUSED_RESULT virtual Status DeleteByPrefix(
-        coroutine::CoroutineHandler* handler,
-        convert::ExtendedStringView prefix) = 0;
-
-    // Executes this batch. No further operations in this batch are supported
-    // after a successful execution.
-    FXL_WARN_UNUSED_RESULT virtual Status Execute(
-        coroutine::CoroutineHandler* handler) = 0;
-
-   private:
-    FXL_DISALLOW_COPY_AND_ASSIGN(Batch);
-  };
-
-  Db() {}
-  virtual ~Db() {}
-
-  // Starts a new batch. The batch will be written when Execute is called on the
-  // returned object. The Db object must outlive the batch object.
-  // The handler (and the corresponding coroutine) only need to remain active
-  // until the result is returned. If the coroutine is interrupted,
-  // |INTERRUPTED| status is returned.
-  FXL_WARN_UNUSED_RESULT virtual Status StartBatch(
-      coroutine::CoroutineHandler* handler, std::unique_ptr<Batch>* batch) = 0;
-
-  // Retrieves the value corresponding to |key|.
-  FXL_WARN_UNUSED_RESULT virtual Status Get(
-      coroutine::CoroutineHandler* handler, convert::ExtendedStringView key,
-      std::string* value) = 0;
-
-  // Checks whether |key| is stored in this database.
-  FXL_WARN_UNUSED_RESULT virtual Status HasKey(
-      coroutine::CoroutineHandler* handler, convert::ExtendedStringView key,
-      bool* has_key) = 0;
-
-  // Retrieves the value for the given |key| as an Object with the provided
-  // |object_identifier|.
-  FXL_WARN_UNUSED_RESULT virtual Status GetObject(
-      coroutine::CoroutineHandler* handler, convert::ExtendedStringView key,
-      ObjectIdentifier object_identifier,
-      std::unique_ptr<const Object>* object) = 0;
-
-  // Retrieves all keys matching the given |prefix|. |key_suffixes| will be
-  // updated to contain the suffixes of corresponding keys.
-  FXL_WARN_UNUSED_RESULT virtual Status GetByPrefix(
-      coroutine::CoroutineHandler* handler, convert::ExtendedStringView prefix,
-      std::vector<std::string>* key_suffixes) = 0;
-
-  // Retrieves all entries matching the given |prefix|. The keys of the
-  // returned entries will be updated not to contain the |prefix|.
-  FXL_WARN_UNUSED_RESULT virtual Status GetEntriesByPrefix(
-      coroutine::CoroutineHandler* handler, convert::ExtendedStringView prefix,
-      std::vector<std::pair<std::string, std::string>>* entries) = 0;
-
-  // Retrieves an entry iterator over the entries whose keys start with
-  // |prefix|.
-  FXL_WARN_UNUSED_RESULT virtual Status GetIteratorAtPrefix(
-      coroutine::CoroutineHandler* handler, convert::ExtendedStringView prefix,
-      std::unique_ptr<Iterator<const std::pair<convert::ExtendedStringView,
-                                               convert::ExtendedStringView>>>*
-          iterator) = 0;
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_DB_H_
diff --git a/bin/ledger/storage/public/db_factory.h b/bin/ledger/storage/public/db_factory.h
deleted file mode 100644
index 423b4de..0000000
--- a/bin/ledger/storage/public/db_factory.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_DB_FACTORY_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_DB_FACTORY_H_
-
-#include <memory>
-
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-#include "peridot/bin/ledger/storage/public/db.h"
-
-namespace storage {
-
-// A factory for Db instances.
-class DbFactory {
- public:
-  // Defines the action to be taken if |GetOrCreate| is called for a path that
-  // doesn't already contain a Db.
-  enum class OnDbNotFound {
-    // |GetOrCreateDb| should return with a |NOT_FOUND| status.
-    RETURN,
-    // |GetOrCreateDb| should create a new Db instance.
-    CREATE
-  };
-
-  DbFactory() {}
-  virtual ~DbFactory() {}
-
-  // Opens and returns an initialized instance of Db in the given |db_path|.
-  // Depending on the value of |on_db_not_found|, if the Db doesn't already
-  // exist, it either returns with NOT_FOUND status, or creates a new one.
-  virtual void GetOrCreateDb(
-      ledger::DetachedPath db_path, OnDbNotFound on_db_not_found,
-      fit::function<void(Status, std::unique_ptr<Db>)> callback) = 0;
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_DB_FACTORY_H_
diff --git a/bin/ledger/storage/public/iterator.h b/bin/ledger/storage/public/iterator.h
deleted file mode 100644
index 918c618..0000000
--- a/bin/ledger/storage/public/iterator.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_ITERATOR_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_ITERATOR_H_
-
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-// A non-copyable iterator over a collection of elements of type T.
-template <class T>
-class Iterator {
- public:
-  Iterator() {}
-  virtual ~Iterator() {}
-
-  // Advances to the next element in the collection. Should only be called on a
-  // valid iterator.
-  virtual Iterator<T>& Next() = 0;
-  // Returns false if no elements are available in the collection, or an error
-  // occurred. It is invalid to dereference this iterator or to call |Next()| if
-  // Valid() returns false.
-  virtual bool Valid() const = 0;
-  // Returns the current status of the iterator. It returns the error status if
-  // an error occurred, Status::OK otherwise. Reaching the end of the iterator
-  // is not an error.
-  virtual Status GetStatus() const = 0;
-
-  virtual T& operator*() const = 0;
-  virtual T* operator->() const = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(Iterator);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_ITERATOR_H_
diff --git a/bin/ledger/storage/public/journal.h b/bin/ledger/storage/public/journal.h
deleted file mode 100644
index 124f7a5..0000000
--- a/bin/ledger/storage/public/journal.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_JOURNAL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_JOURNAL_H_
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace storage {
-
-// A |Journal| represents a commit in progress.
-class Journal {
- public:
-  Journal() {}
-  virtual ~Journal() {}
-
-  // Returns the ID of this journal.
-  virtual const JournalId& GetId() const = 0;
-
-  // Adds an entry with the given |key| and |object_identifier| to this
-  // |Journal|. Returns |OK| on success or the error code otherwise.
-  virtual void Put(convert::ExtendedStringView key,
-                   ObjectIdentifier object_identifier, KeyPriority priority,
-                   fit::function<void(Status)> callback) = 0;
-
-  // Deletes the entry with the given |key| from this |Journal|. Returns |OK|
-  // on success or the error code otherwise.
-  virtual void Delete(convert::ExtendedStringView key,
-                      fit::function<void(Status)> callback) = 0;
-
-  // Deletes all entries from this Journal, as well as any entries already
-  // present on the page. This doesn't prevent subsequent calls to update the
-  // contents of this Journal (|Put|, |Delete| or |Clear|).
-  virtual void Clear(fit::function<void(Status)> callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(Journal);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_JOURNAL_H_
diff --git a/bin/ledger/storage/public/ledger_storage.h b/bin/ledger/storage/public/ledger_storage.h
deleted file mode 100644
index bb57987..0000000
--- a/bin/ledger/storage/public/ledger_storage.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_LEDGER_STORAGE_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_LEDGER_STORAGE_H_
-
-#include <memory>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-// Manages storage for a single Ledger instance.
-class LedgerStorage {
- public:
-  LedgerStorage() {}
-  virtual ~LedgerStorage() {}
-
-  // Creates a new |PageStorage| for the Page with the given |page_id|.
-  virtual void CreatePageStorage(
-      PageId page_id,
-      fit::function<void(Status, std::unique_ptr<PageStorage>)> callback) = 0;
-
-  // Finds the |PageStorage| corresponding to the page with the given |page_id|.
-  // The result will be returned through the given |callback|. If the storage
-  // for the given page isn't found locally, nullptr will be returned instead.
-  virtual void GetPageStorage(
-      PageId page_id,
-      fit::function<void(Status, std::unique_ptr<PageStorage>)> callback) = 0;
-
-  // Deletes the storage related to the page with |page_id|. This includes the
-  // local copy of the page storage with all commits, tree nodes and values.
-  // This method can fail with a |NOT_FOUND| error if the page is not present in
-  // the local storage, or with an |IO_ERROR| if deletion fails.
-  virtual void DeletePageStorage(PageIdView page_id,
-                                 fit::function<void(Status)> callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerStorage);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_LEDGER_STORAGE_H_
diff --git a/bin/ledger/storage/public/object.cc b/bin/ledger/storage/public/object.cc
deleted file mode 100644
index 803d5dc..0000000
--- a/bin/ledger/storage/public/object.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/public/object.h"
-
-#include <lib/fsl/vmo/strings.h>
-
-namespace storage {
-
-Status Object::GetVmo(fsl::SizedVmo* vmo) const {
-  fxl::StringView data;
-  Status status = GetData(&data);
-  if (status != Status::OK) {
-    return status;
-  }
-
-  if (!fsl::VmoFromString(data, vmo)) {
-    FXL_LOG(WARNING) << "Unable to produce VMO for data.";
-    return Status::INTERNAL_IO_ERROR;
-  }
-
-  return Status::OK;
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/public/object.h b/bin/ledger/storage/public/object.h
deleted file mode 100644
index ec1fa8b..0000000
--- a/bin/ledger/storage/public/object.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_OBJECT_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_OBJECT_H_
-
-#include <vector>
-
-#include <lib/fsl/vmo/sized_vmo.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-class Object {
- public:
-  Object() {}
-  virtual ~Object() {}
-
-  // Returns the identifier of this storage object.
-  virtual ObjectIdentifier GetIdentifier() const = 0;
-
-  // Returns the data of this object. The returned view is valid as long as this
-  // object is not deleted.
-  virtual Status GetData(fxl::StringView* data) const = 0;
-
-  // Returns a vmo containing the data.
-  virtual Status GetVmo(fsl::SizedVmo* vmo) const;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(Object);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_OBJECT_H_
diff --git a/bin/ledger/storage/public/object_unittest.cc b/bin/ledger/storage/public/object_unittest.cc
deleted file mode 100644
index 130622f..0000000
--- a/bin/ledger/storage/public/object_unittest.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/public/object.h"
-
-#include <lib/fsl/vmo/strings.h>
-
-#include "gtest/gtest.h"
-
-namespace storage {
-namespace {
-
-class StringObject : public Object {
- public:
-  explicit StringObject(std::string value) : value_(std::move(value)) {}
-  ~StringObject() override {}
-
-  ObjectIdentifier GetIdentifier() const override {
-    return {1u, 2u, ObjectDigest("digest")};
-  }
-
-  Status GetData(fxl::StringView* data) const override {
-    *data = value_;
-    return Status::OK;
-  }
-
- private:
-  std::string value_;
-};
-
-TEST(ObjectTest, GetVmo) {
-  std::string content = "content";
-  StringObject object(content);
-
-  fsl::SizedVmo vmo;
-  ASSERT_EQ(Status::OK, object.GetVmo(&vmo));
-  std::string vmo_content;
-  ASSERT_TRUE(fsl::StringFromVmo(vmo, &vmo_content));
-  EXPECT_EQ(content, vmo_content);
-}
-
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/storage/public/page_storage.cc b/bin/ledger/storage/public/page_storage.cc
deleted file mode 100644
index d05aa7f..0000000
--- a/bin/ledger/storage/public/page_storage.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace storage {
-
-PageStorage::CommitIdAndBytes::CommitIdAndBytes() {}
-
-PageStorage::CommitIdAndBytes::CommitIdAndBytes(CommitId id, std::string bytes)
-    : id(std::move(id)), bytes(std::move(bytes)) {}
-
-PageStorage::CommitIdAndBytes::CommitIdAndBytes(
-    CommitIdAndBytes&& other) noexcept = default;
-
-PageStorage::CommitIdAndBytes& PageStorage::CommitIdAndBytes::operator=(
-    CommitIdAndBytes&& other) noexcept = default;
-
-}  // namespace storage
diff --git a/bin/ledger/storage/public/page_storage.h b/bin/ledger/storage/public/page_storage.h
deleted file mode 100644
index cd083d5..0000000
--- a/bin/ledger/storage/public/page_storage.h
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_PAGE_STORAGE_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_PAGE_STORAGE_H_
-
-#include <functional>
-#include <memory>
-#include <utility>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/storage/public/commit.h"
-#include "peridot/bin/ledger/storage/public/commit_watcher.h"
-#include "peridot/bin/ledger/storage/public/data_source.h"
-#include "peridot/bin/ledger/storage/public/journal.h"
-#include "peridot/bin/ledger/storage/public/object.h"
-#include "peridot/bin/ledger/storage/public/page_sync_client.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-// |PageStorage| manages the local storage of a single page.
-class PageStorage : public PageSyncClient {
- public:
-  struct CommitIdAndBytes {
-    CommitIdAndBytes();
-    CommitIdAndBytes(CommitId id, std::string bytes);
-    CommitIdAndBytes(CommitIdAndBytes&& other) noexcept;
-
-    CommitIdAndBytes& operator=(CommitIdAndBytes&& other) noexcept;
-
-    CommitId id;
-    std::string bytes;
-
-   private:
-    FXL_DISALLOW_COPY_AND_ASSIGN(CommitIdAndBytes);
-  };
-
-  // Location where to search an object. See |GetObject| call for usage.
-  enum Location { LOCAL, NETWORK };
-
-  PageStorage() {}
-  ~PageStorage() override {}
-
-  // Returns the id of this page.
-  virtual PageId GetId() = 0;
-
-  // Finds the ids of all head commits. It is guaranteed that valid pages have
-  // at least one head commit, even if they are empty.
-  virtual void GetHeadCommitIds(
-      fit::function<void(Status, std::vector<CommitId>)> callback) = 0;
-  // Finds the commit with the given |commit_id| and calls the given |callback|
-  // with the result.
-  virtual void GetCommit(
-      CommitIdView commit_id,
-      fit::function<void(Status, std::unique_ptr<const Commit>)> callback) = 0;
-
-  // Adds a list of commits with the given ids and bytes to storage. The
-  // callback is called when the storage has finished processing the commits. If
-  // the status passed to the callback is OK, this indicates that storage
-  // fetched all referenced objects and is ready to accept subsequent commits.
-  // In case of error due to missing commits, |callback| will be passed a list
-  // of the missing commit IDs.
-  virtual void AddCommitsFromSync(
-      std::vector<CommitIdAndBytes> ids_and_bytes, ChangeSource source,
-      fit::function<void(Status, std::vector<CommitId>)> callback) = 0;
-  // Starts a new journal based on the commit with the given |commit_id|. The
-  // base commit must be one of the head commits. If |journal_type| is
-  // |EXPLICIT|, all changes will be lost after a crash. Otherwise, changes to
-  // implicit journals will be committed on system restart.
-  virtual void StartCommit(
-      const CommitId& commit_id, JournalType journal_type,
-      fit::function<void(Status, std::unique_ptr<Journal>)> callback) = 0;
-  // Starts a new journal for a merge commit, based on the given commits.
-  // |left| and |right| must both be in the set of head commits. All
-  // modifications to the journal consider the |left| as the base of the new
-  // commit. Merge commits are always explicit, that is in case of a crash all
-  // changes to the journal will be lost.
-  virtual void StartMergeCommit(
-      const CommitId& left, const CommitId& right,
-      fit::function<void(Status, std::unique_ptr<Journal>)> callback) = 0;
-
-  // Commits the given |journal| and when finished, returns the success/failure
-  // status and the created Commit object through the given |callback|.
-  virtual void CommitJournal(
-      std::unique_ptr<Journal> journal,
-      fit::function<void(Status, std::unique_ptr<const Commit>)> callback) = 0;
-  // Rolls back all changes to the given |Journal|.
-  virtual void RollbackJournal(std::unique_ptr<Journal> journal,
-                               fit::function<void(Status)> callback) = 0;
-  // Registers the given |CommitWatcher| which will be notified on new commits.
-  virtual Status AddCommitWatcher(CommitWatcher* watcher) = 0;
-  // Unregisters the given CommitWatcher.
-  virtual Status RemoveCommitWatcher(CommitWatcher* watcher) = 0;
-
-  // Checks whether there are any unsynced commits or pieces in this page. Note
-  // that since the result is computed asynchronously, the caller must have
-  // exclusive access to the page to ensure a correct result.
-  virtual void IsSynced(fit::function<void(Status, bool)> callback) = 0;
-
-  // Checks whether this page storage is empty. A page is not empty if there is
-  // more than one head commits. Note that since the result is computed
-  // asynchronously, the caller must have exclusive access to the page to ensure
-  // a correct result.
-  virtual void IsEmpty(fit::function<void(Status, bool)> callback) = 0;
-
-  // Checks whether this page is online, i.e. has been synced to the cloud or a
-  // peer. The page is marked as online if any of these has occured: a local
-  // commit has been synced to the cloud, commits from the cloud have been
-  // downloaded, or the page has been synced to a peer. Note that the result of
-  // this method might be incorrect if there are other asynchronous operations
-  // in progress. To ensure a correct result, the caller must have exclusive
-  // access to the page.
-  virtual bool IsOnline() = 0;
-
-  // Finds the commits that have not yet been synced.
-  //
-  // The commits passed in the callback are sorted in a non-decreasing order of
-  // their generations.
-  virtual void GetUnsyncedCommits(
-      fit::function<void(Status, std::vector<std::unique_ptr<const Commit>>)>
-          callback) = 0;
-
-  // Marks the given commit as synced.
-  virtual void MarkCommitSynced(const CommitId& commit_id,
-                                fit::function<void(Status)> callback) = 0;
-
-  // Finds all objects in the storage that are not yet synced, and calls
-  // |callback| with the operation status and the corresponding
-  // |ObjectIdentifier|s vector.
-  virtual void GetUnsyncedPieces(
-      fit::function<void(Status, std::vector<ObjectIdentifier>)> callback) = 0;
-  // Marks the object with the given |object_identifier| as synced.
-  virtual void MarkPieceSynced(ObjectIdentifier object_identifier,
-                               fit::function<void(Status)> callback) = 0;
-  // Returns true if the object is known to be synced to the cloud, false
-  // otherwise.
-  virtual void IsPieceSynced(ObjectIdentifier object_identifier,
-                             fit::function<void(Status, bool)> callback) = 0;
-
-  // Marks this page as synced to a peer.
-  virtual void MarkSyncedToPeer(fit::function<void(Status)> callback) = 0;
-
-  // Adds the given local object and passes the new object's id to the callback.
-  virtual void AddObjectFromLocal(
-      ObjectType object_type, std::unique_ptr<DataSource> data_source,
-      fit::function<void(Status, ObjectIdentifier)> callback) = 0;
-  // Finds the Object associated with the given |object_identifier|. The result
-  // or an an error will be returned through the given |callback|. If |location|
-  // is LOCAL, only local storage will be checked. If |location| is NETWORK,
-  // then a network request may be made if the requested object is not present
-  // locally.
-  virtual void GetObject(
-      ObjectIdentifier object_identifier, Location location,
-      fit::function<void(Status, std::unique_ptr<const Object>)> callback) = 0;
-
-  // Retrieve a part of an object starting at |offset| with a maximum size of
-  // |max_size| and map it to a VMO.
-  // If |offset| is less than 0, starts from |-offset| from the end of the
-  // value. If |max_size| is less than 0, retrieves everything untill the end of
-  // an object.
-  virtual void GetObjectPart(
-      ObjectIdentifier object_identifier, int64_t offset, int64_t max_size,
-      Location location,
-      fit::function<void(Status, fsl::SizedVmo)> callback) = 0;
-
-  // Finds the piece associated with the given |object_identifier|. The result
-  // or an error will be returned through the given |callback|. Only local
-  // storage is checked, and if the object is an index, is it returned as is,
-  // and not expanded.
-  virtual void GetPiece(
-      ObjectIdentifier object_identifier,
-      fit::function<void(Status, std::unique_ptr<const Object>)> callback) = 0;
-
-  // Sets the opaque sync metadata associated with this page associated with the
-  // given |key|. This state is persisted through restarts and can be retrieved
-  // using |GetSyncMetadata()|.
-  virtual void SetSyncMetadata(fxl::StringView key, fxl::StringView value,
-                               fit::function<void(Status)> callback) = 0;
-
-  // Retrieves the opaque sync metadata associated with this page and the given
-  // |key|.
-  virtual void GetSyncMetadata(
-      fxl::StringView key,
-      fit::function<void(Status, std::string)> callback) = 0;
-
-  // Commit contents.
-
-  // Iterates over the entries of the given |commit| and calls |on_next| on
-  // found entries with a key equal to or greater than |min_key|. Returning
-  // false from |on_next| will immediately stop the iteration. |on_done| is
-  // called once, upon successfull completion, i.e. when there are no more
-  // elements or iteration was interrupted, or if an error occurs.
-  virtual void GetCommitContents(const Commit& commit, std::string min_key,
-                                 fit::function<bool(Entry)> on_next,
-                                 fit::function<void(Status)> on_done) = 0;
-
-  // Retrieves the entry with the given |key| and calls |on_done| with the
-  // result. The status of |on_done| will be |OK| on success, |NOT_FOUND| if
-  // there is no such key in the given commit or an error status on failure.
-  virtual void GetEntryFromCommit(
-      const Commit& commit, std::string key,
-      fit::function<void(Status, Entry)> on_done) = 0;
-
-  // Iterates over the difference between the contents of two commits and calls
-  // |on_next_diff| on found changed entries. Returning false from
-  // |on_next_diff| will immediately stop the iteration. |on_done| is called
-  // once, upon successfull completion, i.e. when there are no more differences
-  // or iteration was interrupted, or if an error occurs.
-  virtual void GetCommitContentsDiff(
-      const Commit& base_commit, const Commit& other_commit,
-      std::string min_key, fit::function<bool(EntryChange)> on_next_diff,
-      fit::function<void(Status)> on_done) = 0;
-
-  // Computes the 3-way diff between a base commit and two other commits. Calls
-  // |on_next_diff| on found changed entries. Returning false from
-  // |on_next_diff| will immediately stop the iteration. |on_done| is called
-  // once, upon successfull completion, i.e. when there are no more differences
-  // or iteration was interrupted, or if an error occurs.
-  virtual void GetThreeWayContentsDiff(
-      const Commit& base_commit, const Commit& left_commit,
-      const Commit& right_commit, std::string min_key,
-      fit::function<bool(ThreeWayChange)> on_next_diff,
-      fit::function<void(Status)> on_done) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageStorage);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_PAGE_STORAGE_H_
diff --git a/bin/ledger/storage/public/page_sync_client.h b/bin/ledger/storage/public/page_sync_client.h
deleted file mode 100644
index b119bc4..0000000
--- a/bin/ledger/storage/public/page_sync_client.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_PAGE_SYNC_CLIENT_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_PAGE_SYNC_CLIENT_H_
-
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/storage/public/page_sync_delegate.h"
-
-namespace storage {
-
-// |PageSyncClient| represents the communication interface between storage and
-// the synchronization objects.
-class PageSyncClient {
- public:
-  PageSyncClient() {}
-  virtual ~PageSyncClient() {}
-
-  // Sets the PageSyncDelegate for this page. A nullptr can be passed to unset a
-  // previously set value.
-  virtual void SetSyncDelegate(PageSyncDelegate* page_sync) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageSyncClient);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_PAGE_SYNC_CLIENT_H_
diff --git a/bin/ledger/storage/public/page_sync_delegate.h b/bin/ledger/storage/public/page_sync_delegate.h
deleted file mode 100644
index e4fd857..0000000
--- a/bin/ledger/storage/public/page_sync_delegate.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_PAGE_SYNC_DELEGATE_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_PAGE_SYNC_DELEGATE_H_
-
-#include <functional>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/storage/public/data_source.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-// Delegate interface for PageStorage responsible for retrieving on-demand
-// storage objects from the cloud.
-class PageSyncDelegate {
- public:
-  PageSyncDelegate() {}
-  virtual ~PageSyncDelegate() {}
-
-  // Retrieves the object of the given id from the cloud.
-  virtual void GetObject(
-      ObjectIdentifier object_identifier,
-      fit::function<void(Status status, ChangeSource source,
-                         IsObjectSynced is_object_synced,
-                         std::unique_ptr<DataSource::DataChunk>)>
-          callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageSyncDelegate);
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_PAGE_SYNC_DELEGATE_H_
diff --git a/bin/ledger/storage/public/read_data_source.cc b/bin/ledger/storage/public/read_data_source.cc
deleted file mode 100644
index a9453eb..0000000
--- a/bin/ledger/storage/public/read_data_source.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/public/read_data_source.h"
-
-#include <lib/fit/function.h>
-
-namespace storage {
-
-void ReadDataSource(
-    callback::ManagedContainer* managed_container,
-    std::unique_ptr<DataSource> data_source,
-    fit::function<void(Status, std::unique_ptr<DataSource::DataChunk>)>
-        callback) {
-  auto managed_data_source = managed_container->Manage(std::move(data_source));
-  auto chunks = std::vector<std::unique_ptr<DataSource::DataChunk>>();
-  (*managed_data_source)
-      ->Get([managed_data_source = std::move(managed_data_source),
-             chunks = std::move(chunks), callback = std::move(callback)](
-                std::unique_ptr<DataSource::DataChunk> chunk,
-                DataSource::Status status) mutable {
-        if (status == DataSource::Status::ERROR) {
-          FXL_LOG(WARNING) << "Error while reading data source content.";
-          callback(Status::INTERNAL_IO_ERROR, nullptr);
-          return;
-        }
-
-        if (chunk) {
-          chunks.push_back(std::move(chunk));
-        }
-
-        if (status == DataSource::Status::TO_BE_CONTINUED) {
-          return;
-        }
-
-        FXL_DCHECK(status == DataSource::Status::DONE);
-
-        if (chunks.empty()) {
-          callback(Status::OK, DataSource::DataChunk::Create(""));
-          return;
-        }
-
-        if (chunks.size() == 1) {
-          callback(Status::OK, std::move(chunks.front()));
-          return;
-        }
-        size_t final_size = 0;
-        for (const auto& chunk : chunks) {
-          final_size += chunk->Get().size();
-        }
-        std::string final_content;
-        final_content.reserve(final_size);
-        for (const auto& chunk : chunks) {
-          final_content.append(chunk->Get().data(), chunk->Get().size());
-        }
-        callback(Status::OK,
-                 DataSource::DataChunk::Create(std::move(final_content)));
-      });
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/public/read_data_source.h b/bin/ledger/storage/public/read_data_source.h
deleted file mode 100644
index a0f7319..0000000
--- a/bin/ledger/storage/public/read_data_source.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_READ_DATA_SOURCE_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_READ_DATA_SOURCE_H_
-
-#include <memory>
-
-#include <lib/callback/managed_container.h>
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/storage/public/data_source.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-// Reads the given data source, and returns a single data chunk containing its
-// content. This method will not call its |callback| if |managed_container| is
-// deleted.
-void ReadDataSource(
-    callback::ManagedContainer* managed_container,
-    std::unique_ptr<DataSource> data_source,
-    fit::function<void(Status, std::unique_ptr<DataSource::DataChunk>)>
-        callback);
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_READ_DATA_SOURCE_H_
diff --git a/bin/ledger/storage/public/read_data_source_unittest.cc b/bin/ledger/storage/public/read_data_source_unittest.cc
deleted file mode 100644
index 6f34288..0000000
--- a/bin/ledger/storage/public/read_data_source_unittest.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/public/read_data_source.h"
-
-#include <lib/callback/capture.h>
-#include <lib/callback/scoped_task_runner.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fit/function.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-
-namespace storage {
-namespace {
-
-// Data source which returns the given content byte-by-byte in separate chunks.
-class SplittingDataSource : public DataSource {
- public:
-  SplittingDataSource(async_dispatcher_t* dispatcher, std::string content)
-      : content_(std::move(content)), index_(0), task_runner_(dispatcher) {}
-
-  uint64_t GetSize() override { return content_.size(); };
-
-  void Get(fit::function<void(std::unique_ptr<DataChunk>, Status)> callback)
-      override {
-    if (index_ >= content_.size()) {
-      callback(nullptr, Status::DONE);
-      return;
-    }
-    callback(DataChunk::Create(content_.substr(index_, 1)),
-             Status::TO_BE_CONTINUED);
-    ++index_;
-    task_runner_.PostTask([this, callback = std::move(callback)]() mutable {
-      Get(std::move(callback));
-    });
-  };
-
- private:
-  const std::string content_;
-  size_t index_;
-
-  callback::ScopedTaskRunner task_runner_;
-};
-
-using ReadDataSourceTest = gtest::TestLoopFixture;
-
-TEST_F(ReadDataSourceTest, ReadDataSource) {
-  std::string expected_content = "Hello World";
-  callback::ManagedContainer container;
-
-  bool called;
-  Status status;
-  std::unique_ptr<DataSource::DataChunk> content;
-  ReadDataSource(
-      &container,
-      std::make_unique<SplittingDataSource>(dispatcher(), expected_content),
-      callback::Capture(callback::SetWhenCalled(&called), &status, &content));
-  RunLoopUntilIdle();
-  ASSERT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(expected_content, content->Get());
-}
-
-TEST_F(ReadDataSourceTest, DeleteContainerWhileReading) {
-  std::string expected_content = "Hello World";
-
-  bool called;
-  Status status;
-  std::unique_ptr<DataSource::DataChunk> content;
-  {
-    callback::ManagedContainer container;
-    ReadDataSource(
-        &container,
-        std::make_unique<SplittingDataSource>(dispatcher(), expected_content),
-        callback::Capture(callback::SetWhenCalled(&called), &status, &content));
-  }
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-}
-
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/storage/public/types.cc b/bin/ledger/storage/public/types.cc
deleted file mode 100644
index eed285e..0000000
--- a/bin/ledger/storage/public/types.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/public/types.h"
-
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/util/ptr.h"
-
-namespace storage {
-namespace {
-template <typename T>
-std::ostream& operator<<(std::ostream& os, const std::unique_ptr<T>& ptr) {
-  if (ptr) {
-    return os << *ptr;
-  }
-  return os;
-}
-}  // namespace
-
-ObjectDigest::ObjectDigest() = default;
-ObjectDigest::ObjectDigest(std::string digest) : digest_(std::move(digest)) {}
-ObjectDigest::ObjectDigest(const flatbuffers::Vector<uint8_t>* digest)
-    : ObjectDigest::ObjectDigest(convert::ToString(digest)) {}
-
-ObjectDigest::ObjectDigest(const ObjectDigest&) = default;
-ObjectDigest& ObjectDigest::operator=(const ObjectDigest&) = default;
-ObjectDigest::ObjectDigest(ObjectDigest&&) = default;
-ObjectDigest& ObjectDigest::operator=(ObjectDigest&&) = default;
-
-bool ObjectDigest::IsValid() const { return digest_.has_value(); }
-const std::string& ObjectDigest::Serialize() const {
-  FXL_DCHECK(IsValid());
-  return digest_.value();
-}
-
-bool operator==(const ObjectDigest& lhs, const ObjectDigest& rhs) {
-  return lhs.digest_ == rhs.digest_;
-}
-bool operator!=(const ObjectDigest& lhs, const ObjectDigest& rhs) {
-  return !(lhs == rhs);
-}
-bool operator<(const ObjectDigest& lhs, const ObjectDigest& rhs) {
-  return lhs.digest_ < rhs.digest_;
-}
-
-std::ostream& operator<<(std::ostream& os, const ObjectDigest& e) {
-  return os << (e.IsValid() ? convert::ToHex(e.Serialize()) : "invalid-digest");
-}
-
-ObjectIdentifier::ObjectIdentifier()
-    : key_index_(0), deletion_scope_id_(0), object_digest_(ObjectDigest()) {}
-
-ObjectIdentifier::ObjectIdentifier(uint32_t key_index,
-                                   uint32_t deletion_scope_id,
-                                   ObjectDigest object_digest)
-    : key_index_(key_index),
-      deletion_scope_id_(deletion_scope_id),
-      object_digest_(std::move(object_digest)) {}
-
-ObjectIdentifier::ObjectIdentifier(const ObjectIdentifier&) = default;
-ObjectIdentifier::ObjectIdentifier(ObjectIdentifier&&) = default;
-ObjectIdentifier& ObjectIdentifier::operator=(const ObjectIdentifier&) =
-    default;
-ObjectIdentifier& ObjectIdentifier::operator=(ObjectIdentifier&&) = default;
-
-bool operator==(const ObjectIdentifier& lhs, const ObjectIdentifier& rhs) {
-  return std::tie(lhs.key_index_, lhs.deletion_scope_id_, lhs.object_digest_) ==
-         std::tie(rhs.key_index_, rhs.deletion_scope_id_, rhs.object_digest_);
-}
-
-bool operator!=(const ObjectIdentifier& lhs, const ObjectIdentifier& rhs) {
-  return !(lhs == rhs);
-}
-
-bool operator<(const ObjectIdentifier& lhs, const ObjectIdentifier& rhs) {
-  return std::tie(lhs.key_index_, lhs.deletion_scope_id_, lhs.object_digest_) <
-         std::tie(rhs.key_index_, rhs.deletion_scope_id_, rhs.object_digest_);
-}
-
-std::ostream& operator<<(std::ostream& os, const ObjectIdentifier& e) {
-  return os << "ObjectIdentifier{key_index: " << e.key_index()
-            << ", deletion_scope_id: " << e.deletion_scope_id()
-            << ", object_digest: " << e.object_digest() << "}";
-}
-
-bool operator==(const Entry& lhs, const Entry& rhs) {
-  return std::tie(lhs.key, lhs.object_identifier, lhs.priority) ==
-         std::tie(rhs.key, rhs.object_identifier, rhs.priority);
-}
-
-bool operator!=(const Entry& lhs, const Entry& rhs) { return !(lhs == rhs); }
-
-std::ostream& operator<<(std::ostream& os, const Entry& e) {
-  return os << "Entry{key: " << e.key << ", value: " << e.object_identifier
-            << ", priority: "
-            << (e.priority == KeyPriority::EAGER ? "EAGER" : "LAZY") << "}";
-}
-
-bool operator==(const EntryChange& lhs, const EntryChange& rhs) {
-  return lhs.deleted == rhs.deleted &&
-         (lhs.deleted ? lhs.entry.key == rhs.entry.key
-                      : lhs.entry == rhs.entry);
-}
-
-bool operator!=(const EntryChange& lhs, const EntryChange& rhs) {
-  return !(lhs == rhs);
-}
-
-std::ostream& operator<<(std::ostream& os, const EntryChange& e) {
-  return os << "EntryChange{entry: " << e.entry << ", deleted: " << e.deleted
-            << "}";
-}
-
-bool operator==(const ThreeWayChange& lhs, const ThreeWayChange& rhs) {
-  return util::EqualPtr(lhs.base, rhs.base) &&
-         util::EqualPtr(lhs.left, rhs.left) &&
-         util::EqualPtr(lhs.right, rhs.right);
-}
-
-bool operator!=(const ThreeWayChange& lhs, const ThreeWayChange& rhs) {
-  return !(lhs == rhs);
-}
-
-std::ostream& operator<<(std::ostream& os, const ThreeWayChange& e) {
-  return os << "ThreeWayChange{base: " << e.base << ", left: " << e.left
-            << ", right: " << e.right << "}";
-}
-
-fxl::StringView StatusToString(Status status) {
-  switch (status) {
-    case Status::OK:
-      return "OK";
-    case Status::IO_ERROR:
-      return "IO_ERROR";
-    case Status::NOT_FOUND:
-      return "NOT_FOUND";
-    case Status::FORMAT_ERROR:
-      return "FORMAT_ERROR";
-    case Status::ILLEGAL_STATE:
-      return "ILLEGAL_STATE";
-    case Status::INTERNAL_IO_ERROR:
-      return "INTERNAL_IO_ERROR";
-    case Status::INTERRUPTED:
-      return "INTERRUPTED";
-    case Status::NOT_CONNECTED_ERROR:
-      return "NOT_CONNECTED_ERROR";
-    case Status::NO_SUCH_CHILD:
-      return "NO_SUCH_CHILD";
-    case Status::OBJECT_DIGEST_MISMATCH:
-      return "OBJECT_DIGEST_MISMATCH";
-    case Status::NOT_IMPLEMENTED:
-      return "NOT_IMPLEMENTED";
-  }
-}
-
-std::ostream& operator<<(std::ostream& os, Status status) {
-  return os << StatusToString(status);
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/public/types.h b/bin/ledger/storage/public/types.h
deleted file mode 100644
index 994f637..0000000
--- a/bin/ledger/storage/public/types.h
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_TYPES_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_TYPES_H_
-
-#include <ostream>
-#include <string>
-
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/lib/convert/convert.h"
-
-namespace storage {
-
-using PageId = std::string;
-using PageIdView = convert::ExtendedStringView;
-using CommitId = std::string;
-using CommitIdView = convert::ExtendedStringView;
-using JournalId = std::string;
-using JournalIdView = convert::ExtendedStringView;
-
-// The type of object.
-// Ledger stores user created content on BTrees, where the nodes (TREE_NODE
-// objects) store the user-created keys and references to the user-created
-// values. The content of the values is (usually) stored into separate BLOB
-// objects.
-// See ledger/storage/impl/btree for more details.
-enum class ObjectType {
-  // A |TreeNode| object.
-  TREE_NODE,
-  // An opaque sequence of bytes. Currently used to store values.
-  BLOB,
-};
-
-// The digest of an object.
-// This class is a container for an object digest, treated as an opaque blob. It
-// is not responsible for computing or validating the digest; see
-// storage/impl/object_digest.h for such functions.
-class ObjectDigest {
- public:
-  // Builds an invalid object digest. Useful, eg., when returning a default
-  // object upon error (with a failed status).
-  ObjectDigest();
-
-  // Builds a valid object digest whose value is equal to |digest|.
-  explicit ObjectDigest(std::string digest);
-  explicit ObjectDigest(const flatbuffers::Vector<uint8_t>* digest);
-
-  ObjectDigest(const ObjectDigest&);
-  ObjectDigest& operator=(const ObjectDigest&);
-  ObjectDigest(ObjectDigest&&);
-  ObjectDigest& operator=(ObjectDigest&&);
-
-  // Returns whether this object represents a valid object digest.
-  bool IsValid() const;
-
-  // Returns the content of the object digest.
-  // The reference is valid as long as this object. Must only be called if the
-  // object is valid.
-  const std::string& Serialize() const;
-
- private:
-  friend bool operator==(const ObjectDigest& lhs, const ObjectDigest& rhs);
-  friend bool operator<(const ObjectDigest& lhs, const ObjectDigest& rhs);
-
-  std::optional<std::string> digest_;
-};
-
-bool operator==(const ObjectDigest& lhs, const ObjectDigest& rhs);
-bool operator!=(const ObjectDigest& lhs, const ObjectDigest& rhs);
-bool operator<(const ObjectDigest& lhs, const ObjectDigest& rhs);
-std::ostream& operator<<(std::ostream& os, const ObjectDigest& e);
-
-// The priority at which the key value is downloaded, and the cache policy.
-enum class KeyPriority {
-  EAGER,
-  LAZY,
-};
-
-// The identifier of an object. This contains the digest of the object, as well
-// as the information needed to hide its name and encrypt its content.
-class ObjectIdentifier {
- public:
-  ObjectIdentifier();
-  ObjectIdentifier(uint32_t key_index, uint32_t deletion_scope_id,
-                   ObjectDigest object_digest);
-
-  ObjectIdentifier(const ObjectIdentifier&);
-  ObjectIdentifier& operator=(const ObjectIdentifier&);
-  ObjectIdentifier(ObjectIdentifier&&);
-  ObjectIdentifier& operator=(ObjectIdentifier&&);
-
-  uint32_t key_index() const { return key_index_; }
-  uint32_t deletion_scope_id() const { return deletion_scope_id_; }
-  const ObjectDigest& object_digest() const { return object_digest_; }
-
- private:
-  friend bool operator==(const ObjectIdentifier&, const ObjectIdentifier&);
-  friend bool operator<(const ObjectIdentifier&, const ObjectIdentifier&);
-
-  uint32_t key_index_;
-  uint32_t deletion_scope_id_;
-  ObjectDigest object_digest_;
-};
-
-bool operator==(const ObjectIdentifier& lhs, const ObjectIdentifier& rhs);
-bool operator!=(const ObjectIdentifier& lhs, const ObjectIdentifier& rhs);
-bool operator<(const ObjectIdentifier& lhs, const ObjectIdentifier& rhs);
-std::ostream& operator<<(std::ostream& os, const ObjectIdentifier& e);
-
-// An entry in a commit.
-struct Entry {
-  std::string key;
-  ObjectIdentifier object_identifier;
-  KeyPriority priority;
-};
-
-bool operator==(const Entry& lhs, const Entry& rhs);
-bool operator!=(const Entry& lhs, const Entry& rhs);
-std::ostream& operator<<(std::ostream& os, const Entry& e);
-
-// A change between two commit contents.
-struct EntryChange {
-  Entry entry;
-  bool deleted;
-};
-
-bool operator==(const EntryChange& lhs, const EntryChange& rhs);
-bool operator!=(const EntryChange& lhs, const EntryChange& rhs);
-std::ostream& operator<<(std::ostream& os, const EntryChange& e);
-
-// A change between 3 commit contents.
-struct ThreeWayChange {
-  std::unique_ptr<Entry> base;
-  std::unique_ptr<Entry> left;
-  std::unique_ptr<Entry> right;
-};
-
-bool operator==(const ThreeWayChange& lhs, const ThreeWayChange& rhs);
-bool operator!=(const ThreeWayChange& lhs, const ThreeWayChange& rhs);
-std::ostream& operator<<(std::ostream& os, const ThreeWayChange& e);
-
-enum class ChangeSource { LOCAL, P2P, CLOUD };
-enum class IsObjectSynced : bool { NO, YES };
-
-enum class JournalType { IMPLICIT, EXPLICIT };
-
-enum class JournalContainsClearOperation { NO, YES };
-
-enum class Status {
-  // User visible status.
-  OK,
-  IO_ERROR,
-  NOT_FOUND,
-
-  // Internal status.
-  FORMAT_ERROR,
-  ILLEGAL_STATE,
-  INTERNAL_IO_ERROR,
-  INTERRUPTED,
-  NOT_CONNECTED_ERROR,
-  NO_SUCH_CHILD,
-  OBJECT_DIGEST_MISMATCH,
-
-  // Temporary status or status for tests.
-  NOT_IMPLEMENTED,
-};
-
-fxl::StringView StatusToString(Status status);
-std::ostream& operator<<(std::ostream& os, Status status);
-
-}  // namespace storage
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_PUBLIC_TYPES_H_
diff --git a/bin/ledger/storage/testing/BUILD.gn b/bin/ledger/storage/testing/BUILD.gn
deleted file mode 100644
index 088235d..0000000
--- a/bin/ledger/storage/testing/BUILD.gn
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("testing") {
-  testonly = true
-
-  sources = [
-    "commit_empty_impl.cc",
-    "commit_empty_impl.h",
-    "page_storage_empty_impl.cc",
-    "page_storage_empty_impl.h",
-    "storage_matcher.cc",
-    "storage_matcher.h",
-  ]
-
-  public_deps = [
-    "//peridot/bin/ledger/storage/public",
-    "//third_party/googletest:gmock",
-    "//third_party/googletest:gtest",
-  ]
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/encryption/primitives",
-    "//peridot/bin/ledger/storage/impl/btree:lib",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/socket",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "storage_matcher_unittest.cc",
-  ]
-
-  deps = [
-    ":testing",
-    "//peridot/bin/ledger/storage/public",
-    "//third_party/googletest:gmock",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/storage/testing/commit_empty_impl.cc b/bin/ledger/storage/testing/commit_empty_impl.cc
deleted file mode 100644
index 5f28be1..0000000
--- a/bin/ledger/storage/testing/commit_empty_impl.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/testing/commit_empty_impl.h"
-
-#include <lib/fxl/logging.h>
-
-namespace storage {
-
-std::unique_ptr<const Commit> CommitEmptyImpl::Clone() const {
-  FXL_NOTIMPLEMENTED();
-  return nullptr;
-}
-
-const CommitId& CommitEmptyImpl::GetId() const {
-  static std::string id = "NOT_IMPLEMENTED";
-  FXL_NOTIMPLEMENTED();
-  return id;
-}
-
-std::vector<CommitIdView> CommitEmptyImpl::GetParentIds() const {
-  FXL_NOTIMPLEMENTED();
-  return {};
-}
-
-zx::time_utc CommitEmptyImpl::GetTimestamp() const {
-  FXL_NOTIMPLEMENTED();
-  return zx::time_utc();
-}
-
-uint64_t CommitEmptyImpl::GetGeneration() const {
-  FXL_NOTIMPLEMENTED();
-  return 0;
-}
-
-ObjectIdentifier CommitEmptyImpl::GetRootIdentifier() const {
-  FXL_NOTIMPLEMENTED();
-  return {0u, 0u, ObjectDigest()};
-}
-
-fxl::StringView CommitEmptyImpl::GetStorageBytes() const {
-  FXL_NOTIMPLEMENTED();
-  return "NOT_IMPLEMENTED";
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/testing/commit_empty_impl.h b/bin/ledger/storage/testing/commit_empty_impl.h
deleted file mode 100644
index 5cea3c6..0000000
--- a/bin/ledger/storage/testing/commit_empty_impl.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_TESTING_COMMIT_EMPTY_IMPL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_TESTING_COMMIT_EMPTY_IMPL_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "peridot/bin/ledger/storage/public/commit.h"
-
-namespace storage {
-
-// Empty implementaton of Commit. All methods do nothing and return dummy or
-// empty responses.
-class CommitEmptyImpl : public Commit {
- public:
-  CommitEmptyImpl() = default;
-  ~CommitEmptyImpl() override = default;
-
-  // Commit:
-  std::unique_ptr<const Commit> Clone() const override;
-
-  const CommitId& GetId() const override;
-
-  std::vector<CommitIdView> GetParentIds() const override;
-
-  zx::time_utc GetTimestamp() const override;
-
-  uint64_t GetGeneration() const override;
-
-  ObjectIdentifier GetRootIdentifier() const override;
-
-  fxl::StringView GetStorageBytes() const override;
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_TESTING_COMMIT_EMPTY_IMPL_H_
diff --git a/bin/ledger/storage/testing/page_storage_empty_impl.cc b/bin/ledger/storage/testing/page_storage_empty_impl.cc
deleted file mode 100644
index dfe4ec4..0000000
--- a/bin/ledger/storage/testing/page_storage_empty_impl.cc
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/testing/page_storage_empty_impl.h"
-
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-namespace storage {
-
-PageId PageStorageEmptyImpl::GetId() {
-  FXL_NOTIMPLEMENTED();
-  return "NOT_IMPLEMENTED";
-}
-
-void PageStorageEmptyImpl::SetSyncDelegate(PageSyncDelegate* /*page_sync*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void PageStorageEmptyImpl::GetHeadCommitIds(
-    fit::function<void(Status, std::vector<CommitId>)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, std::vector<CommitId>());
-}
-
-void PageStorageEmptyImpl::GetCommit(
-    CommitIdView /*commit_id*/,
-    fit::function<void(Status, std::unique_ptr<const Commit>)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, nullptr);
-}
-
-void PageStorageEmptyImpl::AddCommitsFromSync(
-    std::vector<CommitIdAndBytes> /*ids_and_bytes*/, ChangeSource /*source*/,
-    fit::function<void(Status, std::vector<CommitId>)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, {});
-}
-
-void PageStorageEmptyImpl::StartCommit(
-    const CommitId& /*commit_id*/, JournalType /*journal_type*/,
-    fit::function<void(Status, std::unique_ptr<Journal>)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, nullptr);
-}
-
-void PageStorageEmptyImpl::StartMergeCommit(
-    const CommitId& /*left*/, const CommitId& /*right*/,
-    fit::function<void(Status, std::unique_ptr<Journal>)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, nullptr);
-}
-
-void PageStorageEmptyImpl::CommitJournal(
-    std::unique_ptr<Journal> /*journal*/,
-    fit::function<void(Status, std::unique_ptr<const Commit>)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, nullptr);
-}
-
-void PageStorageEmptyImpl::RollbackJournal(
-    std::unique_ptr<Journal> /*journal*/,
-    fit::function<void(Status)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED);
-}
-
-Status PageStorageEmptyImpl::AddCommitWatcher(CommitWatcher* /*watcher*/) {
-  FXL_NOTIMPLEMENTED();
-  return Status::NOT_IMPLEMENTED;
-}
-
-Status PageStorageEmptyImpl::RemoveCommitWatcher(CommitWatcher* /*watcher*/) {
-  FXL_NOTIMPLEMENTED();
-  return Status::NOT_IMPLEMENTED;
-}
-
-void PageStorageEmptyImpl::IsSynced(
-    fit::function<void(Status, bool)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, false);
-}
-
-bool PageStorageEmptyImpl::IsOnline() {
-  FXL_NOTIMPLEMENTED();
-  return false;
-}
-
-void PageStorageEmptyImpl::IsEmpty(fit::function<void(Status, bool)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, false);
-}
-
-void PageStorageEmptyImpl::GetUnsyncedCommits(
-    fit::function<void(Status, std::vector<std::unique_ptr<const Commit>>)>
-        callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, {});
-}
-
-void PageStorageEmptyImpl::MarkCommitSynced(
-    const CommitId& /*commit_id*/, fit::function<void(Status)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED);
-}
-
-void PageStorageEmptyImpl::GetUnsyncedPieces(
-    fit::function<void(Status, std::vector<ObjectIdentifier>)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, std::vector<ObjectIdentifier>());
-}
-
-void PageStorageEmptyImpl::MarkPieceSynced(
-    ObjectIdentifier /*object_identifier*/,
-    fit::function<void(Status)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED);
-}
-
-void PageStorageEmptyImpl::IsPieceSynced(
-    ObjectIdentifier /*object_identifier*/,
-    fit::function<void(Status, bool)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, false);
-}
-
-void PageStorageEmptyImpl::MarkSyncedToPeer(
-    fit::function<void(Status)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED);
-}
-
-void PageStorageEmptyImpl::AddObjectFromLocal(
-    ObjectType /*object_type*/, std::unique_ptr<DataSource> /*data_source*/,
-    fit::function<void(Status, ObjectIdentifier)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, {});
-}
-
-void PageStorageEmptyImpl::GetObjectPart(
-    ObjectIdentifier object_identifier, int64_t offset, int64_t max_size,
-    Location location, fit::function<void(Status, fsl::SizedVmo)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, nullptr);
-}
-
-void PageStorageEmptyImpl::GetObject(
-    ObjectIdentifier /*object_identifier*/, Location /*location*/,
-    fit::function<void(Status, std::unique_ptr<const Object>)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, nullptr);
-}
-
-void PageStorageEmptyImpl::GetPiece(
-    ObjectIdentifier /*object_identifier*/,
-    fit::function<void(Status, std::unique_ptr<const Object>)> callback) {
-  callback(Status::NOT_IMPLEMENTED, nullptr);
-}
-
-void PageStorageEmptyImpl::SetSyncMetadata(
-    fxl::StringView /*key*/, fxl::StringView /*value*/,
-    fit::function<void(Status)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED);
-}
-
-void PageStorageEmptyImpl::GetSyncMetadata(
-    fxl::StringView /*key*/,
-    fit::function<void(Status, std::string)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, "");
-}
-
-void PageStorageEmptyImpl::GetCommitContents(
-    const Commit& /*commit*/, std::string /*min_key*/,
-    fit::function<bool(Entry)> /*on_next*/,
-    fit::function<void(Status)> on_done) {
-  FXL_NOTIMPLEMENTED();
-  on_done(Status::NOT_IMPLEMENTED);
-}
-
-void PageStorageEmptyImpl::GetEntryFromCommit(
-    const Commit& /*commit*/, std::string /*key*/,
-    fit::function<void(Status, Entry)> callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(Status::NOT_IMPLEMENTED, Entry());
-}
-
-void PageStorageEmptyImpl::GetCommitContentsDiff(
-    const Commit& /*base_commit*/, const Commit& /*other_commit*/,
-    std::string /*min_key*/, fit::function<bool(EntryChange)> /*on_next_diff*/,
-    fit::function<void(Status)> on_done) {
-  FXL_NOTIMPLEMENTED();
-  on_done(Status::NOT_IMPLEMENTED);
-}
-
-void PageStorageEmptyImpl::GetThreeWayContentsDiff(
-    const Commit& /*base_commit*/, const Commit& /*left_commit*/,
-    const Commit& /*right_commit*/, std::string /*min_key*/,
-    fit::function<bool(ThreeWayChange)> /*on_next_diff*/,
-    fit::function<void(Status)> on_done) {
-  FXL_NOTIMPLEMENTED();
-  on_done(Status::NOT_IMPLEMENTED);
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/testing/page_storage_empty_impl.h b/bin/ledger/storage/testing/page_storage_empty_impl.h
deleted file mode 100644
index 5136d11..0000000
--- a/bin/ledger/storage/testing/page_storage_empty_impl.h
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_TESTING_PAGE_STORAGE_EMPTY_IMPL_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_TESTING_PAGE_STORAGE_EMPTY_IMPL_H_
-
-#include <functional>
-#include <memory>
-#include <vector>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-
-namespace storage {
-
-// Empty implementaton of PageStorage. All methods do nothing and return dummy
-// or empty responses.
-class PageStorageEmptyImpl : public PageStorage {
- public:
-  PageStorageEmptyImpl() = default;
-  ~PageStorageEmptyImpl() override = default;
-
-  // PageStorage:
-  PageId GetId() override;
-
-  void SetSyncDelegate(PageSyncDelegate* page_sync) override;
-
-  void GetHeadCommitIds(
-      fit::function<void(Status, std::vector<CommitId>)> callback) override;
-
-  void GetCommit(CommitIdView commit_id,
-                 fit::function<void(Status, std::unique_ptr<const Commit>)>
-                     callback) override;
-
-  void AddCommitsFromSync(
-      std::vector<CommitIdAndBytes> ids_and_bytes, ChangeSource source,
-      fit::function<void(Status, std::vector<CommitId>)> callback) override;
-
-  void StartCommit(
-      const CommitId& commit_id, JournalType journal_type,
-      fit::function<void(Status, std::unique_ptr<Journal>)> callback) override;
-
-  void StartMergeCommit(
-      const CommitId& left, const CommitId& right,
-      fit::function<void(Status, std::unique_ptr<Journal>)> callback) override;
-
-  void CommitJournal(std::unique_ptr<Journal> journal,
-                     fit::function<void(Status, std::unique_ptr<const Commit>)>
-                         callback) override;
-
-  void RollbackJournal(std::unique_ptr<Journal> journal,
-                       fit::function<void(Status)> callback) override;
-
-  Status AddCommitWatcher(CommitWatcher* watcher) override;
-
-  Status RemoveCommitWatcher(CommitWatcher* watcher) override;
-
-  void IsSynced(fit::function<void(Status, bool)> callback) override;
-
-  bool IsOnline() override;
-
-  void IsEmpty(fit::function<void(Status, bool)> callback) override;
-
-  void GetUnsyncedCommits(
-      fit::function<void(Status, std::vector<std::unique_ptr<const Commit>>)>
-          callback) override;
-
-  void MarkCommitSynced(const CommitId& commit_id,
-                        fit::function<void(Status)> callback) override;
-
-  void GetUnsyncedPieces(
-      fit::function<void(Status, std::vector<ObjectIdentifier>)> callback)
-      override;
-
-  void MarkPieceSynced(ObjectIdentifier object_identifier,
-                       fit::function<void(Status)> callback) override;
-
-  void IsPieceSynced(ObjectIdentifier object_identifier,
-                     fit::function<void(Status, bool)> callback) override;
-
-  void MarkSyncedToPeer(fit::function<void(Status)> callback) override;
-
-  void AddObjectFromLocal(
-      ObjectType object_type, std::unique_ptr<DataSource> data_source,
-      fit::function<void(Status, ObjectIdentifier)> callback) override;
-
-  void GetObjectPart(
-      ObjectIdentifier object_identifier, int64_t offset, int64_t max_size,
-      Location location,
-      fit::function<void(Status, fsl::SizedVmo)> callback) override;
-
-  void GetObject(ObjectIdentifier object_identifier, Location location,
-                 fit::function<void(Status, std::unique_ptr<const Object>)>
-                     callback) override;
-
-  void GetPiece(ObjectIdentifier object_identifier,
-                fit::function<void(Status, std::unique_ptr<const Object>)>
-                    callback) override;
-
-  void SetSyncMetadata(fxl::StringView key, fxl::StringView value,
-                       fit::function<void(Status)> callback) override;
-
-  void GetSyncMetadata(
-      fxl::StringView key,
-      fit::function<void(Status, std::string)> callback) override;
-
-  void GetCommitContents(const Commit& commit, std::string min_key,
-                         fit::function<bool(Entry)> on_next,
-                         fit::function<void(Status)> on_done) override;
-
-  void GetEntryFromCommit(const Commit& commit, std::string key,
-                          fit::function<void(Status, Entry)> callback) override;
-
-  void GetCommitContentsDiff(const Commit& base_commit,
-                             const Commit& other_commit, std::string min_key,
-                             fit::function<bool(EntryChange)> on_next_diff,
-                             fit::function<void(Status)> on_done) override;
-
-  void GetThreeWayContentsDiff(const Commit& base_commit,
-                               const Commit& left_commit,
-                               const Commit& right_commit, std::string min_key,
-                               fit::function<bool(ThreeWayChange)> on_next_diff,
-                               fit::function<void(Status)> on_done) override;
-};
-
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_TESTING_PAGE_STORAGE_EMPTY_IMPL_H_
diff --git a/bin/ledger/storage/testing/storage_matcher.cc b/bin/ledger/storage/testing/storage_matcher.cc
deleted file mode 100644
index 262a7a9..0000000
--- a/bin/ledger/storage/testing/storage_matcher.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/testing/storage_matcher.h"
-
-using testing::_;
-using testing::AllOf;
-using testing::Field;
-
-namespace storage {
-
-testing::Matcher<ObjectIdentifier> MatchesDigest(
-    testing::Matcher<std::string> matcher) {
-  return Property(&ObjectIdentifier::object_digest,
-                  Property(&ObjectDigest::Serialize, matcher));
-}
-
-testing::Matcher<ObjectIdentifier> MatchesDigest(
-    testing::Matcher<ObjectDigest> matcher) {
-  return Property(&ObjectIdentifier::object_digest, matcher);
-}
-
-testing::Matcher<Entry> MatchesEntry(
-    std::pair<testing::Matcher<std::string>, testing::Matcher<ObjectIdentifier>>
-        matcher) {
-  return MatchesEntry({matcher.first, matcher.second, _});
-}
-
-testing::Matcher<Entry> MatchesEntry(
-    std::tuple<testing::Matcher<std::string>,
-               testing::Matcher<ObjectIdentifier>,
-               testing::Matcher<KeyPriority>>
-        matcher) {
-  return AllOf(Field(&Entry::key, std::get<0>(matcher)),
-               Field(&Entry::object_identifier, std::get<1>(matcher)),
-               Field(&Entry::priority, std::get<2>(matcher)));
-}
-
-}  // namespace storage
diff --git a/bin/ledger/storage/testing/storage_matcher.h b/bin/ledger/storage/testing/storage_matcher.h
deleted file mode 100644
index b301c13..0000000
--- a/bin/ledger/storage/testing/storage_matcher.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_STORAGE_TESTING_STORAGE_MATCHER_H_
-#define PERIDOT_BIN_LEDGER_STORAGE_TESTING_STORAGE_MATCHER_H_
-
-#include <gmock/gmock.h>
-#include <tuple>
-
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace storage {
-
-// Matcher that matches an ObjectIdentifier against a matcher for its digest.
-// Its key_index and deletion_scoped_id are ignored.
-testing::Matcher<ObjectIdentifier> MatchesDigest(
-    testing::Matcher<std::string> matcher);
-testing::Matcher<ObjectIdentifier> MatchesDigest(
-    testing::Matcher<ObjectDigest> matcher);
-
-// Matcher that matches a Ledger entry against a pair of matchers on the entry's
-// key and object_identifier. The entry's priority is not considered in this
-// Matcher.
-testing::Matcher<Entry> MatchesEntry(
-    std::pair<testing::Matcher<std::string>, testing::Matcher<ObjectIdentifier>>
-        matcher);
-
-// Matcher that matches a Ledger entry against a tuple of matchers on the
-// entry's key, object_identifier and priority.
-testing::Matcher<Entry> MatchesEntry(
-    std::tuple<testing::Matcher<std::string>,
-               testing::Matcher<ObjectIdentifier>,
-               testing::Matcher<KeyPriority>>
-        matcher);
-}  // namespace storage
-
-#endif  // PERIDOT_BIN_LEDGER_STORAGE_TESTING_STORAGE_MATCHER_H_
diff --git a/bin/ledger/storage/testing/storage_matcher_unittest.cc b/bin/ledger/storage/testing/storage_matcher_unittest.cc
deleted file mode 100644
index 2658bbf..0000000
--- a/bin/ledger/storage/testing/storage_matcher_unittest.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/storage/testing/storage_matcher.h"
-
-#include "gtest/gtest.h"
-
-namespace storage {
-namespace {
-
-TEST(StorageMatcher, MatchesDigest) {
-  ObjectIdentifier id = {0, 1, ObjectDigest("hello")};
-  EXPECT_THAT(id, MatchesDigest("hello"));
-  EXPECT_THAT(id, Not(MatchesDigest("hexllo")));
-
-  ObjectDigest digest = ObjectDigest("hello");
-  EXPECT_THAT(id, MatchesDigest(digest));
-}
-
-TEST(StorageMatcher, MatchesEntry2Parameters) {
-  ObjectIdentifier id = {0, 1, ObjectDigest("hello")};
-  Entry entry = {"key", id, KeyPriority::EAGER};
-
-  EXPECT_THAT(entry, MatchesEntry({"key", MatchesDigest("hello")}));
-  EXPECT_THAT(entry, MatchesEntry({"key", id}));
-  EXPECT_THAT(entry, Not(MatchesEntry({"key", MatchesDigest("helo")})));
-  EXPECT_THAT(entry, Not(MatchesEntry({"ky", MatchesDigest("hello")})));
-}
-
-TEST(StorageMatcher, MatchesEntry3Parameters) {
-  Entry entry = {"key", {0, 1, ObjectDigest("hello")}, KeyPriority::EAGER};
-
-  EXPECT_THAT(
-      entry, MatchesEntry({"key", MatchesDigest("hello"), KeyPriority::EAGER}));
-  EXPECT_THAT(
-      entry,
-      Not(MatchesEntry({"key", MatchesDigest("hello"), KeyPriority::LAZY})));
-}
-
-}  // namespace
-}  // namespace storage
diff --git a/bin/ledger/sync_coordinator/impl/BUILD.gn b/bin/ledger/sync_coordinator/impl/BUILD.gn
deleted file mode 100644
index e0bc7bf..0000000
--- a/bin/ledger/sync_coordinator/impl/BUILD.gn
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("impl") {
-  sources = [
-    "ledger_sync_impl.cc",
-    "ledger_sync_impl.h",
-    "page_sync_impl.cc",
-    "page_sync_impl.h",
-    "sync_watcher_converter.cc",
-    "sync_watcher_converter.h",
-    "user_sync_impl.cc",
-    "user_sync_impl.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/sync_coordinator/public",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/sync_coordinator/impl/ledger_sync_impl.cc b/bin/ledger/sync_coordinator/impl/ledger_sync_impl.cc
deleted file mode 100644
index 24ef304..0000000
--- a/bin/ledger/sync_coordinator/impl/ledger_sync_impl.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/sync_coordinator/impl/ledger_sync_impl.h"
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/sync_coordinator/impl/page_sync_impl.h"
-
-namespace sync_coordinator {
-
-LedgerSyncImpl::LedgerSyncImpl(
-    std::unique_ptr<cloud_sync::LedgerSync> cloud_sync,
-    std::unique_ptr<p2p_sync::LedgerCommunicator> p2p_sync)
-    : cloud_sync_(std::move(cloud_sync)), p2p_sync_(std::move(p2p_sync)) {}
-
-LedgerSyncImpl::~LedgerSyncImpl() {}
-
-std::unique_ptr<PageSync> LedgerSyncImpl::CreatePageSync(
-    storage::PageStorage* page_storage,
-    storage::PageSyncClient* page_sync_client) {
-  auto combined_sync =
-      std::make_unique<PageSyncImpl>(page_storage, page_sync_client);
-
-  if (cloud_sync_) {
-    auto cloud_page_sync = cloud_sync_->CreatePageSync(
-        page_storage, combined_sync->CreateCloudSyncClient());
-    combined_sync->SetCloudSync(std::move(cloud_page_sync));
-  }
-
-  if (p2p_sync_) {
-    auto p2p_page_sync = p2p_sync_->GetPageCommunicator(
-        page_storage, combined_sync->CreateP2PSyncClient());
-    combined_sync->SetP2PSync(std::move(p2p_page_sync));
-  }
-
-  return combined_sync;
-}
-
-}  // namespace sync_coordinator
diff --git a/bin/ledger/sync_coordinator/impl/ledger_sync_impl.h b/bin/ledger/sync_coordinator/impl/ledger_sync_impl.h
deleted file mode 100644
index ed243af..0000000
--- a/bin/ledger/sync_coordinator/impl/ledger_sync_impl.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_LEDGER_SYNC_IMPL_H_
-#define PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_LEDGER_SYNC_IMPL_H_
-
-#include <functional>
-#include <memory>
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/cloud_sync/public/ledger_sync.h"
-#include "peridot/bin/ledger/p2p_sync/public/ledger_communicator.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/sync_coordinator/public/ledger_sync.h"
-#include "peridot/bin/ledger/sync_coordinator/public/page_sync.h"
-
-namespace sync_coordinator {
-
-class LedgerSyncImpl : public LedgerSync {
- public:
-  LedgerSyncImpl(std::unique_ptr<cloud_sync::LedgerSync> cloud_sync,
-                 std::unique_ptr<p2p_sync::LedgerCommunicator> p2p_sync);
-  ~LedgerSyncImpl() override;
-
-  // LedgerSync:
-  std::unique_ptr<PageSync> CreatePageSync(
-      storage::PageStorage* page_storage,
-      storage::PageSyncClient* page_sync_client) override;
-
- private:
-  std::unique_ptr<cloud_sync::LedgerSync> const cloud_sync_;
-  std::unique_ptr<p2p_sync::LedgerCommunicator> const p2p_sync_;
-};
-
-}  // namespace sync_coordinator
-
-#endif  // PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_LEDGER_SYNC_IMPL_H_
diff --git a/bin/ledger/sync_coordinator/impl/page_sync_impl.cc b/bin/ledger/sync_coordinator/impl/page_sync_impl.cc
deleted file mode 100644
index 8ddb8c1..0000000
--- a/bin/ledger/sync_coordinator/impl/page_sync_impl.cc
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/sync_coordinator/impl/page_sync_impl.h"
-
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-namespace sync_coordinator {
-namespace {
-// Holder for a synchronization provider (cloud or peer-to-peer).
-//
-// This object handles communication between storage and the page synchronizer.
-class SyncProviderHolderBase : public storage::PageSyncClient,
-                               public storage::PageSyncDelegate {
- public:
-  SyncProviderHolderBase();
-  ~SyncProviderHolderBase() override;
-
-  // storage::PageSyncClient:
-  void SetSyncDelegate(storage::PageSyncDelegate* page_sync) override;
-
-  // PageSyncDelegate:
-  void GetObject(
-      storage::ObjectIdentifier object_identifier,
-      fit::function<void(storage::Status status,
-                         storage::ChangeSource change_source,
-                         storage::IsObjectSynced is_object_synced,
-                         std::unique_ptr<storage::DataSource::DataChunk>)>
-          callback) override;
-
- private:
-  storage::PageSyncDelegate* page_sync_delegate_;
-};
-
-SyncProviderHolderBase::SyncProviderHolderBase() {}
-
-SyncProviderHolderBase::~SyncProviderHolderBase() {}
-
-void SyncProviderHolderBase::SetSyncDelegate(
-    storage::PageSyncDelegate* page_sync) {
-  page_sync_delegate_ = page_sync;
-}
-
-void SyncProviderHolderBase::GetObject(
-    storage::ObjectIdentifier object_identifier,
-    fit::function<void(storage::Status status,
-                       storage::ChangeSource change_source,
-                       storage::IsObjectSynced is_object_synced,
-                       std::unique_ptr<storage::DataSource::DataChunk>)>
-        callback) {
-  page_sync_delegate_->GetObject(std::move(object_identifier),
-                                 std::move(callback));
-}
-}  // namespace
-
-class PageSyncImpl::CloudSyncHolder : public SyncProviderHolderBase {
- public:
-  CloudSyncHolder();
-  ~CloudSyncHolder() override;
-
-  void SetCloudSync(std::unique_ptr<cloud_sync::PageSync> cloud_sync);
-  cloud_sync::PageSync* GetCloudSync();
-
- private:
-  std::unique_ptr<cloud_sync::PageSync> cloud_sync_;
-};
-
-PageSyncImpl::CloudSyncHolder::CloudSyncHolder() {}
-
-PageSyncImpl::CloudSyncHolder::~CloudSyncHolder() {}
-
-void PageSyncImpl::CloudSyncHolder::SetCloudSync(
-    std::unique_ptr<cloud_sync::PageSync> cloud_sync) {
-  FXL_DCHECK(!cloud_sync_);
-  cloud_sync_ = std::move(cloud_sync);
-}
-
-cloud_sync::PageSync* PageSyncImpl::CloudSyncHolder::GetCloudSync() {
-  FXL_DCHECK(cloud_sync_);
-  return cloud_sync_.get();
-}
-
-class PageSyncImpl::P2PSyncHolder : public SyncProviderHolderBase {
- public:
-  P2PSyncHolder();
-  ~P2PSyncHolder() override;
-
-  void SetP2PSync(std::unique_ptr<p2p_sync::PageCommunicator> p2p_sync);
-  p2p_sync::PageCommunicator* GetP2PSync();
-
- private:
-  std::unique_ptr<p2p_sync::PageCommunicator> p2p_sync_;
-};
-
-PageSyncImpl::P2PSyncHolder::P2PSyncHolder() {}
-
-PageSyncImpl::P2PSyncHolder::~P2PSyncHolder() {}
-
-void PageSyncImpl::P2PSyncHolder::SetP2PSync(
-    std::unique_ptr<p2p_sync::PageCommunicator> p2p_sync) {
-  FXL_DCHECK(!p2p_sync_);
-  p2p_sync_ = std::move(p2p_sync);
-}
-
-p2p_sync::PageCommunicator* PageSyncImpl::P2PSyncHolder::GetP2PSync() {
-  FXL_DCHECK(p2p_sync_);
-  return p2p_sync_.get();
-}
-
-PageSyncImpl::PageSyncImpl(storage::PageStorage* storage,
-                           storage::PageSyncClient* sync_client)
-    : storage_(storage), sync_client_(sync_client) {
-  FXL_DCHECK(storage_);
-  FXL_DCHECK(sync_client_);
-}
-
-PageSyncImpl::~PageSyncImpl() {}
-
-storage::PageSyncClient* PageSyncImpl::CreateCloudSyncClient() {
-  FXL_DCHECK(!cloud_sync_);
-  cloud_sync_ = std::make_unique<CloudSyncHolder>();
-  return cloud_sync_.get();
-}
-
-void PageSyncImpl::SetCloudSync(
-    std::unique_ptr<cloud_sync::PageSync> cloud_sync) {
-  FXL_DCHECK(cloud_sync_);
-  if (!cloud_sync) {
-    // Cloud sync failed to produce an initialized |cloud_sync| instance - e.g.
-    // because cloud provider is disconnected. Unset the entire cloud sync
-    // holder to disable the cloud sync logic.
-    cloud_sync_.reset();
-    return;
-  }
-
-  cloud_sync->SetOnUnrecoverableError([this] {
-    FXL_LOG(WARNING) << "Shutting down page cloud sync.";
-    // TODO(ppi): handle recovery from cloud provider disconnection, LE-567.
-    cloud_sync_.reset();
-  });
-  cloud_sync_->SetCloudSync(std::move(cloud_sync));
-}
-
-storage::PageSyncClient* PageSyncImpl::CreateP2PSyncClient() {
-  FXL_DCHECK(!p2p_sync_);
-  p2p_sync_ = std::make_unique<P2PSyncHolder>();
-  return p2p_sync_.get();
-}
-
-void PageSyncImpl::SetP2PSync(
-    std::unique_ptr<p2p_sync::PageCommunicator> p2p_sync) {
-  FXL_DCHECK(p2p_sync_);
-  p2p_sync_->SetP2PSync(std::move(p2p_sync));
-}
-
-void PageSyncImpl::Start() {
-  sync_client_->SetSyncDelegate(this);
-  if (cloud_sync_) {
-    cloud_sync_->GetCloudSync()->Start();
-  }
-  if (p2p_sync_) {
-    p2p_sync_->GetP2PSync()->Start();
-  }
-}
-
-void PageSyncImpl::SetOnIdle(fit::closure on_idle) {
-  // Only handle cloud sync for now.
-  if (cloud_sync_) {
-    cloud_sync_->GetCloudSync()->SetOnIdle(std::move(on_idle));
-  }
-}
-
-bool PageSyncImpl::IsIdle() {
-  if (cloud_sync_) {
-    return cloud_sync_->GetCloudSync()->IsIdle();
-  }
-  return true;
-}
-
-void PageSyncImpl::SetOnBacklogDownloaded(fit::closure on_backlog_downloaded) {
-  if (cloud_sync_) {
-    cloud_sync_->GetCloudSync()->SetOnBacklogDownloaded(
-        std::move(on_backlog_downloaded));
-  }
-}
-
-void PageSyncImpl::SetSyncWatcher(SyncStateWatcher* watcher) {
-  watcher_ = std::make_unique<SyncWatcherConverter>(watcher);
-  if (cloud_sync_) {
-    cloud_sync_->GetCloudSync()->SetSyncWatcher(watcher_.get());
-  }
-}
-
-void PageSyncImpl::GetObject(
-    storage::ObjectIdentifier object_identifier,
-    fit::function<void(storage::Status, storage::ChangeSource,
-                       storage::IsObjectSynced is_object_synced,
-                       std::unique_ptr<storage::DataSource::DataChunk>)>
-        callback) {
-  // AnyWaiter returns the first successful value to its Finalize callback. For
-  // example, if P2P returns before cloud with a NOT_FOUND status, then we will
-  // wait for Cloud to return; if P2P returns with an OK status, we will pass
-  // the P2P-returned value immediately.
-  auto waiter = fxl::MakeRefCounted<callback::AnyWaiter<
-      storage::Status,
-      std::tuple<storage::ChangeSource, storage::IsObjectSynced,
-                 std::unique_ptr<storage::DataSource::DataChunk>>>>(
-      storage::Status::OK, storage::Status::NOT_FOUND,
-      std::tuple<storage::ChangeSource, storage::IsObjectSynced,
-                 std::unique_ptr<storage::DataSource::DataChunk>>());
-  if (cloud_sync_) {
-    cloud_sync_->GetObject(
-        object_identifier,
-        [callback = waiter->NewCallback()](
-            storage::Status status, storage::ChangeSource source,
-            storage::IsObjectSynced is_object_synced,
-            std::unique_ptr<storage::DataSource::DataChunk> data) {
-          callback(status,
-                   std::make_tuple(source, is_object_synced, std::move(data)));
-        });
-  }
-  if (p2p_sync_) {
-    p2p_sync_->GetObject(
-        std::move(object_identifier),
-        [callback = waiter->NewCallback()](
-            storage::Status status, storage::ChangeSource source,
-            storage::IsObjectSynced is_object_synced,
-            std::unique_ptr<storage::DataSource::DataChunk> data) {
-          callback(status,
-                   std::make_tuple(source, is_object_synced, std::move(data)));
-        });
-  }
-  waiter->Finalize(
-      [callback = std::move(callback)](
-          storage::Status status,
-          std::tuple<storage::ChangeSource, storage::IsObjectSynced,
-                     std::unique_ptr<storage::DataSource::DataChunk>>
-              data) {
-        callback(status, std::get<0>(data), std::get<1>(data),
-                 std::move(std::get<2>(data)));
-      });
-}
-
-}  // namespace sync_coordinator
diff --git a/bin/ledger/sync_coordinator/impl/page_sync_impl.h b/bin/ledger/sync_coordinator/impl/page_sync_impl.h
deleted file mode 100644
index bcc9f84..0000000
--- a/bin/ledger/sync_coordinator/impl/page_sync_impl.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_PAGE_SYNC_IMPL_H_
-#define PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_PAGE_SYNC_IMPL_H_
-
-#include <functional>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/cloud_sync/public/page_sync.h"
-#include "peridot/bin/ledger/p2p_sync/public/page_communicator.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/storage/public/page_sync_client.h"
-#include "peridot/bin/ledger/storage/public/page_sync_delegate.h"
-#include "peridot/bin/ledger/sync_coordinator/impl/sync_watcher_converter.h"
-#include "peridot/bin/ledger/sync_coordinator/public/page_sync.h"
-
-namespace sync_coordinator {
-
-class PageSyncImpl : public PageSync, public storage::PageSyncDelegate {
- public:
-  PageSyncImpl(storage::PageStorage* storage,
-               storage::PageSyncClient* sync_client);
-  ~PageSyncImpl() override;
-
-  // Creates a PageSyncClient for cloud synchronization. This method should be
-  // called at most once.
-  storage::PageSyncClient* CreateCloudSyncClient();
-  // Sets the PageSync for cloud synchronization. A Cloud sync client should
-  // have been created first.
-  void SetCloudSync(std::unique_ptr<cloud_sync::PageSync> cloud_sync);
-
-  // Creates a PageSyncClient for p2p synchronization. This method should be
-  // called at most once.
-  storage::PageSyncClient* CreateP2PSyncClient();
-  // Sets the PageSync for p2p synchronization. A P2P sync client should have
-  // been created first.
-  void SetP2PSync(std::unique_ptr<p2p_sync::PageCommunicator> p2p_sync);
-
-  // PageSync:
-  void Start() override;
-  void SetOnIdle(fit::closure on_idle) override;
-  bool IsIdle() override;
-  void SetOnBacklogDownloaded(fit::closure on_backlog_downloaded) override;
-  void SetSyncWatcher(SyncStateWatcher* watcher) override;
-
-  // PageSyncDelegate:
-  void GetObject(
-      storage::ObjectIdentifier object_identifier,
-      fit::function<void(storage::Status status,
-                         storage::ChangeSource change_source,
-                         storage::IsObjectSynced is_object_synced,
-                         std::unique_ptr<storage::DataSource::DataChunk>)>
-          callback) override;
-
- private:
-  class CloudSyncHolder;
-  class P2PSyncHolder;
-
-  std::unique_ptr<SyncWatcherConverter> watcher_;
-  std::unique_ptr<CloudSyncHolder> cloud_sync_;
-  std::unique_ptr<P2PSyncHolder> p2p_sync_;
-
-  storage::PageStorage* const storage_;
-  storage::PageSyncClient* const sync_client_;
-};
-
-}  // namespace sync_coordinator
-
-#endif  // PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_PAGE_SYNC_IMPL_H_
diff --git a/bin/ledger/sync_coordinator/impl/sync_watcher_converter.cc b/bin/ledger/sync_coordinator/impl/sync_watcher_converter.cc
deleted file mode 100644
index 5cd6431..0000000
--- a/bin/ledger/sync_coordinator/impl/sync_watcher_converter.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/sync_coordinator/impl/sync_watcher_converter.h"
-
-#include <utility>
-
-namespace sync_coordinator {
-namespace {
-DownloadSyncState ConvertToDownloadSyncState(
-    cloud_sync::DownloadSyncState download) {
-  switch (download) {
-    case cloud_sync::DOWNLOAD_NOT_STARTED:
-      return DownloadSyncState::DOWNLOAD_PENDING;
-    case cloud_sync::DOWNLOAD_BACKLOG:
-      return DownloadSyncState::DOWNLOAD_IN_PROGRESS;
-    case cloud_sync::DOWNLOAD_TEMPORARY_ERROR:
-      return DownloadSyncState::DOWNLOAD_PENDING;
-    case cloud_sync::DOWNLOAD_SETTING_REMOTE_WATCHER:
-      return DownloadSyncState::DOWNLOAD_IN_PROGRESS;
-    case cloud_sync::DOWNLOAD_IDLE:
-      return DownloadSyncState::DOWNLOAD_IDLE;
-    case cloud_sync::DOWNLOAD_IN_PROGRESS:
-      return DownloadSyncState::DOWNLOAD_IN_PROGRESS;
-    case cloud_sync::DOWNLOAD_PERMANENT_ERROR:
-      return DownloadSyncState::DOWNLOAD_ERROR;
-  }
-}
-
-UploadSyncState ConvertToUploadSyncState(cloud_sync::UploadSyncState upload) {
-  switch (upload) {
-    case cloud_sync::UPLOAD_NOT_STARTED:
-      return UploadSyncState::UPLOAD_PENDING;
-    case cloud_sync::UPLOAD_SETUP:
-      return UploadSyncState::UPLOAD_PENDING;
-    case cloud_sync::UPLOAD_IDLE:
-      return UploadSyncState::UPLOAD_IDLE;
-    case cloud_sync::UPLOAD_PENDING:
-      return UploadSyncState::UPLOAD_PENDING;
-    case cloud_sync::UPLOAD_WAIT_TOO_MANY_LOCAL_HEADS:
-      return UploadSyncState::UPLOAD_PENDING;
-    case cloud_sync::UPLOAD_WAIT_REMOTE_DOWNLOAD:
-      return UploadSyncState::UPLOAD_PENDING;
-    case cloud_sync::UPLOAD_TEMPORARY_ERROR:
-      return UploadSyncState::UPLOAD_PENDING;
-    case cloud_sync::UPLOAD_IN_PROGRESS:
-      return UploadSyncState::UPLOAD_IN_PROGRESS;
-    case cloud_sync::UPLOAD_PERMANENT_ERROR:
-      return UploadSyncState::UPLOAD_ERROR;
-  }
-}
-
-sync_coordinator::SyncStateWatcher::SyncStateContainer ConvertToSyncState(
-    cloud_sync::SyncStateWatcher::SyncStateContainer state) {
-  return {ConvertToDownloadSyncState(state.download),
-          ConvertToUploadSyncState(state.upload)};
-}
-
-}  // namespace
-
-SyncWatcherConverter::SyncWatcherConverter(
-    sync_coordinator::SyncStateWatcher* watcher)
-    : watcher_(watcher) {}
-SyncWatcherConverter::~SyncWatcherConverter() {}
-
-void SyncWatcherConverter::Notify(SyncStateContainer sync_state) {
-  watcher_->Notify(ConvertToSyncState(sync_state));
-}
-}  // namespace sync_coordinator
diff --git a/bin/ledger/sync_coordinator/impl/sync_watcher_converter.h b/bin/ledger/sync_coordinator/impl/sync_watcher_converter.h
deleted file mode 100644
index 33bb71a..0000000
--- a/bin/ledger/sync_coordinator/impl/sync_watcher_converter.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_SYNC_WATCHER_CONVERTER_H_
-#define PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_SYNC_WATCHER_CONVERTER_H_
-
-#include "peridot/bin/ledger/cloud_sync/public/sync_state_watcher.h"
-#include "peridot/bin/ledger/sync_coordinator/public/sync_state_watcher.h"
-
-namespace sync_coordinator {
-
-// Watcher interface for the current state of data synchronization.
-class SyncWatcherConverter : public cloud_sync::SyncStateWatcher {
- public:
-  explicit SyncWatcherConverter(sync_coordinator::SyncStateWatcher* watcher);
-  ~SyncWatcherConverter() override;
-
-  // Notifies the watcher of a new state.
-  void Notify(SyncStateContainer sync_state) override;
-
- private:
-  sync_coordinator::SyncStateWatcher* const watcher_;
-};
-
-}  // namespace sync_coordinator
-
-#endif  // PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_SYNC_WATCHER_CONVERTER_H_
diff --git a/bin/ledger/sync_coordinator/impl/user_sync_impl.cc b/bin/ledger/sync_coordinator/impl/user_sync_impl.cc
deleted file mode 100644
index a809dd3..0000000
--- a/bin/ledger/sync_coordinator/impl/user_sync_impl.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/sync_coordinator/impl/user_sync_impl.h"
-
-#include "peridot/bin/ledger/sync_coordinator/impl/ledger_sync_impl.h"
-
-namespace sync_coordinator {
-
-UserSyncImpl::UserSyncImpl(std::unique_ptr<cloud_sync::UserSync> cloud_sync,
-                           std::unique_ptr<p2p_sync::UserCommunicator> p2p_sync)
-    : cloud_sync_(std::move(cloud_sync)), p2p_sync_(std::move(p2p_sync)) {}
-
-UserSyncImpl::~UserSyncImpl() {}
-
-void UserSyncImpl::Start() {
-  FXL_DCHECK(!started_);
-  started_ = true;
-  if (cloud_sync_) {
-    cloud_sync_->Start();
-  }
-  if (p2p_sync_) {
-    p2p_sync_->Start();
-  }
-}
-void UserSyncImpl::SetWatcher(SyncStateWatcher* watcher) {
-  watcher_ = std::make_unique<SyncWatcherConverter>(watcher);
-  cloud_sync_->SetSyncWatcher(watcher_.get());
-}
-
-std::unique_ptr<LedgerSync> UserSyncImpl::CreateLedgerSync(
-    fxl::StringView app_id, encryption::EncryptionService* encryption_service) {
-  FXL_DCHECK(started_);
-  std::unique_ptr<cloud_sync::LedgerSync> cloud_ledger_sync;
-  if (cloud_sync_) {
-    cloud_ledger_sync =
-        cloud_sync_->CreateLedgerSync(app_id, encryption_service);
-  }
-  std::unique_ptr<p2p_sync::LedgerCommunicator> p2p_ledger_sync;
-  if (p2p_sync_) {
-    // FIXME(etiennej): fix the API
-    p2p_ledger_sync = p2p_sync_->GetLedgerCommunicator(app_id.ToString());
-  }
-  auto combined_sync = std::make_unique<LedgerSyncImpl>(
-      std::move(cloud_ledger_sync), std::move(p2p_ledger_sync));
-  return combined_sync;
-}
-
-}  // namespace sync_coordinator
diff --git a/bin/ledger/sync_coordinator/impl/user_sync_impl.h b/bin/ledger/sync_coordinator/impl/user_sync_impl.h
deleted file mode 100644
index fb93653..0000000
--- a/bin/ledger/sync_coordinator/impl/user_sync_impl.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_USER_SYNC_IMPL_H_
-#define PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_USER_SYNC_IMPL_H_
-
-#include <memory>
-
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/cloud_sync/public/user_sync.h"
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/p2p_sync/public/user_communicator.h"
-#include "peridot/bin/ledger/sync_coordinator/impl/sync_watcher_converter.h"
-#include "peridot/bin/ledger/sync_coordinator/public/ledger_sync.h"
-#include "peridot/bin/ledger/sync_coordinator/public/user_sync.h"
-
-namespace sync_coordinator {
-
-class UserSyncImpl : public UserSync {
- public:
-  UserSyncImpl(std::unique_ptr<cloud_sync::UserSync> cloud_sync,
-               std::unique_ptr<p2p_sync::UserCommunicator> p2p_sync);
-  ~UserSyncImpl() override;
-
-  // UserSync:
-  void Start() override;
-  void SetWatcher(SyncStateWatcher* watcher) override;
-  std::unique_ptr<LedgerSync> CreateLedgerSync(
-      fxl::StringView app_id,
-      encryption::EncryptionService* encryption_service) override;
-
- private:
-  std::unique_ptr<SyncWatcherConverter> watcher_;
-  bool started_ = false;
-
-  std::unique_ptr<cloud_sync::UserSync> const cloud_sync_;
-  std::unique_ptr<p2p_sync::UserCommunicator> const p2p_sync_;
-};
-
-}  // namespace sync_coordinator
-
-#endif  // PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_IMPL_USER_SYNC_IMPL_H_
diff --git a/bin/ledger/sync_coordinator/public/BUILD.gn b/bin/ledger/sync_coordinator/public/BUILD.gn
deleted file mode 100644
index 6a76ee8..0000000
--- a/bin/ledger/sync_coordinator/public/BUILD.gn
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("public") {
-  sources = [
-    "ledger_sync.h",
-    "page_sync.h",
-    "sync_state_watcher.h",
-    "user_sync.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/cloud_sync/public",
-    "//peridot/bin/ledger/p2p_sync/public",
-    "//peridot/bin/ledger/storage/public",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/sync_coordinator/public/ledger_sync.h b/bin/ledger/sync_coordinator/public/ledger_sync.h
deleted file mode 100644
index a2c13f4..0000000
--- a/bin/ledger/sync_coordinator/public/ledger_sync.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_LEDGER_SYNC_H_
-#define PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_LEDGER_SYNC_H_
-
-#include <functional>
-#include <memory>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/cloud_sync/public/ledger_sync.h"
-#include "peridot/bin/ledger/p2p_sync/public/ledger_communicator.h"
-#include "peridot/bin/ledger/storage/public/page_storage.h"
-#include "peridot/bin/ledger/sync_coordinator/public/page_sync.h"
-
-namespace sync_coordinator {
-
-// Manages synchronization for a ledger.
-class LedgerSync {
- public:
-  LedgerSync() {}
-  virtual ~LedgerSync() {}
-
-  // Creates a new page sync for the given page.
-  virtual std::unique_ptr<PageSync> CreatePageSync(
-      storage::PageStorage* page_storage,
-      storage::PageSyncClient* page_sync_client) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerSync);
-};
-
-}  // namespace sync_coordinator
-
-#endif  // PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_LEDGER_SYNC_H_
diff --git a/bin/ledger/sync_coordinator/public/page_sync.h b/bin/ledger/sync_coordinator/public/page_sync.h
deleted file mode 100644
index d594e9b..0000000
--- a/bin/ledger/sync_coordinator/public/page_sync.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_PAGE_SYNC_H_
-#define PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_PAGE_SYNC_H_
-
-#include <functional>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/sync_coordinator/public/sync_state_watcher.h"
-
-namespace sync_coordinator {
-
-// Manages synchronization of a single page.
-//
-// PageSync is responsible for uploading locally created artifacts (commits and
-// objects) of the page and for fetching remote artifacts of the same page and
-// putting them in storage. It manages coordination between upload/download
-// throught the cloud and through local peers.
-class PageSync {
- public:
-  PageSync() {}
-  virtual ~PageSync() {}
-
-  // Starts syncing. Upon connection drop, the sync will restart automatically,
-  // the client doesn't need to call Start() again.
-  virtual void Start() = 0;
-
-  // Sets a callback that will be called after Start() every time when PageSync
-  // becomes idle, that is: finished uploading all unsynced local artifacts and
-  // not downloading any remote artifacts. Can be set at most once and only
-  // before calling Start().
-  virtual void SetOnIdle(fit::closure on_idle) = 0;
-
-  // Returns true iff PageSync is idle, that is with no pending upload or
-  // download work.
-  virtual bool IsIdle() = 0;
-
-  // Sets a callback that will be called at most once after Start(), when all
-  // remote commits added to the cloud between the last sync and starting the
-  // current sync are added to storage. This can be used by the client to delay
-  // exposing the local page until it catches up with the cloud. Can be set at
-  // most once and only before calling Start().
-  virtual void SetOnBacklogDownloaded(fit::closure on_backlog_downloaded) = 0;
-
-  // Sets a watcher for the synchronization state of this page.
-  virtual void SetSyncWatcher(SyncStateWatcher* watcher) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageSync);
-};
-
-}  // namespace sync_coordinator
-
-#endif  // PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_PAGE_SYNC_H_
diff --git a/bin/ledger/sync_coordinator/public/sync_state_watcher.h b/bin/ledger/sync_coordinator/public/sync_state_watcher.h
deleted file mode 100644
index 54d0296..0000000
--- a/bin/ledger/sync_coordinator/public/sync_state_watcher.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_SYNC_STATE_WATCHER_H_
-#define PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_SYNC_STATE_WATCHER_H_
-
-namespace sync_coordinator {
-// Detail of the download part of the synchronization state.
-enum DownloadSyncState {
-  DOWNLOAD_IDLE = 0,
-  DOWNLOAD_PENDING,
-  DOWNLOAD_IN_PROGRESS,
-  DOWNLOAD_ERROR,
-};
-
-// Detail of the upload part of the synchronization state.
-enum UploadSyncState {
-  UPLOAD_IDLE = 0,
-  UPLOAD_PENDING,
-  UPLOAD_IN_PROGRESS,
-  UPLOAD_ERROR,
-};
-
-// Watcher interface for the current state of data synchronization
-class SyncStateWatcher {
- public:
-  // Container for the synchronization state, containing both download and
-  // upload components.
-  struct SyncStateContainer {
-    DownloadSyncState download = DOWNLOAD_IDLE;
-    UploadSyncState upload = UPLOAD_IDLE;
-  };
-
-  virtual ~SyncStateWatcher() {}
-
-  // Notifies the watcher of a new state.
-  virtual void Notify(SyncStateContainer sync_state) = 0;
-};
-}  // namespace sync_coordinator
-
-#endif  // PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_SYNC_STATE_WATCHER_H_
diff --git a/bin/ledger/sync_coordinator/public/user_sync.h b/bin/ledger/sync_coordinator/public/user_sync.h
deleted file mode 100644
index 8293633..0000000
--- a/bin/ledger/sync_coordinator/public/user_sync.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_USER_SYNC_H_
-#define PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_USER_SYNC_H_
-
-#include <memory>
-
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/encryption/public/encryption_service.h"
-#include "peridot/bin/ledger/sync_coordinator/public/ledger_sync.h"
-
-namespace sync_coordinator {
-
-// Top level factory for every object sync related for a given user.
-class UserSync {
- public:
-  UserSync() {}
-  virtual ~UserSync() {}
-
-  // Starts the user-level synchronization.
-  virtual void Start() = 0;
-
-  // Sets a watcher aggregating the synchronization state of all operations
-  // under this user. Set to nullptr for unregistering.
-  virtual void SetWatcher(SyncStateWatcher* watcher) = 0;
-
-  // Returns the Ledger-level synchronization object. The user-level
-  // synchronization must be started before calling this method.
-  virtual std::unique_ptr<LedgerSync> CreateLedgerSync(
-      fxl::StringView app_id,
-      encryption::EncryptionService* encryption_service) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(UserSync);
-};
-
-}  // namespace sync_coordinator
-
-#endif  // PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_PUBLIC_USER_SYNC_H_
diff --git a/bin/ledger/sync_coordinator/testing/BUILD.gn b/bin/ledger/sync_coordinator/testing/BUILD.gn
deleted file mode 100644
index 3004996..0000000
--- a/bin/ledger/sync_coordinator/testing/BUILD.gn
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("testing") {
-  testonly = true
-
-  sources = [
-    "page_sync_empty_impl.cc",
-    "page_sync_empty_impl.h",
-  ]
-
-  public_deps = [
-    "//peridot/bin/ledger/sync_coordinator/public",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/sync_coordinator/testing/page_sync_empty_impl.cc b/bin/ledger/sync_coordinator/testing/page_sync_empty_impl.cc
deleted file mode 100644
index 79ecf04..0000000
--- a/bin/ledger/sync_coordinator/testing/page_sync_empty_impl.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/sync_coordinator/testing/page_sync_empty_impl.h"
-
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-namespace sync_coordinator {
-
-void PageSyncEmptyImpl::Start() { FXL_NOTIMPLEMENTED(); }
-
-void PageSyncEmptyImpl::SetOnIdle(fit::closure /*on_idle_callback*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-bool PageSyncEmptyImpl::IsIdle() {
-  FXL_NOTIMPLEMENTED();
-  return true;
-}
-
-void PageSyncEmptyImpl::SetOnBacklogDownloaded(
-    fit::closure /*on_backlog_downloaded_callback*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void PageSyncEmptyImpl::SetSyncWatcher(SyncStateWatcher* /*watcher*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-}  // namespace sync_coordinator
diff --git a/bin/ledger/sync_coordinator/testing/page_sync_empty_impl.h b/bin/ledger/sync_coordinator/testing/page_sync_empty_impl.h
deleted file mode 100644
index 29725f1..0000000
--- a/bin/ledger/sync_coordinator/testing/page_sync_empty_impl.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_TESTING_PAGE_SYNC_EMPTY_IMPL_H_
-#define PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_TESTING_PAGE_SYNC_EMPTY_IMPL_H_
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/sync_coordinator/public/page_sync.h"
-
-namespace sync_coordinator {
-
-class PageSyncEmptyImpl : public PageSync {
- public:
-  // PageSync:
-  void Start() override;
-  void SetOnIdle(fit::closure on_idle_callback) override;
-  bool IsIdle() override;
-  void SetOnBacklogDownloaded(
-      fit::closure on_backlog_downloaded_callback) override;
-  void SetSyncWatcher(SyncStateWatcher* watcher) override;
-};
-
-}  // namespace sync_coordinator
-
-#endif  // PERIDOT_BIN_LEDGER_SYNC_COORDINATOR_TESTING_PAGE_SYNC_EMPTY_IMPL_H_
diff --git a/bin/ledger/sync_helper/BUILD.gn b/bin/ledger/sync_helper/BUILD.gn
deleted file mode 100644
index dfbb3f1..0000000
--- a/bin/ledger/sync_helper/BUILD.gn
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("sync_helper") {
-  sources = [
-    "mutable.h",
-    "sync_helper.cc",
-    "sync_helper.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fxl",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "mutable_unittest.cc",
-    "sync_helper_unittest.cc",
-  ]
-
-  deps = [
-    ":sync_helper",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/sync_helper/mutable.h b/bin/ledger/sync_helper/mutable.h
deleted file mode 100644
index c198c7a..0000000
--- a/bin/ledger/sync_helper/mutable.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_SYNC_HELPER_MUTABLE_H_
-#define PERIDOT_BIN_LEDGER_SYNC_HELPER_MUTABLE_H_
-
-#include <utility>
-
-namespace ledger {
-
-// This class wraps a type A so that a const instance of Mutable<A> can still
-// mutate the internal A object.
-// It is used to capture a mutable variable in a non mutable lambda:
-// [b = Mutable(false)] {
-//   *b = true;
-// }
-template <typename A>
-class Mutable {
- public:
-  explicit Mutable(A value) : value_(std::move(value)) {}
-  Mutable(Mutable&&) = default;
-  Mutable<A>& operator=(Mutable&&) = default;
-
-  A& operator*() const { return value_; }
-
-  A* operator->() const { return &value_; }
-
- private:
-  mutable A value_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_SYNC_HELPER_MUTABLE_H_
diff --git a/bin/ledger/sync_helper/mutable_unittest.cc b/bin/ledger/sync_helper/mutable_unittest.cc
deleted file mode 100644
index 3f0664f..0000000
--- a/bin/ledger/sync_helper/mutable_unittest.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/sync_helper/mutable.h"
-
-#include "gtest/gtest.h"
-
-namespace ledger {
-namespace {
-
-TEST(MutableTest, ConstIsMutable) {
-  const auto foo = Mutable(false);
-  EXPECT_FALSE(*foo);
-  *foo = true;
-  EXPECT_TRUE(*foo);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/sync_helper/sync_helper.cc b/bin/ledger/sync_helper/sync_helper.cc
deleted file mode 100644
index 9220ea3..0000000
--- a/bin/ledger/sync_helper/sync_helper.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/sync_helper/sync_helper.h"
-
-namespace ledger {
-
-SyncHelper::SyncHelper() : current_sync_point_(0), weak_ptr_factory_(this) {}
-
-void SyncHelper::RegisterSynchronizationCallback(
-    fit::function<void()> callback) {
-  if (in_flight_operation_counts_per_sync_point_.empty()) {
-    callback();
-    return;
-  }
-
-  sync_callback_per_sync_points_[current_sync_point_] = std::move(callback);
-  ++current_sync_point_;
-  in_flight_operation_counts_per_sync_point_[current_sync_point_] = 0;
-}
-
-void SyncHelper::CallSynchronizationCallbacks() {
-  for (auto it = in_flight_operation_counts_per_sync_point_.begin();
-       it != in_flight_operation_counts_per_sync_point_.end() &&
-       it->second == 0;
-       it = in_flight_operation_counts_per_sync_point_.erase(it)) {
-    auto sync_point_it = sync_callback_per_sync_points_.find(it->first);
-    if (sync_point_it != sync_callback_per_sync_points_.end()) {
-      sync_point_it->second();
-      sync_callback_per_sync_points_.erase(sync_point_it);
-    }
-  }
-  if (empty() && on_empty_callback_) {
-    on_empty_callback_();
-  }
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/sync_helper/sync_helper.h b/bin/ledger/sync_helper/sync_helper.h
deleted file mode 100644
index c646931..0000000
--- a/bin/ledger/sync_helper/sync_helper.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_SYNC_HELPER_SYNC_HELPER_H_
-#define PERIDOT_BIN_LEDGER_SYNC_HELPER_SYNC_HELPER_H_
-
-#include <map>
-#include <utility>
-
-#include <lib/callback/scoped_callback.h>
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/ledger/sync_helper/mutable.h"
-
-namespace ledger {
-
-// This class allows to register operations and synchronization callback.
-// Operation are registered by wrapping the callback that they are expected to
-// call when they are finished.
-// A synchronization callback is an callback that takes no parameter and that
-// will be called by this class when all operations registered before the
-// synchronization callback have finished.
-class SyncHelper {
- public:
-  SyncHelper();
-  SyncHelper(const SyncHelper&) = delete;
-  SyncHelper& operator=(const SyncHelper&) = delete;
-
-  // Sets the callback to be called every time the SyncHelper is empty.
-  // SyncHelper is empty when no operation is currently in progress.
-  void set_on_empty(fit::closure on_empty_callback) {
-    on_empty_callback_ = std::move(on_empty_callback);
-  }
-
-  // Returns whether there is currently no running operation.
-  bool empty() { return in_flight_operation_counts_per_sync_point_.empty(); }
-
-  // Registers a synchronization callback. |callback| will be called when all
-  // operation wrapped by |WrapOperation| before the call to
-  // |RegisterSynchronizationCallback| have finished.
-  void RegisterSynchronizationCallback(fit::function<void()> callback);
-
-  // Wraps |callback| and marks it as a live operation. No callback registered
-  // through |RegisterSynchronizationCallback| after this call will be called
-  // until the returned callback has been called at least once.
-  template <typename A>
-  auto WrapOperation(A callback) {
-    auto sync_point = current_sync_point_;
-    in_flight_operation_counts_per_sync_point_[sync_point]++;
-    auto on_first_call = fit::defer(callback::MakeScoped(
-        weak_ptr_factory_.GetWeakPtr(), [this, sync_point] {
-          if (--in_flight_operation_counts_per_sync_point_[sync_point] == 0) {
-            CallSynchronizationCallbacks();
-          }
-        }));
-    // The lambda is not marked mutable, because the original callback might
-    // have a const operator, and this should not force the receiver to use
-    // only non-const operator.
-    // Because of this:
-    // - on_first_callcallback| must be wrap into a Mutable because calling it
-    //   is not a const operation.
-    // - |callback| must be wrap into a Mutable because it might not have a
-    //   const operator().
-    return
-        [callback = Mutable(std::move(callback)),
-         on_first_call = Mutable(std::move(on_first_call))](auto&&... params) {
-          (*callback)(std::forward<decltype(params)>(params)...);
-          on_first_call->call();
-        };
-  }
-
- private:
-  // Calls all synchronization callbacks that are currently due.
-  void CallSynchronizationCallbacks();
-
-  // This class operates with a virtual timestamp.
-  // - Each time an operation is registered, it increases the number of
-  //   operation at the current timestamp.
-  // - Each time a synchronization callback is registered, it is either
-  //   immediately called if no operation is in progress, or it is associated
-  //   with the current timestamp, and after this, the current timestamp is
-  //   incremented.
-  // - Each time an operation terminates, it decrements the number of operations
-  //   at the current timestamp. Then the algorithm looks at all timestamp in
-  //   increasing order. Until it finds one for which there is still operation
-  //   in progress, it calls the associated synchronization callback.
-
-  // The current timestamp.
-  int64_t current_sync_point_;
-  // The synchronization callbacks associated to their respective timestamp.
-  std::map<int64_t, fit::function<void()>> sync_callback_per_sync_points_;
-  // The number of operation in progress for each timestamp.
-  std::map<int64_t, int64_t> in_flight_operation_counts_per_sync_point_;
-
-  fit::closure on_empty_callback_;
-
-  // This must be the last member.
-  fxl::WeakPtrFactory<SyncHelper> weak_ptr_factory_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_SYNC_HELPER_SYNC_HELPER_H_
diff --git a/bin/ledger/sync_helper/sync_helper_unittest.cc b/bin/ledger/sync_helper/sync_helper_unittest.cc
deleted file mode 100644
index 6505d23..0000000
--- a/bin/ledger/sync_helper/sync_helper_unittest.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/sync_helper/sync_helper.h"
-
-#include "garnet/public/lib/callback/set_when_called.h"
-#include "gtest/gtest.h"
-
-namespace ledger {
-namespace {
-
-TEST(SyncHelper, NoOperation) {
-  SyncHelper sync_helper;
-  bool called = false;
-  sync_helper.RegisterSynchronizationCallback(callback::SetWhenCalled(&called));
-  EXPECT_TRUE(called);
-}
-
-TEST(SyncHelper, OneOperation) {
-  SyncHelper sync_helper;
-  auto operation = sync_helper.WrapOperation([] {});
-  bool called = false;
-  sync_helper.RegisterSynchronizationCallback(callback::SetWhenCalled(&called));
-  EXPECT_FALSE(called);
-  operation();
-  EXPECT_TRUE(called);
-}
-
-TEST(SyncHelper, TwoSyncCallbacks) {
-  SyncHelper sync_helper;
-  auto operation = sync_helper.WrapOperation([] {});
-  bool called1 = false;
-  bool called2 = false;
-  sync_helper.RegisterSynchronizationCallback(
-      callback::SetWhenCalled(&called1));
-  sync_helper.RegisterSynchronizationCallback(
-      callback::SetWhenCalled(&called2));
-  EXPECT_FALSE(called1);
-  EXPECT_FALSE(called2);
-  operation();
-  EXPECT_TRUE(called1);
-  EXPECT_TRUE(called2);
-}
-
-TEST(SyncHelper, TwoOperation) {
-  SyncHelper sync_helper;
-  auto operation1 = sync_helper.WrapOperation([] {});
-  auto operation2 = sync_helper.WrapOperation([] {});
-  bool called = false;
-  sync_helper.RegisterSynchronizationCallback(callback::SetWhenCalled(&called));
-
-  EXPECT_FALSE(called);
-  operation1();
-  EXPECT_FALSE(called);
-  operation2();
-  EXPECT_TRUE(called);
-}
-
-TEST(SyncHelper, TwoOperationReversed) {
-  SyncHelper sync_helper;
-  auto operation1 = sync_helper.WrapOperation([] {});
-  auto operation2 = sync_helper.WrapOperation([] {});
-  bool called = false;
-  sync_helper.RegisterSynchronizationCallback(callback::SetWhenCalled(&called));
-
-  EXPECT_FALSE(called);
-  operation2();
-  EXPECT_FALSE(called);
-  operation1();
-  EXPECT_TRUE(called);
-}
-
-TEST(SyncHelper, TwoOperationTwoCallbacks) {
-  SyncHelper sync_helper;
-  auto operation1 = sync_helper.WrapOperation([] {});
-  bool called1 = false;
-  sync_helper.RegisterSynchronizationCallback(
-      callback::SetWhenCalled(&called1));
-  auto operation2 = sync_helper.WrapOperation([] {});
-  bool called2 = false;
-  sync_helper.RegisterSynchronizationCallback(
-      callback::SetWhenCalled(&called2));
-
-  EXPECT_FALSE(called1);
-  EXPECT_FALSE(called2);
-  operation1();
-  EXPECT_TRUE(called1);
-  EXPECT_FALSE(called2);
-  operation2();
-  EXPECT_TRUE(called1);
-  EXPECT_TRUE(called2);
-}
-
-TEST(SyncHelper, CallOperationTwice) {
-  SyncHelper sync_helper;
-  int operation_count = 0;
-  auto operation = sync_helper.WrapOperation([&] { ++operation_count; });
-  int called_count = 0;
-  sync_helper.RegisterSynchronizationCallback([&] { ++called_count; });
-
-  EXPECT_EQ(0, operation_count);
-  EXPECT_EQ(0, called_count);
-  operation();
-  EXPECT_EQ(1, operation_count);
-  EXPECT_EQ(1, called_count);
-  operation();
-  EXPECT_EQ(2, operation_count);
-  EXPECT_EQ(1, called_count);
-}
-
-TEST(SyncHelper, WrapMutableLambda) {
-  SyncHelper sync_helper;
-  bool called = false;
-  sync_helper.WrapOperation([&called]() mutable { called = true; })();
-  EXPECT_TRUE(called);
-}
-
-TEST(SyncHelper, StoreConstWrappedOperation) {
-  SyncHelper sync_helper;
-  bool called = false;
-  const auto operation =
-      sync_helper.WrapOperation(callback::SetWhenCalled(&called));
-  EXPECT_FALSE(called);
-  operation();
-  EXPECT_TRUE(called);
-}
-
-TEST(SyncHelper, OnEmptyCallback) {
-  SyncHelper sync_helper;
-  bool on_empty_called;
-  sync_helper.set_on_empty(callback::SetWhenCalled(&on_empty_called));
-  EXPECT_TRUE(sync_helper.empty());
-  const auto operation = sync_helper.WrapOperation([] {});
-  EXPECT_FALSE(on_empty_called);
-  EXPECT_FALSE(sync_helper.empty());
-  operation();
-  EXPECT_TRUE(on_empty_called);
-  EXPECT_TRUE(sync_helper.empty());
-}
-
-TEST(SyncHelper, SyncWithDeletedOperation) {
-  SyncHelper sync_helper;
-  bool called;
-  fit::closure operation = sync_helper.WrapOperation([] {});
-  sync_helper.RegisterSynchronizationCallback(callback::SetWhenCalled(&called));
-  EXPECT_FALSE(called);
-  operation = nullptr;
-  EXPECT_TRUE(called);
-}
-
-TEST(SyncHelper, OnEmptyWithDeletedOperation) {
-  SyncHelper sync_helper;
-  bool on_empty_called;
-  sync_helper.set_on_empty(callback::SetWhenCalled(&on_empty_called));
-  fit::closure operation = sync_helper.WrapOperation([] {});
-  EXPECT_FALSE(on_empty_called);
-  operation = nullptr;
-  EXPECT_TRUE(on_empty_called);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/testing/BUILD.gn b/bin/ledger/testing/BUILD.gn
deleted file mode 100644
index 6a4508b..0000000
--- a/bin/ledger/testing/BUILD.gn
+++ /dev/null
@@ -1,157 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [
-  "//peridot/bin/ledger/*",
-  "//peridot/bin/cloud_provider_firestore/validation",
-]
-
-source_set("lib") {
-  testonly = true
-
-  sources = [
-    "data_generator.cc",
-    "data_generator.h",
-    "fake_disk_cleanup_manager.h",
-    "get_page_ensure_initialized.cc",
-    "get_page_ensure_initialized.h",
-    "inspect.cc",
-    "inspect.h",
-    "ledger_matcher.cc",
-    "ledger_matcher.h",
-    "page_data_generator.cc",
-    "page_data_generator.h",
-    "quit_on_error.cc",
-    "quit_on_error.h",
-    "run_with_tracing.cc",
-    "run_with_tracing.h",
-    "sync_params.cc",
-    "sync_params.h",
-    "test_with_environment.cc",
-    "test_with_environment.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp/testing",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//garnet/public/lib/timekeeper:testing",
-    "//peridot/bin/ledger/app:lib",
-    "//peridot/bin/ledger/environment",
-    "//peridot/bin/ledger/fidl/include",
-    "//peridot/bin/ledger/storage/public:public",
-    "//peridot/lib/convert",
-    "//peridot/lib/firebase_auth/testing:service_account",
-    "//peridot/lib/rng:testing",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//third_party/googletest:gmock",
-    "//third_party/googletest:gtest",
-    "//third_party/rapidjson",
-    "//zircon/public/lib/fit",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.net.oldhttp",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/coroutine",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/lib/firebase_auth/testing",
-    "//peridot/lib/firebase_auth/testing:json_schema",
-    "//peridot/lib/firebase_auth/testing:service_account",
-    "//third_party/boringssl",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("ledger_instance_factory") {
-  testonly = true
-
-  sources = [
-    "blocking_callback_waiter.cc",
-    "blocking_callback_waiter.h",
-    "ledger_app_instance_factory.cc",
-    "ledger_app_instance_factory.h",
-    "loop_controller.h",
-    "loop_controller_real_loop.cc",
-    "loop_controller_real_loop.h",
-    "loop_controller_test_loop.cc",
-    "loop_controller_test_loop.h",
-  ]
-
-  public_deps = [
-    ":lib",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/bin/ledger/fidl/include",
-    "//peridot/bin/ledger/fidl_helpers",
-    "//peridot/lib/scoped_tmpfs",
-    "//peridot/public/fidl/fuchsia.ledger",
-  ]
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fsl",
-    "//peridot/lib/convert",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-# TODO(https://fuchsia.atlassian.net/projects/LE/issues/LE-607): Consider moving to benchmarks/.
-source_set("get_ledger") {
-  testonly = true
-
-  sources = [
-    "get_ledger.cc",
-    "get_ledger.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/fidl/include",
-    "//peridot/bin/ledger/filesystem",
-    "//peridot/lib/convert",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-    "//zircon/public/lib/fit",
-  ]
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//peridot/bin/ledger/fidl",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "blocking_callback_waiter_unittest.cc",
-    "ledger_matcher_unittest.cc",
-  ]
-
-  deps = [
-    ":ledger_instance_factory",
-    ":lib",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fxl",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/testing/blocking_callback_waiter.cc b/bin/ledger/testing/blocking_callback_waiter.cc
deleted file mode 100644
index 44e0407..0000000
--- a/bin/ledger/testing/blocking_callback_waiter.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/blocking_callback_waiter.h"
-
-#include <lib/fit/defer.h>
-
-namespace ledger {
-
-BlockingCallbackWaiter::BlockingCallbackWaiter(LoopController* loop_controller)
-    : loop_controller_(loop_controller) {}
-
-BlockingCallbackWaiter::~BlockingCallbackWaiter() {}
-
-fit::function<void()> BlockingCallbackWaiter::GetCallback() {
-  live_callbacks_count_++;
-  auto on_callback_deletion = fit::defer([this] {
-    live_callbacks_count_--;
-    if (live_callbacks_count_ == 0 && running_) {
-      // All callbacks have went out of scope while |RunUntilCalled|: no other
-      // callback can stop the loop, exit immediately.
-      loop_controller_->StopLoop();
-    }
-  });
-  return [this, on_callback_deletion = std::move(on_callback_deletion)] {
-    ++callback_called_count_;
-    if (running_) {
-      // Called during |RunUntilCalled|: exit from the loop.
-      loop_controller_->StopLoop();
-    }
-  };
-}
-
-bool BlockingCallbackWaiter::RunUntilCalled() {
-  FXL_DCHECK(!running_);
-  running_ = true;
-  auto cleanup = fit::defer([this] { running_ = false; });
-  while (NotCalledYet()) {
-    if (live_callbacks_count_ == 0) {
-      // Do not start the loop if no callback is available to stop it.
-      return false;
-    }
-    loop_controller_->RunLoop();
-  }
-  ++run_until_called_count_;
-  return true;
-}
-
-bool BlockingCallbackWaiter::NotCalledYet() {
-  return callback_called_count_ <= run_until_called_count_;
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/blocking_callback_waiter.h b/bin/ledger/testing/blocking_callback_waiter.h
deleted file mode 100644
index 11303cd..0000000
--- a/bin/ledger/testing/blocking_callback_waiter.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_BLOCKING_CALLBACK_WAITER_H_
-#define PERIDOT_BIN_LEDGER_TESTING_BLOCKING_CALLBACK_WAITER_H_
-
-#include "peridot/bin/ledger/testing/loop_controller.h"
-
-namespace ledger {
-
-// An implementation of |CallbackWaiter| that will block indefinitely until its
-// callback is called.
-class BlockingCallbackWaiter : public CallbackWaiter {
- public:
-  explicit BlockingCallbackWaiter(LoopController* loop_controller);
-  BlockingCallbackWaiter(const BlockingCallbackWaiter&) = delete;
-  BlockingCallbackWaiter& operator=(const BlockingCallbackWaiter&) = delete;
-  ~BlockingCallbackWaiter() override;
-
-  fit::function<void()> GetCallback() override;
-  bool RunUntilCalled() override;
-  bool NotCalledYet() override;
-
- private:
-  LoopController* loop_controller_;
-  size_t callback_called_count_ = 0;
-  size_t run_until_called_count_ = 0;
-  size_t live_callbacks_count_ = 0;
-  // Whether the waiter is currently in the |RunUntilCalled| method.
-  bool running_ = false;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_BLOCKING_CALLBACK_WAITER_H_
diff --git a/bin/ledger/testing/blocking_callback_waiter_unittest.cc b/bin/ledger/testing/blocking_callback_waiter_unittest.cc
deleted file mode 100644
index 0e6c45f..0000000
--- a/bin/ledger/testing/blocking_callback_waiter_unittest.cc
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/blocking_callback_waiter.h"
-
-#include <memory>
-
-#include <lib/fit/function.h>
-
-#include "gtest/gtest.h"
-
-namespace ledger {
-namespace {
-
-class FakeLoopController : public LoopController {
- public:
-  FakeLoopController(fit::function<void()> on_run,
-                     fit::function<void()> on_stop)
-      : on_run_(std::move(on_run)), on_stop_(std::move(on_stop)) {}
-  FakeLoopController(const FakeLoopController&) = delete;
-  FakeLoopController& operator=(const FakeLoopController&) = delete;
-
-  void RunLoop() override { on_run_(); };
-
-  void StopLoop() override { on_stop_(); };
-
-  std::unique_ptr<SubLoop> StartNewLoop() override {
-    FXL_NOTREACHED();
-    return nullptr;
-  }
-
-  std::unique_ptr<CallbackWaiter> NewWaiter() override {
-    return std::make_unique<BlockingCallbackWaiter>(this);
-  }
-
-  async_dispatcher_t* dispatcher() override {
-    FXL_NOTREACHED();
-    return nullptr;
-  }
-
-  bool RunLoopUntil(fit::function<bool()> /* condition */) override {
-    FXL_NOTREACHED();
-    return false;
-  }
-
-  void RunLoopFor(zx::duration /* duration */) override { FXL_NOTREACHED(); }
-
- private:
-  fit::function<void()> on_run_;
-  fit::function<void()> on_stop_;
-};
-
-TEST(BlockingCallbackWaiterTest, PreCall) {
-  size_t nb_run = 0;
-  size_t nb_stop = 0;
-  FakeLoopController loop_controller([&] { ++nb_run; }, [&] { ++nb_stop; });
-
-  auto waiter = loop_controller.NewWaiter();
-  auto callback = waiter->GetCallback();
-
-  callback();
-  ASSERT_TRUE(waiter->RunUntilCalled());
-
-  EXPECT_EQ(0u, nb_run);
-  EXPECT_EQ(0u, nb_stop);
-}
-
-TEST(BlockingCallbackWaiterTest, MultipleGetCallback) {
-  size_t nb_run = 0;
-  size_t nb_stop = 0;
-  FakeLoopController loop_controller([&] { ++nb_run; }, [&] { ++nb_stop; });
-
-  auto waiter = loop_controller.NewWaiter();
-
-  waiter->GetCallback()();
-  waiter->GetCallback()();
-
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  ASSERT_TRUE(waiter->RunUntilCalled());
-
-  EXPECT_EQ(0u, nb_run);
-  EXPECT_EQ(0u, nb_stop);
-}
-
-TEST(BlockingCallbackWaiterTest, PostCall) {
-  size_t nb_run = 0;
-  size_t nb_stop = 0;
-  std::unique_ptr<fit::closure> callback;
-  FakeLoopController loop_controller(
-      [&] {
-        ++nb_run;
-        if (callback) {
-          (*callback)();
-        }
-      },
-      [&] { ++nb_stop; });
-
-  auto waiter = loop_controller.NewWaiter();
-  callback = std::make_unique<fit::closure>(waiter->GetCallback());
-
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(1u, nb_run);
-  EXPECT_EQ(1u, nb_stop);
-
-  // loop_controller must outlive the waiter.
-  callback.reset();
-}
-
-TEST(BlockingCallbackWaiterTest, MultipleRunUntilCalled) {
-  size_t nb_run = 0;
-  size_t nb_stop = 0;
-  std::unique_ptr<fit::closure> callback;
-  FakeLoopController loop_controller(
-      [&] {
-        ++nb_run;
-        if (callback) {
-          (*callback)();
-        }
-      },
-      [&] { ++nb_stop; });
-
-  auto waiter = loop_controller.NewWaiter();
-  callback = std::make_unique<fit::closure>(waiter->GetCallback());
-
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(2u, nb_run);
-  EXPECT_EQ(2u, nb_stop);
-
-  // loop_controller must outlive the waiter.
-  callback.reset();
-}
-
-TEST(BlockingCallbackWaiterTest, InterleaveRunUntilCalledAndCall) {
-  size_t nb_run = 0;
-  size_t nb_stop = 0;
-  std::unique_ptr<fit::closure> callback;
-  FakeLoopController loop_controller(
-      [&] {
-        ++nb_run;
-        if (callback) {
-          (*callback)();
-        }
-      },
-      [&] { ++nb_stop; });
-
-  auto waiter = loop_controller.NewWaiter();
-  callback = std::make_unique<fit::closure>(waiter->GetCallback());
-
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(1u, nb_run);
-  EXPECT_EQ(1u, nb_stop);
-
-  (*callback)();
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(1u, nb_run);
-  EXPECT_EQ(1u, nb_stop);
-
-  // loop_controller must outlive the waiter.
-  callback.reset();
-}
-
-TEST(BlockingCallbackWaiterTest, NotCalledYet) {
-  FakeLoopController loop_controller([] {}, [] {});
-  auto waiter = loop_controller.NewWaiter();
-  auto callback = waiter->GetCallback();
-
-  EXPECT_TRUE(waiter->NotCalledYet());
-
-  callback();
-  EXPECT_FALSE(waiter->NotCalledYet());
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_TRUE(waiter->NotCalledYet());
-
-  callback();
-  callback();
-  EXPECT_FALSE(waiter->NotCalledYet());
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_FALSE(waiter->NotCalledYet());
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_TRUE(waiter->NotCalledYet());
-}
-
-TEST(BlockingCallbackWaiterTest, FailedWhenNoCallbackIsAlive) {
-  std::unique_ptr<fit::closure> on_run_callback;
-  FakeLoopController loop_controller(
-      [&] {
-        if (on_run_callback) {
-          (*on_run_callback)();
-        }
-      },
-      [] {});
-  auto waiter = loop_controller.NewWaiter();
-
-  EXPECT_FALSE(waiter->RunUntilCalled());
-
-  fit::closure callback = waiter->GetCallback();
-  callback = nullptr;
-  EXPECT_FALSE(waiter->RunUntilCalled());
-
-  callback = waiter->GetCallback();
-  on_run_callback = std::make_unique<fit::closure>([&] { callback = nullptr; });
-  EXPECT_FALSE(waiter->RunUntilCalled());
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/testing/cloud_provider/BUILD.gn b/bin/ledger/testing/cloud_provider/BUILD.gn
deleted file mode 100644
index 9b56236..0000000
--- a/bin/ledger/testing/cloud_provider/BUILD.gn
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("cloud_provider") {
-  testonly = true
-
-  sources = [
-    "fake_cloud_provider.cc",
-    "fake_cloud_provider.h",
-    "fake_device_set.cc",
-    "fake_device_set.h",
-    "fake_page_cloud.cc",
-    "fake_page_cloud.h",
-    "types.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/fidl/include",
-    "//peridot/lib/commit_pack",
-  ]
-
-  deps = [
-    "//peridot/bin/ledger/fidl_helpers",
-    "//peridot/lib/convert",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-    "//third_party/murmurhash",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/testing/cloud_provider/fake_cloud_provider.cc b/bin/ledger/testing/cloud_provider/fake_cloud_provider.cc
deleted file mode 100644
index c4da516..0000000
--- a/bin/ledger/testing/cloud_provider/fake_cloud_provider.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/cloud_provider/fake_cloud_provider.h"
-
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-FakeCloudProvider::Builder::Builder() = default;
-
-FakeCloudProvider::Builder::~Builder() = default;
-
-FakeCloudProvider::Builder& FakeCloudProvider::Builder::SetInjectNetworkError(
-    InjectNetworkError inject_network_error) {
-  inject_network_error_ = inject_network_error;
-  return *this;
-}
-
-FakeCloudProvider::Builder& FakeCloudProvider::Builder::SetCloudEraseOnCheck(
-    CloudEraseOnCheck cloud_erase_on_check) {
-  cloud_erase_on_check_ = cloud_erase_on_check;
-  return *this;
-}
-
-FakeCloudProvider::Builder&
-FakeCloudProvider::Builder::SetCloudEraseFromWatcher(
-    CloudEraseFromWatcher cloud_erase_from_watcher) {
-  cloud_erase_from_watcher_ = cloud_erase_from_watcher;
-  return *this;
-}
-
-std::unique_ptr<FakeCloudProvider> FakeCloudProvider::Builder::Build() {
-  return std::make_unique<FakeCloudProvider>(*this);
-}
-
-FakeCloudProvider::FakeCloudProvider(const Builder& builder)
-    : device_set_(builder.cloud_erase_on_check_,
-                  builder.cloud_erase_from_watcher_),
-      inject_network_error_(builder.inject_network_error_) {}
-
-FakeCloudProvider::FakeCloudProvider() : FakeCloudProvider(Builder()) {}
-
-FakeCloudProvider::~FakeCloudProvider() {}
-
-void FakeCloudProvider::GetDeviceSet(
-    fidl::InterfaceRequest<cloud_provider::DeviceSet> device_set,
-    GetDeviceSetCallback callback) {
-  device_set_.AddBinding(std::move(device_set));
-  callback(cloud_provider::Status::OK);
-}
-
-void FakeCloudProvider::GetPageCloud(
-    std::vector<uint8_t> app_id, std::vector<uint8_t> page_id,
-    fidl::InterfaceRequest<cloud_provider::PageCloud> page_cloud,
-    GetPageCloudCallback callback) {
-  const std::string key =
-      convert::ToString(app_id) + "_" + convert::ToString(page_id);
-  auto it = page_clouds_.find(key);
-  if (it != page_clouds_.end()) {
-    it->second.Bind(std::move(page_cloud));
-    callback(cloud_provider::Status::OK);
-    return;
-  }
-
-  auto ret =
-      page_clouds_.emplace(std::piecewise_construct, std::forward_as_tuple(key),
-                           std::forward_as_tuple(inject_network_error_));
-  ret.first->second.Bind(std::move(page_cloud));
-  callback(cloud_provider::Status::OK);
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/cloud_provider/fake_cloud_provider.h b/bin/ledger/testing/cloud_provider/fake_cloud_provider.h
deleted file mode 100644
index f9e0dee..0000000
--- a/bin/ledger/testing/cloud_provider/fake_cloud_provider.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_CLOUD_PROVIDER_H_
-#define PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_CLOUD_PROVIDER_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/fidl_helpers/bound_interface_set.h"
-#include "peridot/bin/ledger/testing/cloud_provider/fake_device_set.h"
-#include "peridot/bin/ledger/testing/cloud_provider/fake_page_cloud.h"
-#include "peridot/bin/ledger/testing/cloud_provider/types.h"
-
-namespace ledger {
-
-class FakeCloudProvider : public cloud_provider::CloudProvider {
- public:
-  class Builder {
-   public:
-    Builder();
-    ~Builder();
-
-    Builder& SetInjectNetworkError(InjectNetworkError inject_network_error);
-    Builder& SetCloudEraseOnCheck(CloudEraseOnCheck cloud_erase_on_check);
-    Builder& SetCloudEraseFromWatcher(
-        CloudEraseFromWatcher cloud_erase_from_watcher);
-
-    std::unique_ptr<FakeCloudProvider> Build();
-
-   private:
-    friend FakeCloudProvider;
-
-    InjectNetworkError inject_network_error_ = InjectNetworkError::NO;
-    CloudEraseOnCheck cloud_erase_on_check_ = CloudEraseOnCheck::NO;
-    CloudEraseFromWatcher cloud_erase_from_watcher_ = CloudEraseFromWatcher::NO;
-  };
-
-  FakeCloudProvider();
-  explicit FakeCloudProvider(const Builder& builder);
-  ~FakeCloudProvider() override;
-
- private:
-  void GetDeviceSet(
-      fidl::InterfaceRequest<cloud_provider::DeviceSet> device_set,
-      GetDeviceSetCallback callback) override;
-
-  void GetPageCloud(
-      std::vector<uint8_t> app_id, std::vector<uint8_t> page_id,
-      fidl::InterfaceRequest<cloud_provider::PageCloud> page_cloud,
-      GetPageCloudCallback callback) override;
-
-  fidl_helpers::BoundInterfaceSet<cloud_provider::DeviceSet, FakeDeviceSet>
-      device_set_;
-
-  callback::AutoCleanableMap<std::string, FakePageCloud> page_clouds_;
-
-  InjectNetworkError inject_network_error_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeCloudProvider);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_CLOUD_PROVIDER_H_
diff --git a/bin/ledger/testing/cloud_provider/fake_device_set.cc b/bin/ledger/testing/cloud_provider/fake_device_set.cc
deleted file mode 100644
index dfd9d55..0000000
--- a/bin/ledger/testing/cloud_provider/fake_device_set.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/cloud_provider/fake_device_set.h"
-
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-FakeDeviceSet::FakeDeviceSet(CloudEraseOnCheck cloud_erase_on_check,
-                             CloudEraseFromWatcher cloud_erase_from_watcher)
-    : cloud_erase_on_check_(cloud_erase_on_check),
-      cloud_erase_from_watcher_(cloud_erase_from_watcher) {}
-
-FakeDeviceSet::~FakeDeviceSet() {}
-
-void FakeDeviceSet::CheckFingerprint(std::vector<uint8_t> fingerprint,
-                                     CheckFingerprintCallback callback) {
-  if (cloud_erase_on_check_ == CloudEraseOnCheck::YES ||
-      !fingerprints_.count(convert::ToString(fingerprint))) {
-    callback(cloud_provider::Status::NOT_FOUND);
-    return;
-  }
-
-  callback(cloud_provider::Status::OK);
-}
-
-void FakeDeviceSet::SetFingerprint(std::vector<uint8_t> fingerprint,
-                                   SetFingerprintCallback callback) {
-  fingerprints_.insert(convert::ToString(fingerprint));
-  callback(cloud_provider::Status::OK);
-}
-
-void FakeDeviceSet::SetWatcher(
-    std::vector<uint8_t> /*fingerprint*/,
-    fidl::InterfaceHandle<cloud_provider::DeviceSetWatcher> watcher,
-    SetWatcherCallback callback) {
-  watcher_ = watcher.Bind();
-  callback(cloud_provider::Status::OK);
-
-  if (cloud_erase_from_watcher_ == CloudEraseFromWatcher::YES) {
-    watcher_->OnCloudErased();
-  }
-}
-
-void FakeDeviceSet::Erase(EraseCallback callback) {
-  fingerprints_.clear();
-  if (watcher_.is_bound()) {
-    watcher_->OnCloudErased();
-  }
-  callback(cloud_provider::Status::OK);
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/cloud_provider/fake_device_set.h b/bin/ledger/testing/cloud_provider/fake_device_set.h
deleted file mode 100644
index 90a3787..0000000
--- a/bin/ledger/testing/cloud_provider/fake_device_set.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_DEVICE_SET_H_
-#define PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_DEVICE_SET_H_
-
-#include <set>
-#include <string>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/testing/cloud_provider/types.h"
-
-namespace ledger {
-
-class FakeDeviceSet : public cloud_provider::DeviceSet {
- public:
-  FakeDeviceSet(CloudEraseOnCheck cloud_erase_on_check,
-                CloudEraseFromWatcher cloud_erase_from_watcher);
-  ~FakeDeviceSet() override;
-
-  void set_on_empty(fit::closure on_empty) { on_empty_ = std::move(on_empty); }
-
- private:
-  void CheckFingerprint(std::vector<uint8_t> fingerprint,
-                        CheckFingerprintCallback callback) override;
-
-  void SetFingerprint(std::vector<uint8_t> fingerprint,
-                      SetFingerprintCallback callback) override;
-
-  void SetWatcher(
-      std::vector<uint8_t> fingerprint,
-      fidl::InterfaceHandle<cloud_provider::DeviceSetWatcher> watcher,
-      SetWatcherCallback callback) override;
-
-  void Erase(EraseCallback callback) override;
-
-  const CloudEraseOnCheck cloud_erase_on_check_ = CloudEraseOnCheck::NO;
-
-  const CloudEraseFromWatcher cloud_erase_from_watcher_ =
-      CloudEraseFromWatcher::NO;
-
-  fit::closure on_empty_;
-
-  std::set<std::string> fingerprints_;
-
-  // Watcher set by the client.
-  cloud_provider::DeviceSetWatcherPtr watcher_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeDeviceSet);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_DEVICE_SET_H_
diff --git a/bin/ledger/testing/cloud_provider/fake_page_cloud.cc b/bin/ledger/testing/cloud_provider/fake_page_cloud.cc
deleted file mode 100644
index 589a9f2..0000000
--- a/bin/ledger/testing/cloud_provider/fake_page_cloud.cc
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/cloud_provider/fake_page_cloud.h"
-
-#include <functional>
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/lib/convert/convert.h"
-#include "third_party/murmurhash/murmurhash.h"
-
-namespace ledger {
-
-namespace {
-
-// Number of errors to inject before allowing a request to succeed when
-// configured to inject network errors.
-constexpr size_t kInitialRemainingErrorsToInject = 2;
-
-// Seed for the murmur hash algorithm to ensure different request signatures.
-constexpr uint32_t kAddCommitsSeed = 1u;
-constexpr uint32_t kGetCommitsSeed = 2u;
-constexpr uint32_t kAddObjectSeed = 3u;
-constexpr uint32_t kGetObjectSeed = 4u;
-
-cloud_provider::Token PositionToToken(size_t position) {
-  std::string bytes(
-      std::string(reinterpret_cast<char*>(&position), sizeof(position)));
-  cloud_provider::Token result;
-  result.opaque_id = convert::ToArray(bytes);
-  return result;
-}
-
-bool TokenToPosition(const std::unique_ptr<cloud_provider::Token>& token,
-                     size_t* result) {
-  if (!token) {
-    *result = 0u;
-    return true;
-  }
-
-  if (token->opaque_id.size() != sizeof(*result)) {
-    return false;
-  }
-
-  memcpy(result, token->opaque_id.data(), sizeof(*result));
-  return true;
-}
-
-uint64_t GetVectorSignature(const std::vector<uint8_t>& vector,
-                            uint32_t seed) {
-  return murmurhash(reinterpret_cast<const char*>(vector.data()),
-                    vector.size(), seed);
-}
-
-uint64_t GetCommitsSignature(
-    const std::vector<cloud_provider::CommitPackEntry>& commits) {
-  uint64_t result = 0;
-  for (const auto& commit : commits) {
-    result = result ^
-             GetVectorSignature(convert::ToArray(commit.id), kAddCommitsSeed);
-  }
-  return result;
-}
-
-}  // namespace
-
-class FakePageCloud::WatcherContainer {
- public:
-  WatcherContainer(cloud_provider::PageCloudWatcherPtr watcher,
-                   size_t next_commit_index);
-
-  void SendCommits(std::vector<cloud_provider::CommitPackEntry> commits,
-                   size_t next_commit_index, fit::closure on_ack);
-
-  size_t NextCommitIndex() { return next_commit_index_; }
-
-  bool WaitingForWatcherAck() { return waiting_for_watcher_ack_; }
-
-  void set_on_empty(fit::closure on_empty) {
-    watcher_.set_error_handler(
-        [on_empty = std::move(on_empty)](zx_status_t status) { on_empty(); });
-  }
-
- private:
-  cloud_provider::PageCloudWatcherPtr watcher_;
-  // Whether we're still waiting for the watcher to ack the previous commit
-  // notification.
-  bool waiting_for_watcher_ack_ = false;
-
-  // Index of the first commit to be sent to the watcher.
-  size_t next_commit_index_ = 0;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(WatcherContainer);
-};
-
-FakePageCloud::WatcherContainer::WatcherContainer(
-    cloud_provider::PageCloudWatcherPtr watcher, size_t next_commit_index)
-    : watcher_(std::move(watcher)), next_commit_index_(next_commit_index) {}
-
-void FakePageCloud::WatcherContainer::SendCommits(
-    std::vector<cloud_provider::CommitPackEntry> commits,
-    size_t next_commit_index, fit::closure on_ack) {
-  FXL_DCHECK(watcher_.is_bound());
-  FXL_DCHECK(!waiting_for_watcher_ack_);
-  FXL_DCHECK(!commits.empty());
-
-  waiting_for_watcher_ack_ = true;
-  next_commit_index_ = next_commit_index;
-  cloud_provider::CommitPack commit_pack;
-  if (!cloud_provider::EncodeCommitPack(commits, &commit_pack)) {
-    watcher_->OnError(cloud_provider::Status::INTERNAL_ERROR);
-    return;
-  }
-  watcher_->OnNewCommits(std::move(commit_pack),
-                         PositionToToken(next_commit_index),
-                         [this, on_ack = std::move(on_ack)] {
-                           waiting_for_watcher_ack_ = false;
-                           on_ack();
-                         });
-}
-
-FakePageCloud::FakePageCloud(InjectNetworkError inject_network_error)
-    : inject_network_error_(inject_network_error) {
-  bindings_.set_empty_set_handler([this] {
-    if (on_empty_) {
-      on_empty_();
-    }
-  });
-}
-
-FakePageCloud::~FakePageCloud() {}
-
-void FakePageCloud::Bind(
-    fidl::InterfaceRequest<cloud_provider::PageCloud> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void FakePageCloud::SendPendingCommits() {
-  for (auto& container : containers_) {
-    if (container.WaitingForWatcherAck() ||
-        container.NextCommitIndex() >= commits_.size()) {
-      continue;
-    }
-
-    std::vector<cloud_provider::CommitPackEntry> commits;
-    for (size_t i = container.NextCommitIndex(); i < commits_.size(); i++) {
-      commits.push_back(commits_[i]);
-    }
-
-    container.SendCommits(std::move(commits), commits_.size(),
-                          [this] { SendPendingCommits(); });
-  }
-}
-
-bool FakePageCloud::MustReturnError(uint64_t request_signature) {
-  switch (inject_network_error_) {
-    case InjectNetworkError::NO:
-      return false;
-    case InjectNetworkError::YES:
-      auto it = remaining_errors_to_inject_.find(request_signature);
-      if (it == remaining_errors_to_inject_.end()) {
-        remaining_errors_to_inject_[request_signature] =
-            kInitialRemainingErrorsToInject;
-        it = remaining_errors_to_inject_.find(request_signature);
-      }
-      if (it->second) {
-        it->second--;
-        return true;
-      }
-      remaining_errors_to_inject_.erase(it);
-      return false;
-  }
-}
-
-void FakePageCloud::AddCommits(cloud_provider::CommitPack commits,
-                               AddCommitsCallback callback) {
-  std::vector<cloud_provider::CommitPackEntry> commit_entries;
-  if (!cloud_provider::DecodeCommitPack(commits, &commit_entries)) {
-    callback(cloud_provider::Status::INTERNAL_ERROR);
-    return;
-  }
-
-  if (MustReturnError(GetCommitsSignature(commit_entries))) {
-    callback(cloud_provider::Status::NETWORK_ERROR);
-    return;
-  }
-  std::move(commit_entries.begin(), commit_entries.end(),
-            std::back_inserter(commits_));
-  SendPendingCommits();
-  callback(cloud_provider::Status::OK);
-}
-
-void FakePageCloud::GetCommits(
-    std::unique_ptr<cloud_provider::Token> min_position_token,
-    GetCommitsCallback callback) {
-  if (MustReturnError(GetVectorSignature(
-          min_position_token ? min_position_token->opaque_id : std::vector<uint8_t>(),
-          kGetCommitsSeed))) {
-    callback(cloud_provider::Status::NETWORK_ERROR, nullptr, nullptr);
-    return;
-  }
-  std::vector<cloud_provider::CommitPackEntry> result;
-  size_t start = 0u;
-  if (!TokenToPosition(min_position_token, &start)) {
-    callback(cloud_provider::Status::ARGUMENT_ERROR, nullptr, nullptr);
-    return;
-  }
-
-  for (size_t i = start; i < commits_.size(); i++) {
-    result.push_back(commits_[i]);
-  }
-  std::unique_ptr<cloud_provider::Token> token;
-  if (!result.empty()) {
-    // This will cause the last commit to be delivered again when the token is
-    // used for the next GetCommits() call. This is allowed by the FIDL contract
-    // and should be handled correctly by the client.
-    token = fidl::MakeOptional(PositionToToken(commits_.size() - 1));
-  }
-  cloud_provider::CommitPack commit_pack;
-  if (!cloud_provider::EncodeCommitPack(result, &commit_pack)) {
-    callback(cloud_provider::Status::INTERNAL_ERROR, nullptr, nullptr);
-    return;
-  }
-  callback(cloud_provider::Status::OK,
-           fidl::MakeOptional(std::move(commit_pack)), std::move(token));
-}
-
-void FakePageCloud::AddObject(std::vector<uint8_t> id,
-                              fuchsia::mem::Buffer data,
-                              AddObjectCallback callback) {
-  if (MustReturnError(GetVectorSignature(id, kAddObjectSeed))) {
-    callback(cloud_provider::Status::NETWORK_ERROR);
-    return;
-  }
-  std::string bytes;
-  if (!fsl::StringFromVmo(data, &bytes)) {
-    callback(cloud_provider::Status::INTERNAL_ERROR);
-    return;
-  }
-
-  objects_[convert::ToString(id)] = bytes;
-  callback(cloud_provider::Status::OK);
-}
-
-void FakePageCloud::GetObject(std::vector<uint8_t> id,
-                              GetObjectCallback callback) {
-  if (MustReturnError(GetVectorSignature(id, kGetObjectSeed))) {
-    callback(cloud_provider::Status::NETWORK_ERROR, nullptr);
-    return;
-  }
-  std::string id_str = convert::ToString(id);
-  if (!objects_.count(id_str)) {
-    callback(cloud_provider::Status::NOT_FOUND, nullptr);
-    return;
-  }
-  ::fuchsia::mem::Buffer buffer;
-  if (!fsl::VmoFromString(objects_[id_str], &buffer)) {
-    callback(cloud_provider::Status::INTERNAL_ERROR, nullptr);
-    return;
-  }
-  callback(cloud_provider::Status::OK, fidl::MakeOptional(std::move(buffer)));
-}
-
-void FakePageCloud::SetWatcher(
-    std::unique_ptr<cloud_provider::Token> min_position_token,
-    fidl::InterfaceHandle<cloud_provider::PageCloudWatcher> watcher,
-    SetWatcherCallback callback) {
-  // TODO(qsr): Inject errors here when LE-438 is fixed.
-  auto watcher_ptr = watcher.Bind();
-
-  size_t first_pending_commit_index;
-  if (!TokenToPosition(min_position_token, &first_pending_commit_index)) {
-    callback(cloud_provider::Status::ARGUMENT_ERROR);
-    return;
-  }
-  containers_.emplace(std::move(watcher_ptr), first_pending_commit_index);
-  SendPendingCommits();
-  callback(cloud_provider::Status::OK);
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/cloud_provider/fake_page_cloud.h b/bin/ledger/testing/cloud_provider/fake_page_cloud.h
deleted file mode 100644
index 6a54106..0000000
--- a/bin/ledger/testing/cloud_provider/fake_page_cloud.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_PAGE_CLOUD_H_
-#define PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_PAGE_CLOUD_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/testing/cloud_provider/types.h"
-#include "peridot/lib/commit_pack/commit_pack.h"
-
-namespace ledger {
-
-class FakePageCloud : public cloud_provider::PageCloud {
- public:
-  explicit FakePageCloud(InjectNetworkError inject_network_error);
-  ~FakePageCloud() override;
-
-  void set_on_empty(fit::closure on_empty) { on_empty_ = std::move(on_empty); }
-
-  void Bind(fidl::InterfaceRequest<cloud_provider::PageCloud> request);
-
- private:
-  void SendPendingCommits();
-  bool MustReturnError(uint64_t request_signature);
-
-  // cloud_provider::PageCloud:
-  void AddCommits(cloud_provider::CommitPack commits,
-                  AddCommitsCallback callback) override;
-  void GetCommits(std::unique_ptr<cloud_provider::Token> min_position_token,
-                  GetCommitsCallback callback) override;
-  void AddObject(std::vector<uint8_t> id, fuchsia::mem::Buffer data,
-                 AddObjectCallback callback) override;
-  void GetObject(std::vector<uint8_t> id,
-                 GetObjectCallback callback) override;
-  void SetWatcher(
-      std::unique_ptr<cloud_provider::Token> min_position_token,
-      fidl::InterfaceHandle<cloud_provider::PageCloudWatcher> watcher,
-      SetWatcherCallback callback) override;
-
-  InjectNetworkError inject_network_error_;
-  std::map<uint64_t, size_t> remaining_errors_to_inject_;
-
-  fidl::BindingSet<cloud_provider::PageCloud> bindings_;
-  fit::closure on_empty_;
-
-  std::vector<cloud_provider::CommitPackEntry> commits_;
-  std::map<std::string, std::string> objects_;
-
-  // Watchers set by the client.
-  class WatcherContainer;
-  callback::AutoCleanableSet<WatcherContainer> containers_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakePageCloud);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_FAKE_PAGE_CLOUD_H_
diff --git a/bin/ledger/testing/cloud_provider/types.h b/bin/ledger/testing/cloud_provider/types.h
deleted file mode 100644
index 30c8061..0000000
--- a/bin/ledger/testing/cloud_provider/types.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_TYPES_H_
-#define PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_TYPES_H_
-
-namespace ledger {
-
-enum class CloudEraseOnCheck { YES, NO };
-enum class CloudEraseFromWatcher { YES, NO };
-enum class InjectNetworkError { YES, NO };
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_CLOUD_PROVIDER_TYPES_H_
diff --git a/bin/ledger/testing/data_generator.cc b/bin/ledger/testing/data_generator.cc
deleted file mode 100644
index 82d1b98..0000000
--- a/bin/ledger/testing/data_generator.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/data_generator.h"
-
-#include <algorithm>
-#include <functional>
-#include <string>
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/concatenate.h>
-
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kKeyIdSeparator = "-";
-
-}  // namespace
-
-DataGenerator::DataGenerator(rng::Random* random)
-    : generator_(random->NewBitGenerator<uint64_t>()) {}
-
-DataGenerator::~DataGenerator() {}
-
-std::vector<uint8_t> DataGenerator::MakeKey(int i, size_t size) {
-  std::string i_str = std::to_string(i);
-  FXL_DCHECK(i_str.size() + kKeyIdSeparator.size() <= size);
-  auto rand_bytes = MakeValue(size - i_str.size() - kKeyIdSeparator.size());
-
-  return convert::ToArray(fxl::Concatenate(
-      {convert::ExtendedStringView(rand_bytes), kKeyIdSeparator, i_str}));
-}
-
-PageId DataGenerator::MakePageId() {
-  PageId value;
-  std::generate(value.id.begin(), value.id.end(), std::ref(generator_));
-  return value;
-}
-
-fidl::VectorPtr<uint8_t> DataGenerator::MakeValue(size_t size) {
-  auto data = fidl::VectorPtr<uint8_t>::New(size);
-  std::generate(data->begin(), data->end(), std::ref(generator_));
-  return data;
-}
-
-std::vector<std::vector<uint8_t>> DataGenerator::MakeKeys(
-    size_t key_count, size_t key_size, size_t unique_key_count) {
-  FXL_DCHECK(unique_key_count <= key_count);
-  std::vector<std::vector<uint8_t>> keys(key_count);
-  for (size_t i = 0; i < unique_key_count; i++) {
-    keys[i] = MakeKey(i, key_size);
-  }
-  for (size_t i = unique_key_count; i < key_count; i++) {
-    keys[i] = keys[i - unique_key_count];
-  }
-  return keys;
-}
-
-size_t DataGenerator::GetKeyId(const std::vector<uint8_t>& key) {
-  std::string key_str = convert::ToString(key);
-  size_t split_index = key_str.find_last_of(kKeyIdSeparator.ToString());
-  FXL_CHECK(split_index != std::string::npos &&
-            split_index + kKeyIdSeparator.size() < key_str.size());
-  return std::stoul(key_str.substr(split_index + kKeyIdSeparator.size()));
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/data_generator.h b/bin/ledger/testing/data_generator.h
deleted file mode 100644
index 8dbf326..0000000
--- a/bin/ledger/testing/data_generator.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_DATA_GENERATOR_H_
-#define PERIDOT_BIN_LEDGER_TESTING_DATA_GENERATOR_H_
-
-#include <climits>
-#include <random>
-#include <vector>
-
-#include <lib/fidl/cpp/vector.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/lib/rng/random.h"
-
-namespace ledger {
-
-class DataGenerator {
- public:
-  explicit DataGenerator(rng::Random* random);
-
-  ~DataGenerator();
-
-  // Builds a key of the given |size| as "<random data>-<i>". The id (|i|) of
-  // the result can be retrieved by calling |GetKeyId|.
-  std::vector<uint8_t> MakeKey(int i, size_t size);
-
-  // Builds a random value that can be used as a page id.
-  PageId MakePageId();
-
-  // Builds a random value of the given length.
-  fidl::VectorPtr<uint8_t> MakeValue(size_t size);
-
-  // Builds a vector of length |key_count| containing keys of size |key_size|,
-  // |unique_key_count| of which are unique.
-  std::vector<std::vector<uint8_t>> MakeKeys(size_t key_count, size_t key_size,
-                                             size_t unique_key_count);
-
-  // Returns the id of |key|. |key| is assumed to have been created by this
-  // DataGenerator, using either |MakeKey| or |MakeKeys|.
-  size_t GetKeyId(const std::vector<uint8_t>& key);
-
- private:
-  std::independent_bits_engine<rng::Random::BitGenerator<uint64_t>, CHAR_BIT,
-                               uint8_t>
-      generator_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_DATA_GENERATOR_H_
diff --git a/bin/ledger/testing/fake_disk_cleanup_manager.h b/bin/ledger/testing/fake_disk_cleanup_manager.h
deleted file mode 100644
index 731b1b6..0000000
--- a/bin/ledger/testing/fake_disk_cleanup_manager.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_FAKE_DISK_CLEANUP_MANAGER_H_
-#define PERIDOT_BIN_LEDGER_TESTING_FAKE_DISK_CLEANUP_MANAGER_H_
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/app/disk_cleanup_manager.h"
-#include "peridot/bin/ledger/app/page_usage_listener.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-
-namespace ledger {
-
-class FakeDiskCleanupManager : public DiskCleanupManager,
-                               public PageUsageListener {
- public:
-  FakeDiskCleanupManager() {}
-  ~FakeDiskCleanupManager() override {}
-
-  void set_on_empty(fit::closure on_empty_callback) override {}
-
-  bool IsEmpty() override { return true; }
-
-  void TryCleanUp(fit::function<void(Status)> callback) override {
-    // Do not call the callback directly.
-    cleanup_callback = std::move(callback);
-  }
-  void OnPageOpened(fxl::StringView /*ledger_name*/,
-                    storage::PageIdView /*page_id*/) override {
-    ++page_opened_count;
-  }
-
-  void OnPageClosed(fxl::StringView /*ledger_name*/,
-                    storage::PageIdView /*page_id*/) override {
-    ++page_closed_count;
-  }
-
-  void OnPageUnused(fxl::StringView /*ledger_name*/,
-                    storage::PageIdView /*page_id*/) override {
-    ++page_unused_count;
-  }
-
-  int page_opened_count = 0;
-  int page_closed_count = 0;
-  int page_unused_count = 0;
-  fit::function<void(Status)> cleanup_callback;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeDiskCleanupManager);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_FAKE_DISK_CLEANUP_MANAGER_H_
diff --git a/bin/ledger/testing/get_ledger.cc b/bin/ledger/testing/get_ledger.cc
deleted file mode 100644
index 5115a76..0000000
--- a/bin/ledger/testing/get_ledger.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/get_ledger.h"
-
-#include <fcntl.h>
-#include <utility>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/callback/capture.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/io/fd.h>
-#include <lib/fxl/files/unique_fd.h>
-#include <lib/fxl/logging.h>
-#include <lib/svc/cpp/services.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-// Converts a status returned by Ledger via FIDL to a ledger::Status.
-// The convention is that kernel errors (zx_status_t) are negative, while
-// positive values are reserved for user-space.
-Status ToLedgerStatus(zx_status_t status) {
-  if (status == ZX_OK) {
-    return Status::OK;
-  }
-  if (status > 0) {
-    return static_cast<Status>(status);
-  }
-  return Status::INTERNAL_ERROR;
-}
-}  // namespace
-
-Status GetLedger(component::StartupContext* context,
-                 fidl::InterfaceRequest<fuchsia::sys::ComponentController>
-                     controller_request,
-                 cloud_provider::CloudProviderPtr cloud_provider,
-                 std::string user_id, std::string ledger_name,
-                 const DetachedPath& ledger_repository_path,
-                 fit::function<void()> error_handler, LedgerPtr* ledger) {
-  fxl::UniqueFD dir(openat(ledger_repository_path.root_fd(),
-                           ledger_repository_path.path().c_str(), O_PATH));
-  if (!dir.is_valid()) {
-    FXL_LOG(ERROR) << "Unable to open directory at "
-                   << ledger_repository_path.path() << ". errno: " << errno;
-    return Status::IO_ERROR;
-  }
-
-  ledger_internal::LedgerRepositoryFactoryPtr repository_factory;
-
-  component::Services child_services;
-  fuchsia::sys::LaunchInfo launch_info;
-  launch_info.url = "fuchsia-pkg://fuchsia.com/ledger#meta/ledger.cmx";
-  launch_info.directory_request = child_services.NewRequest();
-  launch_info.arguments.push_back("--disable_reporting");
-  context->launcher()->CreateComponent(std::move(launch_info),
-                                       std::move(controller_request));
-  child_services.ConnectToService(repository_factory.NewRequest());
-
-  fuchsia::ledger::internal::LedgerRepositorySyncPtr repository;
-
-  repository_factory->GetRepository(
-      fsl::CloneChannelFromFileDescriptor(dir.get()), std::move(cloud_provider),
-      std::move(user_id), repository.NewRequest());
-
-  (*ledger).set_error_handler(
-      [error_handler = std::move(error_handler)](zx_status_t status) {
-        FXL_LOG(ERROR) << "The ledger connection was closed, quitting.";
-        error_handler();
-      });
-  repository->GetLedger(convert::ToArray(ledger_name), ledger->NewRequest());
-  return ToLedgerStatus(repository->Sync());
-}
-
-void KillLedgerProcess(fuchsia::sys::ComponentControllerPtr* controller) {
-  (*controller)->Kill();
-  auto channel = controller->Unbind().TakeChannel();
-  zx_signals_t observed;
-  channel.wait_one(ZX_CHANNEL_PEER_CLOSED, zx::deadline_after(zx::sec(5)),
-                   &observed);
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/get_ledger.h b/bin/ledger/testing/get_ledger.h
deleted file mode 100644
index 3ae1324..0000000
--- a/bin/ledger/testing/get_ledger.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_GET_LEDGER_H_
-#define PERIDOT_BIN_LEDGER_TESTING_GET_LEDGER_H_
-
-#include <functional>
-#include <string>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-
-namespace ledger {
-
-// Creates a new Ledger application instance and returns a LedgerPtr connection
-// to it. This method will call |Sync| on the Repository to ensure that the
-// Ledger is ready to be used for performance benchmark.
-Status GetLedger(component::StartupContext* context,
-                 fidl::InterfaceRequest<fuchsia::sys::ComponentController>
-                     controller_request,
-                 cloud_provider::CloudProviderPtr cloud_provider,
-                 std::string user_id, std::string ledger_name,
-                 const DetachedPath& ledger_repository_path,
-                 fit::function<void()> error_handler, LedgerPtr* ledger);
-
-// Kills the remote ledger process controlled by |controller|.
-void KillLedgerProcess(fuchsia::sys::ComponentControllerPtr* controller);
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_GET_LEDGER_H_
diff --git a/bin/ledger/testing/get_page_ensure_initialized.cc b/bin/ledger/testing/get_page_ensure_initialized.cc
deleted file mode 100644
index b31710c..0000000
--- a/bin/ledger/testing/get_page_ensure_initialized.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-
-namespace ledger {
-namespace {
-// The delay before returning the page, after a successful initialization.
-constexpr zx::duration kDelay = zx::msec(500);
-}  // namespace
-
-void GetPageEnsureInitialized(
-    LedgerPtr* ledger, PageIdPtr requested_id, DelayCallback delay_callback,
-    fit::function<void()> error_handler,
-    fit::function<void(Status, PagePtr, PageId)> callback) {
-  auto page = std::make_unique<PagePtr>();
-  auto request = page->NewRequest();
-  (*ledger)->GetPage(
-      std::move(requested_id), std::move(request),
-      [delay_callback, page = std::move(page),
-       error_handler = std::move(error_handler),
-       callback = std::move(callback)](Status status) mutable {
-        if (status != Status::OK) {
-          FXL_LOG(ERROR) << "Failure while getting a page.";
-          callback(status, nullptr, {});
-          return;
-        }
-
-        page->set_error_handler(
-            [error_handler = std::move(error_handler)](zx_status_t status) {
-              FXL_LOG(ERROR) << "The page connection was closed, quitting.";
-              error_handler();
-            });
-
-        auto page_ptr = (*page).get();
-        page_ptr->GetId([delay_callback, page = std::move(page),
-                         callback = std::move(callback)](PageId page_id) {
-          if (delay_callback == DelayCallback::YES) {
-            zx_nanosleep(zx_deadline_after(kDelay.get()));
-          }
-          callback(Status::OK, std::move(*page), page_id);
-        });
-      });
-}
-}  // namespace ledger
diff --git a/bin/ledger/testing/get_page_ensure_initialized.h b/bin/ledger/testing/get_page_ensure_initialized.h
deleted file mode 100644
index f2e861d..0000000
--- a/bin/ledger/testing/get_page_ensure_initialized.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_GET_PAGE_ENSURE_INITIALIZED_H_
-#define PERIDOT_BIN_LEDGER_TESTING_GET_PAGE_ENSURE_INITIALIZED_H_
-
-#include <lib/fit/function.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-
-namespace ledger {
-// Determines whether calling the |GetPageEnsureInitialized| callback should be
-// done after some delay. This can be used in benchmarks, to make sure that all
-// backround I/O operations have finished before measurements start.
-enum DelayCallback : bool { NO, YES };
-
-// Retrieves the requested page of the given Ledger instance amd returns after
-// ensuring that it is initialized. If |id| is nullptr, a new page with a unique
-// id is created.
-void GetPageEnsureInitialized(
-    LedgerPtr* ledger, PageIdPtr requested_id, DelayCallback delay_callback,
-    fit::function<void()> error_handler,
-    fit::function<void(Status, PagePtr, PageId)> callback);
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_GET_PAGE_ENSURE_INITIALIZED_H_
diff --git a/bin/ledger/testing/inspect.cc b/bin/ledger/testing/inspect.cc
deleted file mode 100644
index c85c22a..0000000
--- a/bin/ledger/testing/inspect.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/inspect.h"
-
-#include <fuchsia/inspect/cpp/fidl.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-
-namespace ledger {
-
-// TODO(crjohns, nathaniel): Migrate this to a testing::Matcher.
-void ExpectRequestsMetric(fuchsia::inspect::Object* object,
-                          unsigned long expected_value) {
-  bool requests_found = false;
-  unsigned long extra_requests_found = 0UL;
-  unsigned long requests = 0UL;
-  for (auto& index : *object->metrics) {
-    if (index.key == kRequestsInspectPathComponent) {
-      if (!requests_found) {
-        requests_found = true;
-        requests = index.value.uint_value();
-      } else {
-        extra_requests_found++;
-      }
-    }
-  }
-  EXPECT_TRUE(requests_found);
-  EXPECT_EQ(expected_value, requests);
-  EXPECT_EQ(0UL, extra_requests_found);
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/inspect.h b/bin/ledger/testing/inspect.h
deleted file mode 100644
index 7df672c..0000000
--- a/bin/ledger/testing/inspect.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_INSPECT_H_
-#define PERIDOT_BIN_LEDGER_TESTING_INSPECT_H_
-
-#include <fuchsia/inspect/cpp/fidl.h>
-
-namespace ledger {
-
-// TODO(crjohns, nathaniel): Move to an "Inspect API testing helpers" library,
-// parameterizing by the metric name rather than having "requests" hard-coded.
-// EXPECTs that |object| has a metric named "requests" and that the value of
-// the "requests" metric is |expected_value|.
-void ExpectRequestsMetric(fuchsia::inspect::Object* object,
-                          unsigned long expected_value);
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_INSPECT_H_
diff --git a/bin/ledger/testing/ledger_app_instance_factory.cc b/bin/ledger/testing/ledger_app_instance_factory.cc
deleted file mode 100644
index 8cf1b1b..0000000
--- a/bin/ledger/testing/ledger_app_instance_factory.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/ledger_app_instance_factory.h"
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fsl/io/fd.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "garnet/public/lib/callback/capture.h"
-#include "gtest/gtest.h"
-
-namespace ledger {
-
-LedgerAppInstanceFactory::LedgerAppInstance::LedgerAppInstance(
-    LoopController* loop_controller, std::vector<uint8_t> test_ledger_name,
-    ledger_internal::LedgerRepositoryFactoryPtr ledger_repository_factory)
-    : loop_controller_(loop_controller),
-      test_ledger_name_(std::move(test_ledger_name)),
-      ledger_repository_factory_(std::move(ledger_repository_factory)) {
-  ledger_repository_factory_.set_error_handler([](zx_status_t status) {
-    if (status != ZX_ERR_PEER_CLOSED) {
-      ADD_FAILURE() << "|LedgerRepositoryFactory| failed with an error: "
-                    << status;
-    }
-  });
-}
-
-LedgerAppInstanceFactory::LedgerAppInstance::~LedgerAppInstance() {}
-
-ledger_internal::LedgerRepositoryFactory*
-LedgerAppInstanceFactory::LedgerAppInstance::ledger_repository_factory() {
-  return ledger_repository_factory_.get();
-}
-
-ledger_internal::LedgerRepositoryPtr
-LedgerAppInstanceFactory::LedgerAppInstance::GetTestLedgerRepository() {
-  ledger_internal::LedgerRepositoryPtr repository;
-  repository.set_error_handler([](zx_status_t status) {
-    if (status != ZX_ERR_PEER_CLOSED) {
-      ADD_FAILURE() << "|LedgerRepository| failed with an error: " << status;
-    }
-  });
-  ledger_repository_factory_->GetRepository(
-      fsl::CloneChannelFromFileDescriptor(tmpfs_.root_fd()),
-      MakeCloudProvider(), GetUserId(), repository.NewRequest());
-  return repository;
-}
-
-LedgerPtr LedgerAppInstanceFactory::LedgerAppInstance::GetTestLedger() {
-  LedgerPtr ledger;
-  ledger.set_error_handler([](zx_status_t status) {
-    if (status != ZX_ERR_PEER_CLOSED) {
-      ADD_FAILURE() << "|Ledger| failed with an error: " << status;
-    }
-  });
-
-  auto repository = GetTestLedgerRepository();
-  repository->GetLedger(fidl::Clone(test_ledger_name_), ledger.NewRequest());
-  auto waiter = loop_controller_->NewWaiter();
-  repository->Sync(waiter->GetCallback());
-  if (!waiter->RunUntilCalled()) {
-    ADD_FAILURE() << "|GetLedger| failed to call back.";
-    return nullptr;
-  }
-  return ledger;
-}
-
-PagePtr LedgerAppInstanceFactory::LedgerAppInstance::GetTestPage() {
-  fidl::InterfaceHandle<Page> page;
-  Status status;
-  LedgerPtr ledger = GetTestLedger();
-  auto waiter = loop_controller_->NewWaiter();
-  ledger->GetPage(nullptr, page.NewRequest(),
-                  callback::Capture(waiter->GetCallback(), &status));
-  if (!waiter->RunUntilCalled()) {
-    ADD_FAILURE() << "|GetPage| failed to call back.";
-    return nullptr;
-  }
-  EXPECT_EQ(Status::OK, status);
-
-  return page.Bind();
-}
-
-PagePtr LedgerAppInstanceFactory::LedgerAppInstance::GetPage(
-    const PageIdPtr& page_id, Status expected_status) {
-  PagePtr page_ptr;
-  Status status;
-  LedgerPtr ledger = GetTestLedger();
-  auto waiter = loop_controller_->NewWaiter();
-  ledger->GetPage(fidl::Clone(page_id), page_ptr.NewRequest(),
-                  callback::Capture(waiter->GetCallback(), &status));
-  if (!waiter->RunUntilCalled()) {
-    ADD_FAILURE() << "|GetPage| failed to call back.";
-    return nullptr;
-  }
-  EXPECT_EQ(expected_status, status);
-
-  return page_ptr;
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/ledger_app_instance_factory.h b/bin/ledger/testing/ledger_app_instance_factory.h
deleted file mode 100644
index 68f4187..0000000
--- a/bin/ledger/testing/ledger_app_instance_factory.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_LEDGER_APP_INSTANCE_FACTORY_H_
-#define PERIDOT_BIN_LEDGER_TESTING_LEDGER_APP_INSTANCE_FACTORY_H_
-
-#include <functional>
-#include <memory>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/testing/loop_controller.h"
-#include "peridot/lib/rng/random.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace ledger {
-
-class LedgerAppInstanceFactory;
-
-// Class that creates instances of |LedgerAppInstanceFactory|.
-class LedgerAppInstanceFactoryBuilder {
- public:
-  virtual ~LedgerAppInstanceFactoryBuilder(){};
-  // Returns a new LedgerAppInstanceFactory.
-  virtual std::unique_ptr<LedgerAppInstanceFactory> NewFactory() const = 0;
-};
-
-// Base class for client tests.
-//
-// Client tests are tests that act as clients to the Ledger as a whole. These
-// are integration tests or end-to-end tests (apptests).
-class LedgerAppInstanceFactory {
- public:
-  // A Ledger app instance
-  class LedgerAppInstance {
-   public:
-    LedgerAppInstance(
-        LoopController* loop_controller,
-        std::vector<uint8_t> test_ledger_name,
-        ledger_internal::LedgerRepositoryFactoryPtr ledger_repository_factory);
-    virtual ~LedgerAppInstance();
-
-    // Returns the LedgerRepositoryFactory associated with this application
-    // instance.
-    ledger_internal::LedgerRepositoryFactory* ledger_repository_factory();
-    // Builds and returns a new connection to the default LedgerRepository
-    // object.
-    ledger_internal::LedgerRepositoryPtr GetTestLedgerRepository();
-    // Builds and returns a new connection to the default Ledger object.
-    LedgerPtr GetTestLedger();
-    // Builds and returns a new connection to a new random page on the default
-    // Ledger object.
-    PagePtr GetTestPage();
-    // Returns a connection to the given page on the default Ledger object.
-    PagePtr GetPage(const PageIdPtr& page_id, Status expected_status);
-
-   private:
-    virtual cloud_provider::CloudProviderPtr MakeCloudProvider() = 0;
-    virtual std::string GetUserId() = 0;
-
-    LoopController* loop_controller_;
-    std::vector<uint8_t> test_ledger_name_;
-    ledger_internal::LedgerRepositoryFactoryPtr ledger_repository_factory_;
-
-    scoped_tmpfs::ScopedTmpFS tmpfs_;
-
-    FXL_DISALLOW_COPY_AND_ASSIGN(LedgerAppInstance);
-  };
-
-  virtual ~LedgerAppInstanceFactory() {}
-
-  // Starts a new instance of the Ledger. The |loop_controller| must allow to
-  // control the loop that is used to access the LedgerAppInstance.
-  virtual std::unique_ptr<LedgerAppInstance> NewLedgerAppInstance() = 0;
-
-  // Returns the Loop controller controlling the loops of the LedgerAppInstances
-  // created by this.
-  virtual LoopController* GetLoopController() = 0;
-
-  // Returns a random instance to control the randomness of the test.
-  virtual rng::Random* GetRandom() = 0;
-};
-
-// Returns the list of LedgerAppInstanceFactoryBuilder to be passed as
-// parameters to the tests. The implementation of this function changes
-// depending on whether the tests are ran as integration tests, or end to end
-// tests.
-std::vector<const LedgerAppInstanceFactoryBuilder*>
-GetLedgerAppInstanceFactoryBuilders();
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_LEDGER_APP_INSTANCE_FACTORY_H_
diff --git a/bin/ledger/testing/ledger_matcher.cc b/bin/ledger/testing/ledger_matcher.cc
deleted file mode 100644
index 8fd475b..0000000
--- a/bin/ledger/testing/ledger_matcher.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/ledger_matcher.h"
-
-#include <lib/fsl/vmo/strings.h>
-
-using testing::AllOf;
-using testing::Field;
-using testing::TypedEq;
-
-namespace ledger {
-
-namespace {
-MATCHER_P(InternalViewMatcher, sub_matcher, "") {  // NOLINT
-  return ExplainMatchResult(sub_matcher, arg.ToString(), result_listener);
-}
-
-MATCHER_P(InternalBufferMatcher, sub_matcher, "") {  // NOLINT
-  std::string vmo_content;
-  if (!TypedEq<bool>(true).MatchAndExplain(
-          fsl::StringFromVmo(arg, &vmo_content), result_listener)) {
-    return false;
-  }
-
-  return ExplainMatchResult(sub_matcher, vmo_content, result_listener);
-}
-
-MATCHER(PointWiseMatchesEntry, "") {  // NOLINT
-  auto& a = std::get<0>(arg);
-  auto& b = std::get<1>(arg);
-  return ExplainMatchResult(MatchesEntry(b), a, result_listener);
-}
-
-}  // namespace
-
-testing::Matcher<convert::ExtendedStringView> MatchesView(
-    testing::Matcher<std::string> matcher) {
-  return InternalViewMatcher(std::move(matcher));
-}
-
-testing::Matcher<const fuchsia::mem::Buffer&> MatchesBuffer(
-    testing::Matcher<std::string> matcher) {
-  return InternalBufferMatcher(std::move(matcher));
-}
-
-testing::Matcher<const Entry&> MatchesEntry(
-    std::pair<testing::Matcher<std::string>, testing::Matcher<std::string>>
-        matcher) {
-  return AllOf(Field(&Entry::key, MatchesView(matcher.first)),
-               Field(&Entry::value, Pointee(MatchesBuffer(matcher.second))));
-}
-
-testing::Matcher<const std::vector<Entry>&> MatchEntries(
-    std::map<std::string, testing::Matcher<std::string>> matchers) {
-  return Pointwise(PointWiseMatchesEntry(), matchers);
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/ledger_matcher.h b/bin/ledger/testing/ledger_matcher.h
deleted file mode 100644
index 06a2a09..0000000
--- a/bin/ledger/testing/ledger_matcher.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_LEDGER_MATCHER_H_
-#define PERIDOT_BIN_LEDGER_TESTING_LEDGER_MATCHER_H_
-
-#include <fuchsia/mem/cpp/fidl.h>
-#include <gmock/gmock.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-// Matcher that matches a convert::ExtendedStringView against a string-like.
-testing::Matcher<convert::ExtendedStringView> MatchesView(
-    testing::Matcher<std::string> matcher);
-
-// Matcher that matches a mem::Buffer against a string.
-testing::Matcher<const fuchsia::mem::Buffer&> MatchesBuffer(
-    testing::Matcher<std::string> matcher);
-
-// Matcher that matches a Ledger entry against a pair of matchers on the entry's
-// key and value. The entry's priority is not considered in this Matcher.
-testing::Matcher<const Entry&> MatchesEntry(
-    std::pair<testing::Matcher<std::string>, testing::Matcher<std::string>>
-        matcher);
-
-// Matcher that matches a list of ledger entries against a map from key to
-// matchers on the entries' values. The entries' priorities are not considered
-// in this Matcher.
-testing::Matcher<const std::vector<Entry>&> MatchEntries(
-    std::map<std::string, testing::Matcher<std::string>> matchers);
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_LEDGER_MATCHER_H_
diff --git a/bin/ledger/testing/ledger_matcher_unittest.cc b/bin/ledger/testing/ledger_matcher_unittest.cc
deleted file mode 100644
index cb13635..0000000
--- a/bin/ledger/testing/ledger_matcher_unittest.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/ledger_matcher.h"
-
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "gtest/gtest.h"
-
-using testing::HasSubstr;
-using testing::Not;
-
-namespace ledger {
-namespace {
-
-TEST(LedgerMatcher, ExtendedStringViewMatcher) {
-  std::string foo = "hello";
-  convert::ExtendedStringView view(foo);
-
-  EXPECT_THAT(view, MatchesView("hello"));
-  EXPECT_THAT(view, MatchesView(HasSubstr("ll")));
-  EXPECT_THAT(view, Not(MatchesView("hello2")));
-}
-
-TEST(LedgerMatcher, BufferMatcher) {
-  fsl::SizedVmo size_vmo;
-  ASSERT_TRUE(fsl::VmoFromString("hello", &size_vmo));
-  fuchsia::mem::Buffer buffer = std::move(size_vmo).ToTransport();
-
-  EXPECT_THAT(buffer, MatchesBuffer("hello"));
-  EXPECT_THAT(buffer, MatchesBuffer(HasSubstr("ll")));
-  EXPECT_THAT(buffer, Not(MatchesBuffer("hello2")));
-}
-
-TEST(LedgerMatcher, EntryMatcher) {
-  fsl::SizedVmo size_vmo;
-  ASSERT_TRUE(fsl::VmoFromString("hello", &size_vmo));
-  fuchsia::mem::Buffer buffer = std::move(size_vmo).ToTransport();
-
-  Entry entry{convert::ToArray("key"), fidl::MakeOptional(std::move(buffer))};
-
-  EXPECT_THAT(entry, MatchesEntry({"key", "hello"}));
-  EXPECT_THAT(entry, MatchesEntry({Not("key2"), HasSubstr("ll")}));
-}
-
-TEST(LedgerMatcher, EntriesMatcher) {
-  fsl::SizedVmo size_vmo;
-  ASSERT_TRUE(fsl::VmoFromString("hello", &size_vmo));
-  fuchsia::mem::Buffer buffer = std::move(size_vmo).ToTransport();
-
-  Entry entry1{convert::ToArray("key1"), fidl::MakeOptional(std::move(buffer))};
-
-  ASSERT_TRUE(fsl::VmoFromString("hello2", &size_vmo));
-  buffer = std::move(size_vmo).ToTransport();
-
-  Entry entry2{convert::ToArray("key2"), fidl::MakeOptional(std::move(buffer))};
-
-  std::vector<Entry> entries;
-  entries.push_back(std::move(entry1));
-  entries.push_back(std::move(entry2));
-
-  EXPECT_THAT(entries, MatchEntries({{"key1", "hello"}, {"key2", "hello2"}}));
-  EXPECT_THAT(entries, MatchEntries({{"key1", HasSubstr("ll")},
-                                     {"key2", HasSubstr("ll")}}));
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/testing/ledger_test_instance_provider/BUILD.gn b/bin/ledger/testing/ledger_test_instance_provider/BUILD.gn
deleted file mode 100644
index ab280b7..0000000
--- a/bin/ledger/testing/ledger_test_instance_provider/BUILD.gn
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/package.gni")
-
-executable("ledger_test_instance_provider_bin") {
-  testonly = true
-
-  sources = [
-    "ledger_test_instance_provider.cc",
-  ]
-
-  deps = [
-    "//garnet/public/lib/component/cpp/testing",
-    "//garnet/public/lib/svc/cpp",
-    "//peridot/bin/ledger/fidl",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-
-  public_deps = [
-    "//peridot/lib/convert",
-    "//peridot/lib/scoped_tmpfs",
-  ]
-}
-
-package("ledger_test_instance_provider") {
-  testonly = true
-
-  meta = [
-    {
-      path = rebase_path("meta/ledger_test_instance_provider.cmx")
-      dest = "ledger_test_instance_provider.cmx"
-    },
-  ]
-
-  binary = "ledger_test_instance_provider_bin"
-
-  deps = [
-    ":ledger_test_instance_provider_bin",
-  ]
-}
diff --git a/bin/ledger/testing/ledger_test_instance_provider/MAINTAINERS b/bin/ledger/testing/ledger_test_instance_provider/MAINTAINERS
deleted file mode 100644
index e4db192..0000000
--- a/bin/ledger/testing/ledger_test_instance_provider/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-etiennej@google.com
-jif@google.com
diff --git a/bin/ledger/testing/ledger_test_instance_provider/README.md b/bin/ledger/testing/ledger_test_instance_provider/README.md
deleted file mode 100644
index 3f28e73..0000000
--- a/bin/ledger/testing/ledger_test_instance_provider/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Ledger Test Instance Provider
-
-This is a package containing a `ledger_test_instance_provider_bin` binary whose
-purpose is to return Ledger instances backed by memfs.
-
-It exists to allow tests built outside of peridot to get access to a Ledger
-instance, a task otherwise impossible because the required API
-(LedgerRepository) is not available outside of peridot.
diff --git a/bin/ledger/testing/ledger_test_instance_provider/ledger_test_instance_provider.cc b/bin/ledger/testing/ledger_test_instance_provider/ledger_test_instance_provider.cc
deleted file mode 100644
index 7366005..0000000
--- a/bin/ledger/testing/ledger_test_instance_provider/ledger_test_instance_provider.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <cstdlib>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-
-#include "lib/component/cpp/startup_context.h"
-#include "lib/fsl/io/fd.h"
-#include "lib/fxl/strings/string_view.h"
-#include "lib/svc/cpp/services.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace {
-
-constexpr char kLedgerBinaryPath[] =
-    "fuchsia-pkg://fuchsia.com/ledger#meta/ledger.cmx";
-constexpr fxl::StringView kLedgerName = "test ledger instance";
-
-}  // namespace
-
-// Exposes a public service that serves an in-memory Ledger.
-int main(int argc, char const *argv[]) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  std::unique_ptr<component::StartupContext> context(
-      component::StartupContext::CreateFromStartupInfo());
-
-  // Get a repository factory.
-  component::Services services;
-  fuchsia::sys::LaunchInfo launch_info;
-  launch_info.url = kLedgerBinaryPath;
-  launch_info.directory_request = services.NewRequest();
-  launch_info.arguments.push_back("--disable_reporting");
-  fuchsia::sys::ComponentControllerPtr controller;
-  context->launcher()->CreateComponent(std::move(launch_info),
-                                       controller.NewRequest());
-  fuchsia::ledger::internal::LedgerRepositoryFactoryPtr repository_factory;
-  services.ConnectToService(repository_factory.NewRequest());
-
-  // Create memfs.
-  auto memfs = std::make_unique<scoped_tmpfs::ScopedTmpFS>();
-  zx::channel memfs_channel =
-      fsl::CloneChannelFromFileDescriptor(memfs->root_fd());
-
-  // Get a repository.
-  fuchsia::ledger::internal::LedgerRepositorySyncPtr repository;
-  repository_factory->GetRepository(std::move(memfs_channel), nullptr, "",
-                                    repository.NewRequest());
-
-  // Serve the repository.
-  context->outgoing().AddPublicService<fuchsia::ledger::Ledger>(
-      [&repository](fidl::InterfaceRequest<fuchsia::ledger::Ledger> request) {
-        repository->GetLedger(convert::ToArray(kLedgerName),
-                              std::move(request));
-      });
-  loop.Run();
-  return EXIT_SUCCESS;
-}
\ No newline at end of file
diff --git a/bin/ledger/testing/ledger_test_instance_provider/meta/ledger_test_instance_provider.cmx b/bin/ledger/testing/ledger_test_instance_provider/meta/ledger_test_instance_provider.cmx
deleted file mode 100644
index 58bb40c..0000000
--- a/bin/ledger/testing/ledger_test_instance_provider/meta/ledger_test_instance_provider.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/ledger/testing/loop_controller.h b/bin/ledger/testing/loop_controller.h
deleted file mode 100644
index f76862a..0000000
--- a/bin/ledger/testing/loop_controller.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_LOOP_CONTROLLER_H_
-#define PERIDOT_BIN_LEDGER_TESTING_LOOP_CONTROLLER_H_
-
-#include <functional>
-#include <memory>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/compiler_specific.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-
-namespace ledger {
-// Helper class for waiting for asynchronous event.
-// For a given |CallbackWaiter|, one can retrieve a callback through
-// |GetCallback|. The callback must be called when the asynchronous event
-// ends.
-// When |RunUntilCalled| is called, it will run the event loop, until either the
-// callback from |GetCallback| is called or or the loop determines that the
-// callback will never be called. It returns |true|, if the callback has been
-// called, |false| otherwise. If one is waiting for the callback to be called
-// multiple times, one can execute |RunUntilCalled| multiple times. The |n|th
-// run of |RunUntilCalled| will return once the callback have been called at
-// least |n| time. |GetCallback| can be called multiple time, and all the
-// returned callback will be equivalent.
-class CallbackWaiter {
- public:
-  CallbackWaiter() {}
-  virtual ~CallbackWaiter() {}
-  virtual fit::function<void()> GetCallback() = 0;
-  virtual bool RunUntilCalled() FXL_WARN_UNUSED_RESULT = 0;
-  // Returns whether the next expected calback has not already been called. If
-  // |false|, |RunUntilCalled| will return immediately.
-  virtual bool NotCalledYet() = 0;
-};
-
-// A subloop.
-class SubLoop {
- public:
-  virtual ~SubLoop() {}
-
-  // Runs all currently enqueued tasks on the loop and quits the loop. The
-  // SubLoop must not be used again once this method returns.
-  virtual void DrainAndQuit() = 0;
-
-  // Returns a dispatcher whose runloop is owned by |this|.
-  virtual async_dispatcher_t* dispatcher() = 0;
-};
-
-// Controller for the main run loop. This allows to control the loop that will
-// call the factory and the multiple instances.
-class LoopController {
- public:
-  virtual ~LoopController(){};
-
-  // Runs the loop.
-  virtual void RunLoop() = 0;
-  // Stops the loop.
-  virtual void StopLoop() = 0;
-  // Starts a new subloop.
-  virtual std::unique_ptr<SubLoop> StartNewLoop() = 0;
-  // Returns a waiter that can be used to run the loop until a callback has
-  // been called.
-  virtual std::unique_ptr<CallbackWaiter> NewWaiter() = 0;
-  // Returns the dispatcher.
-  virtual async_dispatcher_t* dispatcher() = 0;
-  // Runs the loop until |condition| returns true.
-  virtual bool RunLoopUntil(fit::function<bool()> condition) = 0;
-  // Runs the loop until |duration| as passed.
-  virtual void RunLoopFor(zx::duration duration) = 0;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_LOOP_CONTROLLER_H_
diff --git a/bin/ledger/testing/loop_controller_real_loop.cc b/bin/ledger/testing/loop_controller_real_loop.cc
deleted file mode 100644
index 0064cf1..0000000
--- a/bin/ledger/testing/loop_controller_real_loop.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/loop_controller_real_loop.h"
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/zx/time.h>
-
-#include "peridot/bin/ledger/testing/blocking_callback_waiter.h"
-
-namespace ledger {
-
-namespace {
-
-// Implementation of a SubLoop that uses a real loop.
-class SubLoopRealLoop : public SubLoop {
- public:
-  SubLoopRealLoop() : loop_(&kAsyncLoopConfigNoAttachToThread) {
-    loop_.StartThread();
-  };
-
-  ~SubLoopRealLoop() override { loop_.Shutdown(); }
-
-  void DrainAndQuit() override {
-    async::TaskClosure quit_task([this] { loop_.Quit(); });
-    quit_task.Post(loop_.dispatcher());
-    loop_.JoinThreads();
-  }
-
-  async_dispatcher_t* dispatcher() override { return loop_.dispatcher(); }
-
- private:
-  async::Loop loop_;
-};
-
-}  // namespace
-
-LoopControllerRealLoop::LoopControllerRealLoop()
-    : loop_(&kAsyncLoopConfigAttachToThread) {}
-
-LoopControllerRealLoop::~LoopControllerRealLoop() {}
-
-void LoopControllerRealLoop::RunLoop() {
-  loop_.Run();
-  loop_.ResetQuit();
-}
-
-void LoopControllerRealLoop::StopLoop() { loop_.Quit(); }
-
-std::unique_ptr<SubLoop> LoopControllerRealLoop::StartNewLoop() {
-  return std::make_unique<SubLoopRealLoop>();
-}
-
-std::unique_ptr<CallbackWaiter> LoopControllerRealLoop::NewWaiter() {
-  return std::make_unique<BlockingCallbackWaiter>(this);
-}
-
-async_dispatcher_t* LoopControllerRealLoop::dispatcher() {
-  return loop_.dispatcher();
-}
-
-bool LoopControllerRealLoop::RunLoopUntil(fit::function<bool()> condition) {
-  while (true) {
-    if (condition()) {
-      return true;
-    }
-    RunLoopFor(zx::msec(10));
-  }
-}
-
-void LoopControllerRealLoop::RunLoopFor(zx::duration duration) {
-  async::TaskClosure task([this] { loop_.Quit(); });
-  task.PostDelayed(loop_.dispatcher(), duration);
-  loop_.Run();
-  loop_.ResetQuit();
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/loop_controller_real_loop.h b/bin/ledger/testing/loop_controller_real_loop.h
deleted file mode 100644
index 0a72e7a..0000000
--- a/bin/ledger/testing/loop_controller_real_loop.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_LOOP_CONTROLLER_REAL_LOOP_H_
-#define PERIDOT_BIN_LEDGER_TESTING_LOOP_CONTROLLER_REAL_LOOP_H_
-
-#include <memory>
-
-#include <lib/async-loop/cpp/loop.h>
-
-#include "peridot/bin/ledger/testing/loop_controller.h"
-
-namespace ledger {
-
-// Implementation of a LoopController that uses a real loop.
-class LoopControllerRealLoop : public LoopController {
- public:
-  LoopControllerRealLoop();
-  ~LoopControllerRealLoop() override;
-
-  void RunLoop() override;
-
-  void StopLoop() override;
-
-  std::unique_ptr<SubLoop> StartNewLoop() override;
-
-  std::unique_ptr<CallbackWaiter> NewWaiter() override;
-
-  async_dispatcher_t* dispatcher() override;
-
-  bool RunLoopUntil(fit::function<bool()> condition) override;
-
-  void RunLoopFor(zx::duration duration) override;
-
- private:
-  async::Loop loop_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_LOOP_CONTROLLER_REAL_LOOP_H_
diff --git a/bin/ledger/testing/loop_controller_test_loop.cc b/bin/ledger/testing/loop_controller_test_loop.cc
deleted file mode 100644
index 505d014..0000000
--- a/bin/ledger/testing/loop_controller_test_loop.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/loop_controller_test_loop.h"
-
-#include <lib/async/cpp/task.h>
-#include <lib/fit/defer.h>
-#include <memory>
-
-namespace ledger {
-
-namespace {
-
-class SubLoopTestLoop : public SubLoop {
- public:
-  explicit SubLoopTestLoop(LoopController* controller,
-                           std::unique_ptr<async::LoopInterface> loop_interface)
-      : controller_(controller), loop_interface_(std::move(loop_interface)) {}
-
-  void DrainAndQuit() override {
-    // TODO(qsr): Implement drain on TestLoop.
-    auto waiter = controller_->NewWaiter();
-    async::PostTask(dispatcher(), waiter->GetCallback());
-    FXL_CHECK(waiter->RunUntilCalled());
-  }
-
-  async_dispatcher_t* dispatcher() override {
-    return loop_interface_->dispatcher();
-  }
-
- private:
-  LoopController* controller_;
-  std::unique_ptr<async::LoopInterface> loop_interface_;
-};
-
-class CallbackWaiterImpl : public CallbackWaiter {
- public:
-  explicit CallbackWaiterImpl(LoopController* loop) : loop_(loop) {}
-  CallbackWaiterImpl(const CallbackWaiterImpl&) = delete;
-  CallbackWaiterImpl& operator=(const CallbackWaiterImpl&) = delete;
-  ~CallbackWaiterImpl() override = default;
-
-  fit::function<void()> GetCallback() override {
-    return [this] {
-      ++callback_called_count_;
-      if (running_) {
-        loop_->StopLoop();
-      }
-    };
-  }
-
-  bool RunUntilCalled() override {
-    FXL_DCHECK(!running_);
-    running_ = true;
-    auto cleanup = fit::defer([this] { running_ = false; });
-    bool called = loop_->RunLoopUntil([this] { return !NotCalledYet(); });
-    if (called) {
-      ++run_until_called_count_;
-    }
-    return called;
-  }
-
-  bool NotCalledYet() override {
-    return callback_called_count_ <= run_until_called_count_;
-  }
-
- private:
-  LoopController* loop_;
-  size_t callback_called_count_ = 0;
-  size_t run_until_called_count_ = 0;
-  // Whether the waiter is currently in the |RunUntilCalled| method.
-  bool running_ = false;
-};
-
-}  // namespace
-
-LoopControllerTestLoop::LoopControllerTestLoop(async::TestLoop* loop)
-    : loop_(loop) {}
-
-LoopControllerTestLoop::~LoopControllerTestLoop() {}
-
-void LoopControllerTestLoop::RunLoop() { loop_->RunUntilIdle(); }
-
-void LoopControllerTestLoop::StopLoop() { loop_->Quit(); }
-
-std::unique_ptr<SubLoop> LoopControllerTestLoop::StartNewLoop() {
-  return std::make_unique<SubLoopTestLoop>(
-      this,
-      std::unique_ptr<async::LoopInterface>(loop_->StartNewLoop().release()));
-}
-
-std::unique_ptr<CallbackWaiter> LoopControllerTestLoop::NewWaiter() {
-  return std::make_unique<CallbackWaiterImpl>(this);
-}
-
-async_dispatcher_t* LoopControllerTestLoop::dispatcher() {
-  return loop_->dispatcher();
-}
-
-bool LoopControllerTestLoop::RunLoopUntil(fit::function<bool()> condition) {
-  if (condition()) {
-    return true;
-  }
-  // The condition is not true, but might be triggered after some delay due to a
-  // delayed task (for example, because of backoffs). Try to advance the loop in
-  // bigger and bigger increment. Fail if the event does not occur after ~100s
-  // as if something doesn't happen in 100 simulated s, then it will almost
-  // certainly be a problem for tests using a real loop.
-  for (size_t i : {0, 1, 10, 100}) {
-    loop_->RunFor(zx::sec(i));
-    if (condition()) {
-      return true;
-    }
-  }
-  return false;
-}
-
-void LoopControllerTestLoop::RunLoopFor(zx::duration duration) {
-  loop_->RunFor(duration);
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/loop_controller_test_loop.h b/bin/ledger/testing/loop_controller_test_loop.h
deleted file mode 100644
index bc1ba92..0000000
--- a/bin/ledger/testing/loop_controller_test_loop.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_LOOP_CONTROLLER_TEST_LOOP_H_
-#define PERIDOT_BIN_LEDGER_TESTING_LOOP_CONTROLLER_TEST_LOOP_H_
-
-#include <memory>
-
-#include <lib/async-testutils/test_loop.h>
-
-#include "peridot/bin/ledger/testing/loop_controller.h"
-
-namespace ledger {
-
-// Implementation of a LoopController that uses a test loop. The test loop
-// simulates the time in a deterministic way and does not rely on the real
-// (physical) clock.
-class LoopControllerTestLoop : public LoopController {
- public:
-  LoopControllerTestLoop(async::TestLoop* loop);
-  ~LoopControllerTestLoop() override;
-
-  void RunLoop() override;
-
-  void StopLoop() override;
-
-  std::unique_ptr<SubLoop> StartNewLoop() override;
-
-  std::unique_ptr<CallbackWaiter> NewWaiter() override;
-
-  async_dispatcher_t* dispatcher() override;
-
-  bool RunLoopUntil(fit::function<bool()> condition) override;
-
-  void RunLoopFor(zx::duration duration) override;
-
-  async::TestLoop& test_loop() { return *loop_; }
-
- private:
-  async::TestLoop* const loop_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_LOOP_CONTROLLER_TEST_LOOP_H_
diff --git a/bin/ledger/testing/netconnector/BUILD.gn b/bin/ledger/testing/netconnector/BUILD.gn
deleted file mode 100644
index 6d67c6f..0000000
--- a/bin/ledger/testing/netconnector/BUILD.gn
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("netconnector") {
-  testonly = true
-
-  sources = [
-    "fake_netconnector.cc",
-    "fake_netconnector.h",
-    "netconnector_factory.cc",
-    "netconnector_factory.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/fidl/fuchsia.netconnector",
-    "//garnet/public/lib/callback",
-    "//peridot/bin/ledger/fidl_helpers",
-    "//peridot/bin/ledger/testing:lib",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/test_runner/cpp/reporting",
-    "//peridot/lib/convert",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "netconnector_factory_unittest.cc",
-  ]
-
-  deps = [
-    ":netconnector",
-    "//garnet/public/fidl/fuchsia.netconnector",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/netconnector/cpp",
-    "//peridot/bin/ledger/environment",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/convert",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/testing/netconnector/fake_netconnector.cc b/bin/ledger/testing/netconnector/fake_netconnector.cc
deleted file mode 100644
index c0eaa12..0000000
--- a/bin/ledger/testing/netconnector/fake_netconnector.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/netconnector/fake_netconnector.h"
-
-namespace ledger {
-FakeNetConnector::FakeNetConnector(Delegate* delegate) : delegate_(delegate) {}
-
-void FakeNetConnector::ConnectToServiceProvider(
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> request) {
-  service_provider_impl_.AddBinding(std::move(request));
-}
-
-void FakeNetConnector::RegisterServiceProvider(
-    std::string name,
-    fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> service_provider) {
-  fuchsia::sys::ServiceProviderPtr service_provider_ptr =
-      service_provider.Bind();
-  service_provider_impl_.AddServiceForName(
-      [name, service_provider_ptr =
-                 std::move(service_provider_ptr)](zx::channel channel) {
-        service_provider_ptr->ConnectToService(name, std::move(channel));
-      },
-      name);
-}
-
-void FakeNetConnector::GetDeviceServiceProvider(
-    std::string device_name,
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> service_provider) {
-  delegate_->ConnectToServiceProvider(device_name, std::move(service_provider));
-}
-
-void FakeNetConnector::GetKnownDeviceNames(
-    uint64_t version_last_seen, GetKnownDeviceNamesCallback callback) {
-  delegate_->GetDevicesNames(version_last_seen, std::move(callback));
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/netconnector/fake_netconnector.h b/bin/ledger/testing/netconnector/fake_netconnector.h
deleted file mode 100644
index ddd3565..0000000
--- a/bin/ledger/testing/netconnector/fake_netconnector.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_NETCONNECTOR_FAKE_NETCONNECTOR_H_
-#define PERIDOT_BIN_LEDGER_TESTING_NETCONNECTOR_FAKE_NETCONNECTOR_H_
-
-#include <fuchsia/netconnector/cpp/fidl.h>
-#include <lib/component/cpp/service_provider_impl.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-namespace ledger {
-
-// FakeNetConnector implements NetConnector. It acts as the singleton
-// NetConnector for a (virtual) host.
-class FakeNetConnector : public fuchsia::netconnector::NetConnector {
- public:
-  class Delegate {
-   public:
-    virtual ~Delegate() {}
-
-    // Returns the list of known devices. See NetConnector::GetKnownDeviceNames
-    // for more details.
-    virtual void GetDevicesNames(
-        uint64_t last_version,
-        fit::function<void(uint64_t, std::vector<std::string>)>
-            callback) = 0;
-
-    // Connects to the ServiceProvider from host |device_name|.
-    virtual void ConnectToServiceProvider(
-        std::string device_name,
-        fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> request) = 0;
-  };
-
-  explicit FakeNetConnector(Delegate* delegate);
-  ~FakeNetConnector() override {}
-
-  // Connects to the service provider of this (virtual) host
-  void ConnectToServiceProvider(
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> request);
-
- private:
-  // NetConnector implementation:
-  void RegisterServiceProvider(
-      std::string name,
-      fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> service_provider)
-      override;
-  void GetDeviceServiceProvider(
-      std::string device_name,
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> service_provider)
-      override;
-  void GetKnownDeviceNames(uint64_t version_last_seen,
-                           GetKnownDeviceNamesCallback callback) override;
-
-  component::ServiceProviderImpl service_provider_impl_;
-  Delegate* const delegate_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeNetConnector);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_NETCONNECTOR_FAKE_NETCONNECTOR_H_
diff --git a/bin/ledger/testing/netconnector/netconnector_factory.cc b/bin/ledger/testing/netconnector/netconnector_factory.cc
deleted file mode 100644
index 21b0efe..0000000
--- a/bin/ledger/testing/netconnector/netconnector_factory.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/netconnector/netconnector_factory.h"
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fit/function.h>
-
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-class NetConnectorFactory::Holder {
- public:
-  Holder(FakeNetConnector::Delegate* delegate,
-         fidl::InterfaceRequest<fuchsia::netconnector::NetConnector> request,
-         std::string device_name, fit::closure on_disconnect);
-
-  void set_on_empty(fit::closure on_empty);
-
-  FakeNetConnector* impl();
-
- private:
-  void OnEmpty();
-
-  const std::string device_name_;
-  fidl_helpers::BoundInterface<fuchsia::netconnector::NetConnector,
-                               FakeNetConnector>
-      interface_;
-  fit::closure on_empty_;
-  fit::closure on_disconnect_;
-};
-
-NetConnectorFactory::Holder::Holder(
-    FakeNetConnector::Delegate* delegate,
-    fidl::InterfaceRequest<fuchsia::netconnector::NetConnector> request,
-    std::string device_name, fit::closure on_disconnect)
-    : device_name_(std::move(device_name)),
-      interface_(std::move(request), delegate),
-      on_disconnect_(std::move(on_disconnect)) {
-  interface_.set_on_empty([this] { OnEmpty(); });
-}
-
-void NetConnectorFactory::Holder::set_on_empty(fit::closure on_empty) {
-  on_empty_ = std::move(on_empty);
-}
-
-FakeNetConnector* NetConnectorFactory::Holder::impl() {
-  return interface_.impl();
-}
-
-void NetConnectorFactory::Holder::OnEmpty() {
-  // We need to deregister ourselves from the list of active devices (call
-  // |on_empty_|) before updating the pending host list callbacks (call
-  // |on_disconnect_|). As |on_empty_| destroys |this|, we move |on_disconnect_|
-  // locally to be able to call it later.
-  auto on_disconnect = std::move(on_disconnect_);
-  if (on_empty_) {
-    on_empty_();
-  }
-  if (on_disconnect) {
-    on_disconnect();
-  }
-}
-
-NetConnectorFactory::NetConnectorFactory() {}
-
-NetConnectorFactory::~NetConnectorFactory() {}
-
-void NetConnectorFactory::AddBinding(
-    std::string host_name,
-    fidl::InterfaceRequest<fuchsia::netconnector::NetConnector> request) {
-  net_connectors_.emplace(
-      std::piecewise_construct, std::forward_as_tuple(host_name),
-      std::forward_as_tuple(this, std::move(request), host_name,
-                            [this] { UpdatedHostList(); }));
-  UpdatedHostList();
-}
-
-void NetConnectorFactory::UpdatedHostList() {
-  current_version_++;
-  if (pending_device_list_callbacks_.empty()) {
-    return;
-  }
-  std::vector<std::string> device_names;
-  for (const auto& holder_pair : net_connectors_) {
-    device_names.push_back(holder_pair.first);
-  }
-  for (const auto& callback : pending_device_list_callbacks_) {
-    callback(current_version_, device_names);
-  }
-  pending_device_list_callbacks_.clear();
-}
-
-void NetConnectorFactory::GetDevicesNames(
-    uint64_t last_version,
-    fit::function<void(uint64_t, std::vector<std::string>)> callback) {
-  FXL_CHECK(last_version <= current_version_)
-      << "Last seen version (" << last_version
-      << ") is more recent than current version (" << current_version_
-      << "). Something is wrong here.";
-  if (last_version == current_version_) {
-    pending_device_list_callbacks_.push_back(std::move(callback));
-    return;
-  }
-  std::vector<std::string> device_names;
-  for (const auto& holder_pair : net_connectors_) {
-    device_names.push_back(holder_pair.first);
-  }
-  callback(current_version_, std::move(device_names));
-}
-
-void NetConnectorFactory::ConnectToServiceProvider(
-    std::string device_name,
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> request) {
-  auto it = net_connectors_.find(device_name);
-  if (it == net_connectors_.end()) {
-    return;
-  }
-  (*it).second.impl()->ConnectToServiceProvider(std::move(request));
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/netconnector/netconnector_factory.h b/bin/ledger/testing/netconnector/netconnector_factory.h
deleted file mode 100644
index 3b618d7..0000000
--- a/bin/ledger/testing/netconnector/netconnector_factory.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_NETCONNECTOR_NETCONNECTOR_FACTORY_H_
-#define PERIDOT_BIN_LEDGER_TESTING_NETCONNECTOR_NETCONNECTOR_FACTORY_H_
-
-#include <fuchsia/netconnector/cpp/fidl.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/fidl_helpers/bound_interface.h"
-#include "peridot/bin/ledger/testing/data_generator.h"
-#include "peridot/bin/ledger/testing/netconnector/fake_netconnector.h"
-
-namespace ledger {
-
-// NetConnectorFactory creates and manages connections to |FakeNetConnector|s.
-// It can be used to test the behavior of multiple NetConnector clients without
-// a multi-device setup.
-class NetConnectorFactory : public FakeNetConnector::Delegate {
- public:
-  NetConnectorFactory();
-  ~NetConnectorFactory() override;
-
-  // Creates a new virtual host with the given host name, and connects to its
-  // NetConnector.
-  void AddBinding(
-      std::string host_name,
-      fidl::InterfaceRequest<fuchsia::netconnector::NetConnector> request);
-
- private:
-  // Holder holds a NetConnector.
-  class Holder;
-
-  // UpdatedHostList is called when the list of hosts changes. It sends
-  // notifications to waiting clients as necessary.
-  void UpdatedHostList();
-
-  // FakeNetConnector::Delegate:
-  void GetDevicesNames(
-      uint64_t last_version,
-      fit::function<void(uint64_t, std::vector<std::string>)> callback)
-      override;
-  void ConnectToServiceProvider(
-      std::string device_name,
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> request) override;
-
-  // Counter incremented each time a NetConnector is added or removed; denotes
-  // the version of the current device list.
-  uint64_t current_version_ = 0;
-  std::vector<fit::function<void(uint64_t, std::vector<std::string>)>>
-      pending_device_list_callbacks_;
-  callback::AutoCleanableMap<std::string, Holder> net_connectors_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(NetConnectorFactory);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_NETCONNECTOR_NETCONNECTOR_FACTORY_H_
diff --git a/bin/ledger/testing/netconnector/netconnector_factory_unittest.cc b/bin/ledger/testing/netconnector/netconnector_factory_unittest.cc
deleted file mode 100644
index 7346c1a..0000000
--- a/bin/ledger/testing/netconnector/netconnector_factory_unittest.cc
+++ /dev/null
@@ -1,319 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/netconnector/netconnector_factory.h"
-
-#include <memory>
-
-#include <fuchsia/netconnector/cpp/fidl.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-#include <lib/netconnector/cpp/message_relay.h>
-
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-namespace {
-
-class NetConnectorFactoryTest : public gtest::TestLoopFixture {
- public:
-  NetConnectorFactoryTest() {}
-  ~NetConnectorFactoryTest() override {}
-
- protected:
-  NetConnectorFactory factory_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(NetConnectorFactoryTest);
-};
-
-// Verifies that the host list is correct for one host.
-TEST_F(NetConnectorFactoryTest, HostList_OneHost) {
-  fuchsia::netconnector::NetConnectorPtr netconnector1;
-  factory_.AddBinding("host1", netconnector1.NewRequest());
-
-  bool called = false;
-  uint64_t version = 0;
-  std::vector<std::string> host_list;
-  netconnector1->GetKnownDeviceNames(
-      fuchsia::netconnector::kInitialKnownDeviceNames,
-      callback::Capture(callback::SetWhenCalled(&called), &version,
-                        &host_list));
-
-  RunLoopUntilIdle();
-
-  EXPECT_TRUE(called);
-  EXPECT_NE(fuchsia::netconnector::kInitialKnownDeviceNames, version);
-  ASSERT_GE(1u, host_list.size());
-  EXPECT_EQ(1u, host_list.size());
-  EXPECT_EQ("host1", host_list.at(0));
-
-  called = false;
-  netconnector1->GetKnownDeviceNames(
-      version, callback::Capture(callback::SetWhenCalled(&called), &version,
-                                 &host_list));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-}
-
-// Verifies that the host list is correct for two hosts.
-TEST_F(NetConnectorFactoryTest, HostList_TwoHosts_Sequence) {
-  fuchsia::netconnector::NetConnectorPtr netconnector1;
-  factory_.AddBinding("host1", netconnector1.NewRequest());
-
-  bool called = false;
-  uint64_t version = 0;
-  std::vector<std::string> host_list;
-  netconnector1->GetKnownDeviceNames(
-      fuchsia::netconnector::kInitialKnownDeviceNames,
-      callback::Capture(callback::SetWhenCalled(&called), &version,
-                        &host_list));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  called = false;
-  uint64_t new_version = version;
-  netconnector1->GetKnownDeviceNames(
-      version, callback::Capture(callback::SetWhenCalled(&called), &new_version,
-                                 &host_list));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-
-  fuchsia::netconnector::NetConnectorPtr netconnector2;
-  factory_.AddBinding("host2", netconnector2.NewRequest());
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_NE(new_version, version);
-  ASSERT_GE(2u, host_list.size());
-  EXPECT_EQ(2u, host_list.size());
-  EXPECT_EQ("host1", host_list.at(0));
-  EXPECT_EQ("host2", host_list.at(1));
-
-  called = false;
-  netconnector2->GetKnownDeviceNames(
-      fuchsia::netconnector::kInitialKnownDeviceNames,
-      callback::Capture(callback::SetWhenCalled(&called), &new_version,
-                        &host_list));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  ASSERT_GE(2u, host_list.size());
-  EXPECT_EQ(2u, host_list.size());
-  EXPECT_EQ("host1", host_list.at(0));
-  EXPECT_EQ("host2", host_list.at(1));
-
-  netconnector2.Unbind();
-
-  netconnector1->GetKnownDeviceNames(
-      new_version, callback::Capture(callback::SetWhenCalled(&called),
-                                     &new_version, &host_list));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  ASSERT_GE(1u, host_list.size());
-  EXPECT_EQ(1u, host_list.size());
-  EXPECT_EQ("host1", host_list.at(0));
-}
-
-// Verifies that the host list is correct for two hosts when calls are chained,
-// ie. when we have a pending call for a new host list waiting when a host
-// connects or disconnects.
-TEST_F(NetConnectorFactoryTest, HostList_TwoHosts_Chained) {
-  fuchsia::netconnector::NetConnectorPtr netconnector1;
-  factory_.AddBinding("host1", netconnector1.NewRequest());
-
-  bool called = false;
-  uint64_t version = 0;
-  std::vector<std::string> host_list;
-  netconnector1->GetKnownDeviceNames(
-      fuchsia::netconnector::kInitialKnownDeviceNames,
-      callback::Capture(callback::SetWhenCalled(&called), &version,
-                        &host_list));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  called = false;
-  uint64_t new_version = version;
-  netconnector1->GetKnownDeviceNames(
-      version, callback::Capture(callback::SetWhenCalled(&called), &new_version,
-                                 &host_list));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-
-  fuchsia::netconnector::NetConnectorPtr netconnector2;
-  factory_.AddBinding("host2", netconnector2.NewRequest());
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_NE(new_version, version);
-  ASSERT_GE(2u, host_list.size());
-  EXPECT_EQ(2u, host_list.size());
-  EXPECT_EQ("host1", host_list.at(0));
-  EXPECT_EQ("host2", host_list.at(1));
-
-  netconnector1->GetKnownDeviceNames(
-      new_version, callback::Capture(callback::SetWhenCalled(&called),
-                                     &new_version, &host_list));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-
-  netconnector2.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  ASSERT_GE(1u, host_list.size());
-  EXPECT_EQ(1u, host_list.size());
-  EXPECT_EQ("host1", host_list.at(0));
-}
-
-TEST_F(NetConnectorFactoryTest, HostList_TwoHosts_Callback) {
-  fuchsia::netconnector::NetConnectorPtr netconnector1;
-  factory_.AddBinding("host1", netconnector1.NewRequest());
-
-  bool called = false;
-  uint64_t version = 0;
-  std::vector<std::string> host_list;
-  netconnector1->GetKnownDeviceNames(
-      fuchsia::netconnector::kInitialKnownDeviceNames,
-      callback::Capture(callback::SetWhenCalled(&called), &version,
-                        &host_list));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-
-  called = false;
-  uint64_t new_version;
-  netconnector1->GetKnownDeviceNames(
-      version, callback::Capture(callback::SetWhenCalled(&called), &new_version,
-                                 &host_list));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-
-  fuchsia::netconnector::NetConnectorPtr netconnector2;
-  factory_.AddBinding("host2", netconnector2.NewRequest());
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_NE(new_version, version);
-  ASSERT_GE(2u, host_list.size());
-  EXPECT_EQ(2u, host_list.size());
-  EXPECT_EQ("host1", host_list.at(0));
-  EXPECT_EQ("host2", host_list.at(1));
-
-  bool called2;
-  netconnector1->GetKnownDeviceNames(
-      new_version, callback::Capture(callback::SetWhenCalled(&called),
-                                     &new_version, &host_list));
-  netconnector2->GetKnownDeviceNames(
-      new_version, callback::Capture(callback::SetWhenCalled(&called2),
-                                     &new_version, &host_list));
-
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-  EXPECT_FALSE(called2);
-
-  netconnector2.Unbind();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_FALSE(called2);
-
-  ASSERT_GE(1u, host_list.size());
-  EXPECT_EQ(1u, host_list.size());
-  EXPECT_EQ("host1", host_list.at(0));
-}
-
-// Tests that two "hosts" can talk to each other through the NetConnector
-TEST_F(NetConnectorFactoryTest, ServiceProvider) {
-  // Sets up the first host (server).
-  fuchsia::netconnector::NetConnectorPtr netconnector1;
-  factory_.AddBinding("host1", netconnector1.NewRequest());
-
-  fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> handle;
-  component::ServiceProviderImpl service_provider1;
-  std::vector<std::unique_ptr<netconnector::MessageRelay>> relays_host1;
-  service_provider1.AddBinding(handle.NewRequest());
-  service_provider1.AddServiceForName(
-      [&relays_host1](zx::channel channel) {
-        auto relay = std::make_unique<netconnector::MessageRelay>();
-        relay->SetChannel(std::move(channel));
-        relays_host1.push_back(std::move(relay));
-      },
-      "test_service");
-  netconnector1->RegisterServiceProvider("test_service", std::move(handle));
-
-  RunLoopUntilIdle();
-
-  // Sets up the second host (client).
-  fuchsia::netconnector::NetConnectorPtr netconnector2;
-  factory_.AddBinding("host2", netconnector2.NewRequest());
-  zx::channel local;
-  zx::channel remote;
-  zx_status_t status = zx::channel::create(0u, &local, &remote);
-
-  FXL_CHECK(status == ZX_OK) << "zx::channel::create failed, status " << status;
-
-  fuchsia::sys::ServiceProviderPtr service_provider_ptr;
-  netconnector2->GetDeviceServiceProvider("host1",
-                                          service_provider_ptr.NewRequest());
-
-  service_provider_ptr->ConnectToService("test_service", std::move(remote));
-
-  RunLoopUntilIdle();
-
-  // Verifies that we have received the connection from host2 to host1.
-  ASSERT_GE(1u, relays_host1.size());
-  EXPECT_EQ(1u, relays_host1.size());
-
-  // Sets up MessageRelays to abstract sending messages through channels.
-  bool called_host1 = false;
-  std::vector<uint8_t> message_host1;
-  relays_host1[0]->SetMessageReceivedCallback(callback::Capture(
-      callback::SetWhenCalled(&called_host1), &message_host1));
-
-  netconnector::MessageRelay relay2;
-  relay2.SetChannel(std::move(local));
-  bool called_host2 = false;
-  std::vector<uint8_t> message_host2;
-  relay2.SetMessageReceivedCallback(callback::Capture(
-      callback::SetWhenCalled(&called_host2), &message_host2));
-
-  // Sends a message from host2 to host1.
-  relay2.SendMessage({0u, 1u});
-  RunLoopUntilIdle();
-
-  EXPECT_TRUE(called_host1);
-  EXPECT_FALSE(called_host2);
-  EXPECT_EQ(std::vector<uint8_t>({0u, 1u}), message_host1);
-
-  // Sends a message from host1 to host2.
-  called_host1 = false;
-  relays_host1[0]->SendMessage({2u, 3u});
-  RunLoopUntilIdle();
-
-  EXPECT_FALSE(called_host1);
-  EXPECT_TRUE(called_host2);
-  EXPECT_EQ(std::vector<uint8_t>({2u, 3u}), message_host2);
-
-  // Verifies that disconnection works.
-  bool relay2_disconnected = false;
-  relay2.SetChannelClosedCallback(
-      callback::SetWhenCalled(&relay2_disconnected));
-  relays_host1[0].reset();
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(relay2_disconnected);
-}
-}  // namespace
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/page_data_generator.cc b/bin/ledger/testing/page_data_generator.cc
deleted file mode 100644
index 533ac74..0000000
--- a/bin/ledger/testing/page_data_generator.cc
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/page_data_generator.h"
-
-#include <memory>
-
-#include <lib/callback/waiter.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-namespace {
-
-constexpr size_t kMaxInlineDataSize = ZX_CHANNEL_MAX_MSG_BYTES * 9 / 10;
-
-bool LogOnError(Status status, fxl::StringView description) {
-  if (status != Status::OK) {
-    FXL_LOG(ERROR) << description << " failed with status "
-                   << fidl::ToUnderlying(status) << ".";
-    return true;
-  }
-  return false;
-}
-
-}  // namespace
-
-PageDataGenerator::PageDataGenerator(rng::Random* random)
-    : generator_(random) {}
-
-void PageDataGenerator::PutEntry(PagePtr* page, std::vector<uint8_t> key,
-                                 std::vector<uint8_t> value,
-                                 ReferenceStrategy ref_strategy,
-                                 Priority priority,
-                                 fit::function<void(Status)> callback) {
-  if (ref_strategy == ReferenceStrategy::INLINE) {
-    if (value.size() >= kMaxInlineDataSize) {
-      FXL_LOG(ERROR)
-          << "Value too large (" << value.size()
-          << ") to be put inline. Consider putting as reference instead.";
-      callback(Status::IO_ERROR);
-      return;
-    }
-    (*page)->PutWithPriority(std::move(key), std::move(value), priority,
-                             [callback = std::move(callback)](Status status) {
-                               LogOnError(status, "Page::PutWithPriority");
-                               callback(status);
-                             });
-    return;
-  }
-  fsl::SizedVmo vmo;
-  if (!fsl::VmoFromString(convert::ToStringView(value), &vmo)) {
-    LogOnError(Status::IO_ERROR, "fsl::VmoFromString");
-    callback(Status::IO_ERROR);
-    return;
-  }
-  (*page)->CreateReferenceFromBuffer(
-      std::move(vmo).ToTransport(),
-      [page, key = std::move(key), priority, callback = std::move(callback)](
-          Status status, ReferencePtr reference) mutable {
-        if (LogOnError(status, "Page::CreateReferenceFromBuffer")) {
-          callback(status);
-          return;
-        }
-        (*page)->PutReference(std::move(key), std::move(*reference), priority,
-                              [callback = std::move(callback)](Status status) {
-                                LogOnError(status, "Page::PutReference");
-                                callback(status);
-                              });
-      });
-}
-
-void PageDataGenerator::Populate(PagePtr* page,
-                                 std::vector<std::vector<uint8_t>> keys,
-                                 size_t value_size, size_t transaction_size,
-                                 ReferenceStrategy ref_strategy,
-                                 Priority priority,
-                                 fit::function<void(Status)> callback) {
-  if (transaction_size == 0) {
-    PutMultipleEntries(page, std::move(keys), value_size, ref_strategy,
-                       priority, std::move(callback));
-    return;
-  }
-  PutInTransaction(page, std::move(keys), 0, value_size, transaction_size,
-                   ref_strategy, priority, std::move(callback));
-}
-
-void PageDataGenerator::PutInTransaction(
-    PagePtr* page, std::vector<std::vector<uint8_t>> keys,
-    size_t current_key_index, size_t value_size, size_t transaction_size,
-    ReferenceStrategy ref_strategy, Priority priority,
-    fit::function<void(Status)> callback) {
-  if (current_key_index >= keys.size()) {
-    callback(Status::OK);
-    return;
-  }
-  size_t this_transaction_size =
-      std::min(transaction_size, keys.size() - current_key_index);
-  std::vector<std::vector<uint8_t>> partial_keys;
-  std::move(keys.begin() + current_key_index,
-            keys.begin() + current_key_index + this_transaction_size,
-            std::back_inserter(partial_keys));
-
-  (*page)->StartTransaction(
-      [this, page, partial_keys = std::move(partial_keys),
-       keys = std::move(keys), current_key_index, transaction_size, value_size,
-       ref_strategy, priority,
-       callback = std::move(callback)](Status status) mutable {
-        if (LogOnError(status, "Page::StartTransaction")) {
-          callback(status);
-          return;
-        }
-        PutMultipleEntries(
-            page, std::move(partial_keys), value_size, ref_strategy, priority,
-            [this, page, keys = std::move(keys), current_key_index, value_size,
-             ref_strategy, priority, transaction_size,
-             callback = std::move(callback)](Status status) mutable {
-              if (LogOnError(status, "PutMultipleEntries")) {
-                callback(status);
-                return;
-              }
-              (*page)->Commit(
-                  [this, page, keys = std::move(keys), current_key_index,
-                   value_size, ref_strategy, transaction_size, priority,
-                   callback = std::move(callback)](Status status) mutable {
-                    if (LogOnError(status, "Page::Commit")) {
-                      callback(status);
-                      return;
-                    }
-                    PutInTransaction(page, std::move(keys),
-                                     current_key_index + transaction_size,
-                                     value_size, transaction_size, ref_strategy,
-                                     priority, std::move(callback));
-                  });
-            });
-      });
-}
-
-void PageDataGenerator::PutMultipleEntries(
-    PagePtr* page, std::vector<std::vector<uint8_t>> keys,
-    size_t value_size, ReferenceStrategy ref_strategy, Priority priority,
-    fit::function<void(Status)> callback) {
-  auto waiter = fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-  for (auto& key : keys) {
-    std::vector<uint8_t> value = generator_.MakeValue(value_size);
-    PutEntry(page, std::move(key), std::move(value), ref_strategy, priority,
-             waiter->NewCallback());
-  }
-  waiter->Finalize(std::move(callback));
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/page_data_generator.h b/bin/ledger/testing/page_data_generator.h
deleted file mode 100644
index 2330a15..0000000
--- a/bin/ledger/testing/page_data_generator.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_PAGE_DATA_GENERATOR_H_
-#define PERIDOT_BIN_LEDGER_TESTING_PAGE_DATA_GENERATOR_H_
-
-#include <vector>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/testing/data_generator.h"
-#include "peridot/lib/rng/random.h"
-
-namespace ledger {
-
-// Helper class for filling a ledger page with random data.
-class PageDataGenerator {
- public:
-  // Strategy on how to put values: inline or as references.
-  // INLINE: Put entry inline (as a FIDL array).
-  // REFERENCE: Put entry as reference.
-  enum class ReferenceStrategy {
-    INLINE,
-    REFERENCE,
-  };
-
-  PageDataGenerator(rng::Random* random);
-
-  // Put an entry (|key|, |value|) to the given page |page|, inline or as
-  // reference depending on |ref_strategy| and with priority specified by
-  // |priority|.
-  void PutEntry(PagePtr* page, std::vector<uint8_t> key,
-                std::vector<uint8_t> value, ReferenceStrategy ref_strategy,
-                Priority priority, fit::function<void(Status)> callback);
-
-  // Fill the page |page| with entries with keys |keys| and random values of
-  // size |value_size|, performing at maximum
-  // |transaction_size| Put operations per commit.
-  void Populate(PagePtr* page, std::vector<std::vector<uint8_t>> keys,
-                size_t value_size, size_t transaction_size,
-                ReferenceStrategy ref_strategy, Priority priority,
-                fit::function<void(Status)> /*callback*/);
-
- private:
-  // Run PutEntry |transaction_size| times on provided keys |keys| with random
-  // values of size |value_size|. in transaction starting with key
-  // number |curent_key_index|. After commiting a transaction, run a next one
-  // recursively. Call |callback| with Status::OK once all keys have been put,
-  // or with a first encountered status that is different from Status::OK.
-  void PutInTransaction(PagePtr* page,
-                        std::vector<std::vector<uint8_t>> keys,
-                        size_t current_key_index, size_t value_size,
-                        size_t transaction_size, ReferenceStrategy ref_strategy,
-                        Priority priority,
-                        fit::function<void(Status)> callback);
-
-  // Run PutEntry on all the provided keys in |keys| with random value of size
-  // |value_size|.
-  void PutMultipleEntries(PagePtr* page,
-                          std::vector<std::vector<uint8_t>> keys,
-                          size_t value_size, ReferenceStrategy ref_strategy,
-                          Priority priority,
-                          fit::function<void(Status)> /*callback*/);
-
-  DataGenerator generator_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_PAGE_DATA_GENERATOR_H_
diff --git a/bin/ledger/testing/quit_on_error.cc b/bin/ledger/testing/quit_on_error.cc
deleted file mode 100644
index a89cd4c..0000000
--- a/bin/ledger/testing/quit_on_error.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/quit_on_error.h"
-
-#include <lib/fit/function.h>
-
-namespace ledger {
-
-bool QuitOnError(fit::closure quit_callback, Status status,
-                 fxl::StringView description) {
-  if (status != Status::OK) {
-    FXL_LOG(ERROR) << description << " failed with status "
-                   << fidl::ToUnderlying(status) << ".";
-    quit_callback();
-    return true;
-  }
-  return false;
-}
-
-fit::function<void(Status)> QuitOnErrorCallback(fit::closure quit_callback,
-                                                std::string description) {
-  return [quit_callback = std::move(quit_callback),
-          description = std::move(description)](Status status) mutable {
-    QuitOnError(quit_callback.share(), status, description);
-  };
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/quit_on_error.h b/bin/ledger/testing/quit_on_error.h
deleted file mode 100644
index 8e9a911..0000000
--- a/bin/ledger/testing/quit_on_error.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_QUIT_ON_ERROR_H_
-#define PERIDOT_BIN_LEDGER_TESTING_QUIT_ON_ERROR_H_
-
-#include <functional>
-#include <string>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-
-namespace ledger {
-
-// Logs an error and calls |quit_callback| which quits a related message loop if
-// the given ledger status is not Status::OK. Returns true if the loop
-// was quit .
-bool QuitOnError(fit::closure quit_callback, Status status,
-                 fxl::StringView description);
-
-fit::function<void(Status)> QuitOnErrorCallback(fit::closure quit_callback,
-                                                std::string description);
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_QUIT_ON_ERROR_H_
diff --git a/bin/ledger/testing/run_with_tracing.cc b/bin/ledger/testing/run_with_tracing.cc
deleted file mode 100644
index a099165..0000000
--- a/bin/ledger/testing/run_with_tracing.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/run_with_tracing.h"
-
-#include <lib/async/cpp/task.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-#include <trace-provider/provider.h>
-#include <trace/event.h>
-#include <trace/observer.h>
-
-namespace ledger {
-
-int RunWithTracing(async::Loop* loop, fit::function<void()> runnable) {
-  trace::TraceProvider trace_provider(loop->dispatcher());
-  trace::TraceObserver trace_observer;
-
-  bool started = false;
-  auto on_trace_state_changed = [runnable = std::move(runnable), &started]() {
-    if (TRACE_CATEGORY_ENABLED("benchmark") && !started) {
-      started = true;
-      runnable();
-    }
-  };
-  // In case tracing has already started.
-  on_trace_state_changed();
-
-  if (!started) {
-    trace_observer.Start(loop->dispatcher(), std::move(on_trace_state_changed));
-  }
-
-  int err = 0;
-  async::TaskClosure quit_task([&started, loop, &err] {
-    if (!started) {
-      // To avoid running the runnable if the tracing state changes to
-      // started in the immediate next task on the queue (before the quit
-      // task executes).
-      started = true;
-      FXL_LOG(ERROR)
-          << "Timed out waiting for the tracing to start; Did you run the "
-             "binary with the trace tool enabled?";
-      err = -1;
-      loop->Quit();
-    }
-  });
-  quit_task.PostDelayed(loop->dispatcher(), zx::sec(5));
-
-  loop->Run();
-  return err;
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/run_with_tracing.h b/bin/ledger/testing/run_with_tracing.h
deleted file mode 100644
index cab145f..0000000
--- a/bin/ledger/testing/run_with_tracing.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_RUN_WITH_TRACING_H_
-#define PERIDOT_BIN_LEDGER_TESTING_RUN_WITH_TRACING_H_
-
-#include <functional>
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fit/function.h>
-
-namespace ledger {
-
-// Adds a TraceObserver to start running |runnable| as soon as the tracing is
-// enabled; then runs the message loop |loop|.
-// If tracing is still not enabled after 5 seconds, posts a quit task.
-int RunWithTracing(async::Loop* loop, fit::function<void()> runnable);
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_RUN_WITH_TRACING_H_
diff --git a/bin/ledger/testing/sync_params.cc b/bin/ledger/testing/sync_params.cc
deleted file mode 100644
index 1921155..0000000
--- a/bin/ledger/testing/sync_params.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/sync_params.h"
-
-#include <iostream>
-
-#include <fuchsia/net/oldhttp/cpp/fidl.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/strings/string_view.h>
-#include <openssl/sha.h>
-
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/firebase_auth/testing/credentials.h"
-#include "peridot/lib/firebase_auth/testing/json_schema.h"
-
-namespace {
-
-namespace http = ::fuchsia::net::oldhttp;
-
-constexpr fxl::StringView kSyncParamsSchema = R"({
-  "type": "object",
-  "properties": {
-    "api-key": {
-      "type": "string"
-    },
-    "service-account": {
-      "type": "object"
-    }
-  },
-  "required": ["api-key", "service-account"]
-})";
-
-constexpr fxl::StringView kCredentialsPathFlag = "credentials-path";
-constexpr fxl::StringView kGnCredentialsPathArg =
-    "ledger_sync_credentials_file";
-constexpr fxl::StringView kCredentialsDefaultPath =
-    "/pkg/data/sync_credentials.json";
-
-// URL that the sync infra bots use to pass the sync credentials to the tests.
-constexpr fxl::StringView kCredentialsFetchUrl =
-    "http://10.0.2.2:8081/ledger_e2e_sync_credentials";
-
-void WarnIncorrectSyncParams() {
-  std::cerr << "Missing the sync parameters." << std::endl;
-  std::cerr << "This binary needs an ID of a configured Firestore instance "
-               "to run along with access credentials. "
-            << std::endl;
-  std::cerr << "Please set the GN argument " << kGnCredentialsPathArg
-            << " at build time to embed the credentials in the binary "
-            << " or pass " << kCredentialsPathFlag
-            << " at run time to override the default location" << std::endl;
-  std::cerr << "If you're running it from a .tspec file, make sure "
-               "you add --append-args=\""
-               "--"
-            << kCredentialsPathFlag << "=<file path>" << std::endl;
-  std::cerr << "if the access credentials are not embedded in the binary "
-            << "at build." << std::endl;
-}
-
-// Fetches the sync credentials from the network. This method is synchronous and
-// blocks until credentials are retrieved. This is intended exclusively for
-// infra bots that will expose the credentials over the network when running
-// sync tests.
-bool FetchCredentials(component::StartupContext* startup_context,
-                      std::string* credentials_path, std::string* credentials) {
-  *credentials_path = kCredentialsFetchUrl.ToString();
-
-  fidl::SynchronousInterfacePtr<http::HttpService> network_service;
-  startup_context->ConnectToEnvironmentService(network_service.NewRequest());
-  fidl::SynchronousInterfacePtr<http::URLLoader> url_loader;
-
-  zx_status_t status =
-      network_service->CreateURLLoader(url_loader.NewRequest());
-  if (status != ZX_OK) {
-    FXL_LOG(WARNING) << "Unable to retrieve an URLLoader.";
-    return false;
-  }
-
-  http::URLRequest request;
-  request.method = "GET";
-  request.url = kCredentialsFetchUrl.ToString();
-  request.response_body_mode = http::ResponseBodyMode::BUFFER;
-  http::URLResponse response;
-
-  status = url_loader->Start(std::move(request), &response);
-  if (status != ZX_OK) {
-    FXL_LOG(WARNING) << "Unable to start the network request.";
-    return false;
-  }
-
-  if (response.error) {
-    FXL_LOG(ERROR) << "Net error " << response.error->code << ": "
-                   << response.error->description;
-    return false;
-  }
-
-  if (response.status_code != 200) {
-    FXL_LOG(ERROR) << "Unexpected HTTP status code: " << response.status_code;
-    return false;
-  }
-
-  return fsl::StringFromVmo(response.body->buffer(), credentials);
-}
-
-// Extracts the credentials content. This function will return |true| if it
-// finds the credentials in either:
-// - The command line
-// - The default location in the running package
-// - Over the network.
-// In that case, |credentials| will contain the content of the credentials file
-// and |credentials_path| the path to the file.
-// If it cannot find the credentials, this function will return |false|, and
-// |credentials_path| will contain the path of the last tried location.
-bool GetCredentialsContent(const fxl::CommandLine& command_line,
-                           component::StartupContext* startup_context,
-                           std::string* credentials_path,
-                           std::string* credentials) {
-  if (command_line.GetOptionValue(kCredentialsPathFlag.ToString(),
-                                  credentials_path)) {
-    return files::ReadFileToString(*credentials_path, credentials);
-  }
-  *credentials_path = kCredentialsDefaultPath.ToString();
-  if (files::IsFile(*credentials_path)) {
-    return files::ReadFileToString(*credentials_path, credentials);
-  }
-
-  return FetchCredentials(startup_context, credentials_path, credentials);
-}
-
-std::string Hash(fxl::StringView data) {
-  char result[SHA256_DIGEST_LENGTH];
-  SHA256_CTX sha256;
-  SHA256_Init(&sha256);
-  SHA256_Update(&sha256, data.data(), data.size());
-  SHA256_Final(reinterpret_cast<uint8_t*>(result), &sha256);
-  return convert::ToHex(fxl::StringView(result, SHA256_DIGEST_LENGTH));
-}
-
-}  // namespace
-
-namespace ledger {
-
-SyncParams::SyncParams() = default;
-
-SyncParams::SyncParams(SyncParams&& other) = default;
-
-SyncParams::SyncParams(const SyncParams& other) { *this = other; }
-
-SyncParams& SyncParams::operator=(SyncParams&& other) = default;
-
-SyncParams& SyncParams::operator=(const SyncParams& other) {
-  api_key = other.api_key;
-  if (other.credentials) {
-    credentials = other.credentials->Clone();
-  }
-  return *this;
-}
-
-std::string GetSyncParamsUsage() {
-  std::ostringstream result;
-  result << " [--" << kCredentialsPathFlag << "=<file path>]";
-  return result.str();
-}
-
-std::string ExtractJsonObject(const std::string& content) {
-  auto start = content.find('{');
-  auto end = content.rfind('}');
-  if (start != std::string::npos && end != std::string::npos && start < end) {
-    return content.substr(start, end + 1 - start);
-  }
-  return "";
-}
-
-bool ParseSyncParamsFromCommandLine(const fxl::CommandLine& command_line,
-                                    component::StartupContext* startup_context,
-                                    SyncParams* sync_params) {
-  std::string credentials;
-  std::string credentials_path;
-  if (!GetCredentialsContent(command_line, startup_context, &credentials_path,
-                             &credentials)) {
-    std::cerr << "Cannot access " << credentials_path << std::endl;
-    WarnIncorrectSyncParams();
-    return false;
-  }
-
-  FXL_LOG(INFO) << "Sync credentials sha256: " << Hash(credentials);
-
-  rapidjson::Document document;
-  document.Parse(credentials);
-  if (document.HasParseError()) {
-    std::cerr << "Cannot parse sync parameters at " << credentials_path
-              << std::endl;
-    // TODO(qsr): NET-1636 Remove this code once the network service handles
-    // chunked encoding. Extract the content of credentials from the first '{'
-    // to the last '}' to work around the network service not handling chunked
-    // encoding.
-    std::cerr << "Trying to extract a JSON object." << std::endl;
-    credentials = ExtractJsonObject(credentials);
-    if (credentials.empty()) {
-      return false;
-    }
-    document.Parse(credentials);
-    if (document.HasParseError()) {
-      return false;
-    }
-  }
-  auto sync_params_schema = json_schema::InitSchema(kSyncParamsSchema);
-  if (!json_schema::ValidateSchema(document, *sync_params_schema)) {
-    std::cerr << "Invalid schema at " << credentials_path << std::endl;
-    return false;
-  }
-
-  sync_params->api_key = document["api-key"].GetString();
-  sync_params->credentials =
-      service_account::Credentials::Parse(document["service-account"]);
-  if (!sync_params->credentials) {
-    std::cerr << "Cannot parse credentials at " << credentials_path
-              << std::endl;
-    return false;
-  }
-  return true;
-}
-
-std::set<std::string> GetSyncParamFlags() {
-  return {kCredentialsPathFlag.ToString()};
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/sync_params.gni b/bin/ledger/testing/sync_params.gni
deleted file mode 100644
index 501a99a..0000000
--- a/bin/ledger/testing/sync_params.gni
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-declare_args() {
-  ledger_sync_credentials_file = ""
-}
diff --git a/bin/ledger/testing/sync_params.h b/bin/ledger/testing/sync_params.h
deleted file mode 100644
index 3aeb400..0000000
--- a/bin/ledger/testing/sync_params.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_SYNC_PARAMS_H_
-#define PERIDOT_BIN_LEDGER_TESTING_SYNC_PARAMS_H_
-
-#include <set>
-#include <string>
-
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/lib/firebase_auth/testing/credentials.h"
-
-namespace ledger {
-
-// Parameters needed to configure synchronization against a real server.
-struct SyncParams {
-  SyncParams();
-  SyncParams(const SyncParams& other);
-  SyncParams(SyncParams&& other);
-  SyncParams& operator=(const SyncParams& other);
-  SyncParams& operator=(SyncParams&& other);
-
-  // API key used to access the database.
-  std::string api_key;
-
-  // Credentials for the cloud service.
-  std::unique_ptr<service_account::Credentials> credentials;
-};
-
-// Returns a string listing the command-line parameters which need to be
-// provided for a benchmark to connect to a cloud server.
-std::string GetSyncParamsUsage();
-
-// Reads the sync parameters from the command-line. Prints a warning and returns
-// false if these parameters are missing or cannot be parsed.
-bool ParseSyncParamsFromCommandLine(const fxl::CommandLine& command_line,
-                                    component::StartupContext* startup_context,
-                                    SyncParams* sync_params);
-
-// Returns the names of the flags parsed from the command line by
-// ParseSyncParamsFromCommandLine(), without the leading "--".
-std::set<std::string> GetSyncParamFlags();
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_SYNC_PARAMS_H_
diff --git a/bin/ledger/testing/test_with_environment.cc b/bin/ledger/testing/test_with_environment.cc
deleted file mode 100644
index 5a19b73..0000000
--- a/bin/ledger/testing/test_with_environment.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/test_with_environment.h"
-
-#include <lib/component/cpp/testing/startup_context_for_test.h>
-#include <lib/fit/function.h>
-#include <lib/timekeeper/test_loop_test_clock.h>
-
-#include "peridot/lib/rng/test_random.h"
-
-namespace ledger {
-
-namespace {
-
-// Wrapper around a real CoroutineHandler for test.
-//
-// The wrapper allows to delay re-entering the coroutine body when the run loop
-// is running. When |Resume| is called, it quits the loop, and the main method
-// calls |ResumeIfNeeded| when the loop exits.
-class TestCoroutineHandler : public coroutine::CoroutineHandler {
- public:
-  explicit TestCoroutineHandler(coroutine::CoroutineHandler* delegate,
-                                fit::closure quit_callback)
-      : delegate_(delegate), quit_callback_(std::move(quit_callback)) {}
-
-  coroutine::ContinuationStatus Yield() override { return delegate_->Yield(); }
-
-  void Resume(coroutine::ContinuationStatus status) override {
-    // If interrupting, no need to delay the call as the test will not run the
-    // loop itself.
-    if (status == coroutine::ContinuationStatus::INTERRUPTED) {
-      delegate_->Resume(status);
-      return;
-    }
-    quit_callback_();
-    need_to_continue_ = true;
-  }
-
-  // Re-enters the coroutine body if the handler delayed the call.
-  void ResumeIfNeeded() {
-    if (need_to_continue_) {
-      need_to_continue_ = false;
-      delegate_->Resume(coroutine::ContinuationStatus::OK);
-    }
-  }
-
- private:
-  std::unique_ptr<component::StartupContext> startup_context_;
-  coroutine::CoroutineHandler* delegate_;
-  fit::closure quit_callback_;
-  bool need_to_continue_ = false;
-};
-
-}  // namespace
-
-TestWithEnvironment::TestWithEnvironment()
-    : startup_context_(component::testing::StartupContextForTest::Create()),
-      environment_(
-          EnvironmentBuilder()
-              .SetAsync(dispatcher())
-              .SetIOAsync(dispatcher())
-              .SetStartupContext(startup_context_.get())
-              .SetClock(
-                  std::make_unique<timekeeper::TestLoopTestClock>(&test_loop()))
-              .SetRandom(std::make_unique<rng::TestRandom>(
-                  test_loop().initial_state()))
-              .Build()) {}
-
-void TestWithEnvironment::RunInCoroutine(
-    fit::function<void(coroutine::CoroutineHandler*)> run_test) {
-  std::unique_ptr<TestCoroutineHandler> test_handler;
-  volatile bool ended = false;
-  environment_.coroutine_service()->StartCoroutine(
-      [&](coroutine::CoroutineHandler* handler) {
-        test_handler = std::make_unique<TestCoroutineHandler>(
-            handler, [this] { QuitLoop(); });
-        run_test(test_handler.get());
-        ended = true;
-      });
-  while (!ended) {
-    test_handler->ResumeIfNeeded();
-    RunLoopUntilIdle();
-  }
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/testing/test_with_environment.h b/bin/ledger/testing/test_with_environment.h
deleted file mode 100644
index 6e8a38c..0000000
--- a/bin/ledger/testing/test_with_environment.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTING_TEST_WITH_ENVIRONMENT_H_
-#define PERIDOT_BIN_LEDGER_TESTING_TEST_WITH_ENVIRONMENT_H_
-
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/bin/ledger/coroutine/coroutine_impl.h"
-#include "peridot/bin/ledger/environment/environment.h"
-
-namespace ledger {
-
-class TestWithEnvironment : public gtest::TestLoopFixture {
- public:
-  TestWithEnvironment();
-
- protected:
-  // Runs the given test code in a coroutine.
-  void RunInCoroutine(
-      fit::function<void(coroutine::CoroutineHandler*)> run_test);
-
-  std::unique_ptr<component::StartupContext> startup_context_;
-  Environment environment_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestWithEnvironment);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTING_TEST_WITH_ENVIRONMENT_H_
diff --git a/bin/ledger/tests/benchmark/BUILD.gn b/bin/ledger/tests/benchmark/BUILD.gn
deleted file mode 100644
index 34ed4dd..0000000
--- a/bin/ledger/tests/benchmark/BUILD.gn
+++ /dev/null
@@ -1,292 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/package.gni")
-import("//peridot/bin/ledger/testing/sync_params.gni")
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-package("ledger_benchmarks") {
-  testonly = true
-
-  deps = [
-    "//peridot/bin/ledger/tests/benchmark/backlog",
-    "//peridot/bin/ledger/tests/benchmark/convergence",
-    "//peridot/bin/ledger/tests/benchmark/delete_entry",
-    "//peridot/bin/ledger/tests/benchmark/disk_space",
-    "//peridot/bin/ledger/tests/benchmark/fetch",
-    "//peridot/bin/ledger/tests/benchmark/get_page",
-    "//peridot/bin/ledger/tests/benchmark/put",
-    "//peridot/bin/ledger/tests/benchmark/sync",
-    "//peridot/bin/ledger/tests/benchmark/update_entry",
-  ]
-
-  meta = [
-    {
-      path = rebase_path("backlog/backlog.cmx")
-      dest = "backlog.cmx"
-    },
-    {
-      path = rebase_path("get_page/get_page.cmx")
-      dest = "get_page.cmx"
-    },
-    {
-      path = rebase_path("delete_entry/delete_entry.cmx")
-      dest = "delete_entry.cmx"
-    },
-    {
-      path = rebase_path("disk_space/disk_space.cmx")
-      dest = "disk_space.cmx"
-    },
-    {
-      path = rebase_path("convergence/convergence.cmx")
-      dest = "convergence.cmx"
-    },
-    {
-      path = rebase_path("fetch/fetch.cmx")
-      dest = "fetch.cmx"
-    },
-    {
-      path = rebase_path("put/put.cmx")
-      dest = "put.cmx"
-    },
-    {
-      path = rebase_path("sync/sync.cmx")
-      dest = "sync.cmx"
-    },
-    {
-      path = rebase_path("update_entry/update_entry.cmx")
-      dest = "update_entry.cmx"
-    },
-  ]
-
-  binaries = [
-    {
-      name = "ledger_benchmark_backlog"
-    },
-
-    {
-      name = "ledger_benchmark_get_page"
-    },
-
-    {
-      name = "ledger_benchmark_delete_entry"
-    },
-
-    {
-      name = "ledger_benchmark_disk_space"
-    },
-
-    {
-      name = "ledger_benchmark_convergence"
-    },
-
-    {
-      name = "ledger_benchmark_fetch"
-    },
-
-    {
-      name = "ledger_benchmark_put"
-    },
-
-    {
-      name = "ledger_benchmark_sync"
-    },
-
-    {
-      name = "ledger_benchmark_update_entry"
-    },
-  ]
-
-  resources = [
-    {
-      path = rebase_path("get_page/add_new_page.tspec")
-      dest = "add_new_page.tspec"
-    },
-
-    {
-      path = rebase_path("get_page/add_new_page_precached.tspec")
-      dest = "add_new_page_precached.tspec"
-    },
-
-    {
-      path = rebase_path("backlog/backlog.tspec")
-      dest = "backlog.tspec"
-    },
-
-    {
-      path = rebase_path("backlog/backlog_big_entry.tspec")
-      dest = "backlog_big_entry.tspec"
-    },
-
-    {
-      path = rebase_path("backlog/backlog_big_entry_updates.tspec")
-      dest = "backlog_big_entry_updates.tspec"
-    },
-
-    {
-      path = rebase_path("backlog/backlog_many_big_entries.tspec")
-      dest = "backlog_many_big_entries.tspec"
-    },
-
-    {
-      path = rebase_path("backlog/backlog_many_small_entries.tspec")
-      dest = "backlog_many_small_entries.tspec"
-    },
-
-    {
-      path = rebase_path("backlog/backlog_small_entry_updates.tspec")
-      dest = "DISABLED_backlog_small_entry_updates.tspec"
-    },
-
-    {
-      path = rebase_path("delete_entry/disk_space_cleared_page.tspec")
-      dest = "disk_space_cleared_page.tspec"
-    },
-
-    {
-      path = rebase_path("disk_space/entries.tspec")
-      dest = "disk_space_entries.tspec"
-    },
-
-    {
-      path = rebase_path("disk_space/empty_ledger.tspec")
-      dest = "disk_space_empty_ledger.tspec"
-    },
-
-    {
-      path = rebase_path("disk_space/empty_pages.tspec")
-      dest = "disk_space_empty_pages.tspec"
-    },
-
-    {
-      path = rebase_path("disk_space/small_keys.tspec")
-      dest = "disk_space_small_keys.tspec"
-    },
-
-    {
-      path = rebase_path("disk_space/one_commit_per_entry.tspec")
-      dest = "disk_space_one_commit_per_entry.tspec"
-    },
-
-    {
-      path = rebase_path("backlog/disk_space_synced_updates.tspec")
-      dest = "disk_space_synced_updates.tspec"
-    },
-
-    {
-      path = rebase_path("backlog/disk_space_synced_entries.tspec")
-      dest = "disk_space_synced_entries.tspec"
-    },
-
-    {
-      path = rebase_path("backlog/disk_space_synced_entries_small_keys.tspec")
-      dest = "disk_space_synced_entries_small_keys.tspec"
-    },
-
-    {
-      path = rebase_path("disk_space/updates.tspec")
-      dest = "disk_space_updates.tspec"
-    },
-
-    {
-      path = rebase_path("get_page/get_same_page.tspec")
-      dest = "get_same_page.tspec"
-    },
-
-    {
-      path = rebase_path("get_page/get_page_id.tspec")
-      dest = "get_page_id.tspec"
-    },
-
-    {
-      path = rebase_path("convergence/convergence.tspec")
-      dest = "convergence.tspec"
-    },
-
-    {
-      path = rebase_path("convergence/multidevice_convergence.tspec")
-      dest = "multidevice_convergence.tspec"
-    },
-
-    {
-      path = rebase_path("put/transaction.tspec")
-      dest = "transaction.tspec"
-    },
-
-    {
-      path = rebase_path("put/put.tspec")
-      dest = "put.tspec"
-    },
-
-    {
-      path = rebase_path("put/put_big_entry.tspec")
-      dest = "put_big_entry.tspec"
-    },
-
-    {
-      path = rebase_path("put/put_as_reference.tspec")
-      dest = "put_as_reference.tspec"
-    },
-
-    {
-      path = rebase_path("sync/sync.tspec")
-      dest = "sync.tspec"
-    },
-
-    {
-      path = rebase_path("sync/sync_big_change.tspec")
-      dest = "sync_big_change.tspec"
-    },
-
-    {
-      path = rebase_path("update_entry/update_entry.tspec")
-      dest = "update_entry.tspec"
-    },
-
-    {
-      path = rebase_path("update_entry/update_big_entry.tspec")
-      dest = "update_big_entry.tspec"
-    },
-
-    {
-      path = rebase_path("update_entry/update_entry_transactions.tspec")
-      dest = "update_entry_transactions.tspec"
-    },
-
-    {
-      path = rebase_path("fetch/fetch.tspec")
-      dest = "fetch.tspec"
-    },
-
-    {
-      path = rebase_path("fetch/fetch_partial_big_entry.tspec")
-      dest = "fetch_partial_big_entry.tspec"
-    },
-
-    {
-      path = rebase_path("delete_entry/delete_entry.tspec")
-      dest = "delete_entry.tspec"
-    },
-
-    {
-      path = rebase_path("delete_entry/delete_entry_transactions.tspec")
-      dest = "delete_entry_transactions.tspec"
-    },
-
-    {
-      path = rebase_path("delete_entry/delete_big_entry.tspec")
-      dest = "delete_big_entry.tspec"
-    },
-  ]
-
-  if (ledger_sync_credentials_file != "") {
-    resources += [
-      {
-        path = ledger_sync_credentials_file
-        dest = "sync_credentials.json"
-      },
-    ]
-  }
-}
diff --git a/bin/ledger/tests/benchmark/README.md b/bin/ledger/tests/benchmark/README.md
deleted file mode 100644
index d8bf09b..0000000
--- a/bin/ledger/tests/benchmark/README.md
+++ /dev/null
@@ -1,164 +0,0 @@
-# benchmark
-
-## Overview
-This directory contains Ledger [trace-based benchmarks]. Each benchmark is
-implemented as a client connected to Ledger and using its API to perform one or
-more of its basic operations (creating a page, writing/deleting entries, ...).
-
-## Run benchmarks
-
-### Using trace spec files
-The easiest way to run a benchmark is using the associated trace spec file,
-for example:
-
-```
-trace record --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/put.tspec
-```
-
-You can read more on the trace spec file format in the [trace-based benchmarking
-guide](https://fuchsia.googlesource.com/docs/+/master/development/benchmarking/trace_based_benchmarking.md#specification-file).
-
-### Tracing benchmark apps directly
-You can also trace the app directly:
-
-```
-trace record --categories=benchmark,ledger \
-  fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/put.cmx \
-  --entry-count=10 --transaction-size=1 --key-size=100 --value-size=100 \
-  --refs=off
-```
-
-That would generate a trace result file (default: `/data/trace.json`), which can
-be analysed manually or using special tools.
-
-### Benchmark parameters
-
-\*.tspec files specify the parameters with which benchmark apps are run. You can
-override these by passing the "--append-args" argument to the `trace record`
-tool.
-Commonly used among all the ledger benchmarks are the following parameters:
-
-* `entry-count` for the number of entries to perform operations on
-* `unique-key-count` if the number of operations and the number of entries
-  differ (i.e. some entries are overwritten), this denotes the number of unique
-  entries in the page
-* `key-size` for the size of the key (in bytes)
-* `value-size` for the size of the value (in bytes)
-* `refs` with the values `on` or `off` for the reference strategy: if set to
-  `on`, entries will be put using `CreateReference`/`PutAsReference`, otherwise
-  they will be treated as inline entries.
-* `commit-count` for the number of commits made to the page
-* `transaction-size` for the number of operations in a single transaction
-
-Unless the name of the benchmark suggest otherwise, default values are:
-* `100` entries
-* key size `100`
-* value size `1000`
-Benchmarks under `sync` and `convergence` use smaller number of entries and
-smaller value size.
-
-### Benchmarks using sync
-
-Some benchmarks exercise cloud synchronization using `cloud_provider_firestore`.
-
-To run these, follow the [cloud sync set-up instructions] to set up a Firestore instance,
-configure the build environment and obtain the sync parameters needed below.
-
-Then, run the selected benchmark as follows:
-
-```sh
-trace record --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/sync.tspec
-```
-
-### A note regarding benchmark apps
-Since the benchmark apps are designed to be used with tracing, running them
-without a tracing will not generate any results.
-
-## List of benchmarks
-
-Some of the benchmark apps have several corresponding tspec files, to exercise
-different possible scenarios of using Ledger. For example, `get_page` benchmark
-is used in `add_new_page.tspec` to emulate creating many pages with different
-IDs, and in `get_same_page.tspec` to create several connections to the same
-page.
-
-### Local benchmarks
-* __Get page__: How long does it take to establish a new page connection?
-    * `add_new_page.tspec`: connection to the new page with previously unused
-      ID.
-    * `add_new_page_precached.tspec`: same as above, but waits for a precached
-      Ledger Page to be ready before each request.
-    * `get_same_page.tspec`: several connections to the same page
-    * `get_page_id.tspec`: how long does the GetId() call takes on a newly
-      created page?
-* __Put__: How long does it take to write data to a page? And how long before the
-  client will receive a [PageWatcher notification] about its own change?
-    * `put.tspec`: basic case
-    * `put_big_entry.tspec`: writing big entries to the page
-    * `put_as_reference.tspec`: entries are put as references (CreateReference +
-      PutReference)
-    * `transaction.tspec`: changes are made in a transaction
-* __Update entry__: How long does it take to update an existing value in Ledger
-  (make several Put operations with the same key, but different values)?
-    * `update_entry.tspec`: basic case
-    * `update_big_entry.tspec`: put an entry of big size, then update its value
-    * `update_entry_transactions.tspec`: changes are grouped in transactions
-* __Delete entry__: How long does it take to delete an entry from a page?
-    * `delete_entry.tspec`: each entry is deleted separately (outside of a
-      transaction)
-    * `delete_big_entry.tspec`: same as above, but for big entries
-    * `delete_entry_transactions.tspec`: deletions are grouped in transactions
-    * `disk_space_cleared_page.tspec`: how much space does ledger take after the
-      page was cleared out (all the entries deleted in one transaction)?
-* __Disk space__: How much disk space does ledger use to store pages, objects
-  and commits?
-    * `disk_space_empty_ledger.tspec`: empty ledger (with no pages)
-    * `disk_space_empty_pages.tspec`: ledger containing only empty pages
-    * `disk_space_entries.tspec`: ledger with one page containing some entries
-    * `disk_space_small_keys.tspec`: same, but with small (10 bytes) keys.
-    * `disk_space_updates.tspec`: ledger with one page containing only one
-      entry, but long commit history
-    * `disk_space_one_commit_per_entry.tspec`: ledger with one page containing
-      several entries, each of them added in a separate commit
-
-### Sync benchmarks
-These benchmarks exercise synchronisation and need an ID of a Firestore instance
-passed to them as described [in a previous
-section](README.md#benchmarks-using-sync).
-
-* __Backlog__: How long does it take to download all existing data when
-  establishing a new connection to an already populated data?
-    * `backlog.tspec`: basic case
-    * `backlog_big_entry.tspec`: page contains one entry, but of a big size
-    * `backlog_big_entry_updates.tspec`: one big entry, but that was updated several
-      times prior to the new connection (commit history)
-    * `backlog_many_big_entries.tspec`: page contains several big entries
-    * `backlog_many_small_entries.tspec`: many small entries
-    * `backlog_small_entry_updates.tspec`: small entry, but a long commit
-      history
-    * `disk_space_synced_entries.tspec`: how much disk space does ledger take on a
-    writer and a reader device, when several entries have been written (in one
-    commit) on one device and then downloaded on another?
-    * `disk_space_synced_entries_small_keys.tspec`: same, but with small (10
-      bytes) keys.
-    * `disk_space_synced_updates.tspec`: how much disk space does ledger take on a
-    writer and a reader device, when several commits with updates has been made on
-    one device and then downloaded on another?
-* __Convergence__: Several devices make concurrent changes to the page. How long does
-  it take for all devices to see each other changes?
-    * `convergence.tspec`: two devices
-    * `multidevice_convergence`: several devices
-* __Fetch__: How long does it take to fetch a [lazy value]?
-    * `fetch.tspec`: basic case
-    * `fetch_partial_big_entry.tspec`: using FetchPartial (fetch in several
-    parts) on a big entry
-* __Sync__: When one device makes changes to the page, how long does it take for
-  another one to receive these changes?
-    * `sync.tspec`: basic case
-    * `sync_big_change.tspec`: syncing a big change (containing several write
-      operations)
-
-[trace-based benchmarks]: https://fuchsia.googlesource.com/docs/+/master/development/benchmarking/trace_based_benchmarking.md
-[cloud sync set-up instructions]: /docs/ledger/testing.md#cloud-sync
-[lazy value]: /docs/ledger/api_guide.md#lazy-values
-[PageWatcher notification]: /docs/ledger/api_guide.md#watch
diff --git a/bin/ledger/tests/benchmark/backlog/BUILD.gn b/bin/ledger/tests/benchmark/backlog/BUILD.gn
deleted file mode 100644
index 73d4820..0000000
--- a/bin/ledger/tests/benchmark/backlog/BUILD.gn
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("backlog") {
-  testonly = true
-
-  public_deps = [
-    ":ledger_benchmark_backlog",
-  ]
-}
-
-executable("ledger_benchmark_backlog") {
-  testonly = true
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/cloud_provider_firestore/testing",
-    "//peridot/bin/ledger/testing:get_ledger",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/convert",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fit",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  sources = [
-    "backlog.cc",
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/backlog/backlog.cc b/bin/ledger/tests/benchmark/backlog/backlog.cc
deleted file mode 100644
index 2a6f8ec..0000000
--- a/bin/ledger/tests/benchmark/backlog/backlog.cc
+++ /dev/null
@@ -1,473 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-#include <memory>
-#include <vector>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/callback/waiter.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <trace/event.h>
-
-#include "peridot/bin/cloud_provider_firestore/testing/cloud_provider_factory.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/filesystem/get_directory_content_size.h"
-#include "peridot/bin/ledger/testing/data_generator.h"
-#include "peridot/bin/ledger/testing/get_ledger.h"
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-#include "peridot/bin/ledger/testing/page_data_generator.h"
-#include "peridot/bin/ledger/testing/quit_on_error.h"
-#include "peridot/bin/ledger/testing/run_with_tracing.h"
-#include "peridot/bin/ledger/testing/sync_params.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace ledger {
-
-namespace {
-constexpr fxl::StringView kBinaryPath =
-    "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/backlog.cmx";
-constexpr fxl::StringView kStoragePath = "/data/benchmark/ledger/backlog";
-constexpr fxl::StringView kUniqueKeyCountFlag = "unique-key-count";
-constexpr fxl::StringView kKeySizeFlag = "key-size";
-constexpr fxl::StringView kValueSizeFlag = "value-size";
-constexpr fxl::StringView kCommitCountFlag = "commit-count";
-constexpr fxl::StringView kRefsFlag = "refs";
-constexpr fxl::StringView kRefsOnFlag = "on";
-constexpr fxl::StringView kRefsOffFlag = "off";
-
-const std::string kUserDirectory = "/backlog_user";
-
-void PrintUsage() {
-  std::cout << "Usage: trace record "
-            << kBinaryPath
-            // Comment to make clang format not break formatting.
-            << " --" << kUniqueKeyCountFlag << "=<int>"
-            << " --" << kKeySizeFlag << "=<int>"
-            << " --" << kValueSizeFlag << "=<int>"
-            << " --" << kCommitCountFlag << "=<int>"
-            << " --" << kRefsFlag << "=(" << kRefsOnFlag << "|" << kRefsOffFlag
-            << ")" << GetSyncParamsUsage() << std::endl;
-}
-
-// Benchmark that measures time taken by a page connection to upload all local
-// changes to the cloud; and for another connection to the same page to download
-// all these changes.
-//
-// In contrast to the sync benchmark, backlog benchmark initiates the second
-// connection only after the first one has uploaded all changes. It is designed
-// to model the situation of adding new device instead of continuous
-// synchronisation.
-//
-// Cloud sync needs to be configured on the device in order for the benchmark to
-// run.
-//
-// Parameters:
-//   --unique-key-count=<int> the number of unique keys to populate the page
-//   with.
-//   --key-size=<int> size of a key for each entry.
-//   --value-size=<int> the size of values to populate the page with.
-//   --commit-count=<int> the number of commits made to the page.
-//   If this number is smaller than unique-key-count, changes will be bundled
-//   into transactions. If it is bigger, some or all of the changes will use the
-//   same keys, modifying the value.
-//   --refs=(on|off) reference strategy: on to put values as references, off to
-//     put them as FIDL arrays.
-//   --credentials-path=<file path> Firestore service account credentials
-class BacklogBenchmark : public SyncWatcher {
- public:
-  BacklogBenchmark(async::Loop* loop,
-                   std::unique_ptr<component::StartupContext> startup_context,
-                   size_t unique_key_count, size_t key_size, size_t value_size,
-                   size_t commit_count,
-                   PageDataGenerator::ReferenceStrategy reference_strategy,
-                   SyncParams sync_params);
-
-  void Run();
-
-  // SyncWatcher:
-  void SyncStateChanged(SyncState download, SyncState upload,
-                        SyncStateChangedCallback callback) override;
-
- private:
-  void ConnectWriter();
-  void Populate();
-  void DisconnectAndRecordWriter();
-  void ConnectUploader();
-  void WaitForUploaderUpload();
-  void ConnectReader();
-  void WaitForReaderDownload();
-
-  void GetReaderSnapshot();
-  void GetEntriesStep(std::unique_ptr<Token> token, size_t entries_left);
-  void CheckStatusAndGetMore(Status status, size_t entries_left,
-                             std::unique_ptr<Token> next_token);
-
-  void RecordDirectorySize(const std::string& event_name,
-                           const std::string& path);
-  void ShutDown();
-  fit::closure QuitLoopClosure();
-
-  async::Loop* const loop_;
-  rng::TestRandom random_;
-  DataGenerator generator_;
-  PageDataGenerator page_data_generator_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  cloud_provider_firestore::CloudProviderFactory cloud_provider_factory_;
-  fidl::Binding<SyncWatcher> sync_watcher_binding_;
-  const size_t unique_key_count_;
-  const size_t key_size_;
-  const size_t value_size_;
-  const size_t commit_count_;
-  const PageDataGenerator::ReferenceStrategy reference_strategy_;
-  const cloud_provider_firestore::CloudProviderFactory::UserId user_id_;
-  files::ScopedTempDir writer_tmp_dir_;
-  files::ScopedTempDir reader_tmp_dir_;
-  fuchsia::sys::ComponentControllerPtr writer_controller_;
-  fuchsia::sys::ComponentControllerPtr uploader_controller_;
-  fuchsia::sys::ComponentControllerPtr reader_controller_;
-  LedgerPtr uploader_;
-  LedgerPtr writer_;
-  LedgerPtr reader_;
-  PageId page_id_;
-  PagePtr writer_page_;
-  PagePtr uploader_page_;
-  PagePtr reader_page_;
-  PageSnapshotPtr reader_snapshot_;
-  fit::function<void(SyncState, SyncState)> on_sync_state_changed_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(BacklogBenchmark);
-};
-
-BacklogBenchmark::BacklogBenchmark(
-    async::Loop* loop,
-    std::unique_ptr<component::StartupContext> startup_context,
-    size_t unique_key_count, size_t key_size, size_t value_size,
-    size_t commit_count,
-    PageDataGenerator::ReferenceStrategy reference_strategy,
-    SyncParams sync_params)
-    : loop_(loop),
-      random_(0),
-      generator_(&random_),
-      page_data_generator_(&random_),
-      startup_context_(std::move(startup_context)),
-      cloud_provider_factory_(startup_context_.get(), &random_,
-                              std::move(sync_params.api_key),
-                              std::move(sync_params.credentials)),
-      sync_watcher_binding_(this),
-      unique_key_count_(unique_key_count),
-      key_size_(key_size),
-      value_size_(value_size),
-      commit_count_(commit_count),
-      reference_strategy_(reference_strategy),
-      user_id_(cloud_provider_firestore::CloudProviderFactory::UserId::New()),
-      writer_tmp_dir_(kStoragePath),
-      reader_tmp_dir_(kStoragePath) {
-  FXL_DCHECK(loop_);
-  FXL_DCHECK(unique_key_count_ > 0);
-  FXL_DCHECK(key_size_ > 0);
-  FXL_DCHECK(value_size_ > 0);
-  FXL_DCHECK(commit_count_ > 0);
-  cloud_provider_factory_.Init();
-}
-
-void BacklogBenchmark::SyncStateChanged(SyncState download, SyncState upload,
-                                        SyncStateChangedCallback callback) {
-  if (on_sync_state_changed_) {
-    on_sync_state_changed_(download, upload);
-  }
-  callback();
-}
-
-void BacklogBenchmark::Run() { ConnectWriter(); }
-
-void BacklogBenchmark::ConnectWriter() {
-  // Name of the storage directory currently identifies the user. Ensure the
-  // most nested directory has the same name to make the ledgers sync.
-  std::string writer_path = writer_tmp_dir_.path() + kUserDirectory;
-  bool ret = files::CreateDirectory(writer_path);
-  FXL_DCHECK(ret);
-
-  Status status = GetLedger(
-      startup_context_.get(), writer_controller_.NewRequest(), nullptr, "",
-      "backlog", DetachedPath(std::move(writer_path)),
-
-      []() { FXL_LOG(INFO) << "Writer closed."; }, &writer_);
-  if (QuitOnError(QuitLoopClosure(), status, "Get writer ledger")) {
-    return;
-  }
-
-  GetPageEnsureInitialized(
-      &writer_, nullptr, DelayCallback::YES,
-      []() { FXL_LOG(INFO) << "Writer page closed."; },
-      [this](Status status, PagePtr writer_page, PageId page_id) {
-        if (QuitOnError(QuitLoopClosure(), status,
-                        "Writer page initialization")) {
-          return;
-        }
-
-        writer_page_ = std::move(writer_page);
-        page_id_ = page_id;
-
-        TRACE_ASYNC_BEGIN("benchmark", "populate", 0);
-        Populate();
-      });
-}
-
-void BacklogBenchmark::Populate() {
-  int transaction_size = static_cast<int>(
-      ceil(static_cast<double>(unique_key_count_) / commit_count_));
-  int key_count = std::max(unique_key_count_, commit_count_);
-  FXL_LOG(INFO) << "Transaction size: " << transaction_size
-                << ", key count: " << key_count << ".";
-  auto keys = generator_.MakeKeys(key_count, key_size_, unique_key_count_);
-  page_data_generator_.Populate(
-      &writer_page_, std::move(keys), value_size_, transaction_size,
-      reference_strategy_, Priority::EAGER, [this](Status status) {
-        if (status != Status::OK) {
-          if (QuitOnError(QuitLoopClosure(), status,
-                          "PageGenerator::Populate")) {
-            return;
-          }
-          return;
-        }
-        TRACE_ASYNC_END("benchmark", "populate", 0);
-        DisconnectAndRecordWriter();
-      });
-}
-
-void BacklogBenchmark::DisconnectAndRecordWriter() {
-  KillLedgerProcess(&writer_controller_);
-  RecordDirectorySize("writer_directory_size", writer_tmp_dir_.path());
-  ConnectUploader();
-}
-
-void BacklogBenchmark::ConnectUploader() {
-  // Name of the storage directory currently identifies the user. Ensure the
-  // most nested directory has the same name to make the ledgers sync.
-  std::string uploader_path = writer_tmp_dir_.path() + kUserDirectory;
-
-  cloud_provider::CloudProviderPtr cloud_provider_uploader;
-  cloud_provider_factory_.MakeCloudProvider(
-      user_id_, cloud_provider_uploader.NewRequest());
-  Status status = GetLedger(
-      startup_context_.get(), uploader_controller_.NewRequest(),
-      std::move(cloud_provider_uploader), user_id_.user_id(), "backlog",
-      DetachedPath(std::move(uploader_path)), QuitLoopClosure(), &uploader_);
-  if (QuitOnError(QuitLoopClosure(), status, "Get uploader ledger")) {
-    return;
-  }
-
-  TRACE_ASYNC_BEGIN("benchmark", "get_uploader_page", 0);
-  TRACE_ASYNC_BEGIN("benchmark", "upload", 0);
-  uploader_->GetPage(fidl::MakeOptional(page_id_), uploader_page_.NewRequest(),
-                     [this](Status status) {
-                       if (QuitOnError(QuitLoopClosure(), status, "GetPage")) {
-                         return;
-                       }
-                       TRACE_ASYNC_END("benchmark", "get_uploader_page", 0);
-                       WaitForUploaderUpload();
-                     });
-}
-
-void BacklogBenchmark::WaitForUploaderUpload() {
-  on_sync_state_changed_ = [this](SyncState download, SyncState upload) {
-    if (upload == SyncState::IDLE) {
-      on_sync_state_changed_ = nullptr;
-      TRACE_ASYNC_END("benchmark", "upload", 0);
-      // Stop watching sync state for this page.
-      sync_watcher_binding_.Unbind();
-      ConnectReader();
-      return;
-    }
-  };
-  uploader_page_->SetSyncStateWatcher(
-      sync_watcher_binding_.NewBinding(),
-      QuitOnErrorCallback(QuitLoopClosure(), "Page::SetSyncStateWatcher"));
-}
-
-void BacklogBenchmark::ConnectReader() {
-  std::string reader_path = reader_tmp_dir_.path() + kUserDirectory;
-  bool ret = files::CreateDirectory(reader_path);
-  FXL_DCHECK(ret);
-
-  cloud_provider::CloudProviderPtr cloud_provider_reader;
-  cloud_provider_factory_.MakeCloudProvider(user_id_,
-                                            cloud_provider_reader.NewRequest());
-  Status status = GetLedger(
-      startup_context_.get(), reader_controller_.NewRequest(),
-      std::move(cloud_provider_reader), user_id_.user_id(), "backlog",
-      DetachedPath(std::move(reader_path)), QuitLoopClosure(), &reader_);
-  if (QuitOnError(QuitLoopClosure(), status, "ConnectReader")) {
-    return;
-  }
-
-  TRACE_ASYNC_BEGIN("benchmark", "download", 0);
-  TRACE_ASYNC_BEGIN("benchmark", "get_reader_page", 0);
-  reader_->GetPage(fidl::MakeOptional(page_id_), reader_page_.NewRequest(),
-                   [this](Status status) {
-                     if (QuitOnError(QuitLoopClosure(), status, "GetPage")) {
-                       return;
-                     }
-                     TRACE_ASYNC_END("benchmark", "get_reader_page", 0);
-                     WaitForReaderDownload();
-                   });
-}
-
-void BacklogBenchmark::WaitForReaderDownload() {
-  on_sync_state_changed_ = [this](SyncState download, SyncState upload) {
-    if (download == SyncState::IDLE) {
-      on_sync_state_changed_ = nullptr;
-      TRACE_ASYNC_END("benchmark", "download", 0);
-      GetReaderSnapshot();
-      return;
-    }
-  };
-  reader_page_->SetSyncStateWatcher(
-      sync_watcher_binding_.NewBinding(),
-      QuitOnErrorCallback(QuitLoopClosure(), "Page::SetSyncStateWatcher"));
-}
-
-void BacklogBenchmark::GetReaderSnapshot() {
-  reader_page_->GetSnapshot(
-      reader_snapshot_.NewRequest(), fidl::VectorPtr<uint8_t>::New(0), nullptr,
-      QuitOnErrorCallback(QuitLoopClosure(), "GetSnapshot"));
-  TRACE_ASYNC_BEGIN("benchmark", "get_all_entries", 0);
-  GetEntriesStep(nullptr, unique_key_count_);
-}
-
-void BacklogBenchmark::CheckStatusAndGetMore(
-    Status status, size_t entries_left, std::unique_ptr<Token> next_token) {
-  if ((status != Status::OK) && (status != Status::PARTIAL_RESULT)) {
-    if (QuitOnError(QuitLoopClosure(), status, "PageSnapshot::GetEntries")) {
-      return;
-    }
-  }
-
-  if (status == Status::OK) {
-    TRACE_ASYNC_END("benchmark", "get_all_entries", 0);
-    FXL_DCHECK(entries_left == 0);
-    FXL_DCHECK(!next_token);
-    ShutDown();
-    RecordDirectorySize("uploader_directory_size", writer_tmp_dir_.path());
-    RecordDirectorySize("reader_directory_size", reader_tmp_dir_.path());
-    return;
-  }
-  FXL_DCHECK(next_token);
-  GetEntriesStep(std::move(next_token), entries_left);
-}
-
-void BacklogBenchmark::GetEntriesStep(std::unique_ptr<Token> token,
-                                      size_t entries_left) {
-  FXL_DCHECK(entries_left > 0);
-  TRACE_ASYNC_BEGIN("benchmark", "get_entries_partial", entries_left);
-  if (reference_strategy_ == PageDataGenerator::ReferenceStrategy::INLINE) {
-    reader_snapshot_->GetEntriesInline(
-        std::vector<uint8_t>(), std::move(token),
-        [this, entries_left](Status status, auto entries,
-                             auto next_token) mutable {
-          TRACE_ASYNC_END("benchmark", "get_entries_partial", entries_left);
-          CheckStatusAndGetMore(status, entries_left - entries.size(),
-                                std::move(next_token));
-        });
-  } else {
-    reader_snapshot_->GetEntries(
-        std::vector<uint8_t>(), std::move(token),
-        [this, entries_left](Status status, auto entries,
-                             auto next_token) mutable {
-          TRACE_ASYNC_END("benchmark", "get_entries_partial", entries_left);
-          CheckStatusAndGetMore(status, entries_left - entries.size(),
-                                std::move(next_token));
-        });
-  }
-}
-
-void BacklogBenchmark::RecordDirectorySize(const std::string& event_name,
-                                           const std::string& path) {
-  uint64_t tmp_dir_size = 0;
-  FXL_CHECK(GetDirectoryContentSize(DetachedPath(path), &tmp_dir_size));
-  TRACE_COUNTER("benchmark", event_name.c_str(), 0, "directory_size",
-                TA_UINT64(tmp_dir_size));
-}
-
-void BacklogBenchmark::ShutDown() {
-  KillLedgerProcess(&uploader_controller_);
-  KillLedgerProcess(&reader_controller_);
-  loop_->Quit();
-}
-
-fit::closure BacklogBenchmark::QuitLoopClosure() {
-  return [this] { loop_->Quit(); };
-}
-
-int Main(int argc, const char** argv) {
-  fxl::CommandLine command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto startup_context = component::StartupContext::CreateFromStartupInfo();
-
-  std::string unique_key_count_str;
-  size_t unique_key_count;
-  std::string key_size_str;
-  size_t key_size;
-  std::string value_size_str;
-  size_t value_size;
-  std::string commit_count_str;
-  size_t commit_count;
-  std::string reference_strategy_str;
-  SyncParams sync_params;
-  if (!command_line.GetOptionValue(kUniqueKeyCountFlag.ToString(),
-                                   &unique_key_count_str) ||
-      !fxl::StringToNumberWithError(unique_key_count_str, &unique_key_count) ||
-      unique_key_count <= 0 ||
-      !command_line.GetOptionValue(kKeySizeFlag.ToString(), &key_size_str) ||
-      !fxl::StringToNumberWithError(key_size_str, &key_size) || key_size == 0 ||
-      !command_line.GetOptionValue(kValueSizeFlag.ToString(),
-                                   &value_size_str) ||
-      !fxl::StringToNumberWithError(value_size_str, &value_size) ||
-      value_size <= 0 ||
-      !command_line.GetOptionValue(kCommitCountFlag.ToString(),
-                                   &commit_count_str) ||
-      !fxl::StringToNumberWithError(commit_count_str, &commit_count) ||
-      commit_count <= 0 ||
-      !command_line.GetOptionValue(kRefsFlag.ToString(),
-                                   &reference_strategy_str) ||
-      !ParseSyncParamsFromCommandLine(command_line, startup_context.get(),
-                                      &sync_params)) {
-    PrintUsage();
-    return -1;
-  }
-
-  PageDataGenerator::ReferenceStrategy reference_strategy;
-  if (reference_strategy_str == kRefsOnFlag) {
-    reference_strategy = PageDataGenerator::ReferenceStrategy::REFERENCE;
-  } else if (reference_strategy_str == kRefsOffFlag) {
-    reference_strategy = PageDataGenerator::ReferenceStrategy::INLINE;
-  } else {
-    std::cerr << "Unknown option " << reference_strategy_str << " for "
-              << kRefsFlag.ToString() << std::endl;
-    PrintUsage();
-    return -1;
-  }
-
-  BacklogBenchmark app(&loop, std::move(startup_context), unique_key_count,
-                       key_size, value_size, commit_count, reference_strategy,
-                       std::move(sync_params));
-  return RunWithTracing(&loop, [&app] { app.Run(); });
-}
-
-}  // namespace
-}  // namespace ledger
-
-int main(int argc, const char** argv) { return ledger::Main(argc, argv); }
diff --git a/bin/ledger/tests/benchmark/backlog/backlog.cmx b/bin/ledger/tests/benchmark/backlog/backlog.cmx
deleted file mode 100644
index 55b43a2..0000000
--- a/bin/ledger/tests/benchmark/backlog/backlog.cmx
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "program": {
-        "binary": "bin/ledger_benchmark_backlog"
-    },
-    "sandbox": {
-        "features": [
-            "persistent-storage"
-        ],
-        "services": [
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/benchmark/backlog/backlog.tspec b/bin/ledger/tests/benchmark/backlog/backlog.tspec
deleted file mode 100644
index c5d4ac5..0000000
--- a/bin/ledger/tests/benchmark/backlog/backlog.tspec
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/backlog.cmx",
-  "args": ["--unique-key-count=100", "--key-size=100", "--value-size=1000",
-           "--commit-count=100", "--refs=off"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 180,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "populate",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_uploader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "upload",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_reader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "download",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_entries_partial",
-      "event_category": "benchmark",
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "event_name": "get_all_entries",
-      "event_category": "benchmark"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/backlog/backlog_big_entry.tspec b/bin/ledger/tests/benchmark/backlog/backlog_big_entry.tspec
deleted file mode 100644
index 82a6af4..0000000
--- a/bin/ledger/tests/benchmark/backlog/backlog_big_entry.tspec
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/backlog.cmx",
-  "args": ["--unique-key-count=1", "--key-size=100", "--value-size=10000000",
-           "--commit-count=1", "--refs=on"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 180,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "populate",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_uploader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "upload",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_reader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "download",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_all_entries",
-      "event_category": "benchmark"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/backlog/backlog_big_entry_updates.tspec b/bin/ledger/tests/benchmark/backlog/backlog_big_entry_updates.tspec
deleted file mode 100644
index deb9832..0000000
--- a/bin/ledger/tests/benchmark/backlog/backlog_big_entry_updates.tspec
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/backlog.cmx",
-  "args": ["--unique-key-count=1", "--key-size=100", "--value-size=100000",
-           "--commit-count=100", "--refs=on"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 180,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "populate",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_uploader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "upload",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_reader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "download",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_all_entries",
-      "event_category": "benchmark"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/backlog/backlog_many_big_entries.tspec b/bin/ledger/tests/benchmark/backlog/backlog_many_big_entries.tspec
deleted file mode 100644
index 70fd7e4..0000000
--- a/bin/ledger/tests/benchmark/backlog/backlog_many_big_entries.tspec
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/backlog.cmx",
-  "args": ["--unique-key-count=1000", "--key-size=100", "--value-size=10000",
-           "--commit-count=1", "--refs=on"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 180,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "populate",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_uploader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "upload",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_reader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "download",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_entries_partial",
-      "event_category": "benchmark",
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "event_name": "get_all_entries",
-      "event_category": "benchmark"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/backlog/backlog_many_small_entries.tspec b/bin/ledger/tests/benchmark/backlog/backlog_many_small_entries.tspec
deleted file mode 100644
index 1f14580..0000000
--- a/bin/ledger/tests/benchmark/backlog/backlog_many_small_entries.tspec
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/backlog.cmx",
-  "args": ["--unique-key-count=10000", "--value-size=1", "--key-size=100",
-           "--commit-count=1", "--refs=off"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 120,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "populate",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_uploader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "upload",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_reader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "download",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_entries_partial",
-      "event_category": "benchmark",
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "event_name": "get_all_entries",
-      "event_category": "benchmark"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/backlog/backlog_small_entry_updates.tspec b/bin/ledger/tests/benchmark/backlog/backlog_small_entry_updates.tspec
deleted file mode 100644
index 0a35e27..0000000
--- a/bin/ledger/tests/benchmark/backlog/backlog_small_entry_updates.tspec
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/backlog.cmx",
-  "args": ["--unique-key-count=1", "--key-size=100", "--value-size=1",
-           "--commit-count=10000", "--refs=off"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 180,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "populate",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_uploader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "upload",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_reader_page",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "download",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "get_entries_partial",
-      "event_category": "benchmark",
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "event_name": "get_all_entries",
-      "event_category": "benchmark"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/backlog/disk_space_synced_entries.tspec b/bin/ledger/tests/benchmark/backlog/disk_space_synced_entries.tspec
deleted file mode 100644
index 5fdfbce..0000000
--- a/bin/ledger/tests/benchmark/backlog/disk_space_synced_entries.tspec
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/backlog.cmx",
-  "args": ["--unique-key-count=100", "--key-size=100", "--value-size=1000",
-           "--commit-count=1", "--refs=on"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 180,
-  "measure": [
-    {
-      "type": "argument_value",
-      "event_name": "writer_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    },
-    {
-      "type": "argument_value",
-      "event_name": "uploader_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    },
-    {
-      "type": "argument_value",
-      "event_name": "reader_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/backlog/disk_space_synced_entries_small_keys.tspec b/bin/ledger/tests/benchmark/backlog/disk_space_synced_entries_small_keys.tspec
deleted file mode 100644
index 1dab193..0000000
--- a/bin/ledger/tests/benchmark/backlog/disk_space_synced_entries_small_keys.tspec
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/backlog.cmx",
-  "args": ["--unique-key-count=100", "--key-size=10", "--value-size=1000",
-           "--commit-count=1", "--refs=on"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 180,
-  "measure": [
-    {
-      "type": "argument_value",
-      "event_name": "writer_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    },
-    {
-      "type": "argument_value",
-      "event_name": "uploader_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    },
-    {
-      "type": "argument_value",
-      "event_name": "reader_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/backlog/disk_space_synced_updates.tspec b/bin/ledger/tests/benchmark/backlog/disk_space_synced_updates.tspec
deleted file mode 100644
index ec9e68a..0000000
--- a/bin/ledger/tests/benchmark/backlog/disk_space_synced_updates.tspec
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/backlog.cmx",
-  "args": ["--unique-key-count=1", "--key-size=100", "--value-size=1000",
-           "--commit-count=100", "--refs=on"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 180,
-  "measure": [
-    {
-      "type": "argument_value",
-      "event_name": "writer_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    },
-    {
-      "type": "argument_value",
-      "event_name": "uploader_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    },
-    {
-      "type": "argument_value",
-      "event_name": "reader_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/convergence/BUILD.gn b/bin/ledger/tests/benchmark/convergence/BUILD.gn
deleted file mode 100644
index d9745d3..0000000
--- a/bin/ledger/tests/benchmark/convergence/BUILD.gn
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("convergence") {
-  testonly = true
-
-  public_deps = [
-    ":ledger_benchmark_convergence",
-  ]
-}
-
-executable("ledger_benchmark_convergence") {
-  testonly = true
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/cloud_provider_firestore/testing",
-    "//peridot/bin/ledger/testing:get_ledger",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/convert",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fit",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  sources = [
-    "convergence.cc",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/benchmark/convergence/convergence.cc b/bin/ledger/tests/benchmark/convergence/convergence.cc
deleted file mode 100644
index 1935455..0000000
--- a/bin/ledger/tests/benchmark/convergence/convergence.cc
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-#include <memory>
-#include <set>
-#include <vector>
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/callback/waiter.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/zx/time.h>
-#include <trace/event.h>
-
-#include "peridot/bin/cloud_provider_firestore/testing/cloud_provider_factory.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/testing/data_generator.h"
-#include "peridot/bin/ledger/testing/get_ledger.h"
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-#include "peridot/bin/ledger/testing/quit_on_error.h"
-#include "peridot/bin/ledger/testing/run_with_tracing.h"
-#include "peridot/bin/ledger/testing/sync_params.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace ledger {
-namespace {
-constexpr fxl::StringView kBinaryPath =
-    "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/convergence.cmx";
-constexpr fxl::StringView kStoragePath = "/data/benchmark/ledger/convergence";
-constexpr fxl::StringView kEntryCountFlag = "entry-count";
-constexpr fxl::StringView kValueSizeFlag = "value-size";
-constexpr fxl::StringView kDeviceCountFlag = "device-count";
-
-void PrintUsage() {
-  std::cout << "Usage: trace record "
-            << kBinaryPath
-            // Comment to make clang format not break formatting.
-            << " --" << kEntryCountFlag << "=<int>"
-            << " --" << kValueSizeFlag << "=<int>"
-            << " --" << kDeviceCountFlag << "=<int>" << GetSyncParamsUsage()
-            << std::endl;
-}
-
-constexpr size_t kKeySize = 100;
-
-// Benchmark that measures the time it takes to sync and reconcile concurrent
-// writes.
-//
-// In this scenario there are specified number of (emulated) devices. At each
-// step, every device makes a concurrent write, and we measure the time until
-// all the changes are visible to all devices.
-//
-// Parameters:
-//   --entry-count=<int> the number of entries to be put by each device
-//   --value-size=<int> the size of a single value in bytes
-//   --device-count=<int> number of devices writing to the same page
-//   --credentials-path=<file path> Firestore service account credentials
-class ConvergenceBenchmark : public PageWatcher {
- public:
-  ConvergenceBenchmark(
-      async::Loop* loop,
-      std::unique_ptr<component::StartupContext> startup_context,
-      int entry_count, int value_size, int device_count,
-      SyncParams sync_params);
-
-  void Run();
-
-  // PageWatcher:
-  void OnChange(PageChange page_change, ResultState result_state,
-                OnChangeCallback callback) override;
-
- private:
-  // Instances needed to control the Ledger process associated with a device and
-  // interact with it.
-  struct DeviceContext {
-    std::unique_ptr<files::ScopedTempDir> storage_directory;
-    fuchsia::sys::ComponentControllerPtr controller;
-    LedgerPtr ledger;
-    PagePtr page_connection;
-    std::unique_ptr<fidl::Binding<PageWatcher>> page_watcher;
-  };
-
-  void Start(int step);
-
-  void ShutDown();
-  fit::closure QuitLoopClosure();
-
-  async::Loop* const loop_;
-  rng::TestRandom random_;
-  DataGenerator generator_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  cloud_provider_firestore::CloudProviderFactory cloud_provider_factory_;
-  const int entry_count_;
-  const int value_size_;
-  const int device_count_;
-  const cloud_provider_firestore::CloudProviderFactory::UserId user_id_;
-  // Track all Ledger instances running for this test and allow to interact with
-  // it.
-  std::vector<std::unique_ptr<DeviceContext>> devices_;
-  PageId page_id_;
-  std::multiset<std::string> remaining_keys_;
-  int current_step_ = -1;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ConvergenceBenchmark);
-};
-
-ConvergenceBenchmark::ConvergenceBenchmark(
-    async::Loop* loop,
-    std::unique_ptr<component::StartupContext> startup_context, int entry_count,
-    int value_size, int device_count, SyncParams sync_params)
-    : loop_(loop),
-      random_(0),
-      generator_(&random_),
-      startup_context_(std::move(startup_context)),
-      cloud_provider_factory_(startup_context_.get(), &random_,
-                              std::move(sync_params.api_key),
-                              std::move(sync_params.credentials)),
-      entry_count_(entry_count),
-      value_size_(value_size),
-      device_count_(device_count),
-      user_id_(cloud_provider_firestore::CloudProviderFactory::UserId::New()),
-      devices_(device_count) {
-  FXL_DCHECK(loop_);
-  FXL_DCHECK(entry_count_ > 0);
-  FXL_DCHECK(value_size_ > 0);
-  FXL_DCHECK(device_count_ > 1);
-  for (auto& device_context : devices_) {
-    device_context = std::make_unique<DeviceContext>();
-    device_context->storage_directory =
-        std::make_unique<files::ScopedTempDir>(kStoragePath);
-    device_context->page_watcher =
-        std::make_unique<fidl::Binding<PageWatcher>>(this);
-  }
-  page_id_ = generator_.MakePageId();
-  cloud_provider_factory_.Init();
-}
-
-void ConvergenceBenchmark::Run() {
-  auto waiter = fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-  for (auto& device_context : devices_) {
-    // Initialize ledgers in different paths to emulate separate devices,
-    // but with the same lowest-level directory name, so they correspond to the
-    // same "user".
-    std::string synced_dir_path =
-        device_context->storage_directory->path() + "/convergence_user";
-    bool ret = files::CreateDirectory(synced_dir_path);
-    FXL_DCHECK(ret);
-
-    cloud_provider::CloudProviderPtr cloud_provider;
-    cloud_provider_factory_.MakeCloudProvider(user_id_,
-                                              cloud_provider.NewRequest());
-
-    Status status = GetLedger(startup_context_.get(),
-                              device_context->controller.NewRequest(),
-                              std::move(cloud_provider), user_id_.user_id(),
-                              "convergence", DetachedPath(synced_dir_path),
-                              QuitLoopClosure(), &device_context->ledger);
-    if (QuitOnError(QuitLoopClosure(), status, "GetLedger")) {
-      return;
-    }
-    device_context->ledger->GetPage(
-        fidl::MakeOptional(page_id_),
-        device_context->page_connection.NewRequest(),
-        QuitOnErrorCallback(QuitLoopClosure(), "GetPage"));
-    PageSnapshotPtr snapshot;
-    // Register a watcher; we don't really need the snapshot.
-    device_context->page_connection->GetSnapshot(
-        snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-        device_context->page_watcher->NewBinding(), waiter->NewCallback());
-  }
-  waiter->Finalize([this](Status status) {
-    if (QuitOnError(QuitLoopClosure(), status, "GetSnapshot")) {
-      return;
-    }
-    Start(0);
-  });
-}
-
-void ConvergenceBenchmark::Start(int step) {
-  if (step == entry_count_) {
-    ShutDown();
-    return;
-  }
-
-  for (int device_id = 0; device_id < device_count_; device_id++) {
-    std::vector<uint8_t> key =
-        generator_.MakeKey(device_count_ * step + device_id, kKeySize);
-    // Insert each key N times, as we will receive N notifications - one for
-    // each connection, sender included.
-    for (int receiving_device = 0; receiving_device < device_count_;
-         receiving_device++) {
-      remaining_keys_.insert(convert::ToString(key));
-    }
-    fidl::VectorPtr<uint8_t> value = generator_.MakeValue(value_size_);
-    devices_[device_id]->page_connection->Put(
-        std::move(key), std::move(value),
-        QuitOnErrorCallback(QuitLoopClosure(), "Put"));
-  }
-
-  TRACE_ASYNC_BEGIN("benchmark", "convergence", step);
-  // Persist the current step, so that we know which dispatcher event to end in
-  // OnChange().
-  current_step_ = step;
-}
-
-void ConvergenceBenchmark::OnChange(PageChange page_change,
-                                    ResultState result_state,
-                                    OnChangeCallback callback) {
-  FXL_DCHECK(result_state == ResultState::COMPLETED);
-  for (auto& change : page_change.changed_entries) {
-    auto find_one = remaining_keys_.find(convert::ToString(change.key));
-    remaining_keys_.erase(find_one);
-  }
-  if (remaining_keys_.empty()) {
-    TRACE_ASYNC_END("benchmark", "convergence", current_step_);
-    Start(current_step_ + 1);
-  }
-  callback(nullptr);
-}
-
-void ConvergenceBenchmark::ShutDown() {
-  for (auto& device_context : devices_) {
-    KillLedgerProcess(&device_context->controller);
-  }
-  loop_->Quit();
-}
-
-fit::closure ConvergenceBenchmark::QuitLoopClosure() {
-  return [this] { loop_->Quit(); };
-}
-
-int Main(int argc, const char** argv) {
-  fxl::CommandLine command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto startup_context = component::StartupContext::CreateFromStartupInfo();
-
-  std::string entry_count_str;
-  int entry_count;
-  std::string value_size_str;
-  int value_size;
-  std::string device_count_str;
-  int device_count;
-  SyncParams sync_params;
-  if (!command_line.GetOptionValue(kEntryCountFlag.ToString(),
-                                   &entry_count_str) ||
-      !fxl::StringToNumberWithError(entry_count_str, &entry_count) ||
-      entry_count <= 0 ||
-      !command_line.GetOptionValue(kValueSizeFlag.ToString(),
-                                   &value_size_str) ||
-      !fxl::StringToNumberWithError(value_size_str, &value_size) ||
-      value_size <= 0 ||
-      !command_line.GetOptionValue(kDeviceCountFlag.ToString(),
-                                   &device_count_str) ||
-      !fxl::StringToNumberWithError(device_count_str, &device_count) ||
-      device_count <= 0 ||
-      !ParseSyncParamsFromCommandLine(command_line, startup_context.get(),
-                                      &sync_params)) {
-    PrintUsage();
-    return -1;
-  }
-
-  ConvergenceBenchmark app(&loop, std::move(startup_context), entry_count,
-                           value_size, device_count, std::move(sync_params));
-  return RunWithTracing(&loop, [&app] { app.Run(); });
-}
-
-}  // namespace
-}  // namespace ledger
-
-int main(int argc, const char** argv) { return ledger::Main(argc, argv); }
diff --git a/bin/ledger/tests/benchmark/convergence/convergence.cmx b/bin/ledger/tests/benchmark/convergence/convergence.cmx
deleted file mode 100644
index 6052df1..0000000
--- a/bin/ledger/tests/benchmark/convergence/convergence.cmx
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "program": {
-        "binary": "bin/ledger_benchmark_convergence"
-    },
-    "sandbox": {
-        "features": [
-            "persistent-storage"
-        ],
-        "services": [
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/benchmark/convergence/convergence.tspec b/bin/ledger/tests/benchmark/convergence/convergence.tspec
deleted file mode 100644
index f5f2b66..0000000
--- a/bin/ledger/tests/benchmark/convergence/convergence.tspec
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.local",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/convergence.cmx",
-  "args": ["--entry-count=10", "--value-size=100", "--device-count=2"],
-  "categories": ["benchmark"],
-  "duration": 120,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "convergence",
-      "event_category": "benchmark",
-      "expected_sample_count": 10
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/convergence/multidevice_convergence.tspec b/bin/ledger/tests/benchmark/convergence/multidevice_convergence.tspec
deleted file mode 100644
index b796900..0000000
--- a/bin/ledger/tests/benchmark/convergence/multidevice_convergence.tspec
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.local",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/convergence.cmx",
-  "args": ["--entry-count=3", "--value-size=100", "--device-count=10"],
-  "categories": ["benchmark"],
-  "duration": 120,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "convergence",
-      "event_category": "benchmark",
-      "expected_sample_count": 3
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/delete_entry/BUILD.gn b/bin/ledger/tests/benchmark/delete_entry/BUILD.gn
deleted file mode 100644
index a2c9c4a..0000000
--- a/bin/ledger/tests/benchmark/delete_entry/BUILD.gn
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("delete_entry") {
-  testonly = true
-
-  public_deps = [
-    ":ledger_benchmark_delete_entry",
-  ]
-}
-
-executable("ledger_benchmark_delete_entry") {
-  testonly = true
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/testing:get_ledger",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/convert",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fit",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  sources = [
-    "delete_entry.cc",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/benchmark/delete_entry/delete_big_entry.tspec b/bin/ledger/tests/benchmark/delete_entry/delete_big_entry.tspec
deleted file mode 100644
index 36fa2d6..0000000
--- a/bin/ledger/tests/benchmark/delete_entry/delete_big_entry.tspec
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.delete_entry",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/delete_entry.cmx",
-  "args": ["--entry-count=100", "--key-size=100", "--value-size=20000",
-           "--transaction-size=0"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 180,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "big_value/delete",
-      "event_name": "delete_entry",
-      "event_category": "benchmark",
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/delete_entry/delete_entry.cc b/bin/ledger/tests/benchmark/delete_entry/delete_entry.cc
deleted file mode 100644
index e22437d..0000000
--- a/bin/ledger/tests/benchmark/delete_entry/delete_entry.cc
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-#include <memory>
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/callback/waiter.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/zx/time.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/filesystem/get_directory_content_size.h"
-#include "peridot/bin/ledger/testing/data_generator.h"
-#include "peridot/bin/ledger/testing/get_ledger.h"
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-#include "peridot/bin/ledger/testing/page_data_generator.h"
-#include "peridot/bin/ledger/testing/quit_on_error.h"
-#include "peridot/bin/ledger/testing/run_with_tracing.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kBinaryPath =
-    "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/delete_entry.cmx";
-constexpr fxl::StringView kStoragePath = "/data/benchmark/ledger/delete_entry";
-constexpr fxl::StringView kEntryCountFlag = "entry-count";
-constexpr fxl::StringView kTransactionSizeFlag = "transaction-size";
-constexpr fxl::StringView kKeySizeFlag = "key-size";
-constexpr fxl::StringView kValueSizeFlag = "value-size";
-
-void PrintUsage() {
-  std::cout << "Usage: trace record "
-            << kBinaryPath
-            // Comment to make clang format not break formatting.
-            << " --" << kEntryCountFlag << "=<int>"
-            << " --" << kTransactionSizeFlag << "=<int>"
-            << " --" << kKeySizeFlag << "=<int>"
-            << " --" << kValueSizeFlag << "=<int>" << std::endl;
-}
-
-// Benchmark that measures the time taken to delete an entry from a page.
-//
-// Parameters:
-//   --entry-count=<int> the number of entries to be put and deleted
-//   --transaction_size=<int> number of delete operations in each transaction. 0
-//     means no explicit transactions.
-//   --key-size=<int> size of the keys for the entries
-//   --value-size=<int> the size of a single value in bytes
-class DeleteEntryBenchmark {
- public:
-  DeleteEntryBenchmark(
-      async::Loop* loop,
-      std::unique_ptr<component::StartupContext> startup_context,
-      size_t entry_count, size_t transaction_size, size_t key_size,
-      size_t value_size);
-
-  void Run();
-
- private:
-  void Populate();
-  void RunSingle(size_t i);
-  void CommitAndRunNext(size_t i);
-  void ShutDown();
-  fit::closure QuitLoopClosure();
-
-  async::Loop* const loop_;
-  rng::TestRandom random_;
-  files::ScopedTempDir tmp_dir_;
-  DataGenerator generator_;
-  PageDataGenerator page_data_generator_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  const size_t entry_count_;
-  const size_t transaction_size_;
-  const size_t key_size_;
-  const size_t value_size_;
-  fuchsia::sys::ComponentControllerPtr component_controller_;
-  LedgerPtr ledger_;
-  PagePtr page_;
-  std::vector<std::vector<uint8_t>> keys_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DeleteEntryBenchmark);
-};
-
-DeleteEntryBenchmark::DeleteEntryBenchmark(
-    async::Loop* loop,
-    std::unique_ptr<component::StartupContext> startup_context,
-    size_t entry_count, size_t transaction_size, size_t key_size,
-    size_t value_size)
-    : loop_(loop),
-      random_(0),
-      tmp_dir_(kStoragePath),
-      generator_(&random_),
-      page_data_generator_(&random_),
-      startup_context_(std::move(startup_context)),
-      entry_count_(entry_count),
-      transaction_size_(transaction_size),
-      key_size_(key_size),
-      value_size_(value_size) {
-  FXL_DCHECK(loop_);
-  FXL_DCHECK(entry_count_ > 0);
-  FXL_DCHECK(transaction_size_ >= 0);
-  FXL_DCHECK(key_size_ > 0);
-  FXL_DCHECK(value_size_ > 0);
-}
-
-void DeleteEntryBenchmark::Run() {
-  Status status =
-      GetLedger(startup_context_.get(), component_controller_.NewRequest(),
-                nullptr, "", "delete_entry", DetachedPath(tmp_dir_.path()),
-                QuitLoopClosure(), &ledger_);
-  if (QuitOnError(QuitLoopClosure(), status, "GetLedger")) {
-    return;
-  }
-
-  GetPageEnsureInitialized(
-      &ledger_, nullptr, DelayCallback::YES, QuitLoopClosure(),
-      [this](Status status, PagePtr page, PageId id) {
-        if (QuitOnError(QuitLoopClosure(), status, "Page initialization")) {
-          return;
-        }
-        page_ = std::move(page);
-        Populate();
-      });
-}
-
-void DeleteEntryBenchmark::Populate() {
-  auto keys = generator_.MakeKeys(entry_count_, key_size_, entry_count_);
-  for (size_t i = 0; i < entry_count_; i++) {
-    keys_.push_back(keys[i]);
-  }
-
-  page_data_generator_.Populate(
-      &page_, std::move(keys), value_size_, entry_count_,
-      PageDataGenerator::ReferenceStrategy::REFERENCE, Priority::EAGER,
-      [this](Status status) {
-        if (status != Status::OK) {
-          QuitOnError(QuitLoopClosure(), status, "PageGenerator::Populate");
-          return;
-        }
-        if (transaction_size_ > 0) {
-          page_->StartTransaction([this](Status status) {
-            if (QuitOnError(QuitLoopClosure(), status,
-                            "Page::StartTransaction")) {
-              return;
-            }
-            TRACE_ASYNC_BEGIN("benchmark", "transaction", 0);
-            RunSingle(0);
-          });
-        } else {
-          RunSingle(0);
-        }
-      });
-}
-
-void DeleteEntryBenchmark::RunSingle(size_t i) {
-  if (i == entry_count_) {
-    ShutDown();
-
-    uint64_t tmp_dir_size = 0;
-    FXL_CHECK(
-        GetDirectoryContentSize(DetachedPath(tmp_dir_.path()), &tmp_dir_size));
-    TRACE_COUNTER("benchmark", "ledger_directory_size", 0, "directory_size",
-                  TA_UINT64(tmp_dir_size));
-    return;
-  }
-
-  TRACE_ASYNC_BEGIN("benchmark", "delete_entry", i);
-  page_->Delete(std::move(keys_[i]), [this, i](Status status) {
-    if (QuitOnError(QuitLoopClosure(), status, "Page::Delete")) {
-      return;
-    }
-    TRACE_ASYNC_END("benchmark", "delete_entry", i);
-    if (transaction_size_ > 0 &&
-        (i % transaction_size_ == transaction_size_ - 1 ||
-         i + 1 == entry_count_)) {
-      CommitAndRunNext(i);
-    } else {
-      RunSingle(i + 1);
-    }
-  });
-}
-
-void DeleteEntryBenchmark::CommitAndRunNext(size_t i) {
-  TRACE_ASYNC_BEGIN("benchmark", "commit", i / transaction_size_);
-  page_->Commit([this, i](Status status) {
-    if (QuitOnError(QuitLoopClosure(), status, "Page::Commit")) {
-      return;
-    }
-    TRACE_ASYNC_END("benchmark", "commit", i / transaction_size_);
-    TRACE_ASYNC_END("benchmark", "transaction", i / transaction_size_);
-
-    if (i == entry_count_ - 1) {
-      RunSingle(i + 1);
-      return;
-    }
-    page_->StartTransaction([this, i = i + 1](Status status) {
-      if (QuitOnError(QuitLoopClosure(), status, "Page::StartTransaction")) {
-        return;
-      }
-      TRACE_ASYNC_BEGIN("benchmark", "transaction", i / transaction_size_);
-      RunSingle(i);
-    });
-  });
-}
-
-void DeleteEntryBenchmark::ShutDown() {
-  KillLedgerProcess(&component_controller_);
-  loop_->Quit();
-}
-
-fit::closure DeleteEntryBenchmark::QuitLoopClosure() {
-  return [this] { loop_->Quit(); };
-}
-
-int Main(int argc, const char** argv) {
-  fxl::CommandLine command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto startup_context = component::StartupContext::CreateFromStartupInfo();
-
-  std::string entry_count_str;
-  size_t entry_count;
-  std::string transaction_size_str;
-  size_t transaction_size;
-  std::string key_size_str;
-  size_t key_size;
-  std::string value_size_str;
-  size_t value_size;
-  if (!command_line.GetOptionValue(kEntryCountFlag.ToString(),
-                                   &entry_count_str) ||
-      !fxl::StringToNumberWithError(entry_count_str, &entry_count) ||
-      entry_count == 0 ||
-      !command_line.GetOptionValue(kTransactionSizeFlag.ToString(),
-                                   &transaction_size_str) ||
-      !fxl::StringToNumberWithError(transaction_size_str, &transaction_size) ||
-      !command_line.GetOptionValue(kKeySizeFlag.ToString(), &key_size_str) ||
-      !fxl::StringToNumberWithError(key_size_str, &key_size) || key_size == 0 ||
-      !command_line.GetOptionValue(kValueSizeFlag.ToString(),
-                                   &value_size_str) ||
-      !fxl::StringToNumberWithError(value_size_str, &value_size) ||
-      value_size == 0) {
-    PrintUsage();
-    return -1;
-  }
-
-  DeleteEntryBenchmark app(&loop, std::move(startup_context), entry_count,
-                           transaction_size, key_size, value_size);
-
-  return RunWithTracing(&loop, [&app] { app.Run(); });
-}
-
-}  // namespace
-}  // namespace ledger
-
-int main(int argc, const char** argv) { return ledger::Main(argc, argv); }
diff --git a/bin/ledger/tests/benchmark/delete_entry/delete_entry.cmx b/bin/ledger/tests/benchmark/delete_entry/delete_entry.cmx
deleted file mode 100644
index 4c162f5..0000000
--- a/bin/ledger/tests/benchmark/delete_entry/delete_entry.cmx
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "program": {
-        "binary": "bin/ledger_benchmark_delete_entry"
-    },
-    "sandbox": {
-        "features": [
-            "persistent-storage"
-        ],
-        "services": [
-            "fuchsia.tracelink.Registry",
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/benchmark/delete_entry/delete_entry.tspec b/bin/ledger/tests/benchmark/delete_entry/delete_entry.tspec
deleted file mode 100644
index 6b2d300..0000000
--- a/bin/ledger/tests/benchmark/delete_entry/delete_entry.tspec
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.delete_entry",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/delete_entry.cmx",
-  "args": ["--entry-count=100", "--key-size=100", "--value-size=1000",
-           "--transaction-size=0"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "small_value/delete",
-      "event_name": "delete_entry",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/delete_entry/delete_entry_transactions.tspec b/bin/ledger/tests/benchmark/delete_entry/delete_entry_transactions.tspec
deleted file mode 100644
index 8311d2a..0000000
--- a/bin/ledger/tests/benchmark/delete_entry/delete_entry_transactions.tspec
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.delete_entry",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/delete_entry.cmx",
-  "args": ["--entry-count=100", "--key-size=100", "--value-size=1000",
-           "--transaction-size=10"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "transaction/transaction",
-      "event_name": "transaction",
-      "event_category": "benchmark",
-      "expected_sample_count": 10,
-      "split_first": true
-    },
-
-    {
-      "type": "duration",
-      "output_test_name": "transaction/commit",
-      "event_name": "commit",
-      "event_category": "benchmark",
-      "expected_sample_count": 10,
-      "split_first": true
-    },
-
-    {
-      "type": "duration",
-      "output_test_name": "transaction/delete",
-      "event_name": "delete_entry",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/delete_entry/disk_space_cleared_page.tspec b/bin/ledger/tests/benchmark/delete_entry/disk_space_cleared_page.tspec
deleted file mode 100644
index e8fc340..0000000
--- a/bin/ledger/tests/benchmark/delete_entry/disk_space_cleared_page.tspec
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.delete_entry",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/delete_entry.cmx",
-  "args": ["--entry-count=100", "--key-size=100", "--value-size=1000",
-           "--transaction-size=100"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "argument_value",
-      "output_test_name": "cleared_page/ledger_directory_size",
-      "event_name": "ledger_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/disk_space/BUILD.gn b/bin/ledger/tests/benchmark/disk_space/BUILD.gn
deleted file mode 100644
index 7ff2097..0000000
--- a/bin/ledger/tests/benchmark/disk_space/BUILD.gn
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("disk_space") {
-  testonly = true
-
-  public_deps = [
-    ":ledger_benchmark_disk_space",
-  ]
-}
-
-executable("ledger_benchmark_disk_space") {
-  testonly = true
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/testing:get_ledger",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fit",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  sources = [
-    "disk_space.cc",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/benchmark/disk_space/disk_space.cc b/bin/ledger/tests/benchmark/disk_space/disk_space.cc
deleted file mode 100644
index 1ec6ecf..0000000
--- a/bin/ledger/tests/benchmark/disk_space/disk_space.cc
+++ /dev/null
@@ -1,250 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <trace/event.h>
-#include <iostream>
-#include <memory>
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/callback/waiter.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/zx/time.h>
-
-#include "garnet/public/lib/callback/waiter.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/filesystem/get_directory_content_size.h"
-#include "peridot/bin/ledger/testing/get_ledger.h"
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-#include "peridot/bin/ledger/testing/page_data_generator.h"
-#include "peridot/bin/ledger/testing/quit_on_error.h"
-#include "peridot/bin/ledger/testing/run_with_tracing.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kBinaryPath =
-    "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/disk_space.cmx";
-constexpr fxl::StringView kStoragePath = "/data/benchmark/ledger/disk_space";
-constexpr fxl::StringView kPageCountFlag = "page-count";
-constexpr fxl::StringView kUniqueKeyCountFlag = "unique-key-count";
-constexpr fxl::StringView kCommitCountFlag = "commit-count";
-constexpr fxl::StringView kKeySizeFlag = "key-size";
-constexpr fxl::StringView kValueSizeFlag = "value-size";
-
-void PrintUsage() {
-  std::cout << "Usage: trace record "
-            << kBinaryPath
-            // Comment to make clang format not break formatting.
-            << " --" << kPageCountFlag << "=<int>"
-            << " --" << kUniqueKeyCountFlag << "=<int>"
-            << " --" << kCommitCountFlag << "=<int>"
-            << " --" << kKeySizeFlag << "=<int>"
-            << " --" << kValueSizeFlag << "=<int>" << std::endl;
-}
-
-// Disk space "general usage" benchmark.
-// This benchmark is used to capture Ledger disk usage over the set of common
-// operations, such as getting a new page, adding several entries to the page,
-// modifying the same entry several times.
-//
-// The emulated scenario is as follows:
-// First, |page_count| pages is requested from ledger. Then each page is
-// populated with |unique_key_count| unique entries, making |commit_count|
-// commits in the process (so if |commit_count| is bigger than
-// |unique_key_count|, some entries get overwritten in subsequent commits,
-// whereas if |commit_count| is smaller than |unique_key_count|, insertion
-// operations get grouped together into the requested number of commits). Each
-// entry has a key size of |key_size| and a value size of |value_size|. After
-// that, the connection to the ledger is closed and the size of the directory
-// used by it is measured and reported using a trace counter event.
-//
-// Parameters:
-//   --page-count=<int> number of pages to be requested.
-//   --unique-key-count=<int> number of unique keys contained in each page
-//   after population.
-//   --commit-count=<int> number of commits made to each page.
-//   If this number is smaller than unique-key-count, changes will be bundled
-//   into transactions. If it is bigger, some or all of the changes will use the
-//   same keys, modifying the value.
-//   --key-size=<int> size of a key for each entry.
-//   --value-size=<int> size of a value for each entry.
-class DiskSpaceBenchmark {
- public:
-  DiskSpaceBenchmark(async::Loop* loop,
-                     std::unique_ptr<component::StartupContext> startup_context,
-                     size_t page_count, size_t unique_key_count,
-                     size_t commit_count, size_t key_size, size_t value_size);
-
-  void Run();
-
- private:
-  void Populate();
-  void ShutDownAndRecord();
-  fit::closure QuitLoopClosure();
-
-  async::Loop* const loop_;
-  rng::TestRandom random_;
-  files::ScopedTempDir tmp_dir_;
-  DataGenerator generator_;
-  PageDataGenerator page_data_generator_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  const size_t page_count_;
-  const size_t unique_key_count_;
-  const size_t commit_count_;
-  const size_t key_size_;
-  const size_t value_size_;
-  fuchsia::sys::ComponentControllerPtr component_controller_;
-  LedgerPtr ledger_;
-  std::vector<PagePtr> pages_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DiskSpaceBenchmark);
-};
-
-DiskSpaceBenchmark::DiskSpaceBenchmark(
-    async::Loop* loop,
-    std::unique_ptr<component::StartupContext> startup_context,
-    size_t page_count, size_t unique_key_count, size_t commit_count,
-    size_t key_size, size_t value_size)
-    : loop_(loop),
-      random_(0),
-      tmp_dir_(kStoragePath),
-      generator_(&random_),
-      page_data_generator_(&random_),
-      startup_context_(std::move(startup_context)),
-      page_count_(page_count),
-      unique_key_count_(unique_key_count),
-      commit_count_(commit_count),
-      key_size_(key_size),
-      value_size_(value_size) {
-  FXL_DCHECK(loop_);
-  FXL_DCHECK(page_count_ >= 0);
-  FXL_DCHECK(unique_key_count_ >= 0);
-  FXL_DCHECK(commit_count_ >= 0);
-  FXL_DCHECK(key_size_ > 0);
-  FXL_DCHECK(value_size_ > 0);
-}
-
-void DiskSpaceBenchmark::Run() {
-  Status status = GetLedger(
-      startup_context_.get(), component_controller_.NewRequest(), nullptr, "",
-      "disk_space", DetachedPath(tmp_dir_.path()), QuitLoopClosure(), &ledger_);
-  if (QuitOnError(QuitLoopClosure(), status, "GetLedger")) {
-    return;
-  }
-
-  auto waiter =
-      fxl::MakeRefCounted<callback::Waiter<Status, PagePtr>>(Status::OK);
-
-  for (size_t page_number = 0; page_number < page_count_; page_number++) {
-    GetPageEnsureInitialized(&ledger_, nullptr, DelayCallback::YES,
-                             QuitLoopClosure(),
-                             [callback = waiter->NewCallback()](
-                                 Status status, PagePtr page, PageId id) {
-                               callback(status, std::move(page));
-                             });
-  }
-
-  waiter->Finalize([this](Status status, std::vector<PagePtr> pages) {
-    if (QuitOnError(QuitLoopClosure(), status, "GetPageEnsureInitialized")) {
-      return;
-    }
-    pages_ = std::move(pages);
-    if (commit_count_ == 0) {
-      ShutDownAndRecord();
-      return;
-    }
-    Populate();
-  });
-}
-
-void DiskSpaceBenchmark::Populate() {
-  int transaction_size = static_cast<int>(
-      ceil(static_cast<double>(unique_key_count_) / commit_count_));
-  int insertions = std::max(unique_key_count_, commit_count_);
-  FXL_LOG(INFO) << "Transaction size: " << transaction_size
-                << ", insertions: " << insertions << ".";
-  auto waiter = fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-  for (auto& page : pages_) {
-    auto keys = generator_.MakeKeys(insertions, key_size_, unique_key_count_);
-    page_data_generator_.Populate(
-        &page, std::move(keys), value_size_, transaction_size,
-        PageDataGenerator::ReferenceStrategy::REFERENCE, Priority::EAGER,
-        waiter->NewCallback());
-  }
-  waiter->Finalize([this](Status status) {
-    if (QuitOnError(QuitLoopClosure(), status, "PageGenerator::Populate")) {
-      return;
-    }
-    ShutDownAndRecord();
-  });
-}
-
-void DiskSpaceBenchmark::ShutDownAndRecord() {
-  KillLedgerProcess(&component_controller_);
-  loop_->Quit();
-
-  uint64_t tmp_dir_size = 0;
-  FXL_CHECK(
-      GetDirectoryContentSize(DetachedPath(tmp_dir_.path()), &tmp_dir_size));
-  TRACE_COUNTER("benchmark", "ledger_directory_size", 0, "directory_size",
-                TA_UINT64(tmp_dir_size));
-}
-
-fit::closure DiskSpaceBenchmark::QuitLoopClosure() {
-  return [this] { loop_->Quit(); };
-}
-
-int Main(int argc, const char** argv) {
-  fxl::CommandLine command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto startup_context = component::StartupContext::CreateFromStartupInfo();
-
-  std::string page_count_str;
-  size_t page_count;
-  std::string unique_key_count_str;
-  size_t unique_key_count;
-  std::string commit_count_str;
-  size_t commit_count;
-  std::string key_size_str;
-  size_t key_size;
-  std::string value_size_str;
-  size_t value_size;
-  if (!command_line.GetOptionValue(kPageCountFlag.ToString(),
-                                   &page_count_str) ||
-      !fxl::StringToNumberWithError(page_count_str, &page_count) ||
-      !command_line.GetOptionValue(kUniqueKeyCountFlag.ToString(),
-                                   &unique_key_count_str) ||
-      !fxl::StringToNumberWithError(unique_key_count_str, &unique_key_count) ||
-      !command_line.GetOptionValue(kCommitCountFlag.ToString(),
-                                   &commit_count_str) ||
-      !fxl::StringToNumberWithError(commit_count_str, &commit_count) ||
-      !command_line.GetOptionValue(kKeySizeFlag.ToString(), &key_size_str) ||
-      !fxl::StringToNumberWithError(key_size_str, &key_size) || key_size == 0 ||
-      !command_line.GetOptionValue(kValueSizeFlag.ToString(),
-                                   &value_size_str) ||
-      !fxl::StringToNumberWithError(value_size_str, &value_size) ||
-      value_size == 0) {
-    PrintUsage();
-    return -1;
-  }
-
-  DiskSpaceBenchmark app(&loop, std::move(startup_context), page_count,
-                         unique_key_count, commit_count, key_size, value_size);
-
-  return RunWithTracing(&loop, [&app] { app.Run(); });
-}
-
-}  // namespace
-}  // namespace ledger
-
-int main(int argc, const char** argv) { return ledger::Main(argc, argv); }
diff --git a/bin/ledger/tests/benchmark/disk_space/disk_space.cmx b/bin/ledger/tests/benchmark/disk_space/disk_space.cmx
deleted file mode 100644
index a1f1390..0000000
--- a/bin/ledger/tests/benchmark/disk_space/disk_space.cmx
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "program": {
-        "binary": "bin/ledger_benchmark_disk_space"
-    },
-    "sandbox": {
-        "features": [
-            "persistent-storage"
-        ],
-        "services": [
-            "fuchsia.tracelink.Registry",
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/benchmark/disk_space/empty_ledger.tspec b/bin/ledger/tests/benchmark/disk_space/empty_ledger.tspec
deleted file mode 100644
index 23d6b4a..0000000
--- a/bin/ledger/tests/benchmark/disk_space/empty_ledger.tspec
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.disk_space",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/disk_space.cmx",
-  "args": ["--page-count=0", "--unique-key-count=0", "--key-size=10",
-           "--value-size=10", "--commit-count=0"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "argument_value",
-      "output_test_name": "empty_ledger/ledger_directory_size",
-      "event_name": "ledger_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/disk_space/empty_pages.tspec b/bin/ledger/tests/benchmark/disk_space/empty_pages.tspec
deleted file mode 100644
index 61b2570..0000000
--- a/bin/ledger/tests/benchmark/disk_space/empty_pages.tspec
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.disk_space",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/disk_space.cmx",
-  "args": ["--page-count=10", "--unique-key-count=0", "--key-size=10",
-           "--value-size=10", "--commit-count=0"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "argument_value",
-      "output_test_name": "empty_pages/ledger_directory_size",
-      "event_name": "ledger_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/disk_space/entries.tspec b/bin/ledger/tests/benchmark/disk_space/entries.tspec
deleted file mode 100644
index d685527..0000000
--- a/bin/ledger/tests/benchmark/disk_space/entries.tspec
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.disk_space",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/disk_space.cmx",
-  "args": ["--page-count=1", "--unique-key-count=100", "--key-size=100",
-           "--value-size=1000", "--commit-count=1"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "argument_value",
-      "output_test_name": "entries/ledger_directory_size",
-      "event_name": "ledger_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/disk_space/one_commit_per_entry.tspec b/bin/ledger/tests/benchmark/disk_space/one_commit_per_entry.tspec
deleted file mode 100644
index d2e750c..0000000
--- a/bin/ledger/tests/benchmark/disk_space/one_commit_per_entry.tspec
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.disk_space",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/disk_space.cmx",
-  "args": ["--page-count=1", "--unique-key-count=100", "--key-size=100",
-           "--value-size=1000", "--commit-count=100"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "argument_value",
-      "output_test_name": "one_commit_per_entry/ledger_directory_size",
-      "event_name": "ledger_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/disk_space/small_keys.tspec b/bin/ledger/tests/benchmark/disk_space/small_keys.tspec
deleted file mode 100644
index 6993b67..0000000
--- a/bin/ledger/tests/benchmark/disk_space/small_keys.tspec
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.disk_space",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/disk_space.cmx",
-  "args": ["--page-count=1", "--unique-key-count=100", "--key-size=10",
-           "--value-size=1000", "--commit-count=1"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "argument_value",
-      "output_test_name": "small_keys/ledger_directory_size",
-      "event_name": "ledger_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/disk_space/updates.tspec b/bin/ledger/tests/benchmark/disk_space/updates.tspec
deleted file mode 100644
index 8528790..0000000
--- a/bin/ledger/tests/benchmark/disk_space/updates.tspec
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.disk_space",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/disk_space.cmx",
-  "args": ["--page-count=1", "--unique-key-count=1", "--commit-count=100",
-           "--key-size=100", "--value-size=1000"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "argument_value",
-      "output_test_name": "updates/ledger_directory_size",
-      "event_name": "ledger_directory_size",
-      "event_category": "benchmark",
-      "argument_name": "directory_size",
-      "argument_unit": "bytes"
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/fetch/BUILD.gn b/bin/ledger/tests/benchmark/fetch/BUILD.gn
deleted file mode 100644
index 93a302d..0000000
--- a/bin/ledger/tests/benchmark/fetch/BUILD.gn
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("fetch") {
-  testonly = true
-
-  public_deps = [
-    ":ledger_benchmark_fetch",
-  ]
-}
-
-executable("ledger_benchmark_fetch") {
-  testonly = true
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/cloud_provider_firestore/testing",
-    "//peridot/bin/ledger/testing:get_ledger",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/convert",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fit",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  sources = [
-    "fetch.cc",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/benchmark/fetch/fetch.cc b/bin/ledger/tests/benchmark/fetch/fetch.cc
deleted file mode 100644
index 55efd61..0000000
--- a/bin/ledger/tests/benchmark/fetch/fetch.cc
+++ /dev/null
@@ -1,354 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-#include <memory>
-#include <vector>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/zx/time.h>
-#include <trace/event.h>
-
-#include "peridot/bin/cloud_provider_firestore/testing/cloud_provider_factory.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/testing/data_generator.h"
-#include "peridot/bin/ledger/testing/get_ledger.h"
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-#include "peridot/bin/ledger/testing/page_data_generator.h"
-#include "peridot/bin/ledger/testing/quit_on_error.h"
-#include "peridot/bin/ledger/testing/run_with_tracing.h"
-#include "peridot/bin/ledger/testing/sync_params.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kBinaryPath =
-    "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/fetch.cmx";
-constexpr fxl::StringView kStoragePath = "/data/benchmark/ledger/fetch";
-constexpr fxl::StringView kEntryCountFlag = "entry-count";
-constexpr fxl::StringView kValueSizeFlag = "value-size";
-constexpr fxl::StringView kPartSizeFlag = "part-size";
-
-constexpr size_t kKeySize = 100;
-
-const std::string kUserDirectory = "/fetch-user";
-
-void PrintUsage() {
-  std::cout << "Usage: trace record "
-            << kBinaryPath
-            // Comment to make clang format not break formatting.
-            << " --" << kEntryCountFlag << "=<int>"
-            << " --" << kValueSizeFlag << "=<int>"
-            << " --" << kPartSizeFlag << "=<int>" << GetSyncParamsUsage()
-            << std::endl;
-}
-
-// Benchmark that measures time to fetch lazy values from server.
-// Parameters:
-//   --entry-count=<int> the number of entries to be put
-//   --value-size=<int> the size of a single value in bytes
-//   --part-size=<int> the size of the part to be read with one Fetch
-//   call. If equal to zero, the whole value will be read.
-//   --credentials-path=<file path> Firestore service account credentials
-class FetchBenchmark : public SyncWatcher {
- public:
-  FetchBenchmark(async::Loop* loop,
-                 std::unique_ptr<component::StartupContext> startup_context,
-                 size_t entry_count, size_t value_size, size_t part_size,
-                 SyncParams sync_params);
-
-  void Run();
-
-  // SyncWatcher:
-  void SyncStateChanged(SyncState download, SyncState upload,
-                        SyncStateChangedCallback callback) override;
-
- private:
-  void Populate();
-  void WaitForWriterUpload();
-  void ConnectReader();
-  void WaitForReaderDownload();
-
-  void FetchValues(PageSnapshotPtr snapshot, size_t i);
-  void FetchPart(PageSnapshotPtr snapshot, size_t i, size_t part);
-
-  void ShutDown();
-  fit::closure QuitLoopClosure();
-
-  async::Loop* const loop_;
-  rng::TestRandom random_;
-  DataGenerator generator_;
-  PageDataGenerator page_data_generator_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  cloud_provider_firestore::CloudProviderFactory cloud_provider_factory_;
-  fidl::Binding<SyncWatcher> sync_watcher_binding_;
-  const size_t entry_count_;
-  const size_t value_size_;
-  const size_t part_size_;
-  const cloud_provider_firestore::CloudProviderFactory::UserId user_id_;
-  files::ScopedTempDir writer_tmp_dir_;
-  files::ScopedTempDir reader_tmp_dir_;
-  fuchsia::sys::ComponentControllerPtr writer_controller_;
-  fuchsia::sys::ComponentControllerPtr reader_controller_;
-  LedgerPtr writer_;
-  LedgerPtr reader_;
-  PageId page_id_;
-  PagePtr writer_page_;
-  PagePtr reader_page_;
-  std::vector<std::vector<uint8_t>> keys_;
-  fit::function<void(SyncState, SyncState)> on_sync_state_changed_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FetchBenchmark);
-};
-
-FetchBenchmark::FetchBenchmark(
-    async::Loop* loop,
-    std::unique_ptr<component::StartupContext> startup_context,
-    size_t entry_count, size_t value_size, size_t part_size,
-    SyncParams sync_params)
-    : loop_(loop),
-      random_(0),
-      generator_(&random_),
-      page_data_generator_(&random_),
-      startup_context_(std::move(startup_context)),
-      cloud_provider_factory_(startup_context_.get(), &random_,
-                              std::move(sync_params.api_key),
-                              std::move(sync_params.credentials)),
-      sync_watcher_binding_(this),
-      entry_count_(entry_count),
-      value_size_(value_size),
-      part_size_(part_size),
-      user_id_(cloud_provider_firestore::CloudProviderFactory::UserId::New()),
-      writer_tmp_dir_(kStoragePath),
-      reader_tmp_dir_(kStoragePath) {
-  FXL_DCHECK(loop_);
-  FXL_DCHECK(entry_count_ > 0);
-  FXL_DCHECK(value_size_ > 0);
-  FXL_DCHECK(part_size_ <= value_size);
-  cloud_provider_factory_.Init();
-}
-
-void FetchBenchmark::SyncStateChanged(SyncState download, SyncState upload,
-                                      SyncStateChangedCallback callback) {
-  if (on_sync_state_changed_) {
-    on_sync_state_changed_(download, upload);
-  }
-  callback();
-}
-
-void FetchBenchmark::Run() {
-  // Name of the storage directory currently identifies the user. Ensure the
-  // most nested directory has the same name to make the ledgers sync.
-  std::string writer_path = writer_tmp_dir_.path() + kUserDirectory;
-  bool ret = files::CreateDirectory(writer_path);
-  FXL_DCHECK(ret);
-
-  cloud_provider::CloudProviderPtr cloud_provider_writer;
-  cloud_provider_factory_.MakeCloudProvider(user_id_,
-                                            cloud_provider_writer.NewRequest());
-  Status status = GetLedger(
-      startup_context_.get(), writer_controller_.NewRequest(),
-      std::move(cloud_provider_writer), user_id_.user_id(), "fetch",
-      DetachedPath(std::move(writer_path)), QuitLoopClosure(), &writer_);
-  if (QuitOnError(QuitLoopClosure(), status, "Get writer ledger")) {
-    return;
-  }
-
-  GetPageEnsureInitialized(&writer_, nullptr, DelayCallback::YES,
-                           QuitLoopClosure(),
-                           [this](Status status, PagePtr page, PageId id) {
-                             if (QuitOnError(QuitLoopClosure(), status,
-                                             "Writer page initialization")) {
-                               return;
-                             }
-                             writer_page_ = std::move(page);
-                             page_id_ = id;
-
-                             Populate();
-                           });
-}
-
-void FetchBenchmark::Populate() {
-  auto keys = generator_.MakeKeys(entry_count_, kKeySize, entry_count_);
-  for (size_t i = 0; i < entry_count_; i++) {
-    keys_.push_back(keys[i]);
-  }
-
-  page_data_generator_.Populate(
-      &writer_page_, std::move(keys), value_size_, entry_count_,
-      PageDataGenerator::ReferenceStrategy::REFERENCE, Priority::LAZY,
-      [this](Status status) {
-        if (QuitOnError(QuitLoopClosure(), status, "PageGenerator::Populate")) {
-          return;
-        }
-        WaitForWriterUpload();
-      });
-}
-
-void FetchBenchmark::WaitForWriterUpload() {
-  on_sync_state_changed_ = [this](SyncState download, SyncState upload) {
-    if (upload == SyncState::IDLE) {
-      on_sync_state_changed_ = nullptr;
-      // Stop watching sync state for this page.
-      sync_watcher_binding_.Unbind();
-      ConnectReader();
-      return;
-    }
-  };
-  writer_page_->SetSyncStateWatcher(
-      sync_watcher_binding_.NewBinding(),
-      QuitOnErrorCallback(QuitLoopClosure(), "Page::SetSyncStateWatcher"));
-}
-
-void FetchBenchmark::ConnectReader() {
-  std::string reader_path = reader_tmp_dir_.path() + kUserDirectory;
-  bool ret = files::CreateDirectory(reader_path);
-  FXL_DCHECK(ret);
-
-  cloud_provider::CloudProviderPtr cloud_provider_reader;
-  cloud_provider_factory_.MakeCloudProvider(user_id_,
-                                            cloud_provider_reader.NewRequest());
-  Status status = GetLedger(
-      startup_context_.get(), reader_controller_.NewRequest(),
-      std::move(cloud_provider_reader), user_id_.user_id(), "fetch",
-      DetachedPath(std::move(reader_path)), QuitLoopClosure(), &reader_);
-  if (QuitOnError(QuitLoopClosure(), status, "ConnectReader")) {
-    return;
-  }
-
-  reader_->GetPage(fidl::MakeOptional(page_id_), reader_page_.NewRequest(),
-                   [this](Status status) {
-                     if (QuitOnError(QuitLoopClosure(), status, "GetPage")) {
-                       return;
-                     }
-                     WaitForReaderDownload();
-                   });
-}
-
-void FetchBenchmark::WaitForReaderDownload() {
-  on_sync_state_changed_ = [this](SyncState download, SyncState upload) {
-    if (download == SyncState::IDLE) {
-      on_sync_state_changed_ = nullptr;
-      PageSnapshotPtr snapshot;
-      reader_page_->GetSnapshot(
-          snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0), nullptr,
-          QuitOnErrorCallback(QuitLoopClosure(), "GetSnapshot"));
-      FetchValues(std::move(snapshot), 0);
-      return;
-    }
-  };
-  reader_page_->SetSyncStateWatcher(
-      sync_watcher_binding_.NewBinding(),
-      QuitOnErrorCallback(QuitLoopClosure(), "Page::SetSyncStateWatcher"));
-}
-
-void FetchBenchmark::FetchValues(PageSnapshotPtr snapshot, size_t i) {
-  if (i >= entry_count_) {
-    ShutDown();
-    return;
-  }
-
-  if (part_size_ > 0) {
-    TRACE_ASYNC_BEGIN("benchmark", "Fetch (cumulative)", i);
-    FetchPart(std::move(snapshot), i, 0);
-    return;
-  }
-  PageSnapshot* snapshot_ptr = snapshot.get();
-
-  TRACE_ASYNC_BEGIN("benchmark", "Fetch", i);
-  snapshot_ptr->Fetch(
-      std::move(keys_[i]),
-      [this, snapshot = std::move(snapshot), i](
-          Status status, fuchsia::mem::BufferPtr value) mutable {
-        if (QuitOnError(QuitLoopClosure(), status, "PageSnapshot::Fetch")) {
-          return;
-        }
-        TRACE_ASYNC_END("benchmark", "Fetch", i);
-        FetchValues(std::move(snapshot), i + 1);
-      });
-}
-
-void FetchBenchmark::FetchPart(PageSnapshotPtr snapshot, size_t i,
-                               size_t part) {
-  if (part * part_size_ >= value_size_) {
-    TRACE_ASYNC_END("benchmark", "Fetch (cumulative)", i);
-    FetchValues(std::move(snapshot), i + 1);
-    return;
-  }
-  PageSnapshot* snapshot_ptr = snapshot.get();
-  auto trace_event_id = TRACE_NONCE();
-  TRACE_ASYNC_BEGIN("benchmark", "FetchPartial", trace_event_id);
-  snapshot_ptr->FetchPartial(
-      keys_[i], part * part_size_, part_size_,
-      [this, snapshot = std::move(snapshot), i, part, trace_event_id](
-          Status status, fuchsia::mem::BufferPtr value) mutable {
-        if (QuitOnError(QuitLoopClosure(), status,
-                        "PageSnapshot::FetchPartial")) {
-          return;
-        }
-        TRACE_ASYNC_END("benchmark", "FetchPartial", trace_event_id);
-        FetchPart(std::move(snapshot), i, part + 1);
-      });
-}
-
-void FetchBenchmark::ShutDown() {
-  KillLedgerProcess(&writer_controller_);
-  KillLedgerProcess(&reader_controller_);
-  loop_->Quit();
-}
-
-fit::closure FetchBenchmark::QuitLoopClosure() {
-  return [this] { loop_->Quit(); };
-}
-
-int Main(int argc, const char** argv) {
-  fxl::CommandLine command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto startup_context = component::StartupContext::CreateFromStartupInfo();
-
-  std::string entry_count_str;
-  size_t entry_count;
-  std::string value_size_str;
-  size_t value_size;
-  std::string part_size_str;
-  size_t part_size;
-  SyncParams sync_params;
-  if (!command_line.GetOptionValue(kEntryCountFlag.ToString(),
-                                   &entry_count_str) ||
-      !fxl::StringToNumberWithError(entry_count_str, &entry_count) ||
-      entry_count == 0 ||
-      !command_line.GetOptionValue(kValueSizeFlag.ToString(),
-                                   &value_size_str) ||
-      !fxl::StringToNumberWithError(value_size_str, &value_size) ||
-      value_size == 0 ||
-      !command_line.GetOptionValue(kPartSizeFlag.ToString(), &part_size_str) ||
-      !fxl::StringToNumberWithError(part_size_str, &part_size) ||
-      !ParseSyncParamsFromCommandLine(command_line, startup_context.get(),
-                                      &sync_params)) {
-    PrintUsage();
-    return -1;
-  }
-
-  FetchBenchmark app(&loop, std::move(startup_context), entry_count, value_size,
-                     part_size, std::move(sync_params));
-  return RunWithTracing(&loop, [&app] { app.Run(); });
-}
-
-}  // namespace
-}  // namespace ledger
-
-int main(int argc, const char** argv) { return ledger::Main(argc, argv); }
diff --git a/bin/ledger/tests/benchmark/fetch/fetch.cmx b/bin/ledger/tests/benchmark/fetch/fetch.cmx
deleted file mode 100644
index 52d64b8..0000000
--- a/bin/ledger/tests/benchmark/fetch/fetch.cmx
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "program": {
-        "binary": "bin/ledger_benchmark_fetch"
-    },
-    "sandbox": {
-        "features": [
-            "persistent-storage"
-        ],
-        "services": [
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/benchmark/fetch/fetch.tspec b/bin/ledger/tests/benchmark/fetch/fetch.tspec
deleted file mode 100644
index e0ed34a..0000000
--- a/bin/ledger/tests/benchmark/fetch/fetch.tspec
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/fetch.cmx",
-  "args": ["--entry-count=20", "--value-size=100000", "--part-size=0"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 120,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "Fetch",
-      "event_category": "benchmark",
-      "expected_sample_count": 20,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/fetch/fetch_partial_big_entry.tspec b/bin/ledger/tests/benchmark/fetch/fetch_partial_big_entry.tspec
deleted file mode 100644
index 08a2dff..0000000
--- a/bin/ledger/tests/benchmark/fetch/fetch_partial_big_entry.tspec
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/fetch.cmx",
-  "args": ["--entry-count=1", "--value-size=10000000", "--part-size=50000"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 120,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "Fetch (cumulative)",
-      "event_category": "benchmark",
-      "expected_sample_count": 1
-    },
-    {
-      "type": "duration",
-      "event_name": "FetchPartial",
-      "event_category": "benchmark",
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/get_page/BUILD.gn b/bin/ledger/tests/benchmark/get_page/BUILD.gn
deleted file mode 100644
index 90befb7..0000000
--- a/bin/ledger/tests/benchmark/get_page/BUILD.gn
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("get_page") {
-  testonly = true
-
-  public_deps = [
-    ":ledger_benchmark_get_page",
-  ]
-}
-
-executable("ledger_benchmark_get_page") {
-  testonly = true
-
-  deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/testing:get_ledger",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fit",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  sources = [
-    "get_page.cc",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/benchmark/get_page/add_new_page.tspec b/bin/ledger/tests/benchmark/get_page/add_new_page.tspec
deleted file mode 100644
index d8a747a..0000000
--- a/bin/ledger/tests/benchmark/get_page/add_new_page.tspec
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.get_page",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/get_page.cmx",
-  "args": ["--requests-count=500"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 120,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "new_page/get_page",
-      "event_name": "get page",
-      "event_category": "benchmark",
-      "expected_sample_count": 500,
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "output_test_name": "new_page/precache_db",
-      "event_name": "prepare_cached_db",
-      "event_category": "ledger",
-      "expected_sample_count": 500,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/get_page/add_new_page_precached.tspec b/bin/ledger/tests/benchmark/get_page/add_new_page_precached.tspec
deleted file mode 100644
index cfc621d..0000000
--- a/bin/ledger/tests/benchmark/get_page/add_new_page_precached.tspec
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.get_page",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/get_page.cmx",
-  "args": ["--requests-count=50", "--wait-for-cached-page"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 120,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "precached_page/get_page",
-      "event_name": "get page",
-      "event_category": "benchmark",
-      "expected_sample_count": 50,
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "output_test_name": "new_page/precache_db",
-      "event_name": "prepare_cached_db",
-      "event_category": "ledger",
-      "expected_sample_count": 50,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/get_page/get_page.cc b/bin/ledger/tests/benchmark/get_page/get_page.cc
deleted file mode 100644
index 21ce34a..0000000
--- a/bin/ledger/tests/benchmark/get_page/get_page.cc
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-#include <vector>
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/zx/time.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/testing/data_generator.h"
-#include "peridot/bin/ledger/testing/get_ledger.h"
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-#include "peridot/bin/ledger/testing/quit_on_error.h"
-#include "peridot/bin/ledger/testing/run_with_tracing.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kBinaryPath =
-    "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/get_page.cmx";
-constexpr fxl::StringView kStoragePath = "/data/benchmark/ledger/get_page";
-constexpr fxl::StringView kPageCountFlag = "requests-count";
-constexpr fxl::StringView kReuseFlag = "reuse";
-constexpr fxl::StringView kWaitForCachedPageFlag = "wait-for-cached-page";
-
-constexpr zx::duration kDuration = zx::msec(500);
-
-void PrintUsage() {
-  std::cout << "Usage: trace record "
-            << kBinaryPath
-            // Comment to make clang format not break formatting.
-            << " --" << kPageCountFlag << "=<int>"
-            << " [--" << kReuseFlag << "]"
-            << " [--" << kWaitForCachedPageFlag << "]" << std::endl;
-}
-
-// Benchmark that measures the time taken to get a page.
-//
-// Parameters:
-//   --requests-count=<int> number of requests made.
-//   --reuse - if this flag is specified, the same id will be used. Otherwise, a
-//   new page with a random id is requested every time.
-//   --wait_for_cached_page - if this flag is specified, the benchmark will wait
-//   for a sufficient amount of time before each page request, to allow Ledger
-//   to precache an empty new page.
-class GetPageBenchmark {
- public:
-  GetPageBenchmark(async::Loop* loop,
-                   std::unique_ptr<component::StartupContext> startup_context,
-                   size_t requests_count, bool reuse,
-                   bool wait_for_cached_page);
-
-  void Run();
-
- private:
-  void RunSingle(size_t request_number);
-  void ShutDown();
-  fit::closure QuitLoopClosure();
-
-  async::Loop* const loop_;
-  rng::TestRandom random_;
-  files::ScopedTempDir tmp_dir_;
-  DataGenerator generator_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  const size_t requests_count_;
-  const bool reuse_;
-  const bool wait_for_cached_page_;
-  fuchsia::sys::ComponentControllerPtr component_controller_;
-  LedgerPtr ledger_;
-  PageIdPtr page_id_;
-  std::vector<PagePtr> pages_;
-  bool get_page_called_ = false;
-  bool get_page_id_called_ = false;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(GetPageBenchmark);
-};
-
-GetPageBenchmark::GetPageBenchmark(
-    async::Loop* loop,
-    std::unique_ptr<component::StartupContext> startup_context,
-    size_t requests_count, bool reuse, bool wait_for_cached_page)
-    : loop_(loop),
-      random_(0),
-      tmp_dir_(kStoragePath),
-      generator_(&random_),
-      startup_context_(std::move(startup_context)),
-      requests_count_(requests_count),
-      reuse_(reuse),
-      wait_for_cached_page_(wait_for_cached_page) {
-  FXL_DCHECK(loop_);
-  FXL_DCHECK(requests_count_ > 0);
-}
-
-void GetPageBenchmark::Run() {
-  Status status = GetLedger(
-      startup_context_.get(), component_controller_.NewRequest(), nullptr, "",
-      "get_page", DetachedPath(tmp_dir_.path()), QuitLoopClosure(), &ledger_);
-
-  if (QuitOnError(QuitLoopClosure(), status, "GetLedger")) {
-    return;
-  }
-
-  page_id_ = fidl::MakeOptional(generator_.MakePageId());
-  RunSingle(requests_count_);
-}
-
-void GetPageBenchmark::RunSingle(size_t request_number) {
-  if (request_number == 0) {
-    ShutDown();
-    return;
-  }
-  if (wait_for_cached_page_) {
-    // Wait before each page request, so that a pre-cached page is ready.
-    zx_nanosleep(zx_deadline_after(kDuration.get()));
-  }
-  TRACE_ASYNC_BEGIN("benchmark", "get page", requests_count_ - request_number);
-  PagePtr page;
-
-  get_page_called_ = false;
-  get_page_id_called_ = false;
-  ledger_->GetPage(
-      reuse_ ? fidl::Clone(page_id_) : nullptr, page.NewRequest(),
-      [this, request_number](Status status) {
-        if (QuitOnError(QuitLoopClosure(), status, "Ledger::GetPage")) {
-          return;
-        }
-        TRACE_ASYNC_END("benchmark", "get page",
-                        requests_count_ - request_number);
-        get_page_called_ = true;
-        if (get_page_id_called_) {
-          // Wait for both GetPage and GetId to do the following run.
-          RunSingle(request_number - 1);
-        }
-      });
-
-  TRACE_ASYNC_BEGIN("benchmark", "get page id",
-                    requests_count_ - request_number);
-  // Request the page id before the GetPage callback is called.
-  page->GetId([this, request_number](PageId found_page_id) {
-    TRACE_ASYNC_END("benchmark", "get page id",
-                    requests_count_ - request_number);
-    get_page_id_called_ = true;
-    if (get_page_called_) {
-      // Wait for both GetPage and GetId to do the following run.
-      RunSingle(request_number - 1);
-    }
-  });
-
-  pages_.push_back(std::move(page));
-}
-
-void GetPageBenchmark::ShutDown() {
-  KillLedgerProcess(&component_controller_);
-  loop_->Quit();
-}
-
-fit::closure GetPageBenchmark::QuitLoopClosure() {
-  return [this] { loop_->Quit(); };
-}
-
-int Main(int argc, const char** argv) {
-  fxl::CommandLine command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto startup_context = component::StartupContext::CreateFromStartupInfo();
-
-  std::string requests_count_str;
-  size_t requests_count;
-  if (!command_line.GetOptionValue(kPageCountFlag.ToString(),
-                                   &requests_count_str) ||
-      !fxl::StringToNumberWithError(requests_count_str, &requests_count) ||
-      requests_count == 0) {
-    PrintUsage();
-    return EXIT_FAILURE;
-  }
-  bool reuse = command_line.HasOption(kReuseFlag);
-  bool wait_for_cached_page = command_line.HasOption(kWaitForCachedPageFlag);
-
-  GetPageBenchmark app(&loop, std::move(startup_context), requests_count, reuse,
-                       wait_for_cached_page);
-
-  return RunWithTracing(&loop, [&app] { app.Run(); });
-}
-
-}  // namespace
-}  // namespace ledger
-
-int main(int argc, const char** argv) { return ledger::Main(argc, argv); }
diff --git a/bin/ledger/tests/benchmark/get_page/get_page.cmx b/bin/ledger/tests/benchmark/get_page/get_page.cmx
deleted file mode 100644
index ca0d744..0000000
--- a/bin/ledger/tests/benchmark/get_page/get_page.cmx
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "program": {
-        "binary": "bin/ledger_benchmark_get_page"
-    },
-    "sandbox": {
-        "features": [
-            "persistent-storage"
-        ],
-        "services": [
-            "fuchsia.tracelink.Registry",
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/benchmark/get_page/get_page_id.tspec b/bin/ledger/tests/benchmark/get_page/get_page_id.tspec
deleted file mode 100644
index 888a540..0000000
--- a/bin/ledger/tests/benchmark/get_page/get_page_id.tspec
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.get_page",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/get_page.cmx",
-  "args": ["--requests-count=50"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 120,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "page_id/get_page_id",
-      "event_name": "get page id",
-      "event_category": "benchmark",
-      "expected_sample_count": 50,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/get_page/get_same_page.tspec b/bin/ledger/tests/benchmark/get_page/get_same_page.tspec
deleted file mode 100644
index 102edac..0000000
--- a/bin/ledger/tests/benchmark/get_page/get_same_page.tspec
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.get_page",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/get_page.cmx",
-  "args": ["--requests-count=500", "--reuse"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 120,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "same_page/get_page",
-      "event_name": "get page",
-      "event_category": "benchmark",
-      "expected_sample_count": 500,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/put/BUILD.gn b/bin/ledger/tests/benchmark/put/BUILD.gn
deleted file mode 100644
index b962bff..0000000
--- a/bin/ledger/tests/benchmark/put/BUILD.gn
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("put") {
-  testonly = true
-
-  public_deps = [
-    ":ledger_benchmark_put",
-  ]
-}
-
-executable("ledger_benchmark_put") {
-  testonly = true
-
-  deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/testing:get_ledger",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/convert",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fit",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  sources = [
-    "put.cc",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/benchmark/put/put.cc b/bin/ledger/tests/benchmark/put/put.cc
deleted file mode 100644
index a9b1fd5..0000000
--- a/bin/ledger/tests/benchmark/put/put.cc
+++ /dev/null
@@ -1,469 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-#include <memory>
-#include <set>
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/zx/time.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/testing/data_generator.h"
-#include "peridot/bin/ledger/testing/get_ledger.h"
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-#include "peridot/bin/ledger/testing/page_data_generator.h"
-#include "peridot/bin/ledger/testing/quit_on_error.h"
-#include "peridot/bin/ledger/testing/run_with_tracing.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace ledger {
-namespace {
-
-// Benchmark that measures performance of the Put() operation.
-//
-// Parameters:
-//   --entry-count=<int> the number of entries to be put
-//   --transaction-size=<int> the size of a single transaction in number of put
-//     operations. If equal to 0, no explicit transactions will be made.
-//   --key-size=<int> the size of a single key in bytes
-//   --value-size=<int> the size of a single value in bytes
-//   --refs=(on|off) the reference strategy: on if every value is inserted
-//     as a reference, off if every value is inserted as a FIDL array.
-//   --update whether operations will update existing entries (put with existing
-//     keys and new values)
-//   --seed=<int> (optional) the seed for key and value generation
-class PutBenchmark : public PageWatcher {
- public:
-  PutBenchmark(async::Loop* loop,
-               std::unique_ptr<component::StartupContext> startup_context,
-               int entry_count, int transaction_size, int key_size,
-               int value_size, bool update,
-               PageDataGenerator::ReferenceStrategy reference_strategy,
-               uint64_t seed);
-
-  void Run();
-
-  // PageWatcher:
-  void OnChange(PageChange page_change, ResultState result_state,
-                OnChangeCallback callback) override;
-
- private:
-  // Initilizes the keys to be used in the benchmark. In case the benchmark is
-  // on updating entries, it also adds these keys in the ledger with some
-  // initial values.
-  void InitializeKeys(
-      fit::function<void(std::vector<std::vector<uint8_t>>)> on_done);
-
-  void BindWatcher(std::vector<std::vector<uint8_t>> keys);
-  void RunSingle(int i, std::vector<std::vector<uint8_t>> keys);
-  void CommitAndRunNext(int i, size_t key_number,
-                        std::vector<std::vector<uint8_t>> keys);
-  void PutEntry(std::vector<uint8_t> key, std::vector<uint8_t> value,
-                fit::function<void()> on_done);
-
-  void ShutDown();
-  fit::closure QuitLoopClosure();
-
-  async::Loop* const loop_;
-  rng::TestRandom random_;
-  DataGenerator generator_;
-  PageDataGenerator page_data_generator_;
-
-  files::ScopedTempDir tmp_dir_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  const int entry_count_;
-  const int transaction_size_;
-  const int key_size_;
-  const int value_size_;
-  const bool update_;
-
-  fidl::Binding<PageWatcher> page_watcher_binding_;
-  const PageDataGenerator::ReferenceStrategy reference_strategy_;
-
-  fuchsia::sys::ComponentControllerPtr component_controller_;
-  LedgerPtr ledger_;
-  PagePtr page_;
-  // Keys that we use to identify a change event. For transaction_size = 1 it
-  // contains all the keys, otherwise only the last changed key for each
-  // transaction.
-  std::set<size_t> keys_to_receive_;
-  // Whether all Put operations have terminated. Shut down should be blocked
-  // until this is set to true.
-  bool insertions_finished_ = false;
-  // Whether all expected watch notifications have been received. Shut down
-  // should be blocked until this is set to true.
-  bool all_watcher_notifications_received_ = false;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PutBenchmark);
-};
-
-}  // namespace
-}  // namespace ledger
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kStoragePath = "/data/benchmark/ledger/put";
-
-PutBenchmark::PutBenchmark(
-    async::Loop* loop,
-    std::unique_ptr<component::StartupContext> startup_context, int entry_count,
-    int transaction_size, int key_size, int value_size, bool update,
-    PageDataGenerator::ReferenceStrategy reference_strategy, uint64_t seed)
-    : loop_(loop),
-      random_(seed),
-      generator_(&random_),
-      page_data_generator_(&random_),
-      tmp_dir_(kStoragePath),
-      startup_context_(std::move(startup_context)),
-      entry_count_(entry_count),
-      transaction_size_(transaction_size),
-      key_size_(key_size),
-      value_size_(value_size),
-      update_(update),
-      page_watcher_binding_(this),
-      reference_strategy_(reference_strategy) {
-  FXL_DCHECK(loop_);
-  FXL_DCHECK(entry_count > 0);
-  FXL_DCHECK(transaction_size >= 0);
-  FXL_DCHECK(key_size > 0);
-  FXL_DCHECK(value_size > 0);
-}
-
-void PutBenchmark::Run() {
-  FXL_LOG(INFO) << "--entry-count=" << entry_count_
-                << " --transaction-size=" << transaction_size_
-                << " --key-size=" << key_size_
-                << " --value-size=" << value_size_ << " --refs="
-                << (reference_strategy_ ==
-                            PageDataGenerator::ReferenceStrategy::INLINE
-                        ? "off"
-                        : "on")
-                << (update_ ? " --update" : "");
-  Status status = GetLedger(
-      startup_context_.get(), component_controller_.NewRequest(), nullptr, "",
-      "put", DetachedPath(tmp_dir_.path()), QuitLoopClosure(), &ledger_);
-  if (QuitOnError(QuitLoopClosure(), status, "GetLedger")) {
-    return;
-  }
-
-  GetPageEnsureInitialized(
-      &ledger_, nullptr, DelayCallback::YES, QuitLoopClosure(),
-      [this](Status status, PagePtr page, PageId id) mutable {
-        if (QuitOnError(QuitLoopClosure(), status,
-                        "GetPageEnsureInitialized")) {
-          return;
-        }
-        page_ = std::move(page);
-
-        InitializeKeys([this](std::vector<std::vector<uint8_t>> keys) mutable {
-          if (transaction_size_ > 0) {
-            page_->StartTransaction(
-                [this, keys = std::move(keys)](Status status) mutable {
-                  if (QuitOnError(QuitLoopClosure(), status,
-                                  "Page::StartTransaction")) {
-                    return;
-                  }
-                  TRACE_ASYNC_BEGIN("benchmark", "transaction", 0);
-                  BindWatcher(std::move(keys));
-                });
-          } else {
-            BindWatcher(std::move(keys));
-          }
-        });
-      });
-}
-
-void PutBenchmark::OnChange(PageChange page_change,
-                            ResultState /*result_state*/,
-                            OnChangeCallback callback) {
-  for (auto const& change : page_change.changed_entries) {
-    size_t key_number = generator_.GetKeyId(change.key);
-    if (keys_to_receive_.find(key_number) != keys_to_receive_.end()) {
-      TRACE_ASYNC_END("benchmark", "local_change_notification", key_number);
-      keys_to_receive_.erase(key_number);
-    }
-  }
-  if (keys_to_receive_.empty()) {
-    all_watcher_notifications_received_ = true;
-    // All watcher notifications have been received, waiting for put operations
-    // to finish before shutting down.
-    if (insertions_finished_) {
-      ShutDown();
-    }
-  }
-  callback(nullptr);
-}
-
-void PutBenchmark::InitializeKeys(
-    fit::function<void(std::vector<std::vector<uint8_t>>)> on_done) {
-  std::vector<std::vector<uint8_t>> keys =
-      generator_.MakeKeys(entry_count_, key_size_, entry_count_);
-  std::vector<std::vector<uint8_t>> keys_cloned;
-  for (int i = 0; i < entry_count_; ++i) {
-    keys_cloned.push_back(keys[i]);
-    if (transaction_size_ == 0 ||
-        i % transaction_size_ == transaction_size_ - 1) {
-      keys_to_receive_.insert(generator_.GetKeyId(keys[i]));
-    }
-  }
-  // Last key should always be recorded so the last transaction is not lost.
-  size_t last_key_number = generator_.GetKeyId(keys.back());
-  keys_to_receive_.insert(last_key_number);
-  if (!update_) {
-    on_done(std::move(keys));
-    return;
-  }
-  page_data_generator_.Populate(
-      &page_, std::move(keys_cloned), value_size_, keys_cloned.size(),
-      reference_strategy_, Priority::EAGER,
-      [this, keys = std::move(keys),
-       on_done = std::move(on_done)](Status status) mutable {
-        if (QuitOnError(QuitLoopClosure(), status,
-                        "PageDataGenerator::Populate")) {
-          return;
-        }
-        on_done(std::move(keys));
-      });
-}
-
-void PutBenchmark::BindWatcher(std::vector<std::vector<uint8_t>> keys) {
-  PageSnapshotPtr snapshot;
-  page_->GetSnapshot(
-      snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-      page_watcher_binding_.NewBinding(),
-      [this, keys = std::move(keys)](Status status) mutable {
-        if (QuitOnError(QuitLoopClosure(), status, "GetSnapshot")) {
-          return;
-        }
-        RunSingle(0, std::move(keys));
-      });
-}
-
-void PutBenchmark::RunSingle(int i, std::vector<std::vector<uint8_t>> keys) {
-  if (i == entry_count_) {
-    insertions_finished_ = true;
-    // All sent, waiting for watcher notifications before shutting down.
-    if (all_watcher_notifications_received_) {
-      ShutDown();
-    }
-    return;
-  }
-
-  fidl::VectorPtr<uint8_t> value = generator_.MakeValue(value_size_);
-  size_t key_number = generator_.GetKeyId(keys[i]);
-  if (transaction_size_ == 0) {
-    TRACE_ASYNC_BEGIN("benchmark", "local_change_notification", key_number);
-  }
-  PutEntry(std::move(keys[i]), std::move(value),
-           [this, i, key_number, keys = std::move(keys)]() mutable {
-             if (transaction_size_ > 0 &&
-                 (i % transaction_size_ == transaction_size_ - 1 ||
-                  i + 1 == entry_count_)) {
-               CommitAndRunNext(i, key_number, std::move(keys));
-             } else {
-               RunSingle(i + 1, std::move(keys));
-             }
-           });
-}
-
-void PutBenchmark::PutEntry(std::vector<uint8_t> key,
-                            std::vector<uint8_t> value,
-                            fit::function<void()> on_done) {
-  auto trace_event_id = TRACE_NONCE();
-  TRACE_ASYNC_BEGIN("benchmark", "put", trace_event_id);
-  if (reference_strategy_ == PageDataGenerator::ReferenceStrategy::INLINE) {
-    page_->Put(
-        std::move(key), std::move(value),
-        [this, trace_event_id, on_done = std::move(on_done)](Status status) {
-          if (QuitOnError(QuitLoopClosure(), status, "Page::Put")) {
-            return;
-          }
-          TRACE_ASYNC_END("benchmark", "put", trace_event_id);
-          on_done();
-        });
-    return;
-  }
-  fsl::SizedVmo vmo;
-  FXL_CHECK(fsl::VmoFromString(convert::ToStringView(value), &vmo));
-  TRACE_ASYNC_BEGIN("benchmark", "create_reference", trace_event_id);
-  page_->CreateReferenceFromBuffer(
-      std::move(vmo).ToTransport(),
-      [this, trace_event_id, key = std::move(key),
-       on_done = std::move(on_done)](Status status,
-                                     ReferencePtr reference) mutable {
-        if (QuitOnError(QuitLoopClosure(), status,
-                        "Page::CreateReferenceFromBuffer")) {
-          return;
-        }
-        TRACE_ASYNC_END("benchmark", "create_reference", trace_event_id);
-        TRACE_ASYNC_BEGIN("benchmark", "put_reference", trace_event_id);
-        page_->PutReference(
-            std::move(key), std::move(*reference), Priority::EAGER,
-            [this, trace_event_id,
-             on_done = std::move(on_done)](Status status) {
-              if (QuitOnError(QuitLoopClosure(), status,
-                              "Page::PutReference")) {
-                return;
-              }
-              TRACE_ASYNC_END("benchmark", "put_reference", trace_event_id);
-              TRACE_ASYNC_END("benchmark", "put", trace_event_id);
-              on_done();
-            });
-      });
-}
-
-void PutBenchmark::CommitAndRunNext(int i, size_t key_number,
-                                    std::vector<std::vector<uint8_t>> keys) {
-  TRACE_ASYNC_BEGIN("benchmark", "local_change_notification", key_number);
-  TRACE_ASYNC_BEGIN("benchmark", "commit", i / transaction_size_);
-  page_->Commit([this, i, keys = std::move(keys)](Status status) mutable {
-    if (QuitOnError(QuitLoopClosure(), status, "Page::Commit")) {
-      return;
-    }
-    TRACE_ASYNC_END("benchmark", "commit", i / transaction_size_);
-    TRACE_ASYNC_END("benchmark", "transaction", i / transaction_size_);
-
-    if (i == entry_count_ - 1) {
-      RunSingle(i + 1, std::move(keys));
-      return;
-    }
-    page_->StartTransaction([this, i = i + 1,
-                             keys = std::move(keys)](Status status) mutable {
-      if (QuitOnError(QuitLoopClosure(), status, "Page::StartTransaction")) {
-        return;
-      }
-      TRACE_ASYNC_BEGIN("benchmark", "transaction", i / transaction_size_);
-      RunSingle(i, std::move(keys));
-    });
-  });
-}
-
-void PutBenchmark::ShutDown() {
-  // Shut down the Ledger process first as it relies on |tmp_dir_| storage.
-  KillLedgerProcess(&component_controller_);
-  loop_->Quit();
-}
-
-fit::closure PutBenchmark::QuitLoopClosure() {
-  return [this] { loop_->Quit(); };
-}
-
-}  // namespace
-}  // namespace ledger
-
-namespace ledger {
-namespace {
-constexpr fxl::StringView kBinaryPath =
-    "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/put.cmx";
-constexpr fxl::StringView kEntryCountFlag = "entry-count";
-constexpr fxl::StringView kTransactionSizeFlag = "transaction-size";
-constexpr fxl::StringView kKeySizeFlag = "key-size";
-constexpr fxl::StringView kValueSizeFlag = "value-size";
-constexpr fxl::StringView kRefsFlag = "refs";
-constexpr fxl::StringView kUpdateFlag = "update";
-constexpr fxl::StringView kSeedFlag = "seed";
-
-constexpr fxl::StringView kRefsOnFlag = "on";
-constexpr fxl::StringView kRefsOffFlag = "off";
-
-void PrintUsage() {
-  std::cout << "Usage: trace record "
-            << kBinaryPath
-            // Comment to make clang format not break formatting.
-            << " --" << kEntryCountFlag << "=<int>"
-            << " --" << kTransactionSizeFlag << "=<int>"
-            << " --" << kKeySizeFlag << "=<int>"
-            << " --" << kValueSizeFlag << "=<int>"
-            << " --" << kRefsFlag << "=(" << kRefsOnFlag << "|" << kRefsOffFlag
-            << ")"
-            << " [--" << kSeedFlag << "=<int>]"
-            << " [--" << kUpdateFlag << "]" << std::endl;
-}
-
-bool GetPositiveIntValue(const fxl::CommandLine& command_line,
-                         fxl::StringView flag, int* value) {
-  std::string value_str;
-  int found_value;
-  if (!command_line.GetOptionValue(flag.ToString(), &value_str) ||
-      !fxl::StringToNumberWithError(value_str, &found_value) ||
-      found_value <= 0) {
-    return false;
-  }
-  *value = found_value;
-  return true;
-}
-
-int Main(int argc, const char** argv) {
-  fxl::CommandLine command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto startup_context = component::StartupContext::CreateFromStartupInfo();
-
-  int entry_count;
-  std::string transaction_size_str;
-  int transaction_size;
-  int key_size;
-  int value_size;
-  bool update = command_line.HasOption(kUpdateFlag.ToString());
-  if (!GetPositiveIntValue(command_line, kEntryCountFlag, &entry_count) ||
-      !command_line.GetOptionValue(kTransactionSizeFlag.ToString(),
-                                   &transaction_size_str) ||
-      !fxl::StringToNumberWithError(transaction_size_str, &transaction_size) ||
-      transaction_size < 0 ||
-      !GetPositiveIntValue(command_line, kKeySizeFlag, &key_size) ||
-      !GetPositiveIntValue(command_line, kValueSizeFlag, &value_size)) {
-    PrintUsage();
-    return -1;
-  }
-
-  std::string ref_strategy_str;
-  if (!command_line.GetOptionValue(kRefsFlag.ToString(), &ref_strategy_str)) {
-    PrintUsage();
-    return -1;
-  }
-  PageDataGenerator::ReferenceStrategy ref_strategy;
-  if (ref_strategy_str == kRefsOnFlag) {
-    ref_strategy = PageDataGenerator::ReferenceStrategy::REFERENCE;
-  } else if (ref_strategy_str == kRefsOffFlag) {
-    ref_strategy = PageDataGenerator::ReferenceStrategy::INLINE;
-  } else {
-    std::cerr << "Unknown option " << ref_strategy_str << " for "
-              << kRefsFlag.ToString() << std::endl;
-    PrintUsage();
-    return -1;
-  }
-
-  int seed;
-  std::string seed_str;
-  if (command_line.GetOptionValue(kSeedFlag.ToString(), &seed_str)) {
-    if (!fxl::StringToNumberWithError(seed_str, &seed)) {
-      PrintUsage();
-      return -1;
-    }
-  } else {
-    seed = 0;
-  }
-
-  PutBenchmark app(&loop, std::move(startup_context), entry_count,
-                   transaction_size, key_size, value_size, update, ref_strategy,
-                   seed);
-
-  return RunWithTracing(&loop, [&app] { app.Run(); });
-}
-
-}  // namespace
-}  // namespace ledger
-
-int main(int argc, const char** argv) { return ledger::Main(argc, argv); }
diff --git a/bin/ledger/tests/benchmark/put/put.cmx b/bin/ledger/tests/benchmark/put/put.cmx
deleted file mode 100644
index ef59202..0000000
--- a/bin/ledger/tests/benchmark/put/put.cmx
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "program": {
-        "binary": "bin/ledger_benchmark_put"
-    },
-    "sandbox": {
-        "features": [
-            "persistent-storage"
-        ],
-        "services": [
-            "fuchsia.tracelink.Registry",
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/benchmark/put/put.tspec b/bin/ledger/tests/benchmark/put/put.tspec
deleted file mode 100644
index 64f3495..0000000
--- a/bin/ledger/tests/benchmark/put/put.tspec
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.put_entry",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/put.cmx",
-  "args": [
-    "--entry-count=100", "--transaction-size=0", "--key-size=100",
-    "--value-size=1000", "--refs=off"
-  ],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "small_value/put",
-      "event_name": "put",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "output_test_name": "small_value/local_change_notification",
-      "event_name": "local_change_notification",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/put/put_as_reference.tspec b/bin/ledger/tests/benchmark/put/put_as_reference.tspec
deleted file mode 100644
index c63fc74..0000000
--- a/bin/ledger/tests/benchmark/put/put_as_reference.tspec
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.put_entry",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/put.cmx",
-  "args": [
-    "--entry-count=100", "--transaction-size=0", "--key-size=100",
-    "--value-size=1000", "--refs=on"
-  ],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "reference/put",
-      "event_name": "put",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "output_test_name": "reference/create_reference",
-      "event_name": "create_reference",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "output_test_name": "reference/put_reference",
-      "event_name": "put_reference",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "output_test_name": "reference/local_change_notification",
-      "event_name": "local_change_notification",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/put/put_big_entry.tspec b/bin/ledger/tests/benchmark/put/put_big_entry.tspec
deleted file mode 100644
index f9048b6..0000000
--- a/bin/ledger/tests/benchmark/put/put_big_entry.tspec
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.put_entry",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/put.cmx",
-  "args": [
-    "--entry-count=100", "--transaction-size=0", "--key-size=100",
-    "--value-size=20000", "--refs=off"
-  ],
-  "categories": ["benchmark", "ledger"],
-  "duration": 180,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "big_value/put",
-      "event_name": "put",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "output_test_name": "big_value/local_change_notification",
-      "event_name": "local_change_notification",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/put/transaction.tspec b/bin/ledger/tests/benchmark/put/transaction.tspec
deleted file mode 100644
index 4588c3a..0000000
--- a/bin/ledger/tests/benchmark/put/transaction.tspec
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.put_entry",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/put.cmx",
-  "args": [
-    "--entry-count=100", "--transaction-size=10", "--key-size=100",
-    "--value-size=1000", "--refs=off"
-  ],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "transaction/transaction",
-      "event_name": "transaction",
-      "event_category": "benchmark",
-      "expected_sample_count": 10,
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "output_test_name": "transaction/commit",
-      "event_name": "commit",
-      "event_category": "benchmark",
-      "expected_sample_count": 10,
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "output_test_name": "transaction/put",
-      "event_name": "put",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    },
-    {
-      "type": "duration",
-      "output_test_name": "transaction/local_change_notification",
-      "event_name": "local_change_notification",
-      "event_category": "benchmark",
-      "expected_sample_count": 10,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/sync/BUILD.gn b/bin/ledger/tests/benchmark/sync/BUILD.gn
deleted file mode 100644
index f1cc292..0000000
--- a/bin/ledger/tests/benchmark/sync/BUILD.gn
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("sync") {
-  testonly = true
-
-  public_deps = [
-    ":ledger_benchmark_sync",
-  ]
-}
-
-executable("ledger_benchmark_sync") {
-  testonly = true
-
-  deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/cloud_provider_firestore/testing",
-    "//peridot/bin/ledger/testing:get_ledger",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/convert",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fit",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  sources = [
-    "sync.cc",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/benchmark/sync/sync.cc b/bin/ledger/tests/benchmark/sync/sync.cc
deleted file mode 100644
index d0cc4df..0000000
--- a/bin/ledger/tests/benchmark/sync/sync.cc
+++ /dev/null
@@ -1,316 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-#include <memory>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/zx/time.h>
-#include <trace/event.h>
-
-#include "peridot/bin/cloud_provider_firestore/testing/cloud_provider_factory.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/testing/data_generator.h"
-#include "peridot/bin/ledger/testing/get_ledger.h"
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-#include "peridot/bin/ledger/testing/page_data_generator.h"
-#include "peridot/bin/ledger/testing/quit_on_error.h"
-#include "peridot/bin/ledger/testing/run_with_tracing.h"
-#include "peridot/bin/ledger/testing/sync_params.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kBinaryPath =
-    "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/sync.cmx";
-constexpr fxl::StringView kStoragePath = "/data/benchmark/ledger/sync";
-constexpr fxl::StringView kChangeCountFlag = "change-count";
-constexpr fxl::StringView kValueSizeFlag = "value-size";
-constexpr fxl::StringView kEntriesPerChangeFlag = "entries-per-change";
-constexpr fxl::StringView kRefsFlag = "refs";
-
-constexpr fxl::StringView kRefsOnFlag = "on";
-constexpr fxl::StringView kRefsOffFlag = "off";
-
-constexpr size_t kKeySize = 100;
-
-void PrintUsage() {
-  std::cout << "Usage: trace record "
-            << kBinaryPath
-            // Comment to make clang format not break formatting.
-            << " --" << kChangeCountFlag << "=<int>"
-            << " --" << kValueSizeFlag << "=<int>"
-            << " --" << kEntriesPerChangeFlag << "=<int>"
-            << " --" << kRefsFlag << "=(" << kRefsOnFlag << "|" << kRefsOffFlag
-            << ")" << GetSyncParamsUsage() << std::endl;
-}
-
-// Benchmark that measures sync latency between two Ledger instances syncing
-// through the cloud. This emulates syncing between devices, as the Ledger
-// instances have separate disk storage.
-//
-// Cloud sync needs to be configured on the device in order for the benchmark to
-// run.
-//
-// Parameters:
-//   --change-count=<int> the number of changes to be made to the page (each
-//   change is done as transaction and can include several put operations).
-//   --value-size=<int> the size of a single value in bytes
-//   --entries-per-change=<int> number of entries added in the transaction
-//   --refs=(on|off) reference strategy: on to put values as references, off to
-//     put them as FIDL arrays.
-//   --credentials-path=<file path> Firestore service account credentials
-class SyncBenchmark : public PageWatcher {
- public:
-  SyncBenchmark(async::Loop* loop,
-                std::unique_ptr<component::StartupContext> startup_context,
-                size_t change_count, size_t value_size,
-                size_t entries_per_change,
-                PageDataGenerator::ReferenceStrategy reference_strategy,
-                SyncParams sync_params);
-
-  void Run();
-
-  // PageWatcher:
-  void OnChange(PageChange page_change, ResultState result_state,
-                OnChangeCallback callback) override;
-
- private:
-  void RunSingleChange(size_t change_number);
-
-  void ShutDown();
-  fit::closure QuitLoopClosure();
-
-  async::Loop* const loop_;
-  rng::TestRandom random_;
-  DataGenerator generator_;
-  PageDataGenerator page_data_generator_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  cloud_provider_firestore::CloudProviderFactory cloud_provider_factory_;
-  const size_t change_count_;
-  const size_t value_size_;
-  const size_t entries_per_change_;
-  const PageDataGenerator::ReferenceStrategy reference_strategy_;
-  const cloud_provider_firestore::CloudProviderFactory::UserId user_id_;
-  fidl::Binding<PageWatcher> page_watcher_binding_;
-  files::ScopedTempDir alpha_tmp_dir_;
-  files::ScopedTempDir beta_tmp_dir_;
-  fuchsia::sys::ComponentControllerPtr alpha_controller_;
-  fuchsia::sys::ComponentControllerPtr beta_controller_;
-  LedgerPtr alpha_;
-  LedgerPtr beta_;
-  PageId page_id_;
-  PagePtr alpha_page_;
-  PagePtr beta_page_;
-
-  size_t changed_entries_received_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SyncBenchmark);
-};
-
-SyncBenchmark::SyncBenchmark(
-    async::Loop* loop,
-    std::unique_ptr<component::StartupContext> startup_context,
-    size_t change_count, size_t value_size, size_t entries_per_change,
-    PageDataGenerator::ReferenceStrategy reference_strategy,
-    SyncParams sync_params)
-    : loop_(loop),
-      random_(0),
-      generator_(&random_),
-      page_data_generator_(&random_),
-      startup_context_(std::move(startup_context)),
-      cloud_provider_factory_(startup_context_.get(), &random_,
-                              std::move(sync_params.api_key),
-                              std::move(sync_params.credentials)),
-      change_count_(change_count),
-      value_size_(value_size),
-      entries_per_change_(entries_per_change),
-      reference_strategy_(reference_strategy),
-      user_id_(cloud_provider_firestore::CloudProviderFactory::UserId::New()),
-      page_watcher_binding_(this),
-      alpha_tmp_dir_(kStoragePath),
-      beta_tmp_dir_(kStoragePath) {
-  FXL_DCHECK(loop_);
-  FXL_DCHECK(change_count_ > 0);
-  FXL_DCHECK(value_size_ > 0);
-  FXL_DCHECK(entries_per_change_ > 0);
-  cloud_provider_factory_.Init();
-}
-
-void SyncBenchmark::Run() {
-  // Name of the storage directory currently identifies the user. Ensure the
-  // most nested directory has the same name to make the ledgers sync.
-  std::string alpha_path = alpha_tmp_dir_.path() + "/sync_user";
-  bool ret = files::CreateDirectory(alpha_path);
-  FXL_DCHECK(ret);
-
-  std::string beta_path = beta_tmp_dir_.path() + "/sync_user";
-  ret = files::CreateDirectory(beta_path);
-  FXL_DCHECK(ret);
-
-  cloud_provider::CloudProviderPtr cloud_provider_alpha;
-  cloud_provider_factory_.MakeCloudProvider(user_id_,
-                                            cloud_provider_alpha.NewRequest());
-  Status status = GetLedger(
-      startup_context_.get(), alpha_controller_.NewRequest(),
-      std::move(cloud_provider_alpha), user_id_.user_id(), "sync",
-      DetachedPath(std::move(alpha_path)), QuitLoopClosure(), &alpha_);
-  if (QuitOnError(QuitLoopClosure(), status, "alpha ledger")) {
-    return;
-  };
-
-  cloud_provider::CloudProviderPtr cloud_provider_beta;
-  cloud_provider_factory_.MakeCloudProvider(user_id_,
-                                            cloud_provider_beta.NewRequest());
-
-  status = GetLedger(startup_context_.get(), beta_controller_.NewRequest(),
-                     std::move(cloud_provider_beta), user_id_.user_id(), "sync",
-                     DetachedPath(beta_path), QuitLoopClosure(), &beta_);
-  if (QuitOnError(QuitLoopClosure(), status, "beta ledger")) {
-    return;
-  }
-  GetPageEnsureInitialized(
-      &alpha_, nullptr, DelayCallback::YES, QuitLoopClosure(),
-      [this](Status status, PagePtr page, PageId id) {
-        if (QuitOnError(QuitLoopClosure(), status,
-                        "alpha page initialization")) {
-          return;
-        }
-        alpha_page_ = std::move(page);
-        page_id_ = id;
-        beta_->GetPage(fidl::MakeOptional(id), beta_page_.NewRequest(),
-                       QuitOnErrorCallback(QuitLoopClosure(), "GetPage"));
-
-        PageSnapshotPtr snapshot;
-        beta_page_->GetSnapshot(
-            snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-            page_watcher_binding_.NewBinding(), [this](Status status) {
-              if (QuitOnError(QuitLoopClosure(), status, "GetSnapshot")) {
-                return;
-              }
-              RunSingleChange(0);
-            });
-      });
-}
-
-void SyncBenchmark::OnChange(PageChange page_change, ResultState result_state,
-                             OnChangeCallback callback) {
-  FXL_DCHECK(!page_change.changed_entries.empty());
-  size_t i = generator_.GetKeyId(page_change.changed_entries.at(0).key);
-  changed_entries_received_ += page_change.changed_entries.size();
-  if (result_state == ResultState::COMPLETED ||
-      result_state == ResultState::PARTIAL_STARTED) {
-    TRACE_ASYNC_END("benchmark", "sync latency", i);
-  }
-  if (result_state == ResultState::COMPLETED ||
-      result_state == ResultState::PARTIAL_COMPLETED) {
-    FXL_DCHECK(changed_entries_received_ == entries_per_change_);
-    RunSingleChange(i + 1);
-  }
-  callback(nullptr);
-}
-
-void SyncBenchmark::RunSingleChange(size_t change_number) {
-  if (change_number == change_count_) {
-    ShutDown();
-    return;
-  }
-
-  std::vector<std::vector<uint8_t>> keys(entries_per_change_);
-  for (size_t i = 0; i < entries_per_change_; i++) {
-    // Keys are distinct, but they all have the same id (|change_number|), which
-    // will be used to end the trace.
-    keys[i] = generator_.MakeKey(change_number, kKeySize);
-  }
-
-  changed_entries_received_ = 0;
-  TRACE_ASYNC_BEGIN("benchmark", "sync latency", change_number);
-  page_data_generator_.Populate(
-      &alpha_page_, std::move(keys), value_size_, entries_per_change_,
-      reference_strategy_, Priority::EAGER, [this](Status status) {
-        if (QuitOnError(QuitLoopClosure(), status,
-                        "PageDataGenerator::Populate")) {
-          return;
-        }
-      });
-}
-
-void SyncBenchmark::ShutDown() {
-  KillLedgerProcess(&alpha_controller_);
-  KillLedgerProcess(&beta_controller_);
-  loop_->Quit();
-}
-
-fit::closure SyncBenchmark::QuitLoopClosure() {
-  return [this] { loop_->Quit(); };
-}
-
-int Main(int argc, const char** argv) {
-  fxl::CommandLine command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto startup_context = component::StartupContext::CreateFromStartupInfo();
-
-  std::string change_count_str;
-  size_t change_count;
-  std::string value_size_str;
-  size_t value_size;
-  std::string entries_per_change_str;
-  size_t entries_per_change;
-  std::string reference_strategy_str;
-  SyncParams sync_params;
-  if (!command_line.GetOptionValue(kChangeCountFlag.ToString(),
-                                   &change_count_str) ||
-      !fxl::StringToNumberWithError(change_count_str, &change_count) ||
-      change_count <= 0 ||
-      !command_line.GetOptionValue(kValueSizeFlag.ToString(),
-                                   &value_size_str) ||
-      !fxl::StringToNumberWithError(value_size_str, &value_size) ||
-      value_size <= 0 ||
-      !command_line.GetOptionValue(kEntriesPerChangeFlag.ToString(),
-                                   &entries_per_change_str) ||
-      !fxl::StringToNumberWithError(entries_per_change_str,
-                                    &entries_per_change) ||
-      !command_line.GetOptionValue(kRefsFlag.ToString(),
-                                   &reference_strategy_str) ||
-      !ParseSyncParamsFromCommandLine(command_line, startup_context.get(),
-                                      &sync_params)) {
-    PrintUsage();
-    return -1;
-  }
-
-  PageDataGenerator::ReferenceStrategy reference_strategy;
-  if (reference_strategy_str == kRefsOnFlag) {
-    reference_strategy = PageDataGenerator::ReferenceStrategy::REFERENCE;
-  } else if (reference_strategy_str == kRefsOffFlag) {
-    reference_strategy = PageDataGenerator::ReferenceStrategy::INLINE;
-  } else {
-    std::cerr << "Unknown option " << reference_strategy_str << " for "
-              << kRefsFlag.ToString() << std::endl;
-    PrintUsage();
-    return -1;
-  }
-
-  SyncBenchmark app(&loop, std::move(startup_context), change_count, value_size,
-                    entries_per_change, reference_strategy,
-                    std::move(sync_params));
-  return RunWithTracing(&loop, [&app] { app.Run(); });
-}
-
-}  // namespace
-}  // namespace ledger
-
-int main(int argc, const char** argv) { return ledger::Main(argc, argv); }
diff --git a/bin/ledger/tests/benchmark/sync/sync.cmx b/bin/ledger/tests/benchmark/sync/sync.cmx
deleted file mode 100644
index eea9b39..0000000
--- a/bin/ledger/tests/benchmark/sync/sync.cmx
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "program": {
-        "binary": "bin/ledger_benchmark_sync"
-    },
-    "sandbox": {
-        "features": [
-            "persistent-storage"
-        ],
-        "services": [
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/benchmark/sync/sync.tspec b/bin/ledger/tests/benchmark/sync/sync.tspec
deleted file mode 100644
index b3b731a..0000000
--- a/bin/ledger/tests/benchmark/sync/sync.tspec
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/sync.cmx",
-  "args": ["--change-count=10", "--entries-per-change=1", "--value-size=100",
-           "--refs=off"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 120,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "sync latency",
-      "event_category": "benchmark",
-      "expected_sample_count": 10,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/sync/sync_big_change.tspec b/bin/ledger/tests/benchmark/sync/sync_big_change.tspec
deleted file mode 100644
index 6f14baf..0000000
--- a/bin/ledger/tests/benchmark/sync/sync_big_change.tspec
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/sync.cmx",
-  "args": ["--change-count=10", "--entries-per-change=100", "--value-size=100",
-           "--refs=off"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 240,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "sync latency",
-      "event_category": "benchmark",
-      "expected_sample_count": 10
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/update_entry/BUILD.gn b/bin/ledger/tests/benchmark/update_entry/BUILD.gn
deleted file mode 100644
index 2f501d7..0000000
--- a/bin/ledger/tests/benchmark/update_entry/BUILD.gn
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-group("update_entry") {
-  testonly = true
-
-  public_deps = [
-    ":ledger_benchmark_update_entry",
-  ]
-}
-
-executable("ledger_benchmark_update_entry") {
-  testonly = true
-
-  deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/testing:get_ledger",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/convert",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fit",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  sources = [
-    "update_entry.cc",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/benchmark/update_entry/update_big_entry.tspec b/bin/ledger/tests/benchmark/update_entry/update_big_entry.tspec
deleted file mode 100644
index 0fe0524..0000000
--- a/bin/ledger/tests/benchmark/update_entry/update_big_entry.tspec
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.update_entry",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/update_entry.cmx",
-  "args": ["--entry-count=100", "--transaction-size=0", "--value-size=20000"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 180,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "big_value/put",
-      "event_name": "put",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/update_entry/update_entry.cc b/bin/ledger/tests/benchmark/update_entry/update_entry.cc
deleted file mode 100644
index b076080..0000000
--- a/bin/ledger/tests/benchmark/update_entry/update_entry.cc
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-#include <memory>
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/zx/time.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/testing/data_generator.h"
-#include "peridot/bin/ledger/testing/get_ledger.h"
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-#include "peridot/bin/ledger/testing/quit_on_error.h"
-#include "peridot/bin/ledger/testing/run_with_tracing.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/rng/test_random.h"
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kBinaryPath =
-    "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/update_entry.cmx";
-constexpr fxl::StringView kStoragePath = "/data/benchmark/ledger/update_entry";
-constexpr fxl::StringView kEntryCountFlag = "entry-count";
-constexpr fxl::StringView kValueSizeFlag = "value-size";
-constexpr fxl::StringView kTransactionSizeFlag = "transaction-size";
-
-const int kKeySize = 100;
-
-void PrintUsage() {
-  std::cout << "Usage: trace record "
-            << kBinaryPath
-            // Comment to make clang format not break formatting.
-            << " --" << kEntryCountFlag << "=<int>"
-            << " --" << kValueSizeFlag << "=<int>"
-            << " --" << kTransactionSizeFlag << "=<int>" << std::endl;
-}
-
-// Benchmark that measures a performance of Put() operation under the condition
-// that it modifies the same entry.
-//
-// Parameters:
-//   --entry-count=<int> the number of entries to be put
-//   --value-size=<int> the size of the value for each entry
-//   --transaction-size=<int> the size of a single transaction in number of put
-//     operations. If equal to 0, every put operation will be executed
-//     individually (implicit transaction).
-class UpdateEntryBenchmark {
- public:
-  UpdateEntryBenchmark(
-      async::Loop* loop,
-      std::unique_ptr<component::StartupContext> startup_context,
-      int entry_count, int value_size, int transaction_size);
-
-  void Run();
-
- private:
-  void RunSingle(int i, std::vector<uint8_t> key);
-  void CommitAndRunNext(int i, std::vector<uint8_t> key);
-
-  void ShutDown();
-  fit::closure QuitLoopClosure();
-
-  async::Loop* const loop_;
-  rng::TestRandom random_;
-  DataGenerator generator_;
-
-  files::ScopedTempDir tmp_dir_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  const int entry_count_;
-  const int transaction_size_;
-  const int key_size_;
-  const int value_size_;
-
-  fuchsia::sys::ComponentControllerPtr component_controller_;
-  LedgerPtr ledger_;
-  PagePtr page_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(UpdateEntryBenchmark);
-};
-
-UpdateEntryBenchmark::UpdateEntryBenchmark(
-    async::Loop* loop,
-    std::unique_ptr<component::StartupContext> startup_context, int entry_count,
-    int value_size, int transaction_size)
-    : loop_(loop),
-      random_(0),
-      generator_(&random_),
-      tmp_dir_(kStoragePath),
-      startup_context_(std::move(startup_context)),
-      entry_count_(entry_count),
-      transaction_size_(transaction_size),
-      key_size_(kKeySize),
-      value_size_(value_size) {
-  FXL_DCHECK(loop_);
-  FXL_DCHECK(entry_count_ > 0);
-  FXL_DCHECK(value_size_ > 0);
-  FXL_DCHECK(key_size_ > 0);
-  FXL_DCHECK(transaction_size_ >= 0);
-}
-
-void UpdateEntryBenchmark::Run() {
-  FXL_LOG(INFO) << "--entry-count=" << entry_count_
-                << " --transaction-size=" << transaction_size_;
-  Status status =
-      GetLedger(startup_context_.get(), component_controller_.NewRequest(),
-                nullptr, "", "update_entry", DetachedPath(tmp_dir_.path()),
-                QuitLoopClosure(), &ledger_);
-  if (QuitOnError(QuitLoopClosure(), status, "GetLedger")) {
-    return;
-  }
-  GetPageEnsureInitialized(
-      &ledger_, nullptr, DelayCallback::YES, QuitLoopClosure(),
-      [this](Status status, PagePtr page, PageId id) {
-        if (QuitOnError(QuitLoopClosure(), status,
-                        "GetPageEnsureInitialized")) {
-          return;
-        }
-        page_ = std::move(page);
-        std::vector<uint8_t> key = generator_.MakeKey(0, key_size_);
-        if (transaction_size_ > 0) {
-          page_->StartTransaction(
-              [this, key = std::move(key)](Status status) mutable {
-                if (QuitOnError(QuitLoopClosure(), status,
-                                "Page::StartTransaction")) {
-                  return;
-                }
-                TRACE_ASYNC_BEGIN("benchmark", "transaction", 0);
-                RunSingle(0, std::move(key));
-              });
-        } else {
-          RunSingle(0, std::move(key));
-        }
-      });
-}
-
-void UpdateEntryBenchmark::RunSingle(int i, std::vector<uint8_t> key) {
-  if (i == entry_count_) {
-    ShutDown();
-    return;
-  }
-
-  std::vector<uint8_t> value = generator_.MakeValue(value_size_);
-  TRACE_ASYNC_BEGIN("benchmark", "put", i);
-  page_->Put(key, std::move(value),
-             [this, i, key = std::move(key)](Status status) mutable {
-               if (QuitOnError(QuitLoopClosure(), status, "Page::Put")) {
-                 return;
-               }
-               TRACE_ASYNC_END("benchmark", "put", i);
-               if (transaction_size_ > 0 &&
-                   (i % transaction_size_ == transaction_size_ - 1 ||
-                    i + 1 == entry_count_)) {
-                 CommitAndRunNext(i, std::move(key));
-               } else {
-                 RunSingle(i + 1, std::move(key));
-               }
-             });
-}
-
-void UpdateEntryBenchmark::CommitAndRunNext(int i,
-                                            std::vector<uint8_t> key) {
-  TRACE_ASYNC_BEGIN("benchmark", "commit", i / transaction_size_);
-  page_->Commit([this, i, key = std::move(key)](Status status) mutable {
-    if (QuitOnError(QuitLoopClosure(), status, "Page::Commit")) {
-      return;
-    }
-    TRACE_ASYNC_END("benchmark", "commit", i / transaction_size_);
-    TRACE_ASYNC_END("benchmark", "transaction", i / transaction_size_);
-
-    if (i == entry_count_ - 1) {
-      RunSingle(i + 1, std::move(key));
-      return;
-    }
-    page_->StartTransaction([this, i = i + 1,
-                             key = std::move(key)](Status status) mutable {
-      if (QuitOnError(QuitLoopClosure(), status, "Page::StartTransaction")) {
-        return;
-      }
-      TRACE_ASYNC_BEGIN("benchmark", "transaction", i / transaction_size_);
-      RunSingle(i, std::move(key));
-    });
-  });
-}
-
-void UpdateEntryBenchmark::ShutDown() {
-  // Shut down the Ledger process first as it relies on |tmp_dir_| storage.
-  KillLedgerProcess(&component_controller_);
-  loop_->Quit();
-}
-
-fit::closure UpdateEntryBenchmark::QuitLoopClosure() {
-  return [this] { loop_->Quit(); };
-}
-
-int Main(int argc, const char** argv) {
-  fxl::CommandLine command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto startup_context = component::StartupContext::CreateFromStartupInfo();
-
-  std::string entry_count_str;
-  size_t entry_count;
-  std::string value_size_str;
-  int value_size;
-  std::string transaction_size_str;
-  int transaction_size;
-  if (!command_line.GetOptionValue(kEntryCountFlag.ToString(),
-                                   &entry_count_str) ||
-      !fxl::StringToNumberWithError(entry_count_str, &entry_count) ||
-      entry_count <= 0 ||
-      !command_line.GetOptionValue(kValueSizeFlag.ToString(),
-                                   &value_size_str) ||
-      !fxl::StringToNumberWithError(value_size_str, &value_size) ||
-      value_size <= 0 ||
-      !command_line.GetOptionValue(kTransactionSizeFlag.ToString(),
-                                   &transaction_size_str) ||
-      !fxl::StringToNumberWithError(transaction_size_str, &transaction_size) ||
-      transaction_size < 0) {
-    PrintUsage();
-    return -1;
-  }
-
-  UpdateEntryBenchmark app(&loop, std::move(startup_context), entry_count,
-                           value_size, transaction_size);
-  return RunWithTracing(&loop, [&app] { app.Run(); });
-}
-
-}  // namespace
-}  // namespace ledger
-
-int main(int argc, const char** argv) { return ledger::Main(argc, argv); }
diff --git a/bin/ledger/tests/benchmark/update_entry/update_entry.cmx b/bin/ledger/tests/benchmark/update_entry/update_entry.cmx
deleted file mode 100644
index 92c10fa..0000000
--- a/bin/ledger/tests/benchmark/update_entry/update_entry.cmx
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "program": {
-        "binary": "bin/ledger_benchmark_update_entry"
-    },
-    "sandbox": {
-        "features": [
-            "persistent-storage"
-        ],
-        "services": [
-            "fuchsia.tracelink.Registry",
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/benchmark/update_entry/update_entry.tspec b/bin/ledger/tests/benchmark/update_entry/update_entry.tspec
deleted file mode 100644
index b4570c0..0000000
--- a/bin/ledger/tests/benchmark/update_entry/update_entry.tspec
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.update_entry",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/update_entry.cmx",
-  "args": ["--entry-count=100", "--transaction-size=0", "--value-size=1000"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "small_value/put",
-      "event_name": "put",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/benchmark/update_entry/update_entry_transactions.tspec b/bin/ledger/tests/benchmark/update_entry/update_entry_transactions.tspec
deleted file mode 100644
index 70775a3..0000000
--- a/bin/ledger/tests/benchmark/update_entry/update_entry_transactions.tspec
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "test_suite_name": "fuchsia.ledger.update_entry",
-  "app": "fuchsia-pkg://fuchsia.com/ledger_benchmarks#meta/update_entry.cmx",
-  "args": ["--entry-count=100", "--transaction-size=10", "--value-size=1000"],
-  "categories": ["benchmark", "ledger"],
-  "duration": 60,
-  "measure": [
-    {
-      "type": "duration",
-      "output_test_name": "transaction/transaction",
-      "event_name": "transaction",
-      "event_category": "benchmark",
-      "expected_sample_count": 10,
-      "split_first": true
-    },
-
-    {
-      "type": "duration",
-      "output_test_name": "transaction/commit",
-      "event_name": "commit",
-      "event_category": "benchmark",
-      "expected_sample_count": 10,
-      "split_first": true
-    },
-
-    {
-      "type": "duration",
-      "output_test_name": "transaction/put",
-      "event_name": "put",
-      "event_category": "benchmark",
-      "expected_sample_count": 100,
-      "split_first": true
-    }
-  ]
-}
diff --git a/bin/ledger/tests/cloud_provider/BUILD.gn b/bin/ledger/tests/cloud_provider/BUILD.gn
deleted file mode 100644
index e0c4625..0000000
--- a/bin/ledger/tests/cloud_provider/BUILD.gn
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-executable("cloud_provider") {
-  testonly = true
-
-  output_name = "cloud_provider_validation_tests"
-
-  sources = [
-    "convert.cc",
-    "convert.h",
-    "device_set_test.cc",
-    "page_cloud_test.cc",
-    "types.h",
-    "validation_test.cc",
-    "validation_test.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//peridot/lib/commit_pack",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/ledger/tests/cloud_provider/README.md b/bin/ledger/tests/cloud_provider/README.md
deleted file mode 100644
index 6cd8ad6..0000000
--- a/bin/ledger/tests/cloud_provider/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Validation Test Suite for cloud providers
-
-This directory contains implementation-independent tests for implementations of
-the [CloudProvider] interface.
-
-In order to run the tests, run the `cloud_provider_validation_tests` binary with
-the cloud provider implementation exposed to it via the `svc` directory.
-
-We expect that individual cloud provider implementations would develop custom
-launcher applications that configure and run the validation tests against their
-implementation of CloudProvider ([example]).
-
-[CloudProvider]: /public/fidl/fuchsia.ledger.cloud/cloud_provider.fidl
-[example]: /bin/cloud_provider_firestore/validation/
diff --git a/bin/ledger/tests/cloud_provider/cloud_provider_validation_tests.cmx b/bin/ledger/tests/cloud_provider/cloud_provider_validation_tests.cmx
deleted file mode 100644
index 59e8a0b..0000000
--- a/bin/ledger/tests/cloud_provider/cloud_provider_validation_tests.cmx
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "program": {
-        "binary": "test/disabled/cloud_provider_validation_tests"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.ledger.cloud.CloudProvider"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/cloud_provider/convert.cc b/bin/ledger/tests/cloud_provider/convert.cc
deleted file mode 100644
index 8c3a2e9..0000000
--- a/bin/ledger/tests/cloud_provider/convert.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/tests/cloud_provider/convert.h"
-
-namespace cloud_provider {
-
-namespace {
-const char kHexDigits[] = "0123456789ABCDEF";
-}
-
-fidl::VectorPtr<uint8_t> ToArray(const std::string& val) {
-  fidl::VectorPtr<uint8_t> ret(val.size());
-  memcpy(ret->data(), val.data(), val.size());
-  return ret;
-}
-
-std::string ToString(const fidl::VectorPtr<uint8_t>& bytes) {
-  return std::string(reinterpret_cast<const char*>(bytes->data()),
-                     bytes->size());
-}
-
-std::string ToHex(const std::string& bytes) {
-  std::string result;
-  result.reserve(bytes.size() * 2);
-  for (unsigned char c : bytes) {
-    result.push_back(kHexDigits[c >> 4]);
-    result.push_back(kHexDigits[c & 0xf]);
-  }
-  return result;
-}
-
-}  // namespace cloud_provider
diff --git a/bin/ledger/tests/cloud_provider/convert.h b/bin/ledger/tests/cloud_provider/convert.h
deleted file mode 100644
index 762e852..0000000
--- a/bin/ledger/tests/cloud_provider/convert.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_CONVERT_H_
-#define PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_CONVERT_H_
-
-#include <string>
-
-#include <lib/fidl/cpp/vector.h>
-
-namespace cloud_provider {
-
-fidl::VectorPtr<uint8_t> ToArray(const std::string& val);
-
-std::string ToString(const fidl::VectorPtr<uint8_t>& bytes);
-
-std::string ToHex(const std::string& bytes);
-
-}  // namespace cloud_provider
-
-#endif  // PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_CONVERT_H_
diff --git a/bin/ledger/tests/cloud_provider/device_set_test.cc b/bin/ledger/tests/cloud_provider/device_set_test.cc
deleted file mode 100644
index e9f58a7..0000000
--- a/bin/ledger/tests/cloud_provider/device_set_test.cc
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <gtest/gtest.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/ledger/tests/cloud_provider/convert.h"
-#include "peridot/bin/ledger/tests/cloud_provider/types.h"
-#include "peridot/bin/ledger/tests/cloud_provider/validation_test.h"
-
-namespace cloud_provider {
-namespace {
-
-class DeviceSetTest : public ValidationTest, public DeviceSetWatcher {
- public:
-  DeviceSetTest() {}
-  ~DeviceSetTest() override {}
-
- protected:
-  ::testing::AssertionResult GetDeviceSet(DeviceSetSyncPtr* device_set) {
-    *device_set = DeviceSetSyncPtr();
-    Status status = Status::INTERNAL_ERROR;
-
-    if (cloud_provider_->GetDeviceSet(device_set->NewRequest(), &status) !=
-        ZX_OK) {
-      return ::testing::AssertionFailure()
-             << "Failed to retrieve the device set due to channel error.";
-    }
-
-    if (status != Status::OK) {
-      return ::testing::AssertionFailure()
-             << "Failed to retrieve the device set, received status: "
-             << fidl::ToUnderlying(status);
-    }
-
-    return ::testing::AssertionSuccess();
-  }
-
-  int on_cloud_erased_calls_ = 0;
-
- private:
-  // DeviceSetWatcher:
-  void OnCloudErased() override { on_cloud_erased_calls_++; }
-
-  void OnNetworkError() override {
-    // Do nothing - the validation test suite currently does not inject and test
-    // for network errors.
-    FXL_NOTIMPLEMENTED();
-  }
-};
-
-TEST_F(DeviceSetTest, GetDeviceSet) {
-  DeviceSetSyncPtr device_set;
-  ASSERT_TRUE(GetDeviceSet(&device_set));
-}
-
-TEST_F(DeviceSetTest, CheckMissingFingerprint) {
-  DeviceSetSyncPtr device_set;
-  ASSERT_TRUE(GetDeviceSet(&device_set));
-
-  Status status = Status::INTERNAL_ERROR;
-  ASSERT_EQ(ZX_OK, device_set->CheckFingerprint(ToArray("bazinga"), &status));
-  EXPECT_EQ(Status::NOT_FOUND, status);
-}
-
-TEST_F(DeviceSetTest, SetAndCheckFingerprint) {
-  DeviceSetSyncPtr device_set;
-  ASSERT_TRUE(GetDeviceSet(&device_set));
-
-  Status status = Status::INTERNAL_ERROR;
-  ASSERT_EQ(ZX_OK, device_set->SetFingerprint(ToArray("bazinga"), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_EQ(ZX_OK, device_set->CheckFingerprint(ToArray("bazinga"), &status));
-  EXPECT_EQ(Status::OK, status);
-}
-
-TEST_F(DeviceSetTest, WatchMisingFingerprint) {
-  DeviceSetSyncPtr device_set;
-  ASSERT_TRUE(GetDeviceSet(&device_set));
-  Status status = Status::INTERNAL_ERROR;
-  fidl::Binding<DeviceSetWatcher> binding(this);
-  DeviceSetWatcherPtr watcher;
-  binding.Bind(watcher.NewRequest());
-  ASSERT_EQ(ZX_OK, device_set->SetWatcher(ToArray("bazinga"),
-                                          std::move(watcher), &status));
-  EXPECT_EQ(Status::NOT_FOUND, status);
-}
-
-TEST_F(DeviceSetTest, SetAndWatchFingerprint) {
-  DeviceSetSyncPtr device_set;
-  ASSERT_TRUE(GetDeviceSet(&device_set));
-
-  Status status = Status::INTERNAL_ERROR;
-  EXPECT_EQ(ZX_OK, device_set->SetFingerprint(ToArray("bazinga"), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  fidl::Binding<DeviceSetWatcher> binding(this);
-  DeviceSetWatcherPtr watcher;
-  binding.Bind(watcher.NewRequest());
-  ASSERT_EQ(ZX_OK, device_set->SetWatcher(ToArray("bazinga"),
-                                          std::move(watcher), &status));
-  EXPECT_EQ(Status::OK, status);
-}
-
-TEST_F(DeviceSetTest, EraseWhileWatching) {
-  DeviceSetSyncPtr device_set;
-  ASSERT_TRUE(GetDeviceSet(&device_set));
-
-  Status status = Status::INTERNAL_ERROR;
-  ASSERT_EQ(ZX_OK, device_set->SetFingerprint(ToArray("bazinga"), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  fidl::Binding<DeviceSetWatcher> binding(this);
-  DeviceSetWatcherPtr watcher;
-  binding.Bind(watcher.NewRequest());
-  ASSERT_EQ(ZX_OK, device_set->SetWatcher(ToArray("bazinga"),
-                                          std::move(watcher), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  EXPECT_EQ(0, on_cloud_erased_calls_);
-  ASSERT_EQ(ZX_OK, device_set->Erase(&status));
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_EQ(ZX_OK, binding.WaitForMessage());
-  EXPECT_EQ(1, on_cloud_erased_calls_);
-}
-
-}  // namespace
-}  // namespace cloud_provider
diff --git a/bin/ledger/tests/cloud_provider/launcher/BUILD.gn b/bin/ledger/tests/cloud_provider/launcher/BUILD.gn
deleted file mode 100644
index 27c5099..0000000
--- a/bin/ledger/tests/cloud_provider/launcher/BUILD.gn
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("launcher") {
-  testonly = true
-
-  sources = [
-    "validation_tests_launcher.cc",
-    "validation_tests_launcher.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-  ]
-}
diff --git a/bin/ledger/tests/cloud_provider/launcher/validation_tests_launcher.cc b/bin/ledger/tests/cloud_provider/launcher/validation_tests_launcher.cc
deleted file mode 100644
index 79ad4e1..0000000
--- a/bin/ledger/tests/cloud_provider/launcher/validation_tests_launcher.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/tests/cloud_provider/launcher/validation_tests_launcher.h"
-
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fxl/logging.h>
-
-namespace cloud_provider {
-
-namespace {
-constexpr char kValidationTestsUrl[] =
-    "fuchsia-pkg://fuchsia.com/ledger_tests"
-    "#meta/cloud_provider_validation_tests.cmx";
-}  // namespace
-
-ValidationTestsLauncher::ValidationTestsLauncher(
-    component::StartupContext* startup_context,
-    std::function<
-        void(fidl::InterfaceRequest<fuchsia::ledger::cloud::CloudProvider>)>
-        factory)
-    : startup_context_(startup_context), factory_(std::move(factory)) {
-  service_provider_impl_.AddService<fuchsia::ledger::cloud::CloudProvider>(
-      [this](fidl::InterfaceRequest<fuchsia::ledger::cloud::CloudProvider>
-                 request) { factory_(std::move(request)); });
-}
-
-void ValidationTestsLauncher::Run(const std::vector<std::string>& arguments,
-                                  std::function<void(int32_t)> callback) {
-  callback_ = std::move(callback);
-  fuchsia::sys::LaunchInfo launch_info;
-  launch_info.url = kValidationTestsUrl;
-  fuchsia::sys::ServiceList service_list;
-  service_list.names.push_back(fuchsia::ledger::cloud::CloudProvider::Name_);
-  service_provider_impl_.AddBinding(service_list.provider.NewRequest());
-  launch_info.additional_services = fidl::MakeOptional(std::move(service_list));
-  for (const auto& argument : arguments) {
-    launch_info.arguments.push_back(argument);
-  }
-
-  startup_context_->launcher()->CreateComponent(
-      std::move(launch_info), validation_tests_controller_.NewRequest());
-
-  validation_tests_controller_.events().OnTerminated =
-      [this](int32_t return_code, fuchsia::sys::TerminationReason reason) {
-        callback_(return_code);
-      };
-  validation_tests_controller_.set_error_handler([this](zx_status_t status) {
-    FXL_LOG(ERROR) << "Lost connection to validation tests binary.";
-    callback_(-1);
-  });
-}
-
-}  // namespace cloud_provider
diff --git a/bin/ledger/tests/cloud_provider/launcher/validation_tests_launcher.h b/bin/ledger/tests/cloud_provider/launcher/validation_tests_launcher.h
deleted file mode 100644
index 06e50c0..0000000
--- a/bin/ledger/tests/cloud_provider/launcher/validation_tests_launcher.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_LAUNCHER_VALIDATION_TESTS_LAUNCHER_H_
-#define PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_LAUNCHER_VALIDATION_TESTS_LAUNCHER_H_
-
-#include <functional>
-#include <string>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/component/cpp/service_provider_impl.h>
-#include <lib/component/cpp/startup_context.h>
-
-namespace cloud_provider {
-
-// Helper for building launcher apps for the validation tests.
-class ValidationTestsLauncher {
- public:
-  // The constructor.
-  //
-  // |factory| is called to produce instances of the cloud provider under test.
-  ValidationTestsLauncher(
-      component::StartupContext* startup_context,
-      std::function<
-          void(fidl::InterfaceRequest<fuchsia::ledger::cloud::CloudProvider>)>
-          factory);
-
-  // Starts the tests.
-  //
-  // |arguments| are passed to the test binary.
-  // |callback| is called after the tests are finished and passed the exit code
-  //     of the test binary.
-  void Run(const std::vector<std::string>& arguments,
-           std::function<void(int32_t)> callback);
-
- private:
-  component::StartupContext* const startup_context_;
-  std::function<void(
-      fidl::InterfaceRequest<fuchsia::ledger::cloud::CloudProvider>)>
-      factory_;
-  component::ServiceProviderImpl service_provider_impl_;
-  fuchsia::sys::ComponentControllerPtr validation_tests_controller_;
-  std::function<void(int32_t)> callback_;
-};
-
-}  // namespace cloud_provider
-
-#endif  // PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_LAUNCHER_VALIDATION_TESTS_LAUNCHER_H_
diff --git a/bin/ledger/tests/cloud_provider/page_cloud_test.cc b/bin/ledger/tests/cloud_provider/page_cloud_test.cc
deleted file mode 100644
index 9dcf140..0000000
--- a/bin/ledger/tests/cloud_provider/page_cloud_test.cc
+++ /dev/null
@@ -1,357 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <gtest/gtest.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fsl/vmo/sized_vmo.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/random/uuid.h>
-
-#include "peridot/bin/ledger/tests/cloud_provider/convert.h"
-#include "peridot/bin/ledger/tests/cloud_provider/types.h"
-#include "peridot/bin/ledger/tests/cloud_provider/validation_test.h"
-#include "peridot/lib/commit_pack/commit_pack.h"
-
-namespace cloud_provider {
-namespace {
-
-// Verifies that the given array of commits contains a commit of the given id
-// and data.
-::testing::AssertionResult CheckThatCommitsContain(
-    const std::vector<CommitPackEntry>& entries, const std::string& id,
-    const std::string& data) {
-  for (auto& entry : entries) {
-    if (entry.id != id) {
-      continue;
-    }
-
-    if (entry.data != data) {
-      return ::testing::AssertionFailure()
-             << "The commit of the expected id: 0x" << ToHex(id) << " (" << id
-             << ") "
-             << " was found but its data doesn't match - expected: 0x"
-             << ToHex(data) << " but found: " << ToHex(entry.data);
-    }
-
-    return ::testing::AssertionSuccess();
-  }
-
-  return ::testing::AssertionFailure()
-         << "The commit of the id: " << ToHex(id) << " (" << id << ") "
-         << " is missing.";
-}
-
-class PageCloudTest : public ValidationTest, public PageCloudWatcher {
- public:
-  PageCloudTest() {}
-  ~PageCloudTest() override {}
-
- protected:
-  ::testing::AssertionResult GetPageCloud(fidl::VectorPtr<uint8_t> app_id,
-                                          fidl::VectorPtr<uint8_t> page_id,
-                                          PageCloudSyncPtr* page_cloud) {
-    *page_cloud = PageCloudSyncPtr();
-    Status status = Status::INTERNAL_ERROR;
-
-    if (cloud_provider_->GetPageCloud(std::move(app_id), std::move(page_id),
-                                      page_cloud->NewRequest(),
-                                      &status) != ZX_OK) {
-      return ::testing::AssertionFailure()
-             << "Failed to retrieve the page cloud due to channel error.";
-    }
-
-    if (status != Status::OK) {
-      return ::testing::AssertionFailure()
-             << "Failed to retrieve the page cloud, received status: "
-             << fidl::ToUnderlying(status);
-    }
-
-    return ::testing::AssertionSuccess();
-  }
-
-  ::testing::AssertionResult GetLatestPositionToken(
-      PageCloudSyncPtr* page_cloud,
-      std::unique_ptr<cloud_provider::Token>* token) {
-    Status status = Status::INTERNAL_ERROR;
-    std::unique_ptr<cloud_provider::CommitPack> commit_pack;
-    if ((*page_cloud)->GetCommits(nullptr, &status, &commit_pack, token) !=
-        ZX_OK) {
-      return ::testing::AssertionFailure()
-             << "Failed to retrieve the position token due to channel error.";
-    }
-
-    if (status != Status::OK) {
-      return ::testing::AssertionFailure()
-             << "Failed to retrieve the position token, received status: "
-             << fidl::ToUnderlying(status);
-    }
-
-    return ::testing::AssertionSuccess();
-  }
-
-  int on_new_commits_calls_ = 0;
-  std::vector<CommitPackEntry> on_new_commits_commits_;
-  cloud_provider::Token on_new_commits_position_token_;
-  OnNewCommitsCallback on_new_commits_commits_callback_;
-
-  cloud_provider::Status on_error_status_ = cloud_provider::Status::OK;
-
- private:
-  // PageCloudWatcher:
-  void OnNewCommits(CommitPack commits, cloud_provider::Token position_token,
-                    OnNewCommitsCallback callback) override {
-    std::vector<CommitPackEntry> entries;
-    ASSERT_TRUE(DecodeCommitPack(commits, &entries));
-
-    on_new_commits_calls_++;
-    std::move(entries.begin(), entries.end(),
-              std::back_inserter(on_new_commits_commits_));
-    on_new_commits_position_token_ = std::move(position_token);
-    on_new_commits_commits_callback_ = std::move(callback);
-  }
-
-  void OnNewObject(std::vector<uint8_t> /*id*/,
-                   fuchsia::mem::Buffer /*data*/,
-                   OnNewObjectCallback /*callback*/) override {
-    // We don't have any implementations yet that support this API.
-    // TODO(ppi): add tests for the OnNewObject notifications.
-    FXL_NOTIMPLEMENTED();
-  }
-
-  void OnError(cloud_provider::Status status) override {
-    on_error_status_ = status;
-  }
-};
-
-TEST_F(PageCloudTest, GetPageCloud) {
-  PageCloudSyncPtr page_cloud;
-  ASSERT_TRUE(GetPageCloud(ToArray("app_id"), ToArray("page_id"), &page_cloud));
-}
-
-TEST_F(PageCloudTest, GetNoCommits) {
-  PageCloudSyncPtr page_cloud;
-  ASSERT_TRUE(GetPageCloud(ToArray("app_id"), ToArray("page_id"), &page_cloud));
-
-  std::unique_ptr<cloud_provider::CommitPack> commit_pack;
-  std::unique_ptr<Token> token;
-  Status status = Status::INTERNAL_ERROR;
-  ASSERT_EQ(ZX_OK,
-            page_cloud->GetCommits(nullptr, &status, &commit_pack, &token));
-  EXPECT_EQ(Status::OK, status);
-  ASSERT_TRUE(commit_pack);
-  std::vector<CommitPackEntry> entries;
-  ASSERT_TRUE(DecodeCommitPack(*commit_pack, &entries));
-  EXPECT_TRUE(entries.empty());
-  EXPECT_FALSE(token);
-}
-
-TEST_F(PageCloudTest, AddAndGetCommits) {
-  PageCloudSyncPtr page_cloud;
-  ASSERT_TRUE(GetPageCloud(ToArray("app_id"), ToArray("page_id"), &page_cloud));
-
-  std::vector<CommitPackEntry> entries{{"id0", "data0"}, {"id1", "data1"}};
-  CommitPack commit_pack;
-  ASSERT_TRUE(EncodeCommitPack(entries, &commit_pack));
-  Status status = Status::INTERNAL_ERROR;
-  ASSERT_EQ(ZX_OK, page_cloud->AddCommits(std::move(commit_pack), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  std::unique_ptr<CommitPack> result;
-  std::unique_ptr<Token> token;
-  ASSERT_EQ(ZX_OK, page_cloud->GetCommits(nullptr, &status, &result, &token));
-  EXPECT_EQ(Status::OK, status);
-  ASSERT_TRUE(result);
-  ASSERT_TRUE(DecodeCommitPack(*result, &entries));
-  EXPECT_EQ(2u, entries.size());
-  EXPECT_TRUE(CheckThatCommitsContain(entries, "id0", "data0"));
-  EXPECT_TRUE(CheckThatCommitsContain(entries, "id1", "data1"));
-  EXPECT_TRUE(token);
-}
-
-TEST_F(PageCloudTest, GetCommitsByPositionToken) {
-  PageCloudSyncPtr page_cloud;
-  ASSERT_TRUE(GetPageCloud(ToArray("app_id"), ToArray("page_id"), &page_cloud));
-
-  // Add two commits.
-  std::vector<CommitPackEntry> entries{{"id0", "data0"}, {"id1", "data1"}};
-  CommitPack commit_pack;
-  ASSERT_TRUE(EncodeCommitPack(entries, &commit_pack));
-  Status status = Status::INTERNAL_ERROR;
-  ASSERT_EQ(ZX_OK, page_cloud->AddCommits(std::move(commit_pack), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  // Retrieve the position token of the newest of the two (`id1`).
-  std::unique_ptr<cloud_provider::Token> token;
-  ASSERT_TRUE(GetLatestPositionToken(&page_cloud, &token));
-  EXPECT_TRUE(token);
-
-  // Add one more commit.
-  std::vector<CommitPackEntry> more_entries{{"id2", "data2"}};
-  ASSERT_TRUE(EncodeCommitPack(more_entries, &commit_pack));
-  ASSERT_EQ(ZX_OK, page_cloud->AddCommits(std::move(commit_pack), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  // Retrieve the commits again with the position token of `id1`.
-  std::unique_ptr<CommitPack> result;
-  ASSERT_EQ(ZX_OK,
-            page_cloud->GetCommits(std::move(token), &status, &result, &token));
-  EXPECT_EQ(Status::OK, status);
-  ASSERT_TRUE(result);
-  ASSERT_TRUE(DecodeCommitPack(*result, &entries));
-
-  // As per the API contract, the response must include `id1` and everything
-  // newer than it. It may or may not include `id0`.
-  EXPECT_TRUE(CheckThatCommitsContain(entries, "id1", "data1"));
-  EXPECT_TRUE(CheckThatCommitsContain(entries, "id2", "data2"));
-}
-
-TEST_F(PageCloudTest, AddAndGetObjects) {
-  PageCloudSyncPtr page_cloud;
-  ASSERT_TRUE(GetPageCloud(ToArray("app_id"), ToArray("page_id"), &page_cloud));
-
-  fsl::SizedVmo data;
-  ASSERT_TRUE(fsl::VmoFromString("bazinga!", &data));
-  Status status = Status::INTERNAL_ERROR;
-  // Generate a random ID - the current cloud provider implementations don't
-  // erase storage objects upon .Erase(), and we want to avoid interference from
-  // previous test runs.
-  // TODO(ppi): use a fixed ID here once the cloud provider implementations
-  // support erasing objects.
-  const std::string id = fxl::GenerateUUID();
-  ASSERT_EQ(ZX_OK, page_cloud->AddObject(
-                       ToArray(id), std::move(data).ToTransport(), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  ::fuchsia::mem::BufferPtr buffer_ptr;
-  ASSERT_EQ(ZX_OK, page_cloud->GetObject(ToArray(id), &status, &buffer_ptr));
-  EXPECT_EQ(Status::OK, status);
-  std::string read_data;
-  ASSERT_TRUE(fsl::StringFromVmo(*buffer_ptr, &read_data));
-  EXPECT_EQ("bazinga!", read_data);
-}
-
-TEST_F(PageCloudTest, AddSameObjectTwice) {
-  PageCloudSyncPtr page_cloud;
-  ASSERT_TRUE(GetPageCloud(ToArray("app_id"), ToArray("page_id"), &page_cloud));
-
-  fsl::SizedVmo data;
-  ASSERT_TRUE(fsl::VmoFromString("bazinga!", &data));
-  Status status = Status::INTERNAL_ERROR;
-  const std::string id = "some id";
-  ASSERT_EQ(ZX_OK, page_cloud->AddObject(
-                       ToArray(id), std::move(data).ToTransport(), &status));
-  EXPECT_EQ(Status::OK, status);
-  // Adding the same object again must succeed as per cloud provider contract.
-  fsl::SizedVmo more_data;
-  ASSERT_TRUE(fsl::VmoFromString("bazinga!", &more_data));
-  ASSERT_EQ(ZX_OK,
-            page_cloud->AddObject(ToArray(id),
-                                  std::move(more_data).ToTransport(), &status));
-  EXPECT_EQ(Status::OK, status);
-}
-
-TEST_F(PageCloudTest, WatchAndReceiveCommits) {
-  PageCloudSyncPtr page_cloud;
-  ASSERT_TRUE(GetPageCloud(ToArray("app_id"), ToArray("page_id"), &page_cloud));
-  Status status = Status::INTERNAL_ERROR;
-  fidl::Binding<PageCloudWatcher> binding(this);
-  PageCloudWatcherPtr watcher;
-  binding.Bind(watcher.NewRequest());
-  ASSERT_EQ(ZX_OK,
-            page_cloud->SetWatcher(nullptr, std::move(watcher), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  std::vector<CommitPackEntry> entries{{"id0", "data0"}, {"id1", "data1"}};
-  CommitPack commit_pack;
-  ASSERT_TRUE(EncodeCommitPack(entries, &commit_pack));
-  ASSERT_EQ(ZX_OK, page_cloud->AddCommits(std::move(commit_pack), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  // The two commits could be delivered in one or two notifications. If they are
-  // delivered over two notifications, the second one can only be delivered
-  // after the client confirms having processed the first one by calling the
-  // notification callback.
-  while (on_new_commits_commits_.size() < 2u) {
-    ASSERT_EQ(ZX_OK, binding.WaitForMessage());
-    on_new_commits_commits_callback_();
-  }
-  EXPECT_TRUE(CheckThatCommitsContain(on_new_commits_commits_, "id0", "data0"));
-  EXPECT_TRUE(CheckThatCommitsContain(on_new_commits_commits_, "id1", "data1"));
-}
-
-// Verifies that the pre-existing commits are also delivered when a watcher is
-// registered.
-TEST_F(PageCloudTest, WatchWithBacklog) {
-  PageCloudSyncPtr page_cloud;
-  ASSERT_TRUE(GetPageCloud(ToArray("app_id"), ToArray("page_id"), &page_cloud));
-  Status status = Status::INTERNAL_ERROR;
-
-  std::vector<CommitPackEntry> entries{{"id0", "data0"}, {"id1", "data1"}};
-  CommitPack commit_pack;
-  ASSERT_TRUE(EncodeCommitPack(entries, &commit_pack));
-  ASSERT_EQ(ZX_OK, page_cloud->AddCommits(std::move(commit_pack), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  fidl::Binding<PageCloudWatcher> binding(this);
-  PageCloudWatcherPtr watcher;
-  binding.Bind(watcher.NewRequest());
-  ASSERT_EQ(ZX_OK,
-            page_cloud->SetWatcher(nullptr, std::move(watcher), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  while (on_new_commits_commits_.size() < 2u) {
-    ASSERT_EQ(ZX_OK, binding.WaitForMessage());
-    on_new_commits_commits_callback_();
-  }
-  EXPECT_TRUE(CheckThatCommitsContain(on_new_commits_commits_, "id0", "data0"));
-  EXPECT_TRUE(CheckThatCommitsContain(on_new_commits_commits_, "id1", "data1"));
-}
-
-TEST_F(PageCloudTest, WatchWithPositionToken) {
-  PageCloudSyncPtr page_cloud;
-  ASSERT_TRUE(GetPageCloud(ToArray("app_id"), ToArray("page_id"), &page_cloud));
-
-  // Add two commits.
-  std::vector<CommitPackEntry> entries{{"id0", "data0"}, {"id1", "data1"}};
-  CommitPack commit_pack;
-  ASSERT_TRUE(EncodeCommitPack(entries, &commit_pack));
-  Status status = Status::INTERNAL_ERROR;
-  ASSERT_EQ(ZX_OK, page_cloud->AddCommits(std::move(commit_pack), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  // Retrieve the position token of the newest of the two (`id1`).
-  std::unique_ptr<cloud_provider::Token> token;
-  ASSERT_TRUE(GetLatestPositionToken(&page_cloud, &token));
-  EXPECT_TRUE(token);
-
-  // Set the watcher with the position token of `id1`.
-  fidl::Binding<PageCloudWatcher> binding(this);
-  PageCloudWatcherPtr watcher;
-  binding.Bind(watcher.NewRequest());
-  ASSERT_EQ(ZX_OK, page_cloud->SetWatcher(std::move(token), std::move(watcher),
-                                          &status));
-  EXPECT_EQ(Status::OK, status);
-
-  // As per the API contract, the commits delivered in notifications must
-  // include `id1`. They may or may not include `id0`.
-  while (!CheckThatCommitsContain(on_new_commits_commits_, "id1", "data1")) {
-    ASSERT_EQ(ZX_OK, binding.WaitForMessage());
-    on_new_commits_commits_callback_();
-  }
-
-  // Add one more commit.
-  std::vector<CommitPackEntry> more_entries{{"id2", "data2"}};
-  ASSERT_TRUE(EncodeCommitPack(more_entries, &commit_pack));
-  ASSERT_EQ(ZX_OK, page_cloud->AddCommits(std::move(commit_pack), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  while (!CheckThatCommitsContain(on_new_commits_commits_, "id2", "data2")) {
-    ASSERT_EQ(ZX_OK, binding.WaitForMessage());
-    on_new_commits_commits_callback_();
-  }
-}
-
-}  // namespace
-}  // namespace cloud_provider
diff --git a/bin/ledger/tests/cloud_provider/types.h b/bin/ledger/tests/cloud_provider/types.h
deleted file mode 100644
index f4661a4..0000000
--- a/bin/ledger/tests/cloud_provider/types.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_TYPES_H_
-#define PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_TYPES_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-
-// More convenient aliases for FIDL types.
-
-namespace cloud_provider {
-using CloudProvider = fuchsia::ledger::cloud::CloudProvider;
-using CloudProviderPtr = fuchsia::ledger::cloud::CloudProviderPtr;
-using CloudProviderSyncPtr = fuchsia::ledger::cloud::CloudProviderSyncPtr;
-using CommitPack = fuchsia::ledger::cloud::CommitPack;
-using DeviceSet = fuchsia::ledger::cloud::DeviceSet;
-using DeviceSetPtr = fuchsia::ledger::cloud::DeviceSetPtr;
-using DeviceSetSyncPtr = fuchsia::ledger::cloud::DeviceSetSyncPtr;
-using DeviceSetWatcher = fuchsia::ledger::cloud::DeviceSetWatcher;
-using DeviceSetWatcherPtr = fuchsia::ledger::cloud::DeviceSetWatcherPtr;
-using PageCloud = fuchsia::ledger::cloud::PageCloud;
-using PageCloudPtr = fuchsia::ledger::cloud::PageCloudPtr;
-using PageCloudSyncPtr = fuchsia::ledger::cloud::PageCloudSyncPtr;
-using PageCloudWatcher = fuchsia::ledger::cloud::PageCloudWatcher;
-using PageCloudWatcherPtr = fuchsia::ledger::cloud::PageCloudWatcherPtr;
-using Status = fuchsia::ledger::cloud::Status;
-using Token = fuchsia::ledger::cloud::Token;
-}  // namespace cloud_provider
-
-#endif  // PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_TYPES_H_
diff --git a/bin/ledger/tests/cloud_provider/validation_test.cc b/bin/ledger/tests/cloud_provider/validation_test.cc
deleted file mode 100644
index 05c042e..0000000
--- a/bin/ledger/tests/cloud_provider/validation_test.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/tests/cloud_provider/validation_test.h"
-
-namespace cloud_provider {
-
-ValidationTest::ValidationTest()
-    : startup_context_(component::StartupContext::CreateFromStartupInfo()) {}
-ValidationTest::~ValidationTest() {}
-
-void ValidationTest::SetUp() {
-  startup_context_->ConnectToEnvironmentService(cloud_provider_.NewRequest());
-}
-
-}  // namespace cloud_provider
diff --git a/bin/ledger/tests/cloud_provider/validation_test.h b/bin/ledger/tests/cloud_provider/validation_test.h
deleted file mode 100644
index 6a9c45b..0000000
--- a/bin/ledger/tests/cloud_provider/validation_test.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_VALIDATION_TEST_H_
-#define PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_VALIDATION_TEST_H_
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <gtest/gtest.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/bin/ledger/tests/cloud_provider/types.h"
-
-namespace cloud_provider {
-
-class ValidationTest : public ::gtest::TestLoopFixture {
- public:
-  ValidationTest();
-  ~ValidationTest() override;
-
-  void SetUp() override;
-
- protected:
-  CloudProviderSyncPtr cloud_provider_;
-
- private:
-  std::unique_ptr<component::StartupContext> startup_context_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ValidationTest);
-};
-
-}  // namespace cloud_provider
-
-#endif  // PERIDOT_BIN_LEDGER_TESTS_CLOUD_PROVIDER_VALIDATION_TEST_H_
diff --git a/bin/ledger/tests/e2e_local/BUILD.gn b/bin/ledger/tests/e2e_local/BUILD.gn
deleted file mode 100644
index f4def97..0000000
--- a/bin/ledger/tests/e2e_local/BUILD.gn
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-executable("e2e_local") {
-  output_name = "ledger_e2e_local"
-
-  testonly = true
-
-  sources = [
-    "get_ledger_test.cc",
-    "ledger_e2e_test.cc",
-  ]
-
-  deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//peridot/bin/ledger/app:serialization_version",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/bin/ledger/filesystem",
-    "//peridot/bin/ledger/testing:get_ledger",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/bin/ledger/testing/cloud_provider",
-    "//peridot/lib/scoped_tmpfs",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//third_party/googletest:gmock",
-    "//third_party/googletest:gtest_main",
-  ]
-
-  data_deps = [
-    "//peridot/bin/ledger/app",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/e2e_local/get_ledger_test.cc b/bin/ledger/tests/e2e_local/get_ledger_test.cc
deleted file mode 100644
index cfc7d6c..0000000
--- a/bin/ledger/tests/e2e_local/get_ledger_test.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/testing/get_ledger.h"
-
-#include <lib/async-loop/cpp/loop.h>
-
-#include "garnet/public/lib/callback/capture.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace ledger {
-namespace {
-
-TEST(GetLedgerTest, CreateAndDeleteLedger) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  scoped_tmpfs::ScopedTmpFS tmpfs;
-
-  auto startup_context = component::StartupContext::CreateFromStartupInfo();
-  fuchsia::sys::ComponentControllerPtr controller;
-
-  LedgerPtr ledger;
-  Status status = GetLedger(
-      startup_context.get(), controller.NewRequest(), nullptr, "",
-      "ledger_name", DetachedPath(tmpfs.root_fd()), [&] { loop.Quit(); },
-      &ledger);
-
-  // No need to |Sync| as |GetLedger| handles it.
-  EXPECT_EQ(Status::OK, status);
-
-  KillLedgerProcess(&controller);
-}
-
-TEST(GetLedgerTest, GetPageEnsureInitialized) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  scoped_tmpfs::ScopedTmpFS tmpfs;
-
-  auto startup_context = component::StartupContext::CreateFromStartupInfo();
-  fuchsia::sys::ComponentControllerPtr controller;
-
-  LedgerPtr ledger;
-  Status status = GetLedger(
-      startup_context.get(), controller.NewRequest(), nullptr, "",
-      "ledger_name", DetachedPath(tmpfs.root_fd()), [&] { loop.Quit(); },
-      &ledger);
-
-  ASSERT_EQ(Status::OK, status);
-
-  status = Status::UNKNOWN_ERROR;
-  PagePtr page;
-  PageId page_id;
-
-  GetPageEnsureInitialized(
-      &ledger, nullptr, DelayCallback::NO, [&] { loop.Quit(); },
-      callback::Capture([&] { loop.Quit(); }, &status, &page, &page_id));
-  loop.Run();
-
-  EXPECT_EQ(Status::OK, status);
-
-  KillLedgerProcess(&controller);
-}
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/tests/e2e_local/ledger_e2e_local.cmx b/bin/ledger/tests/e2e_local/ledger_e2e_local.cmx
deleted file mode 100644
index 1f1f45c..0000000
--- a/bin/ledger/tests/e2e_local/ledger_e2e_local.cmx
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "program": {
-        "binary": "test/ledger_e2e_local"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.sys.Launcher"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/e2e_local/ledger_e2e_test.cc b/bin/ledger/tests/e2e_local/ledger_e2e_test.cc
deleted file mode 100644
index 974a028..0000000
--- a/bin/ledger/tests/e2e_local/ledger_e2e_test.cc
+++ /dev/null
@@ -1,373 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string.h>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/callback/capture.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/synchronous_interface_ptr.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/io/fd.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/gtest/real_loop_fixture.h>
-#include <lib/svc/cpp/services.h>
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/serialization_version.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/filesystem/detached_path.h"
-#include "peridot/bin/ledger/filesystem/directory_reader.h"
-#include "peridot/bin/ledger/testing/cloud_provider/fake_cloud_provider.h"
-#include "peridot/bin/ledger/testing/cloud_provider/types.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace test {
-namespace e2e_local {
-namespace {
-
-using ::testing::ElementsAre;
-
-template <class A>
-bool Equals(const fidl::VectorPtr<uint8_t>& a1, const A& a2) {
-  if (a1->size() != a2.size())
-    return false;
-  return memcmp(a1->data(), a2.data(), a1->size()) == 0;
-}
-
-fidl::VectorPtr<uint8_t> TestArray() {
-  std::string value = "value";
-  fidl::VectorPtr<uint8_t> result(value.size());
-  memcpy(&result->at(0), &value[0], value.size());
-  return result;
-}
-
-class LedgerEndToEndTest : public gtest::RealLoopFixture {
- public:
-  LedgerEndToEndTest()
-      : startup_context_(component::StartupContext::CreateFromStartupInfo()) {}
-  ~LedgerEndToEndTest() override {}
-
- protected:
-  void Init(std::vector<std::string> additional_args) {
-    component::Services child_services;
-    fuchsia::sys::LaunchInfo launch_info;
-    launch_info.url = "fuchsia-pkg://fuchsia.com/ledger#meta/ledger.cmx";
-    launch_info.directory_request = child_services.NewRequest();
-    launch_info.arguments.push_back("--disable_reporting");
-    for (auto& additional_arg : additional_args) {
-      launch_info.arguments.push_back(additional_arg);
-    }
-    startup_context()->launcher()->CreateComponent(
-        std::move(launch_info), ledger_controller_.NewRequest());
-
-    ledger_controller_.set_error_handler([this](zx_status_t status) {
-      for (const auto& callback : ledger_shutdown_callbacks_) {
-        callback();
-      }
-    });
-
-    ledger_repository_factory_.set_error_handler([](zx_status_t status) {
-      if (status != ZX_ERR_PEER_CLOSED) {
-        ADD_FAILURE() << "Ledger repository error: " << status;
-      }
-    });
-    child_services.ConnectToService(ledger_repository_factory_.NewRequest());
-    child_services.ConnectToService(controller_.NewRequest());
-  }
-
-  void RegisterShutdownCallback(fit::function<void()> callback) {
-    ledger_shutdown_callbacks_.push_back(std::move(callback));
-  }
-
-  component::StartupContext* startup_context() {
-    return startup_context_.get();
-  }
-
- private:
-  fuchsia::sys::ComponentControllerPtr ledger_controller_;
-  std::vector<fit::function<void()>> ledger_shutdown_callbacks_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-
- protected:
-  ledger_internal::LedgerRepositoryFactoryPtr ledger_repository_factory_;
-  fidl::SynchronousInterfacePtr<ledger::Ledger> ledger_;
-  fidl::SynchronousInterfacePtr<ledger_internal::LedgerController> controller_;
-};
-
-TEST_F(LedgerEndToEndTest, PutAndGet) {
-  Init({});
-  ledger::Status status;
-  fidl::SynchronousInterfacePtr<ledger_internal::LedgerRepository>
-      ledger_repository;
-  scoped_tmpfs::ScopedTmpFS tmpfs;
-  ledger_repository_factory_->GetRepository(
-      fsl::CloneChannelFromFileDescriptor(tmpfs.root_fd()), nullptr, "",
-      ledger_repository.NewRequest());
-
-  ledger_repository->GetLedger(TestArray(), ledger_.NewRequest());
-  ASSERT_EQ(ZX_OK, ledger_repository->Sync());
-
-  fidl::SynchronousInterfacePtr<ledger::Page> page;
-  ledger_->GetRootPage(page.NewRequest(), &status);
-  ASSERT_EQ(ledger::Status::OK, status);
-  page->Put(TestArray(), TestArray(), &status);
-  EXPECT_EQ(ledger::Status::OK, status);
-  fidl::SynchronousInterfacePtr<ledger::PageSnapshot> snapshot;
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    nullptr, &status);
-  EXPECT_EQ(ledger::Status::OK, status);
-  fuchsia::mem::BufferPtr value;
-  snapshot->Get(TestArray(), &status, &value);
-  EXPECT_EQ(ledger::Status::OK, status);
-  std::string value_as_string;
-  EXPECT_TRUE(fsl::StringFromVmo(*value, &value_as_string));
-  EXPECT_TRUE(Equals(TestArray(), value_as_string));
-}
-
-TEST_F(LedgerEndToEndTest, Terminate) {
-  Init({});
-  bool called = false;
-  RegisterShutdownCallback([this, &called] {
-    called = true;
-    QuitLoop();
-  });
-  controller_->Terminate();
-  RunLoop();
-  EXPECT_TRUE(called);
-}
-
-// Verifies the cloud erase recovery in case of a cloud that was erased before
-// startup.
-//
-// Expected behavior: Ledger disconnects the clients and the local state is
-// cleared.
-TEST_F(LedgerEndToEndTest, CloudEraseRecoveryOnInitialCheck) {
-  Init({});
-  bool ledger_shut_down = false;
-  RegisterShutdownCallback([&ledger_shut_down] { ledger_shut_down = true; });
-
-  ledger_internal::LedgerRepositoryPtr ledger_repository;
-  scoped_tmpfs::ScopedTmpFS tmpfs;
-  const std::string content_path = ledger::kSerializationVersion.ToString();
-  const std::string deletion_sentinel_path = content_path + "/sentinel";
-  ASSERT_TRUE(files::CreateDirectoryAt(tmpfs.root_fd(), content_path));
-  ASSERT_TRUE(
-      files::WriteFileAt(tmpfs.root_fd(), deletion_sentinel_path, "", 0));
-  ASSERT_TRUE(files::IsFileAt(tmpfs.root_fd(), deletion_sentinel_path));
-
-  // Write a fingerprint file, so that Ledger will check if it is still in the
-  // cloud device set.
-  const std::string fingerprint_path = content_path + "/fingerprint";
-  const std::string fingerprint = "bazinga";
-  ASSERT_TRUE(files::WriteFileAt(tmpfs.root_fd(), fingerprint_path,
-                                 fingerprint.c_str(), fingerprint.size()));
-
-  // Create a cloud provider configured to trigger the cloude erase recovery on
-  // initial check.
-  auto cloud_provider =
-      ledger::FakeCloudProvider::Builder()
-          .SetCloudEraseOnCheck(ledger::CloudEraseOnCheck::YES)
-          .Build();
-  cloud_provider::CloudProviderPtr cloud_provider_ptr;
-  fidl::Binding<cloud_provider::CloudProvider> cloud_provider_binding(
-      cloud_provider.get(), cloud_provider_ptr.NewRequest());
-
-  ledger_repository_factory_->GetRepository(
-      fsl::CloneChannelFromFileDescriptor(tmpfs.root_fd()),
-      std::move(cloud_provider_ptr), "user_id", ledger_repository.NewRequest());
-
-  bool repo_disconnected = false;
-  ledger_repository.set_error_handler(
-      [&repo_disconnected](zx_status_t status) { repo_disconnected = true; });
-
-  // Run the message loop until Ledger clears the repo directory and disconnects
-  // the client.
-  RunLoopUntil([&] {
-    return !files::IsFileAt(tmpfs.root_fd(), deletion_sentinel_path) &&
-           repo_disconnected;
-  });
-  EXPECT_FALSE(files::IsFileAt(tmpfs.root_fd(), deletion_sentinel_path));
-  EXPECT_TRUE(repo_disconnected);
-
-  // Make sure all the contents are deleted. Only the staging directory should
-  // be present.
-  std::vector<std::string> directory_entries;
-  auto on_next_directory_entry = [&](fxl::StringView entry) {
-    directory_entries.push_back(entry.ToString());
-    return true;
-  };
-  EXPECT_TRUE(ledger::GetDirectoryEntries(ledger::DetachedPath(tmpfs.root_fd()),
-                                          on_next_directory_entry));
-  EXPECT_THAT(directory_entries, ElementsAre("staging"));
-
-  // Verify that the Ledger app didn't crash.
-  EXPECT_FALSE(ledger_shut_down);
-}
-
-// Verifies the cloud erase recovery in case of a cloud that is erased while
-// Ledger is connected to it.
-//
-// Expected behavior: Ledger disconnects the clients and the local state is
-// cleared.
-TEST_F(LedgerEndToEndTest, CloudEraseRecoveryFromTheWatcher) {
-  Init({});
-  bool ledger_shut_down = false;
-  RegisterShutdownCallback([&ledger_shut_down] { ledger_shut_down = true; });
-
-  ledger_internal::LedgerRepositoryPtr ledger_repository;
-  scoped_tmpfs::ScopedTmpFS tmpfs;
-  const std::string content_path = ledger::kSerializationVersion.ToString();
-  const std::string deletion_sentinel_path = content_path + "/sentinel";
-  ASSERT_TRUE(files::CreateDirectoryAt(tmpfs.root_fd(), content_path));
-  ASSERT_TRUE(
-      files::WriteFileAt(tmpfs.root_fd(), deletion_sentinel_path, "", 0));
-  ASSERT_TRUE(files::IsFileAt(tmpfs.root_fd(), deletion_sentinel_path));
-
-  // Create a cloud provider configured to trigger the cloud erase recovery
-  // while Ledger is connected.
-  auto cloud_provider =
-      ledger::FakeCloudProvider::Builder()
-          .SetCloudEraseFromWatcher(ledger::CloudEraseFromWatcher::YES)
-          .Build();
-  cloud_provider::CloudProviderPtr cloud_provider_ptr;
-  fidl::Binding<cloud_provider::CloudProvider> cloud_provider_binding(
-      cloud_provider.get(), cloud_provider_ptr.NewRequest());
-
-  ledger_repository_factory_->GetRepository(
-      fsl::CloneChannelFromFileDescriptor(tmpfs.root_fd()),
-      std::move(cloud_provider_ptr), "user_id", ledger_repository.NewRequest());
-
-  bool repo_disconnected = false;
-  ledger_repository.set_error_handler(
-      [&repo_disconnected](zx_status_t status) { repo_disconnected = true; });
-
-  // Run the message loop until Ledger clears the repo directory and disconnects
-  // the client.
-  RunLoopUntil([&] {
-    return !files::IsFileAt(tmpfs.root_fd(), deletion_sentinel_path) &&
-           repo_disconnected;
-  });
-  EXPECT_FALSE(files::IsFileAt(tmpfs.root_fd(), deletion_sentinel_path));
-  EXPECT_TRUE(repo_disconnected);
-
-  // Verify that the Ledger app didn't crash.
-  EXPECT_FALSE(ledger_shut_down);
-}
-
-// Verifies that Ledger instance continues to work even if the cloud provider
-// goes away (for example, because it crashes).
-//
-// In the future, we need to also be able to reconnect/request a new cloud
-// provider, see LE-567.
-TEST_F(LedgerEndToEndTest, HandleCloudProviderDisconnectBeforePageInit) {
-  Init({});
-  bool ledger_app_shut_down = false;
-  RegisterShutdownCallback(
-      [&ledger_app_shut_down] { ledger_app_shut_down = true; });
-  ledger::Status status;
-  scoped_tmpfs::ScopedTmpFS tmpfs;
-
-  cloud_provider::CloudProviderPtr cloud_provider_ptr;
-  fidl::SynchronousInterfacePtr<ledger_internal::LedgerRepository>
-      ledger_repository;
-  ledger::FakeCloudProvider cloud_provider;
-  fidl::Binding<cloud_provider::CloudProvider> cloud_provider_binding(
-      &cloud_provider, cloud_provider_ptr.NewRequest());
-  ledger_repository_factory_->GetRepository(
-      fsl::CloneChannelFromFileDescriptor(tmpfs.root_fd()),
-      std::move(cloud_provider_ptr), "user_id", ledger_repository.NewRequest());
-
-  ledger_repository->GetLedger(TestArray(), ledger_.NewRequest());
-  ASSERT_EQ(ZX_OK, ledger_repository->Sync());
-
-  // Close the cloud provider channel.
-  cloud_provider_binding.Unbind();
-
-  // Write and read some data to verify that Ledger still works.
-  fidl::SynchronousInterfacePtr<ledger::Page> page;
-  status = ledger::Status::INTERNAL_ERROR;
-  ledger_->GetPage(nullptr, page.NewRequest(), &status);
-  ASSERT_EQ(ledger::Status::OK, status);
-  status = ledger::Status::INTERNAL_ERROR;
-  page->Put(TestArray(), TestArray(), &status);
-  EXPECT_EQ(ledger::Status::OK, status);
-  fidl::SynchronousInterfacePtr<ledger::PageSnapshot> snapshot;
-  status = ledger::Status::INTERNAL_ERROR;
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    nullptr, &status);
-  EXPECT_EQ(ledger::Status::OK, status);
-  fuchsia::mem::BufferPtr value;
-  status = ledger::Status::INTERNAL_ERROR;
-  snapshot->Get(TestArray(), &status, &value);
-  ASSERT_EQ(ledger::Status::OK, status);
-  std::string value_as_string;
-  EXPECT_TRUE(fsl::StringFromVmo(*value, &value_as_string));
-  EXPECT_TRUE(Equals(TestArray(), value_as_string));
-
-  // Verify that the Ledger app didn't crash or shut down.
-  EXPECT_TRUE(ledger_repository);
-  EXPECT_FALSE(ledger_app_shut_down);
-}
-
-TEST_F(LedgerEndToEndTest, HandleCloudProviderDisconnectBetweenReadAndWrite) {
-  Init({});
-  bool ledger_app_shut_down = false;
-  RegisterShutdownCallback(
-      [&ledger_app_shut_down] { ledger_app_shut_down = true; });
-  ledger::Status status;
-  scoped_tmpfs::ScopedTmpFS tmpfs;
-
-  cloud_provider::CloudProviderPtr cloud_provider_ptr;
-  fidl::SynchronousInterfacePtr<ledger_internal::LedgerRepository>
-      ledger_repository;
-  ledger::FakeCloudProvider cloud_provider;
-  fidl::Binding<cloud_provider::CloudProvider> cloud_provider_binding(
-      &cloud_provider, cloud_provider_ptr.NewRequest());
-  ledger_repository_factory_->GetRepository(
-      fsl::CloneChannelFromFileDescriptor(tmpfs.root_fd()),
-      std::move(cloud_provider_ptr), "user_id", ledger_repository.NewRequest());
-
-  ledger_repository->GetLedger(TestArray(), ledger_.NewRequest());
-  ASSERT_EQ(ZX_OK, ledger_repository->Sync());
-
-  // Write some data.
-  fidl::SynchronousInterfacePtr<ledger::Page> page;
-  status = ledger::Status::INTERNAL_ERROR;
-  ledger_->GetPage(nullptr, page.NewRequest(), &status);
-  ASSERT_EQ(ledger::Status::OK, status);
-  status = ledger::Status::INTERNAL_ERROR;
-  page->Put(TestArray(), TestArray(), &status);
-  EXPECT_EQ(ledger::Status::OK, status);
-
-  // Close the cloud provider channel.
-  cloud_provider_binding.Unbind();
-
-  // Read the data back.
-  fidl::SynchronousInterfacePtr<ledger::PageSnapshot> snapshot;
-  status = ledger::Status::INTERNAL_ERROR;
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    nullptr, &status);
-  EXPECT_EQ(ledger::Status::OK, status);
-  fuchsia::mem::BufferPtr value;
-  status = ledger::Status::INTERNAL_ERROR;
-  snapshot->Get(TestArray(), &status, &value);
-  ASSERT_EQ(ledger::Status::OK, status);
-  std::string value_as_string;
-  EXPECT_TRUE(fsl::StringFromVmo(*value, &value_as_string));
-  EXPECT_TRUE(Equals(TestArray(), value_as_string));
-
-  // Verify that the Ledger app didn't crash or shut down.
-  EXPECT_TRUE(ledger_repository);
-  EXPECT_FALSE(ledger_app_shut_down);
-}
-
-}  // namespace
-}  // namespace e2e_local
-}  // namespace test
diff --git a/bin/ledger/tests/e2e_sync/BUILD.gn b/bin/ledger/tests/e2e_sync/BUILD.gn
deleted file mode 100644
index 58bf24e..0000000
--- a/bin/ledger/tests/e2e_sync/BUILD.gn
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-executable("e2e_sync") {
-  output_name = "ledger_e2e_sync"
-  testonly = true
-
-  sources = [
-    "e2e_sync_main.cc",
-    "ledger_app_instance_factory_e2e.cc",
-    "ledger_app_instance_factory_e2e.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/cloud_provider_firestore/fidl",
-    "//peridot/bin/cloud_provider_firestore/testing",
-    "//peridot/bin/ledger/fidl_helpers",
-    "//peridot/bin/ledger/testing:ledger_instance_factory",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/bin/ledger/tests/integration/sync",
-    "//peridot/lib/convert",
-    "//peridot/lib/firebase_auth/testing",
-    "//peridot/lib/rng:system",
-    "//third_party/googletest:gtest",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/e2e_sync/README.md b/bin/ledger/tests/e2e_sync/README.md
deleted file mode 100644
index e6ee5fb..0000000
--- a/bin/ledger/tests/e2e_sync/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Synchronization tests
-
-This directory contains an "end-to-end" test suite for synchronization and needs a working Firebase instance to run correctly. It uses the synchronization tests from the integration test suite.
-
-To run this test suite, follow the instruction at [Synchronization tests]
-
-[Synchronization tests]: /docs/ledger/testing.md#synchronization-tests
diff --git a/bin/ledger/tests/e2e_sync/e2e_sync_main.cc b/bin/ledger/tests/e2e_sync/e2e_sync_main.cc
deleted file mode 100644
index 4ecdebe..0000000
--- a/bin/ledger/tests/e2e_sync/e2e_sync_main.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-
-#include <gtest/gtest.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/ledger/testing/loop_controller_real_loop.h"
-#include "peridot/bin/ledger/testing/sync_params.h"
-#include "peridot/bin/ledger/tests/e2e_sync/ledger_app_instance_factory_e2e.h"
-
-namespace ledger {
-namespace {
-SyncParams* sync_params_ptr = nullptr;
-
-class FactoryBuilderE2eImpl : public LedgerAppInstanceFactoryBuilder {
- public:
-  std::unique_ptr<LedgerAppInstanceFactory> NewFactory() const override {
-    return std::make_unique<LedgerAppInstanceFactoryImpl>(
-        std::make_unique<LoopControllerRealLoop>(), *sync_params_ptr);
-  }
-};
-
-int Main(int argc, char** argv) {
-  fxl::CommandLine command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  SyncParams sync_params;
-
-  {
-    async::Loop loop(&kAsyncLoopConfigAttachToThread);
-    auto startup_context = component::StartupContext::CreateFromStartupInfo();
-
-    if (!ParseSyncParamsFromCommandLine(command_line, startup_context.get(),
-                                        &sync_params)) {
-      std::cerr << GetSyncParamsUsage();
-      return -1;
-    }
-    sync_params_ptr = &sync_params;
-  }
-
-  testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
-
-}  // namespace
-
-std::vector<const LedgerAppInstanceFactoryBuilder*>
-GetLedgerAppInstanceFactoryBuilders() {
-  static auto static_builder = FactoryBuilderE2eImpl();
-  std::vector<const LedgerAppInstanceFactoryBuilder*> builders = {
-      &static_builder};
-  return builders;
-}
-
-}  // namespace ledger
-
-int main(int argc, char** argv) { return ledger::Main(argc, argv); }
diff --git a/bin/ledger/tests/e2e_sync/ledger_app_instance_factory_e2e.cc b/bin/ledger/tests/e2e_sync/ledger_app_instance_factory_e2e.cc
deleted file mode 100644
index a884718..0000000
--- a/bin/ledger/tests/e2e_sync/ledger_app_instance_factory_e2e.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/tests/e2e_sync/ledger_app_instance_factory_e2e.h"
-
-#include <utility>
-
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/strings/string_view.h>
-#include <lib/svc/cpp/services.h>
-
-#include "peridot/bin/cloud_provider_firestore/testing/cloud_provider_factory.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/fidl_helpers/bound_interface_set.h"
-#include "peridot/bin/ledger/testing/ledger_app_instance_factory.h"
-#include "peridot/bin/ledger/tests/e2e_sync/ledger_app_instance_factory_e2e.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/firebase_auth/testing/fake_token_manager.h"
-
-namespace ledger {
-namespace {
-constexpr fxl::StringView kLedgerName = "AppTests";
-
-class LedgerAppInstanceImpl final
-    : public LedgerAppInstanceFactory::LedgerAppInstance {
- public:
-  LedgerAppInstanceImpl(
-      LoopController* loop_controller, rng::Random* random,
-      ledger_internal::LedgerRepositoryFactoryPtr ledger_repository_factory,
-      SyncParams sync_params,
-      cloud_provider_firestore::CloudProviderFactory::UserId user_id);
-
-  void Init(fidl::InterfaceRequest<ledger_internal::LedgerRepositoryFactory>
-                repository_factory_request);
-
- private:
-  cloud_provider::CloudProviderPtr MakeCloudProvider() override;
-  std::string GetUserId() override;
-
-  SyncParams sync_params_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  cloud_provider_firestore::CloudProviderFactory cloud_provider_factory_;
-
-  fuchsia::sys::ComponentControllerPtr controller_;
-  const cloud_provider_firestore::CloudProviderFactory::UserId user_id_;
-};
-
-LedgerAppInstanceImpl::LedgerAppInstanceImpl(
-    LoopController* loop_controller, rng::Random* random,
-    ledger_internal::LedgerRepositoryFactoryPtr ledger_repository_factory,
-    SyncParams sync_params,
-    cloud_provider_firestore::CloudProviderFactory::UserId user_id)
-    : LedgerAppInstanceFactory::LedgerAppInstance(
-          loop_controller, convert::ToArray(kLedgerName),
-          std::move(ledger_repository_factory)),
-      sync_params_(sync_params),
-      startup_context_(component::StartupContext::CreateFromStartupInfo()),
-      cloud_provider_factory_(startup_context_.get(), random,
-                              std::move(sync_params.api_key),
-                              std::move(sync_params.credentials)),
-      user_id_(std::move(user_id)) {
-}
-
-void LedgerAppInstanceImpl::Init(
-    fidl::InterfaceRequest<ledger_internal::LedgerRepositoryFactory>
-        repository_factory_request) {
-  cloud_provider_factory_.Init();
-
-  component::Services child_services;
-  fuchsia::sys::LaunchInfo launch_info;
-  launch_info.url = "fuchsia-pkg://fuchsia.com/ledger#meta/ledger.cmx";
-  launch_info.directory_request = child_services.NewRequest();
-  launch_info.arguments.push_back("--disable_reporting");
-  launch_info.arguments.push_back("--firebase_api_key=" + sync_params_.api_key);
-
-  startup_context_->launcher()->CreateComponent(std::move(launch_info),
-                                                controller_.NewRequest());
-  child_services.ConnectToService(std::move(repository_factory_request));
-}
-
-cloud_provider::CloudProviderPtr LedgerAppInstanceImpl::MakeCloudProvider() {
-  cloud_provider::CloudProviderPtr cloud_provider;
-  cloud_provider_factory_.MakeCloudProvider(user_id_,
-                                            cloud_provider.NewRequest());
-  return cloud_provider;
-}
-
-std::string LedgerAppInstanceImpl::GetUserId() { return user_id_.user_id(); }
-
-}  // namespace
-
-LedgerAppInstanceFactoryImpl::LedgerAppInstanceFactoryImpl(
-    std::unique_ptr<LoopController> loop_controller, SyncParams sync_params)
-    : loop_controller_(std::move(loop_controller)),
-      sync_params_(std::move(sync_params)),
-      user_id_(cloud_provider_firestore::CloudProviderFactory::UserId::New()) {}
-
-LedgerAppInstanceFactoryImpl::~LedgerAppInstanceFactoryImpl() {}
-
-std::unique_ptr<LedgerAppInstanceFactory::LedgerAppInstance>
-LedgerAppInstanceFactoryImpl::NewLedgerAppInstance() {
-  ledger_internal::LedgerRepositoryFactoryPtr repository_factory;
-  fidl::InterfaceRequest<ledger_internal::LedgerRepositoryFactory>
-      repository_factory_request = repository_factory.NewRequest();
-  auto result = std::make_unique<LedgerAppInstanceImpl>(
-      loop_controller_.get(), &random_, std::move(repository_factory),
-      sync_params_, user_id_);
-  result->Init(std::move(repository_factory_request));
-  return result;
-}
-
-LoopController* LedgerAppInstanceFactoryImpl::GetLoopController() {
-  return loop_controller_.get();
-}
-
-rng::Random* LedgerAppInstanceFactoryImpl::GetRandom() { return &random_; }
-
-}  // namespace ledger
diff --git a/bin/ledger/tests/e2e_sync/ledger_app_instance_factory_e2e.h b/bin/ledger/tests/e2e_sync/ledger_app_instance_factory_e2e.h
deleted file mode 100644
index 6d1c894..0000000
--- a/bin/ledger/tests/e2e_sync/ledger_app_instance_factory_e2e.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTS_E2E_SYNC_LEDGER_APP_INSTANCE_FACTORY_E2E_H_
-#define PERIDOT_BIN_LEDGER_TESTS_E2E_SYNC_LEDGER_APP_INSTANCE_FACTORY_E2E_H_
-
-#include <memory>
-#include <string>
-
-#include "peridot/bin/cloud_provider_firestore/testing/cloud_provider_factory.h"
-#include "peridot/bin/ledger/testing/ledger_app_instance_factory.h"
-#include "peridot/bin/ledger/testing/sync_params.h"
-#include "peridot/lib/rng/system_random.h"
-
-namespace ledger {
-
-class LedgerAppInstanceFactoryImpl : public LedgerAppInstanceFactory {
- public:
-  explicit LedgerAppInstanceFactoryImpl(
-      std::unique_ptr<LoopController> loop_controller, SyncParams sync_params);
-  ~LedgerAppInstanceFactoryImpl() override;
-
-  std::unique_ptr<LedgerAppInstance> NewLedgerAppInstance() override;
-  LoopController* GetLoopController() override;
-  rng::Random* GetRandom() override;
-
- private:
-  std::unique_ptr<LoopController> loop_controller_;
-  rng::SystemRandom random_;
-  const SyncParams sync_params_;
-  const cloud_provider_firestore::CloudProviderFactory::UserId user_id_;
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTS_E2E_SYNC_LEDGER_APP_INSTANCE_FACTORY_E2E_H_
diff --git a/bin/ledger/tests/e2e_sync/ledger_e2e_sync.cmx b/bin/ledger/tests/e2e_sync/ledger_e2e_sync.cmx
deleted file mode 100644
index a782c4f..0000000
--- a/bin/ledger/tests/e2e_sync/ledger_e2e_sync.cmx
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "facets": {
-        "fuchsia.test": {
-            "injected-services": {
-                "fuchsia.net.oldhttp.HttpService": "http"
-            },
-            "system-services": [
-                "fuchsia.net.SocketProvider",
-                "fuchsia.netstack.Netstack",
-                "fuchsia.net.stack.Stack"
-            ]
-        }
-    },
-    "program": {
-        "binary": "test/disabled/ledger_e2e_sync"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.sys.Launcher",
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.tracelink.Registry"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/integration/BUILD.gn b/bin/ledger/tests/integration/BUILD.gn
deleted file mode 100644
index 802d68f..0000000
--- a/bin/ledger/tests/integration/BUILD.gn
+++ /dev/null
@@ -1,83 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-executable("integration") {
-  output_name = "ledger_integration_tests"
-
-  testonly = true
-
-  sources = [
-    "integration_test_tests.cc",
-    "ledger_app_instance_factory_integration.cc",
-    "merging_tests.cc",
-    "page_mutation_tests.cc",
-    "page_snapshot_tests.cc",
-    "page_tests.cc",
-    "page_watcher_tests.cc",
-  ]
-
-  deps = [
-    ":integration_lib",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/component/cpp/testing",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/timekeeper:testing",
-    "//peridot/bin/ledger/app:lib",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/bin/ledger/fidl:error_notifier",
-    "//peridot/bin/ledger/p2p_provider/impl",
-    "//peridot/bin/ledger/p2p_provider/public",
-    "//peridot/bin/ledger/p2p_sync/impl",
-    "//peridot/bin/ledger/p2p_sync/public",
-    "//peridot/bin/ledger/storage/fake:lib",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/bin/ledger/testing:ledger_instance_factory",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/bin/ledger/testing/cloud_provider",
-    "//peridot/bin/ledger/testing/netconnector",
-    "//peridot/bin/ledger/tests/integration/sync",
-    "//peridot/lib/convert",
-    "//peridot/lib/firebase_auth/testing",
-    "//peridot/lib/socket",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//third_party/googletest:gtest_main",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("integration_lib") {
-  testonly = true
-
-  sources = [
-    "integration_test.cc",
-    "integration_test.h",
-    "test_utils.cc",
-    "test_utils.h",
-  ]
-
-  deps = [
-    "//peridot/lib/convert",
-    "//peridot/lib/socket",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/bin/ledger/testing:ledger_instance_factory",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//third_party/googletest:gtest",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/async-testutils",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/integration/integration_test.cc b/bin/ledger/tests/integration/integration_test.cc
deleted file mode 100644
index 2509e60..0000000
--- a/bin/ledger/tests/integration/integration_test.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/tests/integration/integration_test.h"
-
-#include <lib/async/cpp/task.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-
-#include "peridot/bin/ledger/tests/integration/test_utils.h"
-#include "peridot/lib/socket/socket_pair.h"
-#include "peridot/lib/socket/socket_writer.h"
-
-namespace ledger {
-
-BaseIntegrationTest::BaseIntegrationTest(
-    const LedgerAppInstanceFactoryBuilder* factory_builder)
-    : factory_builder_(factory_builder) {}
-
-BaseIntegrationTest::~BaseIntegrationTest() = default;
-
-void BaseIntegrationTest::SetUp() {
-  ::testing::Test::SetUp();
-  factory_ = factory_builder_->NewFactory();
-  trace_provider_ = std::make_unique<trace::TraceProvider>(dispatcher());
-  services_loop_ = GetLoopController()->StartNewLoop();
-}
-
-void BaseIntegrationTest::TearDown() {
-  services_loop_.reset();
-  ::testing::Test::TearDown();
-}
-
-void BaseIntegrationTest::RunLoop() { GetLoopController()->RunLoop(); }
-
-void BaseIntegrationTest::StopLoop() { GetLoopController()->StopLoop(); }
-
-std::unique_ptr<SubLoop> BaseIntegrationTest::StartNewLoop() {
-  return GetLoopController()->StartNewLoop();
-}
-
-std::unique_ptr<CallbackWaiter> BaseIntegrationTest::NewWaiter() {
-  return GetLoopController()->NewWaiter();
-}
-
-async_dispatcher_t* BaseIntegrationTest::dispatcher() {
-  return GetLoopController()->dispatcher();
-}
-
-bool BaseIntegrationTest::RunLoopUntil(fit::function<bool()> condition) {
-  return GetLoopController()->RunLoopUntil(std::move(condition));
-}
-
-void BaseIntegrationTest::RunLoopFor(zx::duration duration) {
-  GetLoopController()->RunLoopFor(duration);
-}
-
-zx::socket BaseIntegrationTest::StreamDataToSocket(std::string data) {
-  socket::SocketPair sockets;
-  async::PostTask(
-      services_loop_->dispatcher(),
-      [socket = std::move(sockets.socket1), data = std::move(data)]() mutable {
-        auto writer = new socket::StringSocketWriter();
-        writer->Start(std::move(data), std::move(socket));
-      });
-  return std::move(sockets.socket2);
-}
-
-std::unique_ptr<LedgerAppInstanceFactory::LedgerAppInstance>
-BaseIntegrationTest::NewLedgerAppInstance() {
-  return GetAppFactory()->NewLedgerAppInstance();
-}
-
-LedgerAppInstanceFactory* BaseIntegrationTest::GetAppFactory() {
-  FXL_DCHECK(factory_) << "|SetUp| has not been called.";
-  return factory_.get();
-}
-
-LoopController* BaseIntegrationTest::GetLoopController() {
-  return GetAppFactory()->GetLoopController();
-}
-
-rng::Random* BaseIntegrationTest::GetRandom() {
-  return GetAppFactory()->GetRandom();
-}
-
-IntegrationTest::IntegrationTest() : BaseIntegrationTest(GetParam()) {}
-
-IntegrationTest::~IntegrationTest() = default;
-
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/integration_test.h b/bin/ledger/tests/integration/integration_test.h
deleted file mode 100644
index 1e2972e..0000000
--- a/bin/ledger/tests/integration/integration_test.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTS_INTEGRATION_INTEGRATION_TEST_H_
-#define PERIDOT_BIN_LEDGER_TESTS_INTEGRATION_INTEGRATION_TEST_H_
-
-#include <functional>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/real_loop_fixture.h>
-#include <trace-provider/provider.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/testing/ledger_app_instance_factory.h"
-
-namespace ledger {
-
-// Base class for integration tests.
-//
-// Integration tests verify interactions with client-facing FIDL services
-// exposed by Ledger. The FIDL services are run within the test process, on a
-// separate thread.
-class BaseIntegrationTest : public ::testing::Test, public LoopController {
- public:
-  explicit BaseIntegrationTest(
-      const LedgerAppInstanceFactoryBuilder* factory_builder);
-  ~BaseIntegrationTest() override;
-
-  BaseIntegrationTest(const BaseIntegrationTest&) = delete;
-  BaseIntegrationTest(BaseIntegrationTest&&) = delete;
-  BaseIntegrationTest& operator=(const BaseIntegrationTest&) = delete;
-  BaseIntegrationTest& operator=(BaseIntegrationTest&&) = delete;
-
-  // LoopController:
-  void RunLoop() override;
-  void StopLoop() override;
-  std::unique_ptr<SubLoop> StartNewLoop() override;
-  std::unique_ptr<CallbackWaiter> NewWaiter() override;
-  async_dispatcher_t* dispatcher() override;
-  bool RunLoopUntil(fit::function<bool()> condition) override;
-  void RunLoopFor(zx::duration duration) override;
-
- protected:
-  // ::testing::Test:
-  void SetUp() override;
-  void TearDown() override;
-
-  zx::socket StreamDataToSocket(std::string data);
-
-  std::unique_ptr<LedgerAppInstanceFactory::LedgerAppInstance>
-  NewLedgerAppInstance();
-
-  LedgerAppInstanceFactory* GetAppFactory();
-
-  LoopController* GetLoopController();
-
-  rng::Random* GetRandom();
-
- private:
-  const LedgerAppInstanceFactoryBuilder* factory_builder_;
-  std::unique_ptr<LedgerAppInstanceFactory> factory_;
-  // Loop used to run network service and token provider tasks.
-  std::unique_ptr<SubLoop> services_loop_;
-  std::unique_ptr<trace::TraceProvider> trace_provider_;
-};
-
-class IntegrationTest : public BaseIntegrationTest,
-                        public ::testing::WithParamInterface<
-                            const LedgerAppInstanceFactoryBuilder*> {
- public:
-  IntegrationTest();
-  ~IntegrationTest() override;
-};
-
-// Initializes test environment based on the command line arguments.
-//
-// Returns true iff the initialization was successful.
-bool ProcessCommandLine(int argc, char** argv);
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTS_INTEGRATION_INTEGRATION_TEST_H_
diff --git a/bin/ledger/tests/integration/integration_test_tests.cc b/bin/ledger/tests/integration/integration_test_tests.cc
deleted file mode 100644
index 5e536ac..0000000
--- a/bin/ledger/tests/integration/integration_test_tests.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-#include <vector>
-
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/tests/integration/integration_test.h"
-#include "peridot/bin/ledger/tests/integration/test_utils.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-class IntegrationTestTests : public IntegrationTest {};
-
-TEST_P(IntegrationTestTests, MultipleLedgerAppInstances) {
-  auto instance1 = NewLedgerAppInstance();
-  auto instance2 = NewLedgerAppInstance();
-
-  EXPECT_TRUE(instance1->GetTestLedger());
-  EXPECT_TRUE(instance2->GetTestLedger());
-}
-
-INSTANTIATE_TEST_CASE_P(
-    IntegrationTestTests, IntegrationTestTests,
-    ::testing::ValuesIn(GetLedgerAppInstanceFactoryBuilders()));
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/ledger_app_instance_factory_integration.cc b/bin/ledger/tests/integration/ledger_app_instance_factory_integration.cc
deleted file mode 100644
index de173e5..0000000
--- a/bin/ledger/tests/integration/ledger_app_instance_factory_integration.cc
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <string>
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/backoff/exponential_backoff.h>
-#include <lib/component/cpp/testing/startup_context_for_test.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/handles/object_info.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/timekeeper/test_loop_test_clock.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/ledger_repository_factory_impl.h"
-#include "peridot/bin/ledger/fidl/error_notifier.h"
-#include "peridot/bin/ledger/fidl_helpers/bound_interface_set.h"
-#include "peridot/bin/ledger/p2p_provider/impl/p2p_provider_impl.h"
-#include "peridot/bin/ledger/p2p_sync/impl/user_communicator_impl.h"
-#include "peridot/bin/ledger/p2p_sync/public/user_communicator_factory.h"
-#include "peridot/bin/ledger/testing/cloud_provider/fake_cloud_provider.h"
-#include "peridot/bin/ledger/testing/cloud_provider/types.h"
-#include "peridot/bin/ledger/testing/ledger_app_instance_factory.h"
-#include "peridot/bin/ledger/testing/loop_controller_test_loop.h"
-#include "peridot/bin/ledger/testing/netconnector/netconnector_factory.h"
-#include "peridot/bin/ledger/tests/integration/test_utils.h"
-#include "peridot/lib/rng/random.h"
-#include "peridot/lib/rng/test_random.h"
-#include "peridot/lib/socket/socket_pair.h"
-#include "peridot/lib/socket/socket_writer.h"
-
-namespace ledger {
-namespace {
-
-constexpr fxl::StringView kLedgerName = "AppTests";
-constexpr zx::duration kBackoffDuration = zx::msec(5);
-const char kUserId[] = "user";
-
-// Implementation of rng::Random that delegates to another instance. This is
-// needed because EnvironmentBuilder requires taking ownership of the random
-// implementation.
-class DelegatedRandom final : public rng::Random {
- public:
-  DelegatedRandom(rng::Random* base) : base_(base) {}
-  ~DelegatedRandom() override = default;
-
- private:
-  void InternalDraw(void* buffer, size_t buffer_size) {
-    base_->Draw(buffer, buffer_size);
-  }
-
-  rng::Random* base_;
-};
-
-Environment BuildEnvironment(async::TestLoop* loop,
-                             async_dispatcher_t* dispatcher,
-                             async_dispatcher_t* io_dispatcher,
-                             component::StartupContext* startup_context,
-                             rng::Random* random) {
-  return EnvironmentBuilder()
-      .SetAsync(dispatcher)
-      .SetIOAsync(io_dispatcher)
-      .SetStartupContext(startup_context)
-      .SetBackoffFactory([random] {
-        return std::make_unique<backoff::ExponentialBackoff>(
-            kBackoffDuration, 1u, kBackoffDuration,
-            random->NewBitGenerator<uint64_t>());
-      })
-      .SetClock(std::make_unique<timekeeper::TestLoopTestClock>(loop))
-      .SetRandom(std::make_unique<DelegatedRandom>(random))
-      .Build();
-}
-
-class LedgerAppInstanceImpl final
-    : public LedgerAppInstanceFactory::LedgerAppInstance {
- public:
-  LedgerAppInstanceImpl(
-      LoopControllerTestLoop* loop_controller,
-      async_dispatcher_t* services_dispatcher, rng::Random* random,
-      fidl::InterfaceRequest<ledger_internal::LedgerRepositoryFactory>
-          repository_factory_request,
-      fidl::InterfacePtr<ledger_internal::LedgerRepositoryFactory>
-          repository_factory_ptr,
-      fidl_helpers::BoundInterfaceSet<cloud_provider::CloudProvider,
-                                      FakeCloudProvider>* cloud_provider,
-      std::unique_ptr<p2p_sync::UserCommunicatorFactory>
-          user_communicator_factory);
-  ~LedgerAppInstanceImpl() override;
-
- private:
-  class LedgerRepositoryFactoryContainer {
-   public:
-    LedgerRepositoryFactoryContainer(
-        async::TestLoop* loop, async_dispatcher_t* dispatcher,
-        async_dispatcher_t* io_dispatcher, rng::Random* random,
-        fidl::InterfaceRequest<ledger_internal::LedgerRepositoryFactory>
-            request,
-        std::unique_ptr<p2p_sync::UserCommunicatorFactory>
-            user_communicator_factory)
-        : startup_context_(component::testing::StartupContextForTest::Create()),
-          environment_(BuildEnvironment(loop, dispatcher, io_dispatcher,
-                                        startup_context_.get(), random)),
-          factory_impl_(&environment_, std::move(user_communicator_factory),
-                        component::ObjectDir()),
-          binding_(&factory_impl_, std::move(request)) {}
-    ~LedgerRepositoryFactoryContainer() {}
-
-   private:
-    std::unique_ptr<component::StartupContext> startup_context_;
-    Environment environment_;
-    LedgerRepositoryFactoryImpl factory_impl_;
-    ErrorNotifierBinding<
-        fuchsia::ledger::internal::LedgerRepositoryFactoryErrorNotifierDelegate>
-        binding_;
-
-    FXL_DISALLOW_COPY_AND_ASSIGN(LedgerRepositoryFactoryContainer);
-  };
-
-  cloud_provider::CloudProviderPtr MakeCloudProvider() override;
-  std::string GetUserId() override;
-
-  std::unique_ptr<SubLoop> loop_;
-  std::unique_ptr<SubLoop> io_loop_;
-  std::unique_ptr<LedgerRepositoryFactoryContainer> factory_container_;
-  async_dispatcher_t* services_dispatcher_;
-  fidl_helpers::BoundInterfaceSet<cloud_provider::CloudProvider,
-                                  FakeCloudProvider>* const cloud_provider_;
-
-  // This must be the last field of this class.
-  fxl::WeakPtrFactory<LedgerAppInstanceImpl> weak_ptr_factory_;
-};
-
-LedgerAppInstanceImpl::LedgerAppInstanceImpl(
-    LoopControllerTestLoop* loop_controller,
-    async_dispatcher_t* services_dispatcher, rng::Random* random,
-    fidl::InterfaceRequest<ledger_internal::LedgerRepositoryFactory>
-        repository_factory_request,
-    fidl::InterfacePtr<ledger_internal::LedgerRepositoryFactory>
-        repository_factory_ptr,
-    fidl_helpers::BoundInterfaceSet<cloud_provider::CloudProvider,
-                                    FakeCloudProvider>* cloud_provider,
-    std::unique_ptr<p2p_sync::UserCommunicatorFactory>
-        user_communicator_factory)
-    : LedgerAppInstanceFactory::LedgerAppInstance(
-          loop_controller, convert::ToArray(kLedgerName),
-          std::move(repository_factory_ptr)),
-      loop_(loop_controller->StartNewLoop()),
-      io_loop_(loop_controller->StartNewLoop()),
-      services_dispatcher_(services_dispatcher),
-      cloud_provider_(cloud_provider),
-      weak_ptr_factory_(this) {
-  async::PostTask(loop_->dispatcher(),
-                  [this, loop_controller, random,
-                   request = std::move(repository_factory_request),
-                   user_communicator_factory =
-                       std::move(user_communicator_factory)]() mutable {
-                    factory_container_ =
-                        std::make_unique<LedgerRepositoryFactoryContainer>(
-                            &loop_controller->test_loop(), loop_->dispatcher(),
-                            io_loop_->dispatcher(), random, std::move(request),
-                            std::move(user_communicator_factory));
-                  });
-}
-
-cloud_provider::CloudProviderPtr LedgerAppInstanceImpl::MakeCloudProvider() {
-  cloud_provider::CloudProviderPtr cloud_provider;
-  async::PostTask(services_dispatcher_,
-                  callback::MakeScoped(
-                      weak_ptr_factory_.GetWeakPtr(),
-                      [this, request = cloud_provider.NewRequest()]() mutable {
-                        cloud_provider_->AddBinding(std::move(request));
-                      }));
-  return cloud_provider;
-}
-
-std::string LedgerAppInstanceImpl::GetUserId() { return kUserId; }
-
-LedgerAppInstanceImpl::~LedgerAppInstanceImpl() {
-  async::PostTask(loop_->dispatcher(), [this] { factory_container_.reset(); });
-  loop_->DrainAndQuit();
-  loop_.release();
-}
-
-class FakeUserCommunicatorFactory : public p2p_sync::UserCommunicatorFactory {
- public:
-  FakeUserCommunicatorFactory(async::TestLoop* loop,
-                              async_dispatcher_t* services_dispatcher,
-                              rng::Random* random,
-                              NetConnectorFactory* netconnector_factory,
-                              std::string host_name)
-      : services_dispatcher_(services_dispatcher),
-        startup_context_(component::testing::StartupContextForTest::Create()),
-        environment_(BuildEnvironment(loop, services_dispatcher,
-                                      services_dispatcher,
-                                      startup_context_.get(), random)),
-        netconnector_factory_(netconnector_factory),
-        host_name_(std::move(host_name)),
-        weak_ptr_factory_(this) {}
-  ~FakeUserCommunicatorFactory() override {}
-
-  std::unique_ptr<p2p_sync::UserCommunicator> GetUserCommunicator(
-      std::unique_ptr<p2p_provider::UserIdProvider> user_id_provider) override {
-    fuchsia::netconnector::NetConnectorPtr netconnector;
-    async::PostTask(services_dispatcher_,
-                    callback::MakeScoped(
-                        weak_ptr_factory_.GetWeakPtr(),
-                        [this, request = netconnector.NewRequest()]() mutable {
-                          netconnector_factory_->AddBinding(host_name_,
-                                                            std::move(request));
-                        }));
-    std::unique_ptr<p2p_provider::P2PProvider> provider =
-        std::make_unique<p2p_provider::P2PProviderImpl>(
-            host_name_, std::move(netconnector), std::move(user_id_provider));
-    return std::make_unique<p2p_sync::UserCommunicatorImpl>(
-        std::move(provider), environment_.coroutine_service());
-  }
-
- private:
-  async_dispatcher_t* const services_dispatcher_;
-  std::unique_ptr<component::StartupContext> startup_context_;
-  Environment environment_;
-  NetConnectorFactory* const netconnector_factory_;
-  std::string host_name_;
-
-  // This must be the last field of this class.
-  fxl::WeakPtrFactory<FakeUserCommunicatorFactory> weak_ptr_factory_;
-};
-
-enum EnableP2PMesh { NO, YES };
-
-}  // namespace
-
-class LedgerAppInstanceFactoryImpl : public LedgerAppInstanceFactory {
- public:
-  LedgerAppInstanceFactoryImpl(InjectNetworkError inject_network_error,
-                               EnableP2PMesh enable_p2p_mesh)
-      : loop_controller_(&loop_),
-        random_(loop_.initial_state()),
-        services_loop_(loop_controller_.StartNewLoop()),
-        cloud_provider_(FakeCloudProvider::Builder().SetInjectNetworkError(
-            inject_network_error)),
-        enable_p2p_mesh_(enable_p2p_mesh) {}
-  ~LedgerAppInstanceFactoryImpl() override;
-
-  std::unique_ptr<LedgerAppInstance> NewLedgerAppInstance() override;
-
-  LoopController* GetLoopController() override;
-
-  rng::Random* GetRandom() override;
-
- private:
-  async::TestLoop loop_;
-  LoopControllerTestLoop loop_controller_;
-  rng::TestRandom random_;
-  // Loop on which to run services.
-  std::unique_ptr<SubLoop> services_loop_;
-  fidl_helpers::BoundInterfaceSet<cloud_provider::CloudProvider,
-                                  FakeCloudProvider>
-      cloud_provider_;
-  int app_instance_counter_ = 0;
-  NetConnectorFactory netconnector_factory_;
-  const EnableP2PMesh enable_p2p_mesh_;
-};
-
-LedgerAppInstanceFactoryImpl::~LedgerAppInstanceFactoryImpl() {
-  services_loop_->DrainAndQuit();
-  services_loop_.reset();
-}
-
-std::unique_ptr<LedgerAppInstanceFactory::LedgerAppInstance>
-LedgerAppInstanceFactoryImpl::NewLedgerAppInstance() {
-  ledger_internal::LedgerRepositoryFactoryPtr repository_factory_ptr;
-  fidl::InterfaceRequest<ledger_internal::LedgerRepositoryFactory>
-      repository_factory_request = repository_factory_ptr.NewRequest();
-
-  std::unique_ptr<p2p_sync::UserCommunicatorFactory> user_communicator_factory;
-  if (enable_p2p_mesh_ == EnableP2PMesh::YES) {
-    std::string host_name = "host_" + std::to_string(app_instance_counter_);
-    user_communicator_factory = std::make_unique<FakeUserCommunicatorFactory>(
-        &loop_controller_.test_loop(), services_loop_->dispatcher(), &random_,
-        &netconnector_factory_, std::move(host_name));
-  }
-  auto result = std::make_unique<LedgerAppInstanceImpl>(
-      &loop_controller_, services_loop_->dispatcher(), &random_,
-      std::move(repository_factory_request), std::move(repository_factory_ptr),
-      &cloud_provider_, std::move(user_communicator_factory));
-  app_instance_counter_++;
-  return result;
-}
-
-LoopController* LedgerAppInstanceFactoryImpl::GetLoopController() {
-  return &loop_controller_;
-}
-
-rng::Random* LedgerAppInstanceFactoryImpl::GetRandom() { return &random_; }
-
-namespace {
-
-class FactoryBuilderIntegrationImpl : public LedgerAppInstanceFactoryBuilder {
- public:
-  FactoryBuilderIntegrationImpl(InjectNetworkError inject_error,
-                                EnableP2PMesh enable_p2p)
-      : inject_error_(inject_error), enable_p2p_(enable_p2p){};
-
-  std::unique_ptr<LedgerAppInstanceFactory> NewFactory() const override {
-    return std::make_unique<LedgerAppInstanceFactoryImpl>(inject_error_,
-                                                          enable_p2p_);
-  }
-
- private:
-  InjectNetworkError inject_error_;
-  EnableP2PMesh enable_p2p_;
-};
-
-}  // namespace
-
-std::vector<const LedgerAppInstanceFactoryBuilder*>
-GetLedgerAppInstanceFactoryBuilders() {
-  static std::vector<std::unique_ptr<FactoryBuilderIntegrationImpl>>
-      static_builders;
-  static std::once_flag flag;
-
-  auto static_builders_ptr = &static_builders;
-  std::call_once(flag, [&static_builders_ptr] {
-    for (auto inject_error :
-         {InjectNetworkError::NO, InjectNetworkError::YES}) {
-      for (auto enable_p2p : {EnableP2PMesh::NO, EnableP2PMesh::YES}) {
-        if (enable_p2p == EnableP2PMesh::YES &&
-            inject_error != InjectNetworkError::YES) {
-          // Only enable p2p when cloud has errors. This helps ensure our tests
-          // are fast enough for the CQ.
-          continue;
-        }
-        static_builders_ptr->push_back(
-            std::make_unique<FactoryBuilderIntegrationImpl>(inject_error,
-                                                            enable_p2p));
-      }
-    }
-  });
-
-  std::vector<const LedgerAppInstanceFactoryBuilder*> builders;
-
-  for (const auto& builder : static_builders) {
-    builders.push_back(builder.get());
-  }
-
-  return builders;
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/ledger_integration_tests.cmx b/bin/ledger/tests/integration/ledger_integration_tests.cmx
deleted file mode 100644
index 5f7761c..0000000
--- a/bin/ledger/tests/integration/ledger_integration_tests.cmx
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "program": {
-        "binary": "test/ledger_integration_tests"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.tracelink.Registry"
-        ]
-    }
-}
diff --git a/bin/ledger/tests/integration/merging_tests.cc b/bin/ledger/tests/integration/merging_tests.cc
deleted file mode 100644
index 852d79f..0000000
--- a/bin/ledger/tests/integration/merging_tests.cc
+++ /dev/null
@@ -1,2298 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <map>
-#include <utility>
-#include <vector>
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/callback/capture.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/sized_vmo.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/bin/ledger/tests/integration/integration_test.h"
-#include "peridot/bin/ledger/tests/integration/test_utils.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-class MergingIntegrationTest : public IntegrationTest {
- public:
-  MergingIntegrationTest() {}
-  ~MergingIntegrationTest() override {}
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(MergingIntegrationTest);
-};
-
-class Watcher : public PageWatcher {
- public:
-  Watcher(fidl::InterfaceRequest<PageWatcher> request,
-          fit::closure change_callback)
-      : binding_(this, std::move(request)),
-        change_callback_(std::move(change_callback)) {}
-
-  uint changes_seen = 0;
-  PageSnapshotPtr last_snapshot_;
-  PageChange last_page_change_;
-
- private:
-  // PageWatcher:
-  void OnChange(PageChange page_change, ResultState result_state,
-                OnChangeCallback callback) override {
-    FXL_DCHECK(result_state == ResultState::COMPLETED)
-        << "Handling OnChange pagination not implemented yet";
-    changes_seen++;
-    last_page_change_ = std::move(page_change);
-    last_snapshot_.Unbind();
-    callback(last_snapshot_.NewRequest());
-    change_callback_();
-  }
-
-  fidl::Binding<PageWatcher> binding_;
-  fit::closure change_callback_;
-};
-
-enum class MergeType {
-  SIMPLE,
-  MULTIPART,
-};
-
-class ConflictResolverImpl : public ConflictResolver {
- public:
-  explicit ConflictResolverImpl(
-      LoopController* loop_controller,
-      fidl::InterfaceRequest<ConflictResolver> request)
-      : loop_controller_(loop_controller),
-        resolve_waiter_(loop_controller->NewWaiter()),
-        binding_(this, std::move(request)) {
-    binding_.set_error_handler(callback::Capture([] {}, &disconnected));
-  }
-  ~ConflictResolverImpl() override {}
-
-  struct ResolveRequest {
-    fidl::InterfaceHandle<PageSnapshot> left_version;
-    fidl::InterfaceHandle<PageSnapshot> right_version;
-    fidl::InterfaceHandle<PageSnapshot> common_version;
-    MergeResultProviderPtr result_provider;
-    zx_status_t result_provider_status = ZX_OK;
-
-    ResolveRequest(LoopController* loop_controller,
-                   fidl::InterfaceHandle<PageSnapshot> left_version,
-                   fidl::InterfaceHandle<PageSnapshot> right_version,
-                   fidl::InterfaceHandle<PageSnapshot> common_version,
-                   fidl::InterfaceHandle<MergeResultProvider> result_provider)
-        : left_version(std::move(left_version)),
-          right_version(std::move(right_version)),
-          common_version(std::move(common_version)),
-          result_provider(result_provider.Bind()),
-          disconnect_waiter_(loop_controller->NewWaiter()),
-          loop_controller_(loop_controller) {
-      this->result_provider.set_error_handler(callback::Capture(
-          disconnect_waiter_->GetCallback(), &result_provider_status));
-    }
-
-    // Returns the full list of changes.
-    // Returns the full list of changes between branches and makes sure that at
-    // least |min_queries| of partial results are returned before retrieving the
-    // complete result for the left and for the right changes.
-    ::testing::AssertionResult GetFullDiff(std::vector<DiffEntry>* entries,
-                                           size_t min_queries = 0) {
-      return GetDiff(
-          [this](std::unique_ptr<Token> token,
-                 fit::function<void(IterationStatus, std::vector<DiffEntry>,
-                                    std::unique_ptr<Token>)>
-                     callback) mutable {
-            result_provider->GetFullDiffNew(std::move(token),
-                                            std::move(callback));
-          },
-          entries, min_queries);
-    }
-
-    ::testing::AssertionResult GetConflictingDiff(
-        std::vector<DiffEntry>* entries, size_t min_queries = 0) {
-      return GetDiff(
-          [this](std::unique_ptr<Token> token,
-                 fit::function<void(IterationStatus, std::vector<DiffEntry>,
-                                    std::unique_ptr<Token>)>
-                     callback) mutable {
-            result_provider->GetConflictingDiffNew(std::move(token),
-                                                   std::move(callback));
-          },
-          entries, min_queries);
-    }
-
-    // Resolves the conflict by sending the given merge results. If
-    // |merge_type| is MULTIPART, the merge will be send in two parts, each
-    // sending half of |results|' elements.
-    ::testing::AssertionResult Merge(std::vector<MergedValue> results,
-                                     MergeType merge_type = MergeType::SIMPLE) {
-      FXL_DCHECK(merge_type == MergeType::SIMPLE || results.size() >= 2);
-
-      if (!result_provider) {
-        return ::testing::AssertionFailure()
-               << "Merge failed: result_provider is disconnected.";
-      }
-
-      if (merge_type == MergeType::SIMPLE) {
-        ::testing::AssertionResult merge_status =
-            PartialMerge(std::move(results));
-        if (!merge_status) {
-          return merge_status;
-        }
-      } else {
-        size_t part1_size = results.size() / 2;
-        std::vector<MergedValue> part2;
-        for (size_t i = part1_size; i < results.size(); ++i) {
-          part2.push_back(std::move(results.at(i)));
-        }
-        results.resize(part1_size);
-
-        ::testing::AssertionResult merge_status =
-            PartialMerge(std::move(results));
-        if (!merge_status) {
-          return merge_status;
-        }
-        merge_status = PartialMerge(std::move(part2));
-        if (!merge_status) {
-          return merge_status;
-        }
-      }
-
-      result_provider->DoneNew();
-      return RunUntilDisconnected();
-    }
-
-    ::testing::AssertionResult MergeNonConflictingEntries() {
-      result_provider->MergeNonConflictingEntriesNew();
-      return Sync();
-    }
-
-   private:
-    ::testing::AssertionResult Sync() {
-      auto waiter = loop_controller_->NewWaiter();
-      result_provider->Sync(waiter->GetCallback());
-      if (!waiter->RunUntilCalled()) {
-        // Printing the |result_provider_status| in case the issue is that the
-        // object has been disconnected.
-        return ::testing::AssertionFailure()
-               << "|Sync| failed to called back. Error provider status: "
-               << result_provider_status;
-      }
-      return ::testing::AssertionSuccess();
-    }
-
-    ::testing::AssertionResult RunUntilDisconnected() {
-      if (!disconnect_waiter_->RunUntilCalled()) {
-        return ::testing::AssertionFailure()
-               << "Timeout while waiting for the ConflictResolver to be "
-                  "disconnected from the ResultProvider.";
-      }
-      return ::testing::AssertionSuccess();
-    }
-
-    ::testing::AssertionResult GetDiff(
-        fit::function<
-            void(std::unique_ptr<Token>,
-                 fit::function<void(IterationStatus, std::vector<DiffEntry>,
-                                    std::unique_ptr<Token>)>)>
-            get_diff,
-        std::vector<DiffEntry>* entries, size_t min_queries) {
-      entries->resize(0);
-      size_t num_queries = 0u;
-      std::unique_ptr<Token> token;
-      do {
-        std::vector<DiffEntry> new_entries;
-        IterationStatus status;
-        auto waiter = loop_controller_->NewWaiter();
-        std::unique_ptr<Token> new_token;
-        get_diff(std::move(token),
-                 callback::Capture(waiter->GetCallback(), &status, &new_entries,
-                                   &new_token));
-        if (!waiter->RunUntilCalled()) {
-          return ::testing::AssertionFailure()
-                 << "|get_diff| failed to called back.";
-        }
-        token = std::move(new_token);
-        if (!token != (status == IterationStatus::OK)) {
-          return ::testing::AssertionFailure()
-                 << "token is "
-                 << (token ? convert::ToString(token->opaque_id) : "null")
-                 << ", but status is:" << fidl::ToUnderlying(status);
-        }
-        entries->insert(entries->end(),
-                        std::make_move_iterator(new_entries.begin()),
-                        std::make_move_iterator(new_entries.end()));
-        ++num_queries;
-      } while (token);
-
-      if (num_queries < min_queries) {
-        return ::testing::AssertionFailure()
-               << "Only " << num_queries
-               << " partial results were found, but at least " << min_queries
-               << " were expected";
-      }
-      return ::testing::AssertionSuccess();
-    }
-
-    ::testing::AssertionResult PartialMerge(
-        std::vector<MergedValue> partial_result) {
-      result_provider->MergeNew(std::move(partial_result));
-      return Sync();
-    }
-
-    std::unique_ptr<CallbackWaiter> disconnect_waiter_;
-    LoopController* loop_controller_;
-  };
-
-
-  void RunUntilResolveCalled() {
-    ASSERT_TRUE(resolve_waiter_->RunUntilCalled());
-  }
-
-  std::vector<ResolveRequest> requests;
-  bool disconnected = false;
-
- private:
-  // ConflictResolver:
-  void Resolve(
-      fidl::InterfaceHandle<PageSnapshot> left_version,
-      fidl::InterfaceHandle<PageSnapshot> right_version,
-      fidl::InterfaceHandle<PageSnapshot> common_version,
-      fidl::InterfaceHandle<MergeResultProvider> result_provider) override {
-    requests.emplace_back(loop_controller_, std::move(left_version),
-                          std::move(right_version), std::move(common_version),
-                          std::move(result_provider));
-    resolve_waiter_->GetCallback()();
-  }
-
-  LoopController* loop_controller_;
-  std::unique_ptr<CallbackWaiter> resolve_waiter_;
-  fidl::Binding<ConflictResolver> binding_;
-};
-
-// Custom conflict resolver that doesn't resolve any conflicts.
-class DummyConflictResolver : public ConflictResolver {
- public:
-  explicit DummyConflictResolver(
-      fidl::InterfaceRequest<ConflictResolver> request)
-      : binding_(this, std::move(request)) {}
-  ~DummyConflictResolver() override {}
-
- private:
-  // ConflictResolver:
-  void Resolve(fidl::InterfaceHandle<PageSnapshot> /*left_version*/,
-               fidl::InterfaceHandle<PageSnapshot> /*right_version*/,
-               fidl::InterfaceHandle<PageSnapshot> /*common_version*/,
-               fidl::InterfaceHandle<MergeResultProvider>
-               /*result_provider*/) override {
-    // Do nothing.
-  }
-
-  fidl::Binding<ConflictResolver> binding_;
-};
-
-class TestConflictResolverFactory : public ConflictResolverFactory {
- public:
-  TestConflictResolverFactory(
-      LoopController* loop_controller, MergePolicy policy,
-      fidl::InterfaceRequest<ConflictResolverFactory> request,
-      fit::closure on_get_policy_called_callback,
-      zx::duration response_delay = zx::msec(0))
-      : loop_controller_(loop_controller),
-        new_conflict_resolver_waiter_(loop_controller->NewWaiter()),
-        policy_(policy),
-        binding_(this, std::move(request)),
-        callback_(std::move(on_get_policy_called_callback)),
-        response_delay_(response_delay) {}
-
-  uint get_policy_calls = 0;
-  std::map<storage::PageId, ConflictResolverImpl> resolvers;
-
-  void set_use_dummy_resolver(bool use_dummy_resolver) {
-    use_dummy_resolver_ = use_dummy_resolver;
-  }
-
-  void RunUntilNewConflictResolverCalled() {
-    ASSERT_TRUE(new_conflict_resolver_waiter_->RunUntilCalled());
-  }
-
-  void Disconnect() { binding_.Unbind(); }
-
- private:
-  // ConflictResolverFactory:
-  void GetPolicy(PageId /*page_id*/, GetPolicyCallback callback) override {
-    get_policy_calls++;
-    async::PostDelayedTask(
-        loop_controller_->dispatcher(),
-        [this, callback = std::move(callback)] {
-          callback(policy_);
-          if (callback_) {
-            callback_();
-          }
-        },
-        response_delay_);
-  }
-
-  void NewConflictResolver(
-      PageId page_id,
-      fidl::InterfaceRequest<ConflictResolver> resolver) override {
-    if (use_dummy_resolver_) {
-      dummy_resolvers_.emplace(
-          std::piecewise_construct,
-          std::forward_as_tuple(convert::ToString(page_id.id)),
-          std::forward_as_tuple(std::move(resolver)));
-      new_conflict_resolver_waiter_->GetCallback()();
-      return;
-    }
-    resolvers.emplace(
-        std::piecewise_construct,
-        std::forward_as_tuple(convert::ToString(page_id.id)),
-        std::forward_as_tuple(loop_controller_, std::move(resolver)));
-    new_conflict_resolver_waiter_->GetCallback()();
-  }
-
-  LoopController* loop_controller_;
-  std::unique_ptr<CallbackWaiter> new_conflict_resolver_waiter_;
-  MergePolicy policy_;
-  bool use_dummy_resolver_ = false;
-  std::map<storage::PageId, DummyConflictResolver> dummy_resolvers_;
-  fidl::Binding<ConflictResolverFactory> binding_;
-  fit::closure callback_;
-  zx::duration response_delay_;
-};
-
-// Optional is an object that optionally contains another object.
-template <typename T>
-class Optional {
- public:
-  Optional() : obj_() {}
-  explicit Optional(T obj) : valid_(true), obj_(std::move(obj)) {}
-
-  constexpr const T& operator*() const& { return obj_; }
-
-  constexpr const T* operator->() const { return &obj_; }
-
-  constexpr explicit operator bool() const { return valid_; }
-
- private:
-  bool const valid_ = false;
-  T const obj_;
-};
-
-::testing::AssertionResult ValueMatch(const std::string& type,
-                                      const ValuePtr& value,
-                                      const Optional<std::string>& expected) {
-  if (expected) {
-    if (!value) {
-      return ::testing::AssertionFailure()
-             << type << " has no value but expected \"" << *expected << "\".";
-    }
-    if (ToString(value->value) != *expected) {
-      return ::testing::AssertionFailure()
-             << type << " has value \"" << ToString(value->value)
-             << "\" but expected \"" << *expected << "\".";
-    }
-  } else if (!expected && value) {
-    return ::testing::AssertionFailure()
-           << type << " has value \"" << ToString(value->value)
-           << "\" but expected no value.";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult ChangeMatch(std::string expected_key,
-                                       Optional<std::string> expected_base,
-                                       Optional<std::string> expected_left,
-                                       Optional<std::string> expected_right,
-                                       const DiffEntry& entry) {
-  convert::ExtendedStringView found_key(entry.key);
-  if (expected_key != convert::ExtendedStringView(found_key)) {
-    return ::testing::AssertionFailure()
-           << "Expected key \"" << expected_key << "\" but found \""
-           << found_key << "\"";
-  }
-  ::testing::AssertionResult result =
-      ValueMatch("Base", entry.base, expected_base);
-  if (!result) {
-    return result;
-  }
-  result = ValueMatch("Left", entry.left, expected_left);
-  if (!result) {
-    return result;
-  }
-  return ValueMatch("Right", entry.right, expected_right);
-}
-
-TEST_P(MergingIntegrationTest, Merging) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page1 = instance->GetTestPage();
-  auto waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  PageWatcherPtr watcher1_ptr;
-  auto watcher1_waiter = NewWaiter();
-  Watcher watcher1(watcher1_ptr.NewRequest(), watcher1_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot1;
-  Status status;
-  waiter = NewWaiter();
-  page1->GetSnapshot(snapshot1.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher1_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PageWatcherPtr watcher2_ptr;
-  auto watcher2_waiter = NewWaiter();
-  Watcher watcher2(watcher2_ptr.NewRequest(), watcher2_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot2;
-  waiter = NewWaiter();
-  page2->GetSnapshot(snapshot2.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher2_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("city"), convert::ToArray("Paris"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("name"), convert::ToArray("Bob"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("phone"), convert::ToArray("0123456789"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Verify that each change is seen by the right watcher.
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  ASSERT_TRUE(watcher1_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher1.changes_seen);
-  PageChange change = std::move(watcher1.last_page_change_);
-  ASSERT_EQ(2u, change.changed_entries.size());
-  EXPECT_EQ("city", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Paris", ToString(change.changed_entries.at(0).value));
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(1).key));
-  EXPECT_EQ("Alice", ToString(change.changed_entries.at(1).value));
-
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  ASSERT_TRUE(watcher2_waiter->RunUntilCalled());
-
-  EXPECT_EQ(1u, watcher2.changes_seen);
-  change = std::move(watcher2.last_page_change_);
-  ASSERT_EQ(2u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Bob", ToString(change.changed_entries.at(0).value));
-  EXPECT_EQ("phone", convert::ToString(change.changed_entries.at(1).key));
-  EXPECT_EQ("0123456789", ToString(change.changed_entries.at(1).value));
-
-  ASSERT_TRUE(watcher1_waiter->RunUntilCalled());
-  ASSERT_TRUE(watcher2_waiter->RunUntilCalled());
-
-  // Each change is seen once, and by the correct watcher only.
-  EXPECT_EQ(2u, watcher1.changes_seen);
-  change = std::move(watcher1.last_page_change_);
-  ASSERT_EQ(2u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Bob", ToString(change.changed_entries.at(0).value));
-  EXPECT_EQ("phone", convert::ToString(change.changed_entries.at(1).key));
-  EXPECT_EQ("0123456789", ToString(change.changed_entries.at(1).value));
-
-  EXPECT_EQ(2u, watcher2.changes_seen);
-  change = std::move(watcher2.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("city", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Paris", ToString(change.changed_entries.at(0).value));
-}
-
-TEST_P(MergingIntegrationTest, MergingWithConflictResolutionFactory) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page1 = instance->GetTestPage();
-  auto waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-
-  // Set up a resolver configured not to resolve any conflicts.
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory_waiter = NewWaiter();
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::CUSTOM, resolver_factory_ptr.NewRequest(),
-      resolver_factory_waiter->GetCallback());
-  resolver_factory->set_use_dummy_resolver(true);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  Status status;
-  waiter = NewWaiter();
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Wait for the conflict resolver factory policy to be requested.
-  ASSERT_TRUE(resolver_factory_waiter->RunUntilCalled());
-
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  PageWatcherPtr watcher1_ptr;
-  auto watcher1_waiter = NewWaiter();
-  Watcher watcher1(watcher1_ptr.NewRequest(), watcher1_waiter->GetCallback());
-  PageSnapshotPtr snapshot1;
-  waiter = NewWaiter();
-  page1->GetSnapshot(snapshot1.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher1_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PageWatcherPtr watcher2_ptr;
-  auto watcher2_waiter = NewWaiter();
-  Watcher watcher2(watcher2_ptr.NewRequest(), watcher2_waiter->GetCallback());
-  PageSnapshotPtr snapshot2;
-  waiter = NewWaiter();
-  page2->GetSnapshot(snapshot2.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher2_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("city"), convert::ToArray("Paris"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("name"), convert::ToArray("Bob"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("phone"), convert::ToArray("0123456789"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Verify that each change is seen by the right watcher.
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher1_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher1.changes_seen);
-  PageChange change = std::move(watcher1.last_page_change_);
-  ASSERT_EQ(2u, change.changed_entries.size());
-  EXPECT_EQ("city", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Paris", ToString(change.changed_entries.at(0).value));
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(1).key));
-  EXPECT_EQ("Alice", ToString(change.changed_entries.at(1).value));
-
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher2_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher2.changes_seen);
-  change = std::move(watcher2.last_page_change_);
-  ASSERT_EQ(2u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Bob", ToString(change.changed_entries.at(0).value));
-  EXPECT_EQ("phone", convert::ToString(change.changed_entries.at(1).key));
-  EXPECT_EQ("0123456789", ToString(change.changed_entries.at(1).value));
-
-  // Check that the resolver fectory GetPolicy method is not called.
-  RunLoopFor(zx::sec(1));
-  EXPECT_TRUE(resolver_factory_waiter->NotCalledYet());
-  EXPECT_EQ(1u, resolver_factory->get_policy_calls);
-
-  // Change the merge strategy, triggering resolution of the conflicts.
-  resolver_factory_ptr = nullptr;  // Suppress misc-use-after-move.
-  resolver_factory_waiter = NewWaiter();
-  resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::LAST_ONE_WINS, resolver_factory_ptr.NewRequest(),
-      resolver_factory_waiter->GetCallback());
-  waiter = NewWaiter();
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(resolver_factory_waiter->RunUntilCalled());
-  ASSERT_TRUE(watcher1_waiter->RunUntilCalled());
-  ASSERT_TRUE(watcher2_waiter->RunUntilCalled());
-
-  // Each change is seen once, and by the correct watcher only.
-  EXPECT_EQ(2u, watcher1.changes_seen);
-  change = std::move(watcher1.last_page_change_);
-  ASSERT_EQ(2u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Bob", ToString(change.changed_entries.at(0).value));
-  EXPECT_EQ("phone", convert::ToString(change.changed_entries.at(1).key));
-  EXPECT_EQ("0123456789", ToString(change.changed_entries.at(1).value));
-
-  EXPECT_EQ(2u, watcher2.changes_seen);
-  change = std::move(watcher2.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("city", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Paris", ToString(change.changed_entries.at(0).value));
-
-  EXPECT_EQ(1u, resolver_factory->get_policy_calls);
-}
-
-TEST_P(MergingIntegrationTest, CustomConflictResolutionNoConflict) {
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::CUSTOM, resolver_factory_ptr.NewRequest(), nullptr);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page1 = instance->GetTestPage();
-  waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("city"), convert::ToArray("Paris"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("phone"), convert::ToArray("0123456789"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("email"), convert::ToArray("alice@example.org"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  resolver_factory->RunUntilNewConflictResolverCalled();
-
-  // We now have a conflict.
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  EXPECT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-  resolver_impl->RunUntilResolveCalled();
-  ASSERT_EQ(1u, resolver_impl->requests.size());
-
-  std::vector<DiffEntry> changes;
-  ASSERT_TRUE(resolver_impl->requests[0].GetFullDiff(&changes));
-
-  EXPECT_EQ(4u, changes.size());
-  EXPECT_TRUE(ChangeMatch("city", Optional<std::string>(),
-                          Optional<std::string>(),
-                          Optional<std::string>("Paris"), changes[0]));
-  EXPECT_TRUE(ChangeMatch("email", Optional<std::string>(),
-                          Optional<std::string>("alice@example.org"),
-                          Optional<std::string>(), changes[1]));
-  EXPECT_TRUE(ChangeMatch("name", Optional<std::string>(),
-                          Optional<std::string>(),
-                          Optional<std::string>("Alice"), changes[2]));
-  EXPECT_TRUE(ChangeMatch("phone", Optional<std::string>(),
-                          Optional<std::string>("0123456789"),
-                          Optional<std::string>(), changes[3]));
-
-  // Common ancestor is empty.
-  PageSnapshotPtr snapshot = resolver_impl->requests[0].common_version.Bind();
-  auto entries = SnapshotGetEntries(this, &snapshot);
-  EXPECT_EQ(0u, entries.size());
-
-  // Prepare the merged values
-  std::vector<MergedValue> merged_values;
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("name");
-    merged_value.source = ValueSource::RIGHT;
-    merged_values.push_back(std::move(merged_value));
-  }
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("email");
-    merged_value.source = ValueSource::DELETE;
-    merged_values.push_back(std::move(merged_value));
-  }
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("pager");
-    merged_value.source = ValueSource::NEW;
-    BytesOrReferencePtr value = BytesOrReference::New();
-    value->set_bytes(convert::ToArray("pager@example.org"));
-    merged_value.new_value = std::move(value);
-    merged_values.push_back(std::move(merged_value));
-  }
-
-  // Watch for the change.
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-  PageSnapshotPtr snapshot2;
-  waiter = NewWaiter();
-  page1->GetSnapshot(snapshot2.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  EXPECT_TRUE(resolver_impl->requests[0].Merge(std::move(merged_values)));
-
-  // Wait for the watcher to be called.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-
-  auto final_entries = SnapshotGetEntries(this, &watcher.last_snapshot_);
-  ASSERT_EQ(3u, final_entries.size());
-  EXPECT_EQ("name", convert::ExtendedStringView(final_entries[0].key));
-  EXPECT_EQ("pager", convert::ExtendedStringView(final_entries[1].key));
-  EXPECT_EQ("phone", convert::ExtendedStringView(final_entries[2].key));
-}
-
-TEST_P(MergingIntegrationTest, CustomConflictResolutionGetDiffMultiPart) {
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::CUSTOM, resolver_factory_ptr.NewRequest(), nullptr);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page1 = instance->GetTestPage();
-  waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  int N = 50;
-  std::vector<std::string> page1_keys;
-  for (int i = 0; i < N; ++i) {
-    page1_keys.push_back(fxl::StringPrintf("page1_key_%02d", i));
-    waiter = NewWaiter();
-    page1->Put(convert::ToArray(page1_keys.back()), convert::ToArray("value"),
-               callback::Capture(waiter->GetCallback(), &status));
-    ASSERT_TRUE(waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-  }
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  std::vector<std::string> page2_keys;
-  for (int i = 0; i < N; ++i) {
-    page2_keys.push_back(fxl::StringPrintf("page2_key_%02d", i));
-    waiter = NewWaiter();
-    page2->Put(convert::ToArray(page2_keys.back()), convert::ToArray("value"),
-               callback::Capture(waiter->GetCallback(), &status));
-    ASSERT_TRUE(waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-  }
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // We now have a conflict, wait for the resolve to be called.
-  resolver_factory->RunUntilNewConflictResolverCalled();
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  EXPECT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-  resolver_impl->RunUntilResolveCalled();
-  ASSERT_EQ(1u, resolver_impl->requests.size());
-
-  std::vector<DiffEntry> changes;
-  ASSERT_TRUE(resolver_impl->requests[0].GetFullDiff(&changes, 1));
-
-  EXPECT_EQ(2u * N, changes.size());
-  // Keys are in order, so we expect to have all the page1_key_* keys before the
-  // page2_key_* keys.
-  for (int i = 0; i < N; ++i) {
-    // Left change is the most recent, so the one made on |page2|; right change
-    // comes from |page1|.
-    EXPECT_TRUE(ChangeMatch(page1_keys[i], Optional<std::string>(),
-                            Optional<std::string>(),
-                            Optional<std::string>("value"), changes[i]));
-
-    EXPECT_TRUE(ChangeMatch(page2_keys[i], Optional<std::string>(),
-                            Optional<std::string>("value"),
-                            Optional<std::string>(), changes[N + i]));
-  }
-}
-
-TEST_P(MergingIntegrationTest, CustomConflictResolutionClosingPipe) {
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::CUSTOM, resolver_factory_ptr.NewRequest(), nullptr);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page1 = instance->GetTestPage();
-  waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("name"), convert::ToArray("Bob"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  resolver_factory->RunUntilNewConflictResolverCalled();
-
-  // We now have a conflict.
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  EXPECT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-  resolver_impl->RunUntilResolveCalled();
-  EXPECT_EQ(1u, resolver_impl->requests.size());
-
-  // Kill the resolver
-  resolver_factory->resolvers.clear();
-  EXPECT_EQ(0u, resolver_factory->resolvers.size());
-
-  resolver_factory->RunUntilNewConflictResolverCalled();
-
-  // We should ask again for a resolution.
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  EXPECT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-  resolver_impl->RunUntilResolveCalled();
-  ASSERT_EQ(1u, resolver_impl->requests.size());
-
-  // Remove all references to a page:
-  page1 = nullptr;
-  page2 = nullptr;
-  RunLoopFor(zx::msec(500));
-
-  // Resolution should not crash the Ledger
-  std::vector<MergedValue> merged_values;
-  EXPECT_TRUE(resolver_impl->requests[0].Merge(std::move(merged_values)));
-  RunLoopFor(zx::msec(200));
-}
-
-TEST_P(MergingIntegrationTest, CustomConflictResolutionResetFactory) {
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::CUSTOM, resolver_factory_ptr.NewRequest(), nullptr);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page1 = instance->GetTestPage();
-  waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("name"), convert::ToArray("Bob"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  resolver_factory->RunUntilNewConflictResolverCalled();
-
-  // We now have a conflict.
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  EXPECT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-  EXPECT_FALSE(resolver_impl->disconnected);
-  resolver_impl->RunUntilResolveCalled();
-  EXPECT_EQ(1u, resolver_impl->requests.size());
-
-  // Change the factory.
-  ConflictResolverFactoryPtr resolver_factory_ptr2;
-  auto resolver_factory2 = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::CUSTOM, resolver_factory_ptr2.NewRequest(), nullptr);
-  waiter = NewWaiter();
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr2),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  resolver_factory->Disconnect();
-
-  // Waiting for the conflict resolution request
-  resolver_factory2->RunUntilNewConflictResolverCalled();
-
-  // We should ask again for a resolution on a new resolver.
-  EXPECT_EQ(1u, resolver_factory2->resolvers.size());
-  ASSERT_NE(
-      resolver_factory2->resolvers.end(),
-      resolver_factory2->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl2 =
-      &(resolver_factory2->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-  resolver_impl2->RunUntilResolveCalled();
-  ASSERT_EQ(1u, resolver_impl2->requests.size());
-
-  // Remove all references to a page:
-  page1 = nullptr;
-  page2 = nullptr;
-  RunLoopFor(zx::msec(500));
-
-  // Resolution should not crash the Ledger
-  std::vector<MergedValue> merged_values;
-
-  EXPECT_TRUE(resolver_impl2->requests[0].Merge(std::move(merged_values)));
-  RunLoopFor(zx::msec(200));
-}
-
-TEST_P(MergingIntegrationTest, CustomConflictResolutionMultipartMerge) {
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::CUSTOM, resolver_factory_ptr.NewRequest(), nullptr);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page1 = instance->GetTestPage();
-  waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("email"), convert::ToArray("alice@example.org"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-
-  resolver_factory->RunUntilNewConflictResolverCalled();
-
-  // We now have a conflict.
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  EXPECT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-  resolver_impl->RunUntilResolveCalled();
-  ASSERT_EQ(1u, resolver_impl->requests.size());
-
-  // Prepare the merged values
-  std::vector<MergedValue> merged_values;
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("name");
-    merged_value.source = ValueSource::RIGHT;
-    merged_values.push_back(std::move(merged_value));
-  }
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("email");
-    merged_value.source = ValueSource::DELETE;
-    merged_values.push_back(std::move(merged_value));
-  }
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("pager");
-    merged_value.source = ValueSource::NEW;
-    BytesOrReferencePtr value = BytesOrReference::New();
-    value->set_bytes(convert::ToArray("pager@example.org"));
-    merged_value.new_value = std::move(value);
-    merged_values.push_back(std::move(merged_value));
-  }
-
-  // Watch for the change.
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-  PageSnapshotPtr snapshot;
-  waiter = NewWaiter();
-  page1->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  EXPECT_TRUE(resolver_impl->requests[0].Merge(std::move(merged_values),
-                                               MergeType::MULTIPART));
-
-  // Wait for the watcher to be called.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-
-  auto final_entries = SnapshotGetEntries(this, &watcher.last_snapshot_);
-  ASSERT_EQ(2u, final_entries.size());
-  EXPECT_EQ("name", convert::ExtendedStringView(final_entries[0].key));
-  EXPECT_EQ("pager", convert::ExtendedStringView(final_entries[1].key));
-}
-
-TEST_P(MergingIntegrationTest, AutoConflictResolutionNoConflict) {
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::AUTOMATIC_WITH_FALLBACK,
-      resolver_factory_ptr.NewRequest(), nullptr);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page1 = instance->GetTestPage();
-  waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  // Watch for changes.
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-  PageSnapshotPtr snapshot2;
-  waiter = NewWaiter();
-  page1->GetSnapshot(snapshot2.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("city"), convert::ToArray("Paris"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("email"), convert::ToArray("alice@example.org"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("phone"), convert::ToArray("0123456789"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  // We should have seen the first commit at this point.
-  EXPECT_EQ(1u, watcher.changes_seen);
-
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  resolver_factory->RunUntilNewConflictResolverCalled();
-
-  // We now have an automatically-resolved conflict.
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  EXPECT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-
-  // The waiter is notified of the second change while the resolver has not been
-  // asked to resolve anything.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(0u, resolver_impl->requests.size());
-  EXPECT_EQ(2u, watcher.changes_seen);
-
-  auto final_entries = SnapshotGetEntries(this, &watcher.last_snapshot_);
-  ASSERT_EQ(4u, final_entries.size());
-  EXPECT_EQ("city", convert::ExtendedStringView(final_entries[0].key));
-  EXPECT_EQ("email", convert::ExtendedStringView(final_entries[1].key));
-  EXPECT_EQ("name", convert::ExtendedStringView(final_entries[2].key));
-  EXPECT_EQ("phone", convert::ExtendedStringView(final_entries[3].key));
-}
-
-TEST_P(MergingIntegrationTest, AutoConflictResolutionWithConflict) {
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::AUTOMATIC_WITH_FALLBACK,
-      resolver_factory_ptr.NewRequest(), nullptr);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  Status status;
-  auto waiter = NewWaiter();
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page1 = instance->GetTestPage();
-  PageId test_page_id;
-  waiter = NewWaiter();
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("city"), convert::ToArray("Paris"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("city"), convert::ToArray("San Francisco"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  resolver_factory->RunUntilNewConflictResolverCalled();
-
-  // We now have a conflict.
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  EXPECT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-  resolver_impl->RunUntilResolveCalled();
-  ASSERT_EQ(1u, resolver_impl->requests.size());
-
-  std::vector<DiffEntry> changes;
-  ASSERT_TRUE(resolver_impl->requests[0].GetFullDiff(&changes));
-
-  EXPECT_EQ(2u, changes.size());
-  // Left change is the most recent, so the one made on |page2|.
-  EXPECT_TRUE(ChangeMatch("city", Optional<std::string>(),
-                          Optional<std::string>("San Francisco"),
-                          Optional<std::string>("Paris"), changes[0]));
-  EXPECT_TRUE(ChangeMatch("name", Optional<std::string>(),
-                          Optional<std::string>("Alice"),
-                          Optional<std::string>(), changes[1]));
-
-  // Common ancestor is empty.
-  PageSnapshotPtr snapshot = resolver_impl->requests[0].common_version.Bind();
-  auto entries = SnapshotGetEntries(this, &snapshot);
-  EXPECT_EQ(0u, entries.size());
-
-  // Prepare the merged values
-  std::vector<MergedValue> merged_values;
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("city");
-    merged_value.source = ValueSource::RIGHT;
-    merged_values.push_back(std::move(merged_value));
-  }
-
-  // Watch for the change.
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-  PageSnapshotPtr snapshot2;
-  waiter = NewWaiter();
-  page1->GetSnapshot(snapshot2.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  EXPECT_TRUE(resolver_impl->requests[0].Merge(std::move(merged_values)));
-
-  // Wait for the watcher to be called.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-
-  auto final_entries = SnapshotGetEntries(this, &watcher.last_snapshot_);
-  ASSERT_EQ(2u, final_entries.size());
-  EXPECT_EQ("city", convert::ExtendedStringView(final_entries[0].key));
-  EXPECT_EQ("name", convert::ExtendedStringView(final_entries[1].key));
-}
-
-TEST_P(MergingIntegrationTest, AutoConflictResolutionMultipartMerge) {
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::AUTOMATIC_WITH_FALLBACK,
-      resolver_factory_ptr.NewRequest(), nullptr);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  Status status;
-  auto waiter = NewWaiter();
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-
-  PagePtr page1 = instance->GetTestPage();
-  waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("city"), convert::ToArray("Paris"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("city"), convert::ToArray("San Francisco"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  resolver_factory->RunUntilNewConflictResolverCalled();
-
-  // We now have a conflict.
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  EXPECT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-  resolver_impl->RunUntilResolveCalled();
-  ASSERT_EQ(1u, resolver_impl->requests.size());
-
-  // Prepare the merged values
-  std::vector<MergedValue> merged_values;
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("city");
-    merged_value.source = ValueSource::RIGHT;
-    merged_values.push_back(std::move(merged_value));
-  }
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("previous_city");
-    merged_value.source = ValueSource::NEW;
-    merged_value.new_value = BytesOrReference::New();
-    merged_value.new_value->set_bytes(convert::ToArray("San Francisco"));
-    merged_values.push_back(std::move(merged_value));
-  }
-
-  // Watch for the change.
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-  PageSnapshotPtr snapshot;
-  waiter = NewWaiter();
-  page1->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  EXPECT_TRUE(resolver_impl->requests[0].Merge(std::move(merged_values),
-                                               MergeType::MULTIPART));
-
-  // Wait for the watcher to be called.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-
-  auto final_entries = SnapshotGetEntries(this, &watcher.last_snapshot_);
-  ASSERT_EQ(3u, final_entries.size());
-  EXPECT_EQ("city", convert::ExtendedStringView(final_entries[0].key));
-  EXPECT_EQ("name", convert::ExtendedStringView(final_entries[1].key));
-  EXPECT_EQ("previous_city", convert::ExtendedStringView(final_entries[2].key));
-}
-
-// Tests a merge in which the right side contains no change (e.g. a change was
-// made in a commit, then reverted in another commit).
-TEST_P(MergingIntegrationTest, AutoConflictResolutionNoRightChange) {
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::AUTOMATIC_WITH_FALLBACK,
-      resolver_factory_ptr.NewRequest(), nullptr);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page1 = instance->GetTestPage();
-  waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  // Watch for changes.
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-  PageSnapshotPtr snapshot1;
-  waiter = NewWaiter();
-  page1->GetSnapshot(snapshot1.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // We should have seen the first commit of page 1.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher.changes_seen);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Delete(convert::ToArray("name"),
-                callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // We should have seen the second commit of page 1.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(2u, watcher.changes_seen);
-
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("email"), convert::ToArray("alice@example.org"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  resolver_factory->RunUntilNewConflictResolverCalled();
-
-  // We now have an automatically-resolved conflict.
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  ASSERT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-
-  // The waiter is notified of the third change while the resolver has not been
-  // asked to resolve anything.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(0u, resolver_impl->requests.size());
-  EXPECT_EQ(3u, watcher.changes_seen);
-
-  auto final_entries = SnapshotGetEntries(this, &watcher.last_snapshot_);
-  ASSERT_EQ(1u, final_entries.size());
-  EXPECT_EQ("email", convert::ExtendedStringView(final_entries[0].key));
-}
-
-TEST_P(MergingIntegrationTest, WaitForCustomMerge) {
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::CUSTOM, resolver_factory_ptr.NewRequest(), nullptr);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Create a conflict: two pointers to the same page.
-  PagePtr page1 = instance->GetTestPage();
-  waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  // Parallel put in transactions.
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("email"), convert::ToArray("alice@example.org"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  resolver_factory->RunUntilNewConflictResolverCalled();
-
-  // Check that we have a resolver and pending conflict resolution request.
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  EXPECT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-  resolver_impl->RunUntilResolveCalled();
-  ASSERT_EQ(1u, resolver_impl->requests.size());
-
-  // Try to wait for conflicts resolution.
-  auto conflicts_resolved_callback_waiter = NewWaiter();
-  ConflictResolutionWaitStatus wait_status;
-  page1->WaitForConflictResolution(callback::Capture(
-      conflicts_resolved_callback_waiter->GetCallback(), &wait_status));
-
-  // Check that conflicts_resolved_callback is not called, as there are merge
-  // requests pending.
-  RunLoopFor(zx::msec(250));
-  EXPECT_TRUE(conflicts_resolved_callback_waiter->NotCalledYet());
-
-  // Merge manually.
-  std::vector<MergedValue> merged_values;
-  EXPECT_TRUE(resolver_impl->requests[0].Merge(std::move(merged_values),
-                                               MergeType::SIMPLE));
-  EXPECT_TRUE(conflicts_resolved_callback_waiter->NotCalledYet());
-
-  // Now conflict_resolved_callback can run.
-  ASSERT_TRUE(conflicts_resolved_callback_waiter->RunUntilCalled());
-  EXPECT_EQ(ConflictResolutionWaitStatus::CONFLICTS_RESOLVED, wait_status);
-}
-
-TEST_P(MergingIntegrationTest, CustomConflictResolutionConflictingMerge) {
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::CUSTOM, resolver_factory_ptr.NewRequest(), nullptr);
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page1 = instance->GetTestPage();
-  PageId test_page_id;
-  waiter = NewWaiter();
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("city"), convert::ToArray("Paris"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("name"), convert::ToArray("Bob"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("phone"), convert::ToArray("0123456789"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  resolver_factory->RunUntilNewConflictResolverCalled();
-
-  // We now have a conflict.
-  EXPECT_EQ(1u, resolver_factory->resolvers.size());
-  EXPECT_NE(
-      resolver_factory->resolvers.end(),
-      resolver_factory->resolvers.find(convert::ToString(test_page_id.id)));
-  ConflictResolverImpl* resolver_impl =
-      &(resolver_factory->resolvers.find(convert::ToString(test_page_id.id))
-            ->second);
-  resolver_impl->RunUntilResolveCalled();
-  ASSERT_EQ(1u, resolver_impl->requests.size());
-
-  std::vector<DiffEntry> changes;
-  ASSERT_TRUE(resolver_impl->requests[0].GetConflictingDiff(&changes));
-
-  EXPECT_EQ(1u, changes.size());
-  EXPECT_TRUE(ChangeMatch("name", Optional<std::string>(),
-                          Optional<std::string>("Bob"),
-                          Optional<std::string>("Alice"), changes[0]));
-
-  // Prepare the merged values
-  std::vector<MergedValue> merged_values;
-  {
-    MergedValue merged_value;
-    merged_value.key = convert::ToArray("name");
-    merged_value.source = ValueSource::RIGHT;
-    merged_values.push_back(std::move(merged_value));
-  }
-  ASSERT_TRUE(resolver_impl->requests[0].MergeNonConflictingEntries());
-
-  // Watch for the change.
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-  PageSnapshotPtr snapshot2;
-  waiter = NewWaiter();
-  page1->GetSnapshot(snapshot2.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  EXPECT_TRUE(resolver_impl->requests[0].Merge(std::move(merged_values)));
-
-  // Wait for the watcher to be called.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-
-  auto final_entries = SnapshotGetEntries(this, &watcher.last_snapshot_);
-  ASSERT_EQ(3u, final_entries.size());
-  EXPECT_EQ("city", convert::ExtendedStringView(final_entries[0].key));
-  EXPECT_EQ("Paris", ToString(final_entries[0].value));
-  EXPECT_EQ("name", convert::ExtendedStringView(final_entries[1].key));
-  EXPECT_EQ("Alice", ToString(final_entries[1].value));
-  EXPECT_EQ("phone", convert::ExtendedStringView(final_entries[2].key));
-  EXPECT_EQ("0123456789", ToString(final_entries[2].value));
-}
-
-// Test that multiple ConflictResolverFactories can be registered, and that
-// when registering a new one:
-//  - the existing conflict resolvers are not updated
-//  - the first factory is still used for new pages
-TEST_P(MergingIntegrationTest, ConflictResolverFactoryNotChanged) {
-  auto resolver_factory_waiter1 = NewWaiter();
-  auto resolver_factory_waiter2 = NewWaiter();
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr1;
-  auto resolver_factory1 = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::LAST_ONE_WINS, resolver_factory_ptr1.NewRequest(),
-      resolver_factory_waiter1->GetCallback());
-  ConflictResolverFactoryPtr resolver_factory_ptr2;
-  auto resolver_factory2 = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::LAST_ONE_WINS, resolver_factory_ptr2.NewRequest(),
-      resolver_factory_waiter2->GetCallback());
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr1),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page1 = instance->GetTestPage();
-
-  // resolver_factory1 has received one request for page1
-  ASSERT_TRUE(resolver_factory_waiter1->RunUntilCalled());
-  EXPECT_EQ(1u, resolver_factory1->get_policy_calls);
-
-  // Connect resolver_factory2 on ledger_ptr1. It does not receive requests
-  waiter = NewWaiter();
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr2),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  RunLoopFor(zx::msec(250));
-  EXPECT_EQ(0u, resolver_factory2->get_policy_calls);
-
-  PagePtr page2 = instance->GetTestPage();
-  // resolver_factory1 has received one request for page2
-  ASSERT_TRUE(resolver_factory_waiter1->RunUntilCalled());
-  EXPECT_EQ(2u, resolver_factory1->get_policy_calls);
-  EXPECT_EQ(0u, resolver_factory2->get_policy_calls);
-}
-
-// Tests that when a conflict resolution factory disconnects:
-//  - the next factory is used
-//  - already open pages update their policy
-TEST_P(MergingIntegrationTest, ConflictResolutionFactoryFailover) {
-  auto resolver_factory_waiter1 = NewWaiter();
-  auto resolver_factory_waiter2 = NewWaiter();
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr1;
-  auto resolver_factory1 = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::LAST_ONE_WINS, resolver_factory_ptr1.NewRequest(),
-      resolver_factory_waiter1->GetCallback());
-  ConflictResolverFactoryPtr resolver_factory_ptr2;
-  auto resolver_factory2 = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::LAST_ONE_WINS, resolver_factory_ptr2.NewRequest(),
-      resolver_factory_waiter2->GetCallback());
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr1),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page1 = instance->GetTestPage();
-
-  // resolver_factory1 has received one request for page1
-  ASSERT_TRUE(resolver_factory_waiter1->RunUntilCalled());
-  EXPECT_EQ(1u, resolver_factory1->get_policy_calls);
-
-  // Connect resolver_factory2 on ledger_ptr1. It does not receive requests
-  waiter = NewWaiter();
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr2),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Disconnect resolver_factory1
-  resolver_factory1->Disconnect();
-  ASSERT_TRUE(resolver_factory_waiter2->RunUntilCalled());
-  EXPECT_EQ(1u, resolver_factory2->get_policy_calls);
-
-  PagePtr page2 = instance->GetTestPage();
-  // resolver_factory2 has received one request for page2
-  ASSERT_TRUE(resolver_factory_waiter2->RunUntilCalled());
-  EXPECT_EQ(2u, resolver_factory2->get_policy_calls);
-}
-
-// Tests that when a conflict resolution factory disconnects, already
-// open pages still get their conflicts resolved
-TEST_P(MergingIntegrationTest,
-       ConflictResolutionFactoryUnavailableMergingContinues) {
-  auto resolver_factory_waiter = NewWaiter();
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::LAST_ONE_WINS, resolver_factory_ptr.NewRequest(),
-      resolver_factory_waiter->GetCallback());
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PagePtr page_conn1 = instance->GetTestPage();
-  PageId test_page_id;
-  waiter = NewWaiter();
-  page_conn1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page_conn2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  // wait for the conflict resolver to be set up, then disconnect
-  ASSERT_TRUE(resolver_factory_waiter->RunUntilCalled());
-  resolver_factory->Disconnect();
-
-  PageWatcherPtr watcher1_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher1(watcher1_ptr.NewRequest(), watcher_waiter->GetCallback());
-  PageSnapshotPtr snapshot1;
-  waiter = NewWaiter();
-  page_conn1->GetSnapshot(snapshot1.NewRequest(),
-                          fidl::VectorPtr<uint8_t>::New(0),
-                          std::move(watcher1_ptr),
-                          callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PageWatcherPtr watcher2_ptr;
-  Watcher watcher2(watcher2_ptr.NewRequest(), watcher_waiter->GetCallback());
-  PageSnapshotPtr snapshot2;
-  waiter = NewWaiter();
-  page_conn2->GetSnapshot(snapshot2.NewRequest(),
-                          fidl::VectorPtr<uint8_t>::New(0),
-                          std::move(watcher2_ptr),
-                          callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page_conn1->StartTransaction(
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page_conn1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-                  callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page_conn2->StartTransaction(
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page_conn2->Put(convert::ToArray("name"), convert::ToArray("Bob"),
-                  callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page_conn1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher1.changes_seen);
-  PageChange change = std::move(watcher1.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Alice", ToString(change.changed_entries.at(0).value));
-
-  waiter = NewWaiter();
-  page_conn2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher2.changes_seen);
-  change = std::move(watcher2.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Bob", ToString(change.changed_entries.at(0).value));
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  PageSnapshotPtr snapshot3;
-  waiter = NewWaiter();
-  page_conn1->GetSnapshot(snapshot3.NewRequest(),
-                          fidl::VectorPtr<uint8_t>::New(0), nullptr,
-                          callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(status, Status::OK);
-
-  InlinedValuePtr val1;
-  waiter = NewWaiter();
-  snapshot3->GetInline(
-      convert::ToArray("name"),
-      callback::Capture(waiter->GetCallback(), &status, &val1));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(status, Status::OK);
-
-  PageSnapshotPtr snapshot4;
-  waiter = NewWaiter();
-  page_conn1->GetSnapshot(snapshot4.NewRequest(),
-                          fidl::VectorPtr<uint8_t>::New(0), nullptr,
-                          callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(status, Status::OK);
-
-  InlinedValuePtr val2;
-  waiter = NewWaiter();
-  snapshot4->GetInline(
-      convert::ToArray("name"),
-      callback::Capture(waiter->GetCallback(), &status, &val2));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(status, Status::OK);
-
-  EXPECT_EQ(convert::ToString(val1->value), convert::ToString(val2->value));
-}
-
-// Tests that pages opened after disconnection of a conflict resolver
-// factory do not see their conflict resolved, including if another connection
-// is present with no conflict resolution set
-TEST_P(MergingIntegrationTest,
-       ConflictResolutionFactoryUnavailableNewPagesMergeBlocked) {
-  auto resolver_factory_waiter = NewWaiter();
-  auto instance = NewLedgerAppInstance();
-  ConflictResolverFactoryPtr resolver_factory_ptr;
-  auto resolver_factory = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::LAST_ONE_WINS, resolver_factory_ptr.NewRequest(),
-      resolver_factory_waiter->GetCallback());
-  LedgerPtr ledger_ptr = instance->GetTestLedger();
-
-  // Open another connection to check that its (null) strategy is not used
-  LedgerPtr ledger_ptr2 = instance->GetTestLedger();
-
-  auto waiter = NewWaiter();
-  Status status;
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  resolver_factory->Disconnect();
-
-  PagePtr page_conn1 = instance->GetTestPage();
-  PageId test_page_id;
-  waiter = NewWaiter();
-  page_conn1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  PagePtr page_conn2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  PageWatcherPtr watcher1_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher1(watcher1_ptr.NewRequest(), watcher_waiter->GetCallback());
-  PageSnapshotPtr snapshot1;
-  waiter = NewWaiter();
-  page_conn1->GetSnapshot(snapshot1.NewRequest(),
-                          fidl::VectorPtr<uint8_t>::New(0),
-                          std::move(watcher1_ptr),
-                          callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PageWatcherPtr watcher2_ptr;
-  Watcher watcher2(watcher2_ptr.NewRequest(), watcher_waiter->GetCallback());
-  PageSnapshotPtr snapshot2;
-  waiter = NewWaiter();
-  page_conn2->GetSnapshot(snapshot2.NewRequest(),
-                          fidl::VectorPtr<uint8_t>::New(0),
-                          std::move(watcher2_ptr),
-                          callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page_conn1->StartTransaction(
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page_conn1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-                  callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page_conn2->StartTransaction(
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page_conn2->Put(convert::ToArray("name"), convert::ToArray("Bob"),
-                  callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page_conn1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher1.changes_seen);
-  PageChange change = std::move(watcher1.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Alice", ToString(change.changed_entries.at(0).value));
-
-  waiter = NewWaiter();
-  page_conn2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher2.changes_seen);
-  change = std::move(watcher2.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Bob", ToString(change.changed_entries.at(0).value));
-
-  RunLoopFor(zx::sec(1));
-  EXPECT_TRUE(watcher_waiter->NotCalledYet());
-
-  waiter = NewWaiter();
-  auto resolver_factory_waiter2 = NewWaiter();
-  ConflictResolverFactoryPtr resolver_factory_ptr2;
-  auto resolver_factory2 = std::make_unique<TestConflictResolverFactory>(
-      this, MergePolicy::LAST_ONE_WINS, resolver_factory_ptr2.NewRequest(),
-      resolver_factory_waiter2->GetCallback());
-  ledger_ptr->SetConflictResolverFactory(
-      std::move(resolver_factory_ptr2),
-      callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-
-  PageSnapshotPtr snapshot3;
-  waiter = NewWaiter();
-  page_conn1->GetSnapshot(snapshot3.NewRequest(),
-                          fidl::VectorPtr<uint8_t>::New(0), nullptr,
-                          callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(status, Status::OK);
-
-  InlinedValuePtr val1;
-  waiter = NewWaiter();
-  snapshot3->GetInline(
-      convert::ToArray("name"),
-      callback::Capture(waiter->GetCallback(), &status, &val1));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(status, Status::OK);
-
-  PageSnapshotPtr snapshot4;
-  waiter = NewWaiter();
-  page_conn1->GetSnapshot(snapshot4.NewRequest(),
-                          fidl::VectorPtr<uint8_t>::New(0), nullptr,
-                          callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(status, Status::OK);
-
-  InlinedValuePtr val2;
-  waiter = NewWaiter();
-  snapshot4->GetInline(
-      convert::ToArray("name"),
-      callback::Capture(waiter->GetCallback(), &status, &val2));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(status, Status::OK);
-
-  EXPECT_EQ(convert::ToString(val1->value), convert::ToString(val2->value));
-}
-
-INSTANTIATE_TEST_CASE_P(
-    MergingIntegrationTest, MergingIntegrationTest,
-    ::testing::ValuesIn(GetLedgerAppInstanceFactoryBuilders()));
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/page_mutation_tests.cc b/bin/ledger/tests/integration/page_mutation_tests.cc
deleted file mode 100644
index 5840009..0000000
--- a/bin/ledger/tests/integration/page_mutation_tests.cc
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/callback/waiter.h>
-
-#include "peridot/bin/ledger/testing/ledger_matcher.h"
-#include "peridot/bin/ledger/tests/integration/integration_test.h"
-#include "peridot/bin/ledger/tests/integration/test_utils.h"
-
-using testing::IsEmpty;
-
-namespace ledger {
-namespace {
-
-// Tests in this suite execute a series of operations and check the content of
-// the Page afterwards.
-class PageMutationTest : public IntegrationTest {
- public:
-  void SetUp() override {
-    IntegrationTest::SetUp();
-    app_instance_ = NewLedgerAppInstance();
-    page_ = app_instance_->GetTestPage();
-  }
-
-  PageSnapshotPtr PageGetSnapshot() {
-    Status status;
-    PageSnapshotPtr snapshot;
-    auto waiter = NewWaiter();
-    page_->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                       nullptr,
-                       callback::Capture(waiter->GetCallback(), &status));
-    if (!waiter->RunUntilCalled()) {
-      ADD_FAILURE() << "|GetSnapshot| failed to called back.";
-      return nullptr;
-    }
-    EXPECT_EQ(Status::OK, status);
-    return snapshot;
-  }
-
-  std::vector<Entry> GetEntries() {
-    PageSnapshotPtr snapshot = PageGetSnapshot();
-    return SnapshotGetEntries(this, &snapshot);
-  }
-
-  testing::AssertionResult Put(std::string key, std::string value) {
-    return Do("Put", [&](auto callback) {
-      page_->Put(convert::ToArray(key), convert::ToArray(value),
-                 std::move(callback));
-    });
-  }
-
-  testing::AssertionResult Delete(std::string key) {
-    return Do("Delete", [&](auto callback) {
-      page_->Delete(convert::ToArray(key), std::move(callback));
-    });
-  }
-
-  testing::AssertionResult Clear() {
-    return Do("Clear",
-              [&](auto callback) { page_->Clear(std::move(callback)); });
-  }
-
-  testing::AssertionResult StartTransaction() {
-    return Do("StartTransaction", [&](auto callback) {
-      page_->StartTransaction(std::move(callback));
-    });
-  }
-
-  testing::AssertionResult Commit() {
-    return Do("Commit",
-              [&](auto callback) { page_->Commit(std::move(callback)); });
-  }
-
-  testing::AssertionResult Rollback() {
-    return Do("Rollback",
-              [&](auto callback) { page_->Rollback(std::move(callback)); });
-  }
-
- private:
-  // Executes the given action on the current page.
-  //
-  // This helper function handles the heavy lifting of calling an operation of
-  // the page, waiting for the result and returning an assertion error in case
-  // of non ok status. It expects |action| to operate the operation on the page
-  // and returns the status in its callback.
-  testing::AssertionResult Do(
-      std::string operation_name,
-      fit::function<void(fit::function<void(Status)>)> action) {
-    Status status;
-    auto waiter = NewWaiter();
-    action(callback::Capture(waiter->GetCallback(), &status));
-    if (!waiter->RunUntilCalled()) {
-      return testing::AssertionFailure()
-             << "Error while executing " << operation_name
-             << ". |action| failed to call back.";
-    }
-    if (status == Status::OK) {
-      return testing::AssertionSuccess();
-    }
-    return testing::AssertionFailure()
-           << "Error while executing " << operation_name
-           << ". Status: " << static_cast<uint32_t>(status);
-  }
-
- protected:
-  std::unique_ptr<LedgerAppInstanceFactory::LedgerAppInstance> app_instance_;
-  PagePtr page_;
-};
-
-TEST_P(PageMutationTest, InitialSnapshotIsEmpty) {
-  EXPECT_THAT(GetEntries(), IsEmpty());
-}
-
-TEST_P(PageMutationTest, PutOutsideOfTransaction) {
-  ASSERT_TRUE(Put("key", "value"));
-
-  ASSERT_THAT(GetEntries(), MatchEntries({{"key", "value"}}));
-
-  ASSERT_TRUE(Put("key2", "value2"));
-
-  ASSERT_THAT(GetEntries(),
-              MatchEntries({{"key", "value"}, {"key2", "value2"}}));
-}
-
-TEST_P(PageMutationTest, PutInsideOfTransaction) {
-  ASSERT_TRUE(StartTransaction());
-  ASSERT_TRUE(Put("key", "value"));
-
-  ASSERT_THAT(GetEntries(), IsEmpty());
-
-  ASSERT_TRUE(Put("key2", "value2"));
-  ASSERT_TRUE(Commit());
-
-  ASSERT_THAT(GetEntries(),
-              MatchEntries({{"key", "value"}, {"key2", "value2"}}));
-}
-
-TEST_P(PageMutationTest, RollbackTransaction) {
-  ASSERT_TRUE(StartTransaction());
-  ASSERT_TRUE(Put("key", "value"));
-
-  ASSERT_THAT(GetEntries(), IsEmpty());
-
-  ASSERT_TRUE(Put("key2", "value2"));
-  ASSERT_TRUE(Rollback());
-
-  ASSERT_THAT(GetEntries(), IsEmpty());
-}
-
-TEST_P(PageMutationTest, DeleteOutsideOfTransaction) {
-  ASSERT_TRUE(Put("key", "value"));
-  ASSERT_TRUE(Put("key2", "value2"));
-  ASSERT_THAT(GetEntries(),
-              MatchEntries({{"key", "value"}, {"key2", "value2"}}));
-
-  ASSERT_TRUE(Delete("key"));
-
-  ASSERT_THAT(GetEntries(), MatchEntries({{"key2", "value2"}}));
-}
-
-TEST_P(PageMutationTest, DeleteInsideOfTransaction) {
-  ASSERT_TRUE(Put("key", "value"));
-  ASSERT_TRUE(Put("key2", "value2"));
-  ASSERT_THAT(GetEntries(),
-              MatchEntries({{"key", "value"}, {"key2", "value2"}}));
-
-  ASSERT_TRUE(StartTransaction());
-  ASSERT_TRUE(Delete("key"));
-  ASSERT_TRUE(Put("key3", "value3"));
-  ASSERT_TRUE(Delete("key3"));
-  ASSERT_TRUE(Commit());
-
-  ASSERT_THAT(GetEntries(), MatchEntries({{"key2", "value2"}}));
-}
-
-TEST_P(PageMutationTest, ClearOutsideOfTransaction) {
-  ASSERT_TRUE(Put("key", "value"));
-  ASSERT_TRUE(Put("key2", "value2"));
-  ASSERT_THAT(GetEntries(),
-              MatchEntries({{"key", "value"}, {"key2", "value2"}}));
-
-  ASSERT_TRUE(Clear());
-
-  ASSERT_THAT(GetEntries(), IsEmpty());
-}
-
-TEST_P(PageMutationTest, ClearInsideOfTransaction) {
-  ASSERT_TRUE(Put("key", "value"));
-  ASSERT_TRUE(Put("key2", "value2"));
-  ASSERT_THAT(GetEntries(),
-              MatchEntries({{"key", "value"}, {"key2", "value2"}}));
-
-  ASSERT_TRUE(StartTransaction());
-  ASSERT_TRUE(Put("key3", "value3"));
-  ASSERT_TRUE(Clear());
-  ASSERT_TRUE(Put("key4", "value4"));
-  ASSERT_TRUE(Commit());
-
-  ASSERT_THAT(GetEntries(), MatchEntries({{"key4", "value4"}}));
-}
-
-TEST_P(PageMutationTest, MultipleClearCallsInsideOfTransaction) {
-  ASSERT_TRUE(Put("key", "value"));
-  ASSERT_TRUE(Put("key2", "value2"));
-  ASSERT_THAT(GetEntries(),
-              MatchEntries({{"key", "value"}, {"key2", "value2"}}));
-
-  ASSERT_TRUE(StartTransaction());
-  ASSERT_TRUE(Put("key3", "value3"));
-  ASSERT_TRUE(Clear());
-  ASSERT_TRUE(Put("key4", "value4"));
-  ASSERT_TRUE(Clear());
-  ASSERT_TRUE(Put("key5", "value5"));
-  ASSERT_TRUE(Commit());
-
-  ASSERT_THAT(GetEntries(), MatchEntries({{"key5", "value5"}}));
-}
-
-TEST_P(PageMutationTest, ClearAndDeleteInsideOfTransaction) {
-  ASSERT_TRUE(Put("key", "value"));
-  ASSERT_THAT(GetEntries(), MatchEntries({{"key", "value"}}));
-
-  ASSERT_TRUE(StartTransaction());
-  ASSERT_TRUE(Clear());
-  ASSERT_TRUE(Delete("key"));
-  ASSERT_TRUE(Commit());
-
-  ASSERT_THAT(GetEntries(), IsEmpty());
-}
-
-TEST_P(PageMutationTest, DeleteAndClearInsideOfTransaction) {
-  ASSERT_TRUE(Put("key", "value"));
-  ASSERT_THAT(GetEntries(), MatchEntries({{"key", "value"}}));
-
-  ASSERT_TRUE(StartTransaction());
-  ASSERT_TRUE(Delete("key"));
-  ASSERT_TRUE(Clear());
-  ASSERT_TRUE(Commit());
-
-  ASSERT_THAT(GetEntries(), IsEmpty());
-}
-
-TEST_P(PageMutationTest, ClearAndRestoreInsideTransaction) {
-  ASSERT_TRUE(Put("key", "value"));
-  ASSERT_THAT(GetEntries(), MatchEntries({{"key", "value"}}));
-
-  ASSERT_TRUE(StartTransaction());
-  ASSERT_TRUE(Clear());
-  ASSERT_TRUE(Put("key", "value"));
-  ASSERT_TRUE(Commit());
-
-  ASSERT_THAT(GetEntries(), MatchEntries({{"key", "value"}}));
-}
-
-INSTANTIATE_TEST_CASE_P(
-    PageMutationTest, PageMutationTest,
-    ::testing::ValuesIn(GetLedgerAppInstanceFactoryBuilders()));
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/page_snapshot_tests.cc b/bin/ledger/tests/integration/page_snapshot_tests.cc
deleted file mode 100644
index 3f3fdbb..0000000
--- a/bin/ledger/tests/integration/page_snapshot_tests.cc
+++ /dev/null
@@ -1,751 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-#include <vector>
-
-#include <lib/callback/capture.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fsl/vmo/sized_vmo.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-#include "garnet/public/lib/callback/capture.h"
-#include "garnet/public/lib/callback/waiter.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/fidl/serialization_size.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/tests/integration/integration_test.h"
-#include "peridot/bin/ledger/tests/integration/test_utils.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-class PageSnapshotIntegrationTest : public IntegrationTest {
- public:
-  PageSnapshotIntegrationTest() {}
-  ~PageSnapshotIntegrationTest() override {}
-
-  // Returns a snapshot of |page|, checking success.
-  PageSnapshotPtr PageGetSnapshot(
-      PagePtr* page,
-      fidl::VectorPtr<uint8_t> prefix = fidl::VectorPtr<uint8_t>::New(0)) {
-    Status status;
-    PageSnapshotPtr snapshot;
-    auto waiter = NewWaiter();
-    (*page)->GetSnapshot(snapshot.NewRequest(), std::move(prefix), nullptr,
-                         callback::Capture(waiter->GetCallback(), &status));
-    if (!waiter->RunUntilCalled()) {
-      ADD_FAILURE() << "|GetSnapshot| failed to call back.";
-      return nullptr;
-    }
-    EXPECT_EQ(Status::OK, status);
-    return snapshot;
-  }
-
-  // Returns all keys from |snapshot|, starting at |start|. If |num_queries| is
-  // not null, stores the number of calls to GetKeys.
-  std::vector<std::vector<uint8_t>> SnapshotGetKeys(
-      PageSnapshotPtr* snapshot,
-      std::vector<uint8_t> start = std::vector<uint8_t>(),
-      int* num_queries = nullptr) {
-    std::vector<std::vector<uint8_t>> result;
-    std::unique_ptr<Token> token;
-    if (num_queries) {
-      *num_queries = 0;
-    }
-    do {
-      Status status;
-      std::vector<std::vector<uint8_t>> keys;
-      auto waiter = NewWaiter();
-      (*snapshot)->GetKeys(
-          start, std::move(token),
-          callback::Capture(waiter->GetCallback(), &status, &keys, &token));
-      if (!waiter->RunUntilCalled()) {
-        ADD_FAILURE() << "|GetKeys| failed to call back.";
-        return {};
-      }
-      EXPECT_TRUE(status == Status::OK || status == Status::PARTIAL_RESULT);
-      if (num_queries) {
-        (*num_queries)++;
-      }
-      for (auto& key : keys) {
-        result.push_back(std::move(key));
-      }
-    } while (token);
-    return result;
-  }
-
-  std::string SnapshotFetchPartial(PageSnapshotPtr* snapshot,
-                                   std::vector<uint8_t> key, int64_t offset,
-                                   int64_t max_size) {
-    Status status;
-    fuchsia::mem::BufferPtr buffer;
-    auto waiter = NewWaiter();
-    (*snapshot)->FetchPartial(
-        std::move(key), offset, max_size,
-        callback::Capture(waiter->GetCallback(), &status, &buffer));
-    if (!waiter->RunUntilCalled()) {
-      ADD_FAILURE() << "|FetchPartial| failed to call back.";
-      return {};
-    }
-    EXPECT_EQ(Status::OK, status);
-    std::string result;
-    EXPECT_TRUE(fsl::StringFromVmo(*buffer, &result));
-    return result;
-  }
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageSnapshotIntegrationTest);
-};
-
-TEST_P(PageSnapshotIntegrationTest, PageSnapshotGet) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  Status status;
-  auto waiter = NewWaiter();
-  page->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-  fuchsia::mem::BufferPtr value;
-  waiter = NewWaiter();
-  snapshot->Get(convert::ToArray("name"),
-                callback::Capture(waiter->GetCallback(), &status, &value));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ("Alice", ToString(value));
-
-  // Attempt to get an entry that is not in the page.
-  waiter = NewWaiter();
-  snapshot->Get(convert::ToArray("favorite book"),
-                callback::Capture(waiter->GetCallback(), &status, &value));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  // People don't read much these days.
-  EXPECT_EQ(Status::KEY_NOT_FOUND, status);
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageSnapshotGetPipeline) {
-  auto instance = NewLedgerAppInstance();
-  std::string expected_value = "Alice";
-  expected_value.resize(100);
-
-  auto status_waiter =
-      fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-
-  PagePtr page = instance->GetTestPage();
-  page->Put(convert::ToArray("name"), convert::ToArray(expected_value),
-            status_waiter->NewCallback());
-
-  PageSnapshotPtr snapshot;
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    nullptr, status_waiter->NewCallback());
-
-  Status status;
-  fuchsia::mem::BufferPtr value;
-  snapshot->Get(convert::ToArray("name"),
-                [&value, status_callback = status_waiter->NewCallback()](
-                    Status status, fuchsia::mem::BufferPtr received_value) {
-                  value = std::move(received_value);
-                  status_callback(status);
-                });
-  auto waiter = NewWaiter();
-  status_waiter->Finalize(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  ASSERT_TRUE(value);
-  EXPECT_EQ(expected_value, ToString(value));
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageSnapshotPutOrder) {
-  auto instance = NewLedgerAppInstance();
-  std::string value1 = "Alice";
-  value1.resize(100);
-  std::string value2;
-
-  // Put the 2 values without waiting for the callbacks.
-  PagePtr page = instance->GetTestPage();
-  auto status_waiter =
-      fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-  page->Put(convert::ToArray("name"), convert::ToArray(value1),
-            status_waiter->NewCallback());
-  page->Put(convert::ToArray("name"), convert::ToArray(value2),
-            status_waiter->NewCallback());
-  Status status;
-  auto waiter = NewWaiter();
-  status_waiter->Finalize(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-  fuchsia::mem::BufferPtr value;
-  waiter = NewWaiter();
-  snapshot->Get(convert::ToArray("name"),
-                callback::Capture(waiter->GetCallback(), &status, &value));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(value2, ToString(value));
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageSnapshotFetchPartial) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  Status status;
-  auto waiter = NewWaiter();
-  page->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-  EXPECT_EQ("Alice",
-            SnapshotFetchPartial(&snapshot, convert::ToArray("name"), 0, -1));
-  EXPECT_EQ("e",
-            SnapshotFetchPartial(&snapshot, convert::ToArray("name"), 4, -1));
-  EXPECT_EQ("",
-            SnapshotFetchPartial(&snapshot, convert::ToArray("name"), 5, -1));
-  EXPECT_EQ("",
-            SnapshotFetchPartial(&snapshot, convert::ToArray("name"), 6, -1));
-  EXPECT_EQ("i",
-            SnapshotFetchPartial(&snapshot, convert::ToArray("name"), 2, 1));
-  EXPECT_EQ("",
-            SnapshotFetchPartial(&snapshot, convert::ToArray("name"), 2, 0));
-
-  // Negative offsets.
-  EXPECT_EQ("Alice",
-            SnapshotFetchPartial(&snapshot, convert::ToArray("name"), -5, -1));
-  EXPECT_EQ("e",
-            SnapshotFetchPartial(&snapshot, convert::ToArray("name"), -1, -1));
-  EXPECT_EQ("",
-            SnapshotFetchPartial(&snapshot, convert::ToArray("name"), -5, 0));
-  EXPECT_EQ("i",
-            SnapshotFetchPartial(&snapshot, convert::ToArray("name"), -3, 1));
-
-  // Attempt to get an entry that is not in the page.
-  fuchsia::mem::BufferPtr value;
-  waiter = NewWaiter();
-  snapshot->FetchPartial(
-      convert::ToArray("favorite book"), 0, -1,
-      callback::Capture(waiter->GetCallback(), &status, &value));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  // People don't read much these days.
-  EXPECT_EQ(Status::KEY_NOT_FOUND, status);
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageSnapshotGetKeys) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-
-  // Grab a snapshot before adding any entries and verify that GetKeys()
-  // returns empty results.
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-  std::vector<std::vector<uint8_t>> result = SnapshotGetKeys(&snapshot);
-  EXPECT_EQ(0u, result.size());
-
-  // Add entries and grab a new snapshot.
-  const size_t N = 4;
-  std::vector<uint8_t> keys[N] = {
-      RandomArray(GetRandom(), 20, {0, 0, 0}),
-      RandomArray(GetRandom(), 20, {0, 0, 1}),
-      RandomArray(GetRandom(), 20, {0, 1, 0}),
-      RandomArray(GetRandom(), 20, {0, 1, 1}),
-  };
-  Status status;
-  for (auto& key : keys) {
-    auto waiter = NewWaiter();
-    page->Put(key, RandomArray(GetRandom(), 50),
-              callback::Capture(waiter->GetCallback(), &status));
-    ASSERT_TRUE(waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-  }
-  snapshot = PageGetSnapshot(&page);
-
-  // Get all keys.
-  result = SnapshotGetKeys(&snapshot);
-  EXPECT_EQ(N, result.size());
-  for (size_t i = 0; i < N; ++i) {
-    EXPECT_EQ(keys[i], result.at(i));
-  }
-
-  // Get keys matching the prefix "0".
-  snapshot =
-      PageGetSnapshot(&page, fidl::VectorPtr<uint8_t>(std::vector<uint8_t>{0}));
-  result = SnapshotGetKeys(&snapshot);
-  EXPECT_EQ(N, result.size());
-  for (size_t i = 0; i < N; ++i) {
-    EXPECT_EQ(keys[i], result.at(i));
-  }
-
-  // Get keys matching the prefix "00".
-  snapshot = PageGetSnapshot(
-      &page, fidl::VectorPtr<uint8_t>(std::vector<uint8_t>{0, 0}));
-  result = SnapshotGetKeys(&snapshot);
-  ASSERT_EQ(2u, result.size());
-  for (size_t i = 0; i < 2u; ++i) {
-    EXPECT_EQ(keys[i], result.at(i));
-  }
-
-  // Get keys matching the prefix "010".
-  snapshot = PageGetSnapshot(
-      &page, fidl::VectorPtr<uint8_t>(std::vector<uint8_t>{0, 1, 0}));
-  result = SnapshotGetKeys(&snapshot);
-  ASSERT_EQ(1u, result.size());
-  EXPECT_EQ(keys[2], result.at(0));
-
-  // Get keys matching the prefix "5".
-  snapshot =
-      PageGetSnapshot(&page, fidl::VectorPtr<uint8_t>(std::vector<uint8_t>{5}));
-  result = SnapshotGetKeys(&snapshot);
-  EXPECT_EQ(0u, result.size());
-
-  // Get keys matching the prefix "0" and starting with the key "010".
-  snapshot =
-      PageGetSnapshot(&page, fidl::VectorPtr<uint8_t>(std::vector<uint8_t>{0}));
-  result = SnapshotGetKeys(
-      &snapshot, std::vector<uint8_t>(std::vector<uint8_t>{0, 1, 0}));
-  EXPECT_EQ(2u, result.size());
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageSnapshotGetKeysMultiPart) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-
-  // Grab a snapshot before adding any entries and verify that GetKeys()
-  // returns empty results.
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-  int num_queries;
-  std::vector<std::vector<uint8_t>> result = SnapshotGetKeys(
-      &snapshot, std::vector<uint8_t>(), &num_queries);
-  EXPECT_EQ(0u, result.size());
-  EXPECT_EQ(1, num_queries);
-
-  // Add entries and grab a new snapshot.
-  // Add enough keys so they don't all fit in memory and we will have to have
-  // multiple queries.
-  const size_t key_size = kMaxKeySize;
-  const size_t N = fidl_serialization::kMaxInlineDataSize / key_size + 1;
-  std::vector<uint8_t> keys[N];
-  for (size_t i = 0; i < N; ++i) {
-    // Generate keys so that they are in increasing order to match the order
-    // of results from GetKeys().
-    keys[i] = RandomArray(
-        GetRandom(), key_size,
-        {static_cast<uint8_t>(i >> 8), static_cast<uint8_t>(i & 0xFF)});
-  }
-
-  Status status;
-  for (auto& key : keys) {
-    auto waiter = NewWaiter();
-    page->Put(key, RandomArray(GetRandom(), 10),
-              callback::Capture(waiter->GetCallback(), &status));
-    ASSERT_TRUE(waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-  }
-  snapshot = PageGetSnapshot(&page);
-
-  // Get all keys.
-  result = SnapshotGetKeys(&snapshot, fidl::VectorPtr<uint8_t>::New(0),
-                           &num_queries);
-  EXPECT_TRUE(num_queries > 1);
-  ASSERT_EQ(N, result.size());
-  for (size_t i = 0; i < N; ++i) {
-    EXPECT_EQ(keys[i], result.at(i));
-  }
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageSnapshotGetEntries) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-
-  // Grab a snapshot before adding any entries and verify that GetEntries()
-  // returns empty results.
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-  auto entries = SnapshotGetEntries(this, &snapshot);
-  EXPECT_EQ(0u, entries.size());
-
-  // Add entries and grab a new snapshot.
-  const size_t N = 4;
-  std::vector<uint8_t> keys[N] = {
-      RandomArray(GetRandom(), 20, {0, 0, 0}),
-      RandomArray(GetRandom(), 20, {0, 0, 1}),
-      RandomArray(GetRandom(), 20, {0, 1, 0}),
-      RandomArray(GetRandom(), 20, {0, 1, 1}),
-  };
-  std::vector<uint8_t> values[N] = {
-      RandomArray(GetRandom(), 50),
-      RandomArray(GetRandom(), 50),
-      RandomArray(GetRandom(), 50),
-      RandomArray(GetRandom(), 50),
-  };
-  Status status;
-  for (size_t i = 0; i < N; ++i) {
-    auto waiter = NewWaiter();
-    page->Put(keys[i], values[i],
-              callback::Capture(waiter->GetCallback(), &status));
-    ASSERT_TRUE(waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-  }
-  snapshot = PageGetSnapshot(&page);
-
-  // Get all entries.
-  entries = SnapshotGetEntries(this, &snapshot);
-  EXPECT_EQ(N, entries.size());
-  for (size_t i = 0; i < N; ++i) {
-    EXPECT_EQ(keys[i], entries.at(i).key);
-    EXPECT_EQ(values[i], ToArray(entries.at(i).value));
-  }
-
-  // Get entries matching the prefix "0".
-  snapshot =
-      PageGetSnapshot(&page, fidl::VectorPtr<uint8_t>(std::vector<uint8_t>{0}));
-  entries = SnapshotGetEntries(this, &snapshot);
-  EXPECT_EQ(N, entries.size());
-  for (size_t i = 0; i < N; ++i) {
-    EXPECT_EQ(keys[i], entries.at(i).key);
-    EXPECT_EQ(values[i], ToArray(entries.at(i).value));
-  }
-
-  // Get entries matching the prefix "00".
-  snapshot = PageGetSnapshot(
-      &page, fidl::VectorPtr<uint8_t>(std::vector<uint8_t>{0, 0}));
-  entries = SnapshotGetEntries(this, &snapshot);
-  ASSERT_EQ(2u, entries.size());
-  for (size_t i = 0; i < 2; ++i) {
-    EXPECT_EQ(keys[i], entries.at(i).key);
-    EXPECT_EQ(values[i], ToArray(entries.at(i).value));
-  }
-
-  // Get keys matching the prefix "010".
-  snapshot = PageGetSnapshot(
-      &page, fidl::VectorPtr<uint8_t>(std::vector<uint8_t>{0, 1, 0}));
-  entries = SnapshotGetEntries(this, &snapshot);
-  ASSERT_EQ(1u, entries.size());
-  EXPECT_EQ(keys[2], entries.at(0).key);
-  EXPECT_EQ(values[2], ToArray(entries.at(0).value));
-
-  // Get keys matching the prefix "5".
-  snapshot =
-      PageGetSnapshot(&page, fidl::VectorPtr<uint8_t>(std::vector<uint8_t>{5}));
-
-  entries = SnapshotGetEntries(this, &snapshot);
-  EXPECT_EQ(0u, entries.size());
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageSnapshotGetEntriesMultiPartSize) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-
-  // Grab a snapshot before adding any entries and verify that GetEntries()
-  // returns empty results.
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-  int num_queries;
-  auto entries = SnapshotGetEntries(
-      this, &snapshot, fidl::VectorPtr<uint8_t>::New(0), &num_queries);
-  EXPECT_EQ(0u, entries.size());
-  EXPECT_EQ(1, num_queries);
-
-  // Add entries and grab a new snapshot.
-  // Add enough keys so they don't all fit in memory and we will have to have
-  // multiple queries.
-  const size_t value_size = 100;
-  const size_t key_size = kMaxKeySize;
-  const size_t N =
-      fidl_serialization::kMaxInlineDataSize / (key_size + value_size) + 1;
-  std::vector<uint8_t> keys[N];
-  std::vector<uint8_t> values[N];
-  for (size_t i = 0; i < N; ++i) {
-    // Generate keys so that they are in increasing order to match the order
-    // of results from GetEntries().
-    keys[i] = RandomArray(
-        GetRandom(), key_size,
-        {static_cast<uint8_t>(i >> 8), static_cast<uint8_t>(i & 0xFF)});
-    values[i] = RandomArray(GetRandom(), value_size);
-  }
-
-  Status status;
-  for (size_t i = 0; i < N; ++i) {
-    auto waiter = NewWaiter();
-    page->Put(keys[i], values[i],
-              callback::Capture(waiter->GetCallback(), &status));
-
-    ASSERT_TRUE(waiter->RunUntilCalled());
-
-    EXPECT_EQ(Status::OK, status);
-  }
-  snapshot = PageGetSnapshot(&page);
-
-  // Get all entries.
-  entries = SnapshotGetEntries(this, &snapshot,
-                               fidl::VectorPtr<uint8_t>::New(0), &num_queries);
-  EXPECT_TRUE(num_queries > 1);
-  ASSERT_EQ(N, entries.size());
-  for (size_t i = 0; i < N; ++i) {
-    EXPECT_EQ(keys[i], entries[i].key);
-    EXPECT_EQ(values[i], ToArray(entries[i].value));
-  }
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageSnapshotGetEntriesMultiPartHandles) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-
-  // Grab a snapshot before adding any entries and verify that GetEntries()
-  // returns empty results.
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-  int num_queries;
-  auto entries = SnapshotGetEntries(
-      this, &snapshot, fidl::VectorPtr<uint8_t>::New(0), &num_queries);
-  EXPECT_EQ(0u, entries.size());
-  EXPECT_EQ(1, num_queries);
-
-  // Add entries and grab a new snapshot.
-  const size_t N = 100;
-  std::vector<uint8_t> keys[N];
-  std::vector<uint8_t> values[N];
-  for (size_t i = 0; i < N; ++i) {
-    // Generate keys so that they are in increasing order to match the order
-    // of results from GetEntries().
-    keys[i] = RandomArray(
-        GetRandom(), 20,
-        {static_cast<uint8_t>(i >> 8), static_cast<uint8_t>(i & 0xFF)});
-    values[i] = RandomArray(GetRandom(), 100);
-  }
-
-  for (size_t i = 0; i < N; ++i) {
-    Status status;
-    auto waiter = NewWaiter();
-    page->Put(keys[i], values[i],
-              callback::Capture(waiter->GetCallback(), &status));
-    ASSERT_TRUE(waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-  }
-  snapshot = PageGetSnapshot(&page);
-
-  // Get all entries.
-  entries = SnapshotGetEntries(this, &snapshot,
-                               fidl::VectorPtr<uint8_t>::New(0), &num_queries);
-  EXPECT_TRUE(num_queries > 1);
-  ASSERT_EQ(N, entries.size());
-  for (size_t i = 0; i < N; ++i) {
-    EXPECT_EQ(keys[i], entries[i].key);
-    EXPECT_EQ(values[i], ToArray(entries[i].value));
-  }
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageSnapshotGettersReturnSortedEntries) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-
-  const size_t N = 4;
-  std::vector<uint8_t> keys[N] = {
-      RandomArray(GetRandom(), 20, {2}),
-      RandomArray(GetRandom(), 20, {5}),
-      RandomArray(GetRandom(), 20, {3}),
-      RandomArray(GetRandom(), 20, {0}),
-  };
-  std::vector<uint8_t> values[N] = {
-      RandomArray(GetRandom(), 20),
-      RandomArray(GetRandom(), 20),
-      RandomArray(GetRandom(), 20),
-      RandomArray(GetRandom(), 20),
-  };
-  for (size_t i = 0; i < N; ++i) {
-    Status status;
-    auto waiter = NewWaiter();
-    page->Put(keys[i], values[i],
-              callback::Capture(waiter->GetCallback(), &status));
-    ASSERT_TRUE(waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-  }
-
-  // Get a snapshot.
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-
-  // Verify that GetKeys() results are sorted.
-  std::vector<std::vector<uint8_t>> result = SnapshotGetKeys(&snapshot);
-  EXPECT_EQ(keys[3], result.at(0));
-  EXPECT_EQ(keys[0], result.at(1));
-  EXPECT_EQ(keys[2], result.at(2));
-  EXPECT_EQ(keys[1], result.at(3));
-
-  // Verify that GetEntries() results are sorted.
-  auto entries = SnapshotGetEntries(this, &snapshot);
-  EXPECT_EQ(keys[3], entries[0].key);
-  EXPECT_EQ(values[3], ToArray(entries[0].value));
-  EXPECT_EQ(keys[0], entries[1].key);
-  EXPECT_EQ(values[0], ToArray(entries[1].value));
-  EXPECT_EQ(keys[2], entries[2].key);
-  EXPECT_EQ(values[2], ToArray(entries[2].value));
-  EXPECT_EQ(keys[1], entries[3].key);
-  EXPECT_EQ(values[1], ToArray(entries[3].value));
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageCreateReferenceFromSocketWrongSize) {
-  auto instance = NewLedgerAppInstance();
-  const std::string big_data(1'000'000, 'a');
-
-  PagePtr page = instance->GetTestPage();
-
-  Status status;
-  ReferencePtr reference;
-  auto waiter = NewWaiter();
-  page->CreateReferenceFromSocket(
-      123, StreamDataToSocket(big_data),
-      callback::Capture(waiter->GetCallback(), &status, &reference));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::IO_ERROR, status);
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageCreatePutLargeReferenceFromSocket) {
-  auto instance = NewLedgerAppInstance();
-  const std::string big_data(1'000'000, 'a');
-
-  PagePtr page = instance->GetTestPage();
-
-  // Stream the data into the reference.
-  Status status;
-  ReferencePtr reference;
-  auto waiter = NewWaiter();
-  page->CreateReferenceFromSocket(
-      big_data.size(), StreamDataToSocket(big_data),
-      callback::Capture(waiter->GetCallback(), &status, &reference));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Set the reference under a key.
-  waiter = NewWaiter();
-  page->PutReference(convert::ToArray("big data"), std::move(*reference),
-                     Priority::EAGER,
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Get a snapshot and read the value.
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-  fuchsia::mem::BufferPtr value;
-  waiter = NewWaiter();
-  snapshot->Get(convert::ToArray("big data"),
-                callback::Capture(waiter->GetCallback(), &status, &value));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(big_data, ToString(value));
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageCreatePutLargeReferenceFromVmo) {
-  auto instance = NewLedgerAppInstance();
-  const std::string big_data(1'000'000, 'a');
-  fsl::SizedVmo vmo;
-  ASSERT_TRUE(fsl::VmoFromString(big_data, &vmo));
-
-  PagePtr page = instance->GetTestPage();
-
-  // Stream the data into the reference.
-  Status status;
-  ReferencePtr reference;
-  auto waiter = NewWaiter();
-  page->CreateReferenceFromBuffer(
-      std::move(vmo).ToTransport(),
-      callback::Capture(waiter->GetCallback(), &status, &reference));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Set the reference under a key.
-  waiter = NewWaiter();
-  page->PutReference(convert::ToArray("big data"), std::move(*reference),
-                     Priority::EAGER,
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Get a snapshot and read the value.
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-  fuchsia::mem::BufferPtr value;
-  waiter = NewWaiter();
-  snapshot->Get(convert::ToArray("big data"),
-                callback::Capture(waiter->GetCallback(), &status, &value));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ(big_data, ToString(value));
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageSnapshotClosePageGet) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  Status status;
-  auto waiter = NewWaiter();
-  page->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-
-  // Close the channel. PageSnapshotPtr should remain valid.
-  page.Unbind();
-
-  fuchsia::mem::BufferPtr value;
-  waiter = NewWaiter();
-  snapshot->Get(convert::ToArray("name"),
-                callback::Capture(waiter->GetCallback(), &status, &value));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ("Alice", ToString(value));
-
-  // Attempt to get an entry that is not in the page.
-  waiter = NewWaiter();
-  snapshot->Get(convert::ToArray("favorite book"),
-                callback::Capture(waiter->GetCallback(), &status, &value));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  // People don't read much these days.
-  EXPECT_EQ(Status::KEY_NOT_FOUND, status);
-}
-
-TEST_P(PageSnapshotIntegrationTest, PageGetById) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  PageId test_page_id;
-  auto waiter = NewWaiter();
-  page->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-
-  Status status;
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  page.Unbind();
-
-  page = instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-  PageId page_id;
-  waiter = NewWaiter();
-  page->GetId(callback::Capture(waiter->GetCallback(), &page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(test_page_id.id, page_id.id);
-
-  PageSnapshotPtr snapshot = PageGetSnapshot(&page);
-  fuchsia::mem::BufferPtr value;
-  waiter = NewWaiter();
-  snapshot->Get(convert::ToArray("name"),
-                callback::Capture(waiter->GetCallback(), &status, &value));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ("Alice", ToString(value));
-}
-
-INSTANTIATE_TEST_CASE_P(
-    PageSnapshotIntegrationTest, PageSnapshotIntegrationTest,
-    ::testing::ValuesIn(GetLedgerAppInstanceFactoryBuilders()));
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/page_tests.cc b/bin/ledger/tests/integration/page_tests.cc
deleted file mode 100644
index a9623dc..0000000
--- a/bin/ledger/tests/integration/page_tests.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-#include <vector>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/callback/capture.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fxl/macros.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/tests/integration/integration_test.h"
-#include "peridot/bin/ledger/tests/integration/test_utils.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-class PageIntegrationTest : public IntegrationTest {
- public:
-  PageIntegrationTest() {}
-  ~PageIntegrationTest() override {}
-
-  // Returns the id of the given page.
-  PageId PageGetId(PagePtr* page) {
-    PageId id;
-    auto loop_waiter = NewWaiter();
-    (*page)->GetId(callback::Capture(loop_waiter->GetCallback(), &id));
-    EXPECT_TRUE(loop_waiter->RunUntilCalled());
-    return id;
-  }
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageIntegrationTest);
-};
-
-TEST_P(PageIntegrationTest, LedgerRepositoryDuplicate) {
-  auto instance = NewLedgerAppInstance();
-
-  ledger_internal::LedgerRepositoryPtr repository =
-      instance->GetTestLedgerRepository();
-
-  ledger_internal::LedgerRepositoryPtr duplicated_repository;
-  repository->Duplicate(duplicated_repository.NewRequest());
-  auto loop_waiter = NewWaiter();
-  duplicated_repository->Sync(loop_waiter->GetCallback());
-  ASSERT_TRUE(loop_waiter->RunUntilCalled());
-}
-
-TEST_P(PageIntegrationTest, GetLedger) {
-  auto instance = NewLedgerAppInstance();
-  EXPECT_TRUE(instance->GetTestLedger());
-}
-
-TEST_P(PageIntegrationTest, GetRootPage) {
-  auto instance = NewLedgerAppInstance();
-  LedgerPtr ledger = instance->GetTestLedger();
-  Status status;
-  PagePtr page;
-  auto loop_waiter = NewWaiter();
-  ledger->GetRootPage(page.NewRequest(),
-                      callback::Capture(loop_waiter->GetCallback(), &status));
-  ASSERT_TRUE(loop_waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-}
-
-TEST_P(PageIntegrationTest, NewPage) {
-  auto instance = NewLedgerAppInstance();
-  // Get two pages and check that their ids are different.
-  PagePtr page1 = instance->GetTestPage();
-  PageId id1 = PageGetId(&page1);
-  PagePtr page2 = instance->GetTestPage();
-  PageId id2 = PageGetId(&page2);
-
-  EXPECT_TRUE(id1.id != id2.id);
-}
-
-TEST_P(PageIntegrationTest, GetPage) {
-  auto instance = NewLedgerAppInstance();
-  // Create a page and expect to find it by its id.
-  PagePtr page = instance->GetTestPage();
-  PageId id = PageGetId(&page);
-  instance->GetPage(fidl::MakeOptional(id), Status::OK);
-}
-
-// Verifies that a page can be connected to twice.
-TEST_P(PageIntegrationTest, MultiplePageConnections) {
-  auto instance = NewLedgerAppInstance();
-  // Create a new page and find its id.
-  PagePtr page1 = instance->GetTestPage();
-  PageId page_id_1 = PageGetId(&page1);
-
-  // Connect to the same page again.
-  PagePtr page2 = instance->GetPage(fidl::MakeOptional(page_id_1), Status::OK);
-  PageId page_id_2 = PageGetId(&page2);
-  EXPECT_EQ(page_id_1.id, page_id_2.id);
-}
-
-INSTANTIATE_TEST_CASE_P(
-    PageIntegrationTest, PageIntegrationTest,
-    ::testing::ValuesIn(GetLedgerAppInstanceFactoryBuilders()));
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/page_watcher_tests.cc b/bin/ledger/tests/integration/page_watcher_tests.cc
deleted file mode 100644
index f7955da..0000000
--- a/bin/ledger/tests/integration/page_watcher_tests.cc
+++ /dev/null
@@ -1,860 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-#include <vector>
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/callback/capture.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "garnet/public/lib/callback/capture.h"
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/app/constants.h"
-#include "peridot/bin/ledger/app/fidl/serialization_size.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/tests/integration/integration_test.h"
-#include "peridot/bin/ledger/tests/integration/test_utils.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-using ::testing::SizeIs;
-
-class PageWatcherIntegrationTest : public IntegrationTest {
- public:
-  PageWatcherIntegrationTest() {}
-  ~PageWatcherIntegrationTest() override {}
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageWatcherIntegrationTest);
-};
-
-class Watcher : public PageWatcher {
- public:
-  explicit Watcher(
-      fidl::InterfaceRequest<PageWatcher> request,
-      fit::closure change_callback = [] {})
-      : binding_(this, std::move(request)),
-        change_callback_(std::move(change_callback)) {}
-
-  void DelayCallback(bool delay_callback) { delay_callback_ = delay_callback; }
-
-  void CallOnChangeCallback() {
-    FXL_CHECK(on_change_callback_);
-    on_change_callback_(last_snapshot_.NewRequest());
-    on_change_callback_ = nullptr;
-  }
-
-  uint changes_seen = 0;
-  ResultState last_result_state_;
-  PageSnapshotPtr last_snapshot_;
-  PageChange last_page_change_;
-
- private:
-  // PageWatcher:
-  void OnChange(PageChange page_change, ResultState result_state,
-                OnChangeCallback callback) override {
-    changes_seen++;
-    last_result_state_ = result_state;
-    last_page_change_ = std::move(page_change);
-    last_snapshot_.Unbind();
-    FXL_CHECK(!on_change_callback_);
-    on_change_callback_ = std::move(callback);
-    if (!delay_callback_) {
-      CallOnChangeCallback();
-    }
-    change_callback_();
-  }
-
-  fidl::Binding<PageWatcher> binding_;
-  bool delay_callback_ = false;
-  OnChangeCallback on_change_callback_;
-  fit::closure change_callback_;
-};
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherSimple) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot;
-  auto waiter = NewWaiter();
-  Status status;
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher.last_result_state_);
-  PageChange change = std::move(watcher.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Alice", ToString(change.changed_entries.at(0).value));
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherAggregatedNotifications) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-
-  // Call Put and don't let the OnChange callback be called, yet.
-  watcher.DelayCallback(true);
-  PageSnapshotPtr snapshot;
-  auto waiter = NewWaiter();
-  Status status;
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  page->Put(convert::ToArray("key"), convert::ToArray("value1"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher.last_result_state_);
-  auto changed_entries = std::move(watcher.last_page_change_.changed_entries);
-  ASSERT_THAT(changed_entries, SizeIs(1));
-  EXPECT_EQ("key", convert::ToString(changed_entries.at(0).key));
-  EXPECT_EQ("value1", ToString(changed_entries.at(0).value));
-
-  // Update the value of "key" initially to "value2" and then to "value3".
-  page->Put(convert::ToArray("key"), convert::ToArray("value2"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  page->Put(convert::ToArray("key"), convert::ToArray("value3"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Since the previous OnChange callback hasn't been called yet, the next
-  // notification should be blocked.
-  ASSERT_FALSE(watcher_waiter->RunUntilCalled());
-
-  // Call the OnChange callback and expect a new OnChange call.
-  watcher.CallOnChangeCallback();
-  watcher.DelayCallback(false);
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-
-  // Only the last value of "key" should be found in the changed entries set.
-  EXPECT_EQ(2u, watcher.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher.last_result_state_);
-  changed_entries = std::move(watcher.last_page_change_.changed_entries);
-  ASSERT_THAT(changed_entries, SizeIs(1));
-  EXPECT_EQ("key", convert::ToString(changed_entries.at(0).key));
-  EXPECT_EQ("value3", ToString(changed_entries.at(0).value));
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherDisconnectClient) {
-  auto instance = NewLedgerAppInstance();
-  Status status;
-  PagePtr page = instance->GetTestPage();
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  auto watcher = std::make_unique<Watcher>(watcher_ptr.NewRequest(),
-                                           watcher_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot;
-  auto waiter = NewWaiter();
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Make a change on the page and verify that it was received.
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher->changes_seen);
-
-  // Make another change and disconnect the watcher immediately.
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("name"), convert::ToArray("Bob"),
-            callback::Capture(waiter->GetCallback(), &status));
-  watcher.reset();
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherDisconnectPage) {
-  auto instance = NewLedgerAppInstance();
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-
-  {
-    PagePtr page = instance->GetTestPage();
-    PageSnapshotPtr snapshot;
-    Status status;
-    auto waiter = NewWaiter();
-    page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                      std::move(watcher_ptr),
-                      callback::Capture(waiter->GetCallback(), &status));
-    ASSERT_TRUE(waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-
-    // Queue many put operations on the page.
-    for (int i = 0; i < 1000; i++) {
-      page->Put(convert::ToArray("name"), convert::ToArray(std::to_string(i)),
-                [](Status status) { EXPECT_EQ(Status::OK, status); });
-    }
-  }
-  // Page is out of scope now, but watcher is not. Verify that we don't crash
-  // and a change notification is still delivered.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher.changes_seen);
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherDelete) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  auto waiter = NewWaiter();
-  Status status;
-  page->Put(convert::ToArray("foo"), convert::ToArray("bar"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  auto watcher_waiter = NewWaiter();
-  PageWatcherPtr watcher_ptr;
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot;
-  waiter = NewWaiter();
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->Delete(convert::ToArray("foo"),
-               callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  ASSERT_EQ(1u, watcher.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher.last_result_state_);
-  PageChange change = std::move(watcher.last_page_change_);
-  EXPECT_EQ(0u, change.changed_entries.size());
-  ASSERT_EQ(1u, change.deleted_keys.size());
-  EXPECT_EQ("foo", convert::ToString(change.deleted_keys.at(0)));
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherBigChangeSize) {
-  auto instance = NewLedgerAppInstance();
-  // Put enough entries to ensure we will need more than one query to retrieve
-  // them. The number of entries that can be retrieved in one query is bound by
-  // |kMaxMessageHandles| and by size of the fidl message (determined by
-  // |kMaxInlineDataSize|), so we insert one entry more than that.
-  const size_t key_size = kMaxKeySize;
-  const size_t entry_size = fidl_serialization::GetEntrySize(key_size);
-  const size_t entry_count =
-      std::min(fidl_serialization::kMaxMessageHandles,
-               fidl_serialization::kMaxInlineDataSize / entry_size) +
-      1;
-  const auto key_generator = [](size_t i) {
-    std::string prefix = fxl::StringPrintf("key%03" PRIuMAX, i);
-    std::string filler(key_size - prefix.size(), 'k');
-    return prefix + filler;
-  };
-  PagePtr page = instance->GetTestPage();
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot;
-  auto waiter = NewWaiter();
-  Status status;
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  for (size_t i = 0; i < entry_count; ++i) {
-    waiter = NewWaiter();
-    page->Put(convert::ToArray(key_generator(i)), convert::ToArray("value"),
-              callback::Capture(waiter->GetCallback(), &status));
-    ASSERT_TRUE(waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-  }
-
-  RunLoopFor(zx::msec(100));
-  EXPECT_EQ(0u, watcher.changes_seen);
-
-  waiter = NewWaiter();
-  page->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Get the first OnChagne call.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher.changes_seen);
-  EXPECT_EQ(watcher.last_result_state_, ResultState::PARTIAL_STARTED);
-  PageChange change = std::move(watcher.last_page_change_);
-  size_t initial_size = change.changed_entries.size();
-  for (size_t i = 0; i < initial_size; ++i) {
-    EXPECT_EQ(key_generator(i),
-              convert::ToString(change.changed_entries.at(i).key));
-    EXPECT_EQ("value", ToString(change.changed_entries.at(i).value));
-    EXPECT_EQ(Priority::EAGER, change.changed_entries.at(i).priority);
-  }
-
-  // Get the second OnChagne call.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(2u, watcher.changes_seen);
-  EXPECT_EQ(ResultState::PARTIAL_COMPLETED, watcher.last_result_state_);
-  change = std::move(watcher.last_page_change_);
-
-  ASSERT_EQ(entry_count, initial_size + change.changed_entries.size());
-  for (size_t i = 0; i < change.changed_entries.size(); ++i) {
-    EXPECT_EQ(key_generator(i + initial_size),
-              convert::ToString(change.changed_entries.at(i).key));
-    EXPECT_EQ("value", ToString(change.changed_entries.at(i).value));
-    EXPECT_EQ(Priority::EAGER, change.changed_entries.at(i).priority);
-  }
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherBigChangeHandles) {
-  auto instance = NewLedgerAppInstance();
-  size_t entry_count = 70;
-  PagePtr page = instance->GetTestPage();
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot;
-  auto waiter = NewWaiter();
-  Status status;
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  for (size_t i = 0; i < entry_count; ++i) {
-    waiter = NewWaiter();
-    page->Put(convert::ToArray(fxl::StringPrintf("key%02" PRIuMAX, i)),
-              convert::ToArray("value"),
-              callback::Capture(waiter->GetCallback(), &status));
-    ASSERT_TRUE(waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-  }
-
-  RunLoopFor(zx::msec(100));
-  EXPECT_EQ(0u, watcher.changes_seen);
-
-  waiter = NewWaiter();
-  page->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Get the first OnChagne call.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher.changes_seen);
-  EXPECT_EQ(watcher.last_result_state_, ResultState::PARTIAL_STARTED);
-  PageChange change = std::move(watcher.last_page_change_);
-  size_t initial_size = change.changed_entries.size();
-  for (size_t i = 0; i < initial_size; ++i) {
-    EXPECT_EQ(fxl::StringPrintf("key%02" PRIuMAX, i),
-              convert::ToString(change.changed_entries.at(i).key));
-    EXPECT_EQ("value", ToString(change.changed_entries.at(i).value));
-    EXPECT_EQ(Priority::EAGER, change.changed_entries.at(i).priority);
-  }
-
-  // Get the second OnChagne call.
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(2u, watcher.changes_seen);
-  EXPECT_EQ(ResultState::PARTIAL_COMPLETED, watcher.last_result_state_);
-  change = std::move(watcher.last_page_change_);
-
-  ASSERT_EQ(entry_count, initial_size + change.changed_entries.size());
-  for (size_t i = 0; i < change.changed_entries.size(); ++i) {
-    EXPECT_EQ(fxl::StringPrintf("key%02" PRIuMAX, i + initial_size),
-              convert::ToString(change.changed_entries.at(i).key));
-    EXPECT_EQ("value", ToString(change.changed_entries.at(i).value));
-    EXPECT_EQ(Priority::EAGER, change.changed_entries.at(i).priority);
-  }
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherSnapshot) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot;
-  Status status;
-  auto waiter = NewWaiter();
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher.last_result_state_);
-  auto entries = SnapshotGetEntries(this, &(watcher.last_snapshot_));
-  ASSERT_EQ(1u, entries.size());
-  EXPECT_EQ("name", convert::ToString(entries[0].key));
-  EXPECT_EQ("Alice", ToString(entries[0].value));
-  EXPECT_EQ(Priority::EAGER, entries[0].priority);
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherTransaction) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot;
-  Status status;
-  auto waiter = NewWaiter();
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  RunLoopFor(zx::msec(100));
-  EXPECT_EQ(0u, watcher.changes_seen);
-
-  waiter = NewWaiter();
-  page->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher.last_result_state_);
-  PageChange change = std::move(watcher.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Alice", ToString(change.changed_entries.at(0).value));
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherParallel) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page1 = instance->GetTestPage();
-  auto waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  PageWatcherPtr watcher1_ptr;
-  auto watcher_waiter1 = NewWaiter();
-  Watcher watcher1(watcher1_ptr.NewRequest(), watcher_waiter1->GetCallback());
-  PageSnapshotPtr snapshot1;
-  Status status;
-  waiter = NewWaiter();
-  page1->GetSnapshot(snapshot1.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher1_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  PageWatcherPtr watcher2_ptr;
-  auto watcher_waiter2 = NewWaiter();
-  Watcher watcher2(watcher2_ptr.NewRequest(), watcher_waiter2->GetCallback());
-  PageSnapshotPtr snapshot2;
-  waiter = NewWaiter();
-  page2->GetSnapshot(snapshot2.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher2_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page2->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page2->Put(convert::ToArray("name"), convert::ToArray("Bob"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  // Verify that each change is seen by the right watcher.
-  waiter = NewWaiter();
-  page1->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter1->RunUntilCalled());
-  EXPECT_EQ(1u, watcher1.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher1.last_result_state_);
-  PageChange change = std::move(watcher1.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Alice", ToString(change.changed_entries.at(0).value));
-
-  waiter = NewWaiter();
-  page2->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter2->RunUntilCalled());
-  EXPECT_EQ(1u, watcher2.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher2.last_result_state_);
-  change = std::move(watcher2.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Bob", ToString(change.changed_entries.at(0).value));
-
-  RunLoopFor(zx::msec(100));
-
-  // A merge happens now. Only the first watcher should see a change.
-  ASSERT_TRUE(watcher_waiter1->RunUntilCalled());
-  EXPECT_EQ(2u, watcher1.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher2.last_result_state_);
-  EXPECT_EQ(1u, watcher2.changes_seen);
-
-  change = std::move(watcher1.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Bob", ToString(change.changed_entries.at(0).value));
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherEmptyTransaction) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  PageWatcherPtr watcher_ptr;
-  Watcher watcher(watcher_ptr.NewRequest());
-
-  PageSnapshotPtr snapshot;
-  auto waiter = NewWaiter();
-  Status status;
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  RunLoopFor(zx::msec(100));
-  EXPECT_EQ(0u, watcher.changes_seen);
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcher1Change2Pages) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page1 = instance->GetTestPage();
-  auto waiter = NewWaiter();
-  PageId test_page_id;
-  page1->GetId(callback::Capture(waiter->GetCallback(), &test_page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-
-  PagePtr page2 =
-      instance->GetPage(fidl::MakeOptional(test_page_id), Status::OK);
-
-  PageWatcherPtr watcher1_ptr;
-  auto watcher1_waiter = NewWaiter();
-  Watcher watcher1(watcher1_ptr.NewRequest(), watcher1_waiter->GetCallback());
-  PageSnapshotPtr snapshot1;
-  waiter = NewWaiter();
-  Status status;
-  page1->GetSnapshot(snapshot1.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher1_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  auto watcher2_waiter = NewWaiter();
-  PageWatcherPtr watcher2_ptr;
-  Watcher watcher2(watcher2_ptr.NewRequest(), watcher2_waiter->GetCallback());
-  PageSnapshotPtr snapshot2;
-  waiter = NewWaiter();
-  page2->GetSnapshot(snapshot2.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     std::move(watcher2_ptr),
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page1->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-             callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher1_waiter->RunUntilCalled());
-  ASSERT_TRUE(watcher2_waiter->RunUntilCalled());
-
-  ASSERT_EQ(1u, watcher1.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher1.last_result_state_);
-  PageChange change = std::move(watcher1.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Alice", ToString(change.changed_entries.at(0).value));
-
-  ASSERT_EQ(1u, watcher2.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher2.last_result_state_);
-  change = std::move(watcher2.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("name", convert::ToString(change.changed_entries.at(0).key));
-  EXPECT_EQ("Alice", ToString(change.changed_entries.at(0).value));
-}
-
-class WaitingWatcher : public PageWatcher {
- public:
-  WaitingWatcher(fidl::InterfaceRequest<PageWatcher> request,
-                 fit::closure change_callback)
-      : binding_(this, std::move(request)),
-        change_callback_(std::move(change_callback)) {}
-
-  struct Change {
-    PageChange change;
-    OnChangeCallback callback;
-
-    Change(PageChange change, OnChangeCallback callback)
-        : change(std::move(change)), callback(std::move(callback)) {}
-  };
-
-  std::vector<Change> changes;
-
- private:
-  // PageWatcher:
-  void OnChange(PageChange page_change, ResultState result_state,
-                OnChangeCallback callback) override {
-    FXL_DCHECK(result_state == ResultState::COMPLETED)
-        << "Handling OnChange pagination not implemented yet";
-    changes.emplace_back(std::move(page_change), std::move(callback));
-    change_callback_();
-  }
-
-  fidl::Binding<PageWatcher> binding_;
-  fit::closure change_callback_;
-};
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherConcurrentTransaction) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  WaitingWatcher watcher(watcher_ptr.NewRequest(),
-                         watcher_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot;
-  auto waiter = NewWaiter();
-  Status status;
-  page->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("name"), convert::ToArray("Alice"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher.changes.size());
-
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("foo"), convert::ToArray("bar"),
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  auto transaction_waiter = NewWaiter();
-  Status start_transaction_status;
-  page->StartTransaction(callback::Capture(transaction_waiter->GetCallback(),
-                                           &start_transaction_status));
-
-  RunLoopFor(zx::msec(100));
-
-  // We haven't sent the callback of the first change, so nothing should have
-  // happened.
-  EXPECT_EQ(1u, watcher.changes.size());
-  EXPECT_TRUE(transaction_waiter->NotCalledYet());
-
-  watcher.changes[0].callback(nullptr);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(2u, watcher.changes.size());
-  EXPECT_TRUE(transaction_waiter->NotCalledYet());
-
-  RunLoopFor(zx::msec(100));
-
-  // We haven't sent the callback of the first change, so nothing should have
-  // happened.
-  EXPECT_EQ(2u, watcher.changes.size());
-  EXPECT_TRUE(transaction_waiter->NotCalledYet());
-
-  watcher.changes[1].callback(nullptr);
-
-  ASSERT_TRUE(transaction_waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, start_transaction_status);
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherPrefix) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot;
-  auto waiter = NewWaiter();
-  Status status;
-  page->GetSnapshot(snapshot.NewRequest(), convert::ToArray("01"),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("00-key"), convert::ToArray("value-00"),
-
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("01-key"), convert::ToArray("value-01"),
-
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("02-key"), convert::ToArray("value-02"),
-
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-  waiter = NewWaiter();
-  page->Commit(callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  ASSERT_TRUE(watcher_waiter->RunUntilCalled());
-  EXPECT_EQ(1u, watcher.changes_seen);
-  EXPECT_EQ(ResultState::COMPLETED, watcher.last_result_state_);
-  PageChange change = std::move(watcher.last_page_change_);
-  ASSERT_EQ(1u, change.changed_entries.size());
-  EXPECT_EQ("01-key", convert::ToString(change.changed_entries.at(0).key));
-}
-
-TEST_P(PageWatcherIntegrationTest, PageWatcherPrefixNoChange) {
-  auto instance = NewLedgerAppInstance();
-  PagePtr page = instance->GetTestPage();
-  PageWatcherPtr watcher_ptr;
-  auto watcher_waiter = NewWaiter();
-  Watcher watcher(watcher_ptr.NewRequest(), watcher_waiter->GetCallback());
-
-  PageSnapshotPtr snapshot;
-  auto waiter = NewWaiter();
-  Status status;
-  page->GetSnapshot(snapshot.NewRequest(), convert::ToArray("01"),
-                    std::move(watcher_ptr),
-                    callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->Put(convert::ToArray("00-key"), convert::ToArray("value-00"),
-
-            callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  EXPECT_EQ(Status::OK, status);
-
-  waiter = NewWaiter();
-  page->StartTransaction(callback::Capture(waiter->GetCallback(), &status));
-  EXPECT_EQ(Status::OK, status);
-
-  // Starting a transaction drains all watcher notifications, so if we were to
-  // be called, we would know at this point.
-  EXPECT_EQ(0u, watcher.changes_seen);
-}
-
-INSTANTIATE_TEST_CASE_P(
-    PageWatcherIntegrationTest, PageWatcherIntegrationTest,
-    ::testing::ValuesIn(GetLedgerAppInstanceFactoryBuilders()));
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/sync/BUILD.gn b/bin/ledger/tests/integration/sync/BUILD.gn
deleted file mode 100644
index 621075e..0000000
--- a/bin/ledger/tests/integration/sync/BUILD.gn
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [ "//peridot/bin/ledger/*" ]
-
-source_set("sync") {
-  testonly = true
-
-  sources = [
-    "convergence.cc",
-    "long_history.cc",
-    "sync_tests.cc",
-    "test_sync_state_watcher.cc",
-    "test_sync_state_watcher.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/fidl_helpers",
-    "//peridot/bin/ledger/storage/public",
-    "//peridot/bin/ledger/testing:lib",
-    "//peridot/lib/convert",
-    "//peridot/lib/firebase_auth/testing",
-  ]
-
-  public_deps = [
-    "//peridot/bin/ledger/testing:ledger_instance_factory",
-    "//peridot/bin/ledger/tests/integration:integration_lib",
-    "//third_party/googletest:gtest",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
diff --git a/bin/ledger/tests/integration/sync/convergence.cc b/bin/ledger/tests/integration/sync/convergence.cc
deleted file mode 100644
index 8a3c96f..0000000
--- a/bin/ledger/tests/integration/sync/convergence.cc
+++ /dev/null
@@ -1,485 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <fuchsia/modular/auth/cpp/fidl.h>
-#include <lib/callback/auto_cleanable.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/waiter.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/vector.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/zx/time.h>
-#include <trace/event.h>
-
-#include "peridot/bin/ledger/storage/public/types.h"
-#include "peridot/bin/ledger/testing/data_generator.h"
-#include "peridot/bin/ledger/testing/get_page_ensure_initialized.h"
-#include "peridot/bin/ledger/tests/integration/integration_test.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-fidl::VectorPtr<uint8_t> DoubleToArray(double dbl) {
-  fidl::VectorPtr<uint8_t> array =
-      fidl::VectorPtr<uint8_t>::New(sizeof(double));
-  std::memcpy(array->data(), &dbl, sizeof(double));
-  return array;
-}
-
-::testing::AssertionResult VmoToDouble(const fuchsia::mem::BufferPtr& vmo,
-                                       double* dbl) {
-  *dbl = 0;
-  if (vmo->size != sizeof(double)) {
-    return ::testing::AssertionFailure()
-           << "VMO has the wrong size: " << vmo->size << " instead of "
-           << sizeof(double) << ".";
-  }
-  zx_status_t status = vmo->vmo.read(dbl, 0, sizeof(double));
-  if (status < 0) {
-    return ::testing::AssertionFailure() << "Unable to read the VMO.";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-class RefCountedPageSnapshot
-    : public fxl::RefCountedThreadSafe<RefCountedPageSnapshot> {
- public:
-  RefCountedPageSnapshot() {}
-
-  PageSnapshotPtr& operator->() { return snapshot_; }
-  PageSnapshotPtr& operator*() { return snapshot_; }
-
- private:
-  PageSnapshotPtr snapshot_;
-};
-
-class PageWatcherImpl : public PageWatcher {
- public:
-  PageWatcherImpl(fidl::InterfaceRequest<PageWatcher> request,
-                  fxl::RefPtr<RefCountedPageSnapshot> base_snapshot)
-      : binding_(this, std::move(request)),
-        current_snapshot_(std::move(base_snapshot)) {}
-
-  int changes = 0;
-
-  void GetInlineOnLatestSnapshot(std::vector<uint8_t> key,
-                                 PageSnapshot::GetInlineCallback callback) {
-    // We need to make sure the PageSnapshotPtr used to make the |GetInline|
-    // call survives as long as the call is active, even if a new snapshot
-    // arrives in between.
-    (*current_snapshot_)
-        ->GetInline(
-            std::move(key),
-            [snapshot = current_snapshot_.Clone(),
-             callback = std::move(callback)](
-                Status status, std::unique_ptr<InlinedValue> value) mutable {
-              callback(status, std::move(value));
-            });
-  }
-
- private:
-  // PageWatcher:
-  void OnChange(PageChange /*page_change*/, ResultState /*result_state*/,
-                OnChangeCallback callback) override {
-    changes++;
-    current_snapshot_ = fxl::MakeRefCounted<RefCountedPageSnapshot>();
-    callback((**current_snapshot_).NewRequest());
-  }
-
-  fidl::Binding<PageWatcher> binding_;
-  fxl::RefPtr<RefCountedPageSnapshot> current_snapshot_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageWatcherImpl);
-};
-
-class SyncWatcherImpl : public SyncWatcher {
- public:
-  SyncWatcherImpl() : binding_(this) {}
-
-  auto NewBinding() { return binding_.NewBinding(); }
-
-  bool new_state = false;
-  SyncState download;
-  SyncState upload;
-
- private:
-  // SyncWatcher
-  void SyncStateChanged(SyncState download, SyncState upload,
-                        SyncStateChangedCallback callback) override {
-    this->download = download;
-    this->upload = upload;
-    new_state = true;
-    callback();
-  }
-
-  fidl::Binding<SyncWatcher> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SyncWatcherImpl);
-};
-
-// NonAssociativeConflictResolverImpl uses a merge function which is neither
-// associative nor commutative. This means that merging ((1, 2), 3) results in
-// a different value than merging ((2, 3), 1), or ((2, 1), 3).
-// This conflict resolver only works on numeric data. For values A and B, it
-// produces the merged value (4*A+B)/3.
-class NonAssociativeConflictResolverImpl : public ConflictResolver {
- public:
-  explicit NonAssociativeConflictResolverImpl(
-      fidl::InterfaceRequest<ConflictResolver> request)
-      : binding_(this, std::move(request)) {}
-  ~NonAssociativeConflictResolverImpl() override {}
-
- private:
-  // ConflictResolver:
-  void Resolve(
-      fidl::InterfaceHandle<PageSnapshot> /*left_version*/,
-      fidl::InterfaceHandle<PageSnapshot> /*right_version*/,
-      fidl::InterfaceHandle<PageSnapshot> /*common_version*/,
-      fidl::InterfaceHandle<MergeResultProvider> result_provider) override {
-    auto merge_result_provider =
-        std::make_unique<MergeResultProviderPtr>(result_provider.Bind());
-    merge_result_provider->set_error_handler(
-        [](zx_status_t status) { EXPECT_EQ(ZX_OK, status); });
-    MergeResultProvider* merge_result_provider_ptr =
-        merge_result_provider->get();
-    merge_result_provider_ptr->GetFullDiffNew(
-        nullptr, [merge_result_provider = std::move(merge_result_provider)](
-                     IterationStatus status, std::vector<DiffEntry> changes,
-                     std::unique_ptr<Token> next_token) mutable {
-          ASSERT_EQ(IterationStatus::OK, status);
-          ASSERT_EQ(1u, changes.size());
-
-          double d1, d2;
-          EXPECT_TRUE(VmoToDouble(changes.at(0).left->value, &d1));
-          EXPECT_TRUE(VmoToDouble(changes.at(0).right->value, &d2));
-          double new_value = (4 * d1 + d2) / 3;
-          MergedValue merged_value;
-          merged_value.key = std::move(changes.at(0).key);
-          merged_value.source = ValueSource::NEW;
-          merged_value.new_value = BytesOrReference::New();
-          merged_value.new_value->set_bytes(DoubleToArray(new_value));
-          std::vector<MergedValue> merged_values;
-          merged_values.push_back(std::move(merged_value));
-          (*merge_result_provider)->MergeNew(std::move(merged_values));
-          (*merge_result_provider)->DoneNew();
-        });
-  }
-
-  fidl::Binding<ConflictResolver> binding_;
-};
-
-class TestConflictResolverFactory : public ConflictResolverFactory {
- public:
-  explicit TestConflictResolverFactory(
-      fidl::InterfaceRequest<ConflictResolverFactory> request)
-      : binding_(this, std::move(request)) {}
-
- private:
-  // ConflictResolverFactory:
-  void GetPolicy(PageId /*page_id*/, GetPolicyCallback callback) override {
-    callback(MergePolicy::CUSTOM);
-  }
-
-  void NewConflictResolver(
-      PageId page_id,
-      fidl::InterfaceRequest<ConflictResolver> resolver) override {
-    resolvers.emplace(std::piecewise_construct,
-                      std::forward_as_tuple(convert::ToString(page_id.id)),
-                      std::forward_as_tuple(std::move(resolver)));
-  }
-
-  std::map<storage::PageId, NonAssociativeConflictResolverImpl> resolvers;
-
-  fidl::Binding<ConflictResolverFactory> binding_;
-};
-
-enum class MergeType {
-  LAST_ONE_WINS,
-  NON_ASSOCIATIVE_CUSTOM,
-};
-
-class ConvergenceTest
-    : public BaseIntegrationTest,
-      public ::testing::WithParamInterface<
-          std::tuple<MergeType, int, const LedgerAppInstanceFactoryBuilder*>> {
- public:
-  ConvergenceTest()
-      : BaseIntegrationTest(
-            std::get<const LedgerAppInstanceFactoryBuilder*>(GetParam())) {}
-  ~ConvergenceTest() override{};
-
-  void SetUp() override {
-    BaseIntegrationTest::SetUp();
-
-    data_generator_ = std::make_unique<DataGenerator>(GetRandom());
-
-    std::tie(merge_function_type_, num_ledgers_, std::ignore) = GetParam();
-
-    ASSERT_GT(num_ledgers_, 1);
-
-    PageId page_id;
-
-    for (int i = 0; i < num_ledgers_; i++) {
-      auto ledger_instance = NewLedgerAppInstance();
-      ASSERT_TRUE(ledger_instance);
-      ledger_instances_.push_back(std::move(ledger_instance));
-      pages_.emplace_back();
-      LedgerPtr ledger_ptr = ledger_instances_[i]->GetTestLedger();
-      Status status = Status::UNKNOWN_ERROR;
-      auto loop_waiter = NewWaiter();
-      GetPageEnsureInitialized(
-          &ledger_ptr,
-          // The first ledger gets a random page id, the others use the
-          // same id for their pages.
-          i == 0 ? nullptr : fidl::MakeOptional(page_id), DelayCallback::NO,
-          [&] {
-            ADD_FAILURE() << "Page should not be disconnected.";
-            StopLoop();
-          },
-          callback::Capture(loop_waiter->GetCallback(), &status, &pages_[i],
-                            &page_id));
-      ASSERT_TRUE(loop_waiter->RunUntilCalled());
-      ASSERT_EQ(Status::OK, status);
-    }
-  }
-
- protected:
-  std::unique_ptr<PageWatcherImpl> WatchPageContents(PagePtr* page) {
-    PageWatcherPtr page_watcher;
-    auto page_snapshot = fxl::MakeRefCounted<RefCountedPageSnapshot>();
-    fidl::InterfaceRequest<PageSnapshot> page_snapshot_request =
-        (**page_snapshot).NewRequest();
-    std::unique_ptr<PageWatcherImpl> watcher =
-        std::make_unique<PageWatcherImpl>(page_watcher.NewRequest(),
-                                          std::move(page_snapshot));
-    Status status = Status::UNKNOWN_ERROR;
-    auto loop_waiter = NewWaiter();
-    (*page)->GetSnapshot(
-        std::move(page_snapshot_request), fidl::VectorPtr<uint8_t>::New(0),
-        std::move(page_watcher),
-        callback::Capture(loop_waiter->GetCallback(), &status));
-    EXPECT_TRUE(loop_waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-    return watcher;
-  }
-
-  std::unique_ptr<SyncWatcherImpl> WatchPageSyncState(PagePtr* page) {
-    std::unique_ptr<SyncWatcherImpl> watcher =
-        std::make_unique<SyncWatcherImpl>();
-    Status status = Status::UNKNOWN_ERROR;
-    auto loop_waiter = NewWaiter();
-    (*page)->SetSyncStateWatcher(
-        watcher->NewBinding(),
-        callback::Capture(loop_waiter->GetCallback(), &status));
-    EXPECT_TRUE(loop_waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-    return watcher;
-  }
-
-  // Returns true if the values for |key| on all the watchers are identical.
-  bool AreValuesIdentical(
-      const std::vector<std::unique_ptr<PageWatcherImpl>>& watchers,
-      std::string key) {
-    std::vector<std::unique_ptr<InlinedValue>> values;
-    for (int i = 0; i < num_ledgers_; i++) {
-      values.emplace_back();
-      Status status = Status::UNKNOWN_ERROR;
-      auto loop_waiter = NewWaiter();
-      watchers[i]->GetInlineOnLatestSnapshot(
-          convert::ToArray(key),
-          callback::Capture(loop_waiter->GetCallback(), &status, &values[i]));
-      EXPECT_TRUE(loop_waiter->RunUntilCalled());
-      EXPECT_EQ(Status::OK, status);
-    }
-
-    bool values_are_identical = true;
-    for (int i = 1; i < num_ledgers_; i++) {
-      values_are_identical &= convert::ExtendedStringView(values[0]->value) ==
-                              convert::ExtendedStringView(values[i]->value);
-    }
-    return values_are_identical;
-  }
-
-  int num_ledgers_;
-  MergeType merge_function_type_;
-
-  std::vector<std::unique_ptr<LedgerAppInstanceFactory::LedgerAppInstance>>
-      ledger_instances_;
-  std::vector<PagePtr> pages_;
-  std::unique_ptr<DataGenerator> data_generator_;
-};
-
-// Verify that the Ledger converges over different settings of merging functions
-// and number of ledger instances.
-TEST_P(ConvergenceTest, NLedgersConverge) {
-  std::vector<std::unique_ptr<PageWatcherImpl>> watchers;
-  std::vector<std::unique_ptr<SyncWatcherImpl>> sync_watchers;
-
-  std::vector<std::unique_ptr<TestConflictResolverFactory>> resolver_factories;
-  std::independent_bits_engine<std::default_random_engine, CHAR_BIT, uint8_t>
-      generator;
-  std::uniform_real_distribution<> distribution(1, 100);
-
-  for (int i = 0; i < num_ledgers_; i++) {
-    Status status = Status::UNKNOWN_ERROR;
-    if (merge_function_type_ == MergeType::NON_ASSOCIATIVE_CUSTOM) {
-      ConflictResolverFactoryPtr resolver_factory_ptr;
-      resolver_factories.push_back(
-          std::make_unique<TestConflictResolverFactory>(
-              resolver_factory_ptr.NewRequest()));
-      LedgerPtr ledger = ledger_instances_[i]->GetTestLedger();
-      auto loop_waiter = NewWaiter();
-      ledger->SetConflictResolverFactory(
-          std::move(resolver_factory_ptr),
-          callback::Capture(loop_waiter->GetCallback(), &status));
-      ASSERT_TRUE(loop_waiter->RunUntilCalled());
-      EXPECT_EQ(Status::OK, status);
-    }
-
-    watchers.push_back(WatchPageContents(&pages_[i]));
-    sync_watchers.push_back(WatchPageSyncState(&pages_[i]));
-
-    auto loop_waiter = NewWaiter();
-    pages_[i]->StartTransaction(
-        callback::Capture(loop_waiter->GetCallback(), &status));
-    ASSERT_TRUE(loop_waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-
-    loop_waiter = NewWaiter();
-    if (merge_function_type_ == MergeType::NON_ASSOCIATIVE_CUSTOM) {
-      pages_[i]->Put(convert::ToArray("value"),
-                     DoubleToArray(distribution(generator)),
-                     callback::Capture(loop_waiter->GetCallback(), &status));
-    } else {
-      pages_[i]->Put(convert::ToArray("value"), data_generator_->MakeValue(50),
-                     callback::Capture(loop_waiter->GetCallback(), &status));
-    }
-    ASSERT_TRUE(loop_waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-  }
-
-  auto commit_waiter =
-      fxl::MakeRefCounted<callback::StatusWaiter<Status>>(Status::OK);
-  Status status = Status::UNKNOWN_ERROR;
-  for (int i = 0; i < num_ledgers_; i++) {
-    pages_[i]->Commit(commit_waiter->NewCallback());
-  }
-  auto loop_waiter = NewWaiter();
-  commit_waiter->Finalize(
-      callback::Capture(loop_waiter->GetCallback(), &status));
-  ASSERT_TRUE(loop_waiter->RunUntilCalled());
-
-  // Function to verify if the visible Ledger state has not changed since last
-  // call and all values are identical.
-  fit::function<bool()> has_state_converged = [this, &watchers,
-                                               &sync_watchers]() {
-    // Counts the number of visible changes. Used to verify that the minimal
-    // number of changes for all Ledgers to have communicated is accounted for
-    // (see also below).
-    int num_changes = 0;
-    for (int i = 0; i < num_ledgers_; i++) {
-      num_changes += watchers[i]->changes;
-    }
-    // All ledgers should see their own change (num_ledgers_). Then, at least
-    // all but one should receive a change with the "final" value. There might
-    // be more changes seen, though.
-    if (num_changes < 2 * num_ledgers_ - 1) {
-      return false;
-    }
-
-    // All synchronization must be idle.
-    bool idle = true;
-    for (int i = 0; i < num_ledgers_; i++) {
-      if (sync_watchers[i]->download != SyncState::IDLE ||
-          sync_watchers[i]->upload != SyncState::IDLE ||
-          sync_watchers[i]->new_state) {
-        idle = false;
-      }
-      // With this, we make sure we can verify if the state changes during the
-      // next cycle. If it has changed, we are sure the convergence has not
-      // happened yet.
-      sync_watchers[i]->new_state = false;
-    }
-
-    return idle && AreValuesIdentical(watchers, "value");
-  };
-
-  bool merge_done = false;
-  ConflictResolutionWaitStatus wait_status =
-      ConflictResolutionWaitStatus::NO_CONFLICTS;
-  fxl::RefPtr<callback::StatusWaiter<ConflictResolutionWaitStatus>> waiter;
-
-  // In addition of verifying that the external states of the ledgers have
-  // converged, we also verify we are not currently performing a merge in the
-  // background, indicating that the convergence did not finish.
-  auto is_sync_and_merge_complete = [this, &has_state_converged, &merge_done,
-                                     &wait_status, &waiter] {
-    TRACE_DURATION("ledger", "ledger_test_is_sync_and_merge_complete");
-
-    if (has_state_converged()) {
-      if (merge_done &&
-          wait_status == ConflictResolutionWaitStatus::NO_CONFLICTS) {
-        return true;
-      }
-      if (!waiter) {
-        waiter = fxl::MakeRefCounted<
-            callback::StatusWaiter<ConflictResolutionWaitStatus>>(
-            ConflictResolutionWaitStatus::NO_CONFLICTS);
-        for (int i = 0; i < num_ledgers_; i++) {
-          pages_[i]->WaitForConflictResolution(waiter->NewCallback());
-        }
-        waiter->Finalize([&merge_done, &wait_status,
-                          &waiter](ConflictResolutionWaitStatus status) {
-          merge_done = true;
-          wait_status = status;
-          waiter = nullptr;
-        });
-      }
-      return false;
-    }
-    merge_done = false;
-    if (waiter) {
-      waiter->Cancel();
-      waiter = nullptr;
-    }
-    return false;
-  };
-
-  // If |RunLoopUntil| returns, the condition is met, thus the ledgers have
-  // converged.
-  RunLoopUntil(std::move(is_sync_and_merge_complete));
-  int num_changes = 0;
-  for (int i = 0; i < num_ledgers_; i++) {
-    num_changes += watchers[i]->changes;
-  }
-  EXPECT_GE(num_changes, 2 * num_ledgers_ - 1);
-
-  // All synchronization must still be idle.
-  for (int i = 0; i < num_ledgers_; i++) {
-    EXPECT_FALSE(sync_watchers[i]->new_state);
-    EXPECT_EQ(SyncState::IDLE, sync_watchers[i]->download);
-    EXPECT_EQ(SyncState::IDLE, sync_watchers[i]->upload);
-  }
-
-  EXPECT_TRUE(AreValuesIdentical(watchers, "value"));
-}
-
-INSTANTIATE_TEST_CASE_P(
-    ManyLedgersConvergenceTest, ConvergenceTest,
-    ::testing::Combine(
-        ::testing::Values(MergeType::LAST_ONE_WINS,
-                          MergeType::NON_ASSOCIATIVE_CUSTOM),
-        // Temporarily reduce the number of simulated Ledgers to reduce flaky
-        // failures on bots, see LE-624 and ZX-2613. TODO(ppi): revert back to
-        // (2, 6).
-        // ::testing::Range(2, 6),
-        ::testing::Range(2, 3),
-        ::testing::ValuesIn(GetLedgerAppInstanceFactoryBuilders())));
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/sync/long_history.cc b/bin/ledger/tests/integration/sync/long_history.cc
deleted file mode 100644
index 2557bc4..0000000
--- a/bin/ledger/tests/integration/sync/long_history.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/callback/capture.h>
-#include <lib/callback/waiter.h>
-#include <lib/fidl/cpp/optional.h>
-
-#include "peridot/bin/ledger/tests/integration/integration_test.h"
-#include "peridot/bin/ledger/tests/integration/sync/test_sync_state_watcher.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-class LongHistorySyncTest : public IntegrationTest {
- protected:
-  std::unique_ptr<TestSyncStateWatcher> WatchPageSyncState(PagePtr* page) {
-    auto watcher = std::make_unique<TestSyncStateWatcher>();
-
-    Status status = Status::INTERNAL_ERROR;
-    auto waiter = NewWaiter();
-    (*page)->SetSyncStateWatcher(
-        watcher->NewBinding(),
-        callback::Capture(waiter->GetCallback(), &status));
-    if (!waiter->RunUntilCalled()) {
-      return nullptr;
-    }
-    if (status != Status::OK) {
-      return nullptr;
-    }
-    return watcher;
-  }
-
-  bool WaitUntilSyncIsIdle(TestSyncStateWatcher* watcher) {
-    return RunLoopUntil([watcher] {
-      return watcher->Equals(SyncState::IDLE, SyncState::IDLE);
-    });
-  }
-};
-
-TEST_P(LongHistorySyncTest, SyncLongHistory) {
-  PageId page_id;
-  Status status = Status::INTERNAL_ERROR;
-
-  // Create the first instance and write the page entries.
-  auto instance1 = NewLedgerAppInstance();
-  auto page1 = instance1->GetTestPage();
-  auto page1_state_watcher = WatchPageSyncState(&page1);
-  ASSERT_TRUE(page1_state_watcher);
-  const int commit_history_length = 500;
-  // Overwrite one key N times, creating N implicit commits.
-  for (int i = 0; i < commit_history_length; i++) {
-    // TODO(ppi): switch to using a StatusWaiter to wait in parallel on all
-    // puts, once this does not crash w/ ZX_ERR_SHOULD_WAIT in the test loop
-    // dispatcher.
-    auto put_waiter = NewWaiter();
-    page1->Put(convert::ToArray("iteration"),
-               convert::ToArray(std::to_string(i)),
-               callback::Capture(put_waiter->GetCallback(), &status));
-    ASSERT_TRUE(put_waiter->RunUntilCalled());
-    ASSERT_EQ(Status::OK, status);
-  }
-  // Wait until the commits are uploaded.
-  EXPECT_TRUE(WaitUntilSyncIsIdle(page1_state_watcher.get()));
-
-  // Retrieve the page ID so that we can later connect to the same page from
-  // another app instance.
-  auto waiter = NewWaiter();
-  page1->GetId(callback::Capture(waiter->GetCallback(), &page_id));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-
-  // Create the second instance, connect to the same page and download the
-  // data.
-  auto instance2 = NewLedgerAppInstance();
-  auto page2 = instance2->GetPage(fidl::MakeOptional(page_id), Status::OK);
-  auto page2_state_watcher = WatchPageSyncState(&page2);
-  ASSERT_TRUE(page2_state_watcher);
-  EXPECT_TRUE(WaitUntilSyncIsIdle(page2_state_watcher.get()));
-
-  PageSnapshotPtr snapshot;
-  waiter = NewWaiter();
-  page2->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     nullptr,
-                     callback::Capture(waiter->GetCallback(), &status));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  ASSERT_EQ(Status::OK, status);
-  std::unique_ptr<InlinedValue> inlined_value;
-
-  waiter = NewWaiter();
-  snapshot->GetInline(
-      convert::ToArray("iteration"),
-      callback::Capture(waiter->GetCallback(), &status, &inlined_value));
-  ASSERT_TRUE(waiter->RunUntilCalled());
-  ASSERT_EQ(Status::OK, status);
-  ASSERT_TRUE(inlined_value);
-  const int last_iteration = commit_history_length - 1;
-  ASSERT_EQ(std::to_string(last_iteration),
-            convert::ToString(inlined_value->value));
-
-  // Verify that the sync state of the second page connection eventually becomes
-  // idle.
-  EXPECT_TRUE(WaitUntilSyncIsIdle(page2_state_watcher.get()));
-}
-
-INSTANTIATE_TEST_CASE_P(
-    LongHistorySyncTest, LongHistorySyncTest,
-    ::testing::ValuesIn(GetLedgerAppInstanceFactoryBuilders()));
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/sync/sync_tests.cc b/bin/ledger/tests/integration/sync/sync_tests.cc
deleted file mode 100644
index 36cfbd3..0000000
--- a/bin/ledger/tests/integration/sync/sync_tests.cc
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/callback/capture.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/bin/ledger/tests/integration/integration_test.h"
-#include "peridot/bin/ledger/tests/integration/sync/test_sync_state_watcher.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-namespace {
-
-class SyncIntegrationTest : public IntegrationTest {
- protected:
-  std::unique_ptr<TestSyncStateWatcher> WatchPageSyncState(PagePtr* page) {
-    auto watcher = std::make_unique<TestSyncStateWatcher>();
-
-    Status status = Status::INTERNAL_ERROR;
-    auto loop_waiter = NewWaiter();
-    (*page)->SetSyncStateWatcher(
-        watcher->NewBinding(),
-        callback::Capture(loop_waiter->GetCallback(), &status));
-    EXPECT_TRUE(loop_waiter->RunUntilCalled());
-    EXPECT_EQ(Status::OK, status);
-
-    return watcher;
-  }
-
-  bool WaitUntilSyncIsIdle(TestSyncStateWatcher* watcher) {
-    return RunLoopUntil([watcher] {
-      return watcher->Equals(SyncState::IDLE, SyncState::IDLE);
-    });
-  }
-};
-
-// Verifies that a new page entry is correctly synchronized between two Ledger
-// app instances.
-//
-// In this test the app instances connect to the cloud one after the other: the
-// first instance uploads data to the cloud and shuts down, and only after that
-// the second instance is created and connected.
-TEST_P(SyncIntegrationTest, SerialConnection) {
-  PageId page_id;
-  Status status;
-
-  // Create the first instance and write the page entry.
-  auto instance1 = NewLedgerAppInstance();
-  auto page1 = instance1->GetTestPage();
-  auto page1_state_watcher = WatchPageSyncState(&page1);
-  auto loop_waiter = NewWaiter();
-  page1->Put(convert::ToArray("Hello"), convert::ToArray("World"),
-             callback::Capture(loop_waiter->GetCallback(), &status));
-  ASSERT_TRUE(loop_waiter->RunUntilCalled());
-
-  // Retrieve the page ID so that we can later connect to the same page from
-  // another app instance.
-  ASSERT_EQ(Status::OK, status);
-  loop_waiter = NewWaiter();
-  page1->GetId(callback::Capture(loop_waiter->GetCallback(), &page_id));
-  ASSERT_TRUE(loop_waiter->RunUntilCalled());
-
-  // Wait until the sync state becomes idle.
-  EXPECT_TRUE(WaitUntilSyncIsIdle(page1_state_watcher.get()));
-
-  // Create the second instance, connect to the same page and download the
-  // data.
-  auto instance2 = NewLedgerAppInstance();
-  auto page2 = instance2->GetPage(fidl::MakeOptional(page_id), Status::OK);
-  auto page2_state_watcher = WatchPageSyncState(&page2);
-  EXPECT_TRUE(WaitUntilSyncIsIdle(page2_state_watcher.get()));
-
-  PageSnapshotPtr snapshot;
-  loop_waiter = NewWaiter();
-  page2->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     nullptr,
-                     callback::Capture(loop_waiter->GetCallback(), &status));
-  ASSERT_TRUE(loop_waiter->RunUntilCalled());
-  ASSERT_EQ(Status::OK, status);
-  std::unique_ptr<InlinedValue> inlined_value;
-
-  loop_waiter = NewWaiter();
-  snapshot->GetInline(
-      convert::ToArray("Hello"),
-      callback::Capture(loop_waiter->GetCallback(), &status, &inlined_value));
-  ASSERT_TRUE(loop_waiter->RunUntilCalled());
-  ASSERT_EQ(Status::OK, status);
-  ASSERT_TRUE(inlined_value);
-  ASSERT_EQ("World", convert::ToString(inlined_value->value));
-
-  // Verify that the sync state of the second page connection eventually becomes
-  // idle.
-  EXPECT_TRUE(WaitUntilSyncIsIdle(page2_state_watcher.get()));
-}
-
-// Verifies that a new page entry is correctly synchronized between two Ledger
-// app instances.
-//
-// In this test the app instances connect to the cloud concurrently: the second
-// instance is already connected when the first instance writes the entry.
-TEST_P(SyncIntegrationTest, ConcurrentConnection) {
-  auto instance1 = NewLedgerAppInstance();
-  auto instance2 = NewLedgerAppInstance();
-
-  auto page1 = instance1->GetTestPage();
-  auto page1_state_watcher = WatchPageSyncState(&page1);
-  PageId page_id;
-  auto loop_waiter = NewWaiter();
-  page1->GetId(callback::Capture(loop_waiter->GetCallback(), &page_id));
-  ASSERT_TRUE(loop_waiter->RunUntilCalled());
-  auto page2 = instance2->GetPage(fidl::MakeOptional(page_id), Status::OK);
-  auto page2_state_watcher = WatchPageSyncState(&page2);
-  // Wait until the sync on the second device is idle and record the number of
-  // state updates.
-  EXPECT_TRUE(WaitUntilSyncIsIdle(page2_state_watcher.get()));
-  int page2_initial_state_change_count =
-      page2_state_watcher->state_change_count;
-
-  Status status;
-  loop_waiter = NewWaiter();
-  page1->Put(convert::ToArray("Hello"), convert::ToArray("World"),
-             callback::Capture(loop_waiter->GetCallback(), &status));
-  ASSERT_TRUE(loop_waiter->RunUntilCalled());
-  ASSERT_EQ(Status::OK, status);
-
-  // Wait until page1 finishes uploading the changes.
-  EXPECT_TRUE(WaitUntilSyncIsIdle(page1_state_watcher.get()));
-
-  // Note that we cannot just wait for the sync to become idle on the second
-  // instance, as it might still be idle upon the first check because the device
-  // hasn't yet received the remote notification about new commits. This is why
-  // we also check that another state change notification was delivered.
-  EXPECT_TRUE(
-      RunLoopUntil([&page2_state_watcher, page2_initial_state_change_count] {
-        return page2_state_watcher->state_change_count >
-                   page2_initial_state_change_count &&
-               page2_state_watcher->Equals(SyncState::IDLE, SyncState::IDLE);
-      }));
-
-  PageSnapshotPtr snapshot;
-  loop_waiter = NewWaiter();
-  page2->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     nullptr,
-                     callback::Capture(loop_waiter->GetCallback(), &status));
-  ASSERT_TRUE(loop_waiter->RunUntilCalled());
-  ASSERT_EQ(Status::OK, status);
-  std::unique_ptr<InlinedValue> inlined_value;
-  loop_waiter = NewWaiter();
-  snapshot->GetInline(
-      convert::ToArray("Hello"),
-      callback::Capture(loop_waiter->GetCallback(), &status, &inlined_value));
-  ASSERT_TRUE(loop_waiter->RunUntilCalled());
-  ASSERT_EQ(Status::OK, status);
-  ASSERT_TRUE(inlined_value);
-  ASSERT_EQ("World", convert::ToString(inlined_value->value));
-
-  // Verify that the sync states of page2 eventually become idle.
-  EXPECT_TRUE(WaitUntilSyncIsIdle(page2_state_watcher.get()));
-}
-
-INSTANTIATE_TEST_CASE_P(
-    SyncIntegrationTest, SyncIntegrationTest,
-    ::testing::ValuesIn(GetLedgerAppInstanceFactoryBuilders()));
-
-}  // namespace
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/sync/test_sync_state_watcher.cc b/bin/ledger/tests/integration/sync/test_sync_state_watcher.cc
deleted file mode 100644
index 1f5495c..0000000
--- a/bin/ledger/tests/integration/sync/test_sync_state_watcher.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/tests/integration/sync/test_sync_state_watcher.h"
-
-namespace ledger {
-
-TestSyncStateWatcher::TestSyncStateWatcher() : binding_(this) {}
-TestSyncStateWatcher::~TestSyncStateWatcher() {}
-
-void TestSyncStateWatcher::SyncStateChanged(SyncState download,
-                                            SyncState upload,
-                                            SyncStateChangedCallback callback) {
-  state_change_count++;
-  download_state = download;
-  upload_state = upload;
-  callback();
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/sync/test_sync_state_watcher.h b/bin/ledger/tests/integration/sync/test_sync_state_watcher.h
deleted file mode 100644
index 0442121..0000000
--- a/bin/ledger/tests/integration/sync/test_sync_state_watcher.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTS_INTEGRATION_SYNC_TEST_SYNC_STATE_WATCHER_H_
-#define PERIDOT_BIN_LEDGER_TESTS_INTEGRATION_SYNC_TEST_SYNC_STATE_WATCHER_H_
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-
-namespace ledger {
-
-class TestSyncStateWatcher : public SyncWatcher {
- public:
-  TestSyncStateWatcher();
-  ~TestSyncStateWatcher() override;
-
-  auto NewBinding() { return binding_.NewBinding(); }
-
-  bool Equals(SyncState download, SyncState upload) {
-    return download == download_state && upload == upload_state;
-  }
-
-  SyncState download_state = SyncState::PENDING;
-  SyncState upload_state = SyncState::PENDING;
-  int state_change_count = 0;
-
- private:
-  // SyncWatcher:
-  void SyncStateChanged(SyncState download, SyncState upload,
-                        SyncStateChangedCallback callback) override;
-
-  fidl::Binding<SyncWatcher> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestSyncStateWatcher);
-};
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTS_INTEGRATION_SYNC_TEST_SYNC_STATE_WATCHER_H_
diff --git a/bin/ledger/tests/integration/test_utils.cc b/bin/ledger/tests/integration/test_utils.cc
deleted file mode 100644
index 809a1c1..0000000
--- a/bin/ledger/tests/integration/test_utils.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/ledger/tests/integration/test_utils.h"
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/time/time_delta.h>
-#include <lib/zx/time.h>
-
-#include "garnet/public/lib/callback/capture.h"
-#include "gtest/gtest.h"
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/lib/convert/convert.h"
-
-namespace ledger {
-
-std::vector<uint8_t> RandomArray(rng::Random* random, size_t size,
-                                     const std::vector<uint8_t>& prefix) {
-  EXPECT_TRUE(size >= prefix.size());
-  std::vector<uint8_t> array(size);
-  for (size_t i = 0; i < prefix.size(); ++i) {
-    array.at(i) = prefix[i];
-  }
-  random->Draw(&array[prefix.size()], size - prefix.size());
-  return array;
-}
-
-std::string ToString(const fuchsia::mem::BufferPtr& vmo) {
-  std::string value;
-  bool status = fsl::StringFromVmo(*vmo, &value);
-  FXL_DCHECK(status);
-  return value;
-}
-
-std::vector<uint8_t> ToArray(const fuchsia::mem::BufferPtr& vmo) {
-  return convert::ToArray(ToString(vmo));
-}
-
-std::vector<Entry> SnapshotGetEntries(LoopController* loop_controller,
-                                      PageSnapshotPtr* snapshot,
-                                      fidl::VectorPtr<uint8_t> start,
-                                      int* num_queries) {
-  std::vector<Entry> result;
-  std::unique_ptr<Token> token;
-  if (num_queries) {
-    *num_queries = 0;
-  }
-  do {
-    Status status;
-    std::vector<Entry> entries;
-    auto waiter = loop_controller->NewWaiter();
-    (*snapshot)->GetEntries(
-        start.Clone(), std::move(token),
-        callback::Capture(waiter->GetCallback(), &status, &entries, &token));
-    if (!waiter->RunUntilCalled()) {
-      ADD_FAILURE() << "|GetEntries| failed to call back.";
-      return {};
-    }
-    if (status != Status::OK && status != Status::PARTIAL_RESULT) {
-      ADD_FAILURE() << "Actual status: " << fidl::ToUnderlying(status);
-      return {};
-    }
-    if (num_queries) {
-      (*num_queries)++;
-    }
-    for (auto& entry : entries) {
-      result.push_back(std::move(entry));
-    }
-  } while (token);
-  return result;
-}
-
-}  // namespace ledger
diff --git a/bin/ledger/tests/integration/test_utils.h b/bin/ledger/tests/integration/test_utils.h
deleted file mode 100644
index 01f27f8..0000000
--- a/bin/ledger/tests/integration/test_utils.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_LEDGER_TESTS_INTEGRATION_TEST_UTILS_H_
-#define PERIDOT_BIN_LEDGER_TESTS_INTEGRATION_TEST_UTILS_H_
-
-#include <string>
-#include <vector>
-
-#include <lib/fsl/vmo/sized_vmo.h>
-
-#include "peridot/bin/ledger/fidl/include/types.h"
-#include "peridot/bin/ledger/testing/ledger_app_instance_factory.h"
-#include "peridot/lib/rng/random.h"
-
-namespace ledger {
-
-// Builds an array of length |size|, starting with |prefix| and completed with
-// random data.
-std::vector<uint8_t> RandomArray(rng::Random* random, size_t size,
-                                     const std::vector<uint8_t>& prefix = {});
-
-// Extracts the content of |vmo| as a std::string.
-std::string ToString(const fuchsia::mem::BufferPtr& vmo);
-
-// Extracts the content of |vmo| as a FIDL vector.
-std::vector<uint8_t> ToArray(const fuchsia::mem::BufferPtr& vmo);
-
-// Retrieves all entries from the snapshot with a key greater of equals to
-// |start|. If |num_queries| is not null, returns the number of calls to
-// |GetEntries|. If any call fails, this function will fail the current test.
-std::vector<Entry> SnapshotGetEntries(
-    LoopController* loop_controller, PageSnapshotPtr* snapshot,
-    fidl::VectorPtr<uint8_t> start = fidl::VectorPtr<uint8_t>::New(0),
-    int* num_queries = nullptr);
-
-}  // namespace ledger
-
-#endif  // PERIDOT_BIN_LEDGER_TESTS_INTEGRATION_TEST_UTILS_H_
diff --git a/bin/ledger/tests/ledger_unittests.cmx b/bin/ledger/tests/ledger_unittests.cmx
deleted file mode 100644
index 8e55c9b..0000000
--- a/bin/ledger/tests/ledger_unittests.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "program": {
-        "binary": "test/ledger_unittests"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-        ]
-    }
-}
diff --git a/bin/module_resolver/BUILD.gn b/bin/module_resolver/BUILD.gn
deleted file mode 100644
index 09f661f..0000000
--- a/bin/module_resolver/BUILD.gn
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/package.gni")
-import("//peridot/build/executable_package.gni")
-import("//peridot/build/tests_package.gni")
-
-executable_package("module_resolver") {
-  meta = [
-    {
-      path = "meta/module_resolver.cmx"
-      dest = "module_resolver.cmx"
-    },
-  ]
-
-  sources = [
-    "module_resolver_main.cc",
-  ]
-
-  deps = [
-    ":local_module_resolver",
-    "//garnet/public/fidl/fuchsia.net.oldhttp",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/module_manifest_source:firebase_source",
-    "//peridot/lib/module_manifest_source:module_package_source",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:app_driver",
-    "//peridot/public/lib/entity/cpp:json",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-tests_package("module_resolver_unittests") {
-  deps = [
-    ":local_module_resolver_unittest",
-  ]
-}
-
-source_set("local_module_resolver") {
-  sources = [
-    "local_module_resolver.cc",
-    "local_module_resolver.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:clone",
-    "//peridot/lib/module_manifest_source",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:operation",
-    "//peridot/public/lib/context/cpp:context_helper",
-    "//peridot/public/lib/entity/cpp:json",
-  ]
-}
-
-executable("local_module_resolver_unittest") {
-  testonly = true
-
-  sources = [
-    "local_module_resolver_unittest.cc",
-  ]
-
-  deps = [
-    ":local_module_resolver",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//peridot/lib/fidl:clone",
-    "//peridot/lib/testing:entity_resolver_fake",
-    "//peridot/public/lib/entity/cpp:json",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/module_resolver/local_module_resolver.cc b/bin/module_resolver/local_module_resolver.cc
deleted file mode 100644
index 0ac049b..0000000
--- a/bin/module_resolver/local_module_resolver.cc
+++ /dev/null
@@ -1,647 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/module_resolver/local_module_resolver.h"
-
-#include <algorithm>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/context/cpp/context_helper.h>
-#include <lib/entity/cpp/json.h>
-#include <lib/fxl/strings/split_string.h>
-
-#include "peridot/lib/fidl/clone.h"
-
-namespace modular {
-namespace {
-
-// << operator for LocalModuleResolver::ManifestId.
-std::ostream& operator<<(std::ostream& o,
-                         const std::pair<std::string, std::string>& id) {
-  return o << id.first << ":" << id.second;
-}
-
-}  // namespace
-
-LocalModuleResolver::LocalModuleResolver()
-    : query_handler_binding_(this),
-      already_checking_if_sources_are_ready_(false),
-      weak_factory_(this) {}
-
-LocalModuleResolver::~LocalModuleResolver() = default;
-
-std::set<LocalModuleResolver::ManifestId> LocalModuleResolver::FindHandlers(
-    ModuleUri handler) {
-  // Search through each known repository source for |handler|, and return a
-  // set<ManifestId> containing them.
-  std::set<ManifestId> manifests;
-  for (auto& source : ready_sources_) {
-    auto it = manifests_.find(ManifestId(source, handler));
-    if (it != manifests_.end()) {
-      manifests.insert(it->first);
-    }
-  }
-  return manifests;
-}
-
-void LocalModuleResolver::AddSource(
-    std::string source_name, std::unique_ptr<ModuleManifestSource> repo) {
-  FXL_CHECK(bindings_.size() == 0);
-
-  auto ptr = repo.get();
-  sources_.emplace(source_name, std::move(repo));
-
-  ptr->Watch(
-      async_get_default_dispatcher(),
-      [this, source_name]() { OnSourceIdle(source_name); },
-      [this, source_name](std::string module_uri,
-                          fuchsia::modular::ModuleManifest manifest) {
-        OnNewManifestEntry(source_name, module_uri, std::move(manifest));
-      },
-      [this, source_name](std::string module_uri) {
-        OnRemoveManifestEntry(source_name, std::move(module_uri));
-      });
-}
-
-void LocalModuleResolver::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::ModuleResolver> request) {
-  if (!AllSourcesAreReady()) {
-    PeriodicCheckIfSourcesAreReady();
-    pending_bindings_.push_back(std::move(request));
-  } else {
-    bindings_.AddBinding(this, std::move(request));
-  }
-}
-
-void LocalModuleResolver::BindQueryHandler(
-    fidl::InterfaceRequest<fuchsia::modular::QueryHandler> request) {
-  query_handler_binding_.Bind(std::move(request));
-}
-
-class LocalModuleResolver::FindModulesCall
-    : public Operation<fuchsia::modular::FindModulesResponse> {
- public:
-  FindModulesCall(LocalModuleResolver* local_module_resolver,
-                  fuchsia::modular::FindModulesQuery query,
-                  ResultCall result_call)
-      : Operation("LocalModuleResolver::FindModulesCall",
-                  std::move(result_call)),
-        local_module_resolver_(local_module_resolver),
-        query_(std::move(query)) {}
-
-  // Finds all modules that match |query_|.
-  //
-  // The specified action is used to filter potential modules, and
-  // the associated parameters are required to match in both name and type. If
-  // |query_.module_handler| is specified, then the search for the action and
-  // parameters are restricted to the specified handler.
-  void Run() override {
-    FlowToken flow{this, &response_};
-
-    // 1. If a handler is specified, use only that for |candidates_|.
-    if (!query_.handler.is_null()) {
-      auto found_handlers =
-          local_module_resolver_->FindHandlers(query_.handler);
-      if (found_handlers.empty()) {
-        response_ = CreateEmptyResponseWithStatus(
-            fuchsia::modular::FindModulesStatus::UNKNOWN_HANDLER);
-        return;
-      }
-
-      candidates_ = found_handlers;
-    }
-
-    // 2. Find all modules that can handle the action and then take an
-    // intersection |candidates_| if its non-empty.
-    auto action_it =
-        local_module_resolver_->action_to_manifests_.find(query_.action);
-    if (action_it != local_module_resolver_->action_to_manifests_.end()) {
-      if (!candidates_.empty()) {
-        std::set<ManifestId> new_candidates;
-        if (action_it != local_module_resolver_->action_to_manifests_.end()) {
-          candidates_ = action_it->second;
-          std::set_intersection(
-              candidates_.begin(), candidates_.end(), action_it->second.begin(),
-              action_it->second.end(),
-              std::inserter(new_candidates, new_candidates.begin()));
-          candidates_ = new_candidates;
-        }
-      } else {
-        candidates_ = action_it->second;
-      }
-    }
-
-    // 3. For each parameter in the FindModulesQuery, try to filter
-    // |candidates_| to only the modules that provide the types in the parameter
-    // constraints.
-    if (!candidates_.empty()) {
-      for (const auto& parameter_entry : query_.parameter_constraints) {
-        ProcessParameterTypes(parameter_entry.param_name,
-                              parameter_entry.param_types);
-      }
-    }
-
-    FinalizeResponse(flow);
-  }
-
- private:
-  // |parameter_name| and |types| come from the FindModulesQuery.
-  void ProcessParameterTypes(const std::string& parameter_name,
-                             const std::vector<std::string>& types) {
-    std::set<ManifestId> parameter_type_entries;
-    for (const auto& type : types) {
-      std::set<ManifestId> found_entries =
-          GetManifestsMatchingParameterByTypeAndName(type, parameter_name);
-      parameter_type_entries.insert(found_entries.begin(), found_entries.end());
-    }
-
-    std::set<ManifestId> new_result_entries;
-    // All parameters in the query must be handled by the candidates. For each
-    // parameter that is processed, filter out any existing results that can't
-    // also handle the new parameter type.
-    std::set_intersection(
-        candidates_.begin(), candidates_.end(), parameter_type_entries.begin(),
-        parameter_type_entries.end(),
-        std::inserter(new_result_entries, new_result_entries.begin()));
-
-    candidates_.swap(new_result_entries);
-  }
-
-  // Returns the ManifestIds of all entries with a parameter that matches the
-  // provided name and type.
-  std::set<ManifestId> GetManifestsMatchingParameterByTypeAndName(
-      const std::string& parameter_type, const std::string& parameter_name) {
-    std::set<ManifestId> found_entries;
-    auto found_manifests_it =
-        local_module_resolver_->parameter_type_and_name_to_manifests_.find(
-            std::make_pair(parameter_type, parameter_name));
-    if (found_manifests_it !=
-        local_module_resolver_->parameter_type_and_name_to_manifests_.end()) {
-      found_entries.insert(found_manifests_it->second.begin(),
-                           found_manifests_it->second.end());
-    }
-    return found_entries;
-  }
-
-  // At this point |candidates_| contains all the modules that satisfy the
-  // query. The purpose of this method is to create a response using these
-  // candidates.
-  void FinalizeResponse(FlowToken flow) {
-    response_ = CreateEmptyResponseWithStatus(
-        fuchsia::modular::FindModulesStatus::SUCCESS);
-    if (candidates_.empty()) {
-      return;
-    }
-
-    for (auto manifest_id : candidates_) {
-      auto entry_it = local_module_resolver_->manifests_.find(manifest_id);
-      FXL_CHECK(entry_it != local_module_resolver_->manifests_.end())
-          << manifest_id;
-
-      const auto& manifest = entry_it->second;
-      fuchsia::modular::FindModulesResult result;
-      result.module_id = manifest.binary;
-      result.manifest = fuchsia::modular::ModuleManifest::New();
-      result.manifest->intent_filters.resize(0);
-      fidl::Clone(manifest, result.manifest.get());
-
-      response_.results.push_back(std::move(result));
-    }
-  }
-
-  fuchsia::modular::FindModulesResponse CreateEmptyResponseWithStatus(
-      fuchsia::modular::FindModulesStatus status) {
-    fuchsia::modular::FindModulesResponse response;
-    response.status = status;
-    response.results.resize(0);
-    return response;
-  }
-
-  fuchsia::modular::FindModulesResponse response_;
-  LocalModuleResolver* const local_module_resolver_;
-  fuchsia::modular::FindModulesQuery query_;
-
-  std::set<ManifestId> candidates_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FindModulesCall);
-};
-
-class LocalModuleResolver::FindModulesByTypesCall
-    : public Operation<fuchsia::modular::FindModulesByTypesResponse> {
- public:
-  FindModulesByTypesCall(LocalModuleResolver* const local_module_resolver,
-                         fuchsia::modular::FindModulesByTypesQuery query,
-                         ResultCall result_call)
-      : Operation("LocalModuleResolver::FindModulesByTypesCall",
-                  std::move(result_call)),
-        local_module_resolver_(local_module_resolver),
-        query_(std::move(query)) {}
-
-  void Run() override {
-    FlowToken flow{this, &response_};
-
-    response_ = CreateEmptyResponseWithStatus();
-
-    std::set<ManifestId> candidates;
-    for (auto& constraint : query_.parameter_constraints) {
-      std::set<ManifestId> param_type_entries;
-      parameter_types_cache_[constraint.constraint_name] =
-          constraint.param_types;
-      for (auto& type : constraint.param_types) {
-        auto found_entries = GetManifestsMatchingParameterByType(type);
-        candidates.insert(found_entries.begin(), found_entries.end());
-      }
-    }
-
-    for (auto& candidate : candidates) {
-      auto results = MatchQueryParametersToManifestParametersByType(
-          local_module_resolver_->manifests_[candidate]);
-
-      using iter = decltype(results->begin());
-      response_.results.insert(response_.results.end(),
-                                std::move_iterator<iter>(results->begin()),
-                                std::move_iterator<iter>(results->end()));
-    }
-  }
-
- private:
-  fuchsia::modular::FindModulesByTypesResponse CreateEmptyResponseWithStatus() {
-    fuchsia::modular::FindModulesByTypesResponse r;
-    r.results.resize(0);
-    return r;
-  }
-
-  // Returns the set of all modules that have a parameter whose type is
-  // |parameter_type|.
-  std::set<LocalModuleResolver::ManifestId> GetManifestsMatchingParameterByType(
-      const std::string& parameter_type) {
-    std::set<ManifestId> found_entries;
-    auto found_manifests_it =
-        local_module_resolver_->parameter_type_to_manifests_.find(
-            parameter_type);
-    if (found_manifests_it !=
-        local_module_resolver_->parameter_type_to_manifests_.end()) {
-      found_entries.insert(found_manifests_it->second.begin(),
-                           found_manifests_it->second.end());
-    }
-    return found_entries;
-  }
-
-  // Creates FindModulesResults for each available mapping from
-  // parameters in |query_| to the corresponding parameters in each candidate
-  // manifest.
-  //
-  // In order for a query to match an manifest, it must contain enough
-  // parameters to populate each of the manifest parameters.
-  // TODO(MI4-866): Handle entries with optional parameters.
-  fidl::VectorPtr<fuchsia::modular::FindModulesByTypesResult>
-  MatchQueryParametersToManifestParametersByType(
-      const fuchsia::modular::ModuleManifest& manifest) {
-    fidl::VectorPtr<fuchsia::modular::FindModulesByTypesResult> modules;
-    modules.resize(0);
-
-    for (const auto& intent_filter : *manifest.intent_filters) {
-      if (query_.parameter_constraints.size() <
-          intent_filter.parameter_constraints.size()) {
-        return modules;
-      }
-
-      // Map each parameter in |intent_filter| to the query parameter names that
-      // could be used to populate the |intent_filter| parameter.
-      std::map<ParameterName, std::vector<ParameterName>>
-          intent_filter_params_to_query_constraints =
-              MapManifestParametersToCompatibleQueryParameters(intent_filter);
-
-      // Compute each possible map from |query_| parameter to the
-      // |intent_filter| parameter that it should populate.
-      std::vector<std::map<ParameterName, ParameterName>> parameter_mappings =
-          ComputeResultsFromEntryParameterToQueryParameterMapping(
-              intent_filter_params_to_query_constraints);
-
-      // For each of the possible mappings, create a resolver result.
-      for (const auto& parameter_mapping : parameter_mappings) {
-        fuchsia::modular::FindModulesByTypesResult result;
-        // TODO(vardhan): This score is a place holder. Compute a simple score
-        // for results.
-        result.score = 1.0f;
-        result.module_id = manifest.binary;
-        result.action = intent_filter.action;
-        for (auto& kv : parameter_mapping) {
-          fuchsia::modular::FindModulesByTypesParameterMapping mapping;
-          mapping.query_constraint_name = kv.first;
-          mapping.result_param_name = kv.second;
-          result.parameter_mappings.push_back(std::move(mapping));
-        }
-        result.manifest = fuchsia::modular::ModuleManifest::New();
-        fidl::Clone(manifest, result.manifest.get());
-
-        modules.push_back(std::move(result));
-      }
-    }
-
-    return modules;
-  }
-
-  // Returns a map where the keys are the |intent_filter|'s parameter names, and
-  // the values are all the |query_| parameter names that are type-compatible
-  // with that |intent_filter| parameter name.
-  std::map<std::string, std::vector<std::string>>
-  MapManifestParametersToCompatibleQueryParameters(
-      const fuchsia::modular::IntentFilter& intent_filter) {
-    std::map<ParameterName, std::vector<ParameterName>>
-        intent_filter_param_to_query_constraints;
-    for (const auto& intent_filter_param :
-         intent_filter.parameter_constraints) {
-      std::vector<ParameterName> matching_query_constraints;
-      for (const auto& query_constraint : query_.parameter_constraints) {
-        const auto& this_query_constraint_cache =
-            parameter_types_cache_[query_constraint.constraint_name];
-        if (std::find(this_query_constraint_cache.begin(),
-                      this_query_constraint_cache.end(),
-                      intent_filter_param.type) !=
-            this_query_constraint_cache.end()) {
-          matching_query_constraints.push_back(
-              query_constraint.constraint_name);
-        }
-      }
-      intent_filter_param_to_query_constraints[intent_filter_param.name] =
-          matching_query_constraints;
-    }
-    return intent_filter_param_to_query_constraints;
-  }
-
-  // Returns a collection of valid mappings where the key is the query
-  // parameter, and the value is the manifest parameter to be populated with the
-  // query parameters contents.
-  //
-  // |remaining_intent_filter_params| are all the manifest parameters that are
-  // yet to be matched. |used_query_constraints| are all the query parameters
-  // that have already been used in the current solution.
-  std::vector<std::map<std::string, std::string>>
-  ComputeResultsFromEntryParameterToQueryParameterMapping(
-      const std::map<std::string, std::vector<std::string>>&
-          remaining_intent_filter_params,
-      const std::set<std::string>& used_query_constraints = {}) {
-    std::vector<std::map<std::string, std::string>> result;
-    if (remaining_intent_filter_params.empty()) {
-      return result;
-    }
-
-    auto first_intent_filter_param_it = remaining_intent_filter_params.begin();
-    const std::string& first_intent_filter_param_name =
-        first_intent_filter_param_it->first;
-    const std::vector<std::string> query_constraints_for_first_entry =
-        first_intent_filter_param_it->second;
-
-    // If there is only one remaining manifest parameter, create one result
-    // mapping for each viable query parameter.
-    if (remaining_intent_filter_params.size() == 1) {
-      for (const auto& query_constraint_name :
-           query_constraints_for_first_entry) {
-        // Don't create solutions where the query parameter has already been
-        // used.
-        if (used_query_constraints.find(query_constraint_name) !=
-            used_query_constraints.end()) {
-          continue;
-        }
-
-        std::map<std::string, std::string> result_map;
-        result_map[query_constraint_name] = first_intent_filter_param_name;
-        result.push_back(result_map);
-      }
-      return result;
-    }
-
-    for (const auto& query_constraint_name :
-         first_intent_filter_param_it->second) {
-      // If the query parameter has already been used, it cannot be matched
-      // again, and thus the loop continues.
-      if (used_query_constraints.find(query_constraint_name) !=
-          used_query_constraints.end()) {
-        continue;
-      }
-
-      // The current query parameter that will be used by the first manifest
-      // parameter must be added to the used set before computing the solution
-      // to the smaller problem.
-      std::set<std::string> new_used_query_constraints = used_query_constraints;
-      new_used_query_constraints.insert(query_constraint_name);
-
-      // Recurse for the remaining parameters.
-      std::vector<std::map<std::string, std::string>> solution_for_remainder =
-          ComputeResultsFromEntryParameterToQueryParameterMapping(
-              {std::next(remaining_intent_filter_params.begin()),
-               remaining_intent_filter_params.end()},
-              new_used_query_constraints);
-
-      // Expand each solution to the smaller problem by inserting the current
-      // query parameter -> manifest parameter into the solution.
-      for (const auto& existing_solution : solution_for_remainder) {
-        std::map<std::string, std::string> updated_solution = existing_solution;
-        updated_solution[query_constraint_name] =
-            first_intent_filter_param_name;
-        result.push_back(updated_solution);
-      }
-    }
-
-    return result;
-  }
-
-  LocalModuleResolver* const local_module_resolver_;
-  fuchsia::modular::FindModulesByTypesQuery const query_;
-  fuchsia::modular::FindModulesByTypesResponse response_;
-  // A cache of the parameter types for each parameter name in |query_|.
-  std::map<std::string, std::vector<std::string>>
-      parameter_types_cache_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FindModulesByTypesCall);
-};
-
-void LocalModuleResolver::FindModules(fuchsia::modular::FindModulesQuery query,
-                                      FindModulesCallback callback) {
-  operations_.Add(new FindModulesCall(this, std::move(query), callback));
-}
-
-void LocalModuleResolver::FindModulesByTypes(
-    fuchsia::modular::FindModulesByTypesQuery query,
-    FindModulesByTypesCallback callback) {
-  operations_.Add(new FindModulesByTypesCall(this, std::move(query), callback));
-}
-
-void LocalModuleResolver::GetModuleManifest(
-    std::string module_id, GetModuleManifestCallback callback) {
-  auto found_handlers = FindHandlers(module_id);
-  if (!found_handlers.empty()) {
-    callback(CloneOptional(manifests_[*found_handlers.begin()]));
-    return;
-  }
-
-  callback(nullptr);
-}
-
-namespace {
-bool StringStartsWith(const std::string& str, const std::string& prefix) {
-  return str.compare(0, prefix.length(), prefix) == 0;
-}
-}  // namespace
-
-void LocalModuleResolver::OnQuery(fuchsia::modular::UserInput query,
-                                  OnQueryCallback done) {
-  // TODO(thatguy): This implementation is bare-bones. Don't judge.
-  // Before adding new member variables to support OnQuery() (and tying the
-  // LocalModuleResolver internals up with what's needed for this method),
-  // please split the index-building & querying portion of LocalModuleResolver
-  // out into its own class. Then, make a new class to handle OnQuery() and
-  // share the same index instance here and there.
-  std::vector<fuchsia::modular::Proposal> proposals;
-  if (query.text.empty()) {
-    fuchsia::modular::QueryResponse response;
-    response.proposals = std::move(proposals);
-    done(std::move(response));
-    return;
-  }
-
-  for (const auto& id_entry : manifests_) {
-    const auto& manifest = id_entry.second;
-    for (const auto& intent_filter : *manifest.intent_filters) {
-      // Simply prefix match on the last element of the action.
-      // actions have a convention of being namespaced like java classes:
-      // com.google.subdomain.action
-      std::string action = intent_filter.action;
-      auto parts = fxl::SplitString(action, ".", fxl::kKeepWhitespace,
-                                    fxl::kSplitWantAll);
-      const auto& last_part = parts.back();
-      if (StringStartsWith(intent_filter.action, query.text) ||
-          StringStartsWith(last_part.ToString(), query.text)) {
-        fuchsia::modular::Proposal proposal;
-        proposal.id = manifest.binary;
-        proposal.affinity.resize(0);
-
-        fuchsia::modular::AddMod add_mod;
-        add_mod.intent.handler = manifest.binary;
-        add_mod.mod_name.push_back("root");
-
-        fuchsia::modular::StoryCommand command;
-        command.set_add_mod(std::move(add_mod));
-        proposal.on_selected.push_back(std::move(command));
-
-        proposal.display.headline =
-            std::string("Go go gadget ") + last_part.ToString();
-        proposal.display.subheadline = manifest.binary;
-        proposal.display.color = 0xffffffff;
-        proposal.display.annoyance = fuchsia::modular::AnnoyanceType::NONE;
-
-        proposal.confidence = 1.0;  // Yeah, super confident.
-
-        proposals.push_back(std::move(proposal));
-      }
-    }
-  }
-
-  if (proposals.size() > 10) {
-    proposals.resize(10);
-  }
-
-  fuchsia::modular::QueryResponse response;
-  response.proposals = std::move(proposals);
-  done(std::move(response));
-}
-
-void LocalModuleResolver::OnSourceIdle(const std::string& source_name) {
-  auto res = ready_sources_.insert(source_name);
-  if (!res.second) {
-    // It's OK for us to get an idle notification twice from a repo. This
-    // happens, for instance, if there's a network problem and we have to
-    // re-establish it.
-    return;
-  }
-
-  if (AllSourcesAreReady()) {
-    // They are all ready. Bind any pending Connect() calls.
-    for (auto& request : pending_bindings_) {
-      bindings_.AddBinding(this, std::move(request));
-    }
-    pending_bindings_.clear();
-  }
-}
-
-void LocalModuleResolver::OnNewManifestEntry(
-    const std::string& source_name, std::string module_uri,
-    fuchsia::modular::ModuleManifest new_manifest) {
-  FXL_LOG(INFO) << "New Module manifest for binary " << module_uri << " with "
-                << new_manifest.intent_filters->size() << " intent filters.";
-  auto manifest_id = ManifestId(source_name, module_uri);
-  // Add this new manifest info to our local index.
-  if (manifests_.count(manifest_id) > 0) {
-    // Remove this existing manifest first, then add it back in.
-    OnRemoveManifestEntry(source_name, module_uri);
-  }
-  if (new_manifest.intent_filters->size() == 0) {
-    new_manifest.intent_filters.resize(0);
-  }
-  auto ret = manifests_.emplace(manifest_id, std::move(new_manifest));
-  FXL_CHECK(ret.second);
-  const auto& manifest = ret.first->second;
-  for (const auto& intent_filter : *manifest.intent_filters) {
-    action_to_manifests_[intent_filter.action].insert(manifest_id);
-
-    for (const auto& constraint : intent_filter.parameter_constraints) {
-      parameter_type_and_name_to_manifests_[std::make_pair(constraint.type,
-                                                           constraint.name)]
-          .insert(manifest_id);
-      parameter_type_to_manifests_[constraint.type].insert(manifest_id);
-    }
-  }
-}
-
-void LocalModuleResolver::OnRemoveManifestEntry(const std::string& source_name,
-                                                std::string module_uri) {
-  ManifestId manifest_id(source_name, module_uri);
-  auto it = manifests_.find(manifest_id);
-  if (it == manifests_.end()) {
-    FXL_LOG(WARNING) << "Asked to remove non-existent manifest: "
-                     << manifest_id;
-    return;
-  }
-
-  const auto& manifest = it->second;
-  for (const auto& intent_filter : *manifest.intent_filters) {
-    action_to_manifests_[intent_filter.action].erase(manifest_id);
-
-    for (const auto& constraint : intent_filter.parameter_constraints) {
-      parameter_type_and_name_to_manifests_[std::make_pair(constraint.type,
-                                                           constraint.name)]
-          .erase(manifest_id);
-      parameter_type_to_manifests_[constraint.type].erase(manifest_id);
-    }
-  }
-
-  manifests_.erase(manifest_id);
-}
-
-void LocalModuleResolver::PeriodicCheckIfSourcesAreReady() {
-  if (!AllSourcesAreReady()) {
-    for (const auto& it : sources_) {
-      if (ready_sources_.count(it.first) == 0) {
-        FXL_LOG(WARNING) << "Still waiting on source: " << it.first;
-      }
-    }
-
-    if (already_checking_if_sources_are_ready_) return;
-    already_checking_if_sources_are_ready_ = true;
-    async::PostDelayedTask(
-        async_get_default_dispatcher(),
-        [weak_this = weak_factory_.GetWeakPtr()]() {
-          if (weak_this) {
-            weak_this->already_checking_if_sources_are_ready_ = false;
-            weak_this->PeriodicCheckIfSourcesAreReady();
-          }
-        },
-        zx::sec(10));
-  }
-}
-
-}  // namespace modular
diff --git a/bin/module_resolver/local_module_resolver.h b/bin/module_resolver/local_module_resolver.h
deleted file mode 100644
index e59e75b..0000000
--- a/bin/module_resolver/local_module_resolver.h
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_MODULE_RESOLVER_LOCAL_MODULE_RESOLVER_H_
-#define PERIDOT_BIN_MODULE_RESOLVER_LOCAL_MODULE_RESOLVER_H_
-
-#include <functional>
-#include <memory>
-#include <set>
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/lib/module_manifest_source/module_manifest_source.h"
-
-namespace modular {
-
-class LocalModuleResolver : fuchsia::modular::ModuleResolver,
-                            fuchsia::modular::QueryHandler {
- public:
-  LocalModuleResolver();
-  ~LocalModuleResolver() override;
-
-  // Adds a source of Module manifests to index. It is not allowed to call
-  // AddSource() after Connect(). |name| must be unique.
-  void AddSource(std::string name, std::unique_ptr<ModuleManifestSource> repo);
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::ModuleResolver> request);
-
-  void BindQueryHandler(
-      fidl::InterfaceRequest<fuchsia::modular::QueryHandler> request);
-
-  // |ModuleResolver|
-  void FindModules(fuchsia::modular::FindModulesQuery query,
-                   FindModulesCallback callback) override;
-  // |ModuleResolver|
-  void FindModulesByTypes(fuchsia::modular::FindModulesByTypesQuery query,
-                          FindModulesByTypesCallback callback) override;
-  // |ModuleResolver|
-  void GetModuleManifest(std::string module_id,
-                         GetModuleManifestCallback callback) override;
-
- private:
-  class FindModulesCall;
-  class FindModulesByTypesCall;
-
-  using ModuleUri = std::string;
-  using RepoSource = std::string;
-  // We use the module URI to identify the module manifest.
-  using ManifestId = std::tuple<RepoSource, ModuleUri>;
-  using ParameterName = std::string;
-  using ParameterType = std::string;
-  using Action = std::string;
-
-  std::set<ManifestId> FindHandlers(ModuleUri handler);
-
-  // |fuchsia::modular::QueryHandler|
-  void OnQuery(fuchsia::modular::UserInput query,
-               OnQueryCallback done) override;
-
-  void OnSourceIdle(const std::string& source_name);
-  void OnNewManifestEntry(const std::string& source_name, std::string id_in,
-                          fuchsia::modular::ModuleManifest new_entry);
-  void OnRemoveManifestEntry(const std::string& source_name, std::string id_in);
-
-  void PeriodicCheckIfSourcesAreReady();
-
-  bool AllSourcesAreReady() const {
-    return ready_sources_.size() == sources_.size();
-  }
-
-  // TODO(thatguy): At some point, factor the index functions out of
-  // LocalModuleResolver so that they can be re-used by the general all-modules
-  // Ask handler.
-  std::map<std::string, std::unique_ptr<ModuleManifestSource>> sources_;
-  // Set of sources that have told us they are idle, meaning they have
-  // sent us all manifests they knew about at construction time.
-  std::set<std::string> ready_sources_;
-  // Map of module manifest ID -> module manifest.
-  using ManifestMap = std::map<ManifestId, fuchsia::modular::ModuleManifest>;
-  ManifestMap manifests_;
-
-  // action -> key in |manifests_|
-  std::map<Action, std::set<ManifestId>> action_to_manifests_;
-  // (parameter type, parameter name) -> key in |manifests_|
-  std::map<std::pair<ParameterType, ParameterName>, std::set<ManifestId>>
-      parameter_type_and_name_to_manifests_;
-  //  (parameter type) -> keys in |manifests_|.
-  std::map<ParameterType, std::set<ManifestId>> parameter_type_to_manifests_;
-
-  fidl::BindingSet<fuchsia::modular::ModuleResolver> bindings_;
-  fidl::Binding<fuchsia::modular::QueryHandler> query_handler_binding_;
-  // These are buffered until AllSourcesAreReady() == true.
-  std::vector<fidl::InterfaceRequest<fuchsia::modular::ModuleResolver>>
-      pending_bindings_;
-
-  bool already_checking_if_sources_are_ready_;
-
-  OperationCollection operations_;
-
-  fxl::WeakPtrFactory<LocalModuleResolver> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LocalModuleResolver);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_MODULE_RESOLVER_LOCAL_MODULE_RESOLVER_H_
diff --git a/bin/module_resolver/local_module_resolver_unittest.cc b/bin/module_resolver/local_module_resolver_unittest.cc
deleted file mode 100644
index dcf08c7..0000000
--- a/bin/module_resolver/local_module_resolver_unittest.cc
+++ /dev/null
@@ -1,824 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/module_resolver/local_module_resolver.h"
-
-#include <lib/entity/cpp/json.h>
-#include <lib/fsl/types/type_converters.h>
-#include <lib/fxl/files/file.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/testing/entity_resolver_fake.h"
-
-namespace modular {
-namespace {
-
-fuchsia::modular::IntentFilter MakeIntentFilter(
-    std::string action,
-    std::vector<fuchsia::modular::ParameterConstraint> param_constraints) {
-  fuchsia::modular::IntentFilter f;
-  f.action = action;
-  f.parameter_constraints = param_constraints;
-  return f;
-}
-
-class TestManifestSource : public ModuleManifestSource {
- public:
-  IdleFn idle;
-  NewEntryFn add;
-  RemovedEntryFn remove;
-
- private:
-  void Watch(async_dispatcher_t* dispatcher, IdleFn idle_fn, NewEntryFn new_fn,
-             RemovedEntryFn removed_fn) override {
-    idle = std::move(idle_fn);
-    add = std::move(new_fn);
-    remove = std::move(removed_fn);
-  }
-};
-
-class FindModulesTest : public gtest::TestLoopFixture {
- protected:
-  void ResetResolver() {
-    // TODO: |impl_| will fail to resolve any queries whose parameters are
-    // entity references.
-    impl_ = std::make_unique<LocalModuleResolver>();
-    for (auto entry : test_sources_) {
-      impl_->AddSource(entry.first,
-                       std::unique_ptr<ModuleManifestSource>(entry.second));
-    }
-    test_sources_.clear();
-    impl_->Connect(resolver_.NewRequest());
-  }
-
-  TestManifestSource* AddSource(std::string name) {
-    // Ownership given to |impl_| in ResetResolver().
-    auto ptr = new TestManifestSource;
-    test_sources_.emplace(name, ptr);
-    return ptr;
-  }
-
-  void FindModules(fuchsia::modular::FindModulesQuery query) {
-    bool got_response = false;
-    resolver_->FindModules(
-        std::move(query),
-        [this, &got_response](fuchsia::modular::FindModulesResponse response) {
-          got_response = true;
-          response.Clone(&response_);
-        });
-    RunLoopUntilIdle();
-    ASSERT_TRUE(got_response);
-  }
-
-  const std::vector<fuchsia::modular::FindModulesResult>& results() const {
-    return response_.results;
-  }
-
-  class QueryBuilder {
-   public:
-    QueryBuilder() = delete;
-
-    QueryBuilder(std::string action)
-        : query(fuchsia::modular::FindModulesQuery()) {
-      query.action = action;
-      query.parameter_constraints.resize(0);
-    }
-
-    fuchsia::modular::FindModulesQuery build() { return std::move(query); }
-
-    QueryBuilder& AddParameter(std::string name,
-                               std::vector<std::string> types) {
-      fuchsia::modular::FindModulesParameterConstraint constraint;
-      constraint.param_name = name;
-      constraint.param_types = types;
-      query.parameter_constraints.push_back(std::move(constraint));
-      return *this;
-    }
-
-   private:
-    fuchsia::modular::FindModulesQuery query;
-  };
-
-  std::unique_ptr<LocalModuleResolver> impl_;
-
-  std::map<std::string, ModuleManifestSource*> test_sources_;
-  fuchsia::modular::ModuleResolverPtr resolver_;
-
-  fuchsia::modular::FindModulesResponse response_;
-};
-
-class FindModulesByTypesTest : public gtest::TestLoopFixture {
- protected:
-  void ResetResolver() {
-    // TODO: |impl_| will fail to resolve any queries whose parameters are
-    // entity references.
-    impl_ = std::make_unique<LocalModuleResolver>();
-    for (auto entry : test_sources_) {
-      impl_->AddSource(entry.first,
-                       std::unique_ptr<ModuleManifestSource>(entry.second));
-    }
-    test_sources_.clear();
-    impl_->Connect(resolver_.NewRequest());
-  }
-
-  TestManifestSource* AddSource(std::string name) {
-    // Ownership given to |impl_| in ResetResolver().
-    auto ptr = new TestManifestSource;
-    test_sources_.emplace(name, ptr);
-    return ptr;
-  }
-
-  void FindModulesByTypes(fuchsia::modular::FindModulesByTypesQuery query) {
-    bool got_response = false;
-    resolver_->FindModulesByTypes(
-        std::move(query),
-        [this,
-         &got_response](fuchsia::modular::FindModulesByTypesResponse response) {
-          got_response = true;
-          response.Clone(&response_);
-        });
-    RunLoopUntilIdle();
-    ASSERT_TRUE(got_response);
-  }
-
-  const std::vector<fuchsia::modular::FindModulesByTypesResult>& results()
-      const {
-    return response_.results;
-  }
-
-  class QueryBuilder {
-   public:
-    fuchsia::modular::FindModulesByTypesQuery build() {
-      return std::move(query);
-    }
-
-    QueryBuilder& AddParameter(std::string name,
-                               std::vector<std::string> types) {
-      fuchsia::modular::FindModulesByTypesParameterConstraint constraint;
-      constraint.constraint_name = name;
-      constraint.param_types = types;
-      query.parameter_constraints.push_back(std::move(constraint));
-      return *this;
-    }
-
-   private:
-    fuchsia::modular::FindModulesByTypesQuery query;
-  };
-
-  std::string GetMappingFromQuery(
-      const std::vector<
-          fuchsia::modular::FindModulesByTypesParameterMapping>& mapping,
-      std::string query_constraint_name) {
-    for (auto& item : mapping) {
-      if (item.query_constraint_name == query_constraint_name) {
-        return item.result_param_name;
-      }
-    }
-    return "";
-  }
-
-  std::unique_ptr<LocalModuleResolver> impl_;
-
-  std::map<std::string, ModuleManifestSource*> test_sources_;
-  fuchsia::modular::ModuleResolverPtr resolver_;
-
-  fuchsia::modular::FindModulesByTypesResponse response_;
-};
-
-TEST_F(FindModulesTest, Null) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  fuchsia::modular::ModuleManifest entry;
-  entry.binary = "id1";
-  entry.intent_filters.push_back(MakeIntentFilter("verb wont match", {}));
-  source->add("1", std::move(entry));
-  source->idle();
-
-  FindModules(QueryBuilder("no matchy!").build());
-
-  // The Resolver returns an empty candidate list
-  ASSERT_EQ(0lu, results().size());
-}
-
-TEST_F(FindModulesTest, Simpleaction) {
-  // Also add Modules from multiple different sources.
-  auto source1 = AddSource("test1");
-  auto source2 = AddSource("test2");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    entry.intent_filters.push_back(
-        MakeIntentFilter("com.google.fuchsia.navigate.v1", {}));
-    source1->add("module1", std::move(entry));
-  }
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module2";
-    entry.intent_filters.push_back(
-        MakeIntentFilter("com.google.fuchsia.navigate.v1", {}));
-    source2->add("module2", std::move(entry));
-  }
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module3";
-    entry.intent_filters.push_back(
-        MakeIntentFilter("com.google.fuchsia.exist.vinfinity", {}));
-    source1->add("module3", std::move(entry));
-  }
-
-  source1->idle();
-  source2->idle();
-
-  // This is mostly the contents of the FindModules() convenience function
-  // above.  It's copied here so that we can call source2->idle() before
-  // RunLoopUntilIdle() for this case only.
-  bool got_response = false;
-  resolver_->FindModules(
-      QueryBuilder("com.google.fuchsia.navigate.v1").build(),
-      [this, &got_response](fuchsia::modular::FindModulesResponse response) {
-        got_response = true;
-        response.Clone(&response_);
-      });
-
-  // Waiting until here to set |source2| as idle shows that FindModules() is
-  // effectively delayed until all sources have indicated idle ("module2" is in
-  // |source2|).
-  source2->idle();
-  RunLoopUntilIdle();
-  ASSERT_TRUE(got_response);
-
-  ASSERT_EQ(2lu, results().size());
-  EXPECT_EQ("module1", results().at(0).module_id);
-  EXPECT_EQ("module2", results().at(1).module_id);
-
-  // Remove the entries and we should see no more results. Our
-  // TestManifestSource implementation above doesn't send its tasks to the
-  // task_runner so we don't have to wait.
-  source1->remove("module1");
-  source2->remove("module2");
-
-  FindModules(QueryBuilder("com.google.fuchsia.navigate.v1").build());
-  ASSERT_EQ(0lu, results().size());
-}
-
-TEST_F(FindModulesTest, SimpleParameterTypes) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter1;
-    parameter1.name = "start";
-    parameter1.type = "foo";
-    fuchsia::modular::ParameterConstraint parameter2;
-    parameter2.name = "destination";
-    parameter2.type = "baz";
-    entry.intent_filters.push_back(
-        MakeIntentFilter("com.google.fuchsia.navigate.v1",
-                         {std::move(parameter1), std::move(parameter2)}));
-    source->add("1", std::move(entry));
-  }
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module2";
-    fuchsia::modular::ParameterConstraint parameter1;
-    parameter1.name = "start";
-    parameter1.type = "frob";
-    fuchsia::modular::ParameterConstraint parameter2;
-    parameter2.name = "destination";
-    parameter2.type = "froozle";
-    entry.intent_filters.push_back(
-        MakeIntentFilter("com.google.fuchsia.navigate.v1",
-                         {std::move(parameter1), std::move(parameter2)}));
-    source->add("2", std::move(entry));
-  }
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module3";
-    fuchsia::modular::ParameterConstraint parameter;
-    parameter.name = "with";
-    parameter.type = "compantionCube";
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.exist.vinfinity", {std::move(parameter)}));
-    source->add("3", std::move(entry));
-  }
-  source->idle();
-
-  // Either 'foo' or 'tangoTown' would be acceptible types. Only 'foo' will
-  // actually match.
-  FindModules(QueryBuilder("com.google.fuchsia.navigate.v1")
-                  .AddParameter("start", {"foo", "tangoTown"})
-                  .build());
-  ASSERT_EQ(1lu, results().size());
-  EXPECT_EQ("module1", results().at(0).module_id);
-
-  // This one will match one of the two parameter constraints on module1, but
-  // not both, so no match at all is expected.
-  FindModules(QueryBuilder("com.google.fuchsia.navigate.v1")
-                  .AddParameter("start", {"foo", "tangoTown"})
-                  .AddParameter("destination", {"notbaz"})
-                  .build());
-  ASSERT_EQ(0lu, results().size());
-
-  // Given parameter of type "frob", find a module with action
-  // com.google.fuchsia.navigate.v1.
-  FindModules(QueryBuilder("com.google.fuchsia.navigate.v1")
-                  .AddParameter("start", {"frob"})
-                  .build());
-  ASSERT_EQ(1u, results().size());
-  auto& res = results().at(0);
-  EXPECT_EQ("module2", res.module_id);
-}
-
-TEST_F(FindModulesTest, ReAddExistingEntries) {
-  // Add the same entry twice, to simulate what could happen during a network
-  // reconnect, and show that the Module is still available.
-  auto source = AddSource("test1");
-  ResetResolver();
-
-  fuchsia::modular::ModuleManifest entry;
-  entry.binary = "id1";
-  entry.intent_filters.push_back(MakeIntentFilter("action1", {}));
-
-  fuchsia::modular::ModuleManifest entry1;
-  entry.Clone(&entry1);
-  source->add("1", std::move(entry1));
-  source->idle();
-  FindModules(QueryBuilder("action1").build());
-  ASSERT_EQ(1lu, results().size());
-  EXPECT_EQ("id1", results().at(0).module_id);
-
-  fuchsia::modular::ModuleManifest entry2;
-  entry.Clone(&entry2);
-  source->add("1", std::move(entry2));
-  FindModules(QueryBuilder("action1").build());
-  ASSERT_EQ(1lu, results().size());
-  EXPECT_EQ("id1", results().at(0).module_id);
-}
-
-// Tests that a query that does not contain a action or a URL matches a
-// parameter with the correct types.
-TEST_F(FindModulesByTypesTest, MatchingParameterWithNoactionOrUrl) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter;
-    parameter.name = "start";
-    parameter.type = "foo";
-    entry.intent_filters.push_back(
-        MakeIntentFilter("com.google.fuchsia.navigate.v1", {parameter}));
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModulesByTypes(
-      QueryBuilder().AddParameter("start", {"foo", "bar"}).build());
-
-  ASSERT_EQ(1lu, results().size());
-  EXPECT_EQ("module1", results().at(0).module_id);
-}
-
-// Tests that a query that does not contain a action or a URL matches when the
-// parameter types do, even if the parameter name does not.
-TEST_F(FindModulesByTypesTest, CorrectParameterTypeWithNoactionOrUrl) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter;
-    parameter.name = "end";
-    parameter.type = "foo";
-    entry.intent_filters.push_back(
-        MakeIntentFilter("com.google.fuchsia.navigate.v1", {parameter}));
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModulesByTypes(
-      QueryBuilder().AddParameter("start", {"foo", "bar"}).build());
-
-  ASSERT_EQ(1lu, results().size());
-  EXPECT_EQ("module1", results().at(0).module_id);
-}
-
-// Tests that a query that does not contain a action or a URL returns results
-// for multiple matching entries.
-TEST_F(FindModulesByTypesTest,
-       CorrectParameterTypeWithNoactionOrUrlMultipleMatches) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter;
-    parameter.name = "end";
-    parameter.type = "foo";
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.navigate.v1", {std::move(parameter)}));
-    source->add("1", std::move(entry));
-  }
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module2";
-    fuchsia::modular::ParameterConstraint parameter;
-    parameter.name = "end";
-    parameter.type = "foo";
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.navigate.v2", {std::move(parameter)}));
-    source->add("2", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModulesByTypes(
-      QueryBuilder().AddParameter("start", {"foo", "bar"}).build());
-
-  ASSERT_EQ(2lu, results().size());
-  EXPECT_EQ("module1", results().at(0).module_id);
-  EXPECT_EQ("module2", results().at(1).module_id);
-}
-
-// Tests that a query that does not contain a action or a URL does not match
-// when the parameter types don't match.
-TEST_F(FindModulesByTypesTest, IncorrectParameterTypeWithNoactionOrUrl) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter;
-    parameter.name = "start";
-    parameter.type = "not";
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.navigate.v1", {std::move(parameter)}));
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModulesByTypes(
-      QueryBuilder().AddParameter("start", {"foo", "bar"}).build());
-
-  EXPECT_EQ(0lu, results().size());
-}
-
-// Tests that a query without a action or url, that contains more parameters
-// than the potential result, still returns that result.
-TEST_F(FindModulesByTypesTest, QueryWithMoreParametersThanEntry) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter;
-    parameter.name = "start";
-    parameter.type = "gps";
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.navigate.v1", {std::move(parameter)}));
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModulesByTypes(QueryBuilder()
-                         .AddParameter("start", {"gps", "bar"})
-                         .AddParameter("end", {"foo", "bar"})
-                         .build());
-
-  EXPECT_EQ(1lu, results().size());
-}
-
-// Tests that for a query with multiple parameters, each parameter gets assigned
-// to the correct module parameters.
-TEST_F(FindModulesByTypesTest, QueryWithoutActionAndMultipleParameters) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter1;
-    parameter1.name = "start";
-    parameter1.type = "gps";
-    fuchsia::modular::ParameterConstraint parameter2;
-    parameter2.name = "end";
-    parameter2.type = "not_gps";
-    entry.intent_filters.push_back(
-        MakeIntentFilter("com.google.fuchsia.navigate.v1",
-                         {std::move(parameter1), std::move(parameter2)}));
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModulesByTypes(QueryBuilder()
-                         .AddParameter("parameter1", {"gps"})
-                         .AddParameter("parameter2", {"not_gps"})
-                         .build());
-
-  ASSERT_EQ(1lu, results().size());
-  auto& result = results().at(0);
-
-  EXPECT_EQ("start",
-            GetMappingFromQuery(result.parameter_mappings, "parameter1"));
-  EXPECT_EQ("end",
-            GetMappingFromQuery(result.parameter_mappings, "parameter2"));
-}
-
-// Tests that when there are multiple valid mappings of query parameter types to
-// entities, all such combinations are returned.
-TEST_F(FindModulesByTypesTest, FindModulesByTypeWithTwoParametersOfSameType) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter1;
-    parameter1.name = "start";
-    parameter1.type = "gps";
-    fuchsia::modular::ParameterConstraint parameter2;
-    parameter2.name = "end";
-    parameter2.type = "gps";
-    entry.intent_filters.push_back(
-        MakeIntentFilter("com.google.fuchsia.navigate.v1",
-                         {std::move(parameter1), std::move(parameter2)}));
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModulesByTypes(QueryBuilder()
-                         .AddParameter("parameter1", {"gps"})
-                         .AddParameter("parameter2", {"gps"})
-                         .build());
-
-  EXPECT_EQ(2lu, results().size());
-
-  bool found_first_mapping = false;
-  bool found_second_mapping = false;
-
-  for (const auto& result : results()) {
-    bool start_mapped_to_p1 =
-        GetMappingFromQuery(result.parameter_mappings, "parameter1") == "start";
-
-    bool start_mapped_to_p2 =
-        GetMappingFromQuery(result.parameter_mappings, "parameter2") == "start";
-
-    bool end_mapped_to_p1 =
-        GetMappingFromQuery(result.parameter_mappings, "parameter1") == "end";
-
-    bool end_mapped_to_p2 =
-        GetMappingFromQuery(result.parameter_mappings, "parameter2") == "end";
-
-    found_first_mapping |= start_mapped_to_p1 && end_mapped_to_p2;
-    found_second_mapping |= start_mapped_to_p2 && end_mapped_to_p1;
-  }
-
-  EXPECT_TRUE(found_first_mapping);
-  EXPECT_TRUE(found_second_mapping);
-}
-
-// Tests that a query with three parameters of the same type matches an entry
-// with three expected parameters in 6 different ways.
-TEST_F(FindModulesByTypesTest, QueryWithoutActionAndThreeParametersOfSameType) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter1;
-    parameter1.name = "start";
-    parameter1.type = "gps";
-    fuchsia::modular::ParameterConstraint parameter2;
-    parameter2.name = "end";
-    parameter2.type = "gps";
-    fuchsia::modular::ParameterConstraint parameter3;
-    parameter3.name = "middle";
-    parameter3.type = "gps";
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.navigate.v1",
-        {std::move(parameter1), std::move(parameter2), std::move(parameter3)}));
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModulesByTypes(QueryBuilder()
-                         .AddParameter("parameter1", {"gps"})
-                         .AddParameter("parameter2", {"gps"})
-                         .AddParameter("parameter3", {"gps"})
-                         .build());
-
-  EXPECT_EQ(6lu, results().size());
-}
-
-// Tests that a query with three parameters of the same type matches an entry
-// with two expected parameters in 6 different ways.
-TEST_F(FindModulesByTypesTest,
-       QueryWithoutActionAndDifferentNumberOfParametersInQueryVsEntry) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter1;
-    parameter1.name = "start";
-    parameter1.type = "gps";
-    fuchsia::modular::ParameterConstraint parameter2;
-    parameter2.name = "end";
-    parameter2.type = "gps";
-    entry.intent_filters.push_back(
-        MakeIntentFilter("com.google.fuchsia.navigate.v1",
-                         {std::move(parameter1), std::move(parameter2)}));
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModulesByTypes(QueryBuilder()
-                         .AddParameter("parameter1", {"gps"})
-                         .AddParameter("parameter2", {"gps"})
-                         .AddParameter("parameter3", {"gps"})
-                         .build());
-
-  EXPECT_EQ(6lu, results().size());
-}
-
-// Tests that a query without a action does not match a module that requires a
-// proper superset of the query parameters.
-TEST_F(FindModulesByTypesTest,
-       QueryWithoutActionWithEntryContainingProperSuperset) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter1;
-    parameter1.name = "start";
-    parameter1.type = "gps";
-    fuchsia::modular::ParameterConstraint parameter2;
-    parameter2.name = "end";
-    parameter2.type = "gps";
-    entry.intent_filters.push_back(
-        MakeIntentFilter("com.google.fuchsia.navigate.v1",
-                         {std::move(parameter1), std::move(parameter2)}));
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  // The query only contains an fuchsia::modular::Entity for "parameter1", but
-  // the module manifest requires two parameters of type "gps."
-  FindModulesByTypes(
-      QueryBuilder().AddParameter("parameter1", {"gps"}).build());
-
-  EXPECT_EQ(0lu, results().size());
-}
-
-// Tests that a query without a action does not match an entry where the
-// parameter types are incompatible.
-TEST_F(FindModulesByTypesTest, QueryWithoutActionIncompatibleParameterTypes) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter;
-    parameter.name = "start";
-    parameter.type = "gps";
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.navigate.v1", {std::move(parameter)}));
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  // The query only contains an fuchsia::modular::Entity for "parameter1", but
-  // the module manifest requires two parameters of type "gps."
-  FindModulesByTypes(
-      QueryBuilder().AddParameter("parameter1", {"not_gps"}).build());
-
-  EXPECT_EQ(0lu, results().size());
-}
-
-// Tests that a query with a action requires parameter name and type to match
-// (i.e. does not behave like action-less matching where the parameter names are
-// disregarded).
-TEST_F(FindModulesTest, QueryWithActionMatchesBothParameterNamesAndTypes) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter;
-    parameter.name = "end";
-    parameter.type = "foo";
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.navigate.v1", {std::move(parameter)}));
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModules(QueryBuilder("com.google.fuchsia.navigate.v1")
-                  .AddParameter("start", {"foo", "baz"})
-                  .build());
-
-  EXPECT_EQ(0lu, results().size());
-}
-
-TEST_F(FindModulesTest, MultipleIntentFilters) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter;
-    parameter.name = "end";
-    parameter.type = "foo";
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.navigate.v1", {modular::CloneStruct(parameter)}));
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.navigate.v2", {modular::CloneStruct(parameter)}));
-
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModules(QueryBuilder("com.google.fuchsia.navigate.v1")
-                  .AddParameter("end", {"foo"})
-                  .build());
-  ASSERT_EQ(1lu, results().size());
-  EXPECT_EQ("module1", results().at(0).module_id);
-
-  FindModules(QueryBuilder("com.google.fuchsia.navigate.v2")
-                  .AddParameter("end", {"foo"})
-                  .build());
-  ASSERT_EQ(1lu, results().size());
-  EXPECT_EQ("module1", results().at(0).module_id);
-
-  FindModules(QueryBuilder("com.google.fuchsia.navigate.v3")
-                  .AddParameter("end", {"foo"})
-                  .build());
-  ASSERT_EQ(0lu, results().size());
-}
-
-TEST_F(FindModulesByTypesTest, MultipleIntentFilters) {
-  auto source = AddSource("test");
-  ResetResolver();
-
-  {
-    fuchsia::modular::ModuleManifest entry;
-    entry.binary = "module1";
-    fuchsia::modular::ParameterConstraint parameter;
-    parameter.name = "end";
-    parameter.type = "foo";
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.navigate.v1", {modular::CloneStruct(parameter)}));
-    entry.intent_filters.push_back(MakeIntentFilter(
-        "com.google.fuchsia.navigate.v2", {modular::CloneStruct(parameter)}));
-
-    source->add("1", std::move(entry));
-  }
-
-  source->idle();
-
-  FindModulesByTypes(QueryBuilder().AddParameter("end", {"foo"}).build());
-
-  ASSERT_EQ(2lu, results().size());
-  // expected action =>.
-  std::set<std::string> actual_actions;
-  for (size_t i = 0; i < 2u; i++) {
-    EXPECT_EQ("module1", results().at(i).module_id);
-    actual_actions.insert(results().at(i).action);
-  }
-  EXPECT_EQ(1u, actual_actions.count("com.google.fuchsia.navigate.v1"));
-  EXPECT_EQ(1u, actual_actions.count("com.google.fuchsia.navigate.v2"));
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/module_resolver/meta/module_resolver.cmx b/bin/module_resolver/meta/module_resolver.cmx
deleted file mode 100644
index 352ce55..0000000
--- a/bin/module_resolver/meta/module_resolver.cmx
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "pkgfs": [
-            "packages"
-        ],
-        "services": [
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.modular.IntelligenceServices",
-            "fuchsia.net.oldhttp.HttpService"
-        ],
-        "system": [
-            "data/initial_module_packages"
-        ]
-    }
-}
diff --git a/bin/module_resolver/module_package_indexer/BUILD.gn b/bin/module_resolver/module_package_indexer/BUILD.gn
deleted file mode 100644
index c7bc507..0000000
--- a/bin/module_resolver/module_package_indexer/BUILD.gn
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-executable_package("module_package_indexer") {
-  sources = [
-    "main.cc",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/lib:maxwell_internal",
-    "//peridot/lib/module_manifest_source:package_util",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fdio",
-  ]
-
-  meta = [
-    {
-      path = "meta/module_package_indexer.cmx"
-      dest = "module_package_indexer.cmx"
-    },
-  ]
-}
diff --git a/bin/module_resolver/module_package_indexer/main.cc b/bin/module_resolver/module_package_indexer/main.cc
deleted file mode 100644
index 83a5cdc..0000000
--- a/bin/module_resolver/module_package_indexer/main.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <dirent.h>
-#include <glob.h>
-#include <sys/types.h>
-#include <iostream>
-#include <string>
-#include <vector>
-
-#include <fuchsia/maxwell/internal/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fdio/util.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/log_settings_command_line.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "peridot/lib/module_manifest_source/package_util.h"
-
-using ::fuchsia::maxwell::internal::ModulePackageIndexer;
-using ::fuchsia::maxwell::internal::ModulePackageIndexerPtr;
-
-// This function finds the ModulePackageIndexer fidl service that the
-// module_resolver runs.
-std::string FindModulePackageIndexerService() {
-  // The ModulePackageIndexer service is run by the module_resolver component
-  // under current sys realm. The structured path of to this service is:
-  // /hub//r/user-<userid>/<koid>/c/module_resolver/<koid>/out/debug
-  auto glob_str =
-      fxl::StringPrintf("/hub/r/user-*/*/c/module_resolver/*/out/debug/%s",
-                        ModulePackageIndexer::Name_);
-
-  glob_t globbuf;
-  std::string service_path;
-  FXL_CHECK(glob(glob_str.data(), 0, nullptr, &globbuf) == 0);
-  if (globbuf.gl_pathc > 0) {
-    service_path = globbuf.gl_pathv[0];
-  }
-  if (globbuf.gl_pathc > 1) {
-    FXL_DLOG(WARNING) << "Found more than one module resolver.";
-  }
-  globfree(&globbuf);
-  return service_path;
-}
-
-int main(int argc, const char** argv) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-
-  const auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  fxl::SetLogSettingsFromCommandLine(command_line);
-
-  if (command_line.positional_args().size() != 2) {
-    std::cerr << "Usage:  " << command_line.argv0()
-              << " <package name> <version>";
-    return 1;
-  }
-
-  auto service_path = FindModulePackageIndexerService();
-  FXL_CHECK(!service_path.empty())
-      << "Could not find a running module resolver. Is the user logged in?";
-
-  ModulePackageIndexerPtr indexer;
-  auto req_handle = indexer.NewRequest().TakeChannel();
-  if (fdio_service_connect(service_path.c_str(), req_handle.get()) != ZX_OK) {
-    FXL_LOG(FATAL) << "Could not connect to service " << service_path;
-    return 1;
-  }
-
-  const auto& package_name = command_line.positional_args()[0];
-  const auto& package_version = command_line.positional_args()[1];
-  indexer->IndexManifest(
-      package_name,
-      modular::GetModuleManifestPathFromPackage(package_name, package_version));
-
-  return 0;
-}
diff --git a/bin/module_resolver/module_package_indexer/meta/module_package_indexer.cmx b/bin/module_resolver/module_package_indexer/meta/module_package_indexer.cmx
deleted file mode 100644
index 7fa3eae..0000000
--- a/bin/module_resolver/module_package_indexer/meta/module_package_indexer.cmx
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [
-            "shell"
-        ],
-        "services": []
-    }
-}
diff --git a/bin/module_resolver/module_resolver_main.cc b/bin/module_resolver/module_resolver_main.cc
deleted file mode 100644
index f44cf3d..0000000
--- a/bin/module_resolver/module_resolver_main.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/net/oldhttp/cpp/fidl.h>
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/entity/cpp/json.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/module_resolver/local_module_resolver.h"
-#include "peridot/lib/module_manifest_source/firebase_source.h"
-#include "peridot/lib/module_manifest_source/module_package_source.h"
-
-namespace modular {
-namespace {
-
-namespace http = ::fuchsia::net::oldhttp;
-
-class ModuleResolverApp {
- public:
-  ModuleResolverApp(component::StartupContext* const context, bool is_test) {
-    resolver_impl_ = std::make_unique<LocalModuleResolver>();
-    // Set up |resolver_impl_|.
-    resolver_impl_->AddSource("module_package",
-                              std::make_unique<ModulePackageSource>(context));
-
-    context->outgoing().AddPublicService<fuchsia::modular::ModuleResolver>(
-        [this](
-            fidl::InterfaceRequest<fuchsia::modular::ModuleResolver> request) {
-          resolver_impl_->Connect(std::move(request));
-        });
-  }
-
-  void Terminate(const std::function<void()>& done) { done(); }
-
- private:
-  std::unique_ptr<LocalModuleResolver> resolver_impl_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ModuleResolverApp);
-};
-
-}  // namespace
-}  // namespace modular
-
-const char kUsage[] = R"USAGE(%s [--test])USAGE";
-
-int main(int argc, const char** argv) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  if (command_line.HasOption("help")) {
-    printf(kUsage, argv[0]);
-    return 0;
-  }
-  auto is_test = command_line.HasOption("test");
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AppDriver<modular::ModuleResolverApp> driver(
-      context->outgoing().deprecated_services(),
-      std::make_unique<modular::ModuleResolverApp>(context.get(), is_test),
-      [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/bin/module_resolver/type_inference.cc b/bin/module_resolver/type_inference.cc
deleted file mode 100644
index 9520b1d..0000000
--- a/bin/module_resolver/type_inference.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/module_resolver/type_inference.h"
-
-#include <string>
-#include <vector>
-
-#include <lib/async/cpp/operation.h>
-#include <lib/entity/cpp/json.h>
-#include <lib/fsl/types/type_converters.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/type_converter.h>
-
-namespace modular {
-
-ParameterTypeInferenceHelper::ParameterTypeInferenceHelper(
-    fuchsia::modular::EntityResolverPtr entity_resolver)
-    : entity_resolver_(std::move(entity_resolver)) {}
-
-ParameterTypeInferenceHelper::~ParameterTypeInferenceHelper() = default;
-
-class ParameterTypeInferenceHelper::GetParameterTypesCall
-    : public Operation<std::vector<std::string>> {
- public:
-  GetParameterTypesCall(fuchsia::modular::EntityResolver* entity_resolver,
-                        const fidl::StringPtr& entity_reference,
-                        ResultCall result)
-      : Operation("ParameterTypeInferenceHelper::GetParameterTypesCall",
-                  std::move(result)),
-        entity_resolver_(entity_resolver),
-        entity_reference_(entity_reference) {}
-
-  void Run() {
-    entity_resolver_->ResolveEntity(entity_reference_, entity_.NewRequest());
-    entity_->GetTypes([this](const fidl::VectorPtr<fidl::StringPtr>& types) {
-      Done(fxl::To<std::vector<std::string>>(types));
-    });
-  }
-
- private:
-  fuchsia::modular::EntityResolver* const entity_resolver_;
-  fidl::StringPtr const entity_reference_;
-  fuchsia::modular::EntityPtr entity_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(GetParameterTypesCall);
-};
-
-void ParameterTypeInferenceHelper::GetParameterTypes(
-    const fuchsia::modular::ResolverParameterConstraint& parameter_constraint,
-    const std::function<void(std::vector<std::string>)>& result_callback) {
-  if (parameter_constraint.is_entity_type()) {
-    result_callback(
-        std::vector<std::string>(parameter_constraint.entity_type()->begin(),
-                                 parameter_constraint.entity_type()->end()));
-  } else if (parameter_constraint.is_json()) {
-    std::vector<std::string> types;
-    if (!ExtractEntityTypesFromJson(parameter_constraint.json(), &types)) {
-      FXL_LOG(WARNING) << "Mal-formed JSON in parameter: "
-                       << parameter_constraint.json();
-      result_callback({});
-    } else {
-      result_callback(types);
-    }
-  } else if (parameter_constraint.is_entity_reference()) {
-    operation_collection_.Add(new GetParameterTypesCall(
-        entity_resolver_.get(), parameter_constraint.entity_reference(),
-        result_callback));
-  } else if (parameter_constraint.is_link_info()) {
-    if (parameter_constraint.link_info().allowed_types) {
-      std::vector<std::string> types(
-          parameter_constraint.link_info()
-              .allowed_types->allowed_entity_types->begin(),
-          parameter_constraint.link_info()
-              .allowed_types->allowed_entity_types->end());
-      result_callback(std::move(types));
-    } else if (parameter_constraint.link_info().content_snapshot) {
-      // TODO(thatguy): See if there's an fuchsia::modular::Entity reference on
-      // the fuchsia::modular::Link. If so, get the types from that.  If
-      // resolution results in a Module being started, this
-      // fuchsia::modular::Link should have its allowed types constrained, since
-      // *another* Module is now relying on a small set of types being set.
-      // Consider doing this when we move type extraction to the Framework and
-      // simplify the Resolver.
-      std::string entity_reference;
-      if (EntityReferenceFromJson(
-              parameter_constraint.link_info().content_snapshot,
-              &entity_reference)) {
-        operation_collection_.Add(new GetParameterTypesCall(
-            entity_resolver_.get(), entity_reference, result_callback));
-      }
-    }
-  } else {
-    FXL_NOTREACHED();
-  }
-}
-
-}  // namespace modular
diff --git a/bin/module_resolver/type_inference.h b/bin/module_resolver/type_inference.h
deleted file mode 100644
index f84a445..0000000
--- a/bin/module_resolver/type_inference.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_MODULE_RESOLVER_TYPE_INFERENCE_H_
-#define PERIDOT_BIN_MODULE_RESOLVER_TYPE_INFERENCE_H_
-
-#include <string>
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-
-namespace modular {
-
-class ParameterTypeInferenceHelper {
- public:
-  ParameterTypeInferenceHelper(
-      fuchsia::modular::EntityResolverPtr entity_resolver);
-  ~ParameterTypeInferenceHelper();
-
-  // Returns a list of types represented in |parameter_constraint|. Chooses the
-  // correct process for type extraction based on the type of Parameter.
-  void GetParameterTypes(
-      const fuchsia::modular::ResolverParameterConstraint& parameter_constraint,
-      const std::function<void(std::vector<std::string>)>& result_callback);
-
- private:
-  class GetParameterTypesCall;
-
-  fuchsia::modular::EntityResolverPtr entity_resolver_;
-  OperationCollection operation_collection_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ParameterTypeInferenceHelper);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_MODULE_RESOLVER_TYPE_INFERENCE_H_
diff --git a/bin/sessionctl/BUILD.gn b/bin/sessionctl/BUILD.gn
deleted file mode 100644
index 7bdf776..0000000
--- a/bin/sessionctl/BUILD.gn
+++ /dev/null
@@ -1,77 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-import("//peridot/build/tests_package.gni")
-
-executable_package("sessionctl") {
-  # We do this only to have `sessionctl` appear in the shell's
-  # PATH. When a solution to this is available, remove this line
-  # and uncomment the "meta =" stanza below.
-  deprecated_system_image = true
-
-  sources = [
-    "main.cc",
-  ]
-
-  deps = [
-    ":lib",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/rapidjson",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-    "//peridot/public/lib/async/cpp:future",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fdio",
-  ]
-
-  # meta = [
-  #   {
-  #     path = "meta/sessionctl.cmx"
-  #     dest = "sessionctl.cmx"
-  #   },
-  # ]
-}
-
-source_set("lib") {
-  sources = [
-    "logger.cc",
-    "logger.h",
-    "session_ctl_app.cc",
-    "session_ctl_app.h",
-    "session_ctl_constants.h",
-  ]
-
-  deps = [
-    "//peridot/lib/rapidjson",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-    "//peridot/public/lib/async/cpp:future",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable("sessionctl_unittest") {
-  testonly = true
-
-  sources = [
-    "session_ctl_app_unittest.cc",
-  ]
-
-  deps = [
-    ":lib",
-    "//peridot/bin/sessionmgr/puppet_master:puppet_master_impl",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:test_story_command_executor",
-    "//peridot/lib/testing:test_with_session_storage",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-tests_package("sessionctl_unittests") {
-  deps = [
-    ":sessionctl_unittest",
-  ]
-}
diff --git a/bin/sessionctl/logger.cc b/bin/sessionctl/logger.cc
deleted file mode 100644
index 9cfca00..0000000
--- a/bin/sessionctl/logger.cc
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionctl/logger.h"
-#include "peridot/bin/sessionctl/session_ctl_constants.h"
-
-namespace modular {
-
-const char kSuccessString[] = "success";
-const char kCommandString[] = "command";
-
-// Key strings for JSON output.
-const char kParamsKeyString[] = "params";
-const char kStoriesKeyString[] = "stories";
-
-Logger::Logger(bool json_out) : json_out_(json_out) {}
-
-void Logger::LogError(const std::string& command,
-                      const std::string& error) const {
-  if (json_out_) {
-    rapidjson::Document document;
-    document.SetObject();
-
-    document.AddMember(kSuccessString, false, document.GetAllocator());
-    document.AddMember(kCommandString, command, document.GetAllocator());
-    document.AddMember("error", error, document.GetAllocator());
-
-    std::cout << JsonValueToPrettyString(document) << std::endl;
-  } else {
-    std::cout << error << std::endl;
-  }
-}
-
-void Logger::Log(const std::string& command,
-                 const std::vector<std::string>& params) const {
-  std::stringstream output;
-
-  if (json_out_) {
-    std::cout << GenerateJsonLogString(command, params) << std::endl;
-  } else {
-    if (command == kListStoriesCommandString) {
-      output << "Stories in this session:" << std::endl;
-    }
-
-    for (auto& param : params) {
-      output << param << std::endl;
-    }
-
-    std::cout << output.str() << std::endl;
-  }
-}
-
-void Logger::Log(const std::string& command,
-                 const std::map<std::string, std::string>& params) const {
-  if (json_out_) {
-    std::cout << GenerateJsonLogString(command, params) << std::endl;
-  } else {
-    std::cout << GenerateLogString(command, params) << std::endl;
-  }
-}
-
-std::string Logger::GenerateJsonLogString(
-    const std::string& command, const std::vector<std::string>& params) const {
-  rapidjson::Document document = GetDocument(command);
-
-  // Generate array of |params| strings.
-  rapidjson::Document stories;
-  stories.SetArray();
-  for (auto& param : params) {
-    rapidjson::Value story;
-    story.SetString(param.data(), param.size());
-    stories.PushBack(story, stories.GetAllocator());
-  }
-
-  // Determine what the strings in |params| represent.
-  rapidjson::Value key;
-  if (command == kListStoriesCommandString) {
-    key.SetString(kStoriesKeyString);
-  } else {
-    key.SetString(kParamsKeyString);
-  }
-
-  document.AddMember(key, stories, document.GetAllocator());
-  return JsonValueToPrettyString(document);
-}
-
-std::string Logger::GenerateJsonLogString(
-    const std::string& command,
-    const std::map<std::string, std::string>& params) const {
-  rapidjson::Document document = GetDocument(command);
-
-  // Generate a document containing |params| keys and values.
-  rapidjson::Document paramsJson;
-  paramsJson.SetObject();
-  for (const auto& p : params) {
-    rapidjson::Value name;
-    name.SetString(p.first.data(), p.first.size());
-
-    rapidjson::Value value;
-    value.SetString(p.second.data(), p.second.size());
-    paramsJson.AddMember(name, value, paramsJson.GetAllocator());
-  }
-
-  document.AddMember(kParamsKeyString, paramsJson, document.GetAllocator());
-  return JsonValueToPrettyString(document);
-}
-
-rapidjson::Document Logger::GetDocument(const std::string& command) const {
-  rapidjson::Document document;
-  document.SetObject();
-  document.AddMember(kSuccessString, true, document.GetAllocator());
-  document.AddMember(kCommandString, command, document.GetAllocator());
-  return document;
-}
-
-std::string Logger::GenerateLogString(
-    const std::string& command,
-    const std::map<std::string, std::string>& params) const {
-  std::stringstream output;
-
-  if (command == kDeleteStoryCommandString) {
-    output << "Deleted";
-  } else {
-    if (command == kAddModCommandString) {
-      output << "Added";
-    } else if (command == kRemoveModCommandString) {
-      output << "Removed";
-    }
-
-    output << " mod_name: " << params.at(kModNameFlagString).c_str() << " in";
-  }
-
-  output << " story_name: " << params.at(kStoryNameFlagString).c_str();
-  return output.str();
-}
-
-}  // namespace modular
diff --git a/bin/sessionctl/logger.h b/bin/sessionctl/logger.h
deleted file mode 100644
index b5235eb..0000000
--- a/bin/sessionctl/logger.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONCTL_LOGGER_H_
-#define PERIDOT_BIN_SESSIONCTL_LOGGER_H_
-
-#include <iostream>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/future.h>
-#include <lib/async/cpp/task.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/strings/string_printf.h>
-#include "lib/fxl/functional/make_copyable.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-
-namespace modular {
-
-class Logger {
- public:
-  explicit Logger(bool json_out);
-
-  void LogError(const std::string& command, const std::string& error) const;
-
-  void Log(const std::string& command,
-           const std::vector<std::string>& params) const;
-
-  void Log(const std::string& command,
-           const std::map<std::string, std::string>& params) const;
-
- private:
-  // Returns a JSON formatted string of the executed |command| with respective
-  // |params| to be logged.
-  std::string GenerateJsonLogString(
-      const std::string& command,
-      const std::vector<std::string>& params) const;
-
-  std::string GenerateJsonLogString(
-      const std::string& command,
-      const std::map<std::string, std::string>& params) const;
-
-  rapidjson::Document GetDocument(const std::string& command) const;
-
-  // Returns a string of the executed |command| with respective |params| to be
-  // logged.
-  std::string GenerateLogString(
-      const std::string& command,
-      const std::map<std::string, std::string>& params) const;
-  bool json_out_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONCTL_LOGGER_H_
diff --git a/bin/sessionctl/main.cc b/bin/sessionctl/main.cc
deleted file mode 100644
index 7dec5ce..0000000
--- a/bin/sessionctl/main.cc
+++ /dev/null
@@ -1,284 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <dirent.h>
-#include <glob.h>
-#include <sys/types.h>
-#include <chrono>
-#include <iostream>
-#include <regex>
-#include <string>
-#include <thread>
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/modular/internal/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/future.h>
-#include <lib/async/cpp/task.h>
-#include <lib/fdio/util.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/log_settings_command_line.h>
-#include <lib/fxl/strings/string_printf.h>
-#include "lib/fxl/functional/make_copyable.h"
-
-#include "peridot/bin/sessionctl/logger.h"
-#include "peridot/bin/sessionctl/session_ctl_app.h"
-#include "peridot/bin/sessionctl/session_ctl_constants.h"
-
-using ::fuchsia::modular::PuppetMaster;
-using ::fuchsia::modular::PuppetMasterPtr;
-
-struct DebugService {
-  std::string name;
-  std::string service_path;
-};
-
-std::string GetUsage() {
-  return R"(sessionctl <flags> <command> <argument>
-Example:
-sessionctl add_mod slider_mod
-
-sessionctl --mod_name=mod1 --story_name=story1 --focus_mod=false
-            --focus_story=false add_mod slider_mod
-
-sessionctl --story_name=story1 remove_mod slider_mod
-
-<flags>
---story_name=STORY_NAME
---mod_name=MOD_NAME
---focus_mod=false
-    Don't focus the mod.
---focus_story=false
-    Don't focus the story.
---json_out
-    If flag is set output json for consuming instead of text.
-
-<command>
-add_mod
-  Usage: [--story_name=foo] [--mod_name=bar] [--focus_mod=false] [--focus_story=false] add_mod MOD_URL
-
-  Add a new mod or update an existing mod if a mod with --mod_name already
-  exists in --story_name.
-  Defaults --story_name and --mod_name to MOD_URL.
-  Defaults --focus_mod and --focus_story to 'true'.
-
-  MOD_URL
-    This can be either the mod's full package url or the mod component's name.
-    The mod components name will be converted to the following package url
-    format: fuchsia-pkg://fuchsia.com/MOD_URL#meta/MOD_URL.cmx.
-
-  optional: --story_name, --mod_name, --focus_mod, --focus_story
-
-remove_mod
-  Usage: [--story_name=foo] remove_mod MOD_NAME
-
-  Removes an existing mod by name. If the mod was added with add_mod,
-  use the value you passed to add_mod's --mod_name flag or the default
-  value which would be the mod_url.
-  Defaults --story_name to MOD_NAME.
-
-  MOD_NAME
-    The name of the mod.
-
-  optional: --story_name
-
-delete_story
-  Usage: delete_story STORY_NAME
-
-  Deletes the story.
-
-  STORY_NAME
-    The name of the story.
-
-list_stories
-  List all the stories in the current session.
-
-login_guest
-  Logs in a guest user.
-
-restart_session
-  Restarts the current session.)";
-}
-
-void FindDebugServicesForPath(const char* glob_str, const char* regex_str,
-                              std::vector<DebugService>* services) {
-  glob_t globbuf;
-  bool service_exists = glob(glob_str, 0, nullptr, &globbuf) == 0;
-  std::regex name_regex(regex_str);
-  if (service_exists) {
-    for (size_t i = 0; i < globbuf.gl_pathc; ++i) {
-      DebugService s;
-      s.service_path = globbuf.gl_pathv[i];
-      std::smatch match;
-      FXL_CHECK(std::regex_search(s.service_path, match, name_regex))
-          << s.service_path;
-      s.name = match[1];
-      services->push_back(std::move(s));
-    }
-    globfree(&globbuf);
-  }
-}
-
-// Returns a list of all running sessions.
-std::vector<DebugService> FindAllSessions() {
-  const char kRegex[] = "/sessionmgr.cmx/(\\d+)";
-  // See peridot/bin/sessionmgr/sessionmgr_impl.cc's definition of
-  // kSessionCtlDir for "sessionctl". These must match.
-  std::vector<DebugService> sessions;
-  FindDebugServicesForPath(modular::kSessionCtlServiceGlobPath, kRegex,
-                           &sessions);
-
-  // Path to sessionctl service from a virtual console
-  FindDebugServicesForPath(
-      "/hub/r/sys/*/c/sessionmgr.cmx/*/out/debug/sessionctl", kRegex,
-      &sessions);
-  return sessions;
-}
-
-PuppetMasterPtr ConnectToPuppetMaster(const DebugService& session) {
-  PuppetMasterPtr puppet_master;
-  auto request = puppet_master.NewRequest().TakeChannel();
-  std::string service_path = session.service_path + "/" + PuppetMaster::Name_;
-  if (fdio_service_connect(service_path.c_str(), request.get()) != ZX_OK) {
-    FXL_LOG(FATAL) << "Could not connect to PuppetMaster service in "
-                   << session.service_path;
-  }
-  return puppet_master;
-}
-
-fuchsia::modular::internal::BasemgrDebugPtr ConnectToBasemgr() {
-  const char kRegex[] = "/basemgr.cmx/(\\d+)";
-  std::vector<DebugService> services;
-  FindDebugServicesForPath(modular::kBasemgrDebugServiceGlobPath, kRegex,
-                           &services);
-
-  // Path to basemgr debug service from a virtual console
-  FindDebugServicesForPath("/hub/r/sys/*/c/basemgr.cmx/*/out/debug/basemgr",
-                           kRegex, &services);
-
-  if (services.empty()) {
-    return nullptr;
-  }
-  FXL_CHECK(services.size() == 1);
-  std::string service_path = services[0].service_path;
-
-  fuchsia::modular::internal::BasemgrDebugPtr basemgr;
-  auto request = basemgr.NewRequest().TakeChannel();
-  if (fdio_service_connect(service_path.c_str(), request.get()) != ZX_OK) {
-    FXL_LOG(FATAL) << "Could not connect to basemgr service in "
-                   << service_path;
-  }
-
-  return basemgr;
-}
-
-// Returns true if a guest user was logged in.
-bool LoginAsGuest(bool has_running_sessions,
-                  fuchsia::modular::internal::BasemgrDebug* basemgr,
-                  modular::Logger logger) {
-  if (has_running_sessions) {
-    logger.LogError(modular::kLoginGuestCommandString,
-                    "A user is already logged in. You may log a guest user out "
-                    "by running 'sessionctl restart_session' or you may issue "
-                    "any other sessionctl command.");
-    return false;
-  }
-
-  basemgr->LoginAsGuest();
-  logger.Log(modular::kLoginGuestCommandString, std::vector<std::string>());
-  return true;
-}
-
-// Returns true if a guest user was logged in.
-bool LoginDefaultGuestUser(fuchsia::modular::internal::BasemgrDebug* basemgr,
-                           modular::Logger logger,
-                           std::vector<DebugService>* sessions,
-                           std::string cmd) {
-  std::cout << "Logging in as a guest user in the absence of running sessions."
-            << std::endl;
-  LoginAsGuest(/*has_running_sessions=*/false, basemgr, logger);
-
-  // Wait 2 seconds to allow sessionmgr to initialize
-  std::this_thread::sleep_for(std::chrono::seconds(2));
-  std::cout << "Finding sessions..." << std::endl;
-  *sessions = FindAllSessions();
-
-  if (sessions->empty()) {
-    logger.LogError(cmd,
-                    "Unable find a running session after logging in. "
-                    "Please try your command again.");
-    return false;
-  }
-  return true;
-}
-
-int main(int argc, const char** argv) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-
-  const auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  fxl::SetLogSettingsFromCommandLine(command_line);
-  const auto& positional_args = command_line.positional_args();
-  const auto& cmd = positional_args.empty() ? "" : positional_args[0];
-
-  const modular::Logger logger(
-      command_line.HasOption(modular::kJsonOutFlagString));
-
-  auto basemgr = ConnectToBasemgr();
-  if (!basemgr) {
-    logger.LogError(cmd, "Could not find a running basemgr. Is it running?");
-    return 1;
-  }
-
-  auto sessions = FindAllSessions();
-
-  // Continue with log in flow if user issued a login_guest command
-  if (cmd == modular::kLoginGuestCommandString) {
-    if (LoginAsGuest(/*has_running_sessions=*/!sessions.empty(), basemgr.get(),
-                     logger)) {
-      return 0;
-    }
-    return 1;
-  }
-
-  // Log in a guest user if no session is found before continuing to execute
-  // the requested command
-  if (sessions.empty()) {
-    // Exit here if no sessions were found after logging in a guest user
-    if (!LoginDefaultGuestUser(basemgr.get(), logger, &sessions, cmd)) {
-      return 1;
-    }
-  }
-
-  if (!command_line.HasOption(modular::kJsonOutFlagString)) {
-    std::cout << "Found the following sessions:\n\n";
-    for (const auto& session : sessions) {
-      std::cout << "\t" << session.name << ": " << session.service_path
-                << std::endl;
-    }
-    std::cout << std::endl;
-  }
-
-  // To get a PuppetMaster service for a session, use the following code:
-  PuppetMasterPtr puppet_master = ConnectToPuppetMaster(sessions[0]);
-
-  modular::SessionCtlApp app(basemgr.get(), puppet_master.get(), logger,
-                             loop.dispatcher(), [&loop] { loop.Quit(); });
-
-  std::string parsing_error = app.ExecuteCommand(cmd, command_line);
-  if (parsing_error == modular::kGetUsageErrorString) {
-    // Print help if command doesn't match a valid command.
-    std::cout << GetUsage() << std::endl;
-    return 1;
-  }
-
-  if (!parsing_error.empty()) {
-    return 1;
-  }
-
-  loop.Run();
-
-  return 0;
-}
diff --git a/bin/sessionctl/meta/sessionctl.cmx b/bin/sessionctl/meta/sessionctl.cmx
deleted file mode 100644
index 1291751..0000000
--- a/bin/sessionctl/meta/sessionctl.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [
-            "shell"
-        ]
-    }
-}
diff --git a/bin/sessionctl/session_ctl_app.cc b/bin/sessionctl/session_ctl_app.cc
deleted file mode 100644
index 5e9b39f..0000000
--- a/bin/sessionctl/session_ctl_app.cc
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <regex>
-
-#include "peridot/bin/sessionctl/session_ctl_app.h"
-#include "peridot/bin/sessionctl/session_ctl_constants.h"
-
-namespace modular {
-
-SessionCtlApp::SessionCtlApp(
-    fuchsia::modular::internal::BasemgrDebug* const basemgr,
-    fuchsia::modular::PuppetMaster* const puppet_master,
-    const modular::Logger& logger, async_dispatcher_t* const dispatcher,
-    const std::function<void()>& on_command_executed)
-    : basemgr_(basemgr),
-      puppet_master_(puppet_master),
-      logger_(logger),
-      dispatcher_(dispatcher),
-      on_command_executed_(on_command_executed) {}
-
-std::string SessionCtlApp::ExecuteCommand(
-    std::string cmd, const fxl::CommandLine& command_line) {
-  if (cmd == kAddModCommandString) {
-    return ExecuteAddModCommand(command_line);
-  } else if (cmd == kRemoveModCommandString) {
-    return ExecuteRemoveModCommand(command_line);
-  } else if (cmd == kDeleteStoryCommandString) {
-    return ExecuteDeleteStoryCommand(command_line);
-  } else if (cmd == kListStoriesCommandString) {
-    return ExecuteListStoriesCommand();
-  } else if (cmd == kRestartSessionCommandString) {
-    return ExecuteRestartSessionCommand();
-  } else {
-    return kGetUsageErrorString;
-  }
-}
-
-std::string SessionCtlApp::ExecuteRemoveModCommand(
-    const fxl::CommandLine& command_line) {
-  if (command_line.positional_args().size() == 1) {
-    auto parsing_error =
-        "Missing MOD_NAME. Ex: sessionctl remove_mod slider_mod";
-    logger_.LogError(kRemoveModCommandString, parsing_error);
-    return parsing_error;
-  }
-
-  // Get the mod name and default the story name to the mod name
-  std::string mod_name = command_line.positional_args().at(1);
-  std::string story_name = mod_name;
-
-  // If the story_name flag isn't set, the story name will remain defaulted to
-  // the mod name
-  command_line.GetOptionValue(kStoryNameFlagString, &story_name);
-
-  auto commands = MakeRemoveModCommands(mod_name);
-
-  std::map<std::string, std::string> params = {
-      {kModNameFlagString, mod_name}, {kStoryNameFlagString, story_name}};
-
-  puppet_master_->ControlStory(story_name, story_puppet_master_.NewRequest());
-  PostTaskExecuteStoryCommand(kRemoveModCommandString, std::move(commands),
-                              params);
-
-  return "";
-}
-
-std::string SessionCtlApp::ExecuteAddModCommand(
-    const fxl::CommandLine& command_line) {
-  if (command_line.positional_args().size() == 1) {
-    auto parsing_error = "Missing MOD_URL. Ex: sessionctl add_mod slider_mod";
-    logger_.LogError(kAddModCommandString, parsing_error);
-    return parsing_error;
-  }
-
-  // Get the mod url and default the mod name and story name to the mod url
-  std::string mod_url = command_line.positional_args().at(1);
-  std::string mod_name = mod_url;
-  std::string story_name = mod_url;
-
-  if (mod_url.find(kFuchsiaPkgPrefix) == 0) {
-    // Extract the component name from the mod url and use it as the mod and
-    // story name
-    std::regex pkg_regex(".*#meta/(\\w+)\\.cmx");
-    std::smatch match;
-    if (std::regex_search(mod_url, match, pkg_regex)) {
-      mod_name = match[1];
-      story_name = match[1];
-    }
-  } else {
-    // Replace mod url short name with full package path
-    mod_url =
-        fxl::StringPrintf(kFuchsiaPkgPath, mod_url.c_str(), mod_url.c_str());
-  }
-
-  // If the following options aren't specified, their respective values will
-  // remain unchanged.
-  command_line.GetOptionValue(kStoryNameFlagString, &story_name);
-  command_line.GetOptionValue(kModNameFlagString, &mod_name);
-
-  auto commands = MakeAddModCommands(mod_url, mod_name);
-
-  // Focus the mod and story by default
-  std::string focus_mod;
-  command_line.GetOptionValue(kFocusModFlagString, &focus_mod);
-  if (focus_mod == "" || focus_mod == "true") {
-    commands.push_back(MakeFocusModCommand(mod_name));
-  }
-
-  std::string focus_story;
-  command_line.GetOptionValue(kFocusStoryFlagString, &focus_story);
-  if (focus_story == "" || focus_story == "true") {
-    commands.push_back(MakeFocusStoryCommand());
-  }
-
-  std::map<std::string, std::string> params = {
-      {kModUrlFlagString, mod_url},
-      {kModNameFlagString, mod_name},
-      {kStoryNameFlagString, story_name}};
-
-  puppet_master_->ControlStory(story_name, story_puppet_master_.NewRequest());
-  PostTaskExecuteStoryCommand(kAddModCommandString, std::move(commands),
-                              params);
-
-  return "";
-}
-
-std::string SessionCtlApp::ExecuteDeleteStoryCommand(
-    const fxl::CommandLine& command_line) {
-  if (command_line.positional_args().size() == 1) {
-    auto parsing_error =
-        "Missing STORY_NAME. Ex. sessionctl delete_story story";
-    logger_.LogError(kStoryNameFlagString, parsing_error);
-    return parsing_error;
-  }
-
-  // Get the story name
-  std::string story_name = command_line.positional_args().at(1);
-
-  std::map<std::string, std::string> params = {
-      {kStoryNameFlagString, story_name}};
-
-  async::PostTask(dispatcher_, [this, story_name, params]() mutable {
-    puppet_master_->DeleteStory(story_name, [this, params] {
-      logger_.Log(kDeleteStoryCommandString, params);
-      on_command_executed_();
-    });
-  });
-
-  return "";
-}
-
-std::string SessionCtlApp::ExecuteListStoriesCommand() {
-  async::PostTask(dispatcher_, [this]() mutable {
-    puppet_master_->GetStories([this](std::vector<std::string> story_names) {
-      logger_.Log(kListStoriesCommandString, std::move(story_names));
-      on_command_executed_();
-    });
-  });
-
-  return "";
-}
-
-std::string SessionCtlApp::ExecuteRestartSessionCommand() {
-  basemgr_->RestartSession();
-  logger_.Log(kRestartSessionCommandString, std::vector<std::string>());
-  on_command_executed_();
-
-  return "";
-}
-
-fuchsia::modular::StoryCommand SessionCtlApp::MakeFocusStoryCommand() {
-  fuchsia::modular::StoryCommand command;
-  fuchsia::modular::SetFocusState set_focus_state;
-  set_focus_state.focused = true;
-  command.set_set_focus_state(std::move(set_focus_state));
-  return command;
-}
-
-fuchsia::modular::StoryCommand SessionCtlApp::MakeFocusModCommand(
-    const std::string& mod_name) {
-  fuchsia::modular::StoryCommand command;
-  fuchsia::modular::FocusMod focus_mod;
-  focus_mod.mod_name.push_back(mod_name);
-  command.set_focus_mod(std::move(focus_mod));
-  return command;
-}
-
-std::vector<fuchsia::modular::StoryCommand> SessionCtlApp::MakeAddModCommands(
-    const std::string& mod_url, const std::string& mod_name) {
-  fuchsia::modular::Intent intent;
-  intent.handler = mod_url;
-
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  fuchsia::modular::StoryCommand command;
-
-  // Add command to add or update the mod (it will be updated if the mod_name
-  // already exists in the story).
-  fuchsia::modular::AddMod add_mod;
-  add_mod.mod_name.push_back(mod_name);
-  intent.Clone(&add_mod.intent);
-  // TODO(MI4-953): Sessionctl takes in inital intent and other fields.
-
-  command.set_add_mod(std::move(add_mod));
-  commands.push_back(std::move(command));
-
-  return commands;
-}
-
-std::vector<fuchsia::modular::StoryCommand>
-SessionCtlApp::MakeRemoveModCommands(const std::string& mod_name) {
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  fuchsia::modular::StoryCommand command;
-
-  fuchsia::modular::RemoveMod remove_mod;
-  remove_mod.mod_name.push_back(mod_name);
-  command.set_remove_mod(std::move(remove_mod));
-  commands.push_back(std::move(command));
-  return commands;
-}
-
-void SessionCtlApp::PostTaskExecuteStoryCommand(
-    const std::string command_name,
-    std::vector<fuchsia::modular::StoryCommand> commands,
-    std::map<std::string, std::string> params) {
-  async::PostTask(dispatcher_, [this, command_name,
-                                commands = std::move(commands),
-                                params]() mutable {
-    ExecuteStoryCommand(std::move(commands), params.at(kStoryNameFlagString))
-        ->Then(
-            [this, command_name, params](bool has_error, std::string result) {
-              if (has_error) {
-                logger_.LogError(command_name, result);
-              } else {
-                auto params_copy = params;
-                params_copy.emplace(kStoryIdFlagString, result);
-                logger_.Log(command_name, params_copy);
-              }
-              on_command_executed_();
-            });
-  });
-}
-
-modular::FuturePtr<bool, std::string> SessionCtlApp::ExecuteStoryCommand(
-    std::vector<fuchsia::modular::StoryCommand> commands,
-    const std::string& story_name) {
-  story_puppet_master_->Enqueue(std::move(commands));
-
-  auto fut = modular::Future<bool, std::string>::Create(
-      "Sessionctl StoryPuppetMaster::Execute");
-
-  story_puppet_master_->Execute(fxl::MakeCopyable(
-      [this, fut](fuchsia::modular::ExecuteResult result) mutable {
-        if (result.status == fuchsia::modular::ExecuteStatus::OK) {
-          fut->Complete(false, result.story_id->c_str());
-        } else {
-          std::string error = fxl::StringPrintf(
-              "Puppet master returned status: %d and error: %s",
-              (uint32_t)result.status, result.error_message->c_str());
-
-          FXL_LOG(WARNING) << error << std::endl;
-          fut->Complete(true, std::move(error));
-        }
-      }));
-
-  return fut;
-}
-
-}  // namespace modular
diff --git a/bin/sessionctl/session_ctl_app.h b/bin/sessionctl/session_ctl_app.h
deleted file mode 100644
index c618435..0000000
--- a/bin/sessionctl/session_ctl_app.h
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONCTL_SESSION_CTL_APP_H_
-#define PERIDOT_BIN_SESSIONCTL_SESSION_CTL_APP_H_
-
-#include <iostream>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/modular/internal/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/future.h>
-#include <lib/async/cpp/task.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/strings/string_printf.h>
-#include "lib/fxl/functional/make_copyable.h"
-#include "peridot/bin/sessionctl/logger.h"
-
-using ::fuchsia::modular::PuppetMaster;
-using ::fuchsia::modular::PuppetMasterPtr;
-
-namespace modular {
-
-class SessionCtlApp {
- public:
-  // Constructs a SessionCtlApp which can read and execute session commands.
-  // |puppet_master| The interface used to execute commands.
-  // |basemgr| The basemgr to use to restart sessions.
-  // |command_line| The command line used to read commands and arguments.
-  // |logger| The logger used to log the results of commands.
-  // |dispatcher| The dispatcher which is used to post the command tasks.
-  // |on_command_executed| A callback which is called whenever a command has
-  // finished executing.
-  explicit SessionCtlApp(
-      fuchsia::modular::internal::BasemgrDebug* const basemgr,
-      fuchsia::modular::PuppetMaster* const puppet_master,
-      const modular::Logger& logger, async_dispatcher_t* const dispatcher,
-      const std::function<void()>& on_command_executed);
-
-  // Dispatches the |cmd| and returns an empty string on success, "GetUsage" if
-  // |cmd| is not valid, and a string of missing flags on failure.
-  std::string ExecuteCommand(std::string cmd,
-                             const fxl::CommandLine& command_line);
-
- private:
-  // Executes the respective command and returns an empty string on success and
-  // a string of missing flags on failure.
-  std::string ExecuteAddModCommand(const fxl::CommandLine& command_line);
-  std::string ExecuteRemoveModCommand(const fxl::CommandLine& command_line);
-  std::string ExecuteDeleteStoryCommand(const fxl::CommandLine& command_line);
-  std::string ExecuteListStoriesCommand();
-  std::string ExecuteRestartSessionCommand();
-
-  // Focus the story to which the mod we are adding belongs.
-  fuchsia::modular::StoryCommand MakeFocusStoryCommand();
-
-  // Focus the mod we just added. This is not necessary when adding a new mod
-  // since it will be always focused. However, when a mod is updated it might
-  // not be focused.
-  fuchsia::modular::StoryCommand MakeFocusModCommand(
-      const std::string& mod_name);
-
-  std::vector<fuchsia::modular::StoryCommand> MakeAddModCommands(
-      const std::string& mod_url, const std::string& mod_name);
-
-  std::vector<fuchsia::modular::StoryCommand> MakeRemoveModCommands(
-      const std::string& mod_name);
-
-  // Does a PostTask to Execute the commands on StoryPuppetMaster.
-  // When the commands are executed do logging and then call
-  // on_command_executed_() callback.
-  // |command_name| the string command name.
-  // |commands| the StoryCommands to execute on StoryPuppetMaster.
-  // |params| map of {command_line arg : command_line value}. Used for logging.
-  void PostTaskExecuteStoryCommand(
-      const std::string command_name,
-      std::vector<fuchsia::modular::StoryCommand> commands,
-      std::map<std::string, std::string> params);
-
-  modular::FuturePtr<bool, std::string> ExecuteStoryCommand(
-      std::vector<fuchsia::modular::StoryCommand> commands,
-      const std::string& story_name);
-
-  std::string GenerateMissingFlagString(
-      const std::vector<std::string>& missing_flags);
-
-  fuchsia::modular::internal::BasemgrDebug* const basemgr_;
-  fuchsia::modular::PuppetMaster* const puppet_master_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-  const fxl::CommandLine command_line_;
-  const modular::Logger logger_;
-  async_dispatcher_t* const dispatcher_;
-  const std::function<void()> on_command_executed_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONCTL_SESSION_CTL_APP_H_
diff --git a/bin/sessionctl/session_ctl_app_unittest.cc b/bin/sessionctl/session_ctl_app_unittest.cc
deleted file mode 100644
index 0dc36ff..0000000
--- a/bin/sessionctl/session_ctl_app_unittest.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionctl/session_ctl_app.h"
-#include "peridot/bin/sessionctl/session_ctl_constants.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/sessionmgr/puppet_master/puppet_master_impl.h"
-#include "peridot/lib/testing/test_story_command_executor.h"
-#include "peridot/lib/testing/test_with_session_storage.h"
-
-namespace modular {
-namespace {
-
-class SessionCtlAppTest : public testing::TestWithSessionStorage {
- public:
-  void SetUp() override {
-    TestWithSessionStorage::SetUp();
-    session_storage_ = MakeSessionStorage("page");
-    puppet_master_impl_ = std::make_unique<PuppetMasterImpl>(
-        session_storage_.get(), &test_executor_);
-    puppet_master_impl_->Connect(puppet_master.NewRequest());
-    done_ = false;
-  }
-
- protected:
-  fuchsia::modular::PuppetMasterPtr puppet_master;
-  std::unique_ptr<SessionStorage> session_storage_;
-  std::unique_ptr<PuppetMasterImpl> puppet_master_impl_;
-  std::unique_ptr<Logger> logger_;
-  testing::TestStoryCommandExecutor test_executor_;
-  bool done_;
-
-  SessionCtlApp CreateSessionCtl(fxl::CommandLine command_line) {
-    logger_ =
-        std::make_unique<Logger>(command_line.HasOption(kJsonOutFlagString));
-    SessionCtlApp sessionctl(nullptr /* basemgr */, puppet_master_impl_.get(),
-                             *(logger_.get()), async_get_default_dispatcher(),
-                             [&] { done_ = true; });
-    return sessionctl;
-  }
-
-  std::string RunLoopUntilCommandExecutes(
-      std::function<std::string()> command) {
-    done_ = false;
-    std::string error = command();
-
-    RunLoopUntil([&] { return done_; });
-
-    return error;
-  }
-
-  fuchsia::modular::internal::StoryDataPtr GetStoryData(
-      const std::string& story_id) {
-    fuchsia::modular::internal::StoryDataPtr sd;
-    done_ = false;
-    session_storage_->GetStoryData(story_id)->Then(
-        [&](fuchsia::modular::internal::StoryDataPtr story_data) {
-          sd = std::move(story_data);
-          done_ = true;
-        });
-    RunLoopUntil([&] { return done_; });
-
-    return sd;
-  }
-};
-
-TEST_F(SessionCtlAppTest, GetUsage) {
-  auto command_line = fxl::CommandLineFromInitializerList(
-      {"sessionctl", "--mod_name=mod", "--story_name=story", "--mod_url=foo"});
-  SessionCtlApp sessionctl = CreateSessionCtl(command_line);
-
-  // Try to execute an invalid command
-  std::string error = sessionctl.ExecuteCommand("fake_cmd", command_line);
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(kGetUsageErrorString, error);
-}
-
-TEST_F(SessionCtlAppTest, AddMod) {
-  // Add a mod
-  auto command_line = fxl::CommandLineFromInitializerList(
-      {"sessionctl", "add_mod",
-       "fuchsia-pkg://fuchsia.com/mod_url#meta/mod_url.cmx"});
-  SessionCtlApp sessionctl = CreateSessionCtl(command_line);
-  RunLoopUntilCommandExecutes([&] {
-    return sessionctl.ExecuteCommand(kAddModCommandString, command_line);
-  });
-
-  // Assert the story and the mod were added with default story and mod names
-  auto story_data = GetStoryData("mod_url");
-  ASSERT_TRUE(story_data);
-  EXPECT_EQ("mod_url", story_data->story_name);
-  EXPECT_EQ("mod_url",
-            test_executor_.last_commands().at(0).add_mod().mod_name.at(0));
-  EXPECT_EQ("fuchsia-pkg://fuchsia.com/mod_url#meta/mod_url.cmx",
-            test_executor_.last_commands().at(0).add_mod().intent.handler);
-  EXPECT_EQ(1, test_executor_.execute_count());
-}
-
-TEST_F(SessionCtlAppTest, AddModOverrideDefaults) {
-  // Add a mod
-  auto command_line = fxl::CommandLineFromInitializerList(
-      {"sessionctl", "--story_name=s", "--mod_name=m", "add_mod", "mod_url"});
-  SessionCtlApp sessionctl = CreateSessionCtl(command_line);
-  RunLoopUntilCommandExecutes([&] {
-    return sessionctl.ExecuteCommand(kAddModCommandString, command_line);
-  });
-
-  // Assert the story and the mod were added with overriden story and mod names
-  auto story_data = GetStoryData("s");
-  ASSERT_TRUE(story_data);
-  EXPECT_EQ("s", story_data->story_name);
-  EXPECT_EQ("m", test_executor_.last_commands().at(0).add_mod().mod_name.at(0));
-  EXPECT_EQ("fuchsia-pkg://fuchsia.com/mod_url#meta/mod_url.cmx",
-            test_executor_.last_commands().at(0).add_mod().intent.handler);
-  EXPECT_EQ(1, test_executor_.execute_count());
-}
-
-TEST_F(SessionCtlAppTest, AddModMissingModUrl) {
-  // Attempt to add a mod without a mod url
-  auto command_line =
-      fxl::CommandLineFromInitializerList({"sessionctl", "add_mod"});
-  SessionCtlApp sessionctl = CreateSessionCtl(command_line);
-  std::string error =
-      sessionctl.ExecuteCommand(kAddModCommandString, command_line);
-
-  RunLoopUntilIdle();
-  EXPECT_EQ("Missing MOD_URL. Ex: sessionctl add_mod slider_mod", error);
-}
-
-TEST_F(SessionCtlAppTest, RemoveMod) {
-  // Add a mod
-  auto command_line =
-      fxl::CommandLineFromInitializerList({"sessionctl", "add_mod", "mod"});
-  SessionCtlApp sessionctl = CreateSessionCtl(command_line);
-  RunLoopUntilCommandExecutes([&] {
-    return sessionctl.ExecuteCommand(kAddModCommandString, command_line);
-  });
-
-  // Remove the mod
-  command_line =
-      fxl::CommandLineFromInitializerList({"sessionctl", "remove_mod", "mod"});
-  RunLoopUntilCommandExecutes([&] {
-    return sessionctl.ExecuteCommand(kRemoveModCommandString, command_line);
-  });
-
-  // Assert session_storage still contains the story
-  auto story_data = GetStoryData("mod");
-  ASSERT_TRUE(story_data);
-  EXPECT_EQ("mod", story_data->story_name);
-  EXPECT_EQ("mod",
-            test_executor_.last_commands().at(0).remove_mod().mod_name.at(0));
-  EXPECT_EQ(2, test_executor_.execute_count());
-}
-
-TEST_F(SessionCtlAppTest, RemoveModOverrideDefault) {
-  // Add a mod with overridden story and mod names
-  auto command_line = fxl::CommandLineFromInitializerList(
-      {"sessionctl", "--story_name=s", "--mod_name=m", "add_mod", "mod"});
-  SessionCtlApp sessionctl = CreateSessionCtl(command_line);
-  RunLoopUntilCommandExecutes([&] {
-    return sessionctl.ExecuteCommand(kAddModCommandString, command_line);
-  });
-
-  // Remove the mod with an overridden story name
-  command_line = fxl::CommandLineFromInitializerList(
-      {"sessionctl", "--story_name=s", "remove_mod", "m"});
-  RunLoopUntilCommandExecutes([&] {
-    return sessionctl.ExecuteCommand(kRemoveModCommandString, command_line);
-  });
-
-  // Assert session_storage still contains the story
-  auto story_data = GetStoryData("s");
-  ASSERT_TRUE(story_data);
-  EXPECT_EQ("s", story_data->story_name);
-  EXPECT_EQ("m",
-            test_executor_.last_commands().at(0).remove_mod().mod_name.at(0));
-  EXPECT_EQ(2, test_executor_.execute_count());
-}
-
-TEST_F(SessionCtlAppTest, RemoveModMissingModName) {
-  // Attempt to remove a mod without a mod name
-  auto command_line =
-      fxl::CommandLineFromInitializerList({"sessionctl", "remove_mod"});
-  SessionCtlApp sessionctl = CreateSessionCtl(command_line);
-  std::string error =
-      sessionctl.ExecuteCommand(kRemoveModCommandString, command_line);
-
-  RunLoopUntilIdle();
-  EXPECT_EQ("Missing MOD_NAME. Ex: sessionctl remove_mod slider_mod", error);
-}
-
-TEST_F(SessionCtlAppTest, DeleteStory) {
-  // Add a mod with overridden story name
-  auto command_line = fxl::CommandLineFromInitializerList(
-      {"sessionctl", "--story_name=story", "add_mod", "mod"});
-  SessionCtlApp sessionctl = CreateSessionCtl(command_line);
-  RunLoopUntilCommandExecutes([&] {
-    return sessionctl.ExecuteCommand(kAddModCommandString, command_line);
-  });
-
-  // Remove the story
-  command_line = fxl::CommandLineFromInitializerList(
-      {"sessionctl", "delete_story", "story"});
-  RunLoopUntilCommandExecutes([&] {
-    return sessionctl.ExecuteCommand(kDeleteStoryCommandString, command_line);
-  });
-
-  auto story_data = GetStoryData("mod");
-  EXPECT_FALSE(story_data);
-  EXPECT_EQ(1, test_executor_.execute_count());
-}
-
-TEST_F(SessionCtlAppTest, DeleteStoryMissingStoryName) {
-  // Attempt to delete a story without the required flags
-  auto command_line =
-      fxl::CommandLineFromInitializerList({"sessionctl", "delete_story"});
-  SessionCtlApp sessionctl = CreateSessionCtl(command_line);
-  std::string error =
-      sessionctl.ExecuteCommand(kDeleteStoryCommandString, command_line);
-
-  RunLoopUntilIdle();
-  EXPECT_EQ("Missing STORY_NAME. Ex. sessionctl delete_story story", error);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionctl/session_ctl_constants.h b/bin/sessionctl/session_ctl_constants.h
deleted file mode 100644
index 40fb2cc..0000000
--- a/bin/sessionctl/session_ctl_constants.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONCTL_SESSION_CTL_CONSTANTS_H_
-#define PERIDOT_BIN_SESSIONCTL_SESSION_CTL_CONSTANTS_H_
-
-namespace modular {
-
-// Commands available to SessionCtlApp.
-constexpr char kAddModCommandString[] = "add_mod";
-constexpr char kDeleteStoryCommandString[] = "delete_story";
-constexpr char kListStoriesCommandString[] = "list_stories";
-constexpr char kLoginGuestCommandString[] = "login_guest";
-constexpr char kRemoveModCommandString[] = "remove_mod";
-constexpr char kRestartSessionCommandString[] = "restart_session";
-
-// Flags to pass to SessionCtlApp.
-constexpr char kJsonOutFlagString[] = "json_out";
-constexpr char kFocusModFlagString[] = "focus_mod";
-constexpr char kFocusStoryFlagString[] = "focus_story";
-constexpr char kModNameFlagString[] = "mod_name";
-constexpr char kModUrlFlagString[] = "mod_url";
-constexpr char kStoryIdFlagString[] = "story_id";
-constexpr char kStoryNameFlagString[] = "story_name";
-
-// Internal error string returned from SessionCtlApp.ExecuteCommand() if
-// the user does not set a required flag.
-constexpr char kGetUsageErrorString[] = "GetUsage";
-
-// Fuchsia package paths for add_mod
-constexpr char kFuchsiaPkgPrefix[] = "fuchsia-pkg://";
-constexpr char kFuchsiaPkgPath[] = "fuchsia-pkg://fuchsia.com/%s#meta/%s.cmx";
-
-// hub paths to debug services.
-constexpr char kSessionCtlServiceGlobPath[] =
-    "/hub/c/sessionmgr.cmx/*/out/debug/sessionctl";
-constexpr char kBasemgrDebugServiceGlobPath[] =
-    "/hub/c/basemgr.cmx/*/out/debug/basemgr";
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONCTL_SESSION_CTL_CONSTANTS_H_
diff --git a/bin/sessionmgr/BUILD.gn b/bin/sessionmgr/BUILD.gn
deleted file mode 100644
index f49eb6e..0000000
--- a/bin/sessionmgr/BUILD.gn
+++ /dev/null
@@ -1,232 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-executable_package("sessionmgr") {
-  meta = [
-    {
-      path = "meta/sessionmgr.cmx"
-      dest = "sessionmgr.cmx"
-    },
-  ]
-
-  sources = [
-    "device_map_impl.cc",
-    "device_map_impl.h",
-    "sessionmgr.cc",
-    "sessionmgr_impl.cc",
-    "sessionmgr_impl.h",
-  ]
-
-  deps = [
-    ":component_context",
-    ":focus",
-    ":presentation_provider",
-    ":session_ctl",
-    ":user_intelligence_provider",
-    "//garnet/public/fidl/fuchsia.net.oldhttp",
-    "//garnet/public/fidl/fuchsia.ui.policy",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/basemgr/cobalt",
-    "//peridot/bin/cloud_provider_firestore/fidl",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/bin/sessionmgr/agent_runner",
-    "//peridot/bin/sessionmgr/entity_provider_runner",
-    "//peridot/bin/sessionmgr/message_queue",
-    "//peridot/bin/sessionmgr/puppet_master:make_production_impl",
-    "//peridot/bin/sessionmgr/puppet_master:puppet_master_impl",
-    "//peridot/bin/sessionmgr/puppet_master:story_command_executor",
-    "//peridot/bin/sessionmgr/storage",
-    "//peridot/bin/sessionmgr/storage:constants_and_utils",
-    "//peridot/bin/sessionmgr/story_runner",
-    "//peridot/lib/common:async_holder",
-    "//peridot/lib/common:names",
-    "//peridot/lib/common:teardown",
-    "//peridot/lib/common:xdr",
-    "//peridot/lib/device_info",
-    "//peridot/lib/fidl:app_client",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:clone",
-    "//peridot/lib/fidl:environment",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/fidl:view_host",
-    "//peridot/lib/ledger_client:constants",
-    "//peridot/lib/ledger_client:operations",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/lib/ledger_client:status",
-    "//peridot/lib/ledger_client:types",
-    "//peridot/lib/module_manifest:module_facet_reader_impl",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/scoped_tmpfs",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-    "//peridot/public/fidl/fuchsia.speech",
-    "//peridot/public/lib/app_driver/cpp:app_driver",
-    "//peridot/public/lib/async/cpp:operation",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  public_deps = [
-    "//peridot/bin/basemgr/cobalt:basemgr_metrics_registry",
-  ]
-
-  resources = [
-    {
-      path = rebase_path(
-              get_label_info(
-                  "//peridot/bin/basemgr/cobalt:basemgr_metrics_registry",
-                  "target_gen_dir") + "/basemgr_metrics_registry.pb")
-      dest = "basemgr_metrics_registry.pb"
-    },
-  ]
-}
-
-executable_package("dev_session_shell") {
-  meta = [
-    {
-      path = "meta/dev_session_shell.cmx"
-      dest = "dev_session_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "dev_session_shell.cc",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/common:names",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:single_service_app",
-    "//peridot/lib/fidl:view_host",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:test_driver",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/trace-provider",
-  ]
-}
-
-source_set("session_ctl") {
-  sources = [
-    "session_ctl.cc",
-    "session_ctl.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/sessionmgr/puppet_master:puppet_master_impl",
-    "//zircon/public/lib/fs",
-  ]
-}
-
-source_set("component_context") {
-  sources = [
-    "component_context_impl.cc",
-    "component_context_impl.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/bin/sessionmgr/agent_runner:public",
-    "//peridot/bin/sessionmgr/entity_provider_runner",
-    "//peridot/bin/sessionmgr/message_queue",
-    "//peridot/bin/sessionmgr/storage:constants_and_utils",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/ledger_client:operations",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/lib/ledger_client:types",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-source_set("focus") {
-  sources = [
-    "focus.cc",
-    "focus.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/sessionmgr/storage:constants_and_utils",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:clone",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/ledger_client:operations",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/lib/ledger_client:types",
-    "//peridot/lib/rapidjson",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-source_set("presentation_provider") {
-  sources = [
-    "presentation_provider.cc",
-    "presentation_provider.h",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.ui.policy",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("user_intelligence_provider") {
-  sources = [
-    "user_intelligence_provider_impl.cc",
-    "user_intelligence_provider_impl.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-  ]
-
-  deps = [
-    ":focus",
-    ":intelligence_services",
-    "//garnet/public/fidl/fuchsia.bluetooth.le",
-    "//garnet/public/fidl/fuchsia.net.oldhttp",
-    "//peridot/bin/basemgr/cobalt",
-    "//peridot/lib:maxwell_internal",
-    "//peridot/lib/util:rate_limited_retry",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//zircon/public/fidl/fuchsia-cobalt",
-  ]
-}
-
-source_set("intelligence_services") {
-  sources = [
-    "intelligence_services_impl.cc",
-    "intelligence_services_impl.h",
-  ]
-
-  deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
diff --git a/bin/sessionmgr/agent_runner/BUILD.gn b/bin/sessionmgr/agent_runner/BUILD.gn
deleted file mode 100644
index 50d20ed..0000000
--- a/bin/sessionmgr/agent_runner/BUILD.gn
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/tests_package.gni")
-
-source_set("agent_runner") {
-  sources = [
-    "agent_context_impl.cc",
-    "agent_context_impl.h",
-    "agent_runner.cc",
-    "agent_runner_storage_impl.cc",
-    "agent_runner_storage_impl.h",
-  ]
-
-  public_deps = [
-    ":public",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/sessionmgr:component_context",
-    "//peridot/bin/sessionmgr/message_queue",
-    "//peridot/bin/sessionmgr/storage:constants_and_utils",
-    "//peridot/lib/common:teardown",
-    "//peridot/lib/fidl:app_client",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/lib/ledger_client:types",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-executable("agent_runner_unittest") {
-  testonly = true
-
-  sources = [
-    "agent_runner_unittest.cc",
-  ]
-
-  deps = [
-    ":agent_runner",
-    ":public",
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/component/cpp/testing:fake_launcher",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/sessionmgr/entity_provider_runner",
-    "//peridot/bin/sessionmgr/message_queue",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/lib/testing:fake_agent_runner_storage",
-    "//peridot/lib/testing:mock_base",
-    "//peridot/lib/testing:test_with_ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//third_party/googletest:gtest_main",
-    "//zircon/public/lib/trace",
-  ]
-}
-
-tests_package("agent_runner_unittests") {
-  deps = [
-    ":agent_runner_unittest",
-  ]
-}
-
-# Broken out for component to depend on w/o creating circles.
-source_set("public") {
-  sources = [
-    "agent_runner.h",
-    "agent_runner_storage.cc",
-    "agent_runner_storage.h",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/bin/sessionmgr/entity_provider_runner",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
diff --git a/bin/sessionmgr/agent_runner/agent_context_impl.cc b/bin/sessionmgr/agent_runner/agent_context_impl.cc
deleted file mode 100644
index 641b932..0000000
--- a/bin/sessionmgr/agent_runner/agent_context_impl.cc
+++ /dev/null
@@ -1,366 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_context_impl.h"
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner.h"
-#include "peridot/lib/common/teardown.h"
-
-namespace modular {
-
-constexpr char kAppStoragePath[] = "/data/APP_DATA";
-
-namespace {
-
-// A stopgap solution to map an agent's url to a directory name where the
-// agent's /data is mapped. We need three properties here - (1) two module urls
-// that are the same get mapped to the same hash, (2) two modules urls that are
-// different don't get the same name (with very high probability) and (3) the
-// name is visually inspectable.
-std::string HashAgentUrl(const std::string& agent_url) {
-  std::size_t found = agent_url.find_last_of('/');
-  auto last_part =
-      found == agent_url.length() - 1 ? "" : agent_url.substr(found + 1);
-  return std::to_string(std::hash<std::string>{}(agent_url)) + last_part;
-}
-
-};  // namespace
-
-class AgentContextImpl::InitializeCall : public Operation<> {
- public:
-  InitializeCall(AgentContextImpl* const agent_context_impl,
-                 fuchsia::sys::Launcher* const launcher,
-                 fuchsia::modular::AppConfig agent_config)
-      : Operation("AgentContextImpl::InitializeCall", [] {},
-                  agent_context_impl->url_),
-        agent_context_impl_(agent_context_impl),
-        launcher_(launcher),
-        agent_config_(std::move(agent_config)) {}
-
- private:
-  void Run() override {
-    FXL_CHECK(agent_context_impl_->state_ == State::INITIALIZING);
-
-    FlowToken flow{this};
-
-    // No user intelligence provider is available during testing. We want to
-    // keep going without it.
-    if (!agent_context_impl_->user_intelligence_provider_) {
-      auto service_list = fuchsia::sys::ServiceList::New();
-      Continue(std::move(service_list), flow);
-      return;
-    }
-
-    agent_context_impl_->user_intelligence_provider_->GetServicesForAgent(
-        agent_context_impl_->url_,
-        [this, flow](fuchsia::sys::ServiceList maxwell_service_list) {
-          auto service_list = fuchsia::sys::ServiceList::New();
-          service_list->names = std::move(maxwell_service_list.names);
-          agent_context_impl_->service_provider_impl_.SetDefaultServiceProvider(
-              maxwell_service_list.provider.Bind());
-          Continue(std::move(service_list), flow);
-        });
-  }
-
-  void Continue(fuchsia::sys::ServiceListPtr service_list, FlowToken flow) {
-    service_list->names.push_back(fuchsia::modular::ComponentContext::Name_);
-    service_list->names.push_back(fuchsia::modular::AgentContext::Name_);
-    agent_context_impl_->service_provider_impl_.AddBinding(
-        service_list->provider.NewRequest());
-    agent_context_impl_->app_client_ =
-        std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
-            launcher_, std::move(agent_config_),
-            std::string(kAppStoragePath) +
-                HashAgentUrl(agent_context_impl_->url_),
-            std::move(service_list));
-
-    agent_context_impl_->app_client_->services().ConnectToService(
-        agent_context_impl_->agent_.NewRequest());
-
-    // We only want to use fuchsia::modular::Lifecycle if it exists.
-    agent_context_impl_->app_client_->primary_service().set_error_handler(
-        [agent_context_impl = agent_context_impl_](zx_status_t status) {
-          agent_context_impl->app_client_->primary_service().Unbind();
-        });
-
-    // When the agent process dies, we remove it.
-    // TODO(alhaad): In the future we would want to detect a crashing agent and
-    // stop scheduling tasks for it.
-    agent_context_impl_->app_client_->SetAppErrorHandler(
-        [agent_context_impl = agent_context_impl_] {
-          agent_context_impl->agent_runner_->RemoveAgent(
-              agent_context_impl->url_);
-        });
-
-    // When all the |fuchsia::modular::AgentController| bindings go away maybe
-    // stop the agent.
-    agent_context_impl_->agent_controller_bindings_.set_empty_set_handler(
-        [agent_context_impl = agent_context_impl_] {
-          agent_context_impl->StopAgentIfIdle();
-        });
-
-    agent_context_impl_->state_ = State::RUNNING;
-  }
-
-  AgentContextImpl* const agent_context_impl_;
-  fuchsia::sys::Launcher* const launcher_;
-  fuchsia::modular::AppConfig agent_config_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(InitializeCall);
-};
-
-// If |terminating| is set to true, the agent will be torn down irrespective
-// of whether there is an open-connection or running task. Returns |true| if the
-// agent was stopped, false otherwise (could be because agent has pending
-// tasks).
-class AgentContextImpl::StopCall : public Operation<bool> {
- public:
-  StopCall(const bool terminating, AgentContextImpl* const agent_context_impl,
-           ResultCall result_call)
-      : Operation("AgentContextImpl::StopCall", std::move(result_call),
-                  agent_context_impl->url_),
-        agent_context_impl_(agent_context_impl),
-        terminating_(terminating) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &stopped_};
-
-    if (agent_context_impl_->state_ == State::TERMINATING) {
-      return;
-    }
-
-    if (terminating_ ||
-        (agent_context_impl_->agent_controller_bindings_.size() == 0 &&
-         agent_context_impl_->incomplete_task_count_ == 0)) {
-      Stop(flow);
-    }
-  }
-
-  void Stop(FlowToken flow) {
-    agent_context_impl_->state_ = State::TERMINATING;
-    // Calling Teardown() below will branch |flow| into normal and timeout
-    // paths. |flow| must go out of scope when either of the paths finishes.
-    //
-    // TODO(mesch): AppClient/AsyncHolder should implement this. See also
-    // StoryProviderImpl::StopStoryShellCall.
-    FlowTokenHolder branch{flow};
-    agent_context_impl_->app_client_->Teardown(kBasicTimeout, [this, branch] {
-      std::unique_ptr<FlowToken> cont = branch.Continue();
-      if (cont) {
-        Kill(*cont);
-      }
-    });
-  }
-
-  void Kill(FlowToken flow) {
-    stopped_ = true;
-    agent_context_impl_->agent_.Unbind();
-    agent_context_impl_->agent_context_bindings_.CloseAll();
-    agent_context_impl_->token_manager_bindings_.CloseAll();
-  }
-
-  bool stopped_ = false;
-  AgentContextImpl* const agent_context_impl_;
-  const bool terminating_;  // is the agent runner terminating?
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StopCall);
-};
-
-AgentContextImpl::AgentContextImpl(const AgentContextInfo& info,
-                                   fuchsia::modular::AppConfig agent_config)
-    : url_(agent_config.url),
-      agent_runner_(info.component_context_info.agent_runner),
-      component_context_impl_(info.component_context_info,
-                              kAgentComponentNamespace, url_, url_),
-      token_manager_(info.token_manager),
-      entity_provider_runner_(
-          info.component_context_info.entity_provider_runner),
-      user_intelligence_provider_(info.user_intelligence_provider) {
-  service_provider_impl_.AddService<fuchsia::modular::ComponentContext>(
-      [this](
-          fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request) {
-        component_context_impl_.Connect(std::move(request));
-      });
-  service_provider_impl_.AddService<fuchsia::modular::AgentContext>(
-      [this](fidl::InterfaceRequest<fuchsia::modular::AgentContext> request) {
-        agent_context_bindings_.AddBinding(this, std::move(request));
-      });
-  operation_queue_.Add(
-      new InitializeCall(this, info.launcher, std::move(agent_config)));
-}
-
-AgentContextImpl::~AgentContextImpl() = default;
-
-void AgentContextImpl::NewAgentConnection(
-    const std::string& requestor_url,
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-        incoming_services_request,
-    fidl::InterfaceRequest<fuchsia::modular::AgentController>
-        agent_controller_request) {
-  // Queue adding the connection
-  operation_queue_.Add(new SyncCall(fxl::MakeCopyable(
-      [this, requestor_url,
-       incoming_services_request = std::move(incoming_services_request),
-       agent_controller_request =
-           std::move(agent_controller_request)]() mutable {
-        FXL_CHECK(state_ == State::RUNNING);
-
-        agent_->Connect(requestor_url, std::move(incoming_services_request));
-
-        // Add a binding to the |controller|. When all the bindings go away,
-        // the agent will stop.
-        agent_controller_bindings_.AddBinding(
-            this, std::move(agent_controller_request));
-      })));
-}
-
-void AgentContextImpl::NewEntityProviderConnection(
-    fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-        entity_provider_request,
-    fidl::InterfaceRequest<fuchsia::modular::AgentController>
-        agent_controller_request) {
-  operation_queue_.Add(new SyncCall(fxl::MakeCopyable(
-      [this, entity_provider_request = std::move(entity_provider_request),
-       agent_controller_request =
-           std::move(agent_controller_request)]() mutable {
-        FXL_CHECK(state_ == State::RUNNING);
-        app_client_->services().ConnectToService(
-            std::move(entity_provider_request));
-        agent_controller_bindings_.AddBinding(
-            this, std::move(agent_controller_request));
-      })));
-}
-
-void AgentContextImpl::NewTask(const std::string& task_id) {
-  operation_queue_.Add(new SyncCall([this, task_id] {
-    FXL_CHECK(state_ == State::RUNNING);
-    // Increment the counter for number of incomplete tasks. Decrement it when
-    // we receive its callback;
-    incomplete_task_count_++;
-    agent_->RunTask(task_id, [this] {
-      incomplete_task_count_--;
-      StopAgentIfIdle();
-    });
-  }));
-}
-
-void AgentContextImpl::GetComponentContext(
-    fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request) {
-  component_context_impl_.Connect(std::move(request));
-}
-
-void AgentContextImpl::GetTokenManager(
-    fidl::InterfaceRequest<fuchsia::auth::TokenManager> request) {
-  token_manager_bindings_.AddBinding(this, std::move(request));
-}
-
-void AgentContextImpl::GetEntityReferenceFactory(
-    fidl::InterfaceRequest<fuchsia::modular::EntityReferenceFactory> request) {
-  entity_provider_runner_->ConnectEntityReferenceFactory(url_,
-                                                         std::move(request));
-}
-
-void AgentContextImpl::ScheduleTask(fuchsia::modular::TaskInfo task_info) {
-  agent_runner_->ScheduleTask(url_, std::move(task_info));
-}
-
-void AgentContextImpl::DeleteTask(std::string task_id) {
-  agent_runner_->DeleteTask(url_, task_id);
-}
-
-void AgentContextImpl::Authorize(
-    fuchsia::auth::AppConfig app_config,
-    fidl::InterfaceHandle<fuchsia::auth::AuthenticationUIContext>
-        auth_ui_context,
-    std::vector<::std::string> app_scopes, fidl::StringPtr user_profile_id,
-    fidl::StringPtr auth_code, AuthorizeCallback callback) {
-  FXL_LOG(ERROR) << "AgentContextImpl::Authorize() not supported from agent "
-                 << "context";
-  callback(fuchsia::auth::Status::INVALID_REQUEST, nullptr);
-}
-
-void AgentContextImpl::GetAccessToken(fuchsia::auth::AppConfig app_config,
-                                      std::string user_profile_id,
-                                      std::vector<::std::string> app_scopes,
-                                      GetAccessTokenCallback callback) {
-  FXL_CHECK(token_manager_);
-
-  FXL_DLOG(INFO) << "AgentContextImpl::GetAccessToken() invoked for user:"
-                 << user_profile_id;
-  token_manager_->GetAccessToken(std::move(app_config),
-                                 std::move(user_profile_id),
-                                 std::move(app_scopes), std::move(callback));
-}
-
-void AgentContextImpl::GetIdToken(fuchsia::auth::AppConfig app_config,
-                                  std::string user_profile_id,
-                                  fidl::StringPtr audience,
-                                  GetIdTokenCallback callback) {
-  FXL_CHECK(token_manager_);
-
-  FXL_DLOG(INFO) << "AgentContextImpl::GetIdToken() invoked for user:"
-                 << user_profile_id;
-  token_manager_->GetIdToken(std::move(app_config), std::move(user_profile_id),
-                             std::move(audience), std::move(callback));
-}
-
-void AgentContextImpl::GetFirebaseToken(fuchsia::auth::AppConfig app_config,
-                                        std::string user_profile_id,
-                                        std::string audience,
-                                        std::string firebase_api_key,
-                                        GetFirebaseTokenCallback callback) {
-  FXL_CHECK(token_manager_);
-
-  FXL_DLOG(INFO) << "AgentContextImpl::GetFirebaseToken() invoked for user:"
-                 << user_profile_id;
-  token_manager_->GetFirebaseToken(
-      std::move(app_config), std::move(user_profile_id), std::move(audience),
-      std::move(firebase_api_key), std::move(callback));
-}
-
-void AgentContextImpl::DeleteAllTokens(fuchsia::auth::AppConfig app_config,
-                                       std::string user_profile_id,
-                                       DeleteAllTokensCallback callback) {
-  FXL_LOG(ERROR) << "AgentContextImpl::DeleteAllTokens() not supported from "
-                 << "agent context";
-  callback(fuchsia::auth::Status::INVALID_REQUEST);
-}
-
-void AgentContextImpl::ListProfileIds(fuchsia::auth::AppConfig app_config,
-                                      ListProfileIdsCallback callback) {
-  FXL_CHECK(token_manager_);
-
-  token_manager_->ListProfileIds(std::move(app_config), std::move(callback));
-}
-
-void AgentContextImpl::StopAgentIfIdle() {
-  operation_queue_.Add(new StopCall(false /* is agent runner terminating? */,
-                                    this, [this](bool stopped) {
-                                      if (stopped) {
-                                        agent_runner_->RemoveAgent(url_);
-                                        // |this| is no longer valid at this
-                                        // point.
-                                      }
-                                    }));
-}
-
-void AgentContextImpl::StopForTeardown(const std::function<void()>& callback) {
-  FXL_DLOG(INFO) << "AgentContextImpl::StopForTeardown() " << url_;
-  operation_queue_.Add(new StopCall(true /* is agent runner terminating? */,
-                                    this, [this, callback](bool stopped) {
-                                      FXL_DCHECK(stopped);
-                                      agent_runner_->RemoveAgent(url_);
-                                      callback();
-                                      // |this| is no longer valid at this
-                                      // point.
-                                    }));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/agent_runner/agent_context_impl.h b/bin/sessionmgr/agent_runner/agent_context_impl.h
deleted file mode 100644
index afb742c..0000000
--- a/bin/sessionmgr/agent_runner/agent_context_impl.h
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_CONTEXT_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_CONTEXT_IMPL_H_
-
-#include <string>
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/component/cpp/service_provider_impl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/sessionmgr/component_context_impl.h"
-#include "peridot/lib/fidl/app_client.h"
-
-namespace modular {
-
-class AgentRunner;
-
-// The parameters of agent context that do not vary by instance.
-struct AgentContextInfo {
-  const ComponentContextInfo component_context_info;
-  fuchsia::sys::Launcher* const launcher;
-  fuchsia::auth::TokenManager* const token_manager;
-  fuchsia::modular::UserIntelligenceProvider* const user_intelligence_provider;
-};
-
-// This class manages an agent and its life cycle. AgentRunner owns this class,
-// and instantiates one for every instance of an agent running. All requests for
-// this agent (identified for now by the agent's URL) are routed to this
-// class. This class manages all AgentControllers associated with this agent.
-class AgentContextImpl : fuchsia::modular::AgentContext,
-                         fuchsia::modular::AgentController,
-                         fuchsia::auth::TokenManager {
- public:
-  // Starts the agent specified in |agent_config| and provides it:
-  //  1) AgentContext service
-  //  2) A set of services from UserIntelligenceProvider for this agent's url.
-  explicit AgentContextImpl(const AgentContextInfo& info,
-                            fuchsia::modular::AppConfig agent_config);
-  ~AgentContextImpl() override;
-
-  // Stops the running agent, irrespective of whether there are active
-  // AgentControllers or outstanding tasks. Calls into
-  // |AgentRunner::RemoveAgent()| to remove itself.
-  void StopForTeardown(const std::function<void()>& callback);
-
-  // Called by AgentRunner when a component wants to connect to this agent.
-  // Connections will pend until fuchsia::modular::Agent::Initialize() responds
-  // back, at which point all connections will be forwarded to the agent.
-  void NewAgentConnection(
-      const std::string& requestor_url,
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-          incoming_services_request,
-      fidl::InterfaceRequest<fuchsia::modular::AgentController>
-          agent_controller_request);
-
-  // Called by AgentRunner when the framework wants to talk to the
-  // |fuchsia::modular::EntityProvider| service from this agent. Similar to
-  // NewAgentConnection(), this operation will pend until the entity provider
-  // agent is initialized.
-  void NewEntityProviderConnection(
-      fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-          entity_provider_request,
-      fidl::InterfaceRequest<fuchsia::modular::AgentController>
-          agent_controller_request);
-
-  // Called by AgentRunner when a new task has been scheduled.
-  void NewTask(const std::string& task_id);
-
-  enum class State { INITIALIZING, RUNNING, TERMINATING };
-  State state() { return state_; }
-
- private:
-  // |fuchsia::modular::AgentContext|
-  void GetComponentContext(
-      fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request)
-      override;
-  // |fuchsia::modular::AgentContext|
-  void GetTokenManager(
-      fidl::InterfaceRequest<fuchsia::auth::TokenManager> request) override;
-  // |fuchsia::modular::AgentContext|
-  void ScheduleTask(fuchsia::modular::TaskInfo task_info) override;
-  // |fuchsia::modular::AgentContext|
-  void DeleteTask(std::string task_id) override;
-  // |fuchsia::modular::AgentContext|
-  void GetEntityReferenceFactory(
-      fidl::InterfaceRequest<fuchsia::modular::EntityReferenceFactory> request)
-      override;
-
-  // |fuchsia::auth::TokenManager|
-  void Authorize(fuchsia::auth::AppConfig app_config,
-                 fidl::InterfaceHandle<fuchsia::auth::AuthenticationUIContext>
-                     auth_ui_context,
-                 std::vector<::std::string> app_scopes,
-                 fidl::StringPtr user_profile_id, fidl::StringPtr auth_code,
-                 AuthorizeCallback callback) override;
-
-  // |fuchsia::auth::TokenManager|
-  void GetAccessToken(fuchsia::auth::AppConfig app_config,
-                      std::string user_profile_id,
-                      std::vector<::std::string> app_scopes,
-                      GetAccessTokenCallback callback) override;
-
-  // |fuchsia::auth::TokenManager|
-  void GetIdToken(fuchsia::auth::AppConfig app_config,
-                  std::string user_profile_id, fidl::StringPtr audience,
-                  GetIdTokenCallback callback) override;
-
-  // |fuchsia::auth::TokenManager|
-  void GetFirebaseToken(fuchsia::auth::AppConfig app_config,
-                        std::string user_profile_id,
-                        std::string audience,
-                        std::string firebase_api_key,
-                        GetFirebaseTokenCallback callback) override;
-
-  // |fuchsia::auth::TokenManager|
-  void DeleteAllTokens(fuchsia::auth::AppConfig app_config,
-                       std::string user_profile_id,
-                       DeleteAllTokensCallback callback) override;
-
-  // |fuchsia::auth::TokenManager|
-  void ListProfileIds(fuchsia::auth::AppConfig app_config,
-                      ListProfileIdsCallback callback) override;
-
-  // Adds an operation on |operation_queue_|. This operation is immediately
-  // Done() if this agent is not |ready_|. Else if there are no active
-  // AgentControllers and no outstanding task, fuchsia::modular::Agent.Stop() is
-  // called with a timeout.
-  void StopAgentIfIdle();
-
-  const std::string url_;
-
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> app_client_;
-  fuchsia::modular::AgentPtr agent_;
-  fidl::BindingSet<fuchsia::modular::AgentContext> agent_context_bindings_;
-  fidl::BindingSet<fuchsia::modular::AgentController>
-      agent_controller_bindings_;
-  fidl::BindingSet<fuchsia::auth::TokenManager> token_manager_bindings_;
-
-  AgentRunner* const agent_runner_;
-
-  ComponentContextImpl component_context_impl_;
-
-  // A service provider that represents the services to be added into an
-  // application's namespace.
-  component::ServiceProviderImpl service_provider_impl_;
-
-  fuchsia::auth::TokenManager* const token_manager_;    // Not owned.
-  EntityProviderRunner* const entity_provider_runner_;  // Not owned.
-  fuchsia::modular::UserIntelligenceProvider* const
-      user_intelligence_provider_;  // Not owned.
-
-  State state_ = State::INITIALIZING;
-
-  // Number of times fuchsia::modular::Agent.RunTask() was called but we're
-  // still waiting on its completion callback.
-  int incomplete_task_count_ = 0;
-
-  OperationQueue operation_queue_;
-
-  // Operations implemented here.
-  class InitializeCall;
-  class StopCall;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AgentContextImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_CONTEXT_IMPL_H_
diff --git a/bin/sessionmgr/agent_runner/agent_runner.cc b/bin/sessionmgr/agent_runner/agent_runner.cc
deleted file mode 100644
index 47cf6c2..0000000
--- a/bin/sessionmgr/agent_runner/agent_runner.cc
+++ /dev/null
@@ -1,509 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner.h"
-
-#include <map>
-#include <set>
-#include <utility>
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_context_impl.h"
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner_storage_impl.h"
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/fidl/json_xdr.h"
-
-namespace modular {
-
-constexpr zx::duration kTeardownTimeout = zx::sec(3);
-
-AgentRunner::AgentRunner(
-    fuchsia::sys::Launcher* const launcher,
-    MessageQueueManager* const message_queue_manager,
-    fuchsia::ledger::internal::LedgerRepository* const ledger_repository,
-    AgentRunnerStorage* const agent_runner_storage,
-    fuchsia::auth::TokenManager* const token_manager,
-    fuchsia::modular::UserIntelligenceProvider* const
-        user_intelligence_provider,
-    EntityProviderRunner* const entity_provider_runner)
-    : launcher_(launcher),
-      message_queue_manager_(message_queue_manager),
-      ledger_repository_(ledger_repository),
-      agent_runner_storage_(agent_runner_storage),
-      token_manager_(token_manager),
-      user_intelligence_provider_(user_intelligence_provider),
-      entity_provider_runner_(entity_provider_runner),
-      terminating_(std::make_shared<bool>(false)) {
-  agent_runner_storage_->Initialize(this, [] {});
-}
-
-AgentRunner::~AgentRunner() = default;
-
-void AgentRunner::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::AgentProvider> request) {
-  agent_provider_bindings_.AddBinding(this, std::move(request));
-}
-
-void AgentRunner::Teardown(const std::function<void()>& callback) {
-  // No new agents will be scheduled to run.
-  *terminating_ = true;
-
-  FXL_LOG(INFO) << "AgentRunner::Teardown() " << running_agents_.size()
-                << " agents";
-
-  // No agents were running, we are good to go.
-  if (running_agents_.empty()) {
-    callback();
-    return;
-  }
-
-  // This is called when agents are done being removed
-  auto called = std::make_shared<bool>(false);
-  auto termination_callback = [this, called,
-                               callback](const bool from_timeout) {
-    if (*called) {
-      return;
-    }
-
-    *called = true;
-
-    if (from_timeout) {
-      FXL_LOG(ERROR) << "AgentRunner::Teardown() timed out";
-    }
-
-    callback();
-  };
-
-  for (auto& it : running_agents_) {
-    // The running agent will call |AgentRunner::RemoveAgent()| to remove itself
-    // from the agent runner. When all agents are done being removed,
-    // |termination_callback| will be executed.
-    it.second->StopForTeardown([this, termination_callback]() {
-      if (running_agents_.empty()) {
-        termination_callback(/* from_timeout= */ false);
-      }
-    });
-  }
-
-  async::PostDelayedTask(async_get_default_dispatcher(),
-                         [termination_callback] {
-                           termination_callback(/* from_timeout= */ true);
-                         },
-                         kTeardownTimeout);
-}
-
-void AgentRunner::EnsureAgentIsRunning(const std::string& agent_url,
-                                       const std::function<void()>& done) {
-  auto agent_it = running_agents_.find(agent_url);
-  if (agent_it != running_agents_.end()) {
-    if (agent_it->second->state() == AgentContextImpl::State::TERMINATING) {
-      run_agent_callbacks_[agent_url].push_back(done);
-      return;
-    }
-    // fuchsia::modular::Agent is already running, so we can issue the callback
-    // immediately.
-    done();
-    return;
-  }
-
-  run_agent_callbacks_[agent_url].push_back(done);
-
-  RunAgent(agent_url);
-}
-
-void AgentRunner::RunAgent(const std::string& agent_url) {
-  // Start the agent and issue all callbacks.
-  ComponentContextInfo component_info = {message_queue_manager_, this,
-                                         ledger_repository_,
-                                         entity_provider_runner_};
-  AgentContextInfo info = {component_info, launcher_, token_manager_,
-                           user_intelligence_provider_};
-  fuchsia::modular::AppConfig agent_config;
-  agent_config.url = agent_url;
-
-  FXL_CHECK(running_agents_
-                .emplace(agent_url, std::make_unique<AgentContextImpl>(
-                                        info, std::move(agent_config)))
-                .second);
-
-  auto run_callbacks_it = run_agent_callbacks_.find(agent_url);
-  if (run_callbacks_it != run_agent_callbacks_.end()) {
-    for (auto& callback : run_callbacks_it->second) {
-      callback();
-    }
-    run_agent_callbacks_.erase(agent_url);
-  }
-
-  UpdateWatchers();
-}
-
-void AgentRunner::ConnectToAgent(
-    const std::string& requestor_url, const std::string& agent_url,
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-        incoming_services_request,
-    fidl::InterfaceRequest<fuchsia::modular::AgentController>
-        agent_controller_request) {
-  // Drop all new requests if AgentRunner is terminating.
-  if (*terminating_) {
-    return;
-  }
-
-  pending_agent_connections_[agent_url].push_back(
-      {requestor_url, std::move(incoming_services_request),
-       std::move(agent_controller_request)});
-
-  EnsureAgentIsRunning(agent_url, [this, agent_url] {
-    // If the agent was terminating and has restarted, forwarding connections
-    // here is redundant, since it was already forwarded earlier.
-    ForwardConnectionsToAgent(agent_url);
-  });
-}
-
-void AgentRunner::ConnectToEntityProvider(
-    const std::string& agent_url,
-    fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-        entity_provider_request,
-    fidl::InterfaceRequest<fuchsia::modular::AgentController>
-        agent_controller_request) {
-  // Drop all new requests if AgentRunner is terminating.
-  if (*terminating_) {
-    return;
-  }
-
-  pending_entity_provider_connections_[agent_url] = {
-      std::move(entity_provider_request), std::move(agent_controller_request)};
-
-  EnsureAgentIsRunning(agent_url, [this, agent_url] {
-    auto it = pending_entity_provider_connections_.find(agent_url);
-    FXL_DCHECK(it != pending_entity_provider_connections_.end());
-    running_agents_[agent_url]->NewEntityProviderConnection(
-        std::move(it->second.entity_provider_request),
-        std::move(it->second.agent_controller_request));
-    pending_entity_provider_connections_.erase(it);
-  });
-}
-
-void AgentRunner::RemoveAgent(const std::string agent_url) {
-  running_agents_.erase(agent_url);
-
-  if (*terminating_) {
-    return;
-  }
-
-  UpdateWatchers();
-
-  // At this point, if there are pending requests to start the agent (because
-  // the previous one was in a terminating state), we can start it up again.
-  if (run_agent_callbacks_.find(agent_url) != run_agent_callbacks_.end()) {
-    RunAgent(agent_url);
-  }
-}
-
-void AgentRunner::ForwardConnectionsToAgent(const std::string& agent_url) {
-  // Did we hold onto new connections as the previous one was exiting?
-  auto found_it = pending_agent_connections_.find(agent_url);
-  if (found_it != pending_agent_connections_.end()) {
-    AgentContextImpl* agent = running_agents_[agent_url].get();
-    for (auto& pending_connection : found_it->second) {
-      agent->NewAgentConnection(
-          pending_connection.requestor_url,
-          std::move(pending_connection.incoming_services_request),
-          std::move(pending_connection.agent_controller_request));
-    }
-    pending_agent_connections_.erase(found_it);
-  }
-}
-
-void AgentRunner::ScheduleTask(const std::string& agent_url,
-                               fuchsia::modular::TaskInfo task_info) {
-  AgentRunnerStorage::TriggerInfo data;
-  data.agent_url = agent_url;
-  data.task_id = task_info.task_id;
-
-  if (task_info.trigger_condition.is_message_on_queue()) {
-    data.queue_name = task_info.trigger_condition.message_on_queue();
-    data.task_type = AgentRunnerStorage::TriggerInfo::TYPE_QUEUE_MESSAGE;
-  } else if (task_info.trigger_condition.is_queue_deleted()) {
-    data.queue_token = task_info.trigger_condition.queue_deleted();
-    data.task_type = AgentRunnerStorage::TriggerInfo::TYPE_QUEUE_DELETION;
-  } else if (task_info.trigger_condition.is_alarm_in_seconds()) {
-    data.task_type = AgentRunnerStorage::TriggerInfo::TYPE_ALARM;
-    data.alarm_in_seconds = task_info.trigger_condition.alarm_in_seconds();
-  } else {
-    // Not a defined trigger condition.
-    FXL_NOTREACHED();
-  }
-
-  if (task_info.persistent) {
-    // |AgentRunnerStorageImpl::WriteTask| eventually calls |AddedTask()| after
-    // this trigger information has been added to the ledger via a ledger page
-    // watching mechanism.
-    agent_runner_storage_->WriteTask(agent_url, data, [](bool) {});
-  } else {
-    AddedTask(MakeTriggerKey(agent_url, data.task_id), data);
-  }
-}
-
-void AgentRunner::AddedTask(const std::string& key,
-                            AgentRunnerStorage::TriggerInfo data) {
-  switch (data.task_type) {
-    case AgentRunnerStorage::TriggerInfo::TYPE_QUEUE_MESSAGE:
-      ScheduleMessageQueueNewMessageTask(data.agent_url, data.task_id,
-                                         data.queue_name);
-      break;
-    case AgentRunnerStorage::TriggerInfo::TYPE_QUEUE_DELETION:
-      ScheduleMessageQueueDeletionTask(data.agent_url, data.task_id,
-                                       data.queue_token);
-      break;
-    case AgentRunnerStorage::TriggerInfo::TYPE_ALARM:
-      ScheduleAlarmTask(data.agent_url, data.task_id, data.alarm_in_seconds,
-                        true);
-      break;
-  }
-
-  task_by_ledger_key_[key] = std::make_pair(data.agent_url, data.task_id);
-  UpdateWatchers();
-}
-
-void AgentRunner::DeletedTask(const std::string& key) {
-  auto data = task_by_ledger_key_.find(key);
-  if (data == task_by_ledger_key_.end()) {
-    // Never scheduled, nothing to delete.
-    return;
-  }
-
-  DeleteMessageQueueTask(data->second.first, data->second.second);
-  DeleteAlarmTask(data->second.first, data->second.second);
-
-  task_by_ledger_key_.erase(key);
-  UpdateWatchers();
-}
-
-void AgentRunner::DeleteMessageQueueTask(const std::string& agent_url,
-                                         const std::string& task_id) {
-  auto agent_it = watched_queues_.find(agent_url);
-  if (agent_it == watched_queues_.end()) {
-    return;
-  }
-
-  auto& agent_map = agent_it->second;
-  auto task_id_it = agent_map.find(task_id);
-  if (task_id_it == agent_map.end()) {
-    return;
-  }
-
-  // The specific type of message queue task identified by |task_id| is not
-  // available, so explicitly clean up both types.
-  message_queue_manager_->DropMessageWatcher(kAgentComponentNamespace,
-                                             agent_url, task_id_it->second);
-  message_queue_manager_->DropDeletionWatcher(kAgentComponentNamespace,
-                                              agent_url, task_id_it->second);
-
-  watched_queues_[agent_url].erase(task_id);
-  if (watched_queues_[agent_url].empty()) {
-    watched_queues_.erase(agent_url);
-  }
-}
-
-void AgentRunner::DeleteAlarmTask(const std::string& agent_url,
-                                  const std::string& task_id) {
-  auto agent_it = running_alarms_.find(agent_url);
-  if (agent_it == running_alarms_.end()) {
-    return;
-  }
-
-  auto& agent_map = agent_it->second;
-  auto task_id_it = agent_map.find(task_id);
-  if (task_id_it == agent_map.end()) {
-    return;
-  }
-
-  running_alarms_[agent_url].erase(task_id);
-  if (running_alarms_[agent_url].empty()) {
-    running_alarms_.erase(agent_url);
-  }
-}
-
-void AgentRunner::ScheduleMessageQueueDeletionTask(
-    const std::string& agent_url, const std::string& task_id,
-    const std::string& queue_token) {
-  auto found_it = watched_queues_.find(agent_url);
-  if (found_it != watched_queues_.end()) {
-    if (found_it->second.count(task_id) != 0) {
-      if (found_it->second[task_id] == queue_token) {
-        // This means that we are already watching the message queue.
-        // Do nothing.
-        return;
-      }
-
-      // We were watching some other queue for this task_id. Stop watching.
-      message_queue_manager_->DropMessageWatcher(
-          kAgentComponentNamespace, agent_url, found_it->second[task_id]);
-    }
-  } else {
-    bool inserted = false;
-    std::tie(found_it, inserted) = watched_queues_.emplace(
-        agent_url, std::map<std::string, std::string>());
-    FXL_DCHECK(inserted);
-  }
-
-  found_it->second[task_id] = queue_token;
-  message_queue_manager_->RegisterDeletionWatcher(
-      kAgentComponentNamespace, agent_url, queue_token,
-      [this, agent_url, task_id, terminating = terminating_] {
-        // If agent runner is terminating or has already terminated, do not run
-        // any new tasks.
-        if (*terminating) {
-          return;
-        }
-
-        EnsureAgentIsRunning(agent_url, [agent_url, task_id, this] {
-          running_agents_[agent_url]->NewTask(task_id);
-        });
-      });
-}
-
-void AgentRunner::ScheduleMessageQueueNewMessageTask(
-    const std::string& agent_url, const std::string& task_id,
-    const std::string& queue_name) {
-  auto found_it = watched_queues_.find(agent_url);
-  if (found_it != watched_queues_.end()) {
-    if (found_it->second.count(task_id) != 0) {
-      if (found_it->second[task_id] == queue_name) {
-        // This means that we are already watching the message queue.
-        // Do nothing.
-        return;
-      }
-
-      // We were watching some other queue for this task_id. Stop watching.
-      message_queue_manager_->DropMessageWatcher(
-          kAgentComponentNamespace, agent_url, found_it->second[task_id]);
-    }
-  } else {
-    bool inserted = false;
-    std::tie(found_it, inserted) = watched_queues_.emplace(
-        agent_url, std::map<std::string, std::string>());
-    FXL_DCHECK(inserted);
-  }
-
-  found_it->second[task_id] = queue_name;
-  auto terminating = terminating_;
-  message_queue_manager_->RegisterMessageWatcher(
-      kAgentComponentNamespace, agent_url, queue_name,
-      [this, agent_url, task_id, terminating] {
-        // If agent runner is terminating or has already terminated, do not run
-        // any new tasks.
-        if (*terminating) {
-          return;
-        }
-
-        EnsureAgentIsRunning(agent_url, [agent_url, task_id, this] {
-          running_agents_[agent_url]->NewTask(task_id);
-        });
-      });
-}
-
-void AgentRunner::ScheduleAlarmTask(const std::string& agent_url,
-                                    const std::string& task_id,
-                                    const uint32_t alarm_in_seconds,
-                                    const bool is_new_request) {
-  auto found_it = running_alarms_.find(agent_url);
-  if (found_it != running_alarms_.end()) {
-    if (found_it->second.count(task_id) != 0 && is_new_request) {
-      // We are already running a task with the same task_id. We might
-      // just have to update the alarm frequency.
-      found_it->second[task_id] = alarm_in_seconds;
-      return;
-    }
-  } else {
-    bool inserted = false;
-    std::tie(found_it, inserted) =
-        running_alarms_.emplace(agent_url, std::map<std::string, uint32_t>());
-    FXL_DCHECK(inserted);
-  }
-
-  found_it->second[task_id] = alarm_in_seconds;
-  auto terminating = terminating_;
-  async::PostDelayedTask(
-      async_get_default_dispatcher(),
-      [this, agent_url, task_id, terminating] {
-        // If agent runner is terminating, do not run any new tasks.
-        if (*terminating) {
-          return;
-        }
-
-        // Stop the alarm if entry not found.
-        auto found_it = running_alarms_.find(agent_url);
-        if (found_it == running_alarms_.end()) {
-          return;
-        }
-        if (found_it->second.count(task_id) == 0) {
-          return;
-        }
-
-        EnsureAgentIsRunning(agent_url, [agent_url, task_id, found_it, this]() {
-          running_agents_[agent_url]->NewTask(task_id);
-          ScheduleAlarmTask(agent_url, task_id, found_it->second[task_id],
-                            false);
-        });
-      },
-      zx::sec(alarm_in_seconds));
-}
-
-void AgentRunner::DeleteTask(const std::string& agent_url,
-                             const std::string& task_id) {
-  // This works for non-persistent tasks too since
-  // |AgentRunnerStorageImpl::DeleteTask| handles missing keys in ledger
-  // gracefully.
-  agent_runner_storage_->DeleteTask(agent_url, task_id, [](bool) {});
-}
-
-std::vector<std::string> AgentRunner::GetAllAgents() {
-  // A set of all agents that are either running or scheduled to be run.
-  std::set<std::string> agents;
-  for (auto const& it : running_agents_) {
-    agents.insert(it.first);
-  }
-  for (auto const& it : watched_queues_) {
-    agents.insert(it.first);
-  }
-  for (auto const& it : running_alarms_) {
-    agents.insert(it.first);
-  }
-
-  std::vector<std::string> agent_urls;
-  for (auto const& it : agents) {
-    agent_urls.push_back(it);
-  }
-
-  return agent_urls;
-}
-
-void AgentRunner::UpdateWatchers() {
-  if (*terminating_) {
-    return;
-  }
-
-  for (auto& watcher : agent_provider_watchers_.ptrs()) {
-    (*watcher)->OnUpdate(GetAllAgents());
-  }
-}
-
-void AgentRunner::Watch(
-    fidl::InterfaceHandle<fuchsia::modular::AgentProviderWatcher> watcher) {
-  auto ptr = watcher.Bind();
-  // 1. Send this watcher the current list of agents.
-  ptr->OnUpdate(GetAllAgents());
-
-  // 2. Add this watcher to a set that is updated when a new list of agents is
-  // available.
-  agent_provider_watchers_.AddInterfacePtr(std::move(ptr));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/agent_runner/agent_runner.h b/bin/sessionmgr/agent_runner/agent_runner.h
deleted file mode 100644
index ca734f0..0000000
--- a/bin/sessionmgr/agent_runner/agent_runner.h
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_RUNNER_H_
-#define PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_RUNNER_H_
-
-#include <functional>
-#include <map>
-#include <memory>
-#include <string>
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner_storage.h"
-
-namespace modular {
-
-// This is the component namespace we give to all agents; used for namespacing
-// storage between different component types.
-constexpr char kAgentComponentNamespace[] = "agents";
-
-class AgentContextImpl;
-class EntityProviderRunner;
-class MessageQueueManager;
-
-// This class provides a way for components to connect to agents and
-// manages the life time of a running agent.
-class AgentRunner : fuchsia::modular::AgentProvider,
-                    AgentRunnerStorage::NotificationDelegate {
- public:
-  AgentRunner(
-      fuchsia::sys::Launcher* launcher,
-      MessageQueueManager* message_queue_manager,
-      fuchsia::ledger::internal::LedgerRepository* ledger_repository,
-      AgentRunnerStorage* agent_runner_storage,
-      fuchsia::auth::TokenManager* token_manager,
-      fuchsia::modular::UserIntelligenceProvider* user_intelligence_provider,
-      EntityProviderRunner* entity_provider_runner);
-  ~AgentRunner() override;
-
-  void Connect(fidl::InterfaceRequest<fuchsia::modular::AgentProvider> request);
-
-  // |callback| is called after - (1) all agents have been shutdown and (2)
-  // no new tasks are scheduled to run.
-  void Teardown(const std::function<void()>& callback);
-
-  // Connects to an agent (and starts it up if it doesn't exist) through
-  // |fuchsia::modular::Agent.Connect|. Called using
-  // fuchsia::modular::ComponentContext.
-  void ConnectToAgent(const std::string& requestor_url,
-                      const std::string& agent_url,
-                      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-                          incoming_services_request,
-                      fidl::InterfaceRequest<fuchsia::modular::AgentController>
-                          agent_controller_request);
-
-  // Connects to an agent (and starts it up if it doesn't exist) through its
-  // |fuchsia::modular::EntityProvider| service.
-  void ConnectToEntityProvider(
-      const std::string& agent_url,
-      fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-          entity_provider_request,
-      fidl::InterfaceRequest<fuchsia::modular::AgentController>
-          agent_controller_request);
-
-  // Removes an agent. Called by AgentContextImpl when it is done.
-  // NOTE: This should NOT take a const reference, since |agent_url| will die
-  // the moment we delete |AgentContextImpl|.
-  void RemoveAgent(std::string agent_url);
-
-  // fuchsia::modular::Agent at |agent_url| is run (if not already running) and
-  // fuchsia::modular::Agent.RunTask() is called with |task_id| as the agent
-  // specified identifier for the task when a trigger condition specified in
-  // |task_info| is satisfied. The trigger condition is also replicated to the
-  // ledger and the task my get scheduled on other user devices too.
-  void ScheduleTask(const std::string& agent_url,
-                    fuchsia::modular::TaskInfo task_info);
-
-  // Deletes a task for |agent_url| that is identified by agent provided
-  // |task_id|. The trigger condition is removed from the ledger.
-  void DeleteTask(const std::string& agent_url, const std::string& task_id);
-
- private:
-  // Schedules the agent to start running if it isn't already running (e.g., it
-  // could be not running or in the middle of terminating). Once the agent is in
-  // a running state, calls |done|.
-  void EnsureAgentIsRunning(const std::string& agent_url,
-                            const std::function<void()>& done);
-
-  // Actually starts up an agent (used by |EnsureAgentIsRunning()| above).
-  void RunAgent(const std::string& agent_url);
-
-  // Will also start and initialize the agent as a consequence.
-  void ForwardConnectionsToAgent(const std::string& agent_url);
-
-  // Schedules a task that triggers when a new message is available on a message
-  // queue.
-  //
-  // |agent_url| The URL of the agent creating the trigger. Only the message
-  // queue owner can schedule a task with a new message trigger, and thus this
-  // is also the agent url of the owner of the message queue.
-  // |queue_name| The name of the message queue to observe.
-  // |task_id| The identifier for the task.
-  void ScheduleMessageQueueNewMessageTask(const std::string& agent_url,
-                                          const std::string& task_id,
-                                          const std::string& queue_name);
-
-  // Schedules a task that triggers when a message queue is deleted.
-  //
-  // |agent_url| The URL of the agent creating the trigger.
-  // |queue_token| The token of the queue that is to be observed.
-  // |task_id| The identifier of the task.
-  void ScheduleMessageQueueDeletionTask(const std::string& agent_url,
-                                        const std::string& task_id,
-                                        const std::string& queue_token);
-
-  // Deletes the task scheduled for |agent_url| and |task_id|, regardless of the
-  // task type.
-  void DeleteMessageQueueTask(const std::string& agent_url,
-                              const std::string& task_id);
-
-  // For triggers based on alarms.
-  void ScheduleAlarmTask(const std::string& agent_url,
-                         const std::string& task_id, uint32_t alarm_in_seconds,
-                         bool is_new_request);
-  void DeleteAlarmTask(const std::string& agent_url,
-                       const std::string& task_id);
-
-  // A set of all agents that are either running or scheduled to be run.
-  std::vector<std::string> GetAllAgents();
-
-  // |UpdateWatchers| will not notify watchers if we are tearing down.
-  void UpdateWatchers();
-
-  // |fuchsia::modular::AgentProvider|
-  void Watch(fidl::InterfaceHandle<fuchsia::modular::AgentProviderWatcher>
-                 watcher) override;
-
-  // |AgentRunnerStorage::Delegate|
-  void AddedTask(const std::string& key,
-                 AgentRunnerStorage::TriggerInfo data) override;
-
-  // |AgentRunnerStorage::Delegate|
-  void DeletedTask(const std::string& key) override;
-
-  // agent URL -> { task id -> queue name }
-  std::map<std::string, std::map<std::string, std::string>> watched_queues_;
-
-  // agent URL -> { task id -> alarm in seconds }
-  std::map<std::string, std::map<std::string, uint32_t>> running_alarms_;
-
-  // agent URL -> pending agent connections
-  // This map holds connections to an agent that we hold onto while the existing
-  // agent is in a terminating state.
-  struct PendingAgentConnectionEntry {
-    const std::string requestor_url;
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-        incoming_services_request;
-    fidl::InterfaceRequest<fuchsia::modular::AgentController>
-        agent_controller_request;
-  };
-  std::map<std::string, std::vector<struct PendingAgentConnectionEntry>>
-      pending_agent_connections_;
-
-  // agent URL -> pending entity provider connection
-  // This map holds connections to an agents' fuchsia::modular::EntityProvider
-  // that we hold onto while the existing agent is in a terminating state.
-  struct PendingEntityProviderConnectionEntry {
-    fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-        entity_provider_request;
-    fidl::InterfaceRequest<fuchsia::modular::AgentController>
-        agent_controller_request;
-  };
-  std::map<std::string, struct PendingEntityProviderConnectionEntry>
-      pending_entity_provider_connections_;
-
-  // agent URL -> done callbacks to invoke once agent has started.
-  // Holds requests to start an agent; in case an agent is already in a
-  // terminating state, we pend those requests here until the agent terminates.
-  std::map<std::string, std::vector<std::function<void()>>>
-      run_agent_callbacks_;
-
-  // agent URL -> modular.fuchsia::modular::AgentContext
-  std::map<std::string, std::unique_ptr<AgentContextImpl>> running_agents_;
-
-  // ledger key -> [agent URL, task ID]
-  //
-  // Used to delete entries from the maps above when a ledger key is
-  // deleted. This saves us from having to parse a ledger key, which
-  // becomes impossible once we use hashes to construct it, or from
-  // having to read the value from the previous snapshot, which would
-  // be nifty but is easy only once we have Operations.
-  std::map<std::string, std::pair<std::string, std::string>>
-      task_by_ledger_key_;
-
-  fuchsia::sys::Launcher* const launcher_;
-  MessageQueueManager* const message_queue_manager_;
-  fuchsia::ledger::internal::LedgerRepository* const ledger_repository_;
-  // |agent_runner_storage_| must outlive this class.
-  AgentRunnerStorage* const agent_runner_storage_;
-  fuchsia::auth::TokenManager* const token_manager_;
-  fuchsia::modular::UserIntelligenceProvider* const user_intelligence_provider_;
-  EntityProviderRunner* const entity_provider_runner_;
-
-  fidl::BindingSet<fuchsia::modular::AgentProvider> agent_provider_bindings_;
-  fidl::InterfacePtrSet<fuchsia::modular::AgentProviderWatcher>
-      agent_provider_watchers_;
-
-  // When this is marked true, no new new tasks will be scheduled.
-  std::shared_ptr<bool> terminating_;
-
-  OperationQueue operation_queue_;
-
-  // Operations implemented here.
-  class InitializeCall;
-  class UpdateCall;
-  class DeleteCall;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AgentRunner);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_RUNNER_H_
diff --git a/bin/sessionmgr/agent_runner/agent_runner_storage.cc b/bin/sessionmgr/agent_runner/agent_runner_storage.cc
deleted file mode 100644
index e5f6c6f..0000000
--- a/bin/sessionmgr/agent_runner/agent_runner_storage.cc
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner_storage.h"
-
-namespace modular {
-
-AgentRunnerStorage::AgentRunnerStorage() = default;
-AgentRunnerStorage::~AgentRunnerStorage() = default;
-
-}  // namespace modular
diff --git a/bin/sessionmgr/agent_runner/agent_runner_storage.h b/bin/sessionmgr/agent_runner/agent_runner_storage.h
deleted file mode 100644
index 562f1b9..0000000
--- a/bin/sessionmgr/agent_runner/agent_runner_storage.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_RUNNER_STORAGE_H_
-#define PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_RUNNER_STORAGE_H_
-
-#include <functional>
-#include <string>
-
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-// This abstract class is used by AgentRunner to persist data related to
-// agents, such as tasks and their triggers. See |AgentRunnerStorageImpl| for
-// an implementation of an AgentRunnerStorage.
-class AgentRunnerStorage {
- public:
-  AgentRunnerStorage();
-  virtual ~AgentRunnerStorage();
-
-  struct TriggerInfo {
-    std::string agent_url;
-    std::string task_id;
-
-    // NOTE(mesch): We could include the fuchsia::modular::TaskInfo fidl struct
-    // here directly, but it contains a union, and dealing with a fidl union in
-    // XDR is still rather complicated if we don't want to serialize the union
-    // tag enum value directly.
-    enum TaskType {
-      TYPE_ALARM = 0,
-      TYPE_QUEUE_MESSAGE = 1,
-      TYPE_QUEUE_DELETION = 2,
-    };
-
-    TaskType task_type{};
-
-    // If this is a TYPE_QUEUE_MESSAGE task, this is the message queue name. If
-    // TYPE_QUEUE_DELETION, this is not set. Only the component that obtained
-    // the message queue originally can observe new messages, so the name is
-    // sufficient.
-    std::string queue_name;
-
-    // If this is a TYPE_QUEUE_DELETION task, this is the message queue token.
-    // If TYPE_QUEUE_MESSAGE, this is not set. Both readers and writers can
-    // observe message queue deletion, and thus the token must be used as
-    // opposed to just the name.
-    std::string queue_token;
-
-    uint32_t alarm_in_seconds{};
-  };
-
-  // Consumers of AgentRunnerStorage provide a NotificationDelegate
-  // implementation to |Initialize()| to receive notifications for newly added
-  // and deleted tasks.
-  class NotificationDelegate {
-   public:
-    virtual void AddedTask(const std::string& key,
-                           TriggerInfo trigger_info) = 0;
-    virtual void DeletedTask(const std::string& key) = 0;
-  };
-
-  // Loads up all tasks (across all agents) from storage. |NotifcationDelegate|
-  // is notified of each added task, and also for any added and deleted tasks in
-  // the future.
-  //
-  // Ownership of |delegate| is not taken and it must out-live *this.
-  virtual void Initialize(NotificationDelegate* delegate,
-                          std::function<void()> done) = 0;
-
-  // Writes a new task to storage. |NotificationDelegate| will be notified of
-  // the new task.
-  virtual void WriteTask(const std::string& agent_url, TriggerInfo info,
-                         std::function<void(bool)> done) = 0;
-
-  // Deletes existing task on the storage. |NotificationDelegate| will be
-  // notified of the deleted task.
-  virtual void DeleteTask(const std::string& agent_url,
-                          const std::string& task_id,
-                          std::function<void(bool)> done) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(AgentRunnerStorage);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_RUNNER_STORAGE_H_
diff --git a/bin/sessionmgr/agent_runner/agent_runner_storage_impl.cc b/bin/sessionmgr/agent_runner/agent_runner_storage_impl.cc
deleted file mode 100644
index 193457a..0000000
--- a/bin/sessionmgr/agent_runner/agent_runner_storage_impl.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner_storage_impl.h"
-
-#include <functional>
-#include <utility>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/fidl/json_xdr.h"
-
-namespace modular {
-namespace {
-
-void XdrTriggerInfo_v1(XdrContext* const xdr,
-                       AgentRunnerStorage::TriggerInfo* const data) {
-  xdr->Field("agent_url", &data->agent_url);
-  xdr->Field("task_id", &data->task_id);
-  xdr->Field("task_type", &data->task_type);
-  xdr->Field("alarm_in_seconds", &data->alarm_in_seconds);
-  xdr->Field("queue_name", &data->queue_name);
-  xdr->Field("queue_token", &data->queue_token);
-}
-
-void XdrTriggerInfo_v2(XdrContext* const xdr,
-                       AgentRunnerStorage::TriggerInfo* const data) {
-  if (!xdr->Version(2)) {
-    return;
-  }
-  xdr->Field("agent_url", &data->agent_url);
-  xdr->Field("task_id", &data->task_id);
-  xdr->Field("task_type", &data->task_type);
-  xdr->Field("alarm_in_seconds", &data->alarm_in_seconds);
-  xdr->Field("queue_name", &data->queue_name);
-  xdr->Field("queue_token", &data->queue_token);
-}
-
-constexpr XdrFilterType<AgentRunnerStorage::TriggerInfo> XdrTriggerInfo[] = {
-    XdrTriggerInfo_v2,
-    XdrTriggerInfo_v1,
-    nullptr,
-};
-
-}  // namespace
-
-class AgentRunnerStorageImpl::InitializeCall : public Operation<> {
- public:
-  InitializeCall(NotificationDelegate* const delegate,
-                 fuchsia::ledger::PageSnapshotPtr snapshot,
-                 std::function<void()> done)
-      : Operation("AgentRunnerStorageImpl::InitializeCall", std::move(done)),
-        delegate_(delegate),
-        snapshot_(std::move(snapshot)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    GetEntries(snapshot_.get(), &entries_,
-               [this, flow](fuchsia::ledger::Status status) {
-                 if (status != fuchsia::ledger::Status::OK) {
-                   FXL_LOG(ERROR)
-                       << trace_name() << " "
-                       << "GetEntries() " << fidl::ToUnderlying(status);
-                   return;
-                 }
-
-                 Cont(flow);
-               });
-  }
-
-  void Cont(FlowToken /*flow*/) {
-    if (entries_.empty()) {
-      // No existing entries.
-      return;
-    }
-
-    for (const auto& entry : entries_) {
-      std::string key(reinterpret_cast<const char*>(entry.key.data()),
-                      entry.key.size());
-      std::string value;
-      if (!fsl::StringFromVmo(*entry.value, &value)) {
-        FXL_LOG(ERROR) << trace_name() << " " << key << " "
-                       << "VMO could nt be copied.";
-        continue;
-      }
-
-      TriggerInfo data;
-      if (!XdrRead(value, &data, XdrTriggerInfo)) {
-        return;
-      }
-      delegate_->AddedTask(key, std::move(data));
-    }
-  }
-
-  NotificationDelegate* const delegate_;
-  fuchsia::ledger::PageSnapshotPtr snapshot_;
-  std::vector<fuchsia::ledger::Entry> entries_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(InitializeCall);
-};
-
-class AgentRunnerStorageImpl::WriteTaskCall : public Operation<bool> {
- public:
-  WriteTaskCall(AgentRunnerStorageImpl* storage, std::string agent_url,
-                TriggerInfo data, std::function<void(bool)> done)
-      : Operation("AgentRunnerStorageImpl::WriteTaskCall", done),
-        storage_(storage),
-        agent_url_(std::move(agent_url)),
-        data_(std::move(data)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &success_result_};
-
-    std::string key = MakeTriggerKey(agent_url_, data_.task_id);
-    std::string value;
-    XdrWrite(&value, &data_, XdrTriggerInfo);
-
-    storage_->page()->PutWithPriority(
-        to_array(key), to_array(value), fuchsia::ledger::Priority::EAGER,
-        [this, key, flow](fuchsia::ledger::Status status) {
-          if (status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << trace_name() << " " << key << " "
-                           << "Page.PutWithPriority() "
-                           << fidl::ToUnderlying(status);
-            return;
-          }
-
-          success_result_ = true;
-        });
-  }
-
-  bool success_result_ = false;
-  AgentRunnerStorageImpl* const storage_;
-  const std::string agent_url_;
-  TriggerInfo data_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(WriteTaskCall);
-};
-
-class AgentRunnerStorageImpl::DeleteTaskCall : public Operation<bool> {
- public:
-  DeleteTaskCall(AgentRunnerStorageImpl* storage, std::string agent_url,
-                 std::string task_id, std::function<void(bool)> done)
-      : Operation("AgentRunnerStorageImpl::DeleteTaskCall", done),
-        storage_(storage),
-        agent_url_(std::move(agent_url)),
-        task_id_(std::move(task_id)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &success_result_};
-
-    std::string key = MakeTriggerKey(agent_url_, task_id_);
-    storage_->page()->Delete(
-        to_array(key), [this, key, flow](fuchsia::ledger::Status status) {
-          // fuchsia::ledger::Status::INVALID_TOKEN is okay because we might
-          // have gotten a request to delete a token which does not exist. This
-          // is okay.
-          if (status != fuchsia::ledger::Status::OK &&
-              status != fuchsia::ledger::Status::INVALID_TOKEN) {
-            FXL_LOG(ERROR) << trace_name() << " " << key << " "
-                           << "Page.Delete() " << fidl::ToUnderlying(status);
-            return;
-          }
-          success_result_ = true;
-        });
-  }
-
-  bool success_result_ = false;
-  AgentRunnerStorageImpl* const storage_;
-  const std::string agent_url_;
-  const std::string task_id_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DeleteTaskCall);
-};
-
-AgentRunnerStorageImpl::AgentRunnerStorageImpl(LedgerClient* ledger_client,
-                                               fuchsia::ledger::PageId page_id)
-    : PageClient("AgentRunnerStorageImpl", ledger_client, std::move(page_id)),
-      delegate_(nullptr) {}
-
-AgentRunnerStorageImpl::~AgentRunnerStorageImpl() = default;
-
-void AgentRunnerStorageImpl::Initialize(NotificationDelegate* const delegate,
-                                        std::function<void()> done) {
-  FXL_DCHECK(!delegate_);
-  delegate_ = delegate;
-  operation_queue_.Add(
-      new InitializeCall(delegate_, NewSnapshot(), std::move(done)));
-}
-
-void AgentRunnerStorageImpl::WriteTask(const std::string& agent_url,
-                                       const TriggerInfo data,
-                                       std::function<void(bool)> done) {
-  operation_queue_.Add(
-      new WriteTaskCall(this, agent_url, data, std::move(done)));
-}
-
-void AgentRunnerStorageImpl::DeleteTask(const std::string& agent_url,
-                                        const std::string& task_id,
-                                        std::function<void(bool)> done) {
-  operation_queue_.Add(
-      new DeleteTaskCall(this, agent_url, task_id, std::move(done)));
-}
-
-void AgentRunnerStorageImpl::OnPageChange(const std::string& key,
-                                          const std::string& value) {
-  FXL_DCHECK(delegate_ != nullptr);
-  operation_queue_.Add(new SyncCall([this, key, value] {
-    TriggerInfo data;
-    if (!XdrRead(value, &data, XdrTriggerInfo)) {
-      return;
-    }
-    delegate_->AddedTask(key, data);
-  }));
-}
-
-void AgentRunnerStorageImpl::OnPageDelete(const std::string& key) {
-  FXL_DCHECK(delegate_ != nullptr);
-  operation_queue_.Add(
-      new SyncCall([this, key] { delegate_->DeletedTask(key); }));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/agent_runner/agent_runner_storage_impl.h b/bin/sessionmgr/agent_runner/agent_runner_storage_impl.h
deleted file mode 100644
index 1fe95bc..0000000
--- a/bin/sessionmgr/agent_runner/agent_runner_storage_impl.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_RUNNER_STORAGE_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_RUNNER_STORAGE_IMPL_H_
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner_storage.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_client.h"
-#include "peridot/lib/ledger_client/types.h"
-
-namespace modular {
-
-// An implementation of |AgentRunnerStorage| that persists data in the ledger.
-class AgentRunnerStorageImpl : public AgentRunnerStorage, PageClient {
- public:
-  explicit AgentRunnerStorageImpl(LedgerClient* ledger_client,
-                                  fuchsia::ledger::PageId page_id);
-  ~AgentRunnerStorageImpl() override;
-
- private:
-  // |AgentRunnerStorage|
-  void Initialize(NotificationDelegate* delegate,
-                  std::function<void()> done) override;
-
-  // |AgentRunnerStorage|
-  void WriteTask(const std::string& agent_url, TriggerInfo data,
-                 std::function<void(bool)> done) override;
-
-  // |AgentRunnerStorage|
-  void DeleteTask(const std::string& agent_url, const std::string& task_id,
-                  std::function<void(bool)> done) override;
-
-  // Operation subclasses:
-  class InitializeCall;
-  class WriteTaskCall;
-  class DeleteTaskCall;
-
-  // |PageClient|
-  void OnPageChange(const std::string& key, const std::string& value) override;
-  // |PageClient|
-  void OnPageDelete(const std::string& key) override;
-
-  // Only valid after |Initialize()| is called.
-  NotificationDelegate* delegate_;  // Not owned.
-
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AgentRunnerStorageImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_AGENT_RUNNER_AGENT_RUNNER_STORAGE_IMPL_H_
diff --git a/bin/sessionmgr/agent_runner/agent_runner_unittest.cc b/bin/sessionmgr/agent_runner/agent_runner_unittest.cc
deleted file mode 100644
index 0ec09da..0000000
--- a/bin/sessionmgr/agent_runner/agent_runner_unittest.cc
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner.h"
-
-#include <memory>
-
-#include <fs/service.h>
-#include <fs/synchronous-vfs.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/component/cpp/service_provider_impl.h>
-#include <lib/component/cpp/testing/fake_launcher.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/macros.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_runner.h"
-#include "peridot/bin/sessionmgr/message_queue/message_queue_manager.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/ledger_client/page_id.h"
-#include "peridot/lib/testing/fake_agent_runner_storage.h"
-#include "peridot/lib/testing/mock_base.h"
-#include "peridot/lib/testing/test_with_ledger.h"
-
-namespace modular {
-namespace testing {
-namespace {
-
-using ::component::testing::FakeLauncher;
-
-class AgentRunnerTest : public TestWithLedger {
- public:
-  AgentRunnerTest() = default;
-
-  void SetUp() override {
-    TestWithLedger::SetUp();
-
-    mqm_ = std::make_unique<MessageQueueManager>(
-        ledger_client(), MakePageId("0123456789123456"), mq_data_dir_.path());
-    entity_provider_runner_ = std::make_unique<EntityProviderRunner>(nullptr);
-    // The |fuchsia::modular::UserIntelligenceProvider| below must be nullptr in
-    // order for agent creation to be synchronous, which these tests assume.
-    agent_runner_ = std::make_unique<AgentRunner>(
-        &launcher_, mqm_.get(), ledger_repository(), &agent_runner_storage_,
-        token_manager_.get(), nullptr, entity_provider_runner_.get());
-  }
-
-  void TearDown() override {
-    agent_runner_.reset();
-    entity_provider_runner_.reset();
-    mqm_.reset();
-
-    TestWithLedger::TearDown();
-  }
-
-  MessageQueueManager* message_queue_manager() { return mqm_.get(); }
-
- protected:
-  AgentRunner* agent_runner() { return agent_runner_.get(); }
-  FakeLauncher* launcher() { return &launcher_; }
-
- private:
-  FakeLauncher launcher_;
-
-  files::ScopedTempDir mq_data_dir_;
-  std::unique_ptr<MessageQueueManager> mqm_;
-  FakeAgentRunnerStorage agent_runner_storage_;
-  std::unique_ptr<EntityProviderRunner> entity_provider_runner_;
-  std::unique_ptr<AgentRunner> agent_runner_;
-
-  fuchsia::auth::TokenManagerPtr token_manager_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AgentRunnerTest);
-};
-
-class MyDummyAgent : fuchsia::modular::Agent,
-                     public fuchsia::sys::ComponentController,
-                     public testing::MockBase {
- public:
-  MyDummyAgent(zx::channel directory_request,
-               fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl)
-      : vfs_(async_get_default_dispatcher()),
-        outgoing_directory_(fbl::AdoptRef(new fs::PseudoDir())),
-        controller_(this, std::move(ctrl)),
-        agent_binding_(this) {
-    outgoing_directory_->AddEntry(
-        fuchsia::modular::Agent::Name_,
-        fbl::AdoptRef(new fs::Service([this](zx::channel channel) {
-          agent_binding_.Bind(std::move(channel));
-          return ZX_OK;
-        })));
-    vfs_.ServeDirectory(outgoing_directory_, std::move(directory_request));
-  }
-
-  void KillApplication() { controller_.Unbind(); }
-
-  size_t GetCallCount(const std::string func) { return counts.count(func); }
-
- private:
-  // |ComponentController|
-  void Kill() override { ++counts["Kill"]; }
-  // |ComponentController|
-  void Detach() override { ++counts["Detach"]; }
-
-  // |fuchsia::modular::Agent|
-  void Connect(
-      std::string /*requestor_url*/,
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> /*services*/)
-      override {
-    ++counts["Connect"];
-  }
-
-  // |fuchsia::modular::Agent|
-  void RunTask(std::string /*task_id*/,
-               RunTaskCallback /*callback*/) override {
-    ++counts["RunTask"];
-  }
-
- private:
-  fs::SynchronousVfs vfs_;
-  fbl::RefPtr<fs::PseudoDir> outgoing_directory_;
-  fidl::Binding<fuchsia::sys::ComponentController> controller_;
-  fidl::Binding<fuchsia::modular::Agent> agent_binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(MyDummyAgent);
-};
-
-// Test that connecting to an agent will start it up.
-// Then there should be an fuchsia::modular::Agent.Connect().
-TEST_F(AgentRunnerTest, ConnectToAgent) {
-  int agent_launch_count = 0;
-  std::unique_ptr<MyDummyAgent> dummy_agent;
-  constexpr char kMyAgentUrl[] = "file:///my_agent";
-  launcher()->RegisterComponent(
-      kMyAgentUrl,
-      [&dummy_agent, &agent_launch_count](
-          fuchsia::sys::LaunchInfo launch_info,
-          fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl) {
-        dummy_agent = std::make_unique<MyDummyAgent>(
-            std::move(launch_info.directory_request), std::move(ctrl));
-        ++agent_launch_count;
-      });
-
-  fuchsia::sys::ServiceProviderPtr incoming_services;
-  fuchsia::modular::AgentControllerPtr agent_controller;
-  agent_runner()->ConnectToAgent("requestor_url", kMyAgentUrl,
-                                 incoming_services.NewRequest(),
-                                 agent_controller.NewRequest());
-
-  RunLoopWithTimeoutOrUntil([&dummy_agent] {
-    return dummy_agent && dummy_agent->GetCallCount("Connect") > 0;
-  });
-  EXPECT_EQ(1, agent_launch_count);
-  dummy_agent->ExpectCalledOnce("Connect");
-  dummy_agent->ExpectNoOtherCalls();
-
-  // Connecting to the same agent again shouldn't launch a new instance and
-  // shouldn't re-initialize the existing instance of the agent application,
-  // but should call |Connect()|.
-
-  fuchsia::modular::AgentControllerPtr agent_controller2;
-  fuchsia::sys::ServiceProviderPtr incoming_services2;
-  agent_runner()->ConnectToAgent("requestor_url2", kMyAgentUrl,
-                                 incoming_services2.NewRequest(),
-                                 agent_controller2.NewRequest());
-
-  RunLoopWithTimeoutOrUntil([&dummy_agent] {
-    return dummy_agent && dummy_agent->GetCallCount("Connect");
-  });
-  EXPECT_EQ(1, agent_launch_count);
-  dummy_agent->ExpectCalledOnce("Connect");
-  dummy_agent->ExpectNoOtherCalls();
-}
-
-// Test that if an agent application dies, it is removed from agent runner
-// (which means outstanding AgentControllers are closed).
-TEST_F(AgentRunnerTest, AgentController) {
-  std::unique_ptr<MyDummyAgent> dummy_agent;
-  constexpr char kMyAgentUrl[] = "file:///my_agent";
-  launcher()->RegisterComponent(
-      kMyAgentUrl,
-      [&dummy_agent](
-          fuchsia::sys::LaunchInfo launch_info,
-          fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl) {
-        dummy_agent = std::make_unique<MyDummyAgent>(
-            std::move(launch_info.directory_request), std::move(ctrl));
-      });
-
-  fuchsia::sys::ServiceProviderPtr incoming_services;
-  fuchsia::modular::AgentControllerPtr agent_controller;
-  agent_runner()->ConnectToAgent("requestor_url", kMyAgentUrl,
-                                 incoming_services.NewRequest(),
-                                 agent_controller.NewRequest());
-
-  RunLoopWithTimeoutOrUntil([&dummy_agent] { return !!dummy_agent; });
-  dummy_agent->KillApplication();
-
-  // fuchsia::modular::Agent application died, so check that
-  // fuchsia::modular::AgentController dies here.
-  agent_controller.set_error_handler(
-      [&agent_controller](zx_status_t status) { agent_controller.Unbind(); });
-  RunLoopWithTimeoutOrUntil(
-      [&agent_controller] { return !agent_controller.is_bound(); });
-  EXPECT_FALSE(agent_controller.is_bound());
-}
-
-}  // namespace
-}  // namespace testing
-}  // namespace modular
diff --git a/bin/sessionmgr/component_context_impl.cc b/bin/sessionmgr/component_context_impl.cc
deleted file mode 100644
index cd7dc9c..0000000
--- a/bin/sessionmgr/component_context_impl.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/component_context_impl.h"
-
-#include <utility>
-
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner.h"
-#include "peridot/lib/fidl/array_to_string.h"
-
-namespace modular {
-
-ComponentContextImpl::ComponentContextImpl(const ComponentContextInfo& info,
-                                           std::string component_namespace,
-                                           std::string component_instance_id,
-                                           std::string component_url)
-    : message_queue_manager_(info.message_queue_manager),
-      agent_runner_(info.agent_runner),
-      ledger_repository_(info.ledger_repository),
-      entity_provider_runner_(info.entity_provider_runner),
-      component_namespace_(std::move(component_namespace)),
-      component_instance_id_(std::move(component_instance_id)),
-      component_url_(std::move(component_url)) {
-  FXL_DCHECK(message_queue_manager_);
-  FXL_DCHECK(agent_runner_);
-  FXL_DCHECK(ledger_repository_);
-  FXL_DCHECK(entity_provider_runner_);
-}
-
-ComponentContextImpl::~ComponentContextImpl() = default;
-
-void ComponentContextImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-fuchsia::modular::ComponentContextPtr ComponentContextImpl::NewBinding() {
-  fuchsia::modular::ComponentContextPtr ptr;
-  Connect(ptr.NewRequest());
-  return ptr;
-}
-
-void ComponentContextImpl::GetLedger(
-    fidl::InterfaceRequest<fuchsia::ledger::Ledger> request) {
-  ledger_repository_->GetLedger(to_array(component_url_), std::move(request));
-}
-
-void ComponentContextImpl::ConnectToAgent(
-    std::string url,
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-        incoming_services_request,
-    fidl::InterfaceRequest<fuchsia::modular::AgentController>
-        agent_controller_request) {
-  agent_runner_->ConnectToAgent(component_instance_id_, url,
-                                std::move(incoming_services_request),
-                                std::move(agent_controller_request));
-}
-
-void ComponentContextImpl::ObtainMessageQueue(
-    std::string name,
-    fidl::InterfaceRequest<fuchsia::modular::MessageQueue> request) {
-  message_queue_manager_->ObtainMessageQueue(
-      component_namespace_, component_instance_id_, name, std::move(request));
-}
-
-void ComponentContextImpl::DeleteMessageQueue(std::string name) {
-  message_queue_manager_->DeleteMessageQueue(component_namespace_,
-                                             component_instance_id_, name);
-}
-
-void ComponentContextImpl::GetMessageSender(
-    std::string queue_token,
-    fidl::InterfaceRequest<fuchsia::modular::MessageSender> request) {
-  message_queue_manager_->GetMessageSender(queue_token, std::move(request));
-}
-
-void ComponentContextImpl::GetEntityResolver(
-    fidl::InterfaceRequest<fuchsia::modular::EntityResolver> request) {
-  entity_provider_runner_->ConnectEntityResolver(std::move(request));
-}
-
-void ComponentContextImpl::CreateEntityWithData(
-    std::vector<fuchsia::modular::TypeToDataEntry> type_to_data,
-    CreateEntityWithDataCallback result) {
-  std::map<std::string, std::string> copy;
-  for (const auto& it : type_to_data) {
-    copy[it.type] = it.data;
-  }
-  result(entity_provider_runner_->CreateReferenceFromData(std::move(copy)));
-}
-
-void ComponentContextImpl::GetPackageName(GetPackageNameCallback result) {
-  result(component_url_);
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/component_context_impl.h b/bin/sessionmgr/component_context_impl.h
deleted file mode 100644
index 15416cf..0000000
--- a/bin/sessionmgr/component_context_impl.h
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_COMPONENT_CONTEXT_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_COMPONENT_CONTEXT_IMPL_H_
-
-#include <string>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_runner.h"
-#include "peridot/bin/sessionmgr/message_queue/message_queue_manager.h"
-
-namespace modular {
-
-class AgentRunner;
-
-// The parameters of component context that do not vary by instance.
-struct ComponentContextInfo {
-  MessageQueueManager* const message_queue_manager;
-  AgentRunner* const agent_runner;
-  fuchsia::ledger::internal::LedgerRepository* const ledger_repository;
-  EntityProviderRunner* const entity_provider_runner;
-};
-
-// Implements the fuchsia::modular::ComponentContext interface, which is
-// provided to modules and agents. The interface is public, because the class
-// doesn't contain the Bindings for this interface. TODO(mesch): Move
-// bindings into the class.
-class ComponentContextImpl : public fuchsia::modular::ComponentContext {
- public:
-  // * A component namespace identifies components whose lifetimes are related,
-  //   where all of their persisted information will live together; for modules
-  //   this is the story id, for agents it is kAgentComponentNamespace, etc.
-  // * A component instance ID identifies a particular instance of a component;
-  //   for modules, this is the module path in their story. For agents, it is
-  //   the agent URL.
-  // * A component URL is the origin from which the executable associated with
-  //   the component was fetched from.
-  explicit ComponentContextImpl(const ComponentContextInfo& info,
-                                std::string component_namespace,
-                                std::string component_instance_id,
-                                std::string component_url);
-
-  ~ComponentContextImpl() override;
-
-  const std::string& component_instance_id() { return component_instance_id_; }
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request);
-  fuchsia::modular::ComponentContextPtr NewBinding();
-
- private:
-  // |fuchsia::modular::ComponentContext|
-  void GetLedger(
-      fidl::InterfaceRequest<fuchsia::ledger::Ledger> request) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void ConnectToAgent(std::string url,
-                      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-                          incoming_services_request,
-                      fidl::InterfaceRequest<fuchsia::modular::AgentController>
-                          agent_controller_request) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void ObtainMessageQueue(
-      std::string name,
-      fidl::InterfaceRequest<fuchsia::modular::MessageQueue> request) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void DeleteMessageQueue(std::string name) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void GetMessageSender(
-      std::string queue_token,
-      fidl::InterfaceRequest<fuchsia::modular::MessageSender> request) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void GetEntityResolver(
-      fidl::InterfaceRequest<fuchsia::modular::EntityResolver> request)
-      override;
-
-  // |fuchsia::modular::ComponentContext|
-  void CreateEntityWithData(
-      std::vector<fuchsia::modular::TypeToDataEntry> type_to_data,
-      CreateEntityWithDataCallback result) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void GetPackageName(GetPackageNameCallback result) override;
-
-  MessageQueueManager* const message_queue_manager_;
-  AgentRunner* const agent_runner_;
-  fuchsia::ledger::internal::LedgerRepository* const ledger_repository_;
-  EntityProviderRunner* const entity_provider_runner_;
-
-  const std::string component_namespace_;
-  const std::string component_instance_id_;
-  const std::string component_url_;
-
-  fidl::BindingSet<fuchsia::modular::ComponentContext> bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ComponentContextImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_COMPONENT_CONTEXT_IMPL_H_
diff --git a/bin/sessionmgr/dev_session_shell.cc b/bin/sessionmgr/dev_session_shell.cc
deleted file mode 100644
index 8e60acd..0000000
--- a/bin/sessionmgr/dev_session_shell.cc
+++ /dev/null
@@ -1,300 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Implementation of a session shell for module development. It takes a
-// root module URL and data for its fuchsia::modular::Link as command line
-// arguments, which can be set using the basemgr --user-shell-args flag.
-
-#include <memory>
-#include <utility>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <zx/eventpair.h>
-
-#include "peridot/lib/common/names.h"
-#include "peridot/lib/fidl/single_service_app.h"
-#include "peridot/lib/fidl/view_host.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/lib/testing/test_driver.h"
-
-namespace {
-
-class Settings {
- public:
-  explicit Settings(const fxl::CommandLine& command_line) {
-    root_module =
-        command_line.GetOptionValueWithDefault("root_module", "example_recipe");
-    root_link = command_line.GetOptionValueWithDefault("root_link", "");
-    story_id = command_line.GetOptionValueWithDefault("story_id", "story");
-    module_under_test_url =
-        command_line.GetOptionValueWithDefault("module_under_test_url", "");
-    test_driver_url =
-        command_line.GetOptionValueWithDefault("test_driver_url", "");
-  }
-
-  std::string root_module;
-  std::string root_link;
-  std::string story_id;
-  std::string module_under_test_url;
-  std::string test_driver_url;
-};
-
-class DevSessionShellApp : fuchsia::modular::StoryWatcher,
-                           fuchsia::modular::InterruptionListener,
-                           fuchsia::modular::NextListener,
-                           fuchsia::modular::SessionShell,
-                           public modular::ViewApp {
- public:
-  explicit DevSessionShellApp(component::StartupContext* const startup_context,
-                              Settings settings)
-      : ViewApp(startup_context),
-        settings_(std::move(settings)),
-        story_watcher_binding_(this) {
-    startup_context->ConnectToEnvironmentService(puppet_master_.NewRequest());
-    startup_context->ConnectToEnvironmentService(
-        session_shell_context_.NewRequest());
-    session_shell_context_->GetStoryProvider(story_provider_.NewRequest());
-    session_shell_context_->GetSuggestionProvider(
-        suggestion_provider_.NewRequest());
-    session_shell_context_->GetFocusController(focus_controller_.NewRequest());
-    session_shell_context_->GetVisibleStoriesController(
-        visible_stories_controller_.NewRequest());
-
-    suggestion_provider_->SubscribeToInterruptions(
-        interruption_listener_bindings_.AddBinding(this));
-    suggestion_provider_->SubscribeToNext(
-        next_listener_bindings_.AddBinding(this), 3);
-
-    startup_context->outgoing().AddPublicService(
-        session_shell_bindings_.GetHandler(this));
-  }
-
-  ~DevSessionShellApp() override = default;
-
- private:
-  // |ViewApp|
-  void CreateView(
-      zx::eventpair view_token,
-      fidl::InterfaceRequest<
-          fuchsia::sys::ServiceProvider> /*incoming_services*/,
-      fidl::InterfaceHandle<
-          fuchsia::sys::ServiceProvider> /*outgoing_services*/) override {
-    view_token_ = std::move(view_token);
-
-    Connect();
-  }
-
-  void Connect() {
-    FXL_CHECK(!!view_token_);
-    FXL_CHECK(!!story_provider_);
-    FXL_CHECK(!!puppet_master_);
-    FXL_LOG(INFO) << "DevSessionShell START " << settings_.root_module << " "
-                  << settings_.root_link;
-
-    auto scenic =
-        startup_context()
-            ->ConnectToEnvironmentService<fuchsia::ui::scenic::Scenic>();
-    scenic::ViewContext context = {
-        .session_and_listener_request =
-            scenic::CreateScenicSessionPtrAndListenerRequest(scenic.get()),
-        .view_token = std::move(view_token_),
-        .startup_context = startup_context(),
-    };
-
-    view_ = std::make_unique<modular::ViewHost>(std::move(context));
-
-    puppet_master_->ControlStory(settings_.story_id,
-                                 story_puppet_master_.NewRequest());
-
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("root");
-    add_mod.intent.handler = settings_.root_module;
-    add_mod.intent.action = "action";
-    add_mod.intent.parameters = CreateIntentParameters();
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-    commands.push_back(std::move(command));
-
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          StartStoryById(settings_.story_id);
-        });
-  }
-
-  fidl::VectorPtr<fuchsia::modular::IntentParameter> CreateIntentParameters() {
-    if (settings_.module_under_test_url.empty() ||
-        settings_.test_driver_url.empty()) {
-      // For debugging: log that both items must be set in the event that one is
-      // set and the other is not. It may be unclear why the intent is not being
-      // created with the intended links if one is forgotten by accident.
-      if (settings_.module_under_test_url.empty() !=
-          settings_.test_driver_url.empty()) {
-        FXL_LOG(WARNING) << "Both the module_under_test_url and "
-                            "test_driver_url must be set";
-      }
-      return nullptr;
-    }
-    auto intent_params =
-        fidl::VectorPtr<fuchsia::modular::IntentParameter>::New(0);
-    fuchsia::modular::IntentParameterData test_driver_link_data;
-
-    rapidjson::Document document;
-    document.SetObject();
-    document.AddMember(modular::testing::kModuleUnderTestPath,
-                       settings_.module_under_test_url,
-                       document.GetAllocator());
-    document.AddMember(modular::testing::kTestDriverPath,
-                       settings_.test_driver_url, document.GetAllocator());
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(modular::JsonValueToString(document), &vmo));
-    test_driver_link_data.set_json(std::move(vmo).ToTransport());
-
-    fuchsia::modular::IntentParameter test_driver_link_param;
-    test_driver_link_param.name = modular::testing::kTestDriverLinkName;
-    test_driver_link_param.data = std::move(test_driver_link_data);
-    intent_params.push_back(std::move(test_driver_link_param));
-
-    return intent_params;
-  }
-
-  void StartStoryById(const fidl::StringPtr& story_id) {
-    story_provider_->GetController(story_id, story_controller_.NewRequest());
-    story_controller_.set_error_handler([this, story_id](zx_status_t status) {
-      FXL_LOG(ERROR) << "Story controller for story " << story_id
-                     << " died. Does this story exist?";
-    });
-
-    story_controller_->Watch(story_watcher_binding_.NewBinding());
-
-    FXL_LOG(INFO) << "DevSessionShell Starting story with id: " << story_id;
-
-    story_controller_->RequestStart();
-    focus_controller_->Set(story_id);
-    auto visible_stories = fidl::VectorPtr<std::string>::New(0);
-    visible_stories.push_back(story_id);
-    visible_stories_controller_->Set(std::move(visible_stories));
-
-    if (!settings_.root_link.empty()) {
-      fuchsia::modular::LinkPtr root;
-
-      fuchsia::modular::LinkPath link_path = fuchsia::modular::LinkPath();
-      link_path.link_name = "root";
-      story_controller_->GetLink(std::move(link_path), root.NewRequest());
-
-      fsl::SizedVmo vmo;
-      FXL_CHECK(fsl::VmoFromString(settings_.root_link, &vmo));
-      root->Set(nullptr, std::move(vmo).ToTransport());
-    }
-  }
-
-  // |SessionShell|
-  void AttachView(fuchsia::modular::ViewIdentifier view_id,
-                  fidl::InterfaceHandle<fuchsia::ui::viewsv1token::ViewOwner>
-                  view_owner) override {
-    FXL_LOG(INFO) << "DevSessionShell AttachView(): " << view_id.story_id;
-    view_->ConnectView(std::move(view_owner));
-  }
-
-  // |SessionShell|
-  void DetachView(fuchsia::modular::ViewIdentifier view_id,
-                  std::function<void()> done) override {
-    FXL_LOG(INFO) << "DevSessionShell DetachView(): " << view_id.story_id;
-    done();
-  }
-
-  // |fuchsia::modular::StoryWatcher|
-  void OnStateChange(fuchsia::modular::StoryState state) override {
-    FXL_LOG(INFO) << "DevSessionShell State " << fidl::ToUnderlying(state);
-  }
-
-  // |fuchsia::modular::StoryWatcher|
-  void OnModuleAdded(fuchsia::modular::ModuleData /*module_data*/) override {}
-
-  // |fuchsia::modular::StoryWatcher|
-  void OnModuleFocused(
-      std::vector<std::string> /*module_path*/) override {}
-
-  // |fuchsia::modular::NextListener|
-  void OnNextResults(
-      std::vector<fuchsia::modular::Suggestion> suggestions) override {
-    FXL_VLOG(4)
-        << "DevSessionShell/fuchsia::modular::NextListener::OnNextResults()";
-    for (auto& suggestion : suggestions) {
-      FXL_LOG(INFO) << "  " << suggestion.uuid << " "
-                    << suggestion.display.headline;
-    }
-  }
-
-  // |fuchsia::modular::InterruptionListener|
-  void OnInterrupt(fuchsia::modular::Suggestion suggestion) override {
-    FXL_VLOG(4) << "DevSessionShell/"
-                   "fuchsia::modular::InterruptionListener::OnInterrupt() "
-                << suggestion.uuid;
-  }
-
-  // |fuchsia::modular::NextListener|
-  void OnProcessingChange(bool processing) override {
-    FXL_VLOG(4)
-        << "DevSessionShell/fuchsia::modular::NextListener::OnProcessingChange("
-        << processing << ")";
-  }
-
-  const Settings settings_;
-
-  fidl::BindingSet<fuchsia::modular::SessionShell> session_shell_bindings_;
-
-  zx::eventpair view_token_;
-  std::unique_ptr<modular::ViewHost> view_;
-
-  fuchsia::modular::SessionShellContextPtr session_shell_context_;
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-  fuchsia::modular::StoryProviderPtr story_provider_;
-  fuchsia::modular::StoryControllerPtr story_controller_;
-  fuchsia::modular::FocusControllerPtr focus_controller_;
-  fuchsia::modular::VisibleStoriesControllerPtr visible_stories_controller_;
-
-  fidl::Binding<fuchsia::modular::StoryWatcher> story_watcher_binding_;
-
-  fuchsia::modular::SuggestionProviderPtr suggestion_provider_;
-  fidl::BindingSet<fuchsia::modular::InterruptionListener>
-      interruption_listener_bindings_;
-  fidl::BindingSet<fuchsia::modular::NextListener> next_listener_bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DevSessionShellApp);
-};
-
-}  // namespace
-
-int main(int argc, const char** argv) {
-  auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  Settings settings(command_line);
-
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AppDriver<DevSessionShellApp> driver(
-      context->outgoing().deprecated_services(),
-      std::make_unique<DevSessionShellApp>(context.get(), std::move(settings)),
-      [&loop] { loop.Quit(); });
-
-  loop.Run();
-  return 0;
-}
diff --git a/bin/sessionmgr/device_map_impl.cc b/bin/sessionmgr/device_map_impl.cc
deleted file mode 100644
index 6938713..0000000
--- a/bin/sessionmgr/device_map_impl.cc
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/device_map_impl.h"
-
-#include <limits.h>
-#include <unistd.h>
-
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_ptr.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fxl/time/time_point.h>
-
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/lib/fidl/json_xdr.h"
-#include "peridot/lib/ledger_client/operations.h"
-
-namespace modular {
-
-namespace {
-
-using ReadDeviceDataCall = ReadDataCall<fuchsia::modular::DeviceMapEntry>;
-using ReadAllDeviceDataCall = ReadAllDataCall<fuchsia::modular::DeviceMapEntry>;
-using WriteDeviceDataCall = WriteDataCall<fuchsia::modular::DeviceMapEntry>;
-
-// Reads old versions of device data, which are missing a timestamp.
-void XdrDeviceMapEntry_v1(XdrContext* const xdr,
-                          fuchsia::modular::DeviceMapEntry* const data) {
-  xdr->Field("name", &data->name);
-  xdr->Field("device_id", &data->device_id);
-  xdr->Field("profile", &data->profile);
-  xdr->Field("hostname", &data->hostname);
-
-  // The time below is 26 Sep 2017 17:44:40 GMT, just to mark the entry as old.
-  // Since this filter is not the latest, it is only ever used FROM_JSON, never
-  // TO_JSON.
-  data->last_change_timestamp = 1506447879;
-}
-
-void XdrDeviceMapEntry_v2(XdrContext* const xdr,
-                          fuchsia::modular::DeviceMapEntry* const data) {
-  xdr->Field("name", &data->name);
-  xdr->Field("device_id", &data->device_id);
-  xdr->Field("profile", &data->profile);
-  xdr->Field("hostname", &data->hostname);
-  xdr->Field("last_change_timestamp", &data->last_change_timestamp);
-}
-
-void XdrDeviceMapEntry_v3(XdrContext* const xdr,
-                          fuchsia::modular::DeviceMapEntry* const data) {
-  if (!xdr->Version(3)) {
-    return;
-  }
-  xdr->Field("name", &data->name);
-  xdr->Field("device_id", &data->device_id);
-  xdr->Field("profile", &data->profile);
-  xdr->Field("hostname", &data->hostname);
-  xdr->Field("last_change_timestamp", &data->last_change_timestamp);
-}
-
-constexpr XdrFilterType<fuchsia::modular::DeviceMapEntry> XdrDeviceMapEntry[] =
-    {
-        XdrDeviceMapEntry_v3,
-        XdrDeviceMapEntry_v2,
-        XdrDeviceMapEntry_v1,
-        nullptr,
-};
-
-std::string LoadHostname() {
-  char host_name_buffer[HOST_NAME_MAX + 1];
-  int result = gethostname(host_name_buffer, sizeof(host_name_buffer));
-
-  if (result < 0) {
-    FXL_LOG(ERROR) << "unable to get hostname. errno " << errno;
-    return "fuchsia";
-  }
-
-  return host_name_buffer;
-}
-
-}  // namespace
-
-DeviceMapImpl::DeviceMapImpl(const std::string& device_name,
-                             const std::string& device_id,
-                             const std::string& device_profile,
-                             LedgerClient* const ledger_client,
-                             LedgerPageId page_id)
-    : PageClient("DeviceMapImpl", ledger_client, std::move(page_id),
-                 kDeviceKeyPrefix) {
-  current_device_id_ = device_id;
-
-  // TODO(jimbe) Load the fuchsia::modular::DeviceMapEntry for the current
-  // device from the Ledger.
-  fuchsia::modular::DeviceMapEntry device;
-  device.name = device_name;
-  device.device_id = device_id;
-  device.profile = device_profile;
-  device.hostname = LoadHostname();
-
-  devices_[device_id] = std::move(device);
-  SaveCurrentDevice();
-}
-
-DeviceMapImpl::~DeviceMapImpl() = default;
-
-void DeviceMapImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::DeviceMap> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void DeviceMapImpl::Query(QueryCallback callback) {
-  operation_queue_.Add(new ReadAllDeviceDataCall(page(), kDeviceKeyPrefix,
-                                                 XdrDeviceMapEntry, callback));
-}
-
-void DeviceMapImpl::GetCurrentDevice(GetCurrentDeviceCallback callback) {
-  callback(devices_[current_device_id_]);
-}
-
-void DeviceMapImpl::SetCurrentDeviceProfile(::std::string profile) {
-  devices_[current_device_id_].profile = profile;
-  Notify(current_device_id_);
-  SaveCurrentDevice();
-}
-
-void DeviceMapImpl::SaveCurrentDevice() {
-  auto& device = devices_[current_device_id_];
-  device.last_change_timestamp = time(nullptr);
-
-  operation_queue_.Add(new WriteDeviceDataCall(
-      page(), MakeDeviceKey(current_device_id_), XdrDeviceMapEntry,
-      fidl::MakeOptional(device), [] {}));
-}
-
-void DeviceMapImpl::WatchDeviceMap(
-    fidl::InterfaceHandle<fuchsia::modular::DeviceMapWatcher> watcher) {
-  auto watcher_ptr = watcher.Bind();
-  for (const auto& item : devices_) {
-    const auto& device = item.second;
-    watcher_ptr->OnDeviceMapChange(device);
-  }
-  change_watchers_.AddInterfacePtr(std::move(watcher_ptr));
-}
-
-void DeviceMapImpl::Notify(const std::string& device_id) {
-  const fuchsia::modular::DeviceMapEntry& device = devices_[current_device_id_];
-  for (auto& watcher : change_watchers_.ptrs()) {
-    (*watcher)->OnDeviceMapChange(device);
-  }
-}
-
-void DeviceMapImpl::OnPageChange(const std::string& key,
-                                 const std::string& value) {
-  FXL_LOG(INFO) << "Updated Device: " << key << " value=" << value;
-
-  fuchsia::modular::DeviceMapEntry device;
-  if (!XdrRead(value, &device, XdrDeviceMapEntry)) {
-    FXL_DCHECK(false);
-    return;
-  }
-
-  fidl::StringPtr device_id = device.device_id;
-  devices_[device_id] = std::move(device);
-  Notify(device_id);
-}
-
-void DeviceMapImpl::OnPageDelete(const std::string& key) {
-  // This shouldn't happen.
-  FXL_LOG(ERROR) << "Deleted Device: " << key;
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/device_map_impl.h b/bin/sessionmgr/device_map_impl.h
deleted file mode 100644
index a8b9163..0000000
--- a/bin/sessionmgr/device_map_impl.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_DEVICE_MAP_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_DEVICE_MAP_IMPL_H_
-
-#include <map>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_client.h"
-#include "peridot/lib/ledger_client/types.h"
-
-namespace modular {
-
-// See services/user/device_map.fidl for details.
-//
-// Mostly scaffolding to demonstrate a complete page client.
-class DeviceMapImpl : fuchsia::modular::DeviceMap, PageClient {
- public:
-  DeviceMapImpl(const std::string& device_name, const std::string& device_id,
-                const std::string& device_profile, LedgerClient* ledger_client,
-                LedgerPageId page_id);
-  ~DeviceMapImpl() override;
-
-  const std::string& current_device_id() const { return current_device_id_; }
-
-  void Connect(fidl::InterfaceRequest<fuchsia::modular::DeviceMap> request);
-
- private:
-  // |fuchsia::modular::DeviceMap|
-  void Query(QueryCallback callback) override;
-
-  // |fuchsia::modular::DeviceMap|
-  void GetCurrentDevice(GetCurrentDeviceCallback callback) override;
-
-  // |fuchsia::modular::DeviceMap|
-  void SetCurrentDeviceProfile(::std::string profile) override;
-
-  // |fuchsia::modular::DeviceMap|
-  void WatchDeviceMap(fidl::InterfaceHandle<fuchsia::modular::DeviceMapWatcher>
-                          watcher) override;
-
-  // |PageClient|
-  void OnPageChange(const std::string& key, const std::string& value) override;
-
-  // |PageClient|
-  void OnPageDelete(const std::string& key) override;
-
-  // Update the timestamp for the current device and save it to the Ledger.
-  void SaveCurrentDevice();
-
-  // Notify all watchers that the given device has changed
-  void Notify(const std::string& device_id);
-
-  // Clients that have connected to this service.
-  fidl::BindingSet<fuchsia::modular::DeviceMap> bindings_;
-
-  // All known devices from the Ledger page.
-  std::map<std::string, fuchsia::modular::DeviceMapEntry> devices_;
-
-  // The local device in the |devices_| map.
-  std::string current_device_id_;
-
-  OperationQueue operation_queue_;
-
-  fidl::InterfacePtrSet<fuchsia::modular::DeviceMapWatcher> change_watchers_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DeviceMapImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_DEVICE_MAP_IMPL_H_
diff --git a/bin/sessionmgr/entity_provider_runner/BUILD.gn b/bin/sessionmgr/entity_provider_runner/BUILD.gn
deleted file mode 100644
index 9967cb7..0000000
--- a/bin/sessionmgr/entity_provider_runner/BUILD.gn
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/tests_package.gni")
-
-source_set("entity_provider_runner") {
-  sources = [
-    "entity_provider_controller.cc",
-    "entity_provider_controller.h",
-    "entity_provider_launcher.cc",
-    "entity_provider_launcher.h",
-    "entity_provider_runner.cc",
-    "entity_provider_runner.h",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/util",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-tests_package("entity_provider_runner_unittests") {
-  deps = [
-    ":entity_provider_runner_unittest",
-  ]
-}
-
-executable("entity_provider_runner_unittest") {
-  testonly = true
-
-  sources = [
-    "entity_provider_runner_unittest.cc",
-  ]
-
-  deps = [
-    ":entity_provider_runner",
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/component/cpp/testing:fake_launcher",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/sessionmgr/agent_runner",
-    "//peridot/bin/sessionmgr/message_queue",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/testing:fake_agent_runner_storage",
-    "//peridot/lib/testing:mock_base",
-    "//peridot/lib/testing:test_with_ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//peridot/public/lib/agent/cpp",
-    "//third_party/googletest:gtest_main",
-    "//zircon/public/lib/trace",
-  ]
-}
diff --git a/bin/sessionmgr/entity_provider_runner/entity_provider_controller.cc b/bin/sessionmgr/entity_provider_runner/entity_provider_controller.cc
deleted file mode 100644
index 2d50f46..0000000
--- a/bin/sessionmgr/entity_provider_runner/entity_provider_controller.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_controller.h"
-
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_runner.h"
-
-namespace modular {
-
-class EntityProviderController::EntityImpl : fuchsia::modular::Entity {
- public:
-  EntityImpl(EntityProviderController* const entity_provider_controller,
-             fuchsia::modular::EntityProvider* const entity_provider,
-             const std::string& cookie, const std::string& entity_reference)
-      : entity_provider_controller_(entity_provider_controller),
-        entity_provider_(entity_provider),
-        cookie_(cookie),
-        entity_reference_(entity_reference) {
-    entity_bindings_.set_empty_set_handler([this] {
-      entity_provider_controller_->OnEmptyEntityImpls(cookie_);
-      // |this| is no longer valid.
-    });
-  }
-
-  // Serves this |fuchsia::modular::Entity| for the cookie this |EntityImpl| was
-  // instantiated for.
-  void ProvideEntity(fidl::InterfaceRequest<fuchsia::modular::Entity> request) {
-    entity_bindings_.AddBinding(this, std::move(request));
-  }
-
- private:
-  // |fuchsia::modular::Entity|
-  void GetTypes(GetTypesCallback callback) override {
-    entity_provider_->GetTypes(cookie_, callback);
-  }
-
-  // |fuchsia::modular::Entity|
-  void GetData(std::string type, GetDataCallback callback) override {
-    entity_provider_->GetData(cookie_, type, callback);
-  }
-
-  // |fuchsia::modular::Entity|
-  void WriteData(std::string type, fuchsia::mem::Buffer data,
-                 WriteDataCallback callback) override {
-    entity_provider_->WriteData(cookie_, type, std::move(data), callback);
-  }
-
-  // |fuchsia::modular::Entity|
-  void GetReference(GetReferenceCallback callback) override {
-    callback(entity_reference_);
-  }
-
-  // |fuchsia::modular::Entity|
-  void Watch(
-      std::string type,
-      fidl::InterfaceHandle<fuchsia::modular::EntityWatcher> watcher) override {
-    entity_provider_->Watch(cookie_, type, std::move(watcher));
-  }
-
-  EntityProviderController* const entity_provider_controller_;
-  fuchsia::modular::EntityProvider* const entity_provider_;
-  const std::string cookie_;
-  const std::string entity_reference_;
-  fidl::BindingSet<fuchsia::modular::Entity> entity_bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(EntityImpl);
-};
-
-EntityProviderController::EntityProviderController(
-    fuchsia::modular::EntityProviderPtr entity_provider,
-    fuchsia::modular::AgentControllerPtr agent_controller,
-    std::function<void()> done)
-    : entity_provider_(std::move(entity_provider)),
-      agent_controller_(std::move(agent_controller)),
-      done_(done) {
-  FXL_DLOG(INFO) << "Running fuchsia::modular::EntityProvider";
-  if (agent_controller_) {
-    agent_controller_.set_error_handler([this](zx_status_t status) {
-      done_();
-      // |this| no longer valid.
-    });
-  }
-}
-
-EntityProviderController::~EntityProviderController() = default;
-
-void EntityProviderController::ProvideEntity(
-    const std::string& cookie, const std::string& entity_reference,
-    fidl::InterfaceRequest<fuchsia::modular::Entity> request) {
-  auto it = entity_impls_.find(cookie);
-  if (it == entity_impls_.end()) {
-    bool inserted;
-    std::tie(it, inserted) = entity_impls_.insert(std::make_pair(
-        cookie, std::make_unique<EntityImpl>(this, entity_provider_.get(),
-                                             cookie, entity_reference)));
-    FXL_DCHECK(inserted);
-  }
-  // When there are no more |fuchsia::modular::Entity|s being serviced for this
-  // |cookie|, |OnEmptyEntityImpl()| is triggered.
-  it->second->ProvideEntity(std::move(request));
-}
-
-void EntityProviderController::OnEmptyEntityImpls(const std::string cookie) {
-  entity_impls_.erase(cookie);
-  if (entity_impls_.size() == 0ul) {
-    // We can drop our connection to the fuchsia::modular::EntityProvider at
-    // this point.
-    done_();
-    // |this| no longer valid.
-  }
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/entity_provider_runner/entity_provider_controller.h b/bin/sessionmgr/entity_provider_runner/entity_provider_controller.h
deleted file mode 100644
index 02165be..0000000
--- a/bin/sessionmgr/entity_provider_runner/entity_provider_controller.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_CONTROLLER_H_
-#define PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_CONTROLLER_H_
-
-#include <map>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-class EntityProviderRunner;
-
-// This class runs and manages the lifetime of an EntityProvider service.
-//
-// When the entity provider is an agent the controller keeps the agent
-// connection alive.
-class EntityProviderController {
- public:
-  // Creates an controller for a given entity provider.
-  //
-  // |entity_provider| The provider which is managed by this controller.
-  // |agent_controller| If the entity provider is backed by an agent, this is
-  //   the associated agent controller. If no such controller exists, nullptr is
-  //   acceptable.
-  // |done| The callback which is called when the entity provider managed by
-  //   this controller has finished running.
-  EntityProviderController(
-      fuchsia::modular::EntityProviderPtr entity_provider,
-      fuchsia::modular::AgentControllerPtr agent_controller,
-      std::function<void()> done);
-
-  ~EntityProviderController();
-
-  // Called by |EntityProviderRunner| when an |fuchsia::modular::Entity| needs
-  // to be provided, usually when an entity reference is being resolved to an
-  // |fuchsia::modular::Entity|.
-  void ProvideEntity(const std::string& cookie,
-                     const std::string& entity_reference,
-                     fidl::InterfaceRequest<fuchsia::modular::Entity> request);
-
- private:
-  // This class manages the lifetime of all |fuchsia::modular::Entity|s for a
-  // given cookie.
-  class EntityImpl;
-
-  // Called when there are no more outstanding |fuchsia::modular::Entity|
-  // interfaces we need to provide for. At this point, we can tear down the
-  // |EntityImpl| providing for this cookie.
-  void OnEmptyEntityImpls(const std::string cookie);
-
-  // cookie -> EntityImpl
-  std::map<std::string, std::unique_ptr<EntityImpl>> entity_impls_;
-
-  // The managed entity provider connection.
-  fuchsia::modular::EntityProviderPtr entity_provider_;
-
-  // The agent controller connection for entity providers which are agents.
-  fuchsia::modular::AgentControllerPtr agent_controller_;
-
-  // The callback which is called when the entity provider finishes running.
-  std::function<void()> done_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(EntityProviderController);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_CONTROLLER_H_
diff --git a/bin/sessionmgr/entity_provider_runner/entity_provider_launcher.cc b/bin/sessionmgr/entity_provider_runner/entity_provider_launcher.cc
deleted file mode 100644
index 0051c0c..0000000
--- a/bin/sessionmgr/entity_provider_runner/entity_provider_launcher.cc
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_launcher.h"
-
-namespace modular {
-EntityProviderLauncher::~EntityProviderLauncher() = default;
-}  // namespace modular
diff --git a/bin/sessionmgr/entity_provider_runner/entity_provider_launcher.h b/bin/sessionmgr/entity_provider_runner/entity_provider_launcher.h
deleted file mode 100644
index 4eeb724..0000000
--- a/bin/sessionmgr/entity_provider_runner/entity_provider_launcher.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_LAUNCHER_H_
-#define PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_LAUNCHER_H_
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-// An interface for launching EntityProviders. This interface helps break the
-// dependency cycle between |AgentRunner| and |EntityProviderRunner|.
-class EntityProviderLauncher {
- public:
-  // Connects to the entity provider service of the agent at the specified
-  // |agent_url|.
-  //
-  // |agent_controller_request| is used to keep the agent running. Once dropped,
-  // the agent may be killed and the entity provider will thus be dropped.
-  virtual void ConnectToEntityProvider(
-      const std::string& provider_uri,
-      fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-          entity_provider_request,
-      fidl::InterfaceRequest<fuchsia::modular::AgentController>
-          agent_controller_request) = 0;
-
-  // Connets to the entity provider service for the story with the given
-  // |story_id|.
-  //
-  // If no such story is found, the request is dropped.
-  virtual void ConnectToStoryEntityProvider(
-      const std::string& provider_uri,
-      fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-          entity_provider_request) = 0;
-
- protected:
-  virtual ~EntityProviderLauncher();
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_LAUNCHER_H_
diff --git a/bin/sessionmgr/entity_provider_runner/entity_provider_runner.cc b/bin/sessionmgr/entity_provider_runner/entity_provider_runner.cc
deleted file mode 100644
index 759b529..0000000
--- a/bin/sessionmgr/entity_provider_runner/entity_provider_runner.cc
+++ /dev/null
@@ -1,339 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// TODO(vardhan): Make entity references secure (no introspection allowed).
-
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_runner.h"
-
-#include <utility>
-
-#include <lib/fsl/types/type_converters.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/join_strings.h>
-#include <lib/fxl/type_converter.h>
-
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_controller.h"
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_launcher.h"
-#include "peridot/lib/fidl/json_xdr.h"
-#include "peridot/lib/util/string_escape.h"
-
-namespace modular {
-namespace {
-
-constexpr char kEntityReferencePrefix[] = "EntityRef";
-constexpr char kEntityDataReferencePrefix[] = "EntityData";
-constexpr char kStoryEntityReferencePrefix[] = "Story";
-
-using StringMap = std::map<std::string, std::string>;
-constexpr XdrFilterType<StringMap> XdrStringMap[] = {
-    XdrFilter<StringMap>,
-    nullptr,
-};
-
-// Given a |entity_namespace|, |provider_uri| and a |cookie|, encodes it into an
-// entity reference.
-std::string EncodeEntityReference(const std::string& entity_namespace,
-                                  const std::string& provider_uri,
-                                  const std::string& cookie) {
-  std::vector<std::string> parts(3);
-  parts[0] = entity_namespace;
-  parts[1] = StringEscape(provider_uri, "/");
-  parts[2] = StringEscape(cookie, "/");
-  return fxl::JoinStrings(parts, "/");
-}
-
-// Returns an entity reference for an entity associated with the given
-// |story_id| and |cookie|.
-std::string EncodeStoryEntityReference(const std::string& story_id,
-                                       const std::string& cookie) {
-  return EncodeEntityReference(kStoryEntityReferencePrefix, story_id, cookie);
-}
-
-// Returns an entity reference for an entity associated with the given
-// |agent_url| and |cookie|.
-std::string EncodeAgentEntityReference(const std::string& agent_url,
-                                       const std::string& cookie) {
-  return EncodeEntityReference(kEntityReferencePrefix, agent_url, cookie);
-}
-
-// Inverse of EncodeEntityReference.
-bool DecodeEntityReference(const std::string& entity_reference,
-                           std::string* const prefix,
-                           std::string* const provider_uri,
-                           std::string* const cookie) {
-  auto parts = SplitEscapedString(entity_reference, '/');
-  if (parts.size() != 3) {
-    return false;
-  }
-  *prefix = StringUnescape(parts[0].ToString());
-  *provider_uri = StringUnescape(parts[1].ToString());
-  *cookie = StringUnescape(parts[2].ToString());
-  return true;
-}
-
-bool DecodeEntityDataReference(const std::string& entity_reference,
-                               std::map<std::string, std::string>* data) {
-  auto parts = SplitEscapedString(entity_reference, '/');
-  if (parts.size() != 2 ||
-      StringUnescape(parts[0]) != kEntityDataReferencePrefix) {
-    return false;
-  }
-
-  return XdrRead(StringUnescape(parts[1].ToString()), data, XdrStringMap);
-}
-
-}  // namespace
-
-class EntityProviderRunner::EntityReferenceFactoryImpl
-    : fuchsia::modular::EntityReferenceFactory {
- public:
-  // Creates an entity reference factory for the given |provider_uri|.
-  //
-  // |entity_provider_runner| exposes the concrete implementations for encoding
-  //  entity references.
-  EntityReferenceFactoryImpl(const std::string& agent_url,
-                             EntityProviderRunner* const entity_provider_runner)
-      : agent_url_(agent_url),
-        entity_provider_runner_(entity_provider_runner) {}
-
-  void AddBinding(
-      fidl::InterfaceRequest<fuchsia::modular::EntityReferenceFactory>
-          request) {
-    bindings_.AddBinding(this, std::move(request));
-  }
-
-  void set_empty_set_handler(const std::function<void()>& handler) {
-    bindings_.set_empty_set_handler(handler);
-  }
-
- private:
-  // |fuchsia::modular::EntityReferenceFactory|
-  void CreateReference(std::string cookie,
-                       CreateReferenceCallback callback) override {
-    entity_provider_runner_->CreateReference(agent_url_, cookie, callback);
-  }
-
-  // The agent url if the entity reference factory produces references to
-  // entities backed by agents, otherwise the story id of the story entity
-  // provider.
-  const std::string agent_url_;
-
-  EntityProviderRunner* const entity_provider_runner_;
-  fidl::BindingSet<fuchsia::modular::EntityReferenceFactory> bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(EntityReferenceFactoryImpl);
-};
-
-// This class provides |fuchsia::modular::Entity| implementations for a given
-// data entity reference.
-class EntityProviderRunner::DataEntity : fuchsia::modular::Entity {
- public:
-  DataEntity(EntityProviderRunner* const provider,
-             const std::string& entity_reference,
-             std::map<std::string, std::string> data) {
-    for (const auto& kv : data) {
-      types_.push_back(kv.first);
-    }
-    data_ = std::move(data);
-
-    bindings_.set_empty_set_handler([provider, entity_reference] {
-      provider->OnDataEntityFinished(entity_reference);
-    });
-  };
-
-  void AddBinding(fidl::InterfaceRequest<fuchsia::modular::Entity> request) {
-    bindings_.AddBinding(this, std::move(request));
-  }
-
- private:
-  // |fuchsia::modular::Entity|
-  void GetTypes(GetTypesCallback result) override {
-    result(types_);
-  }
-  // |fuchsia::modular::Entity|
-  void GetData(std::string type, GetDataCallback result) override {
-    auto it = data_.find(type);
-    if (it != data_.end()) {
-      fsl::SizedVmo vmo;
-      FXL_CHECK(fsl::VmoFromString(it->second, &vmo));
-      auto vmo_ptr =
-          std::make_unique<fuchsia::mem::Buffer>(std::move(vmo).ToTransport());
-
-      result(std::move(vmo_ptr));
-    } else {
-      result(nullptr);
-    }
-  }
-  // |fuchsia::modular::Entity|
-  void WriteData(std::string type, fuchsia::mem::Buffer data,
-                 WriteDataCallback callback) override {
-    // TODO(MI4-1301)
-    callback(fuchsia::modular::EntityWriteStatus::READ_ONLY);
-  }
-  // |fuchsia::modular::Entity|
-  void GetReference(GetReferenceCallback callback) override {
-    // TODO(MI4-1301)
-    FXL_NOTIMPLEMENTED();
-  }
-  // |fuchsia::modular::Entity|
-  void Watch(
-      std::string type,
-      fidl::InterfaceHandle<fuchsia::modular::EntityWatcher> watcher) override {
-    // TODO(MI4-1301)
-    FXL_NOTIMPLEMENTED();
-  }
-
-  std::vector<std::string> types_;
-  std::map<std::string, std::string> data_;
-  fidl::BindingSet<fuchsia::modular::Entity> bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DataEntity);
-};
-
-EntityProviderRunner::EntityProviderRunner(
-    EntityProviderLauncher* const entity_provider_launcher)
-    : entity_provider_launcher_(entity_provider_launcher) {}
-
-EntityProviderRunner::~EntityProviderRunner() = default;
-
-void EntityProviderRunner::ConnectEntityReferenceFactory(
-    const std::string& agent_url,
-    fidl::InterfaceRequest<fuchsia::modular::EntityReferenceFactory> request) {
-  auto it = entity_reference_factory_bindings_.find(agent_url);
-  if (it == entity_reference_factory_bindings_.end()) {
-    bool inserted;
-    std::tie(it, inserted) = entity_reference_factory_bindings_.emplace(
-        std::make_pair(agent_url, std::make_unique<EntityReferenceFactoryImpl>(
-                                      agent_url, this)));
-    FXL_DCHECK(inserted);
-    it->second->set_empty_set_handler([this, agent_url] {
-      entity_reference_factory_bindings_.erase(agent_url);
-    });
-  }
-  it->second->AddBinding(std::move(request));
-}
-
-std::string EntityProviderRunner::CreateStoryEntityReference(
-    const std::string& story_id, const std::string& cookie) {
-  return EncodeStoryEntityReference(story_id, cookie);
-}
-
-void EntityProviderRunner::ConnectEntityResolver(
-    fidl::InterfaceRequest<fuchsia::modular::EntityResolver> request) {
-  entity_resolver_bindings_.AddBinding(this, std::move(request));
-}
-
-void EntityProviderRunner::OnEntityProviderFinished(
-    const std::string agent_url) {
-  entity_provider_controllers_.erase(agent_url);
-}
-
-std::string EntityProviderRunner::CreateReferenceFromData(
-    std::map<std::string, std::string> type_to_data) {
-  // TODO(rosswang): Several of these heap allocations are unnecessary but this
-  // code is only temporary.
-  std::string encoded;
-  XdrWrite(&encoded, &type_to_data, XdrStringMap);
-
-  std::vector<std::string> parts(2);
-  parts[0] = kEntityDataReferencePrefix;
-  parts[1] = StringEscape(encoded, "/");
-  std::string joined = fxl::JoinStrings(parts, "/");
-  if (joined.length() > ZX_CHANNEL_MAX_MSG_BYTES) {
-    FXL_LOG(ERROR) << "data entity reference size exceeds FIDL channel message "
-                      "size limits";
-  }
-  return joined;
-}
-
-void EntityProviderRunner::CreateReference(
-    const std::string& agent_url, const std::string& cookie,
-    fuchsia::modular::EntityReferenceFactory::CreateReferenceCallback
-        callback) {
-  auto entity_ref = EncodeAgentEntityReference(agent_url, cookie);
-  callback(entity_ref);
-}
-
-void EntityProviderRunner::ResolveDataEntity(
-    fidl::StringPtr entity_reference,
-    fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request) {
-  std::map<std::string, std::string> entity_data;
-  if (!DecodeEntityDataReference(entity_reference, &entity_data)) {
-    FXL_LOG(INFO) << "Could not decode entity reference: " << entity_reference;
-    return;
-    // |entity_request| closes here.
-  }
-
-  auto inserted =
-      data_entities_.emplace(std::make_pair(entity_reference.get(), nullptr));
-  if (inserted.second) {
-    // This is a new entity.
-    inserted.first->second = std::make_unique<DataEntity>(
-        this, entity_reference.get(), std::move(entity_data));
-  }
-  inserted.first->second->AddBinding(std::move(entity_request));
-}
-
-void EntityProviderRunner::OnDataEntityFinished(
-    const std::string& entity_reference) {
-  data_entities_.erase(entity_reference);
-}
-
-void EntityProviderRunner::ResolveEntity(
-    std::string entity_reference,
-    fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request) {
-  if (entity_reference.find(kEntityDataReferencePrefix) == 0ul) {
-    ResolveDataEntity(entity_reference, std::move(entity_request));
-    return;
-  }
-
-  std::string provider_uri;
-  std::string cookie;
-  std::string prefix;
-  fuchsia::modular::EntityProviderPtr entity_provider;
-  fuchsia::modular::AgentControllerPtr agent_controller;
-
-  if (!DecodeEntityReference(entity_reference, &prefix, &provider_uri,
-                             &cookie)) {
-    return;
-    // |entity_request| is closed here.
-  }
-
-  bool is_story_entity = prefix == kStoryEntityReferencePrefix;
-
-  if (is_story_entity) {
-    entity_provider_launcher_->ConnectToStoryEntityProvider(
-        provider_uri, entity_provider.NewRequest());
-  } else if (prefix == kEntityReferencePrefix) {
-    entity_provider_launcher_->ConnectToEntityProvider(
-        provider_uri, entity_provider.NewRequest(),
-        agent_controller.NewRequest());
-  } else {
-    return;
-    // |entity_request| is closed here.
-  }
-
-  // Connect to the EntityProviderController managing this entity.
-  auto it = entity_provider_controllers_.find(provider_uri);
-  if (it == entity_provider_controllers_.end()) {
-    bool inserted;
-    std::tie(it, inserted) =
-        entity_provider_controllers_.emplace(std::make_pair(
-            provider_uri,
-            std::make_unique<EntityProviderController>(
-                std::move(entity_provider), std::move(agent_controller),
-                [this, is_story_entity, provider_uri] {
-                  if (!is_story_entity) {
-                    OnEntityProviderFinished(provider_uri);
-                  }
-                })));
-    FXL_DCHECK(inserted);
-  }
-
-  it->second->ProvideEntity(cookie, entity_reference,
-                            std::move(entity_request));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/entity_provider_runner/entity_provider_runner.h b/bin/sessionmgr/entity_provider_runner/entity_provider_runner.h
deleted file mode 100644
index a76207a..0000000
--- a/bin/sessionmgr/entity_provider_runner/entity_provider_runner.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_RUNNER_H_
-#define PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_RUNNER_H_
-
-#include <map>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-class EntityProviderController;
-class EntityProviderLauncher;
-
-// This class provides an implementation for |fuchsia::modular::EntityResolver|
-// and |fuchsia::modular::EntityReferenceFactory| and manages all the
-// EntityProviders running in the system. One |EntityProviderRunner| instance
-// services all |fuchsia::modular::EntityResolver| interfaces, and there is one
-// |EntityReferenceFactoryImpl| for each
-// |fuchsia::modular::EntityReferenceFactory| interface.
-class EntityProviderRunner : public fuchsia::modular::EntityResolver {
- public:
-  EntityProviderRunner(EntityProviderLauncher* entity_provider_launcher);
-  ~EntityProviderRunner() override;
-
-  // Connects to the entity reference factory for the agent at |agent_url|.
-  //
-  // The created entity references will be resolved back to that particular
-  // agent.
-  void ConnectEntityReferenceFactory(
-      const std::string& agent_url,
-      fidl::InterfaceRequest<fuchsia::modular::EntityReferenceFactory> request);
-
-  // Connects to the entity resolver service. The resolver service can resolve
-  // any references, regardless if they are backed by an agent or a story entity
-  // provider.
-  void ConnectEntityResolver(
-      fidl::InterfaceRequest<fuchsia::modular::EntityResolver> request);
-
-  // Creates an entity reference for the given |cookie| associated with the
-  // specified |story_id|.
-  std::string CreateStoryEntityReference(const std::string& story_id,
-                                         const std::string& cookie);
-
-  // Given a map of entity type -> entity data, creates an entity reference for
-  // it. This data is encoded into the entity reference, and must be within
-  // 16KB. If successful, a non-null value is returned.
-  std::string CreateReferenceFromData(
-      std::map<std::string, std::string> type_to_data);
-
-  // Called by a DataEntity when it has no more |fuchsia::modular::Entity|s it
-  // needs to serve for a particular |entity_reference|.
-  void OnDataEntityFinished(const std::string& entity_reference);
-
- private:
-  class EntityReferenceFactoryImpl;
-  class DataEntity;
-
-  // The |EntityReferenceFactory| uses this to create entity references for
-  // a particular agent.
-  //
-  // |agent_url| The url of the agent creating the entity reference.
-  // |cookie| The cookie identifying the entity.
-  // |callback| The callback which is called with the constructed entity
-  //   reference.
-  void CreateReference(
-      const std::string& agent_url, const std::string& cookie,
-      fuchsia::modular::EntityReferenceFactory::CreateReferenceCallback
-          callback);
-
-  // |fuchsia::modular::EntityResolver|
-  void ResolveEntity(
-      std::string entity_reference,
-      fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request) override;
-
-  void ResolveDataEntity(
-      fidl::StringPtr entity_reference,
-      fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request);
-
-  // Performs the cleanup required when the entity provider at the provided
-  // agent_url finished.
-  void OnEntityProviderFinished(const std::string agent_url);
-
-  EntityProviderLauncher* const entity_provider_launcher_;
-
-  // agent url -> EntityReferenceFactoryImpl
-  std::map<std::string, std::unique_ptr<EntityReferenceFactoryImpl>>
-      entity_reference_factory_bindings_;
-
-  // story id -> StoryEntityReferenceFactoryImpl
-  std::map<std::string, std::unique_ptr<EntityReferenceFactoryImpl>>
-      story_entity_reference_factory_bindings_;
-
-  fidl::BindingSet<fuchsia::modular::EntityResolver> entity_resolver_bindings_;
-
-  // These are the running entity providers.
-  // component id -> EntityProviderController.
-  std::map<std::string, std::unique_ptr<EntityProviderController>>
-      entity_provider_controllers_;
-
-  // entity reference -> |fuchsia::modular::Entity| implementation.
-  std::map<std::string, std::unique_ptr<DataEntity>> data_entities_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(EntityProviderRunner);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_ENTITY_PROVIDER_RUNNER_ENTITY_PROVIDER_RUNNER_H_
diff --git a/bin/sessionmgr/entity_provider_runner/entity_provider_runner_unittest.cc b/bin/sessionmgr/entity_provider_runner/entity_provider_runner_unittest.cc
deleted file mode 100644
index fdcd966..0000000
--- a/bin/sessionmgr/entity_provider_runner/entity_provider_runner_unittest.cc
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_runner.h"
-
-#include <memory>
-
-#include <fs/service.h>
-#include <fs/synchronous-vfs.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/agent/cpp/agent_impl.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/component/cpp/service_provider_impl.h>
-#include <lib/component/cpp/testing/fake_launcher.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-#include <lib/fxl/macros.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner.h"
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_launcher.h"
-#include "peridot/bin/sessionmgr/message_queue/message_queue_manager.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/ledger_client/page_id.h"
-#include "peridot/lib/testing/fake_agent_runner_storage.h"
-#include "peridot/lib/testing/mock_base.h"
-#include "peridot/lib/testing/test_with_ledger.h"
-
-namespace modular {
-namespace testing {
-namespace {
-
-using ::component::testing::FakeLauncher;
-
-class EntityProviderRunnerTest : public TestWithLedger, EntityProviderLauncher {
- public:
-  EntityProviderRunnerTest() = default;
-
-  void SetUp() override {
-    TestWithLedger::SetUp();
-
-    mqm_ = std::make_unique<MessageQueueManager>(
-        ledger_client(), MakePageId("0123456789123456"), mq_data_dir_.path());
-    entity_provider_runner_ = std::make_unique<EntityProviderRunner>(
-        static_cast<EntityProviderLauncher*>(this));
-    // The |fuchsia::modular::UserIntelligenceProvider| below must be nullptr in
-    // order for agent creation to be synchronous, which these tests assume.
-    agent_runner_ = std::make_unique<AgentRunner>(
-        &launcher_, mqm_.get(), ledger_repository(), &agent_runner_storage_,
-        token_manager_.get(), nullptr, entity_provider_runner_.get());
-  }
-
-  void TearDown() override {
-    agent_runner_.reset();
-    entity_provider_runner_.reset();
-    mqm_.reset();
-
-    TestWithLedger::TearDown();
-  }
-
-  MessageQueueManager* message_queue_manager() { return mqm_.get(); }
-
- protected:
-  AgentRunner* agent_runner() { return agent_runner_.get(); }
-  FakeLauncher* launcher() { return &launcher_; }
-  EntityProviderRunner* entity_provider_runner() {
-    return entity_provider_runner_.get();
-  }
-
- private:
-  // TODO(vardhan): A test probably shouldn't be implementing this..
-  // |EntityProviderLauncher|
-  void ConnectToEntityProvider(
-      const std::string& agent_url,
-      fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-          entity_provider_request,
-      fidl::InterfaceRequest<fuchsia::modular::AgentController>
-          agent_controller_request) override {
-    agent_runner_->ConnectToEntityProvider(agent_url,
-                                           std::move(entity_provider_request),
-                                           std::move(agent_controller_request));
-  }
-
-  void ConnectToStoryEntityProvider(
-      const std::string& story_id,
-      fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-          entity_provider_request) override {
-    FXL_NOTIMPLEMENTED();
-  }
-
-  FakeLauncher launcher_;
-
-  files::ScopedTempDir mq_data_dir_;
-  std::unique_ptr<MessageQueueManager> mqm_;
-  FakeAgentRunnerStorage agent_runner_storage_;
-  std::unique_ptr<EntityProviderRunner> entity_provider_runner_;
-  std::unique_ptr<AgentRunner> agent_runner_;
-
-  fuchsia::auth::TokenManagerPtr token_manager_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(EntityProviderRunnerTest);
-};
-
-class MyEntityProvider : AgentImpl::Delegate,
-                         fuchsia::modular::EntityProvider,
-                         public fuchsia::sys::ComponentController,
-                         public testing::MockBase {
- public:
-  MyEntityProvider(
-      fuchsia::sys::LaunchInfo launch_info,
-      fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl)
-      : vfs_(async_get_default_dispatcher()),
-        outgoing_directory_(fbl::AdoptRef(new fs::PseudoDir())),
-        controller_(this, std::move(ctrl)),
-        entity_provider_binding_(this),
-        launch_info_(std::move(launch_info)) {
-    outgoing_directory_->AddEntry(
-        fuchsia::modular::EntityProvider::Name_,
-        fbl::AdoptRef(new fs::Service([this](zx::channel channel) {
-          entity_provider_binding_.Bind(std::move(channel));
-          return ZX_OK;
-        })));
-    vfs_.ServeDirectory(outgoing_directory_,
-                        std::move(launch_info_.directory_request));
-    agent_impl_ = std::make_unique<AgentImpl>(
-        outgoing_directory_, static_cast<AgentImpl::Delegate*>(this));
-
-    // Get |agent_context_| and |entity_resolver_| from incoming namespace.
-    FXL_CHECK(launch_info_.additional_services);
-    FXL_CHECK(launch_info_.additional_services->provider.is_valid());
-    auto additional_services =
-        launch_info_.additional_services->provider.Bind();
-    component::ConnectToService(additional_services.get(),
-                                agent_context_.NewRequest());
-    fuchsia::modular::ComponentContextPtr component_context;
-    agent_context_->GetComponentContext(component_context.NewRequest());
-    component_context->GetEntityResolver(entity_resolver_.NewRequest());
-  }
-
-  size_t GetCallCount(const std::string func) { return counts.count(func); }
-  fuchsia::modular::EntityResolver* entity_resolver() {
-    return entity_resolver_.get();
-  }
-  fuchsia::modular::AgentContext* agent_context() {
-    return agent_context_.get();
-  }
-
- private:
-  // |ComponentController|
-  void Kill() override { ++counts["Kill"]; }
-  // |ComponentController|
-  void Detach() override { ++counts["Detach"]; }
-
-  // |AgentImpl::Delegate|
-  void Connect(fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-                   outgoing_services) override {
-    ++counts["Connect"];
-  }
-  // |AgentImpl::Delegate|
-  void RunTask(const fidl::StringPtr& task_id,
-               const std::function<void()>& done) override {
-    ++counts["RunTask"];
-    done();
-  }
-
-  // |fuchsia::modular::EntityProvider|
-  void GetTypes(std::string cookie, GetTypesCallback callback) override {
-    std::vector<std::string> types;
-    types.push_back("MyType");
-    callback(std::move(types));
-  }
-
-  // |fuchsia::modular::EntityProvider|
-  void GetData(std::string cookie, std::string type,
-               GetDataCallback callback) override {
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(type + ":MyData", &vmo));
-    auto vmo_ptr =
-        std::make_unique<fuchsia::mem::Buffer>(std::move(vmo).ToTransport());
-
-    callback(std::move(vmo_ptr));
-  }
-
-  // |fuchsia::modular::EntityProvider|
-  void WriteData(std::string cookie, std::string type,
-                 fuchsia::mem::Buffer data,
-                 WriteDataCallback callback) override {
-    // TODO(MI4-1301)
-    callback(fuchsia::modular::EntityWriteStatus::READ_ONLY);
-  }
-
-  // |fuchsia::modular::EntityProvider|
-  void Watch(
-      std::string cookie, std::string type,
-      fidl::InterfaceHandle<fuchsia::modular::EntityWatcher> watcher) override {
-    // TODO(MI4-1301)
-    FXL_NOTIMPLEMENTED();
-  }
-
- private:
-  fs::SynchronousVfs vfs_;
-  fbl::RefPtr<fs::PseudoDir> outgoing_directory_;
-  fuchsia::modular::AgentContextPtr agent_context_;
-  std::unique_ptr<AgentImpl> agent_impl_;
-  fuchsia::modular::EntityResolverPtr entity_resolver_;
-  fidl::Binding<fuchsia::sys::ComponentController> controller_;
-  fidl::Binding<fuchsia::modular::EntityProvider> entity_provider_binding_;
-  fuchsia::sys::LaunchInfo launch_info_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(MyEntityProvider);
-};
-
-TEST_F(EntityProviderRunnerTest, Basic) {
-  std::unique_ptr<MyEntityProvider> dummy_agent;
-  constexpr char kMyAgentUrl[] = "file:///my_agent";
-  launcher()->RegisterComponent(
-      kMyAgentUrl,
-      [&dummy_agent](
-          fuchsia::sys::LaunchInfo launch_info,
-          fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl) {
-        dummy_agent = std::make_unique<MyEntityProvider>(std::move(launch_info),
-                                                         std::move(ctrl));
-      });
-
-  // 1. Start up the entity provider agent.
-  fuchsia::sys::ServiceProviderPtr incoming_services;
-  fuchsia::modular::AgentControllerPtr agent_controller;
-  agent_runner()->ConnectToAgent("dummy_requestor_url", kMyAgentUrl,
-                                 incoming_services.NewRequest(),
-                                 agent_controller.NewRequest());
-
-  RunLoopWithTimeoutOrUntil([&dummy_agent] {
-    return dummy_agent.get() != nullptr &&
-           dummy_agent->GetCallCount("Connect") == 1;
-  });
-  dummy_agent->ExpectCalledOnce("Connect");
-
-  // 2. Make an entity reference on behalf of this agent.
-  // The framework should use |kMyAgentUrl| as the agent to associate new
-  // references.
-  fuchsia::modular::EntityReferenceFactoryPtr factory;
-  dummy_agent->agent_context()->GetEntityReferenceFactory(factory.NewRequest());
-  fidl::StringPtr entity_ref;
-  factory->CreateReference("my_cookie", [&entity_ref](fidl::StringPtr retval) {
-    entity_ref = retval;
-  });
-
-  RunLoopWithTimeoutOrUntil([&entity_ref] { return !entity_ref.is_null(); });
-  EXPECT_FALSE(entity_ref.is_null());
-
-  // 3. Resolve the reference into an |fuchsia::modular::Entity|, make calls to
-  // GetTypes and
-  //    GetData, which should route into our |MyEntityProvider|.
-  fuchsia::modular::EntityPtr entity;
-  dummy_agent->entity_resolver()->ResolveEntity(entity_ref,
-                                                entity.NewRequest());
-
-  std::map<std::string, uint32_t> counts;
-  entity->GetTypes([&counts](const std::vector<std::string>& types) {
-    EXPECT_EQ(1u, types.size());
-    EXPECT_EQ("MyType", types.at(0));
-    counts["GetTypes"]++;
-  });
-  entity->GetData("MyType",
-                  [&counts](std::unique_ptr<fuchsia::mem::Buffer> data) {
-                    std::string data_string;
-                    FXL_CHECK(fsl::StringFromVmo(*data, &data_string));
-                    EXPECT_EQ("MyType:MyData", data_string);
-                    counts["GetData"]++;
-                  });
-  RunLoopWithTimeoutOrUntil(
-      [&counts] { return counts["GetTypes"] == 1 && counts["GetData"] == 1; });
-  EXPECT_EQ(1u, counts["GetTypes"]);
-  EXPECT_EQ(1u, counts["GetData"]);
-}
-
-TEST_F(EntityProviderRunnerTest, DataEntity) {
-  std::map<std::string, std::string> data;
-  data["type1"] = "data1";
-
-  auto entity_ref = entity_provider_runner()->CreateReferenceFromData(data);
-
-  fuchsia::modular::EntityResolverPtr entity_resolver;
-  entity_provider_runner()->ConnectEntityResolver(entity_resolver.NewRequest());
-  fuchsia::modular::EntityPtr entity;
-  entity_resolver->ResolveEntity(entity_ref, entity.NewRequest());
-
-  fidl::VectorPtr<std::string> output_types;
-  entity->GetTypes([&output_types](std::vector<std::string> result) {
-    output_types.reset(std::move(result));
-  });
-  RunLoopWithTimeoutOrUntil(
-      [&output_types] { return !output_types.is_null(); });
-
-  EXPECT_EQ(data.size(), output_types->size());
-  EXPECT_EQ("type1", output_types->at(0));
-
-  fidl::StringPtr output_data;
-  entity->GetData("type1",
-                  [&output_data](std::unique_ptr<fuchsia::mem::Buffer> result) {
-                    std::string data_string;
-                    FXL_CHECK(fsl::StringFromVmo(*result, &data_string));
-                    output_data = data_string;
-                  });
-  RunLoopWithTimeoutOrUntil([&output_data] { return !output_data.is_null(); });
-  EXPECT_EQ("data1", output_data);
-}
-
-}  // namespace
-}  // namespace testing
-}  // namespace modular
diff --git a/bin/sessionmgr/focus.cc b/bin/sessionmgr/focus.cc
deleted file mode 100644
index 0af8337..0000000
--- a/bin/sessionmgr/focus.cc
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/focus.h"
-
-#include <lib/fidl/cpp/array.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/time/time_point.h>
-
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/fidl/json_xdr.h"
-#include "peridot/lib/ledger_client/operations.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-
-namespace modular {
-
-namespace {
-
-// Serialization and deserialization of fuchsia::modular::FocusInfo to and from
-// JSON.
-void XdrFocusInfo_v1(XdrContext* const xdr,
-                     fuchsia::modular::FocusInfo* const data) {
-  xdr->Field("device_id", &data->device_id);
-  xdr->Field("focused_story_id", &data->focused_story_id);
-  xdr->Field("last_focus_timestamp", &data->last_focus_change_timestamp);
-}
-
-void XdrFocusInfo_v2(XdrContext* const xdr,
-                     fuchsia::modular::FocusInfo* const data) {
-  if (!xdr->Version(2)) {
-    return;
-  }
-  xdr->Field("device_id", &data->device_id);
-  xdr->Field("focused_story_id", &data->focused_story_id);
-  xdr->Field("last_focus_timestamp", &data->last_focus_change_timestamp);
-}
-
-constexpr XdrFilterType<fuchsia::modular::FocusInfo> XdrFocusInfo[] = {
-    XdrFocusInfo_v2,
-    XdrFocusInfo_v1,
-    nullptr,
-};
-
-}  // namespace
-
-FocusHandler::FocusHandler(fidl::StringPtr device_id,
-                           LedgerClient* const ledger_client,
-                           LedgerPageId page_id)
-    : PageClient("FocusHandler", ledger_client, std::move(page_id),
-                 kFocusKeyPrefix),
-      device_id_(device_id) {}
-
-FocusHandler::~FocusHandler() = default;
-
-void FocusHandler::AddProviderBinding(
-    fidl::InterfaceRequest<fuchsia::modular::FocusProvider> request) {
-  provider_bindings_.AddBinding(this, std::move(request));
-}
-
-void FocusHandler::AddControllerBinding(
-    fidl::InterfaceRequest<fuchsia::modular::FocusController> request) {
-  controller_bindings_.AddBinding(this, std::move(request));
-}
-
-// |fuchsia::modular::FocusProvider|
-void FocusHandler::Query(QueryCallback callback) {
-  operation_queue_.Add(new ReadAllDataCall<fuchsia::modular::FocusInfo>(
-      page(), kFocusKeyPrefix, XdrFocusInfo,
-      [callback](std::vector<fuchsia::modular::FocusInfo> infos) {
-        callback(std::move(infos));
-      }));
-}
-
-// |fuchsia::modular::FocusProvider|
-void FocusHandler::Watch(
-    fidl::InterfaceHandle<fuchsia::modular::FocusWatcher> watcher) {
-  change_watchers_.push_back(watcher.Bind());
-}
-
-// |fuchsia::modular::FocusProvider|
-void FocusHandler::Request(fidl::StringPtr story_id) {
-  for (const auto& watcher : request_watchers_) {
-    watcher->OnFocusRequest(story_id);
-  }
-}
-
-// |fuchsia::modular::FocusController|
-void FocusHandler::Set(fidl::StringPtr story_id) {
-  fuchsia::modular::FocusInfoPtr data = fuchsia::modular::FocusInfo::New();
-  data->device_id = device_id_;
-  data->focused_story_id = story_id;
-  data->last_focus_change_timestamp = time(nullptr);
-
-  operation_queue_.Add(new WriteDataCall<fuchsia::modular::FocusInfo>(
-      page(), MakeFocusKey(device_id_), XdrFocusInfo, std::move(data), [] {}));
-}
-
-// |fuchsia::modular::FocusController|
-void FocusHandler::WatchRequest(
-    fidl::InterfaceHandle<fuchsia::modular::FocusRequestWatcher> watcher) {
-  request_watchers_.push_back(watcher.Bind());
-}
-
-// |PageClient|
-void FocusHandler::OnPageChange(const std::string& /*key*/,
-                                const std::string& value) {
-  auto focus_info = fuchsia::modular::FocusInfo::New();
-  if (!XdrRead(value, &focus_info, XdrFocusInfo)) {
-    return;
-  }
-
-  for (const auto& watcher : change_watchers_) {
-    watcher->OnFocusChange(CloneOptional(focus_info));
-  }
-}
-
-VisibleStoriesHandler::VisibleStoriesHandler() {}
-
-VisibleStoriesHandler::~VisibleStoriesHandler() = default;
-
-void VisibleStoriesHandler::AddProviderBinding(
-    fidl::InterfaceRequest<fuchsia::modular::VisibleStoriesProvider> request) {
-  provider_bindings_.AddBinding(this, std::move(request));
-}
-
-void VisibleStoriesHandler::AddControllerBinding(
-    fidl::InterfaceRequest<fuchsia::modular::VisibleStoriesController>
-        request) {
-  controller_bindings_.AddBinding(this, std::move(request));
-}
-
-void VisibleStoriesHandler::Query(QueryCallback callback) {
-  callback(visible_stories_);
-}
-
-void VisibleStoriesHandler::Watch(
-    fidl::InterfaceHandle<fuchsia::modular::VisibleStoriesWatcher> watcher) {
-  change_watchers_.push_back(watcher.Bind());
-}
-
-void VisibleStoriesHandler::Set(fidl::VectorPtr<std::string> story_ids) {
-  visible_stories_ = std::move(story_ids);
-  for (const auto& watcher : change_watchers_) {
-    watcher->OnVisibleStoriesChange(visible_stories_.Clone());
-  }
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/focus.h b/bin/sessionmgr/focus.h
deleted file mode 100644
index 2b8b43a..0000000
--- a/bin/sessionmgr/focus.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_FOCUS_H_
-#define PERIDOT_BIN_SESSIONMGR_FOCUS_H_
-
-#include <string>
-#include <vector>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/string.h>
-
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_client.h"
-#include "peridot/lib/ledger_client/types.h"
-
-// See services/user/focus.fidl for details.
-
-namespace modular {
-
-class FocusHandler : fuchsia::modular::FocusProvider,
-                     fuchsia::modular::FocusController,
-                     PageClient {
- public:
-  FocusHandler(fidl::StringPtr device_id, LedgerClient* ledger_client,
-               LedgerPageId page_id);
-  ~FocusHandler() override;
-
-  void AddProviderBinding(
-      fidl::InterfaceRequest<fuchsia::modular::FocusProvider> request);
-  void AddControllerBinding(
-      fidl::InterfaceRequest<fuchsia::modular::FocusController> request);
-
- private:
-  // |fuchsia::modular::FocusProvider|
-  void Query(QueryCallback callback) override;
-  void Watch(
-      fidl::InterfaceHandle<fuchsia::modular::FocusWatcher> watcher) override;
-  void Request(fidl::StringPtr story_id) override;
-
-  // |fuchsia::modular::FocusController|
-  void Set(fidl::StringPtr story_id) override;
-  void WatchRequest(fidl::InterfaceHandle<fuchsia::modular::FocusRequestWatcher>
-                        watcher) override;
-
-  // |PageClient|
-  void OnPageChange(const std::string& key, const std::string& value) override;
-
-  const fidl::StringPtr device_id_;
-
-  fidl::BindingSet<fuchsia::modular::FocusProvider> provider_bindings_;
-  fidl::BindingSet<fuchsia::modular::FocusController> controller_bindings_;
-
-  std::vector<fuchsia::modular::FocusWatcherPtr> change_watchers_;
-  std::vector<fuchsia::modular::FocusRequestWatcherPtr> request_watchers_;
-
-  // Operations on an instance of this clas are sequenced in this operation
-  // queue. TODO(mesch): They currently do not need to be, but it's easier to
-  // reason this way.
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FocusHandler);
-};
-
-class VisibleStoriesHandler : fuchsia::modular::VisibleStoriesProvider,
-                              fuchsia::modular::VisibleStoriesController {
- public:
-  VisibleStoriesHandler();
-  ~VisibleStoriesHandler() override;
-
-  void AddProviderBinding(
-      fidl::InterfaceRequest<fuchsia::modular::VisibleStoriesProvider> request);
-  void AddControllerBinding(
-      fidl::InterfaceRequest<fuchsia::modular::VisibleStoriesController>
-          request);
-
- private:
-  // |fuchsia::modular::VisibleStoriesProvider|
-  void Query(QueryCallback callback) override;
-  void Watch(fidl::InterfaceHandle<fuchsia::modular::VisibleStoriesWatcher>
-                 watcher) override;
-
-  // |fuchsia::modular::VisibleStoriesController|
-  void Set(fidl::VectorPtr<std::string> story_ids) override;
-
-  fidl::BindingSet<fuchsia::modular::VisibleStoriesProvider> provider_bindings_;
-  fidl::BindingSet<fuchsia::modular::VisibleStoriesController>
-      controller_bindings_;
-
-  std::vector<fuchsia::modular::VisibleStoriesWatcherPtr> change_watchers_;
-
-  fidl::VectorPtr<std::string> visible_stories_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(VisibleStoriesHandler);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_FOCUS_H_
diff --git a/bin/sessionmgr/intelligence_services_impl.cc b/bin/sessionmgr/intelligence_services_impl.cc
deleted file mode 100644
index 4064069..0000000
--- a/bin/sessionmgr/intelligence_services_impl.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/intelligence_services_impl.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-namespace modular {
-
-IntelligenceServicesImpl::IntelligenceServicesImpl(
-    fuchsia::modular::ComponentScope scope,
-    fuchsia::modular::ContextEngine* context_engine,
-    fuchsia::modular::SuggestionEngine* suggestion_engine)
-    : scope_(std::move(scope)),
-      context_engine_(context_engine),
-      suggestion_engine_(suggestion_engine) {}
-
-fuchsia::modular::ComponentScope IntelligenceServicesImpl::CloneScope() {
-  fuchsia::modular::ComponentScope scope;
-  fidl::Clone(scope_, &scope);
-  return scope;
-}
-
-void IntelligenceServicesImpl::GetContextReader(
-    fidl::InterfaceRequest<fuchsia::modular::ContextReader> request) {
-  context_engine_->GetReader(CloneScope(), std::move(request));
-}
-
-void IntelligenceServicesImpl::GetContextWriter(
-    fidl::InterfaceRequest<fuchsia::modular::ContextWriter> request) {
-  context_engine_->GetWriter(CloneScope(), std::move(request));
-}
-
-void IntelligenceServicesImpl::GetProposalPublisher(
-    fidl::InterfaceRequest<fuchsia::modular::ProposalPublisher> request) {
-  fidl::StringPtr component_id;
-  if (scope_.is_agent_scope()) {
-    component_id = scope_.agent_scope().url;
-  } else if (scope_.is_module_scope()) {
-    component_id = scope_.module_scope().url;
-  } else {  // scope_.is_global_scope()
-    component_id = "global";
-  }
-
-  // TODO(thatguy): Change |component_id| to use
-  // fuchsia::modular::ComponentScope once it is renamed to something like
-  // ComponentInfo.
-  suggestion_engine_->RegisterProposalPublisher(component_id,
-                                                std::move(request));
-}
-
-void IntelligenceServicesImpl::RegisterQueryHandler(
-    fidl::InterfaceHandle<fuchsia::modular::QueryHandler> query_handler) {
-  fidl::StringPtr component_id;
-  if (scope_.is_agent_scope()) {
-    component_id = scope_.agent_scope().url;
-  } else if (scope_.is_module_scope()) {
-    component_id = scope_.module_scope().url;
-  } else {  // scope_.is_global_scope()
-    component_id = "global";
-  }
-
-  suggestion_engine_->RegisterQueryHandler(component_id,
-                                           std::move(query_handler));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/intelligence_services_impl.h b/bin/sessionmgr/intelligence_services_impl.h
deleted file mode 100644
index 2559d5d..0000000
--- a/bin/sessionmgr/intelligence_services_impl.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_INTELLIGENCE_SERVICES_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_INTELLIGENCE_SERVICES_IMPL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-namespace modular {
-
-class IntelligenceServicesImpl : public fuchsia::modular::IntelligenceServices {
- public:
-  // |context_engine| and |suggestion_engine| are not owned and must outlive
-  // this instance.
-  IntelligenceServicesImpl(
-      fuchsia::modular::ComponentScope scope,
-      fuchsia::modular::ContextEngine* context_engine,
-      fuchsia::modular::SuggestionEngine* suggestion_engine);
-
-  void GetContextReader(
-      fidl::InterfaceRequest<fuchsia::modular::ContextReader> request) override;
-  void GetContextWriter(
-      fidl::InterfaceRequest<fuchsia::modular::ContextWriter> request) override;
-
-  void GetProposalPublisher(
-      fidl::InterfaceRequest<fuchsia::modular::ProposalPublisher> request)
-      override;
-
-  void RegisterQueryHandler(
-      fidl::InterfaceHandle<fuchsia::modular::QueryHandler> query_handler)
-      override;
-
- private:
-  fuchsia::modular::ComponentScope CloneScope();
-
-  fuchsia::modular::ComponentScope scope_;
-  fuchsia::modular::ContextEngine* const context_engine_;        // Not owned.
-  fuchsia::modular::SuggestionEngine* const suggestion_engine_;  // Not owned.
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_INTELLIGENCE_SERVICES_IMPL_H_
diff --git a/bin/sessionmgr/message_queue/BUILD.gn b/bin/sessionmgr/message_queue/BUILD.gn
deleted file mode 100644
index 8896ce2..0000000
--- a/bin/sessionmgr/message_queue/BUILD.gn
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("message_queue") {
-  sources = [
-    "message_queue_manager.cc",
-    "message_queue_manager.h",
-    "persistent_queue.cc",
-    "persistent_queue.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/bin/sessionmgr/agent_runner:public",
-    "//peridot/bin/sessionmgr/entity_provider_runner",
-    "//peridot/bin/sessionmgr/storage:constants_and_utils",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/ledger_client:operations",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/lib/ledger_client:types",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
diff --git a/bin/sessionmgr/message_queue/message_queue_manager.cc b/bin/sessionmgr/message_queue/message_queue_manager.cc
deleted file mode 100644
index 35f8127..0000000
--- a/bin/sessionmgr/message_queue/message_queue_manager.cc
+++ /dev/null
@@ -1,921 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/message_queue/message_queue_manager.h"
-
-#include <algorithm>
-#include <deque>
-#include <utility>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "peridot/bin/sessionmgr/message_queue/persistent_queue.h"
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/fidl/json_xdr.h"
-#include "peridot/lib/ledger_client/operations.h"
-#include "peridot/lib/ledger_client/page_client.h"
-
-namespace modular {
-
-struct MessageQueueInfo {
-  std::string component_namespace;
-  std::string component_instance_id;
-  std::string queue_name;
-  std::string queue_token;
-
-  bool is_complete() const {
-    return !component_instance_id.empty() && !queue_name.empty();
-  }
-
-  bool operator==(const MessageQueueInfo& a) const {
-    return component_namespace == a.component_namespace &&
-           component_instance_id == a.component_instance_id &&
-           queue_name == a.queue_name && queue_token == a.queue_token;
-  }
-};
-
-namespace {
-
-void XdrMessageQueueInfo_v1(XdrContext* const xdr,
-                            MessageQueueInfo* const data) {
-  xdr->Field("component_namespace", &data->component_namespace);
-  xdr->Field("component_instance_id", &data->component_instance_id);
-  xdr->Field("queue_name", &data->queue_name);
-  xdr->Field("queue_token", &data->queue_token);
-}
-
-void XdrMessageQueueInfo_v2(XdrContext* const xdr,
-                            MessageQueueInfo* const data) {
-  if (!xdr->Version(2)) {
-    return;
-  }
-  xdr->Field("component_namespace", &data->component_namespace);
-  xdr->Field("component_instance_id", &data->component_instance_id);
-  xdr->Field("queue_name", &data->queue_name);
-  xdr->Field("queue_token", &data->queue_token);
-}
-
-constexpr XdrFilterType<MessageQueueInfo> XdrMessageQueueInfo[] = {
-    XdrMessageQueueInfo_v2,
-    XdrMessageQueueInfo_v1,
-    nullptr,
-};
-
-}  // namespace
-
-class MessageQueueStorage;
-
-// This class implements the |fuchsia::modular::MessageQueue| fidl interface,
-// and is owned by |MessageQueueStorage|. It forwards all calls to its owner,
-// and expects its owner to manage outstanding
-// |fuchsia::modular::MessageQueue.Receive| calls. It also notifies its owner on
-// object destruction.
-//
-// Interface is public, because bindings are outside of the class.
-class MessageQueueConnection : public fuchsia::modular::MessageQueue {
- public:
-  explicit MessageQueueConnection(MessageQueueStorage* queue_storage);
-  ~MessageQueueConnection() override;
-
- private:
-  // |fuchsia::modular::MessageQueue|
-  void RegisterReceiver(
-      fidl::InterfaceHandle<fuchsia::modular::MessageReader> receiver) override;
-
-  // |fuchsia::modular::MessageQueue|
-  void GetToken(GetTokenCallback callback) override;
-
-  MessageQueueStorage* const queue_storage_;
-};
-
-// Class for managing a particular message queue, its tokens and its storage.
-// Implementations of |fuchsia::modular::MessageQueue| and
-// |fuchsia::modular::MessageSender| call into this class to manipulate the
-// message queue. Owned by |MessageQueueManager|.
-class MessageQueueStorage : fuchsia::modular::MessageSender {
- public:
-  MessageQueueStorage(std::string queue_name, std::string queue_token,
-                      const std::string& file_name_)
-      : queue_name_(std::move(queue_name)),
-        queue_token_(std::move(queue_token)),
-        queue_data_(file_name_) {}
-
-  ~MessageQueueStorage() override = default;
-
-  void RegisterReceiver(
-      fidl::InterfaceHandle<fuchsia::modular::MessageReader> receiver) {
-    if (message_receiver_) {
-      FXL_DLOG(WARNING)
-          << "Existing fuchsia::modular::MessageReader is being replaced for "
-             "message queue. queue name="
-          << queue_name_;
-    }
-
-    message_receiver_.Bind(std::move(receiver));
-    message_receiver_.set_error_handler(
-        [this](zx_status_t status) {
-          if (receive_ack_pending_) {
-            FXL_DLOG(WARNING)
-                << "MessageReceiver closed, but OnReceive acknowledgement still"
-                   " pending.";
-          }
-          message_receiver_.Unbind();
-          receive_ack_pending_ = false;
-        });
-
-    MaybeSendNextMessage();
-  }
-
-  const std::string& queue_token() const { return queue_token_; }
-
-  void AddMessageSenderBinding(
-      fidl::InterfaceRequest<fuchsia::modular::MessageSender> request) {
-    message_sender_bindings_.AddBinding(this, std::move(request));
-  }
-
-  void AddMessageQueueBinding(
-      fidl::InterfaceRequest<fuchsia::modular::MessageQueue> request) {
-    message_queue_bindings_.AddBinding(
-        std::make_unique<MessageQueueConnection>(this), std::move(request));
-  }
-
-  void RegisterWatcher(const std::function<void()>& watcher) {
-    watcher_ = watcher;
-    if (watcher_ && !queue_data_.IsEmpty()) {
-      watcher_();
-    }
-  }
-
-  void DropWatcher() { watcher_ = nullptr; }
-
- private:
-  void MaybeSendNextMessage() {
-    if (!message_receiver_ || receive_ack_pending_ || queue_data_.IsEmpty()) {
-      return;
-    }
-
-    receive_ack_pending_ = true;
-
-    fsl::SizedVmo queue_data_vmo;
-    FXL_CHECK(VmoFromString(queue_data_.Peek(), &queue_data_vmo));
-    message_receiver_->OnReceive(std::move(queue_data_vmo).ToTransport(),
-                                 [this] {
-                                   receive_ack_pending_ = false;
-                                   queue_data_.Dequeue();
-                                   MaybeSendNextMessage();
-                                 });
-  }
-
-  // |fuchsia::modular::MessageSender|
-  void Send(fuchsia::mem::Buffer message) override {
-    std::string msg_str;
-    FXL_CHECK(fsl::StringFromVmo(message, &msg_str));
-    queue_data_.Enqueue(msg_str);
-    MaybeSendNextMessage();
-    if (watcher_) {
-      watcher_();
-    }
-  }
-
-  const std::string queue_name_;
-  const std::string queue_token_;
-
-  std::function<void()> watcher_;
-
-  PersistentQueue queue_data_;
-
-  bool receive_ack_pending_ = false;
-  fuchsia::modular::MessageReaderPtr message_receiver_;
-
-  // When a |fuchsia::modular::MessageQueue| connection closes, the
-  // corresponding MessageQueueConnection instance gets removed.
-  fidl::BindingSet<fuchsia::modular::MessageQueue,
-                   std::unique_ptr<MessageQueueConnection>>
-      message_queue_bindings_;
-
-  fidl::BindingSet<fuchsia::modular::MessageSender> message_sender_bindings_;
-};
-
-// MessageQueueConnection -----------------------------------------------------
-
-MessageQueueConnection::MessageQueueConnection(
-    MessageQueueStorage* const queue_storage)
-    : queue_storage_(queue_storage) {}
-
-MessageQueueConnection::~MessageQueueConnection() = default;
-
-void MessageQueueConnection::RegisterReceiver(
-    fidl::InterfaceHandle<fuchsia::modular::MessageReader> receiver) {
-  queue_storage_->RegisterReceiver(std::move(receiver));
-}
-
-void MessageQueueConnection::GetToken(GetTokenCallback callback) {
-  callback(queue_storage_->queue_token());
-}
-
-// MessageQueueManager --------------------------------------------------------
-
-namespace {
-
-std::string GenerateQueueToken() {
-  // Get 256 bits of pseudo-randomness.
-  constexpr size_t kBitCount = 256;
-  constexpr size_t kBitsPerByte = 8;
-  constexpr size_t kCharsPerByte = 2;
-  constexpr size_t kByteCount = kBitCount / kBitsPerByte;
-  constexpr char kHex[] = "0123456789ABCDEF";
-  uint8_t bytes[kByteCount] = {};
-  zx_cprng_draw(bytes, kByteCount);
-  std::string token(kByteCount * kCharsPerByte, '\0');
-  for (size_t i = 0; i < kByteCount; ++i) {
-    uint8_t byte = bytes[i];
-    token[2 * i] = kHex[byte & 0x0F];
-    token[2 * i + 1] = kHex[byte / 0x10];
-  }
-  return token;
-}
-
-}  // namespace
-
-class MessageQueueManager::GetQueueTokenCall
-    : public PageOperation<fidl::StringPtr> {
- public:
-  GetQueueTokenCall(fuchsia::ledger::Page* const page,
-                    std::string component_namespace,
-                    std::string component_instance_id,
-                    const std::string& queue_name, ResultCall result_call)
-      : PageOperation("MessageQueueManager::GetQueueTokenCall", page,
-                      std::move(result_call), queue_name),
-        component_namespace_(std::move(component_namespace)),
-        component_instance_id_(std::move(component_instance_id)),
-        queue_name_(queue_name) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &result_};
-
-    page()->GetSnapshot(snapshot_.NewRequest(),
-                        fidl::VectorPtr<uint8_t>::New(0), nullptr,
-                        Protect([this, flow](fuchsia::ledger::Status status) {
-                          if (status != fuchsia::ledger::Status::OK) {
-                            FXL_LOG(ERROR) << trace_name() << " "
-                                           << "Page.GetSnapshot() "
-                                           << fidl::ToUnderlying(status);
-                            return;
-                          }
-
-                          Cont(flow);
-                        }));
-  }
-
-  void Cont(FlowToken flow) {
-    snapshot_.set_error_handler([](zx_status_t status) {
-      FXL_LOG(WARNING) << "Error on snapshot connection";
-    });
-
-    key_ = MakeMessageQueueTokenKey(component_namespace_,
-                                    component_instance_id_, queue_name_);
-    snapshot_->Get(to_array(key_), [this, flow](fuchsia::ledger::Status status,
-                                                fuchsia::mem::BufferPtr value) {
-      if (status == fuchsia::ledger::Status::KEY_NOT_FOUND) {
-        // Key wasn't found, that's not an error.
-        return;
-      }
-
-      if (status != fuchsia::ledger::Status::OK) {
-        FXL_LOG(ERROR) << trace_name() << " " << key_ << " "
-                       << "PageSnapshot.Get() " << fidl::ToUnderlying(status);
-        return;
-      }
-
-      if (!value) {
-        FXL_LOG(ERROR) << trace_name() << " " << key_ << " "
-                       << "Value is null.";
-        return;
-      }
-
-      std::string queue_token;
-      if (!fsl::StringFromVmo(*value, &queue_token)) {
-        FXL_LOG(ERROR) << trace_name() << " " << key_ << " "
-                       << "VMO could not be copied.";
-        return;
-      }
-      result_ = queue_token;
-    });
-  }
-
-  const std::string component_namespace_;
-  const std::string component_instance_id_;
-  const std::string queue_name_;
-  fuchsia::ledger::PageSnapshotPtr snapshot_;
-  std::string key_;
-
-  fidl::StringPtr result_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(GetQueueTokenCall);
-};
-
-class MessageQueueManager::GetMessageSenderCall : public PageOperation<> {
- public:
-  GetMessageSenderCall(
-      MessageQueueManager* const message_queue_manager,
-      fuchsia::ledger::Page* const page, std::string token,
-      fidl::InterfaceRequest<fuchsia::modular::MessageSender> request)
-      : PageOperation("MessageQueueManager::GetMessageSenderCall", page, [] {}),
-        message_queue_manager_(message_queue_manager),
-        token_(std::move(token)),
-        request_(std::move(request)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    page()->GetSnapshot(snapshot_.NewRequest(), std::vector<uint8_t>(), nullptr,
-                        Protect([this, flow](fuchsia::ledger::Status status) {
-                          if (status != fuchsia::ledger::Status::OK) {
-                            FXL_LOG(ERROR) << trace_name() << " "
-                                           << "Page.GetSnapshot() "
-                                           << fidl::ToUnderlying(status);
-                            return;
-                          }
-
-                          Cont(flow);
-                        }));
-  }
-
-  void Cont(FlowToken flow) {
-    std::string key = MakeMessageQueueKey(token_);
-    snapshot_->Get(to_array(key), [this, flow](fuchsia::ledger::Status status,
-                                               fuchsia::mem::BufferPtr value) {
-      if (status != fuchsia::ledger::Status::OK) {
-        if (status != fuchsia::ledger::Status::KEY_NOT_FOUND) {
-          // It's expected that the key is not found when the link
-          // is accessed for the first time. Don't log an error
-          // then.
-          FXL_LOG(ERROR) << trace_name() << " " << token_ << " "
-                         << "PageSnapshot.Get() " << fidl::ToUnderlying(status);
-        }
-        return;
-      }
-
-      std::string value_as_string;
-      if (value) {
-        if (!fsl::StringFromVmo(*value, &value_as_string)) {
-          FXL_LOG(ERROR) << trace_name() << " " << token_ << " "
-                         << "VMO could not be copied.";
-          return;
-        }
-      }
-
-      if (!XdrRead(value_as_string, &result_, XdrMessageQueueInfo)) {
-        return;
-      }
-
-      if (!result_.is_complete()) {
-        FXL_LOG(WARNING) << trace_name() << " " << token_ << " "
-                         << "Queue token not found in the ledger.";
-        return;
-      }
-
-      message_queue_manager_->GetMessageQueueStorage(result_)
-          ->AddMessageSenderBinding(std::move(request_));
-    });
-  }
-
-  MessageQueueManager* const message_queue_manager_;  // not owned
-  const std::string token_;
-  fidl::InterfaceRequest<fuchsia::modular::MessageSender> request_;
-
-  fuchsia::ledger::PageSnapshotPtr snapshot_;
-  std::string key_;
-
-  MessageQueueInfo result_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(GetMessageSenderCall);
-};
-
-class MessageQueueManager::ObtainMessageQueueCall : public PageOperation<> {
- public:
-  ObtainMessageQueueCall(
-      MessageQueueManager* const message_queue_manager,
-      fuchsia::ledger::Page* const page, const std::string& component_namespace,
-      const std::string& component_instance_id, const std::string& queue_name,
-      fidl::InterfaceRequest<fuchsia::modular::MessageQueue> request)
-      : PageOperation("MessageQueueManager::ObtainMessageQueueCall", page,
-                      [] {}, queue_name),
-        message_queue_manager_(message_queue_manager),
-        request_(std::move(request)) {
-    message_queue_info_.component_namespace = component_namespace;
-    message_queue_info_.component_instance_id = component_instance_id;
-    message_queue_info_.queue_name = queue_name;
-  }
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    operation_collection_.Add(new GetQueueTokenCall(
-        page(), message_queue_info_.component_namespace,
-        message_queue_info_.component_instance_id,
-        message_queue_info_.queue_name, [this, flow](fidl::StringPtr token) {
-          if (token) {
-            // Queue token was found in the ledger.
-            message_queue_info_.queue_token = token.get();
-            Finish(flow);
-            return;
-          }
-
-          Cont(flow);
-        }));
-  }
-
-  void Cont(FlowToken flow) {
-    // Not found in the ledger, time to create a new message
-    // queue.
-    message_queue_info_.queue_token = GenerateQueueToken();
-
-    page()->StartTransaction(Protect([this](fuchsia::ledger::Status status) {
-      if (status != fuchsia::ledger::Status::OK) {
-        FXL_LOG(ERROR) << trace_name() << " "
-                       << "Page.StartTransaction() "
-                       << fidl::ToUnderlying(status);
-      }
-    }));
-
-    const std::string message_queue_token_key =
-        MakeMessageQueueTokenKey(message_queue_info_.component_namespace,
-                                 message_queue_info_.component_instance_id,
-                                 message_queue_info_.queue_name);
-
-    page()->Put(to_array(message_queue_token_key),
-                to_array(message_queue_info_.queue_token),
-                Protect([this, key = message_queue_token_key](
-                            fuchsia::ledger::Status status) {
-                  if (status != fuchsia::ledger::Status::OK) {
-                    FXL_LOG(ERROR)
-                        << trace_name() << " " << key << " "
-                        << "Page.Put() " << fidl::ToUnderlying(status);
-                  }
-                }));
-
-    const std::string message_queue_key =
-        MakeMessageQueueKey(message_queue_info_.queue_token);
-
-    std::string json;
-    XdrWrite(&json, &message_queue_info_, XdrMessageQueueInfo);
-
-    page()->Put(to_array(message_queue_key), to_array(json),
-                Protect([this, key = message_queue_key](
-                            fuchsia::ledger::Status status) {
-                  if (status != fuchsia::ledger::Status::OK) {
-                    FXL_LOG(ERROR)
-                        << trace_name() << " " << key << " "
-                        << "Page.Put() " << fidl::ToUnderlying(status);
-                  }
-                }));
-
-    page()->Commit(Protect([this, flow](fuchsia::ledger::Status status) {
-      if (status != fuchsia::ledger::Status::OK) {
-        FXL_LOG(ERROR) << trace_name() << " "
-                       << "Page.Commit() " << static_cast<uint32_t>(status);
-        return;
-      }
-
-      FXL_LOG(INFO) << trace_name() << " "
-                    << "Created message queue: "
-                    << message_queue_info_.queue_token;
-
-      Finish(flow);
-    }));
-  }
-
-  void Finish(FlowToken /*flow*/) {
-    message_queue_manager_->GetMessageQueueStorage(message_queue_info_)
-        ->AddMessageQueueBinding(std::move(request_));
-  }
-
-  MessageQueueManager* const message_queue_manager_;  // not owned
-  fidl::InterfaceRequest<fuchsia::modular::MessageQueue> request_;
-
-  MessageQueueInfo message_queue_info_;
-  fuchsia::ledger::PageSnapshotPtr snapshot_;
-
-  OperationCollection operation_collection_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ObtainMessageQueueCall);
-};
-
-class MessageQueueManager::DeleteMessageQueueCall : public PageOperation<> {
- public:
-  DeleteMessageQueueCall(MessageQueueManager* const message_queue_manager,
-                         fuchsia::ledger::Page* const page,
-                         const std::string& component_namespace,
-                         const std::string& component_instance_id,
-                         const std::string& queue_name)
-      : PageOperation("MessageQueueManager::DeleteMessageQueueCall", page,
-                      [] {}, queue_name),
-        message_queue_manager_(message_queue_manager) {
-    message_queue_info_.component_namespace = component_namespace;
-    message_queue_info_.component_instance_id = component_instance_id;
-    message_queue_info_.queue_name = queue_name;
-  }
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    operation_collection_.Add(new GetQueueTokenCall(
-        page(), message_queue_info_.component_namespace,
-        message_queue_info_.component_instance_id,
-        message_queue_info_.queue_name, [this, flow](fidl::StringPtr token) {
-          if (!token) {
-            FXL_LOG(WARNING)
-                << trace_name() << " " << message_queue_info_.queue_name << " "
-                << "Request to delete queue not found in ledger"
-                << " for component instance "
-                << message_queue_info_.component_instance_id << ".";
-            return;
-          }
-
-          message_queue_info_.queue_token = token.get();
-
-          std::string message_queue_key =
-              MakeMessageQueueKey(message_queue_info_.queue_token);
-
-          std::string message_queue_token_key = MakeMessageQueueTokenKey(
-              message_queue_info_.component_namespace,
-              message_queue_info_.component_instance_id,
-              message_queue_info_.queue_name);
-
-          // Delete the ledger entries.
-          page()->StartTransaction(
-              Protect([this](fuchsia::ledger::Status status) {
-                if (status != fuchsia::ledger::Status::OK) {
-                  FXL_LOG(ERROR) << trace_name() << " "
-                                 << "Page.StartTransaction() "
-                                 << fidl::ToUnderlying(status);
-                }
-              }));
-
-          page()->Delete(to_array(message_queue_key),
-                         Protect([this, key = message_queue_key](
-                                     fuchsia::ledger::Status status) {
-                           if (status != fuchsia::ledger::Status::OK) {
-                             FXL_LOG(ERROR) << trace_name() << " " << key << " "
-                                            << "Page.Delete() "
-                                            << fidl::ToUnderlying(status);
-                           }
-                         }));
-
-          page()->Delete(to_array(message_queue_token_key),
-                         Protect([this, key = message_queue_token_key](
-                                     fuchsia::ledger::Status status) {
-                           if (status != fuchsia::ledger::Status::OK) {
-                             FXL_LOG(ERROR) << trace_name() << " " << key << " "
-                                            << "Page.Delete() "
-                                            << fidl::ToUnderlying(status);
-                           }
-                         }));
-
-          message_queue_manager_->ClearMessageQueueStorage(message_queue_info_);
-
-          page()->Commit(Protect([this, flow](fuchsia::ledger::Status status) {
-            if (status != fuchsia::ledger::Status::OK) {
-              FXL_LOG(ERROR) << trace_name() << " "
-                             << "Page.Commit() " << fidl::ToUnderlying(status);
-              return;
-            }
-
-            FXL_LOG(INFO) << trace_name() << " "
-                          << "Deleted message queue: "
-                          << message_queue_info_.component_instance_id << "/"
-                          << message_queue_info_.queue_name;
-          }));
-        }));
-  }
-
-  MessageQueueManager* const message_queue_manager_;  // not owned
-  MessageQueueInfo message_queue_info_;
-  fuchsia::ledger::PageSnapshotPtr snapshot_;
-
-  OperationCollection operation_collection_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DeleteMessageQueueCall);
-};
-
-class MessageQueueManager::DeleteNamespaceCall : public PageOperation<> {
- public:
-  DeleteNamespaceCall(MessageQueueManager* const message_queue_manager,
-                      fuchsia::ledger::Page* const page,
-                      const std::string& component_namespace,
-                      std::function<void()> done)
-      : PageOperation("MessageQueueManager::DeleteNamespaceCall", page,
-                      std::move(done), component_namespace),
-        message_queue_manager_(message_queue_manager),
-        component_namespace_(component_namespace),
-        message_queues_key_prefix_(
-            MakeMessageQueuesPrefix(component_namespace)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-    page()->GetSnapshot(snapshot_.NewRequest(),
-                        to_array(message_queues_key_prefix_), nullptr,
-                        Protect([this, flow](fuchsia::ledger::Status status) {
-                          if (status != fuchsia::ledger::Status::OK) {
-                            FXL_LOG(ERROR) << trace_name() << " "
-                                           << "Page.GetSnapshot() "
-                                           << fidl::ToUnderlying(status);
-                            return;
-                          }
-                          GetKeysToDelete(flow);
-                        }));
-  }
-
-  void GetKeysToDelete(FlowToken flow) {
-    GetEntries(snapshot_.get(), &component_entries_,
-               [this, flow](fuchsia::ledger::Status status) {
-                 if (status != fuchsia::ledger::Status::OK) {
-                   FXL_LOG(ERROR)
-                       << trace_name() << " "
-                       << "GetEntries() " << fidl::ToUnderlying(status);
-                   return;
-                 }
-
-                 ProcessKeysToDelete(flow);
-               });
-  }
-
-  void ProcessKeysToDelete(FlowToken flow) {
-    std::vector<std::string> keys_to_delete;
-    for (const auto& entry : component_entries_) {
-      FXL_DCHECK(entry.value) << "Value vmo handle is null";
-
-      keys_to_delete.push_back(to_string(entry.key));
-
-      std::string queue_token;
-      if (!fsl::StringFromVmo(*entry.value, &queue_token)) {
-        FXL_LOG(ERROR) << trace_name() << " " << to_string(entry.key)
-                       << "VMO could not be copied.";
-        continue;
-      }
-
-      keys_to_delete.push_back(MakeMessageQueueKey(queue_token));
-    }
-
-    for (auto& i : keys_to_delete) {
-      page()->Delete(
-          to_array(i), Protect([this, i, flow](fuchsia::ledger::Status status) {
-            if (status != fuchsia::ledger::Status::OK) {
-              FXL_LOG(ERROR) << trace_name() << " " << i << "Page.Delete() "
-                             << fidl::ToUnderlying(status);
-            }
-          }));
-    }
-
-    message_queue_manager_->ClearMessageQueueStorage(component_namespace_);
-  }
-
-  MessageQueueManager* const message_queue_manager_;  // not owned
-  fuchsia::ledger::PageSnapshotPtr snapshot_;
-  const std::string component_namespace_;
-  const std::string message_queues_key_prefix_;
-  std::vector<fuchsia::ledger::Entry> component_entries_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DeleteNamespaceCall);
-};
-
-MessageQueueManager::MessageQueueManager(LedgerClient* const ledger_client,
-                                         fuchsia::ledger::PageId page_id,
-                                         std::string local_path)
-    : PageClient("MessageQueueManager", ledger_client, std::move(page_id)),
-      local_path_(std::move(local_path)) {}
-
-MessageQueueManager::~MessageQueueManager() = default;
-
-void MessageQueueManager::ObtainMessageQueue(
-    const std::string& component_namespace,
-    const std::string& component_instance_id, const std::string& queue_name,
-    fidl::InterfaceRequest<fuchsia::modular::MessageQueue> request) {
-  operation_collection_.Add(new ObtainMessageQueueCall(
-      this, page(), component_namespace, component_instance_id, queue_name,
-      std::move(request)));
-}
-
-template <typename ValueType>
-const ValueType* MessageQueueManager::FindQueueName(
-    const ComponentQueueNameMap<ValueType>& queue_map,
-    const MessageQueueInfo& info) {
-  auto it1 = queue_map.find(info.component_namespace);
-  if (it1 != queue_map.end()) {
-    auto it2 = it1->second.find(info.component_instance_id);
-    if (it2 != it1->second.end()) {
-      auto it3 = it2->second.find(info.queue_name);
-      if (it3 != it2->second.end()) {
-        return &(it3->second);
-      }
-    }
-  }
-
-  return nullptr;
-}
-
-template <typename ValueType>
-void MessageQueueManager::EraseQueueName(
-    ComponentQueueNameMap<ValueType>& queue_map, const MessageQueueInfo& info) {
-  auto it1 = queue_map.find(info.component_namespace);
-  if (it1 != queue_map.end()) {
-    auto it2 = it1->second.find(info.component_instance_id);
-    if (it2 != it1->second.end()) {
-      it2->second.erase(info.queue_name);
-    }
-  }
-}
-
-template <typename ValueType>
-void MessageQueueManager::EraseNamespace(
-    ComponentQueueNameMap<ValueType>& queue_map,
-    const std::string& component_namespace) {
-  auto it1 = queue_map.find(component_namespace);
-  if (it1 != queue_map.end()) {
-    it1->second.erase(component_namespace);
-  }
-}
-
-MessageQueueStorage* MessageQueueManager::GetMessageQueueStorage(
-    const MessageQueueInfo& info) {
-  auto it = message_queues_.find(info.queue_token);
-  if (it == message_queues_.end()) {
-    // Not found, create one.
-    bool inserted;
-    std::string path = local_path_;
-    path.push_back('/');
-    path.append(info.queue_token);
-    path.append(".json");
-    auto new_queue = std::make_unique<MessageQueueStorage>(
-        info.queue_name, info.queue_token, std::move(path));
-    std::tie(it, inserted) = message_queues_.insert(
-        std::make_pair(info.queue_token, std::move(new_queue)));
-    FXL_DCHECK(inserted);
-
-    message_queue_infos_[info.queue_token] = info;
-
-    message_queue_tokens_[info.component_namespace][info.component_instance_id]
-                         [info.queue_name] = info.queue_token;
-
-    const std::function<void()>* const watcher =
-        FindQueueName(pending_watcher_callbacks_, info);
-    if (watcher) {
-      it->second->RegisterWatcher(*watcher);
-      EraseQueueName(pending_watcher_callbacks_, info);
-    }
-  }
-  return it->second.get();
-}
-
-void MessageQueueManager::ClearMessageQueueStorage(
-    const MessageQueueInfo& info) {
-  // Remove the |MessageQueueStorage| and delete it which in turn will
-  // close all outstanding fuchsia::modular::MessageSender and
-  // fuchsia::modular::MessageQueue interface connections, and delete all
-  // messages on the queue permanently.
-  message_queues_.erase(info.queue_token);
-
-  // Clear entries in message_queue_tokens_ and
-  // pending_watcher_callbacks_.
-  EraseQueueName(pending_watcher_callbacks_, info);
-  EraseQueueName(message_queue_tokens_, info);
-
-  auto deletion_watchers = FindQueueName(deletion_watchers_, info);
-  for (const auto& component_namespace_iter : *deletion_watchers) {
-    for (const auto& component_instance_iter :
-         component_namespace_iter.second) {
-      component_instance_iter.second();
-    }
-  }
-
-  EraseQueueName(deletion_watchers_, info);
-}
-
-void MessageQueueManager::ClearMessageQueueStorage(
-    const std::string& component_namespace) {
-  auto namespace_to_delete = deletion_watchers_[component_namespace];
-  for (const auto& instances_in_namespace : namespace_to_delete) {
-    for (const auto& queue_names : instances_in_namespace.second) {
-      for (const auto& watcher_namespace : queue_names.second) {
-        for (const auto& watcher_instance : watcher_namespace.second) {
-          watcher_instance.second();
-        }
-      }
-    }
-  }
-
-  EraseNamespace(pending_watcher_callbacks_, component_namespace);
-  EraseNamespace(message_queue_tokens_, component_namespace);
-  EraseNamespace(deletion_watchers_, component_namespace);
-}
-
-void MessageQueueManager::DeleteMessageQueue(
-    const std::string& component_namespace,
-    const std::string& component_instance_id, const std::string& queue_name) {
-  operation_collection_.Add(new DeleteMessageQueueCall(
-      this, page(), component_namespace, component_instance_id, queue_name));
-}
-
-void MessageQueueManager::DeleteNamespace(
-    const std::string& component_namespace, std::function<void()> done) {
-  operation_collection_.Add(new DeleteNamespaceCall(
-      this, page(), component_namespace, std::move(done)));
-}
-
-void MessageQueueManager::GetMessageSender(
-    const std::string& queue_token,
-    fidl::InterfaceRequest<fuchsia::modular::MessageSender> request) {
-  const auto& it = message_queues_.find(queue_token);
-  if (it != message_queues_.cend()) {
-    // Found the message queue already.
-    it->second->AddMessageSenderBinding(std::move(request));
-    return;
-  }
-
-  operation_collection_.Add(
-      new GetMessageSenderCall(this, page(), queue_token, std::move(request)));
-}
-
-void MessageQueueManager::RegisterMessageWatcher(
-    const std::string& component_namespace,
-    const std::string& component_instance_id, const std::string& queue_name,
-    const std::function<void()>& watcher) {
-  const std::string* const token =
-      FindQueueName(message_queue_tokens_,
-                    MessageQueueInfo{component_namespace, component_instance_id,
-                                     queue_name, ""});
-  if (!token) {
-    pending_watcher_callbacks_[component_namespace][component_instance_id]
-                              [queue_name] = watcher;
-    return;
-  }
-
-  auto msq_it = message_queues_.find(*token);
-  FXL_DCHECK(msq_it != message_queues_.end());
-  msq_it->second->RegisterWatcher(watcher);
-}
-
-void MessageQueueManager::RegisterDeletionWatcher(
-    const std::string& component_namespace,
-    const std::string& component_instance_id, const std::string& queue_token,
-    const std::function<void()>& watcher) {
-  auto it = message_queue_infos_.find(queue_token);
-  if (it == message_queue_infos_.end()) {
-    return;
-  }
-
-  const MessageQueueInfo queue_info = it->second;
-
-  deletion_watchers_[queue_info.component_namespace]
-                    [queue_info.component_instance_id][queue_info.queue_name]
-                    [component_namespace][component_instance_id] = watcher;
-}
-
-void MessageQueueManager::DropMessageWatcher(
-    const std::string& component_namespace,
-    const std::string& component_instance_id, const std::string& queue_name) {
-  MessageQueueInfo queue_info{component_namespace, component_instance_id,
-                              queue_name, ""};
-  const std::string* const token =
-      FindQueueName(message_queue_tokens_, queue_info);
-  if (token) {
-    // The |MessageQueueStorage| doesn't exist yet.
-    EraseQueueName(message_queue_tokens_, queue_info);
-    return;
-  }
-
-  auto msq_it = message_queues_.find(*token);
-  if (msq_it == message_queues_.end()) {
-    FXL_LOG(WARNING) << "Asked to DropWatcher for a queue that doesn't exist";
-    return;
-  }
-  msq_it->second->DropWatcher();
-}
-
-void MessageQueueManager::DropDeletionWatcher(
-    const std::string& watcher_namespace,
-    const std::string& watcher_instance_id, const std::string& queue_token) {
-  auto it = message_queue_infos_.find(queue_token);
-  if (it == message_queue_infos_.end()) {
-    return;
-  }
-
-  const MessageQueueInfo queue_info = it->second;
-  deletion_watchers_[queue_info.component_namespace]
-                    [queue_info.component_instance_id][queue_info.queue_name]
-                    [watcher_namespace]
-                        .erase(watcher_instance_id);
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/message_queue/message_queue_manager.h b/bin/sessionmgr/message_queue/message_queue_manager.h
deleted file mode 100644
index cff7dd1..0000000
--- a/bin/sessionmgr/message_queue/message_queue_manager.h
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_MESSAGE_QUEUE_MESSAGE_QUEUE_MANAGER_H_
-#define PERIDOT_BIN_SESSIONMGR_MESSAGE_QUEUE_MESSAGE_QUEUE_MANAGER_H_
-
-#include <functional>
-#include <map>
-#include <memory>
-#include <queue>
-#include <string>
-#include <utility>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_client.h"
-#include "peridot/lib/ledger_client/types.h"
-
-namespace modular {
-
-class MessageQueueStorage;
-struct MessageQueueInfo;
-
-// Manages message queues for components. One MessageQueueManager
-// instance is used by all ComponentContextImpl instances, and manages
-// the message queues for all component instances. The
-// fuchsia::modular::ComponentContext instance is responsible for deleting the
-// message queues it has created, otherwise they are persisted.
-class MessageQueueManager : PageClient {
- public:
-  MessageQueueManager(LedgerClient* ledger_client,
-                      fuchsia::ledger::PageId page_id, std::string local_path);
-  ~MessageQueueManager() override;
-
-  // An enum describing the types of events that can be watched via
-  // |RegisterWatcher|.
-  enum WatcherEventType {
-    // Triggers when there is a new message on the watched messsage queue.
-    NEW_MESSAGE,
-    // Triggers when the watched message queue is deleted.
-    QUEUE_DELETED,
-  };
-
-  void ObtainMessageQueue(
-      const std::string& component_namespace,
-      const std::string& component_instance_id, const std::string& queue_name,
-      fidl::InterfaceRequest<fuchsia::modular::MessageQueue> request);
-
-  void DeleteMessageQueue(const std::string& component_namespace,
-                          const std::string& component_instance_id,
-                          const std::string& queue_name);
-
-  void DeleteNamespace(const std::string& component_namespace,
-                       std::function<void()> done);
-
-  void GetMessageSender(
-      const std::string& queue_token,
-      fidl::InterfaceRequest<fuchsia::modular::MessageSender> request);
-
-  // Registers a watcher that will be called when there is a new message on a
-  // queue corresponding to |component_namespace| x |component_instance_id| x
-  // |queue_name|.
-  //
-  // |component_namespace| is the namespace of the watching component (i.e. the
-  //   creator of the queue).
-  // |component_instance_id| is the namespace of the watching component (i.e.
-  //   the creator of the queue).
-  // |queue_name| is the name of the message queue.
-  //
-  // Only one message watcher can be active for a given queue, and registering a
-  // new one will remove any existing watcher.
-  void RegisterMessageWatcher(const std::string& component_namespace,
-                              const std::string& component_instance_id,
-                              const std::string& queue_name,
-                              const std::function<void()>& watcher);
-
-  // Registers a watcher that gets notified when a message queue with
-  // |queue_token| is deleted.
-  //
-  // Only one deletion watcher can be active for a given queue, and registering
-  // a new one will remove any existing watcher.
-  //
-  // |watcher_namespace| is the namespace of the component that is watching the
-  //   message queue deletion.
-  // |watcher_instance_id| is the instance id of the component that is watching
-  //   the message queue deletion.
-  // |queue_token| is the message queue token for the queue to be observed.
-  // |watcher| is the callback that will be triggered.
-  //
-  // Note that this is different from |RegisterMessageWatcher|, where the passed
-  // in namespace, instance ids, and queue name directly describe the queue.
-  void RegisterDeletionWatcher(const std::string& component_namespace,
-                               const std::string& component_instance_id,
-                               const std::string& queue_token,
-                               const std::function<void()>& watcher);
-
-  // Drops the watcher for |component_namespace| x |component_instance_id| x
-  // |queue_name|.
-  void DropMessageWatcher(const std::string& component_namespace,
-                          const std::string& component_instance_id,
-                          const std::string& queue_name);
-
-  // Drops the watcher described by |queue_info| from watching for the
-  // deletion of the queue with |queue_token|.
-  void DropDeletionWatcher(const std::string& watcher_namespace,
-                           const std::string& watcher_instance_id,
-                           const std::string& queue_token);
-
- private:
-  using ComponentNamespace = std::string;
-  using ComponentInstanceId = std::string;
-  using ComponentQueueName = std::string;
-  template <typename Value>
-  using ComponentQueueNameMap = std::map<
-      ComponentNamespace,
-      std::map<ComponentInstanceId, std::map<ComponentQueueName, Value>>>;
-
-  using DeletionWatchers =
-      std::map<std::string, std::map<std::string, std::function<void()>>>;
-
-  // Returns the |MessageQueueStorage| for the queue_token. Creates it
-  // if it doesn't exist yet.
-  MessageQueueStorage* GetMessageQueueStorage(const MessageQueueInfo& info);
-
-  // Clears the |MessageQueueStorage| for the queue_token.
-  void ClearMessageQueueStorage(const MessageQueueInfo& info);
-
-  // Clears the |MessageQueueStorage| for all the queues in the provided
-  // component namespace.
-  void ClearMessageQueueStorage(const std::string& component_namespace);
-
-  // |FindQueueName()| and |EraseQueueName()| are helpers used to operate on
-  // component (namespace, id, queue name) mappings.
-  // If the given message queue |info| is found the stored pointer value, or
-  // nullptr otherwise.
-  template <typename ValueType>
-  const ValueType* FindQueueName(
-      const ComponentQueueNameMap<ValueType>& queue_map,
-      const MessageQueueInfo& info);
-
-  // Erases the |ValueType| stored under the provided |info|.
-  // Implementation is in the .cc.
-  template <typename ValueType>
-  void EraseQueueName(ComponentQueueNameMap<ValueType>& queue_map,
-                      const MessageQueueInfo& info);
-  // Erases all |ValueType|s under the provided namespace.
-  // Implementation is in the .cc.
-  template <typename ValueType>
-  void EraseNamespace(ComponentQueueNameMap<ValueType>& queue_map,
-                      const std::string& component_namespace);
-
-  const std::string local_path_;
-
-  // A map of queue_token to |MessageQueueStorage|.
-  std::map<std::string, std::unique_ptr<MessageQueueStorage>> message_queues_;
-
-  // A map of queue_token to |MessageQueueInfo|. This allows for easy lookup of
-  // message queue information for registering watchers that take message queue
-  // tokens as parameters.
-  std::map<std::string, MessageQueueInfo> message_queue_infos_;
-
-  // A map of component instance id and queue name to queue tokens.
-  // Entries are only here while a |MessageQueueStorage| exists.
-  ComponentQueueNameMap<std::string> message_queue_tokens_;
-
-  // A map of component instance id and queue name to watcher
-  // callbacks. If a watcher is registered before a
-  // |MessageQueueStorage| exists then it is stashed here until a
-  // |MessageQueueStorage| is available.
-  ComponentQueueNameMap<std::function<void()>> pending_watcher_callbacks_;
-
-  // A map containing watchers that are to be notified when the described
-  // message queue is deleted.
-  ComponentQueueNameMap<DeletionWatchers> deletion_watchers_;
-
-  OperationCollection operation_collection_;
-
-  // Operations implemented here.
-  class GetQueueTokenCall;
-  class GetMessageSenderCall;
-  class ObtainMessageQueueCall;
-  class DeleteMessageQueueCall;
-  class DeleteNamespaceCall;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(MessageQueueManager);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_MESSAGE_QUEUE_MESSAGE_QUEUE_MANAGER_H_
diff --git a/bin/sessionmgr/message_queue/persistent_queue.cc b/bin/sessionmgr/message_queue/persistent_queue.cc
deleted file mode 100644
index e82de2f..0000000
--- a/bin/sessionmgr/message_queue/persistent_queue.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/message_queue/persistent_queue.h"
-
-#include <utility>
-
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/lib/rapidjson/rapidjson.h"
-
-namespace modular {
-
-PersistentQueue::PersistentQueue(std::string file_name)
-    : file_name_(std::move(file_name)) {
-  std::string contents;
-  if (files::ReadFileToString(file_name_, &contents)) {
-    rapidjson::Document document;
-    document.Parse(contents);
-    if (!document.IsArray()) {
-      FXL_LOG(ERROR) << "Expected " << file_name_ << " to contain a JSON array";
-      return;
-    }
-    for (rapidjson::Value::ConstValueIterator it = document.Begin();
-         it != document.End(); ++it) {
-      if (!it->IsString()) {
-        FXL_LOG(ERROR) << "Expected a string but got: " << it;
-        continue;
-      }
-      queue_.emplace_back(it->GetString(), it->GetStringLength());
-    }
-  }
-}
-
-void PersistentQueue::Save() {
-  rapidjson::Document document;
-  document.SetArray();
-  for (const auto& it : queue_) {
-    rapidjson::Value value;
-    value.SetString(it.data(), it.size());
-    document.PushBack(value, document.GetAllocator());
-  }
-  std::string contents = JsonValueToString(document);
-  if (!files::WriteFile(file_name_, contents.data(), contents.size())) {
-    FXL_LOG(ERROR) << "Failed to write to: " << file_name_;
-  }
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/message_queue/persistent_queue.h b/bin/sessionmgr/message_queue/persistent_queue.h
deleted file mode 100644
index 554178c..0000000
--- a/bin/sessionmgr/message_queue/persistent_queue.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_MESSAGE_QUEUE_PERSISTENT_QUEUE_H_
-#define PERIDOT_BIN_SESSIONMGR_MESSAGE_QUEUE_PERSISTENT_QUEUE_H_
-
-#include <deque>
-#include <string>
-
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-/* Implements a FIFO queue of strings that is persisted to local storage as
- * JSON. It is not safe to use from multiple processes or threads. If writing
- * the queue JSON to disk fails an error will be logged but calls will not fail.
- */
-class PersistentQueue {
- public:
-  explicit PersistentQueue(std::string file_name);
-  bool IsEmpty() const { return queue_.empty(); }
-
-  std::string Peek() const {
-    FXL_DCHECK(!queue_.empty());
-    return queue_.front();
-  }
-
-  std::string Dequeue() {
-    std::string value = queue_.front();
-    queue_.pop_front();
-    Save();
-    return value;
-  }
-
-  void Enqueue(const std::string& value) {
-    queue_.push_back(value);
-    Save();
-  }
-
- private:
-  std::string file_name_;
-  std::deque<std::string> queue_;
-
-  void Save();
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_MESSAGE_QUEUE_PERSISTENT_QUEUE_H_
diff --git a/bin/sessionmgr/meta/dev_session_shell.cmx b/bin/sessionmgr/meta/dev_session_shell.cmx
deleted file mode 100644
index a95f213..0000000
--- a/bin/sessionmgr/meta/dev_session_shell.cmx
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/bin/sessionmgr/meta/sessionmgr.cmx b/bin/sessionmgr/meta/sessionmgr.cmx
deleted file mode 100644
index 96b4b19..0000000
--- a/bin/sessionmgr/meta/sessionmgr.cmx
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/bin/sessionmgr/presentation_provider.cc b/bin/sessionmgr/presentation_provider.cc
deleted file mode 100644
index 0778be9..0000000
--- a/bin/sessionmgr/presentation_provider.cc
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/presentation_provider.h"
-
-namespace modular {
-
-PresentationProvider::PresentationProvider() = default;
-PresentationProvider::~PresentationProvider() = default;
-
-}  // namespace modular
diff --git a/bin/sessionmgr/presentation_provider.h b/bin/sessionmgr/presentation_provider.h
deleted file mode 100644
index a8cc8bd..0000000
--- a/bin/sessionmgr/presentation_provider.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PRESENTATION_PROVIDER_H_
-#define PERIDOT_BIN_SESSIONMGR_PRESENTATION_PROVIDER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/policy/cpp/fidl.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-// Interface that allows a class that implements this functionality to pass a
-// purposeful reference to itself to another class that needs the functionality.
-class PresentationProvider {
- public:
-  PresentationProvider();
-  virtual ~PresentationProvider();
-
-  virtual void GetPresentation(
-      fidl::StringPtr story_id,
-      fidl::InterfaceRequest<fuchsia::ui::policy::Presentation> request) = 0;
-
-  virtual void WatchVisualState(
-      fidl::StringPtr story_id,
-      fidl::InterfaceHandle<fuchsia::modular::StoryVisualStateWatcher>
-          watcher) = 0;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PRESENTATION_PROVIDER_H_
diff --git a/bin/sessionmgr/puppet_master/BUILD.gn b/bin/sessionmgr/puppet_master/BUILD.gn
deleted file mode 100644
index 51d3cbd..0000000
--- a/bin/sessionmgr/puppet_master/BUILD.gn
+++ /dev/null
@@ -1,131 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/tests_package.gni")
-
-hermetic_tests_package("puppet_master_unittests") {
-  deps = [
-    ":dispatch_story_command_executor_unittest",
-    ":puppet_master_impl_unittest",
-    ":story_command_executor_unittest",
-    "command_runners:add_mod_command_runner_unittest",
-    "command_runners:focus_mod_command_runner_unittest",
-    "command_runners:remove_mod_command_runner_unittest",
-    "command_runners:set_focus_state_command_runner_unittest",
-    "command_runners:set_kind_of_proto_story_option_command_runner_unittest",
-    "command_runners:set_link_value_command_runner_unittest",
-  ]
-}
-
-source_set("puppet_master_impl") {
-  sources = [
-    "puppet_master_impl.cc",
-    "puppet_master_impl.h",
-    "story_puppet_master_impl.cc",
-    "story_puppet_master_impl.h",
-  ]
-
-  deps = [
-    ":story_command_executor",
-    "//garnet/public/lib/fxl",
-  ]
-
-  public_deps = [
-    "//peridot/bin/sessionmgr/storage",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-executable("puppet_master_impl_unittest") {
-  testonly = true
-
-  sources = [
-    "puppet_master_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":puppet_master_impl",
-    ":story_command_executor",
-    "//peridot/lib/testing:test_story_command_executor",
-    "//peridot/lib/testing:test_with_session_storage",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("story_command_executor") {
-  sources = [
-    "story_command_executor.cc",
-    "story_command_executor.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-executable("story_command_executor_unittest") {
-  testonly = true
-
-  sources = [
-    "story_command_executor_unittest.cc",
-  ]
-
-  deps = [
-    ":story_command_executor",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("dispatch_story_command_executor") {
-  sources = [
-    "dispatch_story_command_executor.cc",
-    "dispatch_story_command_executor.h",
-  ]
-
-  public_deps = [
-    ":story_command_executor",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners:command_runner",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:future",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-executable("dispatch_story_command_executor_unittest") {
-  testonly = true
-
-  sources = [
-    "dispatch_story_command_executor_unittest.cc",
-  ]
-
-  deps = [
-    ":dispatch_story_command_executor",
-    "//peridot/lib/testing:test_with_ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("make_production_impl") {
-  sources = [
-    "make_production_impl.cc",
-    "make_production_impl.h",
-  ]
-
-  deps = [
-    ":dispatch_story_command_executor",
-    ":puppet_master_impl",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners:add_mod_command_runner",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners:focus_mod_command_runner",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners:remove_mod_command_runner",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners:set_focus_state_command_runner",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners:set_kind_of_proto_story_option_command_runner",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners:set_link_value_command_runner",
-    "//peridot/lib/module_manifest:module_facet_reader",
-  ]
-}
diff --git a/bin/sessionmgr/puppet_master/command_runners/BUILD.gn b/bin/sessionmgr/puppet_master/command_runners/BUILD.gn
deleted file mode 100644
index 98d33b4..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/BUILD.gn
+++ /dev/null
@@ -1,209 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("command_runner") {
-  sources = [
-    "command_runner.cc",
-    "command_runner.h",
-  ]
-
-  public_deps = [
-    "//peridot/bin/sessionmgr/storage",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("set_link_value_command_runner") {
-  sources = [
-    "set_link_value_command_runner.cc",
-    "set_link_value_command_runner.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls:set_link_value_call",
-  ]
-
-  public_deps = [
-    ":command_runner",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-executable("set_link_value_command_runner_unittest") {
-  testonly = true
-
-  sources = [
-    "set_link_value_command_runner_unittest.cc",
-  ]
-
-  deps = [
-    ":set_link_value_command_runner",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/gtest",
-    "//peridot/lib/testing:test_with_session_storage",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("add_mod_command_runner") {
-  sources = [
-    "add_mod_command_runner.cc",
-    "add_mod_command_runner.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls:add_mod_call",
-    "//peridot/lib/module_manifest:module_facet_reader",
-  ]
-
-  public_deps = [
-    ":command_runner",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-executable("add_mod_command_runner_unittest") {
-  testonly = true
-
-  sources = [
-    "add_mod_command_runner_unittest.cc",
-  ]
-
-  deps = [
-    ":add_mod_command_runner",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//peridot/lib/testing:entity_resolver_fake",
-    "//peridot/lib/testing:module_facet_reader_fake",
-    "//peridot/lib/testing:module_resolver_fake",
-    "//peridot/lib/testing:test_with_session_storage",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("remove_mod_command_runner") {
-  sources = [
-    "remove_mod_command_runner.cc",
-    "remove_mod_command_runner.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-  ]
-
-  public_deps = [
-    ":command_runner",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-executable("remove_mod_command_runner_unittest") {
-  testonly = true
-
-  sources = [
-    "remove_mod_command_runner_unittest.cc",
-  ]
-
-  deps = [
-    ":remove_mod_command_runner",
-    "//garnet/public/lib/gtest",
-    "//peridot/lib/testing:test_with_session_storage",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("set_focus_state_command_runner") {
-  sources = [
-    "set_focus_state_command_runner.cc",
-    "set_focus_state_command_runner.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-  ]
-
-  public_deps = [
-    ":command_runner",
-  ]
-}
-
-executable("set_focus_state_command_runner_unittest") {
-  testonly = true
-
-  sources = [
-    "set_focus_state_command_runner_unittest.cc",
-  ]
-
-  deps = [
-    ":set_focus_state_command_runner",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("focus_mod_command_runner") {
-  sources = [
-    "focus_mod_command_runner.cc",
-    "focus_mod_command_runner.h",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  deps = [
-    ":command_runner",
-  ]
-}
-
-executable("focus_mod_command_runner_unittest") {
-  testonly = true
-
-  sources = [
-    "focus_mod_command_runner_unittest.cc",
-  ]
-
-  deps = [
-    ":focus_mod_command_runner",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("set_kind_of_proto_story_option_command_runner") {
-  sources = [
-    "set_kind_of_proto_story_option_command_runner.cc",
-    "set_kind_of_proto_story_option_command_runner.h",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  deps = [
-    ":command_runner",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-executable("set_kind_of_proto_story_option_command_runner_unittest") {
-  testonly = true
-
-  sources = [
-    "set_kind_of_proto_story_option_command_runner_unittest.cc",
-  ]
-
-  deps = [
-    ":set_kind_of_proto_story_option_command_runner",
-    "//garnet/public/lib/gtest",
-    "//peridot/lib/testing:test_with_session_storage",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner.cc b/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner.cc
deleted file mode 100644
index de39cd5..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner.h"
-
-#include <lib/fxl/logging.h>
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.h"
-
-namespace modular {
-
-AddModCommandRunner::AddModCommandRunner(
-    fuchsia::modular::ModuleResolver* const module_resolver,
-    fuchsia::modular::EntityResolver* const entity_resolver)
-    : module_resolver_(module_resolver), entity_resolver_(entity_resolver) {
-  FXL_DCHECK(module_resolver_);
-  FXL_DCHECK(entity_resolver_);
-}
-
-AddModCommandRunner::~AddModCommandRunner() = default;
-
-void AddModCommandRunner::Execute(
-    fidl::StringPtr story_id, StoryStorage* const story_storage,
-    fuchsia::modular::StoryCommand command,
-    std::function<void(fuchsia::modular::ExecuteResult)> done) {
-  FXL_CHECK(command.is_add_mod());
-
-  auto& add_mod = command.add_mod();
-  if (add_mod.mod_name.size() == 0) {
-    fuchsia::modular::ExecuteResult result;
-    result.status = fuchsia::modular::ExecuteStatus::INVALID_COMMAND;
-    result.error_message = "A Module name must be specified";
-    done(result);
-    return;
-  }
-
-  AddModParams params;
-  params.parent_mod_path = std::move(add_mod.surface_parent_mod_name);
-  if (add_mod.mod_name.size() == 1) {
-    params.mod_name = add_mod.mod_name[0];
-  } else {
-    params.mod_name = add_mod.mod_name.back();
-
-    add_mod.mod_name.pop_back();
-    params.parent_mod_path = add_mod.mod_name;
-  }
-  params.is_embedded = false;
-  params.intent = std::move(add_mod.intent);
-  params.surface_relation = std::make_unique<fuchsia::modular::SurfaceRelation>(
-      std::move(add_mod.surface_relation));
-  params.module_source = fuchsia::modular::ModuleSource::EXTERNAL;
-
-  AddAddModOperation(
-      &operation_queue_, story_storage, module_resolver_, entity_resolver_,
-      std::move(params),
-      [done = std::move(done)](fuchsia::modular::ExecuteResult result,
-                               fuchsia::modular::ModuleData module_data) {
-        done(std::move(result));
-      });
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner.h b/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner.h
deleted file mode 100644
index f55e7b1..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_ADD_MOD_COMMAND_RUNNER_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_ADD_MOD_COMMAND_RUNNER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/command_runner.h"
-
-namespace modular {
-
-class AddModCommandRunner : public CommandRunner {
- public:
-  // The following dependencies are needed for adding a module to the story:
-  // * ModuleResolver: used to resolve an intent into a module.
-  // * EntityResolver: used to resolve an intent parameter's type, which is
-  //   supplied to the module resolver for use in resolution.
-  AddModCommandRunner(fuchsia::modular::ModuleResolver* const module_resolver,
-                      fuchsia::modular::EntityResolver* const entity_resolver);
-  ~AddModCommandRunner() override;
-
-  void Execute(
-      fidl::StringPtr story_id, StoryStorage* story_storage,
-      fuchsia::modular::StoryCommand command,
-      std::function<void(fuchsia::modular::ExecuteResult)> done) override;
-
- private:
-  OperationQueue operation_queue_;
-  fuchsia::modular::ModuleResolver* const module_resolver_;  // Not owned.
-  fuchsia::modular::EntityResolver* const entity_resolver_;  // Not owned.
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_ADD_MOD_COMMAND_RUNNER_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner_unittest.cc b/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner_unittest.cc
deleted file mode 100644
index 7337588..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner_unittest.cc
+++ /dev/null
@@ -1,659 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner.h"
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fsl/types/type_converters.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/type_converter.h>
-
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/ledger_client/page_id.h"
-#include "peridot/lib/testing/entity_resolver_fake.h"
-#include "peridot/lib/testing/module_resolver_fake.h"
-#include "peridot/lib/testing/test_with_session_storage.h"
-
-namespace modular {
-namespace {
-
-fuchsia::modular::IntentFilter MakeIntentFilter(
-    std::string action,
-    std::vector<fuchsia::modular::ParameterConstraint> param_constraints) {
-  fuchsia::modular::IntentFilter f;
-  f.action = action;
-  f.parameter_constraints = param_constraints;
-  return f;
-}
-
-class AddModCommandRunnerTest : public testing::TestWithSessionStorage {
- public:
-  void SetUp() override {
-    testing::TestWithSessionStorage::SetUp();
-    session_storage_ = MakeSessionStorage("page");
-    story_id_ = CreateStory(session_storage_.get());
-    story_storage_ = GetStoryStorage(session_storage_.get(), story_id_);
-    fake_module_resolver_->Connect(module_resolver_.NewRequest());
-    fake_entity_resolver_->Connect(entity_resolver_.NewRequest());
-    runner_ = MakeRunner(module_resolver_.get(), entity_resolver_.get());
-  }
-
- protected:
-  // This method compares intents field by field, where fuchsia::mem::Buffers
-  // are compared via their contents.
-  bool AreIntentsEqual(const fuchsia::modular::Intent& old_intent,
-                       const fuchsia::modular::Intent& new_intent) {
-    if (old_intent.handler != new_intent.handler) {
-      return false;
-    }
-
-    if (old_intent.action != new_intent.action) {
-      return false;
-    }
-
-    std::map<fidl::StringPtr, const fuchsia::modular::IntentParameterData*>
-        old_params;
-    if (old_intent.parameters) {
-      for (const auto& entry : *old_intent.parameters) {
-        old_params[entry.name] = &entry.data;
-      }
-    }
-
-    std::map<fidl::StringPtr, const fuchsia::modular::IntentParameterData*>
-        new_params;
-    if (new_intent.parameters) {
-      for (const auto& entry : *new_intent.parameters) {
-        new_params[entry.name] = &entry.data;
-      }
-    }
-
-    if (new_params.size() != old_params.size()) {
-      return false;
-    }
-
-    for (const auto& entry : new_params) {
-      const auto& name = entry.first;
-      if (old_params.count(name) == 0) {
-        return false;
-      }
-
-      const auto& new_param = *entry.second;
-      const auto& old_param = *old_params[name];
-
-      // If a parameter type changed, or a link mapping changed, we
-      // need to relaunch.
-      if (old_param.Which() != new_param.Which()) {
-        return false;
-      }
-
-      switch (old_param.Which()) {
-        case fuchsia::modular::IntentParameterData::Tag::kEntityType:
-          if (old_param.entity_type() != new_param.entity_type()) {
-            return false;
-          }
-          break;
-        case fuchsia::modular::IntentParameterData::Tag::kEntityReference:
-          if (old_param.entity_reference() != new_param.entity_reference()) {
-            return false;
-          }
-          break;
-        case fuchsia::modular::IntentParameterData::Tag::kJson: {
-          std::string old_string;
-          std::string new_string;
-          if (old_param.json().size == 0 && new_param.json().size == 0) {
-            break;
-          }
-
-          FXL_CHECK(fsl::StringFromVmo(old_param.json(), &old_string));
-          FXL_CHECK(fsl::StringFromVmo(new_param.json(), &new_string));
-          if (old_string != new_string) {
-            return false;
-          }
-          break;
-        }
-        case fuchsia::modular::IntentParameterData::Tag::Invalid:
-          break;
-      }
-    }
-    return true;
-  }
-
-  std::unique_ptr<AddModCommandRunner> MakeRunner(
-      fuchsia::modular::ModuleResolver* const module_resolver,
-      fuchsia::modular::EntityResolver* const entity_resolver) {
-    return std::make_unique<AddModCommandRunner>(module_resolver,
-                                                 entity_resolver);
-  }
-
-  fuchsia::modular::StoryCommand MakeAddModCommand(
-      const std::string& mod_name, const std::string& parent_mod_name,
-      float surface_emphasis, const fuchsia::modular::Intent& intent) {
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name = {mod_name};
-    if (!parent_mod_name.empty()) {
-      add_mod.surface_parent_mod_name.reset({parent_mod_name});
-    }
-    add_mod.surface_relation.emphasis = surface_emphasis;
-    intent.Clone(&add_mod.intent);
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-    return command;
-  }
-
-  fuchsia::modular::Intent CreateEmptyIntent(const std::string& action,
-                                             const std::string& handler = "") {
-    fuchsia::modular::Intent intent;
-    intent.action = "intent_action";
-    if (!handler.empty()) {
-      intent.handler = "mod_url";
-    }
-    return intent;
-  }
-
-  void AddEntityRefParameter(fuchsia::modular::Intent* intent,
-                             const std::string& name,
-                             const std::string& reference) {
-    fuchsia::modular::IntentParameter parameter;
-    parameter.name = name;
-    parameter.data.set_entity_reference(reference);
-    intent->parameters.push_back(std::move(parameter));
-  }
-
-  void AddEntityTypeParameter(fuchsia::modular::Intent* intent,
-                              const std::string& name,
-                              std::vector<std::string> types) {
-    fuchsia::modular::IntentParameter parameter;
-    parameter.name = name;
-    parameter.data.set_entity_type(types);
-    intent->parameters.push_back(std::move(parameter));
-  }
-
-  void AddParameterWithoutName(fuchsia::modular::Intent* intent) {
-    fuchsia::modular::IntentParameter parameter;
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString("10", &vmo));
-    parameter.data.set_json(std::move(vmo).ToTransport());
-    intent->parameters.push_back(std::move(parameter));
-  }
-
-  void AddJsonParameter(fuchsia::modular::Intent* intent,
-                        const std::string& name, const std::string& json) {
-    fuchsia::modular::IntentParameter parameter;
-    parameter.name = name;
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(json, &vmo));
-    parameter.data.set_json(std::move(vmo).ToTransport());
-    intent->parameters.push_back(std::move(parameter));
-  }
-
-  void AddInvalidParameter(fuchsia::modular::Intent* intent,
-                           const std::string& name) {
-    // This parameter has no data union field set, hence it's invalid.
-    fuchsia::modular::IntentParameterData data;
-    fuchsia::modular::IntentParameter parameter;
-    parameter.name = name;
-    parameter.data = std::move(data);
-    intent->parameters.push_back(std::move(parameter));
-  }
-
-  // Initializes a parent mod for the mod created during the test. The goal of
-  // this mod is to test parameters of type link_name and as the
-  // surface_relation_parent_mod.
-  void InitParentMod(const std::string& mod_name, const std::string& param_name,
-                     const std::string& param_value,
-                     const std::string& link_path_name) {
-    fuchsia::modular::ModuleData module_data;
-    module_data.module_path.push_back(mod_name);
-    module_data.intent = fuchsia::modular::Intent::New();
-    AddJsonParameter(module_data.intent.get(), param_name, param_value);
-
-    fuchsia::modular::ModuleParameterMapEntry parameter_entry;
-    auto link_path = MakeLinkPath(link_path_name);
-    fidl::Clone(module_data.module_path, &link_path.module_path);
-    parameter_entry.name = param_name;
-    fidl::Clone(link_path, &parameter_entry.link_path);
-    module_data.parameter_map.entries.push_back(std::move(parameter_entry));
-
-    SetLinkValue(story_storage_.get(), link_path, param_value);
-    WriteModuleData(story_storage_.get(), std::move(module_data));
-  }
-
-  std::unique_ptr<AddModCommandRunner> runner_;
-  std::unique_ptr<SessionStorage> session_storage_;
-  std::unique_ptr<StoryStorage> story_storage_;
-  fuchsia::modular::ModuleResolverPtr module_resolver_;
-  fuchsia::modular::EntityResolverPtr entity_resolver_;
-  std::string story_id_;
-  std::unique_ptr<ModuleResolverFake> fake_module_resolver_ =
-      std::make_unique<ModuleResolverFake>();
-  std::unique_ptr<EntityResolverFake> fake_entity_resolver_ =
-      std::make_unique<EntityResolverFake>();
-};
-
-TEST_F(AddModCommandRunnerTest, ExecuteIntentWithIntentHandler) {
-  // Set up command
-  auto intent = CreateEmptyIntent("intent_action", "mod_url");
-  intent.parameters.resize(0);
-  auto command = MakeAddModCommand("mod", "parent_mod", 0.5, intent);
-
-  auto manifest = fuchsia::modular::ModuleManifest::New();
-  manifest->intent_filters.push_back(MakeIntentFilter("intent_action", {}));
-  manifest->binary = "mod_url";
-
-  // Set up fake module resolver and set validation of GetModuleManifest call.
-  fuchsia::modular::ModuleManifestPtr manifest_out;
-  fuchsia::modular::ModuleManifestPtr manifest_to_add;
-  fidl::Clone(manifest, &manifest_out);
-  fidl::Clone(manifest, &manifest_to_add);
-  fake_module_resolver_->SetManifest(std::move(manifest_out));
-  fake_module_resolver_->SetGetModuleManifestValidation(
-      [&](const fidl::StringPtr& module_id) {
-        EXPECT_EQ(intent.handler, module_id);
-      });
-
-  fuchsia::modular::FindModulesResult res;
-  res.module_id = "mod_url";
-  res.manifest = std::move(manifest_to_add);
-  fake_module_resolver_->AddFindModulesResult(std::move(res));
-
-  // Run the command and assert results.
-  bool done = false;
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     ASSERT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                               result.status);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-
-  done = false;
-  std::vector<std::string> full_path{"parent_mod", "mod"};
-  story_storage_->ReadModuleData(std::move(full_path))
-      ->Then([&](fuchsia::modular::ModuleDataPtr module_data) {
-        EXPECT_EQ("mod_url", module_data->module_url);
-        EXPECT_EQ(full_path, module_data->module_path);
-        EXPECT_FALSE(module_data->module_deleted);
-        EXPECT_EQ(fuchsia::modular::ModuleSource::EXTERNAL,
-                  module_data->module_source);
-        EXPECT_EQ(0.5, module_data->surface_relation->emphasis);
-        EXPECT_TRUE(AreIntentsEqual(intent, *module_data->intent));
-        EXPECT_EQ(0u, module_data->parameter_map.entries.size());
-        done = true;
-      });
-
-  RunLoopUntil([&] { return done; });
-}
-
-// Explicitly leave surface_parent_mod_name as null when providing the Intent.
-// We should tolerate this, and initialize it to a zero-length vector
-// internally.
-TEST_F(AddModCommandRunnerTest, ExecuteIntentWithIntentHandler_NoParent) {
-  auto intent = CreateEmptyIntent("intent_action", "mod_url");
-  intent.parameters.resize(0);
-  auto command =
-      MakeAddModCommand("mod", "" /* parent mod is null */, 0.5, intent);
-
-  auto manifest = fuchsia::modular::ModuleManifest::New();
-  manifest->intent_filters.push_back(MakeIntentFilter("intent_action", {}));
-  manifest->binary = "mod_url";
-
-  // Set up fake module resolver and set validation of GetModuleManifest call.
-  fuchsia::modular::ModuleManifestPtr manifest_out;
-  fuchsia::modular::ModuleManifestPtr manifest_to_add;
-  fidl::Clone(manifest, &manifest_out);
-  fidl::Clone(manifest, &manifest_to_add);
-  fake_module_resolver_->SetManifest(std::move(manifest_out));
-  fake_module_resolver_->SetGetModuleManifestValidation(
-      [&](const fidl::StringPtr& module_id) {
-        EXPECT_EQ(intent.handler, module_id);
-      });
-
-  fuchsia::modular::FindModulesResult res;
-  res.module_id = "mod_url";
-  res.manifest = std::move(manifest_to_add);
-  fake_module_resolver_->AddFindModulesResult(std::move(res));
-
-  // Run the command and assert results.
-  bool done = false;
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     ASSERT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                               result.status);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-
-  done = false;
-  std::vector<std::string> full_path{"mod"};
-  story_storage_->ReadModuleData(std::move(full_path))
-      ->Then([&](fuchsia::modular::ModuleDataPtr module_data) {
-        EXPECT_EQ("mod_url", module_data->module_url);
-        EXPECT_EQ(full_path, module_data->module_path);
-        EXPECT_FALSE(module_data->module_deleted);
-        EXPECT_EQ(fuchsia::modular::ModuleSource::EXTERNAL,
-                  module_data->module_source);
-        EXPECT_EQ(0.5, module_data->surface_relation->emphasis);
-        EXPECT_TRUE(AreIntentsEqual(intent, *module_data->intent));
-        EXPECT_EQ(0u, module_data->parameter_map.entries.size());
-        done = true;
-      });
-
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(AddModCommandRunnerTest, ExecuteIntentThatNeedsResolution) {
-  auto reference =
-      fake_entity_resolver_->AddEntity({{"entity_type1", "entity_data"}});
-
-  InitParentMod("parent_mod", "param", R"({"@type": "baz"})",
-                "parent_link_name");
-
-  // Set up command
-  auto intent = CreateEmptyIntent("intent_action");
-  AddJsonParameter(&intent, "param_json", R"({"@type": "foo"})");
-  AddEntityRefParameter(&intent, "param_ref", reference);
-  AddEntityTypeParameter(&intent, "param_type", {"entity_type2"});
-  auto command = MakeAddModCommand("mod", "parent_mod", 0.5, intent);
-
-  auto manifest = fuchsia::modular::ModuleManifest::New();
-  manifest->binary = "mod_url";
-  manifest->intent_filters.push_back(MakeIntentFilter("intent_action", {}));
-  fuchsia::modular::FindModulesResult result;
-  result.module_id = "mod_url";
-  fidl::Clone(manifest, &result.manifest);
-
-  fake_module_resolver_->AddFindModulesResult(std::move(result));
-  // Since we are mocking module resolver and returning the expected |result|,
-  // ensure that at least it's being called with the right parameters.
-  fake_module_resolver_->SetFindModulesValidation(
-      [&](const fuchsia::modular::FindModulesQuery& query) {
-        EXPECT_EQ("intent_action", query.action);
-        auto& constraints = query.parameter_constraints;
-        EXPECT_EQ(3u, constraints.size());
-        for (auto& constraint : constraints) {
-          EXPECT_EQ(1u, constraint.param_types.size());
-        }
-        EXPECT_EQ("param_json", constraints.at(0).param_name);
-        EXPECT_EQ("foo", constraints.at(0).param_types.at(0));
-        EXPECT_EQ("param_ref", constraints.at(1).param_name);
-        EXPECT_EQ("entity_type1", constraints.at(1).param_types.at(0));
-        EXPECT_EQ("param_ref", constraints.at(1).param_name);
-        EXPECT_EQ("entity_type1", constraints.at(1).param_types.at(0));
-        EXPECT_EQ("param_type", constraints.at(2).param_name);
-        EXPECT_EQ("entity_type2", constraints.at(2).param_types.at(0));
-      });
-
-  bool done{};
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                               result.status);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-
-  done = false;
-  std::vector<std::string> full_path{"parent_mod", "mod"};
-  fuchsia::modular::ModuleDataPtr module_data;
-  story_storage_->ReadModuleData(std::move(full_path))
-      ->Then([&](fuchsia::modular::ModuleDataPtr result) {
-        module_data = std::move(result);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-
-  EXPECT_EQ("mod_url", module_data->module_url);
-  EXPECT_EQ(full_path, module_data->module_path);
-  EXPECT_FALSE(module_data->module_deleted);
-  EXPECT_EQ(fuchsia::modular::ModuleSource::EXTERNAL,
-            module_data->module_source);
-  EXPECT_EQ(0.5, module_data->surface_relation->emphasis);
-  EXPECT_TRUE(AreIntentsEqual(intent, *module_data->intent));
-  EXPECT_EQ(3u, module_data->parameter_map.entries.size());
-
-  // Verify parameters
-  auto& link_path1 = module_data->parameter_map.entries.at(0).link_path;
-  EXPECT_EQ("param_json", module_data->parameter_map.entries.at(0).name);
-  EXPECT_EQ(full_path, link_path1.module_path);
-  EXPECT_EQ("param_json", link_path1.link_name);
-  EXPECT_EQ(R"({"@type": "foo"})",
-            GetLinkValue(story_storage_.get(), link_path1));
-
-  auto& link_path2 = module_data->parameter_map.entries.at(1).link_path;
-  EXPECT_EQ("param_ref", module_data->parameter_map.entries.at(1).name);
-  EXPECT_EQ(full_path, link_path2.module_path);
-  EXPECT_EQ("param_ref", link_path2.link_name);
-  EXPECT_EQ(R"({"@entityRef":")" + *reference + R"("})",
-            GetLinkValue(story_storage_.get(), link_path2));
-
-  auto& link_path3 = module_data->parameter_map.entries.at(2).link_path;
-  EXPECT_EQ("param_type", module_data->parameter_map.entries.at(2).name);
-  EXPECT_EQ(full_path, link_path3.module_path);
-  EXPECT_EQ("param_type", link_path3.link_name);
-  EXPECT_EQ("null", GetLinkValue(story_storage_.get(), link_path3));
-}
-
-TEST_F(AddModCommandRunnerTest, ExecuteNoModulesFound) {
-  fuchsia::modular::Intent intent;
-  fuchsia::modular::AddMod add_mod;
-  intent.Clone(&add_mod.intent);
-  add_mod.mod_name.push_back("mymod");
-  add_mod.intent.action = "intent_action";
-  fuchsia::modular::StoryCommand command;
-  command.set_add_mod(std::move(add_mod));
-
-  bool done{};
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     EXPECT_EQ(
-                         fuchsia::modular::ExecuteStatus::NO_MODULES_FOUND,
-                         result.status);
-                     EXPECT_EQ("Resolution of intent gave zero results.",
-                               result.error_message);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(AddModCommandRunnerTest, ExecuteInvalidParameter) {
-  // Set up command
-  auto intent = CreateEmptyIntent("intent_action", "mod_url");
-  AddInvalidParameter(&intent, "invalid_param");
-  auto command = MakeAddModCommand("mod", "parent_mod", 0.5, intent);
-
-  auto manifest = fuchsia::modular::ModuleManifest::New();
-  manifest->binary = "mod_url";
-  manifest->intent_filters.push_back(MakeIntentFilter("intent_action", {}));
-
-  // Set up fake module resolver.
-  fuchsia::modular::ModuleManifestPtr manifest_out;
-  fidl::Clone(manifest, &manifest_out);
-  fake_module_resolver_->SetManifest(std::move(manifest_out));
-
-  // Run the command and assert results.
-  bool done{};
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     EXPECT_EQ(fuchsia::modular::ExecuteStatus::INVALID_COMMAND,
-                               result.status);
-                     EXPECT_EQ(
-                         "Invalid data for parameter with name: "
-                         "invalid_param",
-                         result.error_message);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(AddModCommandRunnerTest, ExecuteInvalidParameterWithResulution) {
-  // Set up command
-  auto intent = CreateEmptyIntent("intent_action");
-  AddInvalidParameter(&intent, "invalid_param");
-  auto command = MakeAddModCommand("mod", "parent_mod", 0.5, intent);
-
-  // Set up fake module resolver.
-  auto manifest = fuchsia::modular::ModuleManifest::New();
-  manifest->binary = "mod_url";
-  manifest->intent_filters.push_back(MakeIntentFilter("intent_action", {}));
-  fuchsia::modular::FindModulesResult result;
-  result.module_id = "mod_url";
-  fidl::Clone(manifest, &result.manifest);
-
-  fake_module_resolver_->AddFindModulesResult(std::move(result));
-
-  // Run the command and assert results.
-  bool done{};
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     EXPECT_EQ(fuchsia::modular::ExecuteStatus::INVALID_COMMAND,
-                               result.status);
-                     EXPECT_EQ(
-                         "Invalid data for parameter with name: "
-                         "invalid_param",
-                         result.error_message);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(AddModCommandRunnerTest, ExecuteNullHandlerAndParameter) {
-  // Set up command
-  auto intent = CreateEmptyIntent("intent_action");
-  AddParameterWithoutName(&intent);
-  auto command = MakeAddModCommand("mod", "parent_mod", 0.5, intent);
-
-  // Run the command and assert results.
-  bool done{};
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     EXPECT_EQ(fuchsia::modular::ExecuteStatus::INVALID_COMMAND,
-                               result.status);
-                     EXPECT_EQ(
-                         "A null-named module parameter is not allowed "
-                         "when using fuchsia::modular::Intent.",
-                         result.error_message);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(AddModCommandRunnerTest, ExecuteInvalidJsonParamResolution) {
-  // Set up command
-  auto intent = CreateEmptyIntent("intent_action");
-  AddJsonParameter(&intent, "invalid_param", "x}");
-  auto command = MakeAddModCommand("mod", "parent_mod", 0.5, intent);
-
-  // Set up fake module resolver.
-  auto manifest = fuchsia::modular::ModuleManifest::New();
-  manifest->binary = "mod_url";
-  manifest->intent_filters.push_back(MakeIntentFilter("intent_action", {}));
-  fuchsia::modular::FindModulesResult result;
-  result.module_id = "mod_url";
-  fidl::Clone(manifest, &result.manifest);
-  fake_module_resolver_->AddFindModulesResult(std::move(result));
-
-  // Run the command and assert results.
-  bool done{};
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     EXPECT_EQ(fuchsia::modular::ExecuteStatus::INVALID_COMMAND,
-                               result.status);
-                     EXPECT_EQ("Mal-formed JSON in parameter: invalid_param",
-                               result.error_message);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(AddModCommandRunnerTest, UpdatesModIfItExists) {
-  // Set up command
-  auto intent = CreateEmptyIntent("intent_action", "mod_url");
-  AddJsonParameter(&intent, "param_json", R"({"@type": "foo"})");
-  auto command = MakeAddModCommand("mod", "parent_mod", 0.5, intent);
-
-  auto manifest = fuchsia::modular::ModuleManifest::New();
-  manifest->binary = "mod_url";
-  manifest->intent_filters.push_back(MakeIntentFilter(
-      "intent_action",
-      {fuchsia::modular::ParameterConstraint{"param_json", "foo"}}));
-
-  // Set up fake module resolver, set validaiton of GetModuleManifest call, and
-  // a dummy result.
-  {
-    fuchsia::modular::ModuleManifestPtr manifest_out;
-    fidl::Clone(manifest, &manifest_out);
-    fake_module_resolver_->SetManifest(std::move(manifest_out));
-
-    fuchsia::modular::FindModulesResult res;
-    res.module_id = "mod_url";
-    res.manifest = std::move(manifest);
-    fake_module_resolver_->AddFindModulesResult(std::move(res));
-  }
-
-  // Add a mod to begin with.
-  bool done{};
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     ASSERT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                               result.status);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-
-  // Get the link path for the param of the mod we created.
-  fuchsia::modular::LinkPath link_path;
-  std::vector<std::string> full_path{"parent_mod", "mod"};
-  story_storage_->ReadModuleData(full_path)->Then(
-      [&](fuchsia::modular::ModuleDataPtr result) {
-        for (auto& entry : result->parameter_map.entries) {
-          if (entry.name == "param_json") {
-            fidl::Clone(entry.link_path, &link_path);
-          }
-        }
-      });
-
-  // Create AddMod intent for a mod with the same name as the one we created
-  // previously.
-  auto intent2 = CreateEmptyIntent("intent_action", "mod_url");
-  AddJsonParameter(&intent2, "param_json", R"({"@type": "baz"})");
-  fuchsia::modular::AddMod add_mod;
-  add_mod.mod_name = {"parent_mod", "mod"};
-  intent2.Clone(&add_mod.intent);
-  fuchsia::modular::StoryCommand command2;
-  command2.set_add_mod(std::move(add_mod));
-
-  {
-    fuchsia::modular::ModuleManifestPtr manifest_out;
-    fidl::Clone(manifest, &manifest_out);
-    fake_module_resolver_->SetManifest(std::move(manifest_out));
-
-    fuchsia::modular::FindModulesResult res;
-    res.module_id = "mod_url";
-    res.manifest = std::move(manifest);
-    fake_module_resolver_->AddFindModulesResult(std::move(res));
-  }
-
-  done = false;
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command2),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     ASSERT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                               result.status);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-
-  done = false;
-  // Verify we updated an existing link.
-  story_storage_->GetLinkValue(link_path)->Then(
-      [&](StoryStorage::Status status, fidl::StringPtr v) {
-        EXPECT_EQ(R"({"@type": "baz"})", *v);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/command_runner.cc b/bin/sessionmgr/puppet_master/command_runners/command_runner.cc
deleted file mode 100644
index a525f3a..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/command_runner.cc
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/command_runner.h"
-
-namespace modular {
-
-CommandRunner::CommandRunner() {}
-
-CommandRunner::~CommandRunner() = default;
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/command_runner.h b/bin/sessionmgr/puppet_master/command_runners/command_runner.h
deleted file mode 100644
index 6d300c1..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/command_runner.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_COMMAND_RUNNER_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_COMMAND_RUNNER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/sessionmgr/storage/session_storage.h"
-
-namespace modular {
-
-class CommandRunner {
- public:
-  CommandRunner();
-  virtual ~CommandRunner();
-
-  virtual void Execute(
-      fidl::StringPtr story_id, StoryStorage* story_storage,
-      fuchsia::modular::StoryCommand command,
-      std::function<void(fuchsia::modular::ExecuteResult)> done) = 0;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_COMMAND_RUNNER_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner.cc b/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner.cc
deleted file mode 100644
index b91b0e8..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner.h"
-
-namespace modular {
-
-FocusModCommandRunner::FocusModCommandRunner(
-    fit::function<void(std::string, std::vector<std::string>)>
-        module_focuser)
-    : module_focuser_(std::move(module_focuser)) {}
-
-FocusModCommandRunner::~FocusModCommandRunner() = default;
-
-void FocusModCommandRunner::Execute(
-    fidl::StringPtr story_id, StoryStorage* const story_storage,
-    fuchsia::modular::StoryCommand command,
-    std::function<void(fuchsia::modular::ExecuteResult)> done) {
-  fuchsia::modular::ExecuteResult result;
-
-  if (command.focus_mod().mod_name.empty()) {
-    result.status = fuchsia::modular::ExecuteStatus::INVALID_COMMAND;
-    result.error_message = "No mod_name provided.";
-    done(std::move(result));
-    return;
-  }
-
-  module_focuser_(story_id, std::move(command.focus_mod().mod_name));
-
-  result.status = fuchsia::modular::ExecuteStatus::OK;
-  done(std::move(result));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner.h b/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner.h
deleted file mode 100644
index 812e3ab..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_FOCUS_MOD_COMMAND_RUNNER_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_FOCUS_MOD_COMMAND_RUNNER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/command_runner.h"
-
-namespace modular {
-
-class FocusModCommandRunner : public CommandRunner {
- public:
-  FocusModCommandRunner(
-      fit::function<void(std::string, std::vector<std::string>)>
-          module_focuser);
-  ~FocusModCommandRunner();
-
-  void Execute(
-      fidl::StringPtr story_id, StoryStorage* story_storage,
-      fuchsia::modular::StoryCommand command,
-      std::function<void(fuchsia::modular::ExecuteResult)> done) override;
-
- private:
-  fit::function<void(std::string, std::vector<std::string>)>
-      module_focuser_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_FOCUS_MOD_COMMAND_RUNNER_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner_unittest.cc b/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner_unittest.cc
deleted file mode 100644
index 761c8ec..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner_unittest.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner.h"
-
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-class FocusModCommandRunnerTest : public gtest::TestLoopFixture {
- public:
-  void SetUp() override {
-    focused_called_ = false;
-    runner_ = std::make_unique<FocusModCommandRunner>(
-        [&](std::string story_id,
-            std::vector<std::string> mod_name) {
-          focused_called_ = true;
-        });
-  }
-
-  bool focused_called_{};
-  std::unique_ptr<FocusModCommandRunner> runner_;
-};
-
-TEST_F(FocusModCommandRunnerTest, Focus) {
-  fuchsia::modular::FocusMod focus_mod;
-  focus_mod.mod_name.push_back("mod");
-  fuchsia::modular::StoryCommand command;
-  command.set_focus_mod(std::move(focus_mod));
-
-  fuchsia::modular::ExecuteResult result;
-  runner_->Execute("story1", nullptr /* story_storage */, std::move(command),
-                   [&](fuchsia::modular::ExecuteResult execute_result) {
-                     result = std::move(execute_result);
-                   });
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK, result.status);
-  EXPECT_TRUE(focused_called_);
-}
-
-TEST_F(FocusModCommandRunnerTest, FocusEmptyPath) {
-  fuchsia::modular::FocusMod focus_mod;
-  focus_mod.mod_name.resize(0);
-  fuchsia::modular::StoryCommand command;
-  command.set_focus_mod(std::move(focus_mod));
-
-  fuchsia::modular::ExecuteResult result;
-  runner_->Execute("story1", nullptr /* story_storage */, std::move(command),
-                   [&](fuchsia::modular::ExecuteResult execute_result) {
-                     result = std::move(execute_result);
-                   });
-
-  RunLoopUntilIdle();
-  EXPECT_EQ(fuchsia::modular::ExecuteStatus::INVALID_COMMAND, result.status);
-  EXPECT_EQ("No mod_name provided.", result.error_message);
-  EXPECT_FALSE(focused_called_);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/BUILD.gn b/bin/sessionmgr/puppet_master/command_runners/operation_calls/BUILD.gn
deleted file mode 100644
index 3ed9d1c..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/BUILD.gn
+++ /dev/null
@@ -1,113 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("operation_calls") {
-  public_deps = [
-    ":add_mod_call",
-    ":find_modules_call",
-    ":get_link_path_for_parameter_name_call",
-    ":get_types_from_entity_call",
-    ":initialize_chain_call",
-  ]
-}
-
-source_set("add_mod_call") {
-  sources = [
-    "add_mod_call.cc",
-    "add_mod_call.h",
-  ]
-
-  deps = [
-    ":find_modules_call",
-    ":get_link_path_for_parameter_name_call",
-    ":get_types_from_entity_call",
-    ":initialize_chain_call",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/module_manifest:module_facet_reader",
-    "//peridot/public/lib/entity/cpp:json",
-  ]
-
-  public_deps = [
-    "//peridot/bin/sessionmgr/storage:story_storage",
-    "//peridot/lib/fidl:clone",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-source_set("find_modules_call") {
-  sources = [
-    "find_modules_call.cc",
-    "find_modules_call.h",
-  ]
-
-  deps = [
-    ":get_link_path_for_parameter_name_call",
-    ":get_types_from_entity_call",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/sessionmgr/storage:story_storage",
-    "//peridot/lib/fidl:clone",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:operation",
-    "//peridot/public/lib/entity/cpp:json",
-    "//peridot/public/lib/fostr/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("get_link_path_for_parameter_name_call") {
-  sources = [
-    "get_link_path_for_parameter_name_call.cc",
-    "get_link_path_for_parameter_name_call.h",
-  ]
-
-  deps = [
-    "//peridot/bin/sessionmgr/storage:story_storage",
-    "//peridot/lib/fidl:clone",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-source_set("initialize_chain_call") {
-  sources = [
-    "initialize_chain_call.cc",
-    "initialize_chain_call.h",
-  ]
-
-  deps = [
-    ":set_link_value_call",
-    "//peridot/bin/sessionmgr/storage:story_storage",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-source_set("get_types_from_entity_call") {
-  sources = [
-    "get_types_from_entity_call.cc",
-    "get_types_from_entity_call.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-source_set("set_link_value_call") {
-  sources = [
-    "set_link_value_call.cc",
-    "set_link_value_call.h",
-  ]
-
-  deps = [
-    "//peridot/bin/sessionmgr/storage:story_storage",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.cc b/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.cc
deleted file mode 100644
index 3afea2f..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.cc
+++ /dev/null
@@ -1,238 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.h"
-
-#include <lib/entity/cpp/json.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_link_path_for_parameter_name_call.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_types_from_entity_call.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/initialize_chain_call.h"
-#include "peridot/lib/fidl/clone.h"
-
-namespace modular {
-
-namespace {
-
-class AddModCall : public Operation<fuchsia::modular::ExecuteResult,
-                                    fuchsia::modular::ModuleData> {
- public:
-  AddModCall(StoryStorage* const story_storage,
-             fuchsia::modular::ModuleResolver* const module_resolver,
-             fuchsia::modular::EntityResolver* const entity_resolver,
-             AddModParams add_mod_params, ResultCall done)
-      : Operation("AddModCommandRunner::AddModCall", std::move(done)),
-        story_storage_(story_storage),
-        module_resolver_(module_resolver),
-        entity_resolver_(entity_resolver),
-        add_mod_params_(std::move(add_mod_params)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &out_result_, &out_module_data_};
-
-    // Success status by default, it will be update it if an error state is
-    // found.
-    out_result_.status = fuchsia::modular::ExecuteStatus::OK;
-
-    // If we have an action, we use the module resolver to type-check and
-    // resolve the (action, parameter) and the supplied optional handler to a
-    // module. If the module resolver doesn't recognize a supplied handler, we
-    // forgivingly execute the handler anyway.
-    if (!add_mod_params_.intent.action.is_null()) {
-      AddFindModulesOperation(
-          &operation_queue_, module_resolver_, entity_resolver_,
-          CloneOptional(add_mod_params_.intent),
-          add_mod_params_.parent_mod_path,
-          [this, flow](fuchsia::modular::ExecuteResult result,
-                       fuchsia::modular::FindModulesResponse response) {
-            if (result.status != fuchsia::modular::ExecuteStatus::OK) {
-              out_result_ = std::move(result);
-              return;
-              // Operation finishes since |flow| goes out of scope.
-            }
-
-            // NOTE: leave this as a switch case and omit the default case; the
-            // compiler will make sure we're handling all error cases.
-            switch (response.status) {
-              case fuchsia::modular::FindModulesStatus::SUCCESS: {
-                if (response.results.empty()) {
-                  out_result_.status =
-                      fuchsia::modular::ExecuteStatus::NO_MODULES_FOUND;
-                  out_result_.error_message =
-                      "Resolution of intent gave zero results.";
-                  return;
-                  // Operation finishes since |flow| goes out of scope.
-                }
-
-                candidate_module_ = std::move(response.results.at(0));
-              } break;
-
-              case fuchsia::modular::FindModulesStatus::UNKNOWN_HANDLER: {
-                candidate_module_.module_id = add_mod_params_.intent.handler;
-              } break;
-            }
-
-            CreateLinks(flow);
-          });
-    } else {
-      // We arrive here if the Intent has a handler, but no action.
-      FXL_DCHECK(!add_mod_params_.intent.handler.is_null())
-          << "Cannot start a module without an action or a handler";
-      candidate_module_.module_id = add_mod_params_.intent.handler;
-
-      CreateLinks(flow);
-    }
-  }
-
-  // Create module parameters info and create links.
-  void CreateLinks(FlowToken flow) {
-    CreateModuleParameterMapInfo(flow, [this, flow] {
-      if (out_result_.status != fuchsia::modular::ExecuteStatus::OK) {
-        return;
-        // Operation finishes since |flow| goes out of scope.
-      }
-      auto full_module_path = add_mod_params_.parent_mod_path;
-      full_module_path.push_back(add_mod_params_.mod_name);
-      AddInitializeChainOperation(
-          &operation_queue_, story_storage_, std::move(full_module_path),
-          std::move(parameter_info_),
-          [this, flow](fuchsia::modular::ExecuteResult result,
-                       fuchsia::modular::ModuleParameterMapPtr map) {
-            if (result.status != fuchsia::modular::ExecuteStatus::OK) {
-              out_result_ = std::move(result);
-              return;
-              // Operation finishes since |flow| goes out of scope.
-            }
-            WriteModuleData(flow, std::move(map));
-          });
-    });
-  }
-
-  // On success, populates |parameter_info_|. On failure, |out_result_| contains
-  // error reason. Calls |done()| on completion in either case.
-  void CreateModuleParameterMapInfo(FlowToken flow,
-                                    std::function<void()> done) {
-    parameter_info_ = fuchsia::modular::CreateModuleParameterMapInfo::New();
-
-    std::vector<FuturePtr<fuchsia::modular::CreateModuleParameterMapEntry>>
-        did_get_entries;
-    did_get_entries.reserve(add_mod_params_.intent.parameters->size());
-
-    for (auto& param : *add_mod_params_.intent.parameters) {
-      fuchsia::modular::CreateModuleParameterMapEntry entry;
-      entry.key = param.name;
-
-      switch (param.data.Which()) {
-        case fuchsia::modular::IntentParameterData::Tag::kEntityReference: {
-          fuchsia::modular::CreateLinkInfo create_link;
-          fsl::SizedVmo vmo;
-          FXL_CHECK(fsl::VmoFromString(
-              EntityReferenceToJson(param.data.entity_reference()), &vmo));
-          create_link.initial_data = std::move(vmo).ToTransport();
-          entry.value.set_create_link(std::move(create_link));
-          break;
-        }
-        case fuchsia::modular::IntentParameterData::Tag::kEntityType: {
-          // Create a link, but don't populate it. This is useful in the event
-          // that the link is used as an 'output' link. Setting a valid JSON
-          // value for null in the vmo.
-          fsl::SizedVmo vmo;
-          FXL_CHECK(fsl::VmoFromString("null", &vmo));
-          fuchsia::modular::CreateLinkInfo create_link;
-          create_link.initial_data = std::move(vmo).ToTransport();
-          entry.value.set_create_link(std::move(create_link));
-          break;
-        }
-        case fuchsia::modular::IntentParameterData::Tag::kJson: {
-          fuchsia::modular::CreateLinkInfo create_link;
-          param.data.json().Clone(&create_link.initial_data);
-          entry.value.set_create_link(std::move(create_link));
-          break;
-        }
-        case fuchsia::modular::IntentParameterData::Tag::Invalid: {
-          out_result_.status = fuchsia::modular::ExecuteStatus::INVALID_COMMAND;
-          out_result_.error_message =
-              fxl::StringPrintf("Invalid data for parameter with name: %s",
-                                param.name.get().c_str());
-          done();
-          return;
-        }
-      }
-
-      auto did_create_entry =
-          Future<fuchsia::modular::CreateModuleParameterMapEntry>::
-              CreateCompleted(
-                  "AddModCommandRunner::FindModulesCall.did_create_entry",
-                  std::move(entry));
-      did_get_entries.emplace_back(std::move(did_create_entry));
-    }
-
-    Wait("AddModCommandRunner::AddModCall::Wait", did_get_entries)
-        ->Then([this, done, flow](
-                   std::vector<fuchsia::modular::CreateModuleParameterMapEntry>
-                       entries) {
-          parameter_info_->property_info.reset(std::move(entries));
-          done();
-        });
-  }
-
-  // Write module data
-  void WriteModuleData(FlowToken flow,
-                       fuchsia::modular::ModuleParameterMapPtr map) {
-    fidl::Clone(*map, &out_module_data_.parameter_map);
-    out_module_data_.module_url = candidate_module_.module_id;
-    out_module_data_.module_path = add_mod_params_.parent_mod_path;
-    out_module_data_.module_path.push_back(add_mod_params_.mod_name);
-    out_module_data_.module_source = add_mod_params_.module_source;
-    out_module_data_.module_deleted = false;
-    fidl::Clone(add_mod_params_.surface_relation,
-                &out_module_data_.surface_relation);
-    out_module_data_.is_embedded = add_mod_params_.is_embedded;
-    out_module_data_.intent = std::make_unique<fuchsia::modular::Intent>(
-        std::move(add_mod_params_.intent));
-
-    // Operation stays alive until flow goes out of scope.
-    fuchsia::modular::ModuleData module_data;
-    out_module_data_.Clone(&module_data);
-    story_storage_->WriteModuleData(std::move(module_data))->Then([this, flow] {
-    });
-  }
-
-  StoryStorage* const story_storage_;                        // Not owned.
-  fuchsia::modular::ModuleResolver* const module_resolver_;  // Not owned.
-  fuchsia::modular::EntityResolver* const entity_resolver_;  // Not owned.
-  modular::AddModParams add_mod_params_;
-  fuchsia::modular::FindModulesResult candidate_module_;
-  fuchsia::modular::CreateModuleParameterMapInfoPtr parameter_info_;
-  fuchsia::modular::ModuleData out_module_data_;
-  fuchsia::modular::ExecuteResult out_result_;
-  // Used when creating the map info to execute an operation as soon as it
-  // arrives.
-  OperationCollection operations_;
-  // Used to enqueue sub-operations that should be executed sequentially.
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AddModCall);
-};  // namespace
-
-}  // namespace
-
-void AddAddModOperation(OperationContainer* const container,
-                        StoryStorage* const story_storage,
-                        fuchsia::modular::ModuleResolver* const module_resolver,
-                        fuchsia::modular::EntityResolver* const entity_resolver,
-                        AddModParams add_mod_params,
-                        std::function<void(fuchsia::modular::ExecuteResult,
-                                           fuchsia::modular::ModuleData)>
-                            done) {
-  container->Add(new AddModCall(story_storage, module_resolver, entity_resolver,
-                                std::move(add_mod_params), std::move(done)));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.h b/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.h
deleted file mode 100644
index 752c35e..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_ADD_MOD_CALL_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_ADD_MOD_CALL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-
-namespace modular {
-
-// This struct contains common parameters needed to add a module to a story,
-// useful as a single place to add more parameters that need shuffling around.
-// See story_command.fidl and module_data.fidl for a detailed description of
-// what these parameters mean.
-struct AddModParams {
-  // This parent module's module path. If empty, this mod has no parent module.
-  std::vector<std::string> parent_mod_path;
-  // Module name given to this module path (parent_mod_path + mod_name is this
-  // module's module path).
-  std::string mod_name;
-
-  // True if this is an embedded mod (as opposed to being arranged by the story
-  // shell), in which case this mod's view will be embedded by its parent mod
-  // (represented by parent_mod_path).
-  bool is_embedded;
-
-  // See |fuchsia::modular::ModuleData| (module_data.fidl) for a detailed
-  // description of what these parameters mean.
-  fuchsia::modular::Intent intent;
-  fuchsia::modular::SurfaceRelationPtr surface_relation;
-  fuchsia::modular::ModuleSource module_source;
-};
-
-void AddAddModOperation(OperationContainer* container,
-                        StoryStorage* story_storage,
-                        fuchsia::modular::ModuleResolver* module_resolver,
-                        fuchsia::modular::EntityResolver* entity_resolver,
-                        AddModParams add_mod_params,
-                        std::function<void(fuchsia::modular::ExecuteResult,
-                                           fuchsia::modular::ModuleData)>
-                            done);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_ADD_MOD_CALL_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.cc b/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.cc
deleted file mode 100644
index 53c24f3..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.h"
-
-#include <lib/entity/cpp/json.h>
-#include <lib/fostr/fidl/fuchsia/modular/formatting.h>
-#include <lib/fsl/types/type_converters.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/type_converter.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_types_from_entity_call.h"
-#include "peridot/lib/fidl/clone.h"
-
-namespace modular {
-
-namespace {
-
-class FindModulesCall
-    : public Operation<fuchsia::modular::ExecuteResult,
-                       fuchsia::modular::FindModulesResponse> {
- public:
-  FindModulesCall(fuchsia::modular::ModuleResolver* const module_resolver,
-                  fuchsia::modular::EntityResolver* const entity_resolver,
-                  fuchsia::modular::IntentPtr intent,
-                  std::vector<std::string> requesting_module_path,
-                  ResultCall result_call)
-      : Operation("FindModulesCall", std::move(result_call)),
-        module_resolver_(module_resolver),
-        entity_resolver_(entity_resolver),
-        intent_(std::move(intent)),
-        requesting_module_path_(std::move(requesting_module_path)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &result_, &response_};
-    // Default status. We'll update it and return if an error occurs.
-    result_.status = fuchsia::modular::ExecuteStatus::OK;
-
-    FXL_DCHECK(intent_->action) << intent_;
-
-    constraint_futs_.reserve(intent_->parameters->size());
-
-    resolver_query_.action = intent_->action;
-    resolver_query_.handler = intent_->handler;
-    resolver_query_.parameter_constraints.resize(0);
-
-    for (auto& param : *intent_->parameters) {
-      // TODO(MF-23): Deprecate parameter name nullability altogether.
-      if (param.name.is_null() && intent_->handler.is_null()) {
-        result_.error_message =
-            "A null-named module parameter is not allowed "
-            "when using fuchsia::modular::Intent.";
-        result_.status = fuchsia::modular::ExecuteStatus::INVALID_COMMAND;
-        return;
-        // Operation finishes since |flow| goes out of scope.
-      }
-
-      // Skip processing null intent parameter names (these are generally
-      // root/null link names).
-      if (param.name.is_null()) {
-        param.name = "";
-      }
-
-      constraint_futs_.push_back(
-          GetTypesFromIntentParameter(std::move(param.data), param.name)
-              ->Map([this, name = param.name](std::vector<std::string> types) {
-                fuchsia::modular::FindModulesParameterConstraint constraint;
-                constraint.param_name = name;
-                constraint.param_types = std::move(types);
-                return constraint;
-              }));
-    }
-
-    Wait("FindModulesCall.Run.Wait", constraint_futs_)
-        ->Then([this, flow](
-                   std::vector<fuchsia::modular::FindModulesParameterConstraint>
-                       constraint_params) {
-          if (result_.status != fuchsia::modular::ExecuteStatus::OK) {
-            // Operation finishes since |flow| goes out of scope.
-            return;
-          }
-          resolver_query_.parameter_constraints = std::move(constraint_params);
-          module_resolver_->FindModules(
-              std::move(resolver_query_),
-              [this, flow](fuchsia::modular::FindModulesResponse response) {
-                response_ = std::move(response);
-                // At this point, the only remaining |flow| is the one captured
-                // in this lambda. This operation should end once |flow| goes
-                // out of scope here.
-              });
-        });
-  }
-
-  // To avoid deadlocks, this function must not depend on anything that executes
-  // on the story controller's operation queue.
-  FuturePtr<std::vector<std::string>> GetTypesFromIntentParameter(
-      fuchsia::modular::IntentParameterData input,
-      const fidl::StringPtr& param_name) {
-    auto fut = Future<std::vector<std::string>>::Create(
-        "AddModCommandRunner::GetTypesFromIntentParameter");
-    switch (input.Which()) {
-      case fuchsia::modular::IntentParameterData::Tag::kEntityReference: {
-        AddGetTypesFromEntityOperation(&operations_, entity_resolver_,
-                                       input.entity_reference(),
-                                       fut->Completer());
-        break;
-      }
-      case fuchsia::modular::IntentParameterData::Tag::kEntityType: {
-        fut->Complete(fxl::To<std::vector<std::string>>(input.entity_type()));
-        break;
-      }
-      case fuchsia::modular::IntentParameterData::Tag::kJson: {
-        std::string json_string;
-        FXL_CHECK(fsl::StringFromVmo(input.json(), &json_string));
-        if (auto result = GetTypesFromJson(json_string)) {
-          fut->Complete(std::move(*result));
-        } else {
-          std::ostringstream stream;
-          stream << "Mal-formed JSON in parameter: " << param_name;
-          result_.error_message = stream.str();
-          result_.status = fuchsia::modular::ExecuteStatus::INVALID_COMMAND;
-          fut->Complete({});
-        }
-        break;
-      }
-      case fuchsia::modular::IntentParameterData::Tag::Invalid: {
-        std::ostringstream stream;
-        stream << "Invalid data for parameter with name: " << param_name;
-        result_.error_message = stream.str();
-        result_.status = fuchsia::modular::ExecuteStatus::INVALID_COMMAND;
-        fut->Complete({});
-        break;
-      }
-    }
-    return fut;
-  }
-
-  std::optional<std::vector<std::string>> GetTypesFromJson(
-      const fidl::StringPtr& input) {
-    std::vector<std::string> types;
-    if (ExtractEntityTypesFromJson(input, &types)) {
-      return types;
-    }
-    return std::nullopt;
-  }
-
-  fuchsia::modular::ModuleResolver* const module_resolver_;  // Not Owned
-  fuchsia::modular::EntityResolver* const entity_resolver_;  // Not owned.
-  const fuchsia::modular::IntentPtr intent_;
-  const std::vector<std::string> requesting_module_path_;
-
-  fuchsia::modular::FindModulesQuery resolver_query_;
-  std::vector<FuturePtr<fuchsia::modular::FindModulesParameterConstraint>>
-      constraint_futs_;
-  fuchsia::modular::ExecuteResult result_;
-  fuchsia::modular::FindModulesResponse response_;
-  OperationCollection operations_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FindModulesCall);
-};
-
-}  // namespace
-
-void AddFindModulesOperation(
-    OperationContainer* operation_container,
-    fuchsia::modular::ModuleResolver* const module_resolver,
-    fuchsia::modular::EntityResolver* const entity_resolver,
-    fuchsia::modular::IntentPtr intent,
-    std::vector<std::string> requesting_module_path,
-    std::function<void(fuchsia::modular::ExecuteResult,
-                       fuchsia::modular::FindModulesResponse)>
-        result_call) {
-  operation_container->Add(new FindModulesCall(
-      module_resolver, entity_resolver, std::move(intent),
-      std::move(requesting_module_path), std::move(result_call)));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.h b/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.h
deleted file mode 100644
index dcd34af..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_FIND_MODULES_CALL_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_FIND_MODULES_CALL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-
-namespace modular {
-
-void AddFindModulesOperation(
-    OperationContainer* operation_container,
-    fuchsia::modular::ModuleResolver* module_resolver,
-    fuchsia::modular::EntityResolver* entity_resolver,
-    fuchsia::modular::IntentPtr intent,
-    std::vector<std::string> requesting_module_path,
-    std::function<void(fuchsia::modular::ExecuteResult,
-                       fuchsia::modular::FindModulesResponse)>
-        result_call);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_FIND_MODULES_CALL_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_link_path_for_parameter_name_call.cc b/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_link_path_for_parameter_name_call.cc
deleted file mode 100644
index fc57d28..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_link_path_for_parameter_name_call.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_link_path_for_parameter_name_call.h"
-
-#include "peridot/lib/fidl/clone.h"
-
-namespace modular {
-
-namespace {
-
-class GetLinkPathForParameterNameCall
-    : public Operation<fuchsia::modular::LinkPathPtr> {
- public:
-  GetLinkPathForParameterNameCall(StoryStorage* const story_storage,
-                                  std::vector<std::string> module_name,
-                                  std::string link_name,
-                                  ResultCall result_call)
-      : Operation("AddModCommandRunner::GetLinkPathForParameterNameCall",
-                  std::move(result_call)),
-        story_storage_(story_storage),
-        module_name_(std::move(module_name)),
-        link_name_(std::move(link_name)),
-        link_path_(nullptr) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &link_path_};
-    story_storage_->ReadModuleData(module_name_)
-        ->Then([this, flow](fuchsia::modular::ModuleDataPtr module_data) {
-          if (!module_data) {
-            return;
-          }
-          auto& param_map = module_data->parameter_map;
-          auto it = std::find_if(
-              param_map.entries.begin(), param_map.entries.end(),
-              [this](const fuchsia::modular::ModuleParameterMapEntry& entry) {
-                return entry.name == link_name_;
-              });
-          if (it != param_map.entries.end()) {
-            link_path_ = CloneOptional(it->link_path);
-          }
-
-          if (!link_path_) {
-            link_path_ = fuchsia::modular::LinkPath::New();
-            link_path_->module_path = module_name_;
-            link_path_->link_name = link_name_;
-          }
-          // Flow goes out of scope, finish operation returning link_path.
-        });
-  }
-
-  StoryStorage* const story_storage_;  // Not owned.
-  std::vector<std::string> module_name_;
-  std::string link_name_;
-  fuchsia::modular::LinkPathPtr link_path_;
-};
-
-}  // namespace
-
-void AddGetLinkPathForParameterNameOperation(
-    OperationContainer* const operation_container,
-    StoryStorage* const story_storage,
-    std::vector<std::string> module_name, std::string link_name,
-    std::function<void(fuchsia::modular::LinkPathPtr)> result_call) {
-  operation_container->Add(new GetLinkPathForParameterNameCall(
-      story_storage, std::move(module_name), std::move(link_name),
-      std::move(result_call)));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_link_path_for_parameter_name_call.h b/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_link_path_for_parameter_name_call.h
deleted file mode 100644
index cbe901f..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_link_path_for_parameter_name_call.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_GET_LINK_PATH_FOR_PARAMETER_NAME_CALL_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_GET_LINK_PATH_FOR_PARAMETER_NAME_CALL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-
-namespace modular {
-
-void AddGetLinkPathForParameterNameOperation(
-    OperationContainer* operation_container, StoryStorage* const story_storage,
-    std::vector<std::string> module_name, std::string link_name,
-    std::function<void(fuchsia::modular::LinkPathPtr)> result_call);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_GET_LINK_PATH_FOR_PARAMETER_NAME_CALL_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_types_from_entity_call.cc b/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_types_from_entity_call.cc
deleted file mode 100644
index 7bf4020..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_types_from_entity_call.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_types_from_entity_call.h"
-
-#include <lib/fsl/types/type_converters.h>
-#include <lib/fxl/type_converter.h>
-
-namespace modular {
-
-namespace {
-
-class GetTypesFromEntityCall : public Operation<std::vector<std::string>> {
- public:
-  GetTypesFromEntityCall(
-      fuchsia::modular::EntityResolver* const entity_resolver,
-      const fidl::StringPtr& entity_reference, ResultCall result)
-      : Operation("GetTypesFromEntityCall", std::move(result)),
-        entity_resolver_(entity_resolver),
-        entity_reference_(entity_reference) {}
-
- private:
-  void Run() override {
-    entity_resolver_->ResolveEntity(entity_reference_, entity_.NewRequest());
-    entity_->GetTypes([this](const std::vector<std::string>& types) {
-      Done(types);
-    });
-  }
-
-  fuchsia::modular::EntityResolver* const entity_resolver_;
-  fidl::StringPtr const entity_reference_;
-  fuchsia::modular::EntityPtr entity_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(GetTypesFromEntityCall);
-};
-
-}  // namespace
-
-void AddGetTypesFromEntityOperation(
-    OperationContainer* const operation_container,
-    fuchsia::modular::EntityResolver* const entity_resolver,
-    const fidl::StringPtr& entity_reference,
-    std::function<void(std::vector<std::string>)> result_call) {
-  operation_container->Add(new GetTypesFromEntityCall(
-      entity_resolver, entity_reference, std::move(result_call)));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_types_from_entity_call.h b/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_types_from_entity_call.h
deleted file mode 100644
index 877da92..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_types_from_entity_call.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_GET_TYPES_FROM_ENTITY_CALL_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_GET_TYPES_FROM_ENTITY_CALL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-
-namespace modular {
-
-void AddGetTypesFromEntityOperation(
-    OperationContainer* operation_container,
-    fuchsia::modular::EntityResolver* entity_resolver,
-    const fidl::StringPtr& entity_reference,
-    std::function<void(std::vector<std::string>)> result_call);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_GET_TYPES_FROM_ENTITY_CALL_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/initialize_chain_call.cc b/bin/sessionmgr/puppet_master/command_runners/operation_calls/initialize_chain_call.cc
deleted file mode 100644
index 0fd3d38..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/initialize_chain_call.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/initialize_chain_call.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/set_link_value_call.h"
-
-#include <lib/fsl/vmo/strings.h>
-
-namespace modular {
-
-namespace {
-
-// Populates a fuchsia::modular::ModuleParameterMap struct from a
-// fuchsia::modular::CreateModuleParameterMapInfo struct. May create new Links
-// for any fuchsia::modular::CreateModuleParameterMapInfo.property_info if
-// property_info[i].is_create_link_info().
-class InitializeChainCall
-    : public Operation<fuchsia::modular::ExecuteResult,
-                       fuchsia::modular::ModuleParameterMapPtr> {
- public:
-  InitializeChainCall(StoryStorage* const story_storage,
-                      std::vector<std::string> module_path,
-                      fuchsia::modular::CreateModuleParameterMapInfoPtr
-                          create_parameter_map_info,
-                      ResultCall result_call)
-      : Operation("InitializeChainCall", std::move(result_call)),
-        story_storage_(story_storage),
-        module_path_(std::move(module_path)),
-        create_parameter_map_info_(std::move(create_parameter_map_info)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &result_, &parameter_map_};
-
-    parameter_map_ = fuchsia::modular::ModuleParameterMap::New();
-    parameter_map_->entries.resize(0);
-
-    if (!create_parameter_map_info_) {
-      return;
-    }
-
-    // For each property in |create_parameter_map_info_|, either:
-    // a) Copy the |link_path| to |result_| directly or
-    // b) Create & populate a new Link and add the correct mapping to
-    // |result_|.
-    for (auto& entry : *create_parameter_map_info_->property_info) {
-      const auto& key = entry.key;
-      const auto& info = entry.value;
-
-      auto mapping = fuchsia::modular::ModuleParameterMapEntry::New();
-      mapping->name = key;
-      if (info.is_link_path()) {
-        info.link_path().Clone(&mapping->link_path);
-      } else {  // info->is_create_link()
-        mapping->link_path.module_path.resize(0);
-        for (const auto& i : module_path_) {
-          mapping->link_path.module_path.push_back(i);
-        }
-        mapping->link_path.link_name = key;
-
-        // We issue N UpdateLinkValue calls and capture |flow| on each. We rely
-        // on the fact that once all refcounted instances of |flow| are
-        // destroyed, the InitializeChainCall will automatically finish.
-        std::string initial_json;
-        if (info.create_link().initial_data.size > 0) {
-          FXL_CHECK(fsl::StringFromVmo(info.create_link().initial_data,
-                                       &initial_json));
-        }
-        fuchsia::modular::LinkPath out_path;
-        mapping->link_path.Clone(&out_path);
-        AddSetLinkValueOperation(
-            &operations_, story_storage_, std::move(out_path),
-            [initial_json](fidl::StringPtr* value) { *value = initial_json; },
-            [this, flow](fuchsia::modular::ExecuteResult result) {
-              if (result.status != fuchsia::modular::ExecuteStatus::OK) {
-                result_ = std::move(result);
-              }
-            });
-      }
-
-      parameter_map_->entries.push_back(std::move(*mapping));
-    }
-  }
-
-  StoryStorage* const story_storage_;
-  const std::vector<std::string> module_path_;
-  const fuchsia::modular::CreateModuleParameterMapInfoPtr
-      create_parameter_map_info_;
-  fuchsia::modular::ModuleParameterMapPtr parameter_map_;
-  fuchsia::modular::ExecuteResult result_;
-  OperationCollection operations_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(InitializeChainCall);
-};
-
-}  // namespace
-
-void AddInitializeChainOperation(
-    OperationContainer* const operation_container,
-    StoryStorage* const story_storage,
-    std::vector<std::string> module_path,
-    fuchsia::modular::CreateModuleParameterMapInfoPtr create_parameter_map_info,
-    std::function<void(fuchsia::modular::ExecuteResult,
-                       fuchsia::modular::ModuleParameterMapPtr)>
-        result_call) {
-  operation_container->Add(new InitializeChainCall(
-      story_storage, std::move(module_path),
-      std::move(create_parameter_map_info), std::move(result_call)));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/initialize_chain_call.h b/bin/sessionmgr/puppet_master/command_runners/operation_calls/initialize_chain_call.h
deleted file mode 100644
index 9977376..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/initialize_chain_call.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_INITIALIZE_CHAIN_CALL_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_INITIALIZE_CHAIN_CALL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-
-namespace modular {
-
-void AddInitializeChainOperation(
-    OperationContainer* operation_container, StoryStorage* story_storage,
-    std::vector<std::string> module_path,
-    fuchsia::modular::CreateModuleParameterMapInfoPtr create_parameter_map_info,
-    std::function<void(fuchsia::modular::ExecuteResult,
-                       fuchsia::modular::ModuleParameterMapPtr)>
-        result_call);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_INITIALIZE_CHAIN_CALL_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/set_link_value_call.cc b/bin/sessionmgr/puppet_master/command_runners/operation_calls/set_link_value_call.cc
deleted file mode 100644
index 6b55dd7..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/set_link_value_call.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/set_link_value_call.h"
-
-namespace modular {
-
-namespace {
-
-class SetLinkValueCall : public Operation<fuchsia::modular::ExecuteResult> {
- public:
-  SetLinkValueCall(StoryStorage* const story_storage,
-                   fuchsia::modular::LinkPath link_path,
-                   std::function<void(fidl::StringPtr*)> mutate_fn,
-                   ResultCall done)
-      : Operation("SetLinkValueCall", std::move(done)),
-        story_storage_(story_storage),
-        link_path_(std::move(link_path)),
-        mutate_fn_(std::move(mutate_fn)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &result_};
-    auto did_update = story_storage_->UpdateLinkValue(link_path_, mutate_fn_,
-                                                      this /* context */);
-    did_update->Then([this, flow](StoryStorage::Status status) {
-      if (status == StoryStorage::Status::OK) {
-        result_.status = fuchsia::modular::ExecuteStatus::OK;
-      } else {
-        result_.status = fuchsia::modular::ExecuteStatus::INTERNAL_ERROR;
-        std::stringstream stream;
-        stream << "StoryStorage error status: " << (uint32_t)status;
-        result_.error_message = stream.str();
-      }
-    });
-  }
-
-  fidl::StringPtr story_id_;
-  StoryStorage* const story_storage_;
-  fuchsia::modular::LinkPath link_path_;
-  std::function<void(fidl::StringPtr*)> mutate_fn_;
-  fuchsia::modular::ExecuteResult result_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SetLinkValueCall);
-};
-
-}  // namespace
-
-void AddSetLinkValueOperation(
-    OperationContainer* const operation_container,
-    StoryStorage* const story_storage, fuchsia::modular::LinkPath link_path,
-    std::function<void(fidl::StringPtr*)> mutate_fn,
-    std::function<void(fuchsia::modular::ExecuteResult)> done) {
-  operation_container->Add(
-      new SetLinkValueCall(story_storage, std::move(link_path),
-                           std::move(mutate_fn), std::move(done)));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/operation_calls/set_link_value_call.h b/bin/sessionmgr/puppet_master/command_runners/operation_calls/set_link_value_call.h
deleted file mode 100644
index a20d666..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/operation_calls/set_link_value_call.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_SET_LINK_VALUE_CALL_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_SET_LINK_VALUE_CALL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-
-namespace modular {
-
-void AddSetLinkValueOperation(
-    OperationContainer* const operation_container,
-    StoryStorage* const story_storage, fuchsia::modular::LinkPath link_path,
-    std::function<void(fidl::StringPtr*)> mutate_fn,
-    std::function<void(fuchsia::modular::ExecuteResult)> done);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_OPERATION_CALLS_SET_LINK_VALUE_CALL_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner.cc b/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner.cc
deleted file mode 100644
index 23f049f..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner.h"
-
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-namespace {
-
-class RemoveModCall : public Operation<fuchsia::modular::ExecuteResult> {
- public:
-  RemoveModCall(StoryStorage* const story_storage, fidl::StringPtr story_id,
-                fuchsia::modular::RemoveMod command, ResultCall done)
-      : Operation("RemoveModCommandRunner::RemoveModCall", std::move(done)),
-        story_storage_(story_storage),
-        story_id_(std::move(story_id)),
-        command_(std::move(command)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &result_};
-    // Set the module data stopped to true, this should notify story
-    // controller and perform module teardown.
-    story_storage_
-        ->UpdateModuleData(
-            command_.mod_name,
-            [this, flow](fuchsia::modular::ModuleDataPtr* module_data) {
-              if (!(*module_data)) {
-                result_.status = fuchsia::modular::ExecuteStatus::INVALID_MOD;
-                result_.error_message = "No module data for given name.";
-                return;
-              }
-              (*module_data)->module_deleted = true;
-              result_.status = fuchsia::modular::ExecuteStatus::OK;
-            })
-        ->Then([this, flow] {});
-  }
-
-  StoryStorage* const story_storage_;
-  fidl::StringPtr story_id_;
-  fuchsia::modular::RemoveMod command_;
-  fuchsia::modular::ExecuteResult result_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(RemoveModCall);
-};
-
-}  // namespace
-
-RemoveModCommandRunner::RemoveModCommandRunner() = default;
-RemoveModCommandRunner::~RemoveModCommandRunner() = default;
-
-void RemoveModCommandRunner::Execute(
-    fidl::StringPtr story_id, StoryStorage* const story_storage,
-    fuchsia::modular::StoryCommand command,
-    std::function<void(fuchsia::modular::ExecuteResult)> done) {
-  FXL_CHECK(command.is_remove_mod());
-
-  operation_queue_.Add(new RemoveModCall(story_storage, std::move(story_id),
-                                         std::move(command.remove_mod()),
-                                         std::move(done)));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner.h b/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner.h
deleted file mode 100644
index 99cbcb9..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_REMOVE_MOD_COMMAND_RUNNER_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_REMOVE_MOD_COMMAND_RUNNER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/command_runner.h"
-
-namespace modular {
-
-class RemoveModCommandRunner : public CommandRunner {
- public:
-  RemoveModCommandRunner();
-  ~RemoveModCommandRunner() override;
-
-  void Execute(
-      fidl::StringPtr story_id, StoryStorage* story_storage,
-      fuchsia::modular::StoryCommand command,
-      std::function<void(fuchsia::modular::ExecuteResult)> done) override;
-
- private:
-  OperationQueue operation_queue_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_REMOVE_MOD_COMMAND_RUNNER_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner_unittest.cc b/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner_unittest.cc
deleted file mode 100644
index 302356e..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner_unittest.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner.h"
-
-#include "gtest/gtest.h"
-#include "peridot/lib/testing/test_with_session_storage.h"
-
-namespace modular {
-namespace {
-
-class RemoveModCommandRunnerTest : public testing::TestWithSessionStorage {
- protected:
-  std::unique_ptr<RemoveModCommandRunner> MakeRunner() {
-    return std::make_unique<RemoveModCommandRunner>();
-  }
-
-  std::vector<std::string> MakeModulePath(std::string path) {
-    std::vector<std::string> module_path;
-    module_path.push_back(path);
-    return module_path;
-  }
-
-  void InitModuleData(StoryStorage* const story_storage,
-                      std::vector<std::string> path) {
-    fuchsia::modular::ModuleData module_data;
-    module_data.module_path = std::move(path);
-    module_data.intent = fuchsia::modular::Intent::New();
-    module_data.module_deleted = false;
-
-    WriteModuleData(story_storage, std::move(module_data));
-  }
-};
-
-TEST_F(RemoveModCommandRunnerTest, Execute) {
-  auto storage = MakeSessionStorage("page");
-  auto runner = MakeRunner();
-  auto story_id = CreateStory(storage.get());
-  auto story_storage = GetStoryStorage(storage.get(), story_id);
-
-  auto mod_name = MakeModulePath("mod");
-  InitModuleData(story_storage.get(), mod_name);
-
-  fuchsia::modular::RemoveMod remove_mod;
-  remove_mod.mod_name = mod_name;
-  fuchsia::modular::StoryCommand command;
-  command.set_remove_mod(std::move(remove_mod));
-
-  bool done{};
-  runner->Execute(story_id, story_storage.get(), std::move(command),
-                  [&](fuchsia::modular::ExecuteResult result) {
-                    EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                              result.status);
-                    done = true;
-                  });
-  RunLoopUntil([&] { return done; });
-
-  done = false;
-  story_storage->ReadModuleData(std::move(mod_name))
-      ->Then([&](fuchsia::modular::ModuleDataPtr module_data) {
-        EXPECT_TRUE(module_data->module_deleted);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(RemoveModCommandRunnerTest, ExecuteNoModuleData) {
-  auto storage = MakeSessionStorage("page");
-  auto runner = MakeRunner();
-  auto story_id = CreateStory(storage.get());
-  auto story_storage = GetStoryStorage(storage.get(), story_id);
-
-  auto mod_name = MakeModulePath("mod");
-  fuchsia::modular::RemoveMod remove_mod;
-  remove_mod.mod_name = std::move(mod_name);
-  fuchsia::modular::StoryCommand command;
-  command.set_remove_mod(std::move(remove_mod));
-
-  bool done{};
-  runner->Execute(
-      story_id, story_storage.get(), std::move(command),
-      [&](fuchsia::modular::ExecuteResult result) {
-        EXPECT_EQ(fuchsia::modular::ExecuteStatus::INVALID_MOD, result.status);
-        EXPECT_EQ(result.error_message, "No module data for given name.");
-        done = true;
-      });
-
-  RunLoopUntil([&] { return done; });
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner.cc b/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner.cc
deleted file mode 100644
index 71b7ed9..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner.h"
-
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-SetFocusStateCommandRunner::SetFocusStateCommandRunner(
-    fuchsia::modular::FocusProviderPtr focus_provider)
-    : focus_provider_(std::move(focus_provider)) {}
-
-SetFocusStateCommandRunner::~SetFocusStateCommandRunner() = default;
-
-void SetFocusStateCommandRunner::Execute(
-    fidl::StringPtr story_id, StoryStorage* const story_storage,
-    fuchsia::modular::StoryCommand command,
-    std::function<void(fuchsia::modular::ExecuteResult)> done) {
-  FXL_CHECK(command.is_set_focus_state());
-
-  fuchsia::modular::ExecuteResult result;
-  result.status = fuchsia::modular::ExecuteStatus::OK;
-
-  if (command.set_focus_state().focused) {
-    focus_provider_->Request(story_id);
-  } else {
-    // According to FIDL docs a null |story_id| brings the timeline into
-    // focus, defocusing any story.
-    focus_provider_->Request(nullptr);
-  }
-
-  done(std::move(result));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner.h b/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner.h
deleted file mode 100644
index 512c0fb..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_SET_FOCUS_STATE_COMMAND_RUNNER_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_SET_FOCUS_STATE_COMMAND_RUNNER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/command_runner.h"
-
-namespace modular {
-
-class SetFocusStateCommandRunner : public CommandRunner {
- public:
-  SetFocusStateCommandRunner(fuchsia::modular::FocusProviderPtr focus_provider);
-  ~SetFocusStateCommandRunner() override;
-
-  void Execute(
-      fidl::StringPtr story_id, StoryStorage* story_storage,
-      fuchsia::modular::StoryCommand command,
-      std::function<void(fuchsia::modular::ExecuteResult)> done) override;
-
- private:
-  fuchsia::modular::FocusProviderPtr focus_provider_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_SET_FOCUS_STATE_COMMAND_RUNNER_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner_unittest.cc b/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner_unittest.cc
deleted file mode 100644
index ac3642b..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner_unittest.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner.h"
-
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-class FocusHandler : fuchsia::modular::FocusProvider {
- public:
-  FocusHandler() {}
-
-  void AddProviderBinding(
-      fidl::InterfaceRequest<fuchsia::modular::FocusProvider> request) {
-    provider_bindings_.AddBinding(this, std::move(request));
-  };
-
-  std::string request_called_with_story_id() {
-    return request_called_with_story_id_;
-  }
-
-  // |fuchsia::modular::FocusProvider|
-  void Request(fidl::StringPtr story_id) override {
-    request_called_with_story_id_ = story_id;
-  };
-  void Query(QueryCallback callback) override{};
-  void Watch(
-      fidl::InterfaceHandle<fuchsia::modular::FocusWatcher> watcher) override{};
-
- private:
-  std::string request_called_with_story_id_;
-  fidl::BindingSet<fuchsia::modular::FocusProvider> provider_bindings_;
-};
-
-class SetFocusStateCommandRunnerTest : public gtest::TestLoopFixture {
- public:
-  void SetUp() override {
-    fidl::InterfacePtr<fuchsia::modular::FocusProvider> focus_provider;
-    focus_handler_.AddProviderBinding(focus_provider.NewRequest());
-    runner_ =
-        std::make_unique<SetFocusStateCommandRunner>(std::move(focus_provider));
-  }
-
- protected:
-  FocusHandler focus_handler_;
-  std::unique_ptr<SetFocusStateCommandRunner> runner_;
-};
-
-TEST_F(SetFocusStateCommandRunnerTest, Focus) {
-  fuchsia::modular::SetFocusState set_focus_state;
-  set_focus_state.focused = true;
-  fuchsia::modular::StoryCommand command;
-  command.set_set_focus_state(std::move(set_focus_state));
-
-  runner_->Execute("story1", nullptr /* story_storage */, std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                               result.status);
-                   });
-
-  RunLoopUntilIdle();
-  EXPECT_EQ("story1", focus_handler_.request_called_with_story_id());
-}
-
-TEST_F(SetFocusStateCommandRunnerTest, Unfocus) {
-  fuchsia::modular::SetFocusState set_focus_state;
-  set_focus_state.focused = false;
-  fuchsia::modular::StoryCommand command;
-  command.set_set_focus_state(std::move(set_focus_state));
-
-  runner_->Execute(
-      nullptr /* story_id */, nullptr /* story_storage */, std::move(command),
-      [&](fuchsia::modular::ExecuteResult result) {
-        EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK, result.status);
-      });
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(focus_handler_.request_called_with_story_id().empty());
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner.cc b/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner.cc
deleted file mode 100644
index 72bdb44..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner.h"
-
-namespace modular {
-
-class SetKindOfProtoStoryOptionCall
-    : public Operation<fuchsia::modular::ExecuteResult> {
- public:
-  SetKindOfProtoStoryOptionCall(SessionStorage* const session_storage,
-                                fidl::StringPtr story_id, bool value,
-                                ResultCall done)
-      : Operation("SetKindOfProtoStoryOption::SetKindOfProtoStoryOptionCall",
-                  std::move(done)),
-        session_storage_(session_storage),
-        story_id_(story_id),
-        value_(value) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &result_};
-    result_.status = fuchsia::modular::ExecuteStatus::OK;
-    session_storage_->GetStoryData(story_id_)->Then(
-        [this, flow](fuchsia::modular::internal::StoryDataPtr data) {
-          if (data->story_options.kind_of_proto_story == value_) {
-            // Finish early since there's nothing to update.
-            return;
-          }
-          data->story_options.Clone(&options_);
-          UpdateOptions(flow);
-        });
-  }
-
-  void UpdateOptions(FlowToken flow) {
-    options_.kind_of_proto_story = value_;
-    session_storage_->UpdateStoryOptions(story_id_, std::move(options_))
-        ->Then([flow]() {});  // Operation finishes when flow goes out of scope.
-  }
-
-  SessionStorage* const session_storage_;
-  fidl::StringPtr story_id_;
-  bool value_;
-  fuchsia::modular::StoryOptions options_;
-  fuchsia::modular::ExecuteResult result_;
-};
-
-SetKindOfProtoStoryOptionCommandRunner::SetKindOfProtoStoryOptionCommandRunner(
-    SessionStorage* const session_storage)
-    : session_storage_(session_storage) {
-  FXL_DCHECK(session_storage_);
-}
-
-SetKindOfProtoStoryOptionCommandRunner::
-    ~SetKindOfProtoStoryOptionCommandRunner() = default;
-
-void SetKindOfProtoStoryOptionCommandRunner::Execute(
-    fidl::StringPtr story_id, StoryStorage* const story_storage,
-    fuchsia::modular::StoryCommand command,
-    std::function<void(fuchsia::modular::ExecuteResult)> done) {
-  FXL_CHECK(command.is_set_kind_of_proto_story_option());
-
-  operation_queue_.Add(new SetKindOfProtoStoryOptionCall(
-      session_storage_, story_id,
-      command.set_kind_of_proto_story_option().value, std::move(done)));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner.h b/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner.h
deleted file mode 100644
index 99ba15f..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_SET_KIND_OF_PROTO_STORY_OPTION_COMMAND_RUNNER_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_SET_KIND_OF_PROTO_STORY_OPTION_COMMAND_RUNNER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/command_runner.h"
-
-namespace modular {
-
-class SetKindOfProtoStoryOptionCommandRunner : public CommandRunner {
- public:
-  SetKindOfProtoStoryOptionCommandRunner(SessionStorage* const session_storage);
-  ~SetKindOfProtoStoryOptionCommandRunner() override;
-
-  void Execute(
-      fidl::StringPtr story_id, StoryStorage* story_storage,
-      fuchsia::modular::StoryCommand command,
-      std::function<void(fuchsia::modular::ExecuteResult)> done) override;
-
- private:
-  OperationQueue operation_queue_;
-  SessionStorage* const session_storage_;  // Not owned.
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_SET_KIND_OF_PROTO_STORY_OPTION_COMMAND_RUNNER_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner_unittest.cc b/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner_unittest.cc
deleted file mode 100644
index 84c2bc9..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner_unittest.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner.h"
-
-#include <lib/fsl/vmo/strings.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/testing/test_with_session_storage.h"
-
-namespace modular {
-namespace {
-
-class SetKindOfProtoStoryOptionCommandRunnerTest
-    : public testing::TestWithSessionStorage {
- public:
-  void SetUp() override {
-    testing::TestWithSessionStorage::SetUp();
-    session_storage_ = MakeSessionStorage("page");
-    runner_ = MakeRunner();
-    story_id_ = CreateStory(session_storage_.get());
-  }
-
- protected:
-  std::unique_ptr<SetKindOfProtoStoryOptionCommandRunner> MakeRunner() {
-    return std::make_unique<SetKindOfProtoStoryOptionCommandRunner>(
-        session_storage_.get());
-  }
-
-  std::unique_ptr<SessionStorage> session_storage_;
-  std::unique_ptr<SetKindOfProtoStoryOptionCommandRunner> runner_;
-  std::string story_id_;
-};
-
-TEST_F(SetKindOfProtoStoryOptionCommandRunnerTest, Execute) {
-  fuchsia::modular::StoryCommand command;
-  fuchsia::modular::SetKindOfProtoStoryOption set_kind_of_proto_story_option;
-  bool done{};
-
-  // Set a value.
-  {
-    set_kind_of_proto_story_option.value = true;
-    command.set_set_kind_of_proto_story_option(
-        std::move(set_kind_of_proto_story_option));
-    runner_->Execute(story_id_, nullptr /* story_storage */, std::move(command),
-                     [&](fuchsia::modular::ExecuteResult result) {
-                       EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                                 result.status);
-                       done = true;
-                     });
-    RunLoopUntil([&] { return done; });
-  }
-
-  // Verify it was written.
-  done = false;
-  session_storage_->GetStoryData(story_id_)->Then(
-      [&](fuchsia::modular::internal::StoryDataPtr data) {
-        EXPECT_TRUE(data->story_options.kind_of_proto_story);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-
-  // Update the value.
-  {
-    set_kind_of_proto_story_option.value = false;
-    command.set_set_kind_of_proto_story_option(
-        std::move(set_kind_of_proto_story_option));
-    done = false;
-    runner_->Execute(story_id_, nullptr /* story_storage */, std::move(command),
-                     [&](fuchsia::modular::ExecuteResult result) {
-                       EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                                 result.status);
-                       done = true;
-                     });
-    RunLoopUntil([&] { return done; });
-  }
-
-  // Verify second value.
-  done = false;
-  session_storage_->GetStoryData(story_id_)->Then(
-      [&](fuchsia::modular::internal::StoryDataPtr data) {
-        EXPECT_FALSE(data->story_options.kind_of_proto_story);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner.cc b/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner.cc
deleted file mode 100644
index 8ca7c7a..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner.h"
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/set_link_value_call.h"
-
-namespace modular {
-
-SetLinkValueCommandRunner::SetLinkValueCommandRunner() = default;
-SetLinkValueCommandRunner::~SetLinkValueCommandRunner() = default;
-
-void SetLinkValueCommandRunner::Execute(
-    fidl::StringPtr story_id, StoryStorage* const story_storage,
-    fuchsia::modular::StoryCommand command,
-    std::function<void(fuchsia::modular::ExecuteResult)> done) {
-  FXL_CHECK(command.is_set_link_value());
-
-  AddSetLinkValueOperation(
-      &operation_queue_, story_storage,
-      std::move(command.set_link_value().path),
-      fxl::MakeCopyable(
-          [this, new_value = std::move(command.set_link_value().value)](
-              fidl::StringPtr* value) {
-            std::string str_value;
-            FXL_CHECK(fsl::StringFromVmo(*new_value, &str_value));
-            *value = str_value;
-          }),
-      std::move(done));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner.h b/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner.h
deleted file mode 100644
index e59d314..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_SET_LINK_VALUE_COMMAND_RUNNER_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_SET_LINK_VALUE_COMMAND_RUNNER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/command_runner.h"
-
-namespace modular {
-
-class SetLinkValueCommandRunner : public CommandRunner {
- public:
-  SetLinkValueCommandRunner();
-  ~SetLinkValueCommandRunner() override;
-
-  void Execute(
-      fidl::StringPtr story_id, StoryStorage* story_storage,
-      fuchsia::modular::StoryCommand command,
-      std::function<void(fuchsia::modular::ExecuteResult)> done) override;
-
- private:
-  OperationQueue operation_queue_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_COMMAND_RUNNERS_SET_LINK_VALUE_COMMAND_RUNNER_H_
diff --git a/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner_unittest.cc b/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner_unittest.cc
deleted file mode 100644
index abe6469..0000000
--- a/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner_unittest.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner.h"
-
-#include <lib/fsl/vmo/strings.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/testing/test_with_session_storage.h"
-
-namespace modular {
-namespace {
-
-class SetLinkValueCommandRunnerTest : public testing::TestWithSessionStorage {
- public:
-  void SetUp() override {
-    testing::TestWithSessionStorage::SetUp();
-    session_storage_ = MakeSessionStorage("page");
-    runner_ = MakeRunner();
-    story_id_ = CreateStory(session_storage_.get());
-    story_storage_ = GetStoryStorage(session_storage_.get(), story_id_);
-  }
-
- protected:
-  std::unique_ptr<SetLinkValueCommandRunner> MakeRunner() {
-    return std::make_unique<SetLinkValueCommandRunner>();
-  }
-
-  fuchsia::modular::StoryCommand MakeSetLinkValueCommand(
-      const std::string& path_name, const std::string& value) {
-    fsl::SizedVmo vmo;
-    fsl::VmoFromString(value, &vmo);
-    fuchsia::modular::SetLinkValue set_link_value;
-    set_link_value.path = MakeLinkPath(path_name);
-    set_link_value.value =
-        std::make_unique<fuchsia::mem::Buffer>(std::move(vmo).ToTransport());
-    fuchsia::modular::StoryCommand command;
-    command.set_set_link_value(std::move(set_link_value));
-    return command;
-  }
-
-  std::unique_ptr<SessionStorage> session_storage_;
-  std::unique_ptr<StoryStorage> story_storage_;
-  std::unique_ptr<SetLinkValueCommandRunner> runner_;
-  std::string story_id_;
-};
-
-// On an empty story, it sets a link with a value, then updates it. Each time
-// verifying that the link value is the expected one.
-TEST_F(SetLinkValueCommandRunnerTest, Execute) {
-  bool done{};
-
-  // Let's set a value.
-  auto command = MakeSetLinkValueCommand("link", "10");
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                               result.status);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-  done = false;
-
-  // Let's get the value.
-  EXPECT_EQ("10", GetLinkValue(story_storage_.get(), "link"));
-
-  // Mutate again.
-  auto command2 = MakeSetLinkValueCommand("link", "20");
-  runner_->Execute(story_id_, story_storage_.get(), std::move(command2),
-                   [&](fuchsia::modular::ExecuteResult result) {
-                     EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK,
-                               result.status);
-                     done = true;
-                   });
-  RunLoopUntil([&] { return done; });
-  done = false;
-
-  // Let's get the value again, we should see the new one.
-  EXPECT_EQ("20", GetLinkValue(story_storage_.get(), "link"));
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/dispatch_story_command_executor.cc b/bin/sessionmgr/puppet_master/dispatch_story_command_executor.cc
deleted file mode 100644
index f1d245f..0000000
--- a/bin/sessionmgr/puppet_master/dispatch_story_command_executor.cc
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/dispatch_story_command_executor.h"
-
-#include <map>
-
-#include <lib/async/cpp/future.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-namespace modular {
-
-namespace {
-
-class RunStoryCommandCall : public Operation<fuchsia::modular::ExecuteResult> {
- public:
-  RunStoryCommandCall(const char* const command_name,
-                      CommandRunner* const runner,
-                      StoryStorage* const story_storage,
-                      fidl::StringPtr story_id,
-                      fuchsia::modular::StoryCommand command, ResultCall done)
-      : Operation(command_name, std::move(done), ""),
-        command_(std::move(command)),
-        story_storage_(story_storage),
-        story_id_(std::move(story_id)),
-        runner_(runner) {}
-
- private:
-  // |OperationBase|
-  void Run() override {
-    auto done = [this](fuchsia::modular::ExecuteResult result) {
-      Done(std::move(result));
-    };
-    runner_->Execute(story_id_, story_storage_, std::move(command_),
-                     std::move(done));
-  }
-
-  fuchsia::modular::StoryCommand command_;
-  StoryStorage* const story_storage_;
-  const fidl::StringPtr story_id_;
-  CommandRunner* runner_;
-};
-
-}  // namespace
-
-class DispatchStoryCommandExecutor::ExecuteStoryCommandsCall
-    : public Operation<fuchsia::modular::ExecuteResult> {
- public:
-  ExecuteStoryCommandsCall(DispatchStoryCommandExecutor* const executor,
-                           fidl::StringPtr story_id,
-                           std::vector<fuchsia::modular::StoryCommand> commands,
-                           ResultCall done)
-      : Operation("ExecuteStoryCommandsCall", std::move(done)),
-        executor_(executor),
-        story_id_(std::move(story_id)),
-        commands_(std::move(commands)) {}
-
-  ~ExecuteStoryCommandsCall() override = default;
-
- private:
-  void Run() override {
-    executor_->session_storage_->GetStoryStorage(story_id_)->WeakThen(
-        GetWeakPtr(), [this](std::unique_ptr<StoryStorage> story_storage) {
-          if (!story_storage) {
-            fuchsia::modular::ExecuteResult result;
-            result.status = fuchsia::modular::ExecuteStatus::INVALID_STORY_ID;
-            Done(result);
-            return;
-          }
-
-          story_storage_ = std::move(story_storage);
-          Cont();
-        });
-  }
-
-  void Cont() {
-    // TODO(thatguy): Add a WeakPtr check on |executor_|.
-
-    // Keep track of the number of commands we need to run. When they are all
-    // done, we complete this operation.
-    std::vector<FuturePtr<>> did_execute_commands;
-    did_execute_commands.reserve(commands_.size());
-
-    for (auto& command : commands_) {
-      auto tag_string_it =
-          executor_->story_command_tag_strings_.find(command.Which());
-      FXL_CHECK(tag_string_it != executor_->story_command_tag_strings_.end())
-          << "No fuchsia::modular::StoryCommand::Tag string for tag "
-          << static_cast<int>(command.Which());
-      const auto& tag_string = tag_string_it->second;
-
-      auto it = executor_->command_runners_.find(command.Which());
-      FXL_DCHECK(it != executor_->command_runners_.end())
-          << "Could not find a fuchsia::modular::StoryCommand runner for tag "
-          << static_cast<int>(command.Which()) << ": " << tag_string;
-
-      auto* const command_runner = it->second.get();
-      // NOTE: it is safe to capture |this| on the lambdas below because if
-      // |this| goes out of scope, |queue_| will be deleted, and the callbacks
-      // on |queue_| will not run.
-
-      auto did_execute_command =
-          Future<fuchsia::modular::ExecuteResult>::Create(
-              "DispatchStoryCommandExecutor.ExecuteStoryCommandsCall.Run.did_"
-              "execute_command");
-      queue_.Add(new RunStoryCommandCall(
-          tag_string, command_runner, story_storage_.get(), story_id_,
-          std::move(command), did_execute_command->Completer()));
-      auto did_execute_command_callback = did_execute_command->Then(
-          [this](fuchsia::modular::ExecuteResult result) {
-            // Check for error for this command. If there was an error, abort
-            // early. All of the remaining operations (if any) in queue_ will
-            // not be run.
-            if (result.status != fuchsia::modular::ExecuteStatus::OK) {
-              Done(std::move(result));
-            }
-          });
-      did_execute_commands.emplace_back(did_execute_command_callback);
-    }
-
-    Wait("DispatchStoryCommandExecutor.ExecuteStoryCommandsCall.Run.Wait",
-         did_execute_commands)
-        ->Then([this] {
-          fuchsia::modular::ExecuteResult result;
-          result.status = fuchsia::modular::ExecuteStatus::OK;
-          result.story_id = story_id_;
-          Done(std::move(result));
-        });
-  }
-
-  DispatchStoryCommandExecutor* const executor_;
-  const fidl::StringPtr story_id_;
-  std::vector<fuchsia::modular::StoryCommand> commands_;
-
-  std::unique_ptr<StoryStorage> story_storage_;
-
-  // All commands must be run in order so we use a queue.
-  OperationQueue queue_;
-};
-
-DispatchStoryCommandExecutor::DispatchStoryCommandExecutor(
-    SessionStorage* const session_storage,
-    std::map<fuchsia::modular::StoryCommand::Tag,
-             std::unique_ptr<CommandRunner>>
-        command_runners)
-    : session_storage_(session_storage),
-      command_runners_(std::move(command_runners)),
-      story_command_tag_strings_{
-          {fuchsia::modular::StoryCommand::Tag::kAddMod,
-           "StoryCommand::AddMod"},
-          {fuchsia::modular::StoryCommand::Tag::kFocusMod,
-           "StoryCommand::FocusMod"},
-          {fuchsia::modular::StoryCommand::Tag::kRemoveMod,
-           "StoryCommand::RemoveMod"},
-          {fuchsia::modular::StoryCommand::Tag::kSetLinkValue,
-           "StoryCommand::SetLinkValue"},
-          {fuchsia::modular::StoryCommand::Tag::kSetFocusState,
-           "StoryCommand::SetFocusState"},
-          {fuchsia::modular::StoryCommand::Tag::kSetKindOfProtoStoryOption,
-           "StoryCommand::SetKindOfProtoStoryOption"}} {
-  FXL_DCHECK(session_storage_ != nullptr);
-}
-
-DispatchStoryCommandExecutor::~DispatchStoryCommandExecutor() {}
-
-void DispatchStoryCommandExecutor::ExecuteCommandsInternal(
-    fidl::StringPtr story_id,
-    std::vector<fuchsia::modular::StoryCommand> commands,
-    std::function<void(fuchsia::modular::ExecuteResult)> done) {
-  operation_queues_[story_id].Add(new ExecuteStoryCommandsCall(
-      this, std::move(story_id), std::move(commands), std::move(done)));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/dispatch_story_command_executor.h b/bin/sessionmgr/puppet_master/dispatch_story_command_executor.h
deleted file mode 100644
index 1387110..0000000
--- a/bin/sessionmgr/puppet_master/dispatch_story_command_executor.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_DISPATCH_STORY_COMMAND_EXECUTOR_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_DISPATCH_STORY_COMMAND_EXECUTOR_H_
-
-#include <lib/fidl/cpp/string.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/command_runner.h"
-#include "peridot/bin/sessionmgr/puppet_master/story_command_executor.h"
-
-namespace modular {
-
-class OperationContainer;
-
-// An implementation of StoryCommandExecutor which dispatches execution of
-// individual StoryCommands to CommandRunners for each union tag of
-// fuchsia::modular::StoryCommand.
-class DispatchStoryCommandExecutor : public StoryCommandExecutor {
- public:
-  DispatchStoryCommandExecutor(SessionStorage* session_storage,
-                               std::map<fuchsia::modular::StoryCommand::Tag,
-                                        std::unique_ptr<CommandRunner>>
-                                   command_runners);
-  ~DispatchStoryCommandExecutor() override;
-
- private:
-  // |StoryCommandExecutor|
-  void ExecuteCommandsInternal(
-      fidl::StringPtr story_id,
-      std::vector<fuchsia::modular::StoryCommand> commands,
-      std::function<void(fuchsia::modular::ExecuteResult)> done) override;
-
-  class ExecuteStoryCommandsCall;
-
-  SessionStorage* const session_storage_;  // Not owned.
-  const std::map<fuchsia::modular::StoryCommand::Tag,
-                 std::unique_ptr<CommandRunner>>
-      command_runners_;
-
-  // Lookup table from fuchsia::modular::StoryCommand union tag to a
-  // human-readable string.
-  const std::map<fuchsia::modular::StoryCommand::Tag, const char*>
-      story_command_tag_strings_;
-
-  std::map<fidl::StringPtr, OperationQueue> operation_queues_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_DISPATCH_STORY_COMMAND_EXECUTOR_H_
diff --git a/bin/sessionmgr/puppet_master/dispatch_story_command_executor_unittest.cc b/bin/sessionmgr/puppet_master/dispatch_story_command_executor_unittest.cc
deleted file mode 100644
index bd4182a..0000000
--- a/bin/sessionmgr/puppet_master/dispatch_story_command_executor_unittest.cc
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/dispatch_story_command_executor.h"
-
-#include <map>
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/fidl/cpp/string.h>
-#include "peridot/lib/testing/test_with_ledger.h"
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-class TestCommandRunner : public CommandRunner {
- public:
-  using ExecuteFunc = std::function<fuchsia::modular::ExecuteStatus(
-      fidl::StringPtr, fuchsia::modular::StoryCommand)>;
-  TestCommandRunner(ExecuteFunc func, bool delay_done = false)
-      : func_(func), delay_done_(delay_done) {}
-  ~TestCommandRunner() override = default;
-
-  void Execute(
-      fidl::StringPtr story_id, StoryStorage* const story_storage,
-      fuchsia::modular::StoryCommand command,
-      std::function<void(fuchsia::modular::ExecuteResult)> done) override {
-    // Post the task on the dispatcher loop to simulate a long-running task.
-    async::PostTask(async_get_default_dispatcher(),
-                    [this, story_id, command = std::move(command),
-                     done = std::move(done)]() mutable {
-                      auto status = func_(story_id, std::move(command));
-                      fuchsia::modular::ExecuteResult result;
-                      result.status = status;
-                      if (delay_done_) {
-                        async::PostTask(async_get_default_dispatcher(),
-                                        [result = std::move(result),
-                                         done = std::move(done)]() {
-                                          done(std::move(result));
-                                        });
-                      } else {
-                        done(std::move(result));
-                      }
-                    });
-  }
-
-  ExecuteFunc func_;
-  bool delay_done_;
-};
-
-class DispatchStoryCommandExecutorTest
-    : public modular::testing::TestWithLedger {
- protected:
-  void SetUp() override {
-    TestWithLedger::SetUp();
-    session_storage_ =
-        std::make_unique<SessionStorage>(ledger_client(), LedgerPageId());
-  }
-
-  void Reset() {
-    executor_ = std::make_unique<DispatchStoryCommandExecutor>(
-        session_storage_.get(), std::move(command_runners_));
-  }
-
-  fidl::StringPtr CreateStory() {
-    bool done{};
-    fidl::StringPtr ret;
-    session_storage_->CreateStory({} /* extra_info */, {} /* story_options */)
-        ->Then([&](fidl::StringPtr story_id, fuchsia::ledger::PageId) {
-          ret = story_id;
-          done = true;
-        });
-
-    RunLoopUntil([&]() { return done; });
-    return ret;
-  }
-
-  void AddCommandRunner(fuchsia::modular::StoryCommand::Tag tag,
-                        TestCommandRunner::ExecuteFunc func,
-                        bool delay_done = false) {
-    command_runners_.emplace(tag, new TestCommandRunner(func, delay_done));
-  }
-
-  std::unique_ptr<SessionStorage> session_storage_;
-  std::unique_ptr<StoryCommandExecutor> executor_;
-  std::map<fuchsia::modular::StoryCommand::Tag, std::unique_ptr<CommandRunner>>
-      command_runners_;
-};
-
-TEST_F(DispatchStoryCommandExecutorTest, InvalidStory) {
-  Reset();
-
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  fuchsia::modular::ExecuteResult result;
-  bool done{false};
-  executor_->ExecuteCommands("id", std::move(commands),
-                             [&](fuchsia::modular::ExecuteResult r) {
-                               done = true;
-                               result = std::move(r);
-                             });
-
-  RunLoopUntil([&]() { return done; });
-  EXPECT_EQ(fuchsia::modular::ExecuteStatus::INVALID_STORY_ID, result.status);
-}
-
-TEST_F(DispatchStoryCommandExecutorTest, Dispatching) {
-  auto expected_story_id = CreateStory();
-
-  // We expect that each command is dispatched to the command runner for that
-  // command.
-  int actual_execute_count{0};
-  for (auto tag : {fuchsia::modular::StoryCommand::Tag::kAddMod,
-                   fuchsia::modular::StoryCommand::Tag::kRemoveMod,
-                   fuchsia::modular::StoryCommand::Tag::kSetLinkValue,
-                   fuchsia::modular::StoryCommand::Tag::kSetFocusState}) {
-    AddCommandRunner(tag, [tag, &actual_execute_count, expected_story_id](
-                              fidl::StringPtr story_id,
-                              fuchsia::modular::StoryCommand command) {
-      ++actual_execute_count;
-      EXPECT_EQ(tag, command.Which());
-      EXPECT_EQ(expected_story_id, story_id);
-      return fuchsia::modular::ExecuteStatus::OK;
-    });
-  }
-
-  Reset();
-
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  commands.resize(4);
-  commands[0].set_add_mod(fuchsia::modular::AddMod());
-  commands[1].set_remove_mod(fuchsia::modular::RemoveMod());
-  commands[2].set_set_link_value(fuchsia::modular::SetLinkValue());
-  commands[3].set_set_focus_state(fuchsia::modular::SetFocusState());
-
-  fuchsia::modular::ExecuteResult result;
-  bool done{false};
-  executor_->ExecuteCommands(expected_story_id, std::move(commands),
-                             [&](fuchsia::modular::ExecuteResult r) {
-                               done = true;
-                               result = std::move(r);
-                             });
-
-  RunLoopUntil([&]() { return done; });
-  EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK, result.status);
-  EXPECT_EQ(expected_story_id, result.story_id);
-  EXPECT_EQ(4, actual_execute_count);
-}
-
-TEST_F(DispatchStoryCommandExecutorTest, Sequential) {
-  auto story_id = CreateStory();
-
-  // Commands are run sequentially.
-  std::vector<std::string> names;
-  // We're going to run an fuchsia::modular::AddMod command first, but we'll
-  // push the "logic" onto the async loop so that, if the implementation
-  // posted all of our CommandRunner logic sequentially on the async loop, it
-  // would run after the commands following this one. That's what |delay_done|
-  // does.
-  AddCommandRunner(
-      fuchsia::modular::StoryCommand::Tag::kAddMod,
-      [&](fidl::StringPtr story_id, fuchsia::modular::StoryCommand command) {
-        names.push_back(command.add_mod().mod_name.at(0));
-        return fuchsia::modular::ExecuteStatus::OK;
-      },
-      true /* delay_done */);
-  AddCommandRunner(
-      fuchsia::modular::StoryCommand::Tag::kRemoveMod,
-      [&](fidl::StringPtr story_id, fuchsia::modular::StoryCommand command) {
-        names.push_back(command.remove_mod().mod_name.at(0));
-        return fuchsia::modular::ExecuteStatus::OK;
-      });
-
-  Reset();
-
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  commands.resize(2);
-  fuchsia::modular::AddMod add_mod;
-  add_mod.mod_name.push_back("one");
-  commands[0].set_add_mod(std::move(add_mod));
-  fuchsia::modular::RemoveMod remove_mod;
-  remove_mod.mod_name.push_back("two");
-  commands[1].set_remove_mod(std::move(remove_mod));
-
-  bool done{false};
-  executor_->ExecuteCommands(
-      story_id, std::move(commands),
-      [&](fuchsia::modular::ExecuteResult) { done = true; });
-  RunLoopUntil([&]() { return done; });
-
-  EXPECT_EQ(2u, names.size());
-  EXPECT_EQ("one", names[0]);
-  EXPECT_EQ("two", names[1]);
-}
-
-TEST_F(DispatchStoryCommandExecutorTest, ErrorsAbortEarly) {
-  auto story_id = CreateStory();
-
-  // Commands after those that report an error don't run. The reported error
-  // code is returned.
-  bool second_command_ran{false};
-  AddCommandRunner(
-      fuchsia::modular::StoryCommand::Tag::kAddMod,
-      [](fidl::StringPtr story_id, fuchsia::modular::StoryCommand command) {
-        return fuchsia::modular::ExecuteStatus::INVALID_COMMAND;
-      });
-  AddCommandRunner(
-      fuchsia::modular::StoryCommand::Tag::kRemoveMod,
-      [&](fidl::StringPtr story_id, fuchsia::modular::StoryCommand command) {
-        second_command_ran = true;
-        return fuchsia::modular::ExecuteStatus::OK;
-      });
-
-  Reset();
-
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  commands.resize(2);
-  commands[0].set_add_mod(fuchsia::modular::AddMod());
-  commands[1].set_remove_mod(fuchsia::modular::RemoveMod());
-
-  bool done{false};
-  fuchsia::modular::ExecuteResult result;
-  executor_->ExecuteCommands(story_id, std::move(commands),
-                             [&](fuchsia::modular::ExecuteResult r) {
-                               done = true;
-                               result = std::move(r);
-                             });
-  RunLoopUntil([&]() { return done; });
-
-  EXPECT_EQ(fuchsia::modular::ExecuteStatus::INVALID_COMMAND, result.status);
-  EXPECT_FALSE(second_command_ran);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/make_production_impl.cc b/bin/sessionmgr/puppet_master/make_production_impl.cc
deleted file mode 100644
index 0bcd27f..0000000
--- a/bin/sessionmgr/puppet_master/make_production_impl.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/make_production_impl.h"
-
-#include <memory>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/add_mod_command_runner.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/focus_mod_command_runner.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/remove_mod_command_runner.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/set_focus_state_command_runner.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/set_kind_of_proto_story_option_command_runner.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/set_link_value_command_runner.h"
-#include "peridot/bin/sessionmgr/puppet_master/dispatch_story_command_executor.h"
-
-namespace modular {
-
-class PuppetMasterImpl;
-
-using StoryControllerFactory =
-    fit::function<fuchsia::modular::StoryControllerPtr(
-        fidl::StringPtr story_id)>;
-
-std::unique_ptr<StoryCommandExecutor> MakeProductionStoryCommandExecutor(
-    SessionStorage* const session_storage,
-    fuchsia::modular::FocusProviderPtr focus_provider,
-    fuchsia::modular::ModuleResolver* const module_resolver,
-    fuchsia::modular::EntityResolver* const entity_resolver,
-    // TODO(miguelfrde): we shouldn't create this dependency here. Instead
-    // an interface similar to StoryStorage should be created for Runtime
-    // use cases.
-    fit::function<void(std::string, std::vector<std::string>)>
-        module_focuser) {
-  std::map<fuchsia::modular::StoryCommand::Tag, std::unique_ptr<CommandRunner>>
-      command_runners;
-  command_runners.emplace(
-      fuchsia::modular::StoryCommand::Tag::kSetFocusState,
-      new SetFocusStateCommandRunner(std::move(focus_provider)));
-  command_runners.emplace(
-      fuchsia::modular::StoryCommand::Tag::kAddMod,
-      new AddModCommandRunner(module_resolver, entity_resolver));
-  command_runners.emplace(fuchsia::modular::StoryCommand::Tag::kFocusMod,
-                          new FocusModCommandRunner(std::move(module_focuser)));
-  command_runners.emplace(fuchsia::modular::StoryCommand::Tag::kRemoveMod,
-                          new RemoveModCommandRunner());
-  command_runners.emplace(fuchsia::modular::StoryCommand::Tag::kSetLinkValue,
-                          new SetLinkValueCommandRunner());
-  command_runners.emplace(
-      fuchsia::modular::StoryCommand::Tag::kSetKindOfProtoStoryOption,
-      new SetKindOfProtoStoryOptionCommandRunner(session_storage));
-
-  auto executor = std::make_unique<DispatchStoryCommandExecutor>(
-      session_storage, std::move(command_runners));
-  return executor;
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/make_production_impl.h b/bin/sessionmgr/puppet_master/make_production_impl.h
deleted file mode 100644
index be9055b..0000000
--- a/bin/sessionmgr/puppet_master/make_production_impl.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_MAKE_PRODUCTION_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_MAKE_PRODUCTION_IMPL_H_
-
-#include <memory>
-
-#include "peridot/bin/sessionmgr/puppet_master/dispatch_story_command_executor.h"
-
-namespace modular {
-
-class StoryCommandExecutor;
-
-// Returns a StoryCommandExecutor suitable for use in production.
-std::unique_ptr<StoryCommandExecutor> MakeProductionStoryCommandExecutor(
-    SessionStorage* session_storage,
-    fuchsia::modular::FocusProviderPtr focus_provider,
-    fuchsia::modular::ModuleResolver* module_resolver,
-    fuchsia::modular::EntityResolver* entity_resolver,
-    fit::function<void(std::string, std::vector<std::string>)>
-        module_focuser);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_MAKE_PRODUCTION_IMPL_H_
diff --git a/bin/sessionmgr/puppet_master/meta/add_mod_command_runner_unittest.cmx b/bin/sessionmgr/puppet_master/meta/add_mod_command_runner_unittest.cmx
deleted file mode 100644
index d462cf7..0000000
--- a/bin/sessionmgr/puppet_master/meta/add_mod_command_runner_unittest.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "program": {
-    "binary": "test/add_mod_command_runner_unittest"
-  },
-  "sandbox": {
-    "services": [
-      "fuchsia.sys.Launcher"
-    ]
-  }
-}
diff --git a/bin/sessionmgr/puppet_master/meta/dispatch_story_command_executor_unittest.cmx b/bin/sessionmgr/puppet_master/meta/dispatch_story_command_executor_unittest.cmx
deleted file mode 100644
index cc547a3..0000000
--- a/bin/sessionmgr/puppet_master/meta/dispatch_story_command_executor_unittest.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "program": {
-    "binary": "test/dispatch_story_command_executor_unittest"
-  },
-  "sandbox": {
-    "services": [
-      "fuchsia.sys.Launcher"
-    ]
-  }
-}
diff --git a/bin/sessionmgr/puppet_master/meta/focus_mod_command_runner_unittest.cmx b/bin/sessionmgr/puppet_master/meta/focus_mod_command_runner_unittest.cmx
deleted file mode 100644
index 9379c10..0000000
--- a/bin/sessionmgr/puppet_master/meta/focus_mod_command_runner_unittest.cmx
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "program": {
-    "binary": "test/focus_mod_command_runner_unittest"
-  },
-  "sandbox": {
-    "services": []
-  }
-}
diff --git a/bin/sessionmgr/puppet_master/meta/puppet_master_impl_unittest.cmx b/bin/sessionmgr/puppet_master/meta/puppet_master_impl_unittest.cmx
deleted file mode 100644
index c2b6989..0000000
--- a/bin/sessionmgr/puppet_master/meta/puppet_master_impl_unittest.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "program": {
-    "binary": "test/puppet_master_impl_unittest"
-  },
-  "sandbox": {
-    "services": [
-      "fuchsia.sys.Launcher"
-    ]
-  }
-}
diff --git a/bin/sessionmgr/puppet_master/meta/remove_mod_command_runner_unittest.cmx b/bin/sessionmgr/puppet_master/meta/remove_mod_command_runner_unittest.cmx
deleted file mode 100644
index 81e7baf..0000000
--- a/bin/sessionmgr/puppet_master/meta/remove_mod_command_runner_unittest.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "program": {
-    "binary": "test/remove_mod_command_runner_unittest"
-  },
-  "sandbox": {
-    "services": [
-      "fuchsia.sys.Launcher"
-    ]
-  }
-}
diff --git a/bin/sessionmgr/puppet_master/meta/set_focus_state_command_runner_unittest.cmx b/bin/sessionmgr/puppet_master/meta/set_focus_state_command_runner_unittest.cmx
deleted file mode 100644
index e12dc99..0000000
--- a/bin/sessionmgr/puppet_master/meta/set_focus_state_command_runner_unittest.cmx
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "program": {
-    "binary": "test/set_focus_state_command_runner_unittest"
-  },
-  "sandbox": {
-    "services": []
-  }
-}
diff --git a/bin/sessionmgr/puppet_master/meta/set_kind_of_proto_story_option_command_runner_unittest.cmx b/bin/sessionmgr/puppet_master/meta/set_kind_of_proto_story_option_command_runner_unittest.cmx
deleted file mode 100644
index 31d38c7..0000000
--- a/bin/sessionmgr/puppet_master/meta/set_kind_of_proto_story_option_command_runner_unittest.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "program": {
-    "binary": "test/set_kind_of_proto_story_option_command_runner_unittest"
-  },
-  "sandbox": {
-    "services": [
-      "fuchsia.sys.Launcher"
-    ]
-  }
-}
diff --git a/bin/sessionmgr/puppet_master/meta/set_link_value_command_runner_unittest.cmx b/bin/sessionmgr/puppet_master/meta/set_link_value_command_runner_unittest.cmx
deleted file mode 100644
index aa605eb..0000000
--- a/bin/sessionmgr/puppet_master/meta/set_link_value_command_runner_unittest.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "program": {
-    "binary": "test/set_link_value_command_runner_unittest"
-  },
-  "sandbox": {
-    "services": [
-      "fuchsia.sys.Launcher"
-    ]
-  }
-}
diff --git a/bin/sessionmgr/puppet_master/meta/story_command_executor_unittest.cmx b/bin/sessionmgr/puppet_master/meta/story_command_executor_unittest.cmx
deleted file mode 100644
index a3c5f6e..0000000
--- a/bin/sessionmgr/puppet_master/meta/story_command_executor_unittest.cmx
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "program": {
-    "binary": "test/story_command_executor_unittest"
-  },
-  "sandbox": {
-    "services": []
-  }
-}
diff --git a/bin/sessionmgr/puppet_master/puppet_master_impl.cc b/bin/sessionmgr/puppet_master/puppet_master_impl.cc
deleted file mode 100644
index cb0f934..0000000
--- a/bin/sessionmgr/puppet_master/puppet_master_impl.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/puppet_master_impl.h"
-
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/story_puppet_master_impl.h"
-#include "peridot/bin/sessionmgr/storage/session_storage.h"
-
-namespace modular {
-
-PuppetMasterImpl::PuppetMasterImpl(SessionStorage* const session_storage,
-                                   StoryCommandExecutor* const executor)
-    : session_storage_(session_storage), executor_(executor) {
-  FXL_DCHECK(session_storage_ != nullptr);
-  FXL_DCHECK(executor_ != nullptr);
-}
-
-PuppetMasterImpl::~PuppetMasterImpl() = default;
-
-void PuppetMasterImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::PuppetMaster> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void PuppetMasterImpl::ControlStory(
-    std::string story_name,
-    fidl::InterfaceRequest<fuchsia::modular::StoryPuppetMaster> request) {
-  auto controller = std::make_unique<StoryPuppetMasterImpl>(
-      story_name, &operations_, session_storage_, executor_);
-  story_puppet_masters_.AddBinding(std::move(controller), std::move(request));
-}
-
-void PuppetMasterImpl::DeleteStory(std::string story_name,
-                                   DeleteStoryCallback done) {
-  session_storage_->DeleteStory(story_name)->Then(std::move(done));
-}
-
-void PuppetMasterImpl::GetStories(GetStoriesCallback done) {
-  session_storage_->GetAllStoryData()->Then(
-      [done = std::move(done)](
-          std::vector<fuchsia::modular::internal::StoryData>
-              all_story_data) {
-        std::vector<std::string> result;
-        for (auto& story : all_story_data) {
-          result.push_back(std::move(story.story_info.id));
-        }
-
-        done(std::move(result));
-      });
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/puppet_master_impl.h b/bin/sessionmgr/puppet_master/puppet_master_impl.h
deleted file mode 100644
index 748e1f5..0000000
--- a/bin/sessionmgr/puppet_master/puppet_master_impl.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_PUPPET_MASTER_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_PUPPET_MASTER_IMPL_H_
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-namespace modular {
-
-class SessionStorage;
-class StoryCommandExecutor;
-class StoryPuppetMasterImpl;
-
-// An implementation of fuchsia::modular::PuppetMaster which owns and connect
-// clients to instances of StoryPuppetMasterImpl for story control.
-class PuppetMasterImpl : public fuchsia::modular::PuppetMaster {
- public:
-  // Does not take ownership of |session_storage| or |executor|.
-  explicit PuppetMasterImpl(SessionStorage* session_storage,
-                            StoryCommandExecutor* executor);
-  ~PuppetMasterImpl() override;
-
-  void Connect(fidl::InterfaceRequest<fuchsia::modular::PuppetMaster> request);
-
- private:
-  // |PuppetMaster|
-  void ControlStory(std::string story_name,
-                    fidl::InterfaceRequest<fuchsia::modular::StoryPuppetMaster>
-                        request) override;
-
-  // |PuppetMaster|
-  void DeleteStory(std::string story_name,
-                   DeleteStoryCallback done) override;
-
-  // |PuppetMaster|
-  void GetStories(GetStoriesCallback done) override;
-
-  SessionStorage* const session_storage_;  // Not owned.
-  StoryCommandExecutor* const executor_;   // Not owned.
-
-  fidl::BindingSet<fuchsia::modular::PuppetMaster> bindings_;
-  // There is a one-impl-per-connection relationship between
-  // fuchsia::modular::StoryPuppetMaster and its bindings.
-  fidl::BindingSet<fuchsia::modular::StoryPuppetMaster,
-                   std::unique_ptr<StoryPuppetMasterImpl>>
-      story_puppet_masters_;
-
-  OperationCollection operations_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PuppetMasterImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_PUPPET_MASTER_IMPL_H_
diff --git a/bin/sessionmgr/puppet_master/puppet_master_impl_unittest.cc b/bin/sessionmgr/puppet_master/puppet_master_impl_unittest.cc
deleted file mode 100644
index bd97653..0000000
--- a/bin/sessionmgr/puppet_master/puppet_master_impl_unittest.cc
+++ /dev/null
@@ -1,352 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/puppet_master_impl.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/testing/test_story_command_executor.h"
-#include "peridot/lib/testing/test_with_session_storage.h"
-
-namespace modular {
-namespace {
-
-fuchsia::modular::StoryCommand MakeRemoveModCommand(std::string mod_name) {
-  fuchsia::modular::StoryCommand command;
-  fuchsia::modular::RemoveMod remove_mod;
-  remove_mod.mod_name.push_back(mod_name);
-  command.set_remove_mod(std::move(remove_mod));
-  return command;
-}
-
-class PuppetMasterTest : public testing::TestWithSessionStorage {
- public:
-  void SetUp() override {
-    TestWithSessionStorage::SetUp();
-    storage_ = MakeSessionStorage("page");
-    impl_ = std::make_unique<PuppetMasterImpl>(storage_.get(), &executor_);
-    impl_->Connect(ptr_.NewRequest());
-  }
-
-  fuchsia::modular::StoryPuppetMasterPtr ControlStory(
-      fidl::StringPtr story_name) {
-    fuchsia::modular::StoryPuppetMasterPtr ptr;
-    ptr_->ControlStory(story_name, ptr.NewRequest());
-    return ptr;
-  }
-
- protected:
-  testing::TestStoryCommandExecutor executor_;
-  std::unique_ptr<SessionStorage> storage_;
-  std::unique_ptr<PuppetMasterImpl> impl_;
-  fuchsia::modular::PuppetMasterPtr ptr_;
-};
-
-TEST_F(PuppetMasterTest, CommandsAreSentToExecutor) {
-  // This should create a new story in StoryStorage called "foo".
-  auto story = ControlStory("foo");
-
-  // Enqueue some commands. Do this twice and show that all the commands show
-  // up as one batch.
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  commands.push_back(MakeRemoveModCommand("one"));
-  story->Enqueue(std::move(commands));
-  commands.push_back(MakeRemoveModCommand("two"));
-  commands.push_back(MakeRemoveModCommand("three"));
-  story->Enqueue(std::move(commands));
-
-  // Commands are not run until Execute() is called.
-  RunLoopUntilIdle();
-  EXPECT_EQ(0, executor_.execute_count());
-
-  fuchsia::modular::ExecuteResult result;
-  bool done{false};
-  // Instruct our test executor to return an OK status.
-  executor_.SetExecuteReturnResult(fuchsia::modular::ExecuteStatus::OK,
-                                   nullptr);
-  story->Execute([&](fuchsia::modular::ExecuteResult r) {
-    result = std::move(r);
-    done = true;
-  });
-  RunLoopUntil([&]() { return done; });
-  EXPECT_EQ(1, executor_.execute_count());
-  EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK, result.status);
-
-  EXPECT_EQ("foo", executor_.last_story_id());
-  ASSERT_EQ(3u, executor_.last_commands().size());
-  EXPECT_EQ("one",
-            executor_.last_commands().at(0).remove_mod().mod_name.at(0));
-  EXPECT_EQ("two",
-            executor_.last_commands().at(1).remove_mod().mod_name.at(0));
-  EXPECT_EQ("three",
-            executor_.last_commands().at(2).remove_mod().mod_name.at(0));
-}
-
-TEST_F(PuppetMasterTest, CommandsAreSentToExecutor_IfWeCloseStoryChannel) {
-  // We're going to call Execute(), and then immediately drop the
-  // StoryPuppetMaster connection. We won't get a callback, but we still
-  // expect that the commands are executed.
-  auto story = ControlStory("foo");
-
-  // Enqueue some commands. Do this twice and show that all the commands show
-  // up as one batch.
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  commands.push_back(MakeRemoveModCommand("one"));
-  story->Enqueue(std::move(commands));
-
-  fuchsia::modular::ExecuteResult result;
-  bool callback_called{false};
-  // Instruct our test executor to return an OK status.
-  executor_.SetExecuteReturnResult(fuchsia::modular::ExecuteStatus::OK,
-                                   nullptr);
-  story->Execute([&](fuchsia::modular::ExecuteResult r) {
-    callback_called = true;
-  });
-  story.Unbind();
-  RunLoopUntil([&]() { return executor_.execute_count() > 0; });
-  EXPECT_FALSE(callback_called);
-  EXPECT_EQ(1, executor_.execute_count());
-}
-
-TEST_F(PuppetMasterTest, MultipleExecuteCalls) {
-  // Create a new story, and then execute some new commands on the same
-  // connection. We should see that the StoryCommandExecutor receives the story
-  // id that it reported after successful creation of the story on the last
-  // execution.
-  auto story = ControlStory("foo");
-
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  commands.push_back(MakeRemoveModCommand("one"));
-  executor_.SetExecuteReturnResult(fuchsia::modular::ExecuteStatus::OK,
-                                   nullptr);
-  bool done{false};
-  story->Execute([&](fuchsia::modular::ExecuteResult r) { done = true; });
-  RunLoopUntil([&]() { return done; });
-  auto story_id = executor_.last_story_id();
-
-  // Execute more commands.
-  commands.push_back(MakeRemoveModCommand("three"));
-  story->Enqueue(std::move(commands));
-  done = false;
-  story->Execute([&](fuchsia::modular::ExecuteResult r) { done = true; });
-  RunLoopUntil([&]() { return done; });
-  EXPECT_EQ(story_id, executor_.last_story_id());
-}
-
-TEST_F(PuppetMasterTest, NewStoriesAreKeptSeparate) {
-  // Creating two new stories at the same time is OK and they are kept
-  // separate.
-  auto story1 = ControlStory("story1");
-  auto story2 = ControlStory("story2");
-
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  commands.push_back(MakeRemoveModCommand("one"));
-  story1->Enqueue(std::move(commands));
-  // We must run the loop to ensure that our message is dispatched.
-  RunLoopUntilIdle();
-
-  commands.push_back(MakeRemoveModCommand("two"));
-  story2->Enqueue(std::move(commands));
-  RunLoopUntilIdle();
-
-  fuchsia::modular::ExecuteResult result;
-  executor_.SetExecuteReturnResult(fuchsia::modular::ExecuteStatus::OK,
-                                   nullptr);
-  bool done{false};
-  story1->Execute([&](fuchsia::modular::ExecuteResult r) {
-    result = std::move(r);
-    done = true;
-  });
-  RunLoopUntil([&]() { return done; });
-  EXPECT_EQ(1, executor_.execute_count());
-  auto story1_id = executor_.last_story_id();
-  ASSERT_EQ(1u, executor_.last_commands().size());
-  EXPECT_EQ("one",
-            executor_.last_commands().at(0).remove_mod().mod_name.at(0));
-
-  executor_.SetExecuteReturnResult(fuchsia::modular::ExecuteStatus::OK,
-                                   nullptr);
-  done = false;
-  story2->Execute([&](fuchsia::modular::ExecuteResult r) {
-    result = std::move(r);
-    done = true;
-  });
-  RunLoopUntil([&]() { return done; });
-  EXPECT_EQ(2, executor_.execute_count());
-  auto story2_id = executor_.last_story_id();
-  ASSERT_EQ(1u, executor_.last_commands().size());
-  EXPECT_EQ("two",
-            executor_.last_commands().at(0).remove_mod().mod_name.at(0));
-
-  // The two IDs should be different, because we gave the two stories different
-  // names.
-  EXPECT_NE(story1_id, story2_id);
-}
-
-TEST_F(PuppetMasterTest, ControlExistingStory) {
-  // Controlling the same story from two connections is OK. The first call to
-  // Execute() will create the story, and the second will re-use the same story
-  // record.
-  auto story1 = ControlStory("foo");
-  auto story2 = ControlStory("foo");
-
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  commands.push_back(MakeRemoveModCommand("one"));
-  story1->Enqueue(std::move(commands));
-  // We must run the loop to ensure that our message is dispatched.
-  RunLoopUntilIdle();
-
-  commands.push_back(MakeRemoveModCommand("two"));
-  story2->Enqueue(std::move(commands));
-  RunLoopUntilIdle();
-
-  fuchsia::modular::ExecuteResult result;
-  executor_.SetExecuteReturnResult(fuchsia::modular::ExecuteStatus::OK,
-                                   nullptr);
-  bool done{false};
-  story1->Execute([&](fuchsia::modular::ExecuteResult r) {
-    result = std::move(r);
-    done = true;
-  });
-  RunLoopUntil([&]() { return done; });
-  EXPECT_EQ(1, executor_.execute_count());
-  auto story_id = executor_.last_story_id();
-  ASSERT_EQ(1u, executor_.last_commands().size());
-  EXPECT_EQ("one",
-            executor_.last_commands().at(0).remove_mod().mod_name.at(0));
-
-  executor_.SetExecuteReturnResult(fuchsia::modular::ExecuteStatus::OK,
-                                   nullptr);
-  done = false;
-  story2->Execute([&](fuchsia::modular::ExecuteResult r) {
-    result = std::move(r);
-    done = true;
-  });
-  RunLoopUntil([&]() { return done; });
-  EXPECT_EQ(2, executor_.execute_count());
-  EXPECT_EQ(story_id, executor_.last_story_id());
-  ASSERT_EQ(1u, executor_.last_commands().size());
-  EXPECT_EQ("two",
-            executor_.last_commands().at(0).remove_mod().mod_name.at(0));
-}
-
-TEST_F(PuppetMasterTest, CreateStoryWithOptions) {
-  // Verify that options are set when the story is created (as result of an
-  // execution) and are not updated in future executions.
-  auto story = ControlStory("foo");
-
-  fuchsia::modular::StoryOptions options;
-  options.kind_of_proto_story = true;
-  story->SetCreateOptions(std::move(options));
-
-  // Enqueue some commands.
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  commands.push_back(MakeRemoveModCommand("one"));
-  story->Enqueue(std::move(commands));
-
-  // Options are not set until execute that triggers the creation of a story.
-  bool done{};
-  storage_->GetStoryData("foo")->Then(
-      [&](fuchsia::modular::internal::StoryDataPtr data) {
-        EXPECT_EQ(nullptr, data);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-
-  done = false;
-  story->Execute([&](fuchsia::modular::ExecuteResult result) {
-    EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK, result.status);
-    done = true;
-  });
-  RunLoopUntil([&] { return done; });
-  auto story_id = executor_.last_story_id();
-
-  // Options should have been set.
-  done = false;
-  storage_->GetStoryData("foo")->Then(
-      [&](fuchsia::modular::internal::StoryDataPtr data) {
-        EXPECT_TRUE(data->story_options.kind_of_proto_story);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-
-  // Setting new options and executing again should have no effect.
-  fuchsia::modular::StoryOptions options2;
-  options2.kind_of_proto_story = false;
-  story->SetCreateOptions(std::move(options2));
-
-  // Enqueue some commands.
-  std::vector<fuchsia::modular::StoryCommand> commands2;
-  commands2.push_back(MakeRemoveModCommand("two"));
-  story->Enqueue(std::move(commands2));
-
-  done = false;
-  story->Execute([&](fuchsia::modular::ExecuteResult result) {
-    EXPECT_EQ(fuchsia::modular::ExecuteStatus::OK, result.status);
-    done = true;
-  });
-  RunLoopUntil([&] { return done; });
-
-  EXPECT_EQ(story_id, executor_.last_story_id());
-
-  // Options should have changed.
-  done = false;
-  storage_->GetStoryData("foo")->Then(
-      [&](fuchsia::modular::internal::StoryDataPtr data) {
-        EXPECT_TRUE(data->story_options.kind_of_proto_story);
-        done = true;
-      });
-
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(PuppetMasterTest, DeleteStory) {
-  std::string story_id;
-
-  // Create a story.
-  storage_->CreateStory("foo", {} /* extra_info */, {} /* story_options */)
-      ->Then([&](fidl::StringPtr id, fuchsia::ledger::PageId page_id) {
-        story_id = id;
-      });
-
-  // Delete it
-  bool done{};
-  ptr_->DeleteStory("foo", [&] { done = true; });
-  RunLoopUntil([&] { return done; });
-
-  done = false;
-  storage_->GetStoryData(story_id)->Then(
-      [&](fuchsia::modular::internal::StoryDataPtr story_data) {
-        EXPECT_EQ(story_data, nullptr);
-        done = true;
-      });
-
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(PuppetMasterTest, GetStories) {
-  // Zero stories to should exist.
-  bool done{};
-  ptr_->GetStories([&](std::vector<std::string> story_names) {
-    EXPECT_EQ(0u, story_names.size());
-    done = true;
-  });
-  RunLoopUntil([&] { return done; });
-
-  // Create a story.
-  storage_->CreateStory("foo", {} /* extra_info */, {} /* story_options */);
-
-  // "foo" should be listed.
-  done = false;
-  ptr_->GetStories([&](std::vector<std::string> story_names) {
-    ASSERT_EQ(1u, story_names.size());
-    EXPECT_EQ("foo", story_names.at(0));
-    done = true;
-  });
-  RunLoopUntil([&] { return done; });
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/story_command_executor.cc b/bin/sessionmgr/puppet_master/story_command_executor.cc
deleted file mode 100644
index a5e93c8..0000000
--- a/bin/sessionmgr/puppet_master/story_command_executor.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/story_command_executor.h"
-
-#include <lib/fxl/functional/make_copyable.h>
-
-namespace modular {
-
-namespace {
-std::vector<fuchsia::modular::StoryCommand> CloneCommands(
-    const std::vector<fuchsia::modular::StoryCommand>& commands) {
-  std::vector<fuchsia::modular::StoryCommand> commands_copy;
-  for (const auto& command : commands) {
-    fuchsia::modular::StoryCommand clone;
-    command.Clone(&clone);
-    commands_copy.push_back(std::move(clone));
-  }
-
-  return commands_copy;
-}
-}  // namespace
-
-StoryCommandExecutor::StoryCommandExecutor() : weak_factory_(this) {}
-StoryCommandExecutor::~StoryCommandExecutor() = default;
-
-void StoryCommandExecutor::ExecuteCommands(
-    fidl::StringPtr story_id,
-    std::vector<fuchsia::modular::StoryCommand> commands,
-    std::function<void(fuchsia::modular::ExecuteResult)> done) {
-  // TODO(thatguy): Cloning the commands here is unforunate. We will want to
-  // create a shared datastructure at some point, such as a
-  // ExecuteCommandsContext struct that contains the commands, and also allows
-  // command runners to make modifications to the commands so that observers get
-  // commands that are more fully specified.
-  //
-  // For now, we make a copy.
-  auto commands_copy = CloneCommands(commands);
-  auto on_execute_done =
-      [weak_this = weak_factory_.GetWeakPtr(),
-       commands_copy = std::move(commands_copy),
-       done = std::move(done)](fuchsia::modular::ExecuteResult result) {
-        if (!weak_this)
-          return;
-
-        for (auto& listener : weak_this->listeners_) {
-          listener(commands_copy, result);
-        }
-
-        done(result);
-      };
-
-  ExecuteCommandsInternal(std::move(story_id), std::move(commands),
-                          fxl::MakeCopyable(std::move(on_execute_done)));
-}
-
-StoryCommandExecutor::ListenerAutoCancel StoryCommandExecutor::AddListener(
-    ListenerCallback listener) {
-  auto it = listeners_.insert(listeners_.end(), std::move(listener));
-
-  auto auto_remove = [weak_this = weak_factory_.GetWeakPtr(), it] {
-    if (!weak_this)
-      return;
-
-    weak_this->listeners_.erase(it);
-  };
-  return ListenerAutoCancel(std::move(auto_remove));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/story_command_executor.h b/bin/sessionmgr/puppet_master/story_command_executor.h
deleted file mode 100644
index 770ba84..0000000
--- a/bin/sessionmgr/puppet_master/story_command_executor.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_STORY_COMMAND_EXECUTOR_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_STORY_COMMAND_EXECUTOR_H_
-
-#include <functional>
-#include <list>
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-namespace modular {
-
-class StoryCommandExecutor {
- public:
-  StoryCommandExecutor();
-  virtual ~StoryCommandExecutor();
-
-  // Executes |commands| on story identified by |story_id| and calls |done| when
-  // complete. |story_id| is always non-null and refers to an existing Story.
-  //
-  // If an error occurs, fuchsia::modular::ExecuteResult.status will be set to
-  // indicate the type of error, and a helpful error message must also be
-  // provided in fuchsia::modular::ExecuteResult.error_message.
-  //
-  // On success fuchsia::modular::ExecuteResult.status will be set to
-  // fuchsia::modular::ExecuteStatus.OK.
-  void ExecuteCommands(
-      fidl::StringPtr story_id,
-      std::vector<fuchsia::modular::StoryCommand> commands,
-      std::function<void(fuchsia::modular::ExecuteResult)> done);
-
-  using ListenerCallback = fit::function<void(
-      const std::vector<fuchsia::modular::StoryCommand>& commands,
-      fuchsia::modular::ExecuteResult result)>;
-  using ListenerAutoCancel = fit::deferred_action<std::function<void()>>;
-
-  // Calls |listener| whenever StoryCommands are executed with the commands and
-  // the execution result. Returns a scoped auto-cancel value. The returned
-  // ListenerAutoCancel must be kept alive as long as the callee wishes to
-  // receive notifications of StoryCommand execution.
-  ListenerAutoCancel AddListener(ListenerCallback listener);
-
- private:
-  virtual void ExecuteCommandsInternal(
-      fidl::StringPtr story_id,
-      std::vector<fuchsia::modular::StoryCommand> commands,
-      std::function<void(fuchsia::modular::ExecuteResult)> done) = 0;
-
-  std::list<ListenerCallback> listeners_;
-  fxl::WeakPtrFactory<StoryCommandExecutor> weak_factory_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_STORY_COMMAND_EXECUTOR_H_
diff --git a/bin/sessionmgr/puppet_master/story_command_executor_unittest.cc b/bin/sessionmgr/puppet_master/story_command_executor_unittest.cc
deleted file mode 100644
index ca81f73..0000000
--- a/bin/sessionmgr/puppet_master/story_command_executor_unittest.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/story_command_executor.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-using fuchsia::modular::ExecuteResult;
-using fuchsia::modular::ExecuteStatus;
-using fuchsia::modular::StoryCommand;
-
-class TestStoryCommandExecutor : public StoryCommandExecutor {
- public:
-  void SetExecuteReturnResult(ExecuteStatus status,
-                              fidl::StringPtr error_message) {
-    result_.status = status;
-    result_.error_message = error_message;
-  }
-
-  int execute_count{0};
-  fidl::StringPtr last_story_id;
-  std::vector<StoryCommand> last_commands;
-
- private:
-  // |StoryCommandExecutor|
-  void ExecuteCommandsInternal(
-      fidl::StringPtr story_id, std::vector<StoryCommand> commands,
-      std::function<void(ExecuteResult)> done) override {
-    ++execute_count;
-    last_story_id = story_id;
-    last_commands = std::move(commands);
-    ExecuteResult result;
-    fidl::Clone(result_, &result);
-    done(std::move(result));
-  }
-
-  ExecuteResult result_;
-};
-
-StoryCommand MakeRemoveModCommand(std::string mod_name) {
-  StoryCommand command;
-  fuchsia::modular::RemoveMod remove_mod;
-  remove_mod.mod_name.push_back(mod_name);
-  command.set_remove_mod(std::move(remove_mod));
-  return command;
-}
-
-TEST(StoryCommandExecutorTest, ListenerSeesCommands) {
-  TestStoryCommandExecutor executor;
-  executor.SetExecuteReturnResult(ExecuteStatus::OK, "message");
-
-  bool listener_called{false};
-  auto auto_cancel = executor.AddListener(
-      [&](const std::vector<StoryCommand>& commands, ExecuteResult result) {
-        EXPECT_EQ(1lu, commands.size());
-        EXPECT_EQ(ExecuteStatus::OK, result.status);
-        EXPECT_EQ("message", result.error_message);
-        listener_called = true;
-      });
-
-  bool execute_done{false};
-  std::vector<StoryCommand> commands;
-  commands.push_back(MakeRemoveModCommand("one"));
-  executor.ExecuteCommands("story id", std::move(commands),
-                           [&](ExecuteResult result) {
-                             execute_done = true;
-                             EXPECT_EQ(ExecuteStatus::OK, result.status);
-                             EXPECT_EQ("message", result.error_message);
-                           });
-  EXPECT_TRUE(listener_called);
-  EXPECT_TRUE(execute_done);
-
-  // Now unregister the listener.
-  auto_cancel.call();
-  listener_called = false;
-  execute_done = false;
-  commands.push_back(MakeRemoveModCommand("one"));
-  executor.ExecuteCommands("story id", std::move(commands),
-                           [&](ExecuteResult result) { execute_done = true; });
-  EXPECT_FALSE(listener_called);
-  EXPECT_TRUE(execute_done);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/story_puppet_master_impl.cc b/bin/sessionmgr/puppet_master/story_puppet_master_impl.cc
deleted file mode 100644
index b20d652..0000000
--- a/bin/sessionmgr/puppet_master/story_puppet_master_impl.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/puppet_master/story_puppet_master_impl.h"
-
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/story_command_executor.h"
-#include "peridot/bin/sessionmgr/storage/session_storage.h"
-
-namespace modular {
-
-namespace {
-
-class ExecuteOperation : public Operation<fuchsia::modular::ExecuteResult> {
- public:
-  ExecuteOperation(SessionStorage* const session_storage,
-                   StoryCommandExecutor* const executor,
-                   std::string story_name,
-                   fuchsia::modular::StoryOptions story_options,
-                   std::vector<fuchsia::modular::StoryCommand> commands,
-                   ResultCall done)
-      : Operation("StoryPuppetMasterImpl.ExecuteOpreation", std::move(done)),
-        session_storage_(session_storage),
-        executor_(executor),
-        story_name_(std::move(story_name)),
-        story_options_(std::move(story_options)),
-        commands_(std::move(commands)) {}
-
- private:
-  void Run() override {
-    session_storage_->GetStoryData(story_name_)
-        ->WeakThen(GetWeakPtr(),
-                   [this](fuchsia::modular::internal::StoryDataPtr data) {
-                     if (data) {
-                       story_id_ = data->story_info.id;
-                       ExecuteCommands();
-                       return;
-                     }
-
-                     CreateStory();
-                   });
-  }
-
-  void CreateStory() {
-    session_storage_
-        ->CreateStory(story_name_, nullptr /* extra_info */,
-                      std::move(story_options_))
-        ->WeakThen(GetWeakPtr(),
-                   [this](fidl::StringPtr story_id, auto /* ignored */) {
-                     story_id_ = story_id;
-                     ExecuteCommands();
-                   });
-  }
-
-  void ExecuteCommands() {
-    executor_->ExecuteCommands(story_id_, std::move(commands_),
-                               [weak_ptr = GetWeakPtr(),
-                                this](fuchsia::modular::ExecuteResult result) {
-                                 Done(std::move(result));
-                               });
-  }
-
-  SessionStorage* const session_storage_;
-  StoryCommandExecutor* const executor_;
-  std::string story_name_;
-  fuchsia::modular::StoryOptions story_options_;
-  std::vector<fuchsia::modular::StoryCommand> commands_;
-
-  fidl::StringPtr story_id_;
-};
-
-}  // namespace
-
-StoryPuppetMasterImpl::StoryPuppetMasterImpl(
-    std::string story_name, OperationContainer* const operations,
-    SessionStorage* const session_storage, StoryCommandExecutor* const executor)
-    : story_name_(story_name),
-      session_storage_(session_storage),
-      executor_(executor),
-      operations_(operations) {
-  FXL_DCHECK(session_storage != nullptr);
-  FXL_DCHECK(executor != nullptr);
-}
-
-StoryPuppetMasterImpl::~StoryPuppetMasterImpl() = default;
-
-void StoryPuppetMasterImpl::Enqueue(
-    std::vector<fuchsia::modular::StoryCommand> commands) {
-  enqueued_commands_.insert(enqueued_commands_.end(),
-                            make_move_iterator(commands.begin()),
-                            make_move_iterator(commands.end()));
-}
-
-void StoryPuppetMasterImpl::Execute(ExecuteCallback done) {
-  // First ensure that the story is created.
-  operations_->Add(new ExecuteOperation(session_storage_, executor_,
-                                        story_name_, std::move(story_options_),
-                                        std::move(enqueued_commands_), done));
-}
-
-void StoryPuppetMasterImpl::SetCreateOptions(
-    fuchsia::modular::StoryOptions story_options) {
-  story_options_ = std::move(story_options);
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/puppet_master/story_puppet_master_impl.h b/bin/sessionmgr/puppet_master/story_puppet_master_impl.h
deleted file mode 100644
index f9a0b09..0000000
--- a/bin/sessionmgr/puppet_master/story_puppet_master_impl.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_STORY_PUPPET_MASTER_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_STORY_PUPPET_MASTER_IMPL_H_
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-namespace modular {
-
-class SessionStorage;
-class StoryCommandExecutor;
-
-// An implementation of fuchsia::modular::StoryPuppetMaster which delegates
-// story command execution to a StoryCommandExecutor.
-class StoryPuppetMasterImpl : public fuchsia::modular::StoryPuppetMaster {
- public:
-  StoryPuppetMasterImpl(std::string story_name,
-                        OperationContainer* operations,
-                        SessionStorage* session_storage,
-                        StoryCommandExecutor* executor);
-  ~StoryPuppetMasterImpl() override;
-
- private:
-  // |StoryPuppetMaster|
-  void Enqueue(
-      std::vector<fuchsia::modular::StoryCommand> commands) override;
-
-  // |StoryPuppetMaster|
-  void Execute(ExecuteCallback done) override;
-
-  // |StoryPuppetMaster|
-  void SetCreateOptions(fuchsia::modular::StoryOptions story_options) override;
-
-  std::string story_name_;
-  SessionStorage* const session_storage_;  // Not owned.
-  StoryCommandExecutor* const executor_;   // Not owned.
-
-  std::vector<fuchsia::modular::StoryCommand> enqueued_commands_;
-
-  OperationContainer* const operations_;  // Not owned.
-
-  fuchsia::modular::StoryOptions story_options_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryPuppetMasterImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_PUPPET_MASTER_STORY_PUPPET_MASTER_IMPL_H_
diff --git a/bin/sessionmgr/session_ctl.cc b/bin/sessionmgr/session_ctl.cc
deleted file mode 100644
index 24adef7..0000000
--- a/bin/sessionmgr/session_ctl.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fs/service.h>
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/puppet_master_impl.h"
-#include "peridot/bin/sessionmgr/session_ctl.h"
-
-namespace modular {
-
-// Directory layout:
-//
-// puppet_master       -   fuchsia::modular::PuppetMaster service
-SessionCtl::SessionCtl(fbl::RefPtr<fs::PseudoDir> dir,
-                       const std::string& entry_name,
-                       PuppetMasterImpl* const puppet_master_impl)
-    : dir_(dir),
-      entry_name_(entry_name),
-      puppet_master_impl_(puppet_master_impl) {
-  auto ctl_dir = fbl::AdoptRef(new fs::PseudoDir());
-  ctl_dir->AddEntry(
-      fuchsia::modular::PuppetMaster::Name_,
-      fbl::AdoptRef(new fs::Service([this](zx::channel channel) {
-        fidl::InterfaceRequest<fuchsia::modular::PuppetMaster> request(
-            std::move(channel));
-        puppet_master_impl_->Connect(std::move(request));
-        return ZX_OK;
-      })));
-
-  auto status = dir_->AddEntry(entry_name_, ctl_dir);
-  FXL_DCHECK(status == ZX_OK);
-}
-
-SessionCtl::~SessionCtl() {
-  auto status = dir_->RemoveEntry(entry_name_);
-  FXL_DCHECK(status == ZX_OK);
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/session_ctl.h b/bin/sessionmgr/session_ctl.h
deleted file mode 100644
index a1c4cdc..0000000
--- a/bin/sessionmgr/session_ctl.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_SESSION_CTL_H_
-#define PERIDOT_BIN_SESSIONMGR_SESSION_CTL_H_
-
-#include <fs/pseudo-dir.h>
-#include <string>
-
-#include "fbl/ref_ptr.h"
-
-namespace modular {
-
-class PuppetMasterImpl;
-
-// Builds a pseudo-directory for session inspection and control for debug and
-// developer tools.
-class SessionCtl {
- public:
-  // Constructs a SessionCtl and adds an entry to |dir| under |entry_name|. The
-  // entry is removed when destructed.
-  //
-  // |puppet_master_impl| is not owned and must outlive *this.
-  SessionCtl(fbl::RefPtr<fs::PseudoDir> dir, const std::string& entry_name,
-             PuppetMasterImpl* puppet_master_impl);
-  ~SessionCtl();
-
- private:
-  fbl::RefPtr<fs::PseudoDir> dir_;
-  const std::string entry_name_;
-
-  PuppetMasterImpl* const puppet_master_impl_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_SESSION_CTL_H_
diff --git a/bin/sessionmgr/sessionmgr.cc b/bin/sessionmgr/sessionmgr.cc
deleted file mode 100644
index 384a212..0000000
--- a/bin/sessionmgr/sessionmgr.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fit/defer.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/split_string.h>
-#include <trace-provider/provider.h>
-
-#include "peridot/bin/basemgr/cobalt/cobalt.h"
-#include "peridot/bin/sessionmgr/sessionmgr_impl.h"
-
-fit::deferred_action<fit::closure> SetupCobalt(
-    const bool disable_statistics, async_dispatcher_t* dispatcher,
-    component::StartupContext* const startup_context) {
-  if (disable_statistics) {
-    return fit::defer<fit::closure>([] {});
-  }
-  return modular::InitializeCobalt(dispatcher, startup_context);
-}
-
-int main(int argc, const char** argv) {
-  auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-
-  modular::SessionmgrImpl::Options opts;
-  opts.test = command_line.HasOption("test");
-  opts.use_memfs_for_ledger = command_line.HasOption("use_memfs_for_ledger");
-  opts.no_cloud_provider_for_ledger =
-      command_line.HasOption("no_cloud_provider_for_ledger");
-
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  trace::TraceProvider trace_provider(loop.dispatcher());
-  std::unique_ptr<component::StartupContext> context =
-      component::StartupContext::CreateFromStartupInfo();
-
-  auto cobalt_cleanup =
-      SetupCobalt(opts.test, std::move(loop.dispatcher()), context.get());
-
-  auto startup_agents = fxl::SplitStringCopy(
-      command_line.GetOptionValueWithDefault("startup_agents", ""), ",",
-      fxl::kTrimWhitespace, fxl::kSplitWantNonEmpty);
-  auto session_agents = fxl::SplitStringCopy(
-      command_line.GetOptionValueWithDefault("session_agents", ""), ",",
-      fxl::kTrimWhitespace, fxl::kSplitWantNonEmpty);
-
-  for (const auto& startup_agent : startup_agents) {
-    opts.startup_agents.push_back(startup_agent);
-  }
-  for (const auto& session_agent : session_agents) {
-    opts.session_agents.push_back(session_agent);
-  }
-
-  modular::AppDriver<modular::SessionmgrImpl> driver(
-      context->outgoing().deprecated_services(),
-      std::make_unique<modular::SessionmgrImpl>(context.get(), opts),
-      [&loop, &cobalt_cleanup] {
-        cobalt_cleanup.call();
-        loop.Quit();
-      });
-
-  loop.Run();
-  return 0;
-}
diff --git a/bin/sessionmgr/sessionmgr_impl.cc b/bin/sessionmgr/sessionmgr_impl.cc
deleted file mode 100644
index 5abe13c..0000000
--- a/bin/sessionmgr/sessionmgr_impl.cc
+++ /dev/null
@@ -1,950 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/sessionmgr_impl.h"
-
-#include <fcntl.h>
-#include <memory>
-#include <string>
-
-#include <fuchsia/ledger/cloud/firestore/cpp/fidl.h>
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/fsl/io/fd.h>
-#include <lib/fsl/types/type_converters.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/unique_fd.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/basemgr/cobalt/cobalt.h"
-#include "peridot/bin/sessionmgr/component_context_impl.h"
-#include "peridot/bin/sessionmgr/device_map_impl.h"
-#include "peridot/bin/sessionmgr/focus.h"
-#include "peridot/bin/sessionmgr/message_queue/message_queue_manager.h"
-#include "peridot/bin/sessionmgr/presentation_provider.h"
-#include "peridot/bin/sessionmgr/puppet_master/make_production_impl.h"
-#include "peridot/bin/sessionmgr/puppet_master/puppet_master_impl.h"
-#include "peridot/bin/sessionmgr/puppet_master/story_command_executor.h"
-#include "peridot/bin/sessionmgr/session_ctl.h"
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/bin/sessionmgr/storage/session_storage.h"
-#include "peridot/bin/sessionmgr/story_runner/link_impl.h"
-#include "peridot/bin/sessionmgr/story_runner/story_provider_impl.h"
-#include "peridot/lib/common/names.h"
-#include "peridot/lib/common/teardown.h"
-#include "peridot/lib/common/xdr.h"
-#include "peridot/lib/device_info/device_info.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/fidl/environment.h"
-#include "peridot/lib/fidl/json_xdr.h"
-#include "peridot/lib/ledger_client/constants.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_id.h"
-#include "peridot/lib/ledger_client/status.h"
-#include "peridot/lib/module_manifest/module_facet_reader_impl.h"
-
-namespace modular {
-
-namespace {
-
-constexpr char kAppId[] = "modular_sessionmgr";
-
-constexpr char kMaxwellComponentNamespace[] = "maxwell";
-constexpr char kMaxwellUrl[] = "maxwell";
-
-constexpr char kContextEngineUrl[] =
-    "fuchsia-pkg://fuchsia.com/context_engine#meta/context_engine.cmx";
-constexpr char kContextEngineComponentNamespace[] = "context_engine";
-
-constexpr char kModuleResolverUrl[] =
-    "fuchsia-pkg://fuchsia.com/module_resolver#meta/module_resolver.cmx";
-
-constexpr char kUserEnvironmentLabelPrefix[] = "user-";
-
-constexpr char kMessageQueuePath[] = "/data/MESSAGE_QUEUES/v1/";
-
-constexpr char kSessionShellComponentNamespace[] = "user-shell-namespace";
-constexpr char kSessionShellLinkName[] = "user-shell-link";
-
-constexpr char kClipboardAgentUrl[] =
-    "fuchsia-pkg://fuchsia.com/clipboard_agent#meta/clipboard_agent.cmx";
-
-constexpr char kLedgerRepositoryDirectory[] = "/data/LEDGER";
-
-// The name in the outgoing debug directory (hub) for developer session control
-// services.
-constexpr char kSessionCtlDir[] = "sessionctl";
-
-fuchsia::ledger::cloud::firestore::Config GetLedgerFirestoreConfig() {
-  fuchsia::ledger::cloud::firestore::Config config;
-  config.server_id = kFirebaseProjectId;
-  config.api_key = kFirebaseApiKey;
-  return config;
-}
-
-std::string GetAccountId(const fuchsia::modular::auth::AccountPtr& account) {
-  return !account ? "GUEST" : account->id;
-}
-
-// Creates a function that can be used as termination action passed to AtEnd(),
-// which when called invokes the reset() method on the object pointed to by the
-// argument. Used to reset() fidl pointers and std::unique_ptr<>s fields.
-template <typename X>
-std::function<void(std::function<void()>)> Reset(
-    std::unique_ptr<X>* const field) {
-  return [field](std::function<void()> cont) {
-    field->reset();
-    cont();
-  };
-}
-
-template <typename X>
-std::function<void(std::function<void()>)> Reset(
-    fidl::InterfacePtr<X>* const field) {
-  return [field](std::function<void()> cont) {
-    field->Unbind();
-    cont();
-  };
-}
-
-// Creates a function that can be used as termination action passed to AtEnd(),
-// which when called asynchronously invokes the Teardown() method on the object
-// pointed to by the argument. Used to teardown AppClient and AsyncHolder
-// members.
-template <typename X>
-std::function<void(std::function<void()>)> Teardown(const zx::duration timeout,
-                                                    const char* const message,
-                                                    X* const field) {
-  return [timeout, message, field](std::function<void()> cont) {
-    field->Teardown(timeout, [message, cont] {
-      if (message) {
-        FXL_DLOG(INFO) << "- " << message << " down.";
-      }
-      cont();
-    });
-  };
-}
-
-}  // namespace
-
-class SessionmgrImpl::PresentationProviderImpl : public PresentationProvider {
- public:
-  PresentationProviderImpl(SessionmgrImpl* const impl) : impl_(impl) {}
-  ~PresentationProviderImpl() override = default;
-
- private:
-  // |PresentationProvider|
-  void GetPresentation(fidl::StringPtr story_id,
-                       fidl::InterfaceRequest<fuchsia::ui::policy::Presentation>
-                           request) override {
-    if (impl_->session_shell_app_) {
-      fuchsia::modular::SessionShellPresentationProviderPtr provider;
-      impl_->session_shell_app_->services().ConnectToService(
-          provider.NewRequest());
-      provider->GetPresentation(std::move(story_id), std::move(request));
-    }
-  }
-
-  void WatchVisualState(
-      fidl::StringPtr story_id,
-      fidl::InterfaceHandle<fuchsia::modular::StoryVisualStateWatcher> watcher)
-      override {
-    if (impl_->session_shell_app_) {
-      fuchsia::modular::SessionShellPresentationProviderPtr provider;
-      impl_->session_shell_app_->services().ConnectToService(
-          provider.NewRequest());
-      provider->WatchVisualState(std::move(story_id), std::move(watcher));
-    }
-  }
-
-  SessionmgrImpl* const impl_;
-};
-
-SessionmgrImpl::SessionmgrImpl(component::StartupContext* const startup_context,
-                               const Options& options)
-    : startup_context_(startup_context),
-      options_(options),
-      story_provider_impl_("StoryProviderImpl"),
-      agent_runner_("AgentRunner") {
-  startup_context_->outgoing()
-      .AddPublicService<fuchsia::modular::internal::Sessionmgr>(
-          [this](fidl::InterfaceRequest<fuchsia::modular::internal::Sessionmgr>
-                     request) {
-            bindings_.AddBinding(this, std::move(request));
-          });
-}
-
-SessionmgrImpl::~SessionmgrImpl() = default;
-
-void SessionmgrImpl::Initialize(
-    fuchsia::modular::auth::AccountPtr account,
-    fuchsia::modular::AppConfig session_shell,
-    fuchsia::modular::AppConfig story_shell,
-    fidl::InterfaceHandle<fuchsia::auth::TokenManager> ledger_token_manager,
-    fidl::InterfaceHandle<fuchsia::auth::TokenManager> agent_token_manager,
-    fidl::InterfaceHandle<fuchsia::modular::internal::UserContext> user_context,
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-        view_owner_request) {
-  // This is called in the service connection factory callbacks for session
-  // shell (see how RunSessionShell() initializes session_shell_services_) to
-  // lazily initialize the following services only once they are requested
-  // for the first time.
-  finish_initialization_ =
-      [this, called = false, session_shell_url = session_shell.url,
-       ledger_token_manager = std::move(ledger_token_manager),
-       story_shell = std::move(story_shell)]() mutable {
-        if (called) {
-          return;
-        }
-        called = true;
-
-        InitializeLedger(std::move(ledger_token_manager));
-        InitializeDeviceMap();
-        InitializeMessageQueueManager();
-        InitializeMaxwellAndModular(session_shell_url, std::move(story_shell));
-        ConnectSessionShellToStoryProvider();
-        AtEnd([this](std::function<void()> cont) {
-          TerminateSessionShell(cont);
-        });
-        InitializeClipboard();
-        ReportEvent(ModularEvent::BOOTED_TO_SESSIONMGR);
-      };
-
-  InitializeUser(std::move(account), std::move(agent_token_manager),
-                 std::move(user_context));
-  InitializeSessionShell(
-      std::move(session_shell),
-      zx::eventpair(view_owner_request.TakeChannel().release()));
-}
-
-void SessionmgrImpl::ConnectSessionShellToStoryProvider() {
-  fuchsia::modular::SessionShellPtr session_shell;
-  session_shell_app_->services().ConnectToService(session_shell.NewRequest());
-  story_provider_impl_->SetSessionShell(std::move(session_shell));
-}
-
-void SessionmgrImpl::InitializeUser(
-    fuchsia::modular::auth::AccountPtr account,
-    fidl::InterfaceHandle<fuchsia::auth::TokenManager> agent_token_manager,
-    fidl::InterfaceHandle<fuchsia::modular::internal::UserContext>
-        user_context) {
-  agent_token_manager_ = agent_token_manager.Bind();
-  AtEnd(Reset(&agent_token_manager_));
-
-  user_context_ = user_context.Bind();
-  AtEnd(Reset(&user_context_));
-
-  account_ = std::move(account);
-  AtEnd(Reset(&account_));
-
-  static const auto* const kEnvServices = new std::vector<std::string>{
-      fuchsia::modular::DeviceMap::Name_, fuchsia::modular::Clipboard::Name_};
-  user_environment_ = std::make_unique<Environment>(
-      startup_context_->environment(),
-      std::string(kUserEnvironmentLabelPrefix) + GetAccountId(account_),
-      *kEnvServices,
-      /* kill_on_oom = */ true);
-  AtEnd(Reset(&user_environment_));
-}
-
-zx::channel SessionmgrImpl::GetLedgerRepositoryDirectory() {
-  if (options_.use_memfs_for_ledger) {
-    FXL_DCHECK(!memfs_for_ledger_)
-        << "An existing memfs for the Ledger has already been initialized.";
-    FXL_LOG(INFO) << "Using memfs-backed storage for the ledger.";
-    memfs_for_ledger_ = std::make_unique<scoped_tmpfs::ScopedTmpFS>();
-    AtEnd(Reset(&memfs_for_ledger_));
-
-    return fsl::CloneChannelFromFileDescriptor(memfs_for_ledger_->root_fd());
-  }
-  if (!files::CreateDirectory(kLedgerRepositoryDirectory)) {
-    FXL_LOG(ERROR) << "Unable to create directory at "
-                   << kLedgerRepositoryDirectory;
-    return zx::channel();
-  }
-  fxl::UniqueFD dir(open(kLedgerRepositoryDirectory, O_PATH));
-  if (!dir.is_valid()) {
-    FXL_LOG(ERROR) << "Unable to open directory at "
-                   << kLedgerRepositoryDirectory << ". errno: " << errno;
-    return zx::channel();
-  }
-
-  return fsl::CloneChannelFromFileDescriptor(dir.get());
-}
-
-void SessionmgrImpl::InitializeLedger(
-    fidl::InterfaceHandle<fuchsia::auth::TokenManager> ledger_token_manager) {
-  fuchsia::modular::AppConfig ledger_config;
-  ledger_config.url = kLedgerAppUrl;
-
-  ledger_app_ =
-      std::make_unique<AppClient<fuchsia::ledger::internal::LedgerController>>(
-          user_environment_->GetLauncher(), std::move(ledger_config), "",
-          nullptr);
-  ledger_app_->SetAppErrorHandler([this] {
-    FXL_LOG(ERROR) << "Ledger seems to have crashed unexpectedly." << std::endl
-                   << "CALLING Logout() DUE TO UNRECOVERABLE LEDGER ERROR.";
-    Logout();
-  });
-  AtEnd(Teardown(kBasicTimeout, "Ledger", ledger_app_.get()));
-
-  fuchsia::ledger::cloud::CloudProviderPtr cloud_provider;
-  std::string ledger_user_id;
-  if (account_ && !options_.no_cloud_provider_for_ledger) {
-    // If not running in Guest mode, spin up a cloud provider for Ledger to use
-    // for syncing.
-    fuchsia::modular::AppConfig cloud_provider_config;
-    cloud_provider_config.url = kCloudProviderFirestoreAppUrl;
-    cloud_provider_app_ =
-        std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
-            user_environment_->GetLauncher(), std::move(cloud_provider_config));
-    cloud_provider_app_->services().ConnectToService(
-        cloud_provider_factory_.NewRequest());
-
-    cloud_provider = GetCloudProvider(std::move(ledger_token_manager));
-    ledger_user_id = account_->profile_id;
-
-    // TODO(mesch): Teardown cloud_provider_app_ ?
-  }
-
-  ledger_repository_factory_.set_error_handler([this](zx_status_t status) {
-    FXL_LOG(ERROR) << "LedgerRepositoryFactory.GetRepository() failed: "
-                   << LedgerEpitaphToString(status) << std::endl
-                   << "CALLING Logout() DUE TO UNRECOVERABLE LEDGER ERROR.";
-    Logout();
-  });
-  ledger_app_->services().ConnectToService(
-      ledger_repository_factory_.NewRequest());
-  AtEnd(Reset(&ledger_repository_factory_));
-
-  // The directory "/data" is the data root "/data/LEDGER" that the ledger app
-  // client is configured to.
-  ledger_repository_factory_->GetRepository(
-      GetLedgerRepositoryDirectory(), std::move(cloud_provider), ledger_user_id,
-      ledger_repository_.NewRequest());
-
-  // If ledger state is erased from underneath us (happens when the cloud store
-  // is cleared), ledger will close the connection to |ledger_repository_|.
-  ledger_repository_.set_error_handler([this](zx_status_t status) {
-    FXL_LOG(ERROR) << "LedgerRepository disconnected with epitaph: "
-                   << LedgerEpitaphToString(status) << std::endl
-                   << "CALLING Logout() DUE TO UNRECOVERABLE LEDGER ERROR.";
-    Logout();
-  });
-  AtEnd(Reset(&ledger_repository_));
-
-  ledger_client_ =
-      std::make_unique<LedgerClient>(ledger_repository_.get(), kAppId, [this] {
-        FXL_LOG(ERROR) << "CALLING Logout() DUE TO UNRECOVERABLE LEDGER ERROR.";
-        Logout();
-      });
-  AtEnd(Reset(&ledger_client_));
-}
-
-void SessionmgrImpl::InitializeDeviceMap() {
-  // fuchsia::modular::DeviceMap service
-  const std::string device_id = LoadDeviceID(GetAccountId(account_));
-  device_name_ = LoadDeviceName(GetAccountId(account_));
-  const std::string device_profile = LoadDeviceProfile();
-
-  device_map_impl_ = std::make_unique<DeviceMapImpl>(
-      device_name_, device_id, device_profile, ledger_client_.get(),
-      fuchsia::ledger::PageId());
-  user_environment_->AddService<fuchsia::modular::DeviceMap>(
-      [this](fidl::InterfaceRequest<fuchsia::modular::DeviceMap> request) {
-        if (terminating_) {
-          return;
-        }
-        // device_map_impl_ may be reset before user_environment_.
-        if (device_map_impl_) {
-          device_map_impl_->Connect(std::move(request));
-        }
-      });
-  AtEnd(Reset(&device_map_impl_));
-}
-
-void SessionmgrImpl::InitializeClipboard() {
-  agent_runner_->ConnectToAgent(kAppId, kClipboardAgentUrl,
-                                services_from_clipboard_agent_.NewRequest(),
-                                clipboard_agent_controller_.NewRequest());
-  user_environment_->AddService<fuchsia::modular::Clipboard>(
-      [this](fidl::InterfaceRequest<fuchsia::modular::Clipboard> request) {
-        if (terminating_) {
-          return;
-        }
-        services_from_clipboard_agent_->ConnectToService(
-            fuchsia::modular::Clipboard::Name_, request.TakeChannel());
-      });
-}
-
-void SessionmgrImpl::InitializeMessageQueueManager() {
-  std::string message_queue_path = kMessageQueuePath;
-  message_queue_path.append(GetAccountId(account_));
-  if (!files::CreateDirectory(message_queue_path)) {
-    FXL_LOG(FATAL) << "Failed to create message queue directory: "
-                   << message_queue_path;
-  }
-
-  message_queue_manager_ = std::make_unique<MessageQueueManager>(
-      ledger_client_.get(), MakePageId(kMessageQueuePageId),
-      message_queue_path);
-  AtEnd(Reset(&message_queue_manager_));
-}
-
-void SessionmgrImpl::InitializeMaxwellAndModular(
-    const fidl::StringPtr& session_shell_url,
-    fuchsia::modular::AppConfig story_shell) {
-  // NOTE: There is an awkward service exchange here between
-  // AgentRunner, StoryProviderImpl, FocusHandler, VisibleStoriesHandler.
-  //
-  // AgentRunner needs a UserIntelligenceProvider. Initializing the
-  // Maxwell process UserIntelligenceProvider requires a ComponentContext.
-  // ComponentContext requires an AgentRunner, which creates a circular
-  // dependency.
-  //
-  // Because of FIDL late bindings, we can get around this by creating a new
-  // InterfaceRequest here (|intelligence_provider_request|), making the
-  // InterfacePtr a valid proxy to be passed to AgentRunner and
-  // StoryProviderImpl, even though it won't be bound to a real implementation
-  // (provided by Maxwell) until later. It works, but it's not a good pattern.
-
-  fidl::InterfaceHandle<fuchsia::modular::ContextEngine> context_engine;
-  auto context_engine_request = context_engine.NewRequest();
-
-  fidl::InterfaceHandle<fuchsia::modular::StoryProvider> story_provider;
-  auto story_provider_request = story_provider.NewRequest();
-
-  fidl::InterfaceHandle<fuchsia::modular::FocusProvider> focus_provider_maxwell;
-  auto focus_provider_request_maxwell = focus_provider_maxwell.NewRequest();
-
-  fidl::InterfaceHandle<fuchsia::modular::PuppetMaster> puppet_master;
-  auto puppet_master_request = puppet_master.NewRequest();
-
-  fidl::InterfaceHandle<fuchsia::modular::VisibleStoriesProvider>
-      visible_stories_provider;
-  auto visible_stories_provider_request = visible_stories_provider.NewRequest();
-
-  user_intelligence_provider_impl_.reset(new UserIntelligenceProviderImpl(
-      startup_context_, std::move(context_engine),
-      [this](fidl::InterfaceRequest<fuchsia::modular::VisibleStoriesProvider>
-                 request) {
-        if (terminating_) {
-          return;
-        }
-        visible_stories_handler_->AddProviderBinding(std::move(request));
-      },
-      [this](fidl::InterfaceRequest<fuchsia::modular::StoryProvider> request) {
-        if (terminating_) {
-          return;
-        }
-        story_provider_impl_->Connect(std::move(request));
-      },
-      [this](fidl::InterfaceRequest<fuchsia::modular::FocusProvider> request) {
-        if (terminating_) {
-          return;
-        }
-        focus_handler_->AddProviderBinding(std::move(request));
-      },
-      [this](fidl::InterfaceRequest<fuchsia::modular::PuppetMaster> request) {
-        if (terminating_) {
-          return;
-        }
-        puppet_master_impl_->Connect(std::move(request));
-      }));
-  AtEnd(Reset(&user_intelligence_provider_impl_));
-
-  entity_provider_runner_ = std::make_unique<EntityProviderRunner>(
-      static_cast<EntityProviderLauncher*>(this));
-  AtEnd(Reset(&entity_provider_runner_));
-
-  agent_runner_storage_ = std::make_unique<AgentRunnerStorageImpl>(
-      ledger_client_.get(), MakePageId(kAgentRunnerPageId));
-  AtEnd(Reset(&agent_runner_storage_));
-
-  agent_runner_.reset(new AgentRunner(
-      user_environment_->GetLauncher(), message_queue_manager_.get(),
-      ledger_repository_.get(), agent_runner_storage_.get(),
-      agent_token_manager_.get(), user_intelligence_provider_impl_.get(),
-      entity_provider_runner_.get()));
-  AtEnd(Teardown(kAgentRunnerTimeout, "AgentRunner", &agent_runner_));
-
-  maxwell_component_context_bindings_ = std::make_unique<
-      fidl::BindingSet<fuchsia::modular::ComponentContext,
-                       std::unique_ptr<ComponentContextImpl>>>();
-  AtEnd(Reset(&maxwell_component_context_bindings_));
-
-  ComponentContextInfo component_context_info{
-      message_queue_manager_.get(), agent_runner_.get(),
-      ledger_repository_.get(), entity_provider_runner_.get()};
-  // Start kContextEngineUrl.
-  {
-    context_engine_ns_services_.AddService<fuchsia::modular::ComponentContext>(
-        [this, component_context_info](
-            fidl::InterfaceRequest<fuchsia::modular::ComponentContext>
-                request) {
-          maxwell_component_context_bindings_->AddBinding(
-              std::make_unique<ComponentContextImpl>(
-                  component_context_info, kContextEngineComponentNamespace,
-                  kContextEngineUrl, kContextEngineUrl),
-              std::move(request));
-        });
-    auto service_list = fuchsia::sys::ServiceList::New();
-    service_list->names.push_back(fuchsia::modular::ComponentContext::Name_);
-    context_engine_ns_services_.AddBinding(service_list->provider.NewRequest());
-
-    fuchsia::modular::AppConfig context_engine_config;
-    context_engine_config.url = kContextEngineUrl;
-
-    context_engine_app_ =
-        std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
-            user_environment_->GetLauncher(), std::move(context_engine_config),
-            "" /* data_origin */, std::move(service_list));
-    context_engine_app_->services().ConnectToService(
-        std::move(context_engine_request));
-    AtEnd(Reset(&context_engine_app_));
-    AtEnd(Teardown(kBasicTimeout, "ContextEngine", context_engine_app_.get()));
-  }
-
-  auto maxwell_app_component_context =
-      maxwell_component_context_bindings_->AddBinding(
-          std::make_unique<ComponentContextImpl>(component_context_info,
-                                                 kMaxwellComponentNamespace,
-                                                 kMaxwellUrl, kMaxwellUrl));
-
-  user_intelligence_provider_impl_->StartAgents(
-      std::move(maxwell_app_component_context), options_.session_agents,
-      options_.startup_agents);
-
-  // Setup for kModuleResolverUrl
-  {
-    module_resolver_ns_services_.AddService<
-        fuchsia::modular::IntelligenceServices>(
-        [this](fidl::InterfaceRequest<fuchsia::modular::IntelligenceServices>
-                   request) {
-          fuchsia::modular::ComponentScope component_scope;
-          component_scope.set_global_scope(fuchsia::modular::GlobalScope());
-          fidl::InterfaceHandle<fuchsia::modular::IntelligenceServices>
-              intelligence_services;
-          if (user_intelligence_provider_impl_) {
-            user_intelligence_provider_impl_->GetComponentIntelligenceServices(
-                std::move(component_scope), std::move(request));
-          }
-        });
-    module_resolver_ns_services_.AddService<fuchsia::modular::ComponentContext>(
-        [this, component_context_info](
-            fidl::InterfaceRequest<fuchsia::modular::ComponentContext>
-                request) {
-          maxwell_component_context_bindings_->AddBinding(
-              std::make_unique<ComponentContextImpl>(
-                  component_context_info, kMaxwellComponentNamespace,
-                  kModuleResolverUrl, kModuleResolverUrl),
-              std::move(request));
-        });
-    auto service_list = fuchsia::sys::ServiceList::New();
-    service_list->names.push_back(
-        fuchsia::modular::IntelligenceServices::Name_);
-    service_list->names.push_back(fuchsia::modular::ComponentContext::Name_);
-    module_resolver_ns_services_.AddBinding(
-        service_list->provider.NewRequest());
-
-    fuchsia::modular::AppConfig module_resolver_config;
-    module_resolver_config.url = kModuleResolverUrl;
-    if (options_.test) {
-      module_resolver_config.args.push_back("--test");
-    }
-    // For now, we want data_origin to be "", which uses our (parent process's)
-    // /data. This is appropriate for the module_resolver. We can in the future
-    // isolate the data it reads to a subdir of /data and map that in here.
-    module_resolver_app_ =
-        std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
-            user_environment_->GetLauncher(), std::move(module_resolver_config),
-            "" /* data_origin */, std::move(service_list));
-    AtEnd(Reset(&module_resolver_app_));
-    AtEnd(Teardown(kBasicTimeout, "Resolver", module_resolver_app_.get()));
-  }
-
-  module_resolver_app_->services().ConnectToService(
-      module_resolver_service_.NewRequest());
-  AtEnd(Reset(&module_resolver_service_));
-  // End kModuleResolverUrl
-
-  session_shell_component_context_impl_ =
-      std::make_unique<ComponentContextImpl>(
-          component_context_info, kSessionShellComponentNamespace,
-          session_shell_url, session_shell_url);
-
-  AtEnd(Reset(&session_shell_component_context_impl_));
-
-  fidl::InterfacePtr<fuchsia::modular::FocusProvider>
-      focus_provider_story_provider;
-  auto focus_provider_request_story_provider =
-      focus_provider_story_provider.NewRequest();
-
-  presentation_provider_impl_ =
-      std::make_unique<PresentationProviderImpl>(this);
-  AtEnd(Reset(&presentation_provider_impl_));
-
-  // We create |story_provider_impl_| after |agent_runner_| so
-  // story_provider_impl_ is terminated before agent_runner_, which will cause
-  // all modules to be terminated before agents are terminated. Agents must
-  // outlive the stories which contain modules that are connected to those
-  // agents.
-  session_storage_ = std::make_unique<SessionStorage>(
-      ledger_client_.get(), fuchsia::ledger::PageId());
-
-  module_facet_reader_.reset(new ModuleFacetReaderImpl(
-      startup_context_->ConnectToEnvironmentService<fuchsia::sys::Loader>()));
-
-  story_provider_impl_.reset(new StoryProviderImpl(
-      user_environment_.get(), device_map_impl_->current_device_id(),
-      session_storage_.get(), std::move(story_shell), component_context_info,
-      std::move(focus_provider_story_provider),
-      user_intelligence_provider_impl_.get(), module_resolver_service_.get(),
-      entity_provider_runner_.get(), module_facet_reader_.get(),
-      presentation_provider_impl_.get(),
-      startup_context_
-          ->ConnectToEnvironmentService<fuchsia::ui::viewsv1::ViewSnapshot>(),
-      options_.test));
-  story_provider_impl_->Connect(std::move(story_provider_request));
-
-  AtEnd(
-      Teardown(kStoryProviderTimeout, "StoryProvider", &story_provider_impl_));
-
-  fuchsia::modular::FocusProviderPtr focus_provider_puppet_master;
-  auto focus_provider_request_puppet_master =
-      focus_provider_puppet_master.NewRequest();
-  fuchsia::modular::StoryProviderPtr story_provider_puppet_master;
-  auto story_provider_puppet_master_request =
-      story_provider_puppet_master.NewRequest();
-
-  // Initialize the PuppetMaster.
-  // TODO(miguelfrde): there's no clean runtime interface we can inject to
-  // puppet master. Hence, for now we inject this function to be able to focus
-  // mods. Eventually we want to have a StoryRuntime and SessionRuntime classes
-  // similar to Story/SessionStorage but for runtime management.
-  auto module_focuser =
-      [story_provider = std::move(story_provider_puppet_master)](
-          std::string story_id, std::vector<std::string> mod_name) {
-        fuchsia::modular::StoryControllerPtr story_controller;
-        story_provider->GetController(story_id, story_controller.NewRequest());
-
-        fuchsia::modular::ModuleControllerPtr module_controller;
-        story_controller->GetModuleController(std::move(mod_name),
-                                              module_controller.NewRequest());
-        module_controller->Focus();
-      };
-  AtEnd(Reset(&session_storage_));
-  story_command_executor_ = MakeProductionStoryCommandExecutor(
-      session_storage_.get(), std::move(focus_provider_puppet_master),
-      module_resolver_service_.get(), entity_provider_runner_.get(),
-      std::move(module_focuser));
-  story_provider_impl_->Connect(
-      std::move(story_provider_puppet_master_request));
-  puppet_master_impl_ = std::make_unique<PuppetMasterImpl>(
-      session_storage_.get(), story_command_executor_.get());
-  puppet_master_impl_->Connect(std::move(puppet_master_request));
-
-  session_ctl_ =
-      std::make_unique<SessionCtl>(startup_context_->outgoing().debug_dir(),
-                                   kSessionCtlDir, puppet_master_impl_.get());
-
-  AtEnd(Reset(&story_command_executor_));
-  AtEnd(Reset(&puppet_master_impl_));
-  AtEnd(Reset(&session_ctl_));
-
-  focus_handler_ = std::make_unique<FocusHandler>(
-      device_map_impl_->current_device_id(), ledger_client_.get(),
-      fuchsia::ledger::PageId());
-  focus_handler_->AddProviderBinding(std::move(focus_provider_request_maxwell));
-  focus_handler_->AddProviderBinding(
-      std::move(focus_provider_request_story_provider));
-  focus_handler_->AddProviderBinding(
-      std::move(focus_provider_request_puppet_master));
-
-  visible_stories_handler_ = std::make_unique<VisibleStoriesHandler>();
-  visible_stories_handler_->AddProviderBinding(
-      std::move(visible_stories_provider_request));
-
-  AtEnd(Reset(&focus_handler_));
-  AtEnd(Reset(&visible_stories_handler_));
-}
-
-void SessionmgrImpl::InitializeSessionShell(
-    fuchsia::modular::AppConfig session_shell, zx::eventpair view_token) {
-  // We setup our own view and make the fuchsia::modular::SessionShell a child
-  // of it.
-  auto scenic =
-      startup_context_
-          ->ConnectToEnvironmentService<fuchsia::ui::scenic::Scenic>();
-  scenic::ViewContext view_context = {
-      .session_and_listener_request =
-          scenic::CreateScenicSessionPtrAndListenerRequest(scenic.get()),
-      .view_token = std::move(view_token),
-      .startup_context = startup_context_,
-  };
-  session_shell_view_host_ =
-      std::make_unique<ViewHost>(std::move(view_context));
-  RunSessionShell(std::move(session_shell));
-}
-
-void SessionmgrImpl::RunSessionShell(
-    fuchsia::modular::AppConfig session_shell_config) {
-  // |session_shell_services_| is a ServiceProvider (aka a Directory) that
-  // augments the session shell's namespace.
-  //
-  // |service_list| enumerates which services are made available to the session
-  // shell.
-  auto service_list = fuchsia::sys::ServiceList::New();
-
-  service_list->names.push_back(fuchsia::modular::SessionShellContext::Name_);
-  session_shell_services_.AddService<fuchsia::modular::SessionShellContext>(
-      [this](auto request) {
-        if (terminating_) {
-          return;
-        }
-        finish_initialization_();
-        session_shell_context_bindings_.AddBinding(this, std::move(request));
-      });
-
-  service_list->names.push_back(fuchsia::modular::ComponentContext::Name_);
-  session_shell_services_.AddService<fuchsia::modular::ComponentContext>(
-      [this](auto request) {
-        if (terminating_) {
-          return;
-        }
-        finish_initialization_();
-        session_shell_component_context_impl_->Connect(std::move(request));
-      });
-
-  service_list->names.push_back(fuchsia::modular::PuppetMaster::Name_);
-  session_shell_services_.AddService<fuchsia::modular::PuppetMaster>(
-      [this](auto request) {
-        if (terminating_) {
-          return;
-        }
-        finish_initialization_();
-        puppet_master_impl_->Connect(std::move(request));
-      });
-
-  service_list->names.push_back(fuchsia::modular::IntelligenceServices::Name_);
-  session_shell_services_.AddService<fuchsia::modular::IntelligenceServices>(
-      [this](auto request) {
-        if (terminating_) {
-          return;
-        }
-        finish_initialization_();
-        fuchsia::modular::ComponentScope component_scope;
-        component_scope.set_global_scope(fuchsia::modular::GlobalScope());
-        user_intelligence_provider_impl_->GetComponentIntelligenceServices(
-            std::move(component_scope), std::move(request));
-      });
-
-  // The services in |session_shell_services_| are provided through the
-  // connection held in |session_shell_service_provider| connected to
-  // |session_shell_services_|.
-  {
-    fuchsia::sys::ServiceProviderPtr session_shell_service_provider;
-    session_shell_services_.AddBinding(
-        session_shell_service_provider.NewRequest());
-    service_list->provider = std::move(session_shell_service_provider);
-  }
-
-  session_shell_app_ = std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
-      user_environment_->GetLauncher(), std::move(session_shell_config),
-      /* data_origin = */ "", std::move(service_list));
-
-  session_shell_app_->SetAppErrorHandler([this] {
-    FXL_LOG(ERROR) << "Session Shell seems to have crashed unexpectedly."
-                   << " Logging out.";
-    Logout();
-  });
-
-  fuchsia::ui::viewsv1token::ViewOwnerPtr view_owner;
-  fuchsia::ui::viewsv1::ViewProviderPtr view_provider;
-  session_shell_app_->services().ConnectToService(view_provider.NewRequest());
-  view_provider->CreateView(view_owner.NewRequest(), nullptr);
-  session_shell_view_host_->ConnectView(std::move(view_owner));
-}
-
-void SessionmgrImpl::TerminateSessionShell(const std::function<void()>& done) {
-  session_shell_app_->Teardown(kBasicTimeout, [this, done] {
-    session_shell_app_.reset();
-    done();
-  });
-}
-
-class SessionmgrImpl::SwapSessionShellOperation : public Operation<> {
- public:
-  SwapSessionShellOperation(SessionmgrImpl* const sessionmgr_impl,
-                            fuchsia::modular::AppConfig session_shell_config,
-                            ResultCall result_call)
-      : Operation("SessionmgrImpl::SwapSessionShellOperation",
-                  std::move(result_call)),
-        sessionmgr_impl_(sessionmgr_impl),
-        session_shell_config_(std::move(session_shell_config)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-    sessionmgr_impl_->story_provider_impl_->StopAllStories([this, flow] {
-      sessionmgr_impl_->TerminateSessionShell([this, flow] {
-        sessionmgr_impl_->RunSessionShell(std::move(session_shell_config_));
-        sessionmgr_impl_->ConnectSessionShellToStoryProvider();
-      });
-    });
-  }
-
-  SessionmgrImpl* const sessionmgr_impl_;
-  fuchsia::modular::AppConfig session_shell_config_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SwapSessionShellOperation);
-};
-
-void SessionmgrImpl::SwapSessionShell(
-    fuchsia::modular::AppConfig session_shell_config,
-    SwapSessionShellCallback callback) {
-  operation_queue_.Add(new SwapSessionShellOperation(
-      this, std::move(session_shell_config), callback));
-}
-
-void SessionmgrImpl::Terminate(std::function<void()> done) {
-  FXL_LOG(INFO) << "Sessionmgr::Terminate()";
-  terminating_ = true;
-  at_end_done_ = std::move(done);
-
-  TerminateRecurse(at_end_.size() - 1);
-}
-
-void SessionmgrImpl::GetAccount(
-    std::function<void(::std::unique_ptr<::fuchsia::modular::auth::Account>)>
-        callback) {
-  callback(fidl::Clone(account_));
-}
-
-void SessionmgrImpl::GetAgentProvider(
-    fidl::InterfaceRequest<fuchsia::modular::AgentProvider> request) {
-  agent_runner_->Connect(std::move(request));
-}
-
-void SessionmgrImpl::GetComponentContext(
-    fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request) {
-  session_shell_component_context_impl_->Connect(std::move(request));
-}
-
-void SessionmgrImpl::GetDeviceName(
-    std::function<void(::std::string)> callback) {
-  callback(device_name_);
-}
-
-void SessionmgrImpl::GetFocusController(
-    fidl::InterfaceRequest<fuchsia::modular::FocusController> request) {
-  focus_handler_->AddControllerBinding(std::move(request));
-}
-
-void SessionmgrImpl::GetFocusProvider(
-    fidl::InterfaceRequest<fuchsia::modular::FocusProvider> request) {
-  focus_handler_->AddProviderBinding(std::move(request));
-}
-
-void SessionmgrImpl::GetLink(
-    fidl::InterfaceRequest<fuchsia::modular::Link> request) {
-  if (!session_shell_storage_) {
-    session_shell_storage_ = std::make_unique<StoryStorage>(
-        ledger_client_.get(), fuchsia::ledger::PageId());
-  }
-
-  fuchsia::modular::LinkPath link_path;
-  link_path.module_path.resize(0);
-  link_path.link_name = kSessionShellLinkName;
-  auto impl = std::make_unique<LinkImpl>(session_shell_storage_.get(),
-                                         std::move(link_path));
-  session_shell_link_bindings_.AddBinding(std::move(impl), std::move(request));
-}
-
-void SessionmgrImpl::GetPresentation(
-    fidl::InterfaceRequest<fuchsia::ui::policy::Presentation> request) {
-  user_context_->GetPresentation(std::move(request));
-}
-
-void SessionmgrImpl::GetSpeechToText(
-    fidl::InterfaceRequest<fuchsia::speech::SpeechToText> request) {
-  user_intelligence_provider_impl_->GetSpeechToText(std::move(request));
-}
-
-void SessionmgrImpl::GetStoryProvider(
-    fidl::InterfaceRequest<fuchsia::modular::StoryProvider> request) {
-  story_provider_impl_->Connect(std::move(request));
-}
-
-void SessionmgrImpl::GetSuggestionProvider(
-    fidl::InterfaceRequest<fuchsia::modular::SuggestionProvider> request) {
-  user_intelligence_provider_impl_->GetSuggestionProvider(std::move(request));
-}
-
-void SessionmgrImpl::GetVisibleStoriesController(
-    fidl::InterfaceRequest<fuchsia::modular::VisibleStoriesController>
-        request) {
-  visible_stories_handler_->AddControllerBinding(std::move(request));
-}
-
-void SessionmgrImpl::Logout() { user_context_->Logout(); }
-
-// |EntityProviderLauncher|
-void SessionmgrImpl::ConnectToEntityProvider(
-    const std::string& agent_url,
-    fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-        entity_provider_request,
-    fidl::InterfaceRequest<fuchsia::modular::AgentController>
-        agent_controller_request) {
-  FXL_DCHECK(agent_runner_.get());
-  agent_runner_->ConnectToEntityProvider(agent_url,
-                                         std::move(entity_provider_request),
-                                         std::move(agent_controller_request));
-}
-
-void SessionmgrImpl::ConnectToStoryEntityProvider(
-    const std::string& story_id,
-    fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-        entity_provider_request) {
-  story_provider_impl_->ConnectToStoryEntityProvider(
-      story_id, std::move(entity_provider_request));
-}
-
-fuchsia::ledger::cloud::CloudProviderPtr SessionmgrImpl::GetCloudProvider(
-    fidl::InterfaceHandle<fuchsia::auth::TokenManager> ledger_token_manager) {
-  FXL_CHECK(ledger_token_manager);
-
-  fuchsia::ledger::cloud::CloudProviderPtr cloud_provider;
-  auto cloud_provider_config = GetLedgerFirestoreConfig();
-
-  cloud_provider_factory_->GetCloudProvider(
-      std::move(cloud_provider_config), std::move(ledger_token_manager),
-      cloud_provider.NewRequest(), [](fuchsia::ledger::cloud::Status status) {
-        if (status != fuchsia::ledger::cloud::Status::OK) {
-          FXL_LOG(ERROR) << "Failed to create a cloud provider: "
-                         << fidl::ToUnderlying(status);
-        }
-      });
-  return cloud_provider;
-}
-
-void SessionmgrImpl::AtEnd(std::function<void(std::function<void()>)> action) {
-  at_end_.emplace_back(std::move(action));
-}
-
-void SessionmgrImpl::TerminateRecurse(const int i) {
-  if (i >= 0) {
-    at_end_[i]([this, i] { TerminateRecurse(i - 1); });
-  } else {
-    FXL_LOG(INFO) << "Sessionmgr::Terminate(): done";
-    at_end_done_();
-  }
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/sessionmgr_impl.h b/bin/sessionmgr/sessionmgr_impl.h
deleted file mode 100644
index 19cc922..0000000
--- a/bin/sessionmgr/sessionmgr_impl.h
+++ /dev/null
@@ -1,322 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_SESSIONMGR_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_SESSIONMGR_IMPL_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-#include <fuchsia/ledger/cloud/firestore/cpp/fidl.h>
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/modular/auth/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/modular/internal/cpp/fidl.h>
-#include <fuchsia/speech/cpp/fidl.h>
-#include <fuchsia/ui/policy/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/component/cpp/service_provider_impl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_ptr.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <zx/eventpair.h>
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner_storage_impl.h"
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_launcher.h"
-#include "peridot/bin/sessionmgr/entity_provider_runner/entity_provider_runner.h"
-#include "peridot/bin/sessionmgr/user_intelligence_provider_impl.h"
-#include "peridot/lib/common/async_holder.h"
-#include "peridot/lib/fidl/app_client.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/fidl/environment.h"
-#include "peridot/lib/fidl/view_host.h"
-#include "peridot/lib/module_manifest/module_facet_reader.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace modular {
-
-class AgentRunner;
-class ComponentContextImpl;
-class DeviceMapImpl;
-class FocusHandler;
-class LedgerClient;
-class LinkImpl;
-class MessageQueueManager;
-class PuppetMasterImpl;
-class SessionCtl;
-class SessionStorage;
-class StoryCommandExecutor;
-class StoryProviderImpl;
-class StoryStorage;
-class VisibleStoriesHandler;
-
-class SessionmgrImpl : fuchsia::modular::internal::Sessionmgr,
-                       fuchsia::modular::SessionShellContext,
-                       EntityProviderLauncher {
- public:
-  struct Options {
-    // Tells the sessionmgr whether it is running as a part of an integration
-    // test.
-    bool test;
-    // Tells the sessionmgr whether it should host+pass a memfs-backed
-    // directory to the ledger for the user's repository, or to use
-    // /data/LEDGER.
-    bool use_memfs_for_ledger;
-
-    // If set, DO NOT pass a cloud provider to the ledger.
-    bool no_cloud_provider_for_ledger;
-
-    // Sessionmgr passes args startup agents and session agent to maxwell.
-    std::vector<std::string> startup_agents;
-    std::vector<std::string> session_agents;
-  };
-
-  SessionmgrImpl(component::StartupContext* startup_context,
-                 const Options& options);
-  ~SessionmgrImpl() override;
-
-  // |AppDriver| calls this.
-  void Terminate(std::function<void()> done);
-
- private:
-  // |Sessionmgr|
-  void Initialize(
-      fuchsia::modular::auth::AccountPtr account,
-      fuchsia::modular::AppConfig session_shell,
-      fuchsia::modular::AppConfig story_shell,
-      fidl::InterfaceHandle<fuchsia::auth::TokenManager> ledger_token_manager,
-      fidl::InterfaceHandle<fuchsia::auth::TokenManager> agent_token_manager,
-      fidl::InterfaceHandle<fuchsia::modular::internal::UserContext>
-          user_context,
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-          view_owner_request) override;
-
-  // |Sessionmgr|
-  void SwapSessionShell(fuchsia::modular::AppConfig session_shell_config,
-                        SwapSessionShellCallback callback) override;
-
-  // Sequence of Initialize() broken up into steps for clarity.
-  void InitializeUser(
-      fuchsia::modular::auth::AccountPtr account,
-      fidl::InterfaceHandle<fuchsia::auth::TokenManager> agent_token_manager,
-      fidl::InterfaceHandle<fuchsia::modular::internal::UserContext>
-          user_context);
-  void InitializeLedger(
-      fidl::InterfaceHandle<fuchsia::auth::TokenManager> ledger_token_manager);
-  void InitializeDeviceMap();
-  void InitializeClipboard();
-  void InitializeMessageQueueManager();
-  void InitializeMaxwellAndModular(const fidl::StringPtr& session_shell_url,
-                                   fuchsia::modular::AppConfig story_shell);
-  void InitializeSessionShell(fuchsia::modular::AppConfig session_shell,
-                              zx::eventpair view_token);
-
-  void RunSessionShell(fuchsia::modular::AppConfig session_shell);
-  // This is a termination sequence that may be used with |AtEnd()|, but also
-  // may be executed to terminate the currently running session shell.
-  void TerminateSessionShell(const std::function<void()>& done);
-
-  // Returns the file descriptor that backs the ledger repository directory for
-  // the user.
-  zx::channel GetLedgerRepositoryDirectory();
-
-  // |fuchsia::modular::SessionShellContext|
-  void GetAccount(
-      std::function<void(::std::unique_ptr<::fuchsia::modular::auth::Account>)>
-          callback) override;
-  void GetAgentProvider(
-      fidl::InterfaceRequest<fuchsia::modular::AgentProvider> request) override;
-  void GetComponentContext(
-      fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request)
-      override;
-  void GetDeviceName(std::function<void(::std::string)> callback) override;
-  void GetFocusController(
-      fidl::InterfaceRequest<fuchsia::modular::FocusController> request)
-      override;
-  void GetFocusProvider(
-      fidl::InterfaceRequest<fuchsia::modular::FocusProvider> request) override;
-  void GetLink(fidl::InterfaceRequest<fuchsia::modular::Link> request) override;
-  void GetPresentation(fidl::InterfaceRequest<fuchsia::ui::policy::Presentation>
-                           request) override;
-  void GetSpeechToText(
-      fidl::InterfaceRequest<fuchsia::speech::SpeechToText> request) override;
-  void GetStoryProvider(
-      fidl::InterfaceRequest<fuchsia::modular::StoryProvider> request) override;
-  void GetSuggestionProvider(
-      fidl::InterfaceRequest<fuchsia::modular::SuggestionProvider> request)
-      override;
-  void GetVisibleStoriesController(
-      fidl::InterfaceRequest<fuchsia::modular::VisibleStoriesController>
-          request) override;
-  void Logout() override;
-
-  // |EntityProviderLauncher|
-  void ConnectToEntityProvider(
-      const std::string& agent_url,
-      fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-          entity_provider_request,
-      fidl::InterfaceRequest<fuchsia::modular::AgentController>
-          agent_controller_request) override;
-
-  // |EntityProviderLauncher|
-  void ConnectToStoryEntityProvider(
-      const std::string& story_id,
-      fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-          entity_provider_request) override;
-
-  fuchsia::sys::ServiceProviderPtr GetServiceProvider(
-      fuchsia::modular::AppConfig config);
-  fuchsia::sys::ServiceProviderPtr GetServiceProvider(const std::string& url);
-
-  fuchsia::ledger::cloud::CloudProviderPtr GetCloudProvider(
-      fidl::InterfaceHandle<fuchsia::auth::TokenManager> ledger_token_manager);
-
-  // Called during initialization. Schedules the given action to be executed
-  // during termination. This allows to create something like an asynchronous
-  // destructor at initialization time. The sequence of actions thus scheduled
-  // is executed in reverse in Terminate().
-  //
-  // The AtEnd() calls for a field should happen next to the calls that
-  // initialize the field, for the following reasons:
-  //
-  // 1. It ensures the termination sequence corresponds to the initialization
-  //    sequence.
-  //
-  // 2. It is easy to audit that there is a termination action for every
-  //    initialization that needs one.
-  //
-  // 3. Conditional initialization also omits the termination (such as for
-  //    agents that are not started when runnign a test).
-  //
-  // See also the Reset() and Teardown() functions in the .cc file.
-  void AtEnd(std::function<void(std::function<void()>)> action);
-
-  // Recursively execute the termiation steps scheduled by AtEnd(). The
-  // execution steps are stored in at_end_.
-  void TerminateRecurse(int i);
-
-  void ConnectSessionShellToStoryProvider();
-
-  component::StartupContext* const startup_context_;
-  const Options options_;
-  std::unique_ptr<scoped_tmpfs::ScopedTmpFS> memfs_for_ledger_;
-
-  fidl::BindingSet<fuchsia::modular::internal::Sessionmgr> bindings_;
-  component::ServiceProviderImpl session_shell_services_;
-
-  fidl::BindingSet<fuchsia::modular::SessionShellContext>
-      session_shell_context_bindings_;
-
-  fuchsia::auth::TokenManagerPtr agent_token_manager_;
-  fuchsia::modular::internal::UserContextPtr user_context_;
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> cloud_provider_app_;
-  fuchsia::ledger::cloud::firestore::FactoryPtr cloud_provider_factory_;
-  std::unique_ptr<AppClient<fuchsia::ledger::internal::LedgerController>>
-      ledger_app_;
-  fuchsia::ledger::internal::LedgerRepositoryFactoryPtr
-      ledger_repository_factory_;
-  fuchsia::ledger::internal::LedgerRepositoryPtr ledger_repository_;
-  std::unique_ptr<LedgerClient> ledger_client_;
-  // Provides services to the Ledger
-  component::ServiceProviderImpl ledger_service_provider_;
-
-  std::unique_ptr<Environment> user_environment_;
-
-  fuchsia::modular::auth::AccountPtr account_;
-
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> context_engine_app_;
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> module_resolver_app_;
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> session_shell_app_;
-  std::unique_ptr<ViewHost> session_shell_view_host_;
-
-  std::unique_ptr<EntityProviderRunner> entity_provider_runner_;
-  std::unique_ptr<ModuleFacetReader> module_facet_reader_;
-
-  std::unique_ptr<SessionStorage> session_storage_;
-  AsyncHolder<StoryProviderImpl> story_provider_impl_;
-  std::unique_ptr<MessageQueueManager> message_queue_manager_;
-  std::unique_ptr<AgentRunnerStorage> agent_runner_storage_;
-  AsyncHolder<AgentRunner> agent_runner_;
-  std::unique_ptr<DeviceMapImpl> device_map_impl_;
-  std::string device_name_;
-
-  std::unique_ptr<StoryCommandExecutor> story_command_executor_;
-  std::unique_ptr<PuppetMasterImpl> puppet_master_impl_;
-
-  std::unique_ptr<SessionCtl> session_ctl_;
-
-  // Services we provide to |context_engine_app_|.
-  component::ServiceProviderImpl context_engine_ns_services_;
-
-  // These component contexts are supplied to:
-  // - the user intelligence provider so it can run agents and create message
-  //   queues
-  // - |context_engine_app_| so it can resolve entity references
-  // - |modular resolver_service_| so it can resolve entity references
-  std::unique_ptr<fidl::BindingSet<fuchsia::modular::ComponentContext,
-                                   std::unique_ptr<ComponentContextImpl>>>
-      maxwell_component_context_bindings_;
-
-  std::unique_ptr<UserIntelligenceProviderImpl>
-      user_intelligence_provider_impl_;
-
-  // Services we provide to the module resolver's namespace.
-  component::ServiceProviderImpl module_resolver_ns_services_;
-  fuchsia::modular::ModuleResolverPtr module_resolver_service_;
-
-  class PresentationProviderImpl;
-  std::unique_ptr<PresentationProviderImpl> presentation_provider_impl_;
-
-  std::unique_ptr<FocusHandler> focus_handler_;
-  std::unique_ptr<VisibleStoriesHandler> visible_stories_handler_;
-
-  // Component context given to session shell so that it can run agents and
-  // create message queues.
-  std::unique_ptr<ComponentContextImpl> session_shell_component_context_impl_;
-
-  // Given to the session shell so it can store its own data. These data are
-  // shared between all session shells (so it's not private to the session shell
-  // *app*).
-  std::unique_ptr<StoryStorage> session_shell_storage_;
-  fidl::BindingSet<fuchsia::modular::Link, std::unique_ptr<LinkImpl>>
-      session_shell_link_bindings_;
-
-  // Holds the actions scheduled by calls to the AtEnd() method.
-  std::vector<std::function<void(std::function<void()>)>> at_end_;
-
-  // Holds the done callback of Terminate() while the at_end_ actions are being
-  // executed. We can rely on Terminate() only being called once. (And if not,
-  // this could simply be made a vector as usual.)
-  std::function<void()> at_end_done_;
-
-  // The service provider used to connect to services advertised by the
-  // clipboard agent.
-  fuchsia::sys::ServiceProviderPtr services_from_clipboard_agent_;
-
-  // The agent controller used to control the clipboard agent.
-  fuchsia::modular::AgentControllerPtr clipboard_agent_controller_;
-
-  class SwapSessionShellOperation;
-
-  OperationQueue operation_queue_;
-
-  // Part of Initialize() that is deferred until the first environment service
-  // request is received from the session shell, in order to accelerate the
-  // startup of session shell.
-  fit::function<void()> finish_initialization_{[]{}};
-
-  // Set to |true| when sessionmgr starts its terminating sequence;  this flag
-  // can be used to determine whether to reject vending FIDL services.
-  bool terminating_ = false;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SessionmgrImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_SESSIONMGR_IMPL_H_
diff --git a/bin/sessionmgr/storage/BUILD.gn b/bin/sessionmgr/storage/BUILD.gn
deleted file mode 100644
index e7c02bb..0000000
--- a/bin/sessionmgr/storage/BUILD.gn
+++ /dev/null
@@ -1,158 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/tests_package.gni")
-
-tests_package("storage_unittests") {
-  deps = [
-    ":constants_and_utils_unittest",
-    ":session_storage_unittest",
-    ":story_storage_unittest",
-  ]
-}
-
-group("storage") {
-  public_deps = [
-    ":session_storage",
-    ":story_storage",
-  ]
-}
-
-source_set("constants_and_utils") {
-  sources = [
-    "constants_and_utils.cc",
-    "constants_and_utils.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/util",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-  ]
-}
-
-executable("constants_and_utils_unittest") {
-  testonly = true
-
-  sources = [
-    "constants_and_utils_unittest.cc",
-  ]
-
-  deps = [
-    ":constants_and_utils",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//third_party/googletest:gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("session_storage") {
-  sources = [
-    "session_storage.cc",
-    "session_storage.h",
-  ]
-
-  deps = [
-    ":session_storage_xdr",
-    "//peridot/bin/sessionmgr/storage:constants_and_utils",
-    "//peridot/lib/fidl:clone",
-    "//peridot/lib/ledger_client:operations",
-  ]
-
-  public_deps = [
-    ":story_storage",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-    "//peridot/public/lib/async/cpp:future",
-  ]
-}
-
-source_set("session_storage_xdr") {
-  sources = [
-    "session_storage_xdr.cc",
-    "session_storage_xdr.h",
-  ]
-
-  deps = [
-    "//peridot/lib/base64url",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-  ]
-}
-
-executable("session_storage_unittest") {
-  testonly = true
-
-  sources = [
-    "session_storage_unittest.cc",
-  ]
-
-  deps = [
-    ":session_storage",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/testing:test_with_ledger",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/lib/async/cpp:future",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("story_storage") {
-  sources = [
-    "story_storage.cc",
-    "story_storage.h",
-  ]
-
-  deps = [
-    ":story_storage_xdr",
-    "//peridot/bin/sessionmgr/storage:constants_and_utils",
-    "//peridot/lib/fidl:clone",
-    "//peridot/lib/ledger_client:operations",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-    "//peridot/public/lib/async/cpp:future",
-  ]
-}
-
-source_set("story_storage_xdr") {
-  sources = [
-    "story_storage_xdr.cc",
-    "story_storage_xdr.h",
-  ]
-
-  deps = [
-    "//peridot/lib/base64url",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/module_manifest:json_xdr",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-  ]
-}
-
-executable("story_storage_unittest") {
-  testonly = true
-
-  sources = [
-    "story_storage_unittest.cc",
-  ]
-
-  deps = [
-    ":story_storage",
-    "//peridot/lib/entity:entity_watcher",
-    "//peridot/lib/testing:test_with_ledger",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/lib/async/cpp:future",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/sessionmgr/storage/constants_and_utils.cc b/bin/sessionmgr/storage/constants_and_utils.cc
deleted file mode 100644
index 88e2793..0000000
--- a/bin/sessionmgr/storage/constants_and_utils.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-
-#include <string>
-#include <vector>
-
-#include <lib/fxl/strings/join_strings.h>
-
-#include "peridot/lib/util/string_escape.h"
-
-namespace modular {
-
-std::string MakeDeviceKey(const fidl::StringPtr& device_name) {
-  // Not escaped, because only one component after the prefix.
-  return kDeviceKeyPrefix + device_name.get();
-}
-
-std::string MakeFocusKey(const fidl::StringPtr& device_name) {
-  // Not escaped, because only one component after the prefix.
-  return kFocusKeyPrefix + device_name.get();
-}
-
-std::string MakeMessageQueuesPrefix(const std::string& component_namespace) {
-  std::string key{kMessageQueueTokenKeyPrefix};
-  key.append(StringEscape(component_namespace, kSeparator, kEscaper));
-  key.append(kSeparator);
-  return key;
-}
-
-std::string MakeMessageQueueTokenKey(const std::string& component_namespace,
-                                     const std::string& component_instance_id,
-                                     const std::string& queue_name) {
-  std::string key{kMessageQueueTokenKeyPrefix};
-  key.append(StringEscape(component_namespace, kSeparator, kEscaper));
-  key.append(kSeparator);
-  key.append(StringEscape(component_instance_id, kSeparator, kEscaper));
-  key.append(kSeparator);
-  key.append(StringEscape(queue_name, kSeparator, kEscaper));
-  return key;
-}
-
-std::string MakeMessageQueueKey(const std::string& queue_token) {
-  // Not escaped, because only one component after the prefix.
-  return kMessageQueueKeyPrefix + queue_token;
-}
-
-std::string EncodeModulePath(
-    const std::vector<std::string>& module_path) {
-  std::vector<std::string> segments;
-  segments.reserve(module_path.size());
-  for (const auto& module_path_part : module_path) {
-    segments.emplace_back(
-        StringEscape(module_path_part, kCharsToEscape, kEscaper));
-  }
-  return fxl::JoinStrings(segments, kSubSeparator);
-}
-
-std::string EncodeLinkPath(const fuchsia::modular::LinkPath& link_path) {
-  std::string output;
-  output.append(EncodeModulePath(link_path.module_path));
-  output.append(kSeparator);
-  output.append(
-      StringEscape(link_path.link_name.get(), kCharsToEscape, kEscaper));
-  return output;
-}
-
-std::string EncodeModuleComponentNamespace(const std::string& story_id) {
-  // TODO(mesch): Needs escaping, and must not be escaped when used as component
-  // of a full key. Messy.
-  return "story:" + story_id;
-}
-
-std::string MakeTriggerKey(const std::string& agent_url,
-                           const std::string& task_id) {
-  std::string key{kTriggerKeyPrefix};
-  key.append(StringEscape(agent_url, kCharsToEscape, kEscaper));
-  key.append(kSeparator);
-  key.append(StringEscape(task_id, kCharsToEscape, kEscaper));
-  return key;
-}
-
-std::string MakeLinkKey(const fuchsia::modular::LinkPathPtr& link_path) {
-  return MakeLinkKey(*link_path);
-}
-
-std::string MakeLinkKey(const fuchsia::modular::LinkPath& link_path) {
-  std::string key{kLinkKeyPrefix};
-  key.append(EncodeLinkPath(link_path));
-  return key;
-}
-
-std::string MakeModuleKey(const std::vector<std::string>& module_path) {
-  FXL_DCHECK(module_path.size() > 0)
-      << EncodeModulePath(module_path);
-  FXL_DCHECK(module_path.at(0).size() > 0) << EncodeModulePath(module_path);
-  std::string key{kModuleKeyPrefix};
-  key.append(EncodeModulePath(module_path));
-  return key;
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/storage/constants_and_utils.h b/bin/sessionmgr/storage/constants_and_utils.h
deleted file mode 100644
index 5bf85da..0000000
--- a/bin/sessionmgr/storage/constants_and_utils.h
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is a description of the pages and keys used by the modular runtime.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORAGE_CONSTANTS_AND_UTILS_H_
-#define PERIDOT_BIN_SESSIONMGR_STORAGE_CONSTANTS_AND_UTILS_H_
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fidl/cpp/string.h>
-
-namespace modular {
-
-// There are four kinds of pages used by the modular runtime:
-//
-// 1. The user root page contains a list of all stories and of all devices.
-//
-//
-// 2. The message queue page lists all message queues that exist.
-//
-constexpr char kMessageQueuePageId[] = "MessageQueuePage";  // 16 chars
-//
-// 3. The trigger page contains the trigger conditions for all agents.
-//
-constexpr char kAgentRunnerPageId[] = "AgentRunnerPage_";  // 16 chars
-//
-// 4. Story pages (one per story) contain the story state expressed as link and
-//    module data.
-
-// Keys in these pages are constructed as follows:
-//
-// 1. A prefix indicates the kind of information stored under the key. The
-//    prefix ends in a slash. The prefix is used to construct keys for reading
-//    and writing, and to filter keys for bulk reading and in change
-//    notifications.
-//
-//    Root page:
-constexpr char kStoryKeyPrefix[] = "Story/";
-constexpr char kDeviceKeyPrefix[] = "Device/";
-constexpr char kFocusKeyPrefix[] = "Focus/";
-
-// Keys under kStoryKeyPrefix
-constexpr char kStoryDataKeyPrefix[] = "Story/Data/";
-constexpr char kStorySnapshotKeyPrefix[] = "Story/Snapshot/";
-
-//
-//    Message Queue page:
-constexpr char kMessageQueueKeyPrefix[] = "fuchsia::modular::MessageQueue/";
-constexpr char kMessageQueueTokenKeyPrefix[] = "MessageQueueToken/";
-//
-//    fuchsia::modular::Agent Trigger page:
-constexpr char kTriggerKeyPrefix[] = "Trigger/";
-//
-//    Story page:
-constexpr char kLinkKeyPrefix[] =
-    "fuchsia::modular::Link|3/";  // version 3: no more incremental links
-constexpr char kModuleKeyPrefix[] = "Module/";
-constexpr char kEntityKeyPrefix[] = "Entity/";
-constexpr char kEntityNamePrefix[] = "EntityName/";
-
-// 2. ID values, separated by slashes, to identify the data item under this
-//    key. The set of ID values under each key is defined by the arguments of
-//    factory functions for the keys:
-//
-std::string MakeDeviceKey(const fidl::StringPtr& device_name);
-std::string MakeFocusKey(const fidl::StringPtr& device_name);
-std::string MakeMessageQueuesPrefix(const std::string& component_namespace);
-std::string MakeMessageQueueTokenKey(const std::string& component_namespace,
-                                     const std::string& component_instance_id,
-                                     const std::string& queue_name);
-std::string MakeMessageQueueKey(const std::string& queue_token);
-std::string MakeTriggerKey(const std::string& agent_url,
-                           const std::string& task_id);
-std::string MakeLinkKey(const fuchsia::modular::LinkPathPtr& link_path);
-std::string MakeLinkKey(const fuchsia::modular::LinkPath& link_path);
-std::string MakeModuleKey(const std::vector<std::string>& module_path);
-
-// 3. The slash separator is escaped by a backslash inside the ID
-//    values. Backslashes inside the ID values are escaped by backslash too.
-//
-constexpr char kSeparator[] = "/";
-constexpr char kEscaper = '\\';
-constexpr char kCharsToEscape[] = ":/";
-
-// 4. The ID values may have internal structure on their own too, expressed by a
-//    second sub separator character.
-//
-constexpr char kSubSeparator[] = ":";
-
-std::string EncodeLinkPath(const fuchsia::modular::LinkPath& link_path);
-std::string EncodeModulePath(
-    const std::vector<std::string>& module_path);
-std::string EncodeModuleComponentNamespace(const std::string& story_id);
-
-// More notes:
-//
-// * Although keys can be parsed, the information encoded in the keys is usually
-//   repeated in the value, and thus can be obtained without parsing the
-//   key. This is the preferred way, as it leaves the possibility open to
-//   replace key components with hashes.
-//
-// * The values under all keys are JSON. The structure of the JSON is defined by
-//   Xdr*() functions to be found in the page access code.
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORAGE_CONSTANTS_AND_UTILS_H_
diff --git a/bin/sessionmgr/storage/constants_and_utils_unittest.cc b/bin/sessionmgr/storage/constants_and_utils_unittest.cc
deleted file mode 100644
index ed149ee..0000000
--- a/bin/sessionmgr/storage/constants_and_utils_unittest.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-
-#include <string>
-#include <vector>
-
-#include <lib/fxl/strings/string_view.h>
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-TEST(Storage, EncodeModulePath) {
-  std::vector<std::string> fidl_array = {"foo", ":bar", "/baz"};
-  EXPECT_EQ("foo:\\:bar:\\/baz", EncodeModulePath(fidl_array));
-}
-
-TEST(Storage, EncodeLinkPath) {
-  std::vector<std::string> fidl_array = {"foo", ":bar"};
-  fuchsia::modular::LinkPath link_path;
-  link_path.link_name = "Fred";
-  link_path.module_path = std::move(fidl_array);
-  EXPECT_EQ("foo:\\:bar/Fred", EncodeLinkPath(link_path));
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/storage/session_storage.cc b/bin/sessionmgr/storage/session_storage.cc
deleted file mode 100644
index 28c4db7..0000000
--- a/bin/sessionmgr/storage/session_storage.cc
+++ /dev/null
@@ -1,522 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/storage/session_storage.h"
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/random/uuid.h>
-#include <unordered_set>
-
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/bin/sessionmgr/storage/session_storage_xdr.h"
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/ledger_client/operations.h"
-
-namespace modular {
-
-SessionStorage::SessionStorage(LedgerClient* ledger_client,
-                               LedgerPageId page_id)
-    : PageClient("SessionStorage", ledger_client, page_id, kStoryKeyPrefix),
-      ledger_client_(ledger_client) {
-  FXL_DCHECK(ledger_client_ != nullptr);
-}
-
-namespace {
-
-// TODO(rosswang): replace with |std::string::starts_with| after C++20
-bool StartsWith(const std::string& string, const std::string& prefix) {
-  return string.compare(0, prefix.size(), prefix) == 0;
-}
-
-fidl::StringPtr StoryNameToStoryDataKey(fidl::StringPtr story_name) {
-  // Not escaped, because only one component after the prefix.
-  return kStoryDataKeyPrefix + story_name.get();
-}
-
-fidl::StringPtr StoryNameFromStoryDataKey(fidl::StringPtr key) {
-  return key->substr(sizeof(kStoryDataKeyPrefix) - 1);
-}
-
-fidl::StringPtr StoryNameToStorySnapshotKey(fidl::StringPtr story_name) {
-  // Not escaped, because only one component after the prefix.
-  return kStorySnapshotKeyPrefix + story_name.get();
-}
-
-OperationBase* MakeGetStoryDataCall(
-    fuchsia::ledger::Page* const page, fidl::StringPtr story_name,
-    std::function<void(fuchsia::modular::internal::StoryDataPtr)> result_call) {
-  return new ReadDataCall<fuchsia::modular::internal::StoryData>(
-      page, StoryNameToStoryDataKey(story_name), true /* not_found_is_ok */,
-      XdrStoryData, std::move(result_call));
-};
-
-OperationBase* MakeWriteStoryDataCall(
-    fuchsia::ledger::Page* const page,
-    fuchsia::modular::internal::StoryDataPtr story_data,
-    std::function<void()> result_call) {
-  return new WriteDataCall<fuchsia::modular::internal::StoryData>(
-      page, StoryNameToStoryDataKey(story_data->story_info.id), XdrStoryData,
-      std::move(story_data), std::move(result_call));
-};
-
-class CreateStoryCall
-    : public LedgerOperation<fidl::StringPtr, fuchsia::ledger::PageId> {
- public:
-  CreateStoryCall(
-      fuchsia::ledger::Ledger* const ledger,
-      fuchsia::ledger::Page* const root_page, fidl::StringPtr story_name,
-      fidl::VectorPtr<fuchsia::modular::StoryInfoExtraEntry> extra_info,
-      fuchsia::modular::StoryOptions story_options, ResultCall result_call)
-      : LedgerOperation("SessionStorage::CreateStoryCall", ledger, root_page,
-                        std::move(result_call)),
-        story_name_(std::move(story_name)),
-        extra_info_(std::move(extra_info)),
-        story_options_(std::move(story_options)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &story_name_, &story_page_id_};
-    ledger()->GetPage(nullptr, story_page_.NewRequest(),
-                      Protect([this, flow](fuchsia::ledger::Status status) {
-                        if (status != fuchsia::ledger::Status::OK) {
-                          FXL_LOG(ERROR) << trace_name() << " "
-                                         << "Ledger.GetPage() "
-                                         << fidl::ToUnderlying(status);
-                        }
-                      }));
-    story_page_->GetId([this, flow](fuchsia::ledger::PageId id) {
-      story_page_id_ = std::move(id);
-      Cont(flow);
-    });
-  }
-
-  void Cont(FlowToken flow) {
-    // TODO(security), cf. FW-174. This ID is exposed in public services
-    // such as fuchsia::modular::StoryProvider.PreviousStories(),
-    // fuchsia::modular::StoryController.GetInfo(),
-    // fuchsia::modular::ModuleContext.GetStoryName(). We need to ensure this
-    // doesn't expose internal information by being a page ID.
-    // TODO(thatguy): Generate a GUID instead.
-    if (!story_name_ || story_name_->empty()) {
-      story_name_ = fxl::GenerateUUID();
-    }
-
-    story_data_ = fuchsia::modular::internal::StoryData::New();
-    story_data_->story_name = story_name_;
-    story_data_->story_options = std::move(story_options_);
-    story_data_->story_page_id = CloneOptional(story_page_id_);
-    story_data_->story_info.id = story_name_;
-    story_data_->story_info.last_focus_time = 0;
-    story_data_->story_info.extra = std::move(extra_info_);
-
-    operation_queue_.Add(MakeWriteStoryDataCall(page(), std::move(story_data_),
-                                                [this, flow] {}));
-  }
-
-  fidl::StringPtr story_name_;
-  fidl::VectorPtr<fuchsia::modular::StoryInfoExtraEntry> extra_info_;
-  fuchsia::modular::StoryOptions story_options_;
-
-  fuchsia::ledger::PagePtr story_page_;
-  fuchsia::modular::internal::StoryDataPtr story_data_;
-
-  fuchsia::ledger::PageId story_page_id_;
-
-  // Sub operations run in this queue.
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(CreateStoryCall);
-};
-
-}  // namespace
-
-FuturePtr<fidl::StringPtr, fuchsia::ledger::PageId> SessionStorage::CreateStory(
-    fidl::StringPtr story_name,
-    fidl::VectorPtr<fuchsia::modular::StoryInfoExtraEntry> extra_info,
-    fuchsia::modular::StoryOptions story_options) {
-  auto ret = Future<fidl::StringPtr, fuchsia::ledger::PageId>::Create(
-      "SessionStorage.CreateStory.ret");
-  operation_queue_.Add(new CreateStoryCall(
-      ledger_client_->ledger(), page(), std::move(story_name),
-      std::move(extra_info), std::move(story_options), ret->Completer()));
-  return ret;
-}
-
-FuturePtr<fidl::StringPtr, fuchsia::ledger::PageId> SessionStorage::CreateStory(
-    fidl::VectorPtr<fuchsia::modular::StoryInfoExtraEntry> extra_info,
-    fuchsia::modular::StoryOptions story_options) {
-  return CreateStory(nullptr /* story_name */, std::move(extra_info),
-                     std::move(story_options));
-}
-
-namespace {
-class DeleteStoryCall : public Operation<> {
- public:
-  DeleteStoryCall(fuchsia::ledger::Ledger* const ledger,
-                  fuchsia::ledger::Page* const session_page,
-                  fidl::StringPtr story_name, ResultCall result_call)
-      : Operation("SessionStorage::DeleteStoryCall", std::move(result_call)),
-        ledger_(ledger),
-        session_page_(session_page),
-        story_name_(story_name) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-    operation_queue_.Add(MakeGetStoryDataCall(
-        session_page_, story_name_, [this, flow](auto story_data) {
-          if (!story_data)
-            return;
-          story_data_ = std::move(*story_data);
-          Cont1(flow);
-        }));
-  }
-
-  void Cont1(FlowToken flow) {
-    // Get the story page so we can remove its contents.
-    ledger_->GetPage(
-        std::move(story_data_.story_page_id), story_page_.NewRequest(),
-        [this, flow, story_name = story_data_.story_info.id](
-            fuchsia::ledger::Status status) {
-          if (status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << "Ledger.GetPage() for story " << story_name
-                           << ": " << fidl::ToUnderlying(status);
-            return;
-          }
-          Cont2(flow);
-        });
-  }
-
-  void Cont2(FlowToken flow) {
-    story_page_->Clear([this, flow, story_name = story_data_.story_info.id](
-                           fuchsia::ledger::Status status) {
-      if (status != fuchsia::ledger::Status::OK) {
-        FXL_LOG(ERROR) << "Page.Clear() for story " << story_name << ": "
-                       << fidl::ToUnderlying(status);
-        return;
-      }
-      Cont3(flow);
-    });
-  }
-
-  void Cont3(FlowToken flow) {
-    // Remove the story data in the session page.
-    session_page_->Delete(
-        to_array(StoryNameToStoryDataKey(story_data_.story_info.id)),
-        [this, flow](fuchsia::ledger::Status status) {
-          // Deleting a key that doesn't exist is OK, not
-          // KEY_NOT_FOUND.
-          if (status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << "SessionStorage: Page.Delete() "
-                           << fidl::ToUnderlying(status);
-          }
-          Cont4(flow);
-        });
-  }
-
-  void Cont4(FlowToken flow) {
-    // Remove the story snapshot in the session page.
-    session_page_->Delete(
-        to_array(StoryNameToStorySnapshotKey(story_data_.story_info.id)),
-        [this, flow](fuchsia::ledger::Status status) {
-          // Deleting a key that doesn't exist is OK, not
-          // KEY_NOT_FOUND.
-          if (status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << "SessionStorage: Page.Delete() "
-                           << fidl::ToUnderlying(status);
-          }
-        });
-  }
-
-  fuchsia::ledger::Ledger* const ledger_;      // not owned
-  fuchsia::ledger::Page* const session_page_;  // not owned
-  const fidl::StringPtr story_name_;
-
-  // Intermediate state.
-  OperationQueue operation_queue_;
-  fuchsia::modular::internal::StoryData story_data_;
-  fuchsia::ledger::PagePtr story_page_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DeleteStoryCall);
-};
-}  // namespace
-
-FuturePtr<> SessionStorage::DeleteStory(fidl::StringPtr story_name) {
-  auto ret = Future<>::Create("SessionStorage.DeleteStory.ret");
-  operation_queue_.Add(new DeleteStoryCall(ledger_client_->ledger(), page(),
-                                           story_name, ret->Completer()));
-  return ret;
-}
-
-namespace {
-class MutateStoryDataCall : public Operation<> {
- public:
-  MutateStoryDataCall(
-      fuchsia::ledger::Page* const page, fidl::StringPtr story_name,
-      std::function<bool(fuchsia::modular::internal::StoryData* story_data)>
-          mutate,
-      ResultCall result_call)
-      : Operation("SessionStorage::MutateStoryDataCall",
-                  std::move(result_call)),
-        page_(page),
-        story_name_(story_name),
-        mutate_(std::move(mutate)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    operation_queue_.Add(MakeGetStoryDataCall(
-        page_, story_name_,
-        [this, flow](fuchsia::modular::internal::StoryDataPtr story_data) {
-          if (!story_data) {
-            // If the story doesn't exist, it was deleted.
-            return;
-          }
-          if (!mutate_(story_data.get())) {
-            // If no mutation happened, we're done.
-            return;
-          }
-
-          operation_queue_.Add(
-              MakeWriteStoryDataCall(page_, std::move(story_data), [flow] {}));
-        }));
-  }
-
-  fuchsia::ledger::Page* const page_;  // not owned
-  const fidl::StringPtr story_name_;
-  std::function<bool(fuchsia::modular::internal::StoryData* story_data)>
-      mutate_;
-
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(MutateStoryDataCall);
-};
-
-}  // namespace
-
-FuturePtr<> SessionStorage::UpdateLastFocusedTimestamp(
-    fidl::StringPtr story_name, const int64_t ts) {
-  auto mutate = [ts](fuchsia::modular::internal::StoryData* const story_data) {
-    if (story_data->story_info.last_focus_time == ts) {
-      return false;
-    }
-    story_data->story_info.last_focus_time = ts;
-    return true;
-  };
-
-  auto ret = Future<>::Create("SessionStorage.UpdateLastFocusedTimestamp.ret");
-  operation_queue_.Add(
-      new MutateStoryDataCall(page(), story_name, mutate, ret->Completer()));
-  return ret;
-}
-
-FuturePtr<fuchsia::modular::internal::StoryDataPtr>
-SessionStorage::GetStoryData(fidl::StringPtr story_name) {
-  auto ret = Future<fuchsia::modular::internal::StoryDataPtr>::Create(
-      "SessionStorage.GetStoryData.ret");
-  operation_queue_.Add(
-      MakeGetStoryDataCall(page(), story_name, ret->Completer()));
-  return ret;
-}
-
-// Returns a Future vector of StoryData for all stories in this session.
-FuturePtr<std::vector<fuchsia::modular::internal::StoryData>>
-SessionStorage::GetAllStoryData() {
-  auto ret =
-      Future<std::vector<fuchsia::modular::internal::StoryData>>::Create(
-          "SessionStorage.GetAllStoryData.ret");
-  operation_queue_.Add(
-      new ReadAllDataCall<fuchsia::modular::internal::StoryData>(
-          page(), kStoryDataKeyPrefix, XdrStoryData, ret->Completer()));
-  return ret;
-}
-
-FuturePtr<> SessionStorage::UpdateStoryOptions(
-    fidl::StringPtr story_name, fuchsia::modular::StoryOptions story_options) {
-  auto ret = Future<>::Create("SessionStorage.SetOptions.ret");
-  auto mutate = fxl::MakeCopyable(
-      [story_options = std::move(story_options)](
-          fuchsia::modular::internal::StoryData* story_data) mutable {
-        if (story_data->story_options != story_options) {
-          story_data->story_options = std::move(story_options);
-          return true;
-        }
-        return false;
-      });
-  operation_queue_.Add(new MutateStoryDataCall(
-      page(), story_name, std::move(mutate), ret->Completer()));
-  return ret;
-}
-
-FuturePtr<std::unique_ptr<StoryStorage>> SessionStorage::GetStoryStorage(
-    fidl::StringPtr story_name) {
-  auto returned_future = Future<std::unique_ptr<StoryStorage>>::Create(
-      "SessionStorage.GetStoryStorage.returned_future");
-
-  operation_queue_.Add(MakeGetStoryDataCall(
-      page(), story_name,
-      [this, returned_future,
-       story_name](fuchsia::modular::internal::StoryDataPtr story_data) {
-        if (story_data) {
-          auto story_storage = std::make_unique<StoryStorage>(
-              ledger_client_, *story_data->story_page_id);
-          returned_future->Complete(std::move(story_storage));
-        } else {
-          returned_future->Complete(nullptr);
-        }
-      }));
-
-  return returned_future;
-}
-
-namespace {
-
-class WriteSnapshotCall : public Operation<> {
- public:
-  WriteSnapshotCall(PageClient* page_client, fidl::StringPtr story_name,
-                    fuchsia::mem::Buffer snapshot, ResultCall result_call)
-      : Operation("SessionStorage::WriteSnapshotCall", std::move(result_call)),
-        page_client_(page_client),
-        key_(StoryNameToStorySnapshotKey(story_name)),
-        snapshot_(std::move(snapshot)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-    page_client_->page()->CreateReferenceFromBuffer(
-        std::move(snapshot_),
-        [this, flow](fuchsia::ledger::Status status,
-                     std::unique_ptr<fuchsia::ledger::Reference> reference) {
-          if (status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << trace_name()
-                           << " PageSnapshot.CreateReferenceFromBuffer() "
-                           << fidl::ToUnderlying(status);
-            return;
-          } else if (!reference) {
-            return;
-          }
-
-          PutReference(std::move(reference), flow);
-        });
-  }
-
-  void PutReference(std::unique_ptr<fuchsia::ledger::Reference> reference,
-                    FlowToken flow) {
-    page_client_->page()->PutReference(
-        to_array(key_), std::move(*reference),
-        // TODO(MI4-1425): Experiment with declaring lazy priority.
-        fuchsia::ledger::Priority::EAGER,
-        [this, flow](fuchsia::ledger::Status status) {
-          if (status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << trace_name() << " PageSnapshot.PutReference() "
-                           << fidl::ToUnderlying(status);
-          }
-        });
-  }
-
-  PageClient* const page_client_;
-  fidl::StringPtr key_;
-  fuchsia::mem::Buffer snapshot_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(WriteSnapshotCall);
-};
-
-class ReadSnapshotCall : public Operation<fuchsia::mem::BufferPtr> {
- public:
-  ReadSnapshotCall(PageClient* page_client, fidl::StringPtr story_name,
-                   ResultCall result_call)
-      : Operation("SessionStorage::ReadSnapshotCall", std::move(result_call)),
-        page_client_(page_client),
-        key_(StoryNameToStorySnapshotKey(story_name)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &snapshot_};
-
-    page_snapshot_ = page_client_->NewSnapshot(
-        /* on_error = */ [this] { Done(nullptr); });
-    page_snapshot_->Get(
-        to_array(key_), [this, flow](fuchsia::ledger::Status status,
-                                     fuchsia::mem::BufferPtr snapshot) {
-          // TODO(MI4-1425): Handle NEEDS_FETCH status if using lazy priority.
-          switch (status) {
-            case fuchsia::ledger::Status::KEY_NOT_FOUND:
-              return;
-            case fuchsia::ledger::Status::OK:
-              snapshot_ = std::move(snapshot);
-              return;
-            default:
-              FXL_LOG(ERROR) << trace_name() << " PageSnapshot.Get() "
-                             << fidl::ToUnderlying(status);
-              return;
-          }
-        });
-  }
-
-  // Input parameters.
-  PageClient* const page_client_;
-  fidl::StringPtr key_;
-
-  // Intermediate state.
-  fuchsia::ledger::PageSnapshotPtr page_snapshot_;
-
-  // Return values.
-  fuchsia::mem::BufferPtr snapshot_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ReadSnapshotCall);
-};
-}  // namespace
-
-FuturePtr<> SessionStorage::WriteSnapshot(fidl::StringPtr story_name,
-                                          fuchsia::mem::Buffer snapshot) {
-  auto ret = Future<>::Create("SessionStorage.WriteSnapshot.ret");
-  operation_queue_.Add(new WriteSnapshotCall(
-      this, story_name, std::move(snapshot), ret->Completer()));
-  return ret;
-}
-
-FuturePtr<fuchsia::mem::BufferPtr> SessionStorage::ReadSnapshot(
-    fidl::StringPtr story_name) {
-  auto ret = Future<fuchsia::mem::BufferPtr>::Create(
-      "SessionStorage.ReadSnapshot.ret");
-  operation_queue_.Add(
-      new ReadSnapshotCall(this, story_name, ret->Completer()));
-  return ret;
-}
-
-void SessionStorage::OnPageChange(const std::string& key,
-                                  const std::string& value) {
-  if (StartsWith(key, kStoryDataKeyPrefix)) {
-    auto story_data = fuchsia::modular::internal::StoryData::New();
-    if (!XdrRead(value, &story_data, XdrStoryData)) {
-      FXL_LOG(ERROR)
-          << "SessionStorage::OnPageChange : could not decode ledger "
-             "value for key "
-          << key << "\nvalue:\n"
-          << value;
-      return;
-    }
-
-    auto story_name = StoryNameFromStoryDataKey(key);
-    if (on_story_updated_) {
-      on_story_updated_(std::move(story_name), std::move(*story_data));
-    }
-  } else {
-    // No-op.
-  }
-}
-
-void SessionStorage::OnPageDelete(const std::string& key) {
-  if (on_story_deleted_) {
-    // Call to StoryNameFromStoryDataKey() needed because a deleted story is
-    // modelled by deleting the key, and then the value is not available.
-    // TODO(thatguy,mesch): Change PageClient to supply values of deleted keys
-    // and/or change modeling of deleted stories.
-    on_story_deleted_(StoryNameFromStoryDataKey(key));
-  }
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/storage/session_storage.h b/bin/sessionmgr/storage/session_storage.h
deleted file mode 100644
index 5dc1323..0000000
--- a/bin/sessionmgr/storage/session_storage.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORAGE_SESSION_STORAGE_H_
-#define PERIDOT_BIN_SESSIONMGR_STORAGE_SESSION_STORAGE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/modular/internal/cpp/fidl.h>
-#include <lib/async/cpp/future.h>
-
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_client.h"
-#include "peridot/lib/ledger_client/page_id.h"
-
-namespace modular {
-
-// This class has the following responsibilities:
-//
-// * Manage the persistence of metadata about what stories are part of a single
-//   session.
-// * Observe the metadata and call clients back when changes initiated by other
-//   Ledger clients appear.
-// * Manage the lifecycle of Ledger pages for storing individual story
-//   metadata. The contents of these pages are governed by StoryStoage.
-//
-// All calls operate directly on the Ledger itself: no local caching is
-// performed.
-class SessionStorage : public PageClient {
- public:
-  // Constructs a new SessionStorage with storage on |page_id| in the ledger
-  // given by |ledger_client|.
-  //
-  // |ledger_client| must outlive *this.
-  SessionStorage(LedgerClient* ledger_client, LedgerPageId page_id);
-
-  // |callback| is notified whenever a story has been deleted. This
-  // notification is either the result of:
-  //
-  // a) The story being deleted on another device.
-  // b) The story having been deleted locally with DeleteStory().
-  void set_on_story_deleted(
-      std::function<void(fidl::StringPtr story_id)> callback) {
-    on_story_deleted_ = std::move(callback);
-  }
-
-  // |callback| is notified whenever a story has been added or updated.
-  // Currently we do not differentiate between the two, and it is up to the
-  // client to make this distinction.
-  //
-  // The update could be the result of a local modification (ie, through
-  // Update*()) or a modification on another device.
-  void set_on_story_updated(
-      std::function<void(fidl::StringPtr story_id,
-                         fuchsia::modular::internal::StoryData story_data)>
-          callback) {
-    on_story_updated_ = std::move(callback);
-  }
-
-  // Creates a new story and returns a tuple of (story id, story ledger page
-  // id) on completion. |story_name| and |extra_info| may be null.
-  //
-  // If |story_name| is not provided, a UUID will be generated as the name.
-  //
-  // If |extra_info| is set, populates StoryData.story_info.extra with the
-  // entries given.
-  //
-  // TODO(thatguy): Allowing for null story names is left in for backwards
-  // compatibility with existing code. The intention is that all clients
-  // outside the FW (through FIDL interfaces) use story names exclusively.  It
-  // is unclear if internal story IDs should be an implementation detail of
-  // SessionStorage, or if they should be exposed to the story runtime
-  // architecture.
-  FuturePtr<fidl::StringPtr, fuchsia::ledger::PageId> CreateStory(
-      fidl::StringPtr story_name,
-      fidl::VectorPtr<fuchsia::modular::StoryInfoExtraEntry> extra_info,
-      fuchsia::modular::StoryOptions story_options);
-
-  // Same as above, but defaults |story_name| to nullptr.
-  FuturePtr<fidl::StringPtr, fuchsia::ledger::PageId> CreateStory(
-      fidl::VectorPtr<fuchsia::modular::StoryInfoExtraEntry> extra_info,
-      fuchsia::modular::StoryOptions story_options);
-
-  // Deletes the |story_id| from the list of known stories and completes the
-  // returned Future when done.
-  //
-  // Does not currently delete the story's page, so it is left dangling.
-  //
-  // TODO(thatguy): Deleting stories is a two-step process:
-  //   1) Remove the story from the list of active stories (so it doesn't show
-  //      up on the timeline).
-  //   2) Delete the underlying story storage page.
-  //
-  // We only do (1). Find a way to split (1) and (2): either have the client
-  // pass in a Future that signals when it's OK to delete the story storage (ie,
-  // once the story has shut down cleanly) or split the function into two calls.
-  // MI4-1002
-  FuturePtr<> DeleteStory(fidl::StringPtr story_id);
-
-  // Sets the last focused timestamp for |story_id| to |ts|. Completes the
-  // returned Future when done.
-  FuturePtr<> UpdateLastFocusedTimestamp(fidl::StringPtr story_id, int64_t ts);
-
-  // Returns a Future StoryDataPtr for |story_id|. If |story_id| is not a valid
-  // story, the returned StoryDataPtr will be null.
-  FuturePtr<fuchsia::modular::internal::StoryDataPtr> GetStoryData(
-      fidl::StringPtr story_id);
-
-  // Returns a Future vector of StoryData for all stories in this session.
-  //
-  // TODO(thatguy): If the return value grows large, an dispatcher stream would
-  // be a more appropriate return value.
-  FuturePtr<std::vector<fuchsia::modular::internal::StoryData>>
-  GetAllStoryData();
-
-  FuturePtr<> UpdateStoryOptions(fidl::StringPtr story_id,
-                                 fuchsia::modular::StoryOptions story_options);
-
-  // Gets the StoryStorage for the story with the given |story_id| to perform
-  // operations on the story such as adding modules, updating links, etc.
-  FuturePtr<std::unique_ptr<StoryStorage>> GetStoryStorage(
-      fidl::StringPtr story_id);
-
-  // Returns the snapshot for the story. If there is no snapshot for the story
-  // or the read operation failed, the return value of |fuchsia::mem::BufferPtr|
-  // will be nullptr.
-  FuturePtr<fuchsia::mem::BufferPtr> ReadSnapshot(fidl::StringPtr story_id);
-
-  // Writes the given |snapshot| to storage. The returned future will resolve
-  // when the |snapshot| has been written to storage or when it has failed to
-  // write to storage.
-  FuturePtr<> WriteSnapshot(fidl::StringPtr story_id,
-                            fuchsia::mem::Buffer snapshot);
-
- private:
-  // |PageClient|
-  void OnPageChange(const std::string& key, const std::string& value) override;
-
-  // |PageClient|
-  void OnPageDelete(const std::string& key) override;
-
-  LedgerClient* const ledger_client_;
-  OperationQueue operation_queue_;
-
-  std::function<void(fidl::StringPtr story_id)> on_story_deleted_;
-  std::function<void(fidl::StringPtr story_id,
-                     fuchsia::modular::internal::StoryData story_data)>
-      on_story_updated_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SessionStorage);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORAGE_SESSION_STORAGE_H_
diff --git a/bin/sessionmgr/storage/session_storage_unittest.cc b/bin/sessionmgr/storage/session_storage_unittest.cc
deleted file mode 100644
index 55ec518..0000000
--- a/bin/sessionmgr/storage/session_storage_unittest.cc
+++ /dev/null
@@ -1,532 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/storage/session_storage.h"
-
-#include <memory>
-
-#include <lib/async/cpp/future.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/ledger_client/page_id.h"
-#include "peridot/lib/testing/test_with_ledger.h"
-
-namespace modular {
-namespace {
-
-class SessionStorageTest : public testing::TestWithLedger {
- protected:
-  std::unique_ptr<SessionStorage> CreateStorage(std::string page_id) {
-    return std::make_unique<SessionStorage>(ledger_client(),
-                                            MakePageId(page_id));
-  }
-
-  // Convenience method to create a story for the test cases where
-  // we're not testing CreateStory().
-  fidl::StringPtr CreateStory(
-      SessionStorage* storage,
-      fuchsia::modular::StoryOptions story_options = {}) {
-    auto future_story = storage->CreateStory(
-        nullptr /* name */, nullptr /* extra */, std::move(story_options));
-    bool done{};
-    fidl::StringPtr story_name;
-    future_story->Then(
-        [&](fidl::StringPtr name, fuchsia::ledger::PageId page_id) {
-          done = true;
-          story_name = std::move(name);
-        });
-    RunLoopUntil([&] { return done; });
-
-    return story_name;
-  }
-};
-
-TEST_F(SessionStorageTest, Create_VerifyData) {
-  // Create a single story, and verify that the data we have stored about it is
-  // correct.
-  auto storage = CreateStorage("page");
-
-  fidl::VectorPtr<fuchsia::modular::StoryInfoExtraEntry> extra_entries;
-  fuchsia::modular::StoryInfoExtraEntry entry;
-  entry.key = "key1";
-  entry.value = "value1";
-  extra_entries->push_back(std::move(entry));
-
-  entry.key = "key2";
-  entry.value = "value2";
-  extra_entries->push_back(std::move(entry));
-
-  fuchsia::modular::StoryOptions story_options;
-  story_options.kind_of_proto_story = true;
-  auto future_story = storage->CreateStory(
-      "story_name", std::move(extra_entries), std::move(story_options));
-  bool done{};
-  fidl::StringPtr story_name;
-  fuchsia::ledger::PageId page_id;
-  future_story->Then([&](fidl::StringPtr name, fuchsia::ledger::PageId page) {
-    done = true;
-    story_name = std::move(name);
-    page_id = std::move(page);
-  });
-  RunLoopUntil([&] { return done; });
-
-  // Get the StoryData for this story.
-  auto future_data = storage->GetStoryData(story_name);
-  done = false;
-  fuchsia::modular::internal::StoryData cached_data;
-  future_data->Then([&](fuchsia::modular::internal::StoryDataPtr data) {
-    ASSERT_TRUE(data);
-
-    EXPECT_EQ("story_name", data->story_name);
-    EXPECT_TRUE(data->story_options.kind_of_proto_story);
-    EXPECT_EQ(story_name, data->story_info.id);
-    ASSERT_TRUE(data->story_page_id);
-    EXPECT_EQ(page_id, *data->story_page_id);
-    EXPECT_TRUE(data->story_info.extra);
-    EXPECT_EQ(2u, data->story_info.extra->size());
-    EXPECT_EQ("key1", data->story_info.extra->at(0).key);
-    EXPECT_EQ("value1", data->story_info.extra->at(0).value);
-    EXPECT_EQ("key2", data->story_info.extra->at(1).key);
-    EXPECT_EQ("value2", data->story_info.extra->at(1).value);
-
-    done = true;
-
-    cached_data = std::move(*data);
-  });
-  RunLoopUntil([&] { return done; });
-
-  // Get the StoryData again, but this time by its name.
-  future_data = storage->GetStoryData("story_name");
-  done = false;
-  future_data->Then([&](fuchsia::modular::internal::StoryDataPtr data) {
-    ASSERT_TRUE(data);
-    ASSERT_EQ(cached_data, *data);
-    done = true;
-  });
-  RunLoopUntil([&] { return done; });
-
-  // Verify that GetAllStoryData() also returns the same information.
-  fidl::VectorPtr<fuchsia::modular::internal::StoryData> all_data;
-  auto future_all_data = storage->GetAllStoryData();
-  future_all_data->Then(
-      [&](std::vector<fuchsia::modular::internal::StoryData> data) {
-        all_data.reset(std::move(data));
-      });
-  RunLoopUntil([&] { return !!all_data; });
-
-  EXPECT_EQ(1u, all_data->size());
-  EXPECT_EQ(cached_data, all_data->at(0));
-}
-
-TEST_F(SessionStorageTest, CreateGetAllDelete) {
-  // Create a single story, call GetAllStoryData() to show that it was created,
-  // and then delete it.
-  //
-  // Pipeline all the calls such to show that we data consistency based on call
-  // order.
-  auto storage = CreateStorage("page");
-  auto future_story = storage->CreateStory(
-      "story_name", nullptr /* extra_info */, {} /* options */);
-
-  // Immediately after creation is complete, delete it.
-  FuturePtr<> delete_done;
-  future_story->Then(
-      [&](fidl::StringPtr story_name, fuchsia::ledger::PageId page_id) {
-        delete_done = storage->DeleteStory(story_name);
-      });
-
-  auto future_all_data = storage->GetAllStoryData();
-  fidl::VectorPtr<fuchsia::modular::internal::StoryData> all_data;
-  future_all_data->Then(
-      [&](std::vector<fuchsia::modular::internal::StoryData> data) {
-        all_data.reset(std::move(data));
-      });
-
-  RunLoopUntil([&] { return !!all_data; });
-
-  // Given the ordering, we expect the story we created to show up.
-  EXPECT_EQ(1u, all_data->size());
-
-  // But if we get all data again, we should see no stories.
-  future_all_data = storage->GetAllStoryData();
-  all_data.reset();
-  future_all_data->Then(
-      [&](std::vector<fuchsia::modular::internal::StoryData> data) {
-        all_data.reset(std::move(data));
-      });
-  RunLoopUntil([&] { return !!all_data; });
-  EXPECT_EQ(0u, all_data->size());
-}
-
-TEST_F(SessionStorageTest, CreateMultipleAndDeleteOne) {
-  // Create two stories.
-  //
-  // * Their ids should be different.
-  // * They should get different Ledger page ids.
-  // * If we GetAllStoryData() we should see both of them.
-  auto storage = CreateStorage("page");
-
-  auto future_story1 = storage->CreateStory("story1", nullptr /* extra_info */,
-                                            {} /* options */);
-  auto future_story2 =
-      storage->CreateStory("story2", nullptr /* extra_info */, {} /* options*/);
-
-  fidl::StringPtr story1_name;
-  fuchsia::ledger::PageId story1_pageid;
-  fidl::StringPtr story2_name;
-  fuchsia::ledger::PageId story2_pageid;
-  bool done = false;
-  Wait("SessionStorageTest.CreateMultipleAndDeleteOne.wait",
-       {future_story1, future_story2})
-      ->Then([&](auto results) {
-        story1_name = std::move(std::get<0>(results[0]));
-        story1_pageid = std::move(std::get<1>(results[0]));
-        story2_name = std::move(std::get<0>(results[1]));
-        story2_pageid = std::move(std::get<1>(results[1]));
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-
-  EXPECT_NE(story1_name, story2_name);
-  EXPECT_NE(story1_pageid, story2_pageid);
-
-  auto future_all_data = storage->GetAllStoryData();
-  fidl::VectorPtr<fuchsia::modular::internal::StoryData> all_data;
-  future_all_data->Then(
-      [&](std::vector<fuchsia::modular::internal::StoryData> data) {
-        all_data.reset(std::move(data));
-      });
-  RunLoopUntil([&] { return !!all_data; });
-
-  EXPECT_EQ(2u, all_data->size());
-
-  // Now delete one of them, and we should see that GetAllStoryData() only
-  // returns one entry.
-  bool delete_done{};
-  storage->DeleteStory("story1")->Then([&] { delete_done = true; });
-
-  future_all_data = storage->GetAllStoryData();
-  all_data.reset();
-  future_all_data->Then(
-      [&](std::vector<fuchsia::modular::internal::StoryData> data) {
-        all_data.reset(std::move(data));
-      });
-  RunLoopUntil([&] { return !!all_data; });
-
-  EXPECT_TRUE(delete_done);
-  EXPECT_EQ(1u, all_data->size());
-
-  // If we try to get the story by id, or by name, we expect both to return
-  // null.
-  auto future_data = storage->GetStoryData(story1_name);
-  done = false;
-  future_data->Then([&](fuchsia::modular::internal::StoryDataPtr data) {
-    EXPECT_TRUE(data == nullptr);
-    done = true;
-  });
-
-  future_data = storage->GetStoryData("story1");
-  done = false;
-  future_data->Then([&](fuchsia::modular::internal::StoryDataPtr data) {
-    EXPECT_TRUE(data == nullptr);
-    done = true;
-  });
-
-  // TODO(thatguy): Verify that the story's page was also deleted.
-  // MI4-1002
-}
-
-TEST_F(SessionStorageTest, DeleteStoryDeletesStoryPage) {
-  // When we call DeleteStory, we expect the story's page to be completely
-  // emptied.
-  auto storage = CreateStorage("page");
-  auto future_story = storage->CreateStory(
-      "story_name", nullptr /* extra_info */, {} /* options */);
-
-  bool done{false};
-  auto story_page_id = fuchsia::ledger::PageId::New();
-  future_story->Then([&](fidl::StringPtr id, fuchsia::ledger::PageId page_id) {
-    *story_page_id = std::move(page_id);
-    done = true;
-  });
-  RunLoopUntil([&] { return done; });
-
-  // Add some fake content to the story's page, so that we dan show that
-  // it is deleted when we instruct SessionStorage to delete the story.
-  fuchsia::ledger::PagePtr story_page;
-  ledger_client()->ledger()->GetPage(
-      std::move(story_page_id), story_page.NewRequest(),
-      [&](fuchsia::ledger::Status status) {
-        ASSERT_EQ(fuchsia::ledger::Status::OK, status);
-      });
-  done = false;
-  story_page->Put(to_array("key"), to_array("value"),
-                  [&](fuchsia::ledger::Status status) { done = true; });
-  RunLoopUntil([&] { return done; });
-
-  // Delete the story.
-  done = false;
-  storage->DeleteStory("story_name")->Then([&] { done = true; });
-  RunLoopUntil([&] { return done; });
-
-  // Show that the underlying page is now empty.
-  fuchsia::ledger::PageSnapshotPtr snapshot;
-  story_page->GetSnapshot(snapshot.NewRequest(), to_array("") /* prefix */,
-                          nullptr /* watcher */,
-                          [&](fuchsia::ledger::Status status) {
-                            ASSERT_EQ(fuchsia::ledger::Status::OK, status);
-                          });
-  done = false;
-  snapshot->GetEntries(to_array("") /* key_start */, nullptr /* token */,
-                       [&](fuchsia::ledger::Status status,
-                           std::vector<fuchsia::ledger::Entry> entries,
-                           fuchsia::ledger::TokenPtr next_token) {
-                         ASSERT_EQ(fuchsia::ledger::Status::OK, status);
-                         EXPECT_EQ(nullptr, next_token);
-                         EXPECT_TRUE(entries.empty());
-                         done = true;
-                       });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SessionStorageTest, UpdateLastFocusedTimestamp) {
-  auto storage = CreateStorage("page");
-  auto story_name = CreateStory(storage.get());
-
-  storage->UpdateLastFocusedTimestamp(story_name, 10);
-  auto future_data = storage->GetStoryData(story_name);
-  bool done{};
-  future_data->Then([&](fuchsia::modular::internal::StoryDataPtr data) {
-    EXPECT_EQ(10, data->story_info.last_focus_time);
-    done = true;
-  });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SessionStorageTest, ObserveCreateUpdateDelete_Local) {
-  auto storage = CreateStorage("page");
-
-  bool updated{};
-  fidl::StringPtr updated_story_name;
-  fuchsia::modular::internal::StoryData updated_story_data;
-  storage->set_on_story_updated(
-      [&](fidl::StringPtr story_name,
-          fuchsia::modular::internal::StoryData story_data) {
-        updated_story_name = std::move(story_name);
-        updated_story_data = std::move(story_data);
-        updated = true;
-      });
-
-  bool deleted{};
-  fidl::StringPtr deleted_story_name;
-  storage->set_on_story_deleted([&](fidl::StringPtr story_name) {
-    deleted_story_name = std::move(story_name);
-    deleted = true;
-  });
-
-  auto created_story_name = CreateStory(storage.get());
-  RunLoopUntil([&] { return updated; });
-  EXPECT_EQ(created_story_name, updated_story_name);
-  EXPECT_EQ(created_story_name, updated_story_data.story_info.id);
-
-  // Update something and see a new notification.
-  updated = false;
-  storage->UpdateLastFocusedTimestamp(created_story_name, 42);
-  RunLoopUntil([&] { return updated; });
-  EXPECT_EQ(created_story_name, updated_story_name);
-  EXPECT_EQ(42, updated_story_data.story_info.last_focus_time);
-
-  // Update options and see a new notification.
-  updated = false;
-  fuchsia::modular::StoryOptions story_options;
-  story_options.kind_of_proto_story = true;
-  storage->UpdateStoryOptions(created_story_name, std::move(story_options));
-  RunLoopUntil([&] { return updated; });
-  EXPECT_EQ(created_story_name, updated_story_name);
-  EXPECT_EQ(created_story_name, updated_story_data.story_info.id);
-  EXPECT_TRUE(updated_story_data.story_options.kind_of_proto_story);
-
-  // Delete the story and expect to see a notification.
-  storage->DeleteStory(created_story_name);
-  RunLoopUntil([&] { return deleted; });
-  EXPECT_EQ(created_story_name, deleted_story_name);
-}
-
-TEST_F(SessionStorageTest, ObserveCreateUpdateDelete_Remote) {
-  // Just like above, but we're going to trigger all of the operations that
-  // would cause a chagne notification on a different Ledger page connection to
-  // simulate them happening on another device.
-  auto storage = CreateStorage("page");
-  auto remote_storage = CreateStorage("page");
-
-  bool updated{};
-  fidl::StringPtr updated_story_name;
-  fuchsia::modular::internal::StoryData updated_story_data;
-  storage->set_on_story_updated(
-      [&](fidl::StringPtr story_name,
-          fuchsia::modular::internal::StoryData story_data) {
-        updated_story_name = std::move(story_name);
-        updated_story_data = std::move(story_data);
-        updated = true;
-      });
-
-  bool deleted{};
-  fidl::StringPtr deleted_story_name;
-  storage->set_on_story_deleted([&](fidl::StringPtr story_name) {
-    deleted_story_name = std::move(story_name);
-    deleted = true;
-  });
-
-  auto created_story_name = CreateStory(remote_storage.get());
-  RunLoopUntil([&] { return updated; });
-  EXPECT_EQ(created_story_name, updated_story_name);
-  EXPECT_EQ(created_story_name, updated_story_data.story_info.id);
-
-  // Update something and see a new notification.
-  updated = false;
-  remote_storage->UpdateLastFocusedTimestamp(created_story_name, 42);
-  RunLoopUntil([&] { return updated; });
-  EXPECT_EQ(created_story_name, updated_story_name);
-  EXPECT_EQ(42, updated_story_data.story_info.last_focus_time);
-
-  // Update options and see a new notification.
-  updated = false;
-  fuchsia::modular::StoryOptions story_options;
-  story_options.kind_of_proto_story = true;
-  remote_storage->UpdateStoryOptions(created_story_name,
-                                     std::move(story_options));
-  RunLoopUntil([&] { return updated; });
-  EXPECT_EQ(created_story_name, updated_story_name);
-  EXPECT_EQ(created_story_name, updated_story_data.story_info.id);
-  EXPECT_TRUE(updated_story_data.story_options.kind_of_proto_story);
-
-  // Delete the story and expect to see a notification.
-  remote_storage->DeleteStory(created_story_name);
-  RunLoopUntil([&] { return deleted; });
-  EXPECT_EQ(created_story_name, deleted_story_name);
-}
-
-TEST_F(SessionStorageTest, UpdateStoryOptions) {
-  auto storage = CreateStorage("page");
-  auto story_name = CreateStory(storage.get());
-  bool done{};
-
-  // Start by setting an option.
-  fuchsia::modular::StoryOptions story_options;
-  story_options.kind_of_proto_story = true;
-  storage->UpdateStoryOptions(story_name, std::move(story_options))->Then([&] {
-    done = true;
-  });
-  RunLoopUntil([&] { return done; });
-
-  // Read the options (we should only see 1 even when we added 2 since it's the
-  // same).
-  done = false;
-  storage->GetStoryData(story_name)
-      ->Then([&](fuchsia::modular::internal::StoryDataPtr data) {
-        EXPECT_TRUE(data->story_options.kind_of_proto_story);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-
-  // Update the option again.
-  fuchsia::modular::StoryOptions story_options2;
-  story_options.kind_of_proto_story = false;
-  storage->UpdateStoryOptions(story_name, std::move(story_options2))->Then([&] {
-    done = true;
-  });
-  RunLoopUntil([&] { return done; });
-
-  // We should see the last value we set.
-  done = false;
-  storage->GetStoryData(story_name)
-      ->Then([&](fuchsia::modular::internal::StoryDataPtr data) {
-        EXPECT_FALSE(data->story_options.kind_of_proto_story);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SessionStorageTest, GetStoryStorage) {
-  auto storage = CreateStorage("page");
-  auto story_name = CreateStory(storage.get());
-
-  bool done{};
-  auto get_story_future = storage->GetStoryStorage(story_name);
-  get_story_future->Then([&](std::unique_ptr<StoryStorage> result) {
-    EXPECT_NE(nullptr, result);
-    done = true;
-  });
-
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SessionStorageTest, GetStoryStorageNoStory) {
-  auto storage = CreateStorage("page");
-  CreateStory(storage.get());
-
-  bool done{};
-  auto get_story_future = storage->GetStoryStorage("fake");
-  get_story_future->Then([&](std::unique_ptr<StoryStorage> result) {
-    EXPECT_EQ(nullptr, result);
-    done = true;
-  });
-
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SessionStorageTest, ReadSnapshot) {
-  std::string kSnapshotData = "snapshot";
-
-  auto storage = CreateStorage("page");
-  auto story_name = CreateStory(storage.get());
-  bool done{};
-
-  fsl::SizedVmo snapshot;
-  fsl::VmoFromString(kSnapshotData, &snapshot);
-  storage->WriteSnapshot(story_name, std::move(snapshot).ToTransport())
-      ->Then([&] { done = true; });
-  RunLoopUntil([&] { return done; });
-
-  done = false;
-  storage->ReadSnapshot(story_name)
-      ->Then([&](fuchsia::mem::BufferPtr snapshot_ptr) {
-        std::string snapshot_string;
-        fsl::StringFromVmo(*snapshot_ptr.get(), &snapshot_string);
-        EXPECT_EQ(kSnapshotData, snapshot_string);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SessionStorageTest, DeleteStory_DeletesSnapshot) {
-  std::string kSnapshotData = "snapshot";
-
-  auto storage = CreateStorage("page");
-  auto story_name = CreateStory(storage.get());
-  bool done{};
-
-  fsl::SizedVmo snapshot;
-  fsl::VmoFromString(kSnapshotData, &snapshot);
-  storage->WriteSnapshot(story_name, std::move(snapshot).ToTransport())
-      ->Then([&] { done = true; });
-  RunLoopUntil([&] { return done; });
-
-  // Deleting the story should delete the snapshot.
-  storage->DeleteStory(story_name)->Then([&] { done = true; });
-  RunLoopUntil([&] { return done; });
-
-  done = false;
-  storage->ReadSnapshot(story_name)
-      ->Then([&](fuchsia::mem::BufferPtr snapshot_ptr) {
-        EXPECT_TRUE(snapshot_ptr == nullptr);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/storage/session_storage_xdr.cc b/bin/sessionmgr/storage/session_storage_xdr.cc
deleted file mode 100644
index b5a31c1..0000000
--- a/bin/sessionmgr/storage/session_storage_xdr.cc
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/storage/session_storage_xdr.h"
-
-#include "peridot/lib/base64url/base64url.h"
-
-namespace modular {
-
-// Serialization and deserialization of fuchsia::modular::internal::StoryData
-// and fuchsia::modular::StoryInfo to and from JSON.
-
-namespace {
-
-fuchsia::ledger::PageId PageIdFromBase64(const std::string& base64) {
-  // Both base64 libraries available to us require that we allocate an output
-  // buffer large enough to decode any base64 string of the input length, which
-  // for us it does not know contains padding since our target size is 16, so we
-  // have to allocate an intermediate buffer. Hex would not require this but
-  // results in a slightly larger transport size.
-
-  std::string decoded;
-  fuchsia::ledger::PageId page_id;
-
-  if (base64url::Base64UrlDecode(base64, &decoded)) {
-    size_t size;
-    if (decoded.length() != page_id.id.count()) {
-      FXL_LOG(ERROR) << "Unexpected page ID length for " << base64
-                     << " (decodes to " << decoded.length() << " bytes; "
-                     << page_id.id.count() << " expected)";
-      size = std::min(decoded.length(), page_id.id.count());
-      memset(page_id.id.mutable_data(), 0, page_id.id.count());
-    } else {
-      size = page_id.id.count();
-    }
-
-    memcpy(page_id.id.mutable_data(), decoded.data(), size);
-  } else {
-    FXL_LOG(ERROR) << "Unable to decode page ID " << base64;
-  }
-
-  return page_id;
-}
-
-std::string PageIdToBase64(const fuchsia::ledger::PageId& page_id) {
-  return base64url::Base64UrlEncode(
-      {reinterpret_cast<const char*>(page_id.id.data()), page_id.id.count()});
-}
-
-// Serialization and deserialization of fuchsia::modular::internal::StoryData
-// and fuchsia::modular::StoryInfo to and from JSON. We have different versions
-// for backwards compatibilty.
-//
-// Version 0: Before FIDL2 conversion. ExtraInfo fields are stored as "key"
-// and "value", page ids are stored as vector.
-void XdrStoryInfoExtraEntry_v0(
-    XdrContext* const xdr, fuchsia::modular::StoryInfoExtraEntry* const data) {
-  xdr->Field("key", &data->key);
-  xdr->Field("value", &data->value);
-}
-
-void XdrStoryInfo_v0(XdrContext* const xdr,
-                     fuchsia::modular::StoryInfo* const data) {
-  xdr->Field("last_focus_time", &data->last_focus_time);
-  xdr->Field("url", &data->url);
-  xdr->Field("id", &data->id);
-  xdr->Field("extra", &data->extra, XdrStoryInfoExtraEntry_v0);
-}
-
-void XdrStoryData_v0(XdrContext* const xdr,
-                     fuchsia::modular::internal::StoryData* const data) {
-  FXL_CHECK(xdr->op() == XdrOp::FROM_JSON)
-      << "A back version is never used for writing.";
-  data->story_page_id = fuchsia::ledger::PageId::New();
-
-  xdr->Field("story_info", &data->story_info, XdrStoryInfo_v0);
-  xdr->Field("story_page_id", &data->story_page_id->id);
-}
-
-// Version 1: During FIDL2 conversion. ExtraInfo fields are stored as "key"
-// and "value", page ids are stored as base64 string.
-void XdrStoryInfoExtraEntry_v1(
-    XdrContext* const xdr, fuchsia::modular::StoryInfoExtraEntry* const data) {
-  xdr->Field("key", &data->key);
-  xdr->Field("value", &data->value);
-}
-
-void XdrStoryInfo_v1(XdrContext* const xdr,
-                     fuchsia::modular::StoryInfo* const data) {
-  xdr->Field("last_focus_time", &data->last_focus_time);
-  xdr->Field("url", &data->url);
-  xdr->Field("id", &data->id);
-  xdr->Field("extra", &data->extra, XdrStoryInfoExtraEntry_v1);
-}
-
-void XdrStoryData_v1(XdrContext* const xdr,
-                     fuchsia::modular::internal::StoryData* const data) {
-  static constexpr char kStoryPageId[] = "story_page_id";
-  xdr->Field("story_info", &data->story_info, XdrStoryInfo_v1);
-  switch (xdr->op()) {
-    case XdrOp::FROM_JSON: {
-      std::string page_id;
-      xdr->Field(kStoryPageId, &page_id);
-      if (page_id.empty()) {
-        data->story_page_id = nullptr;
-      } else {
-        data->story_page_id = fuchsia::ledger::PageId::New();
-        *data->story_page_id = PageIdFromBase64(page_id);
-      }
-      break;
-    }
-    case XdrOp::TO_JSON: {
-      std::string page_id;
-      if (data->story_page_id) {
-        page_id = PageIdToBase64(*data->story_page_id);
-      }
-      xdr->Field(kStoryPageId, &page_id);
-      break;
-    }
-  }
-}
-
-// Version 2: After FIDL2 conversion was complete. ExtraInfo fields are stored
-// as @k and @v, page ids are stored as array wrapped in a struct.
-void XdrStoryInfoExtraEntry_v2(
-    XdrContext* const xdr, fuchsia::modular::StoryInfoExtraEntry* const data) {
-  xdr->Field("@k", &data->key);
-  xdr->Field("@v", &data->value);
-}
-
-void XdrStoryInfo_v2(XdrContext* const xdr,
-                     fuchsia::modular::StoryInfo* const data) {
-  xdr->Field("last_focus_time", &data->last_focus_time);
-  xdr->Field("url", &data->url);
-  xdr->Field("id", &data->id);
-  xdr->Field("extra", &data->extra, XdrStoryInfoExtraEntry_v2);
-}
-
-void XdrPageId_v2(XdrContext* const xdr, fuchsia::ledger::PageId* const data) {
-  xdr->Field("id", &data->id);
-}
-
-void XdrStoryData_v2(XdrContext* const xdr,
-                     fuchsia::modular::internal::StoryData* const data) {
-  xdr->Field("story_info", &data->story_info, XdrStoryInfo_v2);
-  xdr->Field("story_page_id", &data->story_page_id, XdrPageId_v2);
-}
-
-// Version 3: ExtraInfo fields are stored as @k and @v, page ids are stored as
-// array, and we set an explicit @version field.
-void XdrStoryData_v3(XdrContext* const xdr,
-                     fuchsia::modular::internal::StoryData* const data) {
-  if (!xdr->Version(3)) {
-    return;
-  }
-  // NOTE(mesch): We reuse subsidiary filters of previous versions as long as we
-  // can. Only when they change too we create new versions of them.
-  xdr->Field("story_info", &data->story_info, XdrStoryInfo_v2);
-  xdr->Field("story_page_id", &data->story_page_id, XdrPageId_v2);
-}
-
-// Version 4: Includes is_kind_of_proto_story field.
-void XdrStoryData_v4(XdrContext* const xdr,
-                     fuchsia::modular::internal::StoryData* const data) {
-  if (!xdr->Version(4)) {
-    return;
-  }
-  // NOTE(mesch): We reuse subsidiary filters of previous versions as long as we
-  // can. Only when they change too we create new versions of them.
-  xdr->Field("story_info", &data->story_info, XdrStoryInfo_v2);
-  xdr->Field("story_page_id", &data->story_page_id, XdrPageId_v2);
-}
-
-// Version 5: Includes story_name field.
-void XdrStoryData_v5(XdrContext* const xdr,
-                     fuchsia::modular::internal::StoryData* const data) {
-  if (!xdr->Version(5)) {
-    return;
-  }
-  // NOTE(mesch): We reuse subsidiary filters of previous versions as long as we
-  // can. Only when they change too we create new versions of them.
-  xdr->Field("story_info", &data->story_info, XdrStoryInfo_v2);
-  xdr->Field("story_name", &data->story_name);
-  xdr->Field("story_page_id", &data->story_page_id, XdrPageId_v2);
-}
-
-void XdrStoryOptions_v1(XdrContext* const xdr,
-                        fuchsia::modular::StoryOptions* const data) {
-  xdr->Field("kind_of_proto_story", &data->kind_of_proto_story);
-}
-
-// Version 6: Includes story_options field.
-void XdrStoryData_v6(XdrContext* const xdr,
-                     fuchsia::modular::internal::StoryData* const data) {
-  if (!xdr->Version(6)) {
-    return;
-  }
-  // NOTE(mesch): We reuse subsidiary filters of previous versions as long as we
-  // can. Only when they change too we create new versions of them.
-  xdr->Field("story_info", &data->story_info, XdrStoryInfo_v2);
-  xdr->Field("story_name", &data->story_name);
-  xdr->Field("story_options", &data->story_options, XdrStoryOptions_v1);
-  xdr->Field("story_page_id", &data->story_page_id, XdrPageId_v2);
-}
-
-}  // namespace
-
-// clang-format off
-XdrFilterType<fuchsia::modular::internal::StoryData> XdrStoryData[] = {
-    XdrStoryData_v6,
-    XdrStoryData_v5,
-    XdrStoryData_v4,
-    XdrStoryData_v3,
-    XdrStoryData_v2,
-    XdrStoryData_v1,
-    XdrStoryData_v0,
-    nullptr,
-};
-// clang-format on
-
-}  // namespace modular
diff --git a/bin/sessionmgr/storage/session_storage_xdr.h b/bin/sessionmgr/storage/session_storage_xdr.h
deleted file mode 100644
index 97c0b45..0000000
--- a/bin/sessionmgr/storage/session_storage_xdr.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORAGE_SESSION_STORAGE_XDR_H_
-#define PERIDOT_BIN_SESSIONMGR_STORAGE_SESSION_STORAGE_XDR_H_
-
-#include <fuchsia/modular/internal/cpp/fidl.h>
-
-#include "peridot/lib/fidl/json_xdr.h"
-
-namespace modular {
-
-extern XdrFilterType<fuchsia::modular::internal::StoryData> XdrStoryData[];
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORAGE_SESSION_STORAGE_XDR_H_
diff --git a/bin/sessionmgr/storage/story_storage.cc b/bin/sessionmgr/storage/story_storage.cc
deleted file mode 100644
index 070fb17..0000000
--- a/bin/sessionmgr/storage/story_storage.cc
+++ /dev/null
@@ -1,874 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-
-#include <fuchsia/modular/internal/cpp/fidl.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/bin/sessionmgr/storage/story_storage_xdr.h"
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/ledger_client/operations.h"
-
-namespace modular {
-
-namespace {
-
-// TODO(rosswang): replace with |std::string::starts_with| after C++20
-bool StartsWith(const std::string& string, const std::string& prefix) {
-  return string.compare(0, prefix.size(), prefix) == 0;
-}
-
-std::string EntityKeyForCookie(const std::string& cookie) {
-  return kEntityKeyPrefix + cookie;
-}
-
-std::string EntityTypeKeyForCookie(const std::string& cookie) {
-  return kEntityKeyPrefix + cookie + "/type";
-}
-
-std::string CookieFromEntityKey(const std::string& key) {
-  return key.substr(sizeof(kEntityKeyPrefix) - 1);
-}
-
-}  // namespace
-
-StoryStorage::StoryStorage(LedgerClient* ledger_client,
-                           fuchsia::ledger::PageId page_id)
-    : PageClient("StoryStorage", ledger_client, page_id, "" /* key_prefix */),
-      ledger_client_(ledger_client),
-      page_id_(page_id),
-      weak_ptr_factory_(this) {
-  FXL_DCHECK(ledger_client_ != nullptr);
-}
-
-FuturePtr<> StoryStorage::WriteModuleData(ModuleData module_data) {
-  auto module_path = fidl::Clone(module_data.module_path);
-  return UpdateModuleData(
-      module_path, fxl::MakeCopyable([module_data = std::move(module_data)](
-                                         ModuleDataPtr* module_data_ptr) {
-        *module_data_ptr = ModuleData::New();
-        module_data.Clone(module_data_ptr->get());
-      }));
-}
-
-namespace {
-
-struct UpdateModuleDataState {
-  std::vector<std::string> module_path;
-  std::function<void(ModuleDataPtr*)> mutate_fn;
-  OperationQueue sub_operations;
-};
-
-}  // namespace
-
-FuturePtr<> StoryStorage::UpdateModuleData(
-    const std::vector<std::string>& module_path,
-    std::function<void(ModuleDataPtr*)> mutate_fn) {
-  auto op_state = std::make_shared<UpdateModuleDataState>();
-  op_state->module_path = module_path;
-  op_state->mutate_fn = std::move(mutate_fn);
-
-  auto key = MakeModuleKey(module_path);
-  auto op_body = [this, op_state, key](OperationBase* op) {
-    auto did_read =
-        Future<ModuleDataPtr>::Create("StoryStorage.UpdateModuleData.did_read");
-    op_state->sub_operations.Add(
-        new ReadDataCall<ModuleData>(page(), key, true /* not_found_is_ok */,
-                                     XdrModuleData, did_read->Completer()));
-
-    auto did_mutate = did_read->AsyncMap(
-        [this, op_state, key](ModuleDataPtr current_module_data) {
-          auto new_module_data = CloneOptional(current_module_data);
-          op_state->mutate_fn(&new_module_data);
-
-          if (!new_module_data && !current_module_data) {
-            return Future<>::CreateCompleted(
-                "StoryStorage.UpdateModuleData.did_mutate");
-          }
-
-          auto module_data_copy = CloneOptional(new_module_data);
-          std::string expected_value;
-          XdrWrite(&expected_value, &module_data_copy, XdrModuleData);
-
-          if (current_module_data) {
-            FXL_DCHECK(new_module_data)
-                << "StoryStorage::UpdateModuleData(): mutate_fn() must not "
-                   "set to null an existing ModuleData record.";
-
-            // We complete this Future chain when the Ledger gives us the
-            // notification that |module_data| has been written. The Ledger
-            // won't do that if the current value for |key| won't change, so
-            // we have to short-circuit here.
-            // ModuleData contains VMOs, so doing a comparison
-            // *new_module_data == *current_module_data won't be true even if
-            // the data in the VMOs under the hood is the same. When this
-            // happens the ledger won't notify us of any change, since the data
-            // was actually the same. To overcome this we compare the raw
-            // strings.
-            auto current_data_copy = CloneOptional(current_module_data);
-            std::string current_value;
-            XdrWrite(&current_value, &current_data_copy, XdrModuleData);
-            if (current_value == expected_value) {
-              return Future<>::CreateCompleted(
-                  "StoryStorage.UpdateModuleData.did_mutate");
-            }
-          }
-
-          FXL_DCHECK(new_module_data->module_path == op_state->module_path)
-              << "StorageStorage::UpdateModuleData(path, ...): mutate_fn() "
-                 "must set "
-                 "ModuleData.module_path to |path|.";
-
-          op_state->sub_operations.Add(new WriteDataCall<ModuleData>(
-              page(), key, XdrModuleData, std::move(module_data_copy), [] {}));
-
-          return WaitForWrite(key, expected_value);
-        });
-
-    return did_mutate;
-  };
-
-  auto ret = Future<>::Create("StoryStorage.UpdateModuleData.ret");
-  operation_queue_.Add(NewCallbackOperation(
-      "StoryStorage::UpdateModuleData", std::move(op_body), ret->Completer()));
-  return ret;
-}
-
-FuturePtr<ModuleDataPtr> StoryStorage::ReadModuleData(
-    const std::vector<std::string>& module_path) {
-  auto key = MakeModuleKey(module_path);
-  auto ret = Future<ModuleDataPtr>::Create("StoryStorage.ReadModuleData.ret");
-  operation_queue_.Add(
-      new ReadDataCall<ModuleData>(page(), key, true /* not_found_is_ok */,
-                                   XdrModuleData, ret->Completer()));
-  return ret;
-}
-
-FuturePtr<std::vector<ModuleData>> StoryStorage::ReadAllModuleData() {
-  auto ret = Future<std::vector<ModuleData>>::Create(
-      "StoryStorage.ReadAllModuleData.ret");
-  operation_queue_.Add(new ReadAllDataCall<ModuleData>(
-      page(), kModuleKeyPrefix, XdrModuleData, ret->Completer()));
-  return ret;
-}
-
-StoryStorage::LinkWatcherAutoCancel StoryStorage::WatchLink(
-    const LinkPath& link_path, LinkUpdatedCallback callback) {
-  auto it = link_watchers_.emplace(MakeLinkKey(link_path), std::move(callback));
-
-  auto auto_remove = [weak_this = GetWeakPtr(), it] {
-    if (!weak_this)
-      return;
-
-    weak_this->link_watchers_.erase(it);
-  };
-
-  return LinkWatcherAutoCancel(std::move(auto_remove));
-}
-
-namespace {
-
-constexpr char kJsonNull[] = "null";
-
-class ReadVmoCall
-    : public Operation<fuchsia::ledger::Status, fuchsia::mem::BufferPtr> {
- public:
-  ReadVmoCall(PageClient* page_client, fidl::StringPtr key,
-              ResultCall result_call)
-      : Operation("StoryStorage::ReadVmoCall", std::move(result_call)),
-        page_client_(page_client),
-        key_(std::move(key)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &status_, &value_};
-
-    page_snapshot_ = page_client_->NewSnapshot([this, weak_ptr = GetWeakPtr()] {
-      if (!weak_ptr) {
-        return;
-      }
-      // An error occurred getting the snapshot. Resetting page_snapshot_
-      // will ensure that the FlowToken it has captured below while waiting for
-      // a connected channel will be destroyed, and the operation will be
-      // complete.
-      status_ = fuchsia::ledger::Status::UNKNOWN_ERROR;
-      page_snapshot_ = fuchsia::ledger::PageSnapshotPtr();
-    });
-
-    page_snapshot_->Get(to_array(key_),
-                        [this, flow](fuchsia::ledger::Status status,
-                                     fuchsia::mem::BufferPtr value) {
-                          status_ = status;
-                          value_ = std::move(value);
-                        });
-  }
-
-  // Input parameters.
-  PageClient* const page_client_;
-  const fidl::StringPtr key_;
-
-  // Intermediate state.
-  fuchsia::ledger::PageSnapshotPtr page_snapshot_;
-
-  // Return values.
-  fuchsia::ledger::Status status_;
-  fuchsia::mem::BufferPtr value_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ReadVmoCall);
-};
-
-// TODO(rosswang): this is a temporary migration helper
-std::tuple<StoryStorage::Status, fidl::StringPtr> ToLinkValue(
-    fuchsia::ledger::Status ledger_status,
-    fuchsia::mem::BufferPtr ledger_value) {
-  StoryStorage::Status link_value_status = StoryStorage::Status::OK;
-  fidl::StringPtr link_value;
-
-  switch (ledger_status) {
-    case fuchsia::ledger::Status::KEY_NOT_FOUND:
-      // Leave link_value as a null-initialized StringPtr.
-      break;
-    case fuchsia::ledger::Status::OK:
-      if (!ledger_value) {
-        link_value = kJsonNull;
-      } else {
-        std::string link_value_string;
-        if (fsl::StringFromVmo(*ledger_value, &link_value_string)) {
-          link_value = std::move(link_value_string);
-        } else {
-          FXL_LOG(ERROR) << "VMO could not be copied.";
-          link_value_status = StoryStorage::Status::VMO_COPY_ERROR;
-        }
-      }
-      break;
-    default:
-      FXL_LOG(ERROR) << "PageSnapshot.Get() "
-                     << fidl::ToUnderlying(ledger_status);
-      link_value_status = StoryStorage::Status::LEDGER_ERROR;
-      break;
-  }
-
-  return {link_value_status, link_value};
-}
-
-}  // namespace
-
-FuturePtr<StoryStorage::Status, std::string> StoryStorage::GetLinkValue(
-    const LinkPath& link_path) {
-  auto key = MakeLinkKey(link_path);
-  auto ret = Future<fuchsia::ledger::Status, fuchsia::mem::BufferPtr>::Create(
-      "StoryStorage::GetLinkValue " + key);
-  operation_queue_.Add(new ReadVmoCall(this, key, ret->Completer()));
-
-  return ret->Map(ToLinkValue)->Map([](Status status, fidl::StringPtr value) {
-    return std::make_tuple(status, value ? *value : kJsonNull);
-  });
-}
-
-namespace {
-
-class WriteVmoCall : public Operation<StoryStorage::Status> {
- public:
-  WriteVmoCall(PageClient* page_client, const std::string& key,
-               fuchsia::mem::Buffer value, ResultCall result_call)
-      : Operation("StoryStorage::WriteVmoCall", std::move(result_call)),
-        page_client_(page_client),
-        key_(key),
-        value_(std::move(value)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &status_};
-    status_ = StoryStorage::Status::OK;
-
-    page_client_->page()->CreateReferenceFromBuffer(
-        std::move(value_), [this, flow, weak_ptr = GetWeakPtr()](
-                               fuchsia::ledger::Status status,
-                               fuchsia::ledger::ReferencePtr reference) {
-          if (weak_ptr) {
-            if (status == fuchsia::ledger::Status::OK) {
-              FXL_DCHECK(reference);
-              PutReference(std::move(reference), flow);
-            } else {
-              FXL_LOG(ERROR) << "StoryStorage.WriteVmoCall " << key_ << " "
-                             << " Page.CreateReferenceFromBuffer() "
-                             << fidl::ToUnderlying(status);
-              status_ = StoryStorage::Status::LEDGER_ERROR;
-            }
-          }
-        });
-  }
-
-  void PutReference(fuchsia::ledger::ReferencePtr reference, FlowToken flow) {
-    page_client_->page()->PutReference(
-        to_array(key_), std::move(*reference), fuchsia::ledger::Priority::EAGER,
-        [this, flow, weak_ptr = GetWeakPtr()](fuchsia::ledger::Status status) {
-          if (weak_ptr && status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << "StoryStorage.WriteVmoCall " << key_ << " "
-                           << " Page.PutReference() "
-                           << fidl::ToUnderlying(status);
-            status_ = StoryStorage::Status::LEDGER_ERROR;
-          }
-        });
-  }
-
-  PageClient* const page_client_;
-  std::string key_;
-  fuchsia::mem::Buffer value_;
-
-  StoryStorage::Status status_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(WriteVmoCall);
-};
-
-// Returns the type of the entity with the associated |cookie|.
-//
-// If no type is found for the given |cookie|, the returned status will be
-// |INVALID_ENTITY_COOKIE|.
-class GetEntityTypeCall
-    : public PageOperation<StoryStorage::Status, std::string> {
- public:
-  GetEntityTypeCall(PageClient* page_client, const std::string& cookie,
-                    ResultCall result_call)
-      : PageOperation("StoryStorage::GetEntityTypeCall", page_client->page(),
-                      std::move(result_call)),
-        page_client_(page_client),
-        cookie_(cookie) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &status_, &type_};
-    status_ = StoryStorage::Status::OK;
-
-    operation_queue_.Add(new ReadVmoCall(
-        page_client_, EntityTypeKeyForCookie(cookie_),
-        [this, flow](fuchsia::ledger::Status status,
-                     fuchsia::mem::BufferPtr buffer) {
-          if (status == fuchsia::ledger::Status::KEY_NOT_FOUND) {
-            status_ = StoryStorage::Status::INVALID_ENTITY_COOKIE;
-            return;
-          }
-
-          if (status != fuchsia::ledger::Status::OK) {
-            status_ = StoryStorage::Status::LEDGER_ERROR;
-            return;
-          }
-          if (buffer) {
-            FXL_CHECK(fsl::StringFromVmo(*buffer, &type_));
-          }
-        }));
-  }
-
-  PageClient* const page_client_;
-  const std::string cookie_;
-  std::string type_;
-  StoryStorage::Status status_;
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(GetEntityTypeCall);
-};
-
-class GetEntityDataCall
-    : public PageOperation<StoryStorage::Status, fuchsia::mem::BufferPtr> {
- public:
-  GetEntityDataCall(PageClient* page_client, const std::string& cookie,
-                    const std::string& type, ResultCall result_call)
-      : PageOperation("StoryStorage::GetEntityDataCall", page_client->page(),
-                      std::move(result_call)),
-        page_client_(page_client),
-        cookie_(cookie),
-        type_(type) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &status_, &result_};
-    status_ = StoryStorage::Status::OK;
-
-    operation_queue_.Add(new GetEntityTypeCall(
-        page_client_, cookie_,
-        [this, flow](StoryStorage::Status status, const std::string& type) {
-          if (status != StoryStorage::Status::OK) {
-            status_ = status;
-            return;
-          }
-
-          if (type_ != type) {
-            status_ = StoryStorage::Status::INVALID_ENTITY_TYPE;
-            return;
-          }
-
-          operation_queue_.Add(
-              new ReadVmoCall(page_client_, EntityKeyForCookie(cookie_),
-                              [this, flow](fuchsia::ledger::Status status,
-                                           fuchsia::mem::BufferPtr buffer) {
-                                StoryStorage::Status story_status =
-                                    status == fuchsia::ledger::Status::OK
-                                        ? StoryStorage::Status::OK
-                                        : StoryStorage::Status::LEDGER_ERROR;
-                                status_ = story_status;
-                                result_ = std::move(buffer);
-                              }));
-        }));
-  }
-
-  PageClient* const page_client_;
-  const std::string cookie_;
-  std::string type_;
-  fuchsia::mem::BufferPtr result_ = nullptr;
-  StoryStorage::Status status_;
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(GetEntityDataCall);
-};
-
-// Sets the type and value of the Entity stored under |cookie|.
-//
-// The type and value are written to separate keys in a single transaction.
-//
-// The |result_call| is wrapped in a function which checks whether or not all
-// the writes were successfull prior to commiting the transaction.
-class SetEntityDataCall : public PageOperation<StoryStorage::Status> {
- public:
-  SetEntityDataCall(PageClient* page_client, const std::string& cookie,
-                    const std::string& type, fuchsia::mem::Buffer value,
-                    ResultCall result_call)
-      : PageOperation(
-            "StoryStorage::SetEntityDataCall", page_client->page(),
-            [result_call = std::move(result_call),
-             page = page_client->page()](StoryStorage::Status status) {
-              // The result callback is wrapped in order to commit/rollback the
-              // transaction. It's important to note that the operation instance
-              // will be deleted by the time this callback is executed.
-              if (status == StoryStorage::Status::OK) {
-                page->Commit([result_call = std::move(result_call)](
-                                 fuchsia::ledger::Status status) {
-                  if (status == fuchsia::ledger::Status::OK) {
-                    result_call(StoryStorage::Status::OK);
-                  } else {
-                    result_call(StoryStorage::Status::LEDGER_ERROR);
-                  }
-                });
-              } else {
-                page->Rollback([result_call = std::move(result_call)](
-                                   fuchsia::ledger::Status status) {});
-                result_call(status);
-              }
-            }),
-        page_client_(page_client),
-        cookie_(cookie),
-        type_(type),
-        value_(std::move(value)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &status_};
-    status_ = StoryStorage::Status::OK;
-    // This transaction will be either committed or rolled back in the wrapped
-    // result call.
-    page()->StartTransaction([](fuchsia::ledger::Status status) {});
-
-    // First verify the type of the data to write matches the existing entity
-    // type.
-    operation_queue_.Add(new GetEntityTypeCall(
-        page_client_, cookie_,
-        [this, flow](StoryStorage::Status status, const std::string& type) {
-          if (status == StoryStorage::Status::LEDGER_ERROR) {
-            status_ = StoryStorage::Status::LEDGER_ERROR;
-            return;
-          }
-
-          if (status == StoryStorage::Status::INVALID_ENTITY_COOKIE ||
-              type == type_) {
-            // If the type is empty it has never been written before (empty
-            // types are not permitted so will not be written in the first
-            // place).
-            PerformWrites(flow);
-          } else {
-            status_ = StoryStorage::Status::INVALID_ENTITY_TYPE;
-            return;
-          }
-        }));
-  }
-
-  void PerformWrites(FlowToken flow) {
-    // Write the entity data.
-    WriteVmo(std::move(value_), EntityKeyForCookie(cookie_), flow);
-
-    // Write the entity type.
-    fuchsia::mem::Buffer type_vmo;
-    FXL_CHECK(fsl::VmoFromString(type_, &type_vmo));
-    WriteVmo(std::move(type_vmo), EntityTypeKeyForCookie(cookie_), flow);
-  }
-
-  void WriteVmo(fuchsia::mem::Buffer data, const std::string& key,
-                FlowToken flow) {
-    page()->CreateReferenceFromBuffer(
-        std::move(data),
-        [this, key, flow](fuchsia::ledger::Status status,
-                          fuchsia::ledger::ReferencePtr reference) {
-          if (status == fuchsia::ledger::Status::OK) {
-            FXL_DCHECK(reference);
-            PutReference(std::move(reference), key, flow);
-          } else {
-            FXL_LOG(ERROR) << trace_name() << " "
-                           << "SetEntityDataCall.CreateReferenceFromBuffer "
-                           << key << " " << fidl::ToUnderlying(status);
-            status_ = StoryStorage::Status::LEDGER_ERROR;
-          }
-        });
-  }
-
-  void PutReference(fuchsia::ledger::ReferencePtr reference,
-                    const std::string& key, FlowToken flow) {
-    page()->PutReference(
-        to_array(key), std::move(*reference), fuchsia::ledger::Priority::EAGER,
-        [this, key, flow](fuchsia::ledger::Status status) {
-          if (status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << trace_name() << " "
-                           << "SetEntityDataCall.PutReference " << key << " "
-                           << fidl::ToUnderlying(status);
-            status_ = StoryStorage::Status::LEDGER_ERROR;
-          }
-        });
-  }
-
-  PageClient* const page_client_;
-  std::string cookie_;
-  std::string type_;
-  fuchsia::mem::Buffer value_;
-
-  StoryStorage::Status status_;
-
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SetEntityDataCall);
-};
-
-// Returns: 1) if a mutation happened, 2) the status and 3) the new value.
-class UpdateLinkCall
-    : public Operation<bool, StoryStorage::Status, fidl::StringPtr> {
- public:
-  UpdateLinkCall(
-      PageClient* page_client, std::string key,
-      std::function<void(fidl::StringPtr*)> mutate_fn,
-      std::function<FuturePtr<>(const std::string&, const std::string&)>
-          wait_for_write_fn,
-      ResultCall done)
-      : Operation("StoryStorage::UpdateLinkCall", std::move(done)),
-        page_client_(page_client),
-        key_(std::move(key)),
-        mutate_fn_(std::move(mutate_fn)),
-        wait_for_write_fn_(std::move(wait_for_write_fn)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &did_update_, &status_, &new_value_};
-
-    operation_queue_.Add(
-        new ReadVmoCall(page_client_, key_,
-                        [this, flow](fuchsia::ledger::Status status,
-                                     fuchsia::mem::BufferPtr current_value) {
-                          fidl::StringPtr json_current_value;
-                          std::tie(status_, json_current_value) =
-                              ToLinkValue(status, std::move(current_value));
-
-                          if (status_ == StoryStorage::Status::OK) {
-                            Mutate(flow, std::move(json_current_value));
-                          }
-                        }));
-  }
-
-  void Mutate(FlowToken flow, fidl::StringPtr current_value) {
-    new_value_ = current_value;
-    mutate_fn_(&new_value_);
-
-    did_update_ = true;
-    if (new_value_ == current_value) {
-      did_update_ = false;
-      return;
-    }
-
-    fuchsia::mem::Buffer vmo;
-    if (!new_value_ || fsl::VmoFromString(*new_value_, &vmo)) {
-      operation_queue_.Add(new WriteVmoCall(
-          page_client_, key_, std::move(vmo),
-          [this, flow](StoryStorage::Status status) {
-            status_ = status;
-
-            // If we succeeded AND we set a new value, we need to wait for
-            // confirmation from the ledger.
-            if (status == StoryStorage::Status::OK && new_value_) {
-              wait_for_write_fn_(key_, new_value_)->Then([this, flow] {
-                Done(true, std::move(status_), std::move(new_value_));
-              });
-            }
-          }));
-    } else {
-      FXL_LOG(ERROR) << "VMO could not be copied.";
-      status_ = StoryStorage::Status::VMO_COPY_ERROR;
-    }
-  }
-
-  // Input parameters.
-  PageClient* const page_client_;
-  const std::string key_;
-  std::function<void(fidl::StringPtr*)> mutate_fn_;
-  std::function<FuturePtr<>(const std::string&, const std::string&)>
-      wait_for_write_fn_;
-
-  // Operation runtime state.
-  OperationQueue operation_queue_;
-
-  // Return values.
-  bool did_update_;
-  StoryStorage::Status status_;
-  fidl::StringPtr new_value_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(UpdateLinkCall);
-};
-
-}  // namespace
-
-FuturePtr<StoryStorage::Status> StoryStorage::UpdateLinkValue(
-    const LinkPath& link_path, std::function<void(fidl::StringPtr*)> mutate_fn,
-    const void* context) {
-  // nullptr is reserved for updates that came from other instances of
-  // StoryStorage.
-  FXL_DCHECK(context != nullptr)
-      << "StoryStorage::UpdateLinkValue(..., context) of nullptr is reserved.";
-
-  auto key = MakeLinkKey(link_path);
-  auto did_update = Future<bool, Status, fidl::StringPtr>::Create(
-      "StoryStorage.UpdateLinkValue.did_update");
-  operation_queue_.Add(new UpdateLinkCall(
-      this, key, std::move(mutate_fn),
-      std::bind(&StoryStorage::WaitForWrite, this, std::placeholders::_1,
-                std::placeholders::_2),
-      did_update->Completer()));
-
-  // We can't chain this call to the parent future chain because we do
-  // not want it to happen at all in the case of errors.
-  return did_update->WeakMap(
-      GetWeakPtr(),
-      [this, key, context](bool did_update, StoryStorage::Status status,
-                           fidl::StringPtr new_value) {
-        // if |new_value| is null, it means we didn't write any new data, even
-        // if |status| == OK.
-        if (status == StoryStorage::Status::OK && did_update) {
-          NotifyLinkWatchers(key, new_value, context);
-        }
-
-        return status;
-      });
-}
-
-FuturePtr<StoryStorage::Status> StoryStorage::SetEntityData(
-    const std::string& cookie, const std::string& type,
-    fuchsia::mem::Buffer data) {
-  auto did_update = Future<StoryStorage::Status>::Create(
-      "StoryStorage.CreateEntity.did_update");
-  if (type.empty()) {
-    did_update->Complete(StoryStorage::Status::INVALID_ENTITY_TYPE);
-  } else if (cookie.empty()) {
-    did_update->Complete(StoryStorage::Status::INVALID_ENTITY_COOKIE);
-  } else {
-    operation_queue_.Add(new SetEntityDataCall(
-        this, cookie, type, std::move(data), did_update->Completer()));
-  }
-  return did_update;
-}
-
-FuturePtr<StoryStorage::Status, std::string> StoryStorage::GetEntityType(
-    const std::string& cookie) {
-  auto did_update = Future<StoryStorage::Status, std::string>::Create(
-      "StoryStorage.GetEntityType.did_update");
-  operation_queue_.Add(
-      new GetEntityTypeCall(this, cookie, did_update->Completer()));
-  return did_update;
-}
-
-FuturePtr<StoryStorage::Status, fuchsia::mem::BufferPtr>
-StoryStorage::GetEntityData(const std::string& cookie,
-                            const std::string& type) {
-  auto did_update =
-      Future<StoryStorage::Status, fuchsia::mem::BufferPtr>::Create(
-          "StoryStorage.GetEntityData.did_update");
-  operation_queue_.Add(
-      new GetEntityDataCall(this, cookie, type, did_update->Completer()));
-  return did_update;
-}
-
-void StoryStorage::WatchEntity(
-    const std::string& cookie, const std::string& type,
-    fuchsia::modular::EntityWatcherPtr entity_watcher) {
-  operation_queue_.Add(new GetEntityDataCall(
-      this, cookie, type,
-      fxl::MakeCopyable(
-          [this, cookie, entity_watcher = std::move(entity_watcher)](
-              StoryStorage::Status status,
-              std::unique_ptr<fuchsia::mem::Buffer> value) mutable {
-            // Send the current value as the initial update.
-            entity_watcher->OnUpdated(std::move(value));
-
-            auto existing_watchers_it = entity_watchers_.try_emplace(cookie);
-            existing_watchers_it.first->second.AddInterfacePtr(
-                std::move(entity_watcher));
-          })));
-}
-
-FuturePtr<StoryStorage::Status> StoryStorage::SetEntityName(
-    const std::string& cookie, const std::string& entity_name) {
-  auto did_set = Future<StoryStorage::Status>::Create(
-      "StoryStorage.SetEntityName.did_set");
-  fuchsia::mem::Buffer data;
-  if (fsl::VmoFromString(cookie, &data)) {
-    operation_queue_.Add(new WriteVmoCall(this, kEntityNamePrefix + entity_name,
-                                          std::move(data),
-                                          did_set->Completer()));
-  } else {
-    did_set->Complete(StoryStorage::Status::VMO_COPY_ERROR);
-  }
-  return did_set;
-}
-
-FuturePtr<StoryStorage::Status, std::string>
-StoryStorage::GetEntityCookieForName(const std::string& entity_name) {
-  auto did_get = Future<StoryStorage::Status, std::string>::Create(
-      "StoryStorage.GetEntityName.did_get");
-  operation_queue_.Add(new ReadVmoCall(
-      this, kEntityNamePrefix + entity_name,
-      [did_get](fuchsia::ledger::Status status, fuchsia::mem::BufferPtr data) {
-        if (status != fuchsia::ledger::Status::OK || !data) {
-          did_get->Complete(StoryStorage::Status::LEDGER_ERROR, "");
-          return;
-        }
-        std::string cookie;
-        if (!fsl::StringFromVmo(*data, &cookie)) {
-          did_get->Complete(StoryStorage::Status::VMO_COPY_ERROR, "");
-          return;
-        }
-
-        did_get->Complete(StoryStorage::Status::OK, std::move(cookie));
-      }));
-  return did_get;
-}
-
-FuturePtr<> StoryStorage::Sync() {
-  auto ret = Future<>::Create("StoryStorage::Sync.ret");
-  operation_queue_.Add(NewCallbackOperation("StoryStorage::Sync",
-                                            [](OperationBase* op) {
-                                              return Future<>::CreateCompleted(
-                                                  "StoryStorage::Sync");
-                                            },
-                                            ret->Completer()));
-  return ret;
-}
-
-void StoryStorage::OnPageChange(const std::string& key,
-                                fuchsia::mem::BufferPtr value) {
-  if (StartsWith(key, kEntityKeyPrefix)) {
-    NotifyEntityWatchers(CookieFromEntityKey(key), std::move(*value));
-    return;
-  }
-
-  std::string value_string;
-  if (!fsl::StringFromVmo(*value, &value_string)) {
-    return;
-  }
-
-  // If there are any operations waiting on this particular write
-  // having happened, tell them to continue.
-  auto it = pending_writes_.find({key, value_string});
-  bool notify_link_listeners = true;
-  if (it != pending_writes_.end()) {
-    auto local_futures = std::move(it->second);
-    for (auto fut : local_futures) {
-      fut->Complete();
-    }
-
-    // Since the above write originated from this StoryStorage instance,
-    // we do not notify any link listeners.
-    notify_link_listeners = false;
-  }
-
-  if (StartsWith(key, kLinkKeyPrefix)) {
-    if (notify_link_listeners) {
-      NotifyLinkWatchers(key, value_string, nullptr /* context */);
-    }
-  } else if (StartsWith(key, kModuleKeyPrefix)) {
-    if (on_module_data_updated_) {
-      auto module_data = ModuleData::New();
-      if (!XdrRead(value_string, &module_data, XdrModuleData)) {
-        FXL_LOG(ERROR) << "Unable to parse ModuleData " << key << " " << value;
-        return;
-      }
-      on_module_data_updated_(std::move(*module_data));
-    }
-  } else if (!StartsWith(key, kEntityNamePrefix)) {
-    // TODO(thatguy): We store some Link data on the root page (where
-    // StoryData is stored) for the session shell to make use of. This means we
-    // get notified in that instance of changes we don't care about.
-    //
-    // Consider putting all story-scoped data under a shared prefix, and use
-    // that when initializing the PageClient.
-    FXL_LOG(ERROR) << "Unexpected StoryStorage Ledger key prefix: " << key;
-  }
-}
-
-void StoryStorage::OnPageDelete(const std::string& key) {
-  // ModuleData and Link values are never deleted, although it is
-  // theoretically possible that conflict resolution results in a key
-  // disappearing. We do not currently do this.
-}
-
-void StoryStorage::OnPageConflict(Conflict* conflict) {
-  // TODO(thatguy): Add basic conflict resolution. We can force a conflict for
-  // link data in tests by using Page.StartTransaction() in UpdateLinkValue().
-  FXL_LOG(WARNING) << "StoryStorage::OnPageConflict() for link key "
-                   << to_string(conflict->key);
-}
-
-void StoryStorage::NotifyLinkWatchers(const std::string& link_key,
-                                      fidl::StringPtr value,
-                                      const void* context) {
-  auto range = link_watchers_.equal_range(link_key);
-  for (auto it = range.first; it != range.second; ++it) {
-    it->second(value, context);
-  }
-}
-
-void StoryStorage::NotifyEntityWatchers(const std::string& cookie,
-                                        fuchsia::mem::Buffer value) {
-  auto range = entity_watchers_.equal_range(cookie);
-  for (auto it = range.first; it != range.second; ++it) {
-    for (const auto& watcher : it->second.ptrs()) {
-      fuchsia::mem::Buffer clone;
-      fuchsia::mem::Clone(value, &clone);
-      (*watcher)->OnUpdated(
-          std::make_unique<fuchsia::mem::Buffer>(std::move(clone)));
-    }
-  }
-}
-
-FuturePtr<> StoryStorage::WaitForWrite(const std::string& key,
-                                       const std::string& value) {
-  // TODO(thatguy): It is possible that through conflict resolution, the write
-  // we expect to get will never arrive.  We must have the conflict resolver
-  // update |pending_writes_| with the result of conflict resolution.
-  auto did_see_write =
-      Future<>::Create("StoryStorage.WaitForWrite.did_see_write");
-  pending_writes_[std::make_pair(key, value)].push_back(did_see_write);
-  return did_see_write;
-}
-
-fxl::WeakPtr<StoryStorage> StoryStorage::GetWeakPtr() {
-  return weak_ptr_factory_.GetWeakPtr();
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/storage/story_storage.h b/bin/sessionmgr/storage/story_storage.h
deleted file mode 100644
index 1ed370d..0000000
--- a/bin/sessionmgr/storage/story_storage.h
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORAGE_STORY_STORAGE_H_
-#define PERIDOT_BIN_SESSIONMGR_STORAGE_STORY_STORAGE_H_
-
-#include <map>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/future.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fit/defer.h>
-
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_client.h"
-#include "peridot/lib/ledger_client/page_id.h"
-
-using fuchsia::modular::LinkPath;
-using fuchsia::modular::LinkPathPtr;
-using fuchsia::modular::ModuleData;
-using fuchsia::modular::ModuleDataPtr;
-
-namespace modular {
-
-// This class has the following responsibilities:
-//
-// * Manage the persistence of metadata about what mods are part of a single
-//   story.
-// * Manage the persistence of link values in a single story.
-// * Observe the metadata and call clients back when changes initiated by other
-//   Ledger clients appear.
-//
-// All calls operate directly on the Ledger itself: no local caching is
-// performed.
-class StoryStorage : public PageClient {
- public:
-  // Constructs a new StoryStorage with storage on |page_id| in the ledger
-  // given by |ledger_client|.
-  //
-  // |ledger_client| must outlive *this.
-  StoryStorage(LedgerClient* ledger_client, fuchsia::ledger::PageId page_id);
-
-  enum class Status {
-    OK = 0,
-    LEDGER_ERROR = 1,
-    VMO_COPY_ERROR = 2,
-    // Indicates the storage operation detected either an invalid or conflicting
-    // entity type (e.g. an empty type string or a write with a mismatched
-    // type).
-    INVALID_ENTITY_TYPE = 3,
-    // Indicates the storage operation detected an invalid entity cookie (e.g.
-    // an empty cookie).
-    INVALID_ENTITY_COOKIE = 4,
-  };
-
-  // =========================================================================
-  // ModuleData
-
-  // Sets the callback that is called whenever ModuleData is added or updated
-  // in underlying storage. Excludes notifications for changes (such as with
-  // WriteModuleData() or UpdateModuleData()) made on this instance of
-  // StoryStorage.
-  void set_on_module_data_updated(std::function<void(ModuleData)> callback) {
-    on_module_data_updated_ = std::move(callback);
-  }
-
-  // Returns the current ModuleData for |module_path|. If not found, the
-  // returned value is null.
-  FuturePtr<ModuleDataPtr> ReadModuleData(
-      const std::vector<std::string>& module_path);
-
-  // Writes |module_data| to storage. The returned future is completed
-  // once |module_data| has been written and a notification confirming the
-  // write has been received.
-  FuturePtr<> WriteModuleData(ModuleData module_data);
-
-  // Reads the ModuleData for |module_path|, calls |mutate_fn| which may modify
-  // the contents, and writes the resulting ModuleData back to storage.
-  // Completes the returned future once a notification confirming the write has
-  // been received.
-  //
-  // If there is no ModuleData for |module_path|, |mutate_fn| will be called
-  // with a null ModuleDataPtr. |mutate_fn| may initialize the ModuleDataPtr,
-  // in which case a new ModuleData record will be written.
-  //
-  // It is illegal to change ModuleDataPtr->module_path in |mutate_fn| or to
-  // reset to null an otherwise initialized ModuleDataPtr.
-  FuturePtr<> UpdateModuleData(
-      const std::vector<std::string>& module_path,
-      std::function<void(ModuleDataPtr*)> mutate_fn);
-
-  // Returns all ModuleData entries for all mods.
-  FuturePtr<std::vector<ModuleData>> ReadAllModuleData();
-
-  // =========================================================================
-  // Link data
-
-  // Use with WatchLink below.
-  //
-  // Called whenever a change occurs to the link specified in
-  // WatchLink(). The receiver gets the LinkPath, the current
-  // |value| and whatever |context| was passed into the mutation call. If
-  // the new value did not originate from a call on *this, |context| will be
-  // given the special value of nullptr.
-  using LinkUpdatedCallback =
-      std::function<void(const fidl::StringPtr& value, const void* context)>;
-  using LinkWatcherAutoCancel = fit::deferred_action<std::function<void()>>;
-
-  // Registers |callback| to be invoked whenever a change to the link value at
-  // |link_path| occurs. See documentation for LinkUpdatedCallback above. The
-  // returned LinkWatcherAutoCancel must be kept alive as long as the callee
-  // wishes to receive link updates on |callback|.
-  LinkWatcherAutoCancel WatchLink(const LinkPath& link_path,
-                                  LinkUpdatedCallback callback);
-
-  // Returns the value for |link_path|.
-  //
-  // The returned value will be stringified JSON. If no value is found, returns
-  // "null", the JSON string for a null value.
-  FuturePtr<Status, std::string> GetLinkValue(const LinkPath& link_path);
-
-  // Fetches the link value at |link_path| and passes it to |mutate_fn|.
-  // |mutate_fn| must synchronously update the StringPtr with the desired new
-  // value for the link and return. The new value will be written to storage
-  // and the returned future completed with the status.
-  //
-  // |mutate_fn|'s |value| points to the current value for the link and may be
-  // modified. If the link is new and has no value, value->is_null() will be
-  // true. Otherwise, *value will be valid JSON and must remain valid JSON
-  // after |mutate_fn| is done.
-  //
-  // |context| is carried with the mutation operation and passed to any
-  // notifications about this change on this instance of StoryStorage. A value
-  // of nullptr for |context| is illegal.
-  FuturePtr<Status> UpdateLinkValue(
-      const LinkPath& link_path,
-      std::function<void(fidl::StringPtr* value)> mutate_fn,
-      const void* context);
-
-  // Sets the type and data for the Entity stored under |cookie|.
-  //
-  // |type| If Entity data has already been written, this type is expected to
-  //        match the type which was previously written.
-  // |data| The data to write to the Entity.
-  FuturePtr<Status> SetEntityData(const std::string& cookie,
-                                  const std::string& type,
-                                  fuchsia::mem::Buffer data);
-
-  // Returns the type for the Entity stored under the provided |cookie|.
-  //
-  // If an error occurred the Status will indicate the error, and returned
-  // string will be empty.
-  FuturePtr<Status, std::string> GetEntityType(const std::string& cookie);
-
-  // Returns the data for the Entity stored under the provided |cookie|.
-  //
-  // |type| The expected type of the data.
-  //
-  // If an error occurred the Status will indicate the error, and returned
-  // fuchsia::mem::BufferPtr will be nullptr.
-  FuturePtr<Status, fuchsia::mem::BufferPtr> GetEntityData(
-      const std::string& cookie, const std::string& type);
-
-  // Registers a watcher for an Entity. The EntityWatcher is notified of data
-  // changes until it is closed.
-  //
-  // |cookie| The Entity cookie.
-  // |type| The type of the observed entity data.
-  // |watcher| The entity watcher which will get notified of updates to the
-  // entity stored under |cookie|.
-  void WatchEntity(const std::string& cookie, const std::string& type,
-                   fuchsia::modular::EntityWatcherPtr watcher);
-
-  // Sets the |entity_name| of the Entity associated with |cookie|.
-  //
-  // Once an entity has been named, the associated |cookie| can be retrieved by
-  // calling |GetEntityCookieForName|.
-  FuturePtr<Status> SetEntityName(const std::string& cookie,
-                                  const std::string& entity_name);
-
-  // Gets the Entity cookie associated with the specified name.
-  FuturePtr<Status, std::string> GetEntityCookieForName(
-      const std::string& entity_name);
-
-  // Completes the returned future after all prior methods have completed.
-  FuturePtr<> Sync();
-
- private:
-  // |PageClient|
-  void OnPageChange(const std::string& key,
-                    fuchsia::mem::BufferPtr value) override;
-
-  // |PageClient|
-  void OnPageDelete(const std::string& key) override;
-
-  // |PageClient|
-  void OnPageConflict(Conflict* conflict) override;
-
-  // Notifies any watchers in |link_watchers_|.
-  //
-  // |value| will never be a null StringPtr. |value| is always a JSON-encoded
-  // string, so a null value will be presented as the string "null".
-  void NotifyLinkWatchers(const std::string& link_key, fidl::StringPtr value,
-                          const void* context);
-
-  // Notifies any watchers in |entity_watchers_[cookie]|.
-  //
-  // |value| is a valid fuchsia::mem::Buffer.
-  void NotifyEntityWatchers(const std::string& cookie,
-                            fuchsia::mem::Buffer value);
-
-  // Completes the returned Future when the ledger notifies us (through
-  // OnPageChange()) of a write for |key| with |value|.
-  FuturePtr<> WaitForWrite(const std::string& key, const std::string& value);
-
-  fxl::WeakPtr<StoryStorage> GetWeakPtr();
-
-  LedgerClient* const ledger_client_;
-  const fuchsia::ledger::PageId page_id_;
-  // NOTE: This operation queue serializes all link operations, even though
-  // operations on different links do not have an impact on each other. Consider
-  // adding an OperationQueue per link if we want to increase concurrency.
-  OperationQueue operation_queue_;
-
-  // Called when new ModuleData is encountered from the Ledger.
-  std::function<void(ModuleData)> on_module_data_updated_;
-
-  // A map of link ledger key -> watcher callback. Multiple clients can watch
-  // the same Link.
-  std::multimap<std::string, LinkUpdatedCallback> link_watchers_;
-
-  // A map of Entity cookie (i.e. Ledger key) -> set of watchers. Multiple
-  // watchers can watch the same entity.
-  std::map<std::string, fidl::InterfacePtrSet<fuchsia::modular::EntityWatcher>>
-      entity_watchers_;
-
-  // A map of ledger (key, value) to (vec of future). When we see a
-  // notification in OnPageChange() for a matching (key, value), we complete
-  // all the respective futures.
-  //
-  // NOTE: we use a map<> of vector<> here instead of a multimap<> because we
-  // complete all the Futures for a given key/value pair at once.
-  std::map<std::pair<std::string, std::string>, std::vector<FuturePtr<>>>
-      pending_writes_;
-
-  fxl::WeakPtrFactory<StoryStorage> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryStorage);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORAGE_STORY_STORAGE_H_
diff --git a/bin/sessionmgr/storage/story_storage_unittest.cc b/bin/sessionmgr/storage/story_storage_unittest.cc
deleted file mode 100644
index 0e58dd9..0000000
--- a/bin/sessionmgr/storage/story_storage_unittest.cc
+++ /dev/null
@@ -1,771 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-
-#include <memory>
-
-#include <lib/async/cpp/future.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/entity/entity_watcher_impl.h"
-#include "peridot/lib/ledger_client/page_id.h"
-#include "peridot/lib/testing/test_with_ledger.h"
-
-using fuchsia::modular::ModuleData;
-using fuchsia::modular::ModuleDataPtr;
-
-namespace modular {
-namespace {
-
-class StoryStorageTest : public testing::TestWithLedger {
- protected:
-  std::unique_ptr<StoryStorage> CreateStorage(std::string page_id) {
-    return std::make_unique<StoryStorage>(ledger_client(), MakePageId(page_id));
-  }
-};
-
-ModuleData Clone(const ModuleData& data) {
-  ModuleData dup;
-  data.Clone(&dup);
-  return dup;
-}
-
-TEST_F(StoryStorageTest, ReadModuleData_NonexistentModule) {
-  auto storage = CreateStorage("page");
-
-  bool read_done{};
-  std::vector<std::string> path;
-  path.push_back("a");
-  storage->ReadModuleData(path)->Then([&](ModuleDataPtr data) {
-    read_done = true;
-    ASSERT_FALSE(data);
-  });
-
-  RunLoopUntil([&] { return read_done; });
-}
-
-TEST_F(StoryStorageTest, ReadAllModuleData_Empty) {
-  auto storage = CreateStorage("page");
-
-  bool read_done{};
-  fidl::VectorPtr<ModuleData> all_module_data;
-  storage->ReadAllModuleData()->Then([&](std::vector<ModuleData> data) {
-    read_done = true;
-    all_module_data.reset(std::move(data));
-  });
-
-  RunLoopUntil([&] { return read_done; });
-  ASSERT_TRUE(all_module_data);
-  EXPECT_EQ(0u, all_module_data->size());
-}
-
-TEST_F(StoryStorageTest, WriteReadModuleData) {
-  // Write and then read some ModuleData entries. We expect to get the same data
-  // back.
-  auto storage = CreateStorage("page");
-
-  int notification_count{0};
-  storage->set_on_module_data_updated(
-      [&](ModuleData) { notification_count++; });
-
-  ModuleData module_data1;
-  module_data1.module_url = "url1";
-  module_data1.module_path.push_back("path1");
-  storage->WriteModuleData(Clone(module_data1));
-
-  ModuleData module_data2;
-  module_data2.module_url = "url2";
-  module_data2.module_path.push_back("path2");
-  storage->WriteModuleData(Clone(module_data2));
-
-  // We don't need to explicitly wait on WriteModuleData() because the
-  // implementation: 1) serializes all storage operations and 2) guarantees the
-  // WriteModuleData() action is finished only once the data has been written.
-  ModuleData read_data1;
-  bool read1_done{};
-  storage->ReadModuleData(module_data1.module_path)
-      ->Then([&](ModuleDataPtr data) {
-        read1_done = true;
-        ASSERT_TRUE(data);
-        read_data1 = std::move(*data);
-      });
-
-  ModuleData read_data2;
-  bool read2_done{};
-  storage->ReadModuleData(module_data2.module_path)
-      ->Then([&](ModuleDataPtr data) {
-        read2_done = true;
-        ASSERT_TRUE(data);
-        read_data2 = std::move(*data);
-      });
-
-  RunLoopUntil([&] { return read1_done && read2_done; });
-  EXPECT_EQ(module_data1, read_data1);
-  EXPECT_EQ(module_data2, read_data2);
-
-  // Read the same data back with ReadAllModuleData().
-  fidl::VectorPtr<ModuleData> all_module_data;
-  storage->ReadAllModuleData()->Then([&](std::vector<ModuleData> data) {
-    all_module_data.reset(std::move(data));
-  });
-  RunLoopUntil([&] { return !!all_module_data; });
-  EXPECT_EQ(2u, all_module_data->size());
-  EXPECT_EQ(module_data1, all_module_data->at(0));
-  EXPECT_EQ(module_data2, all_module_data->at(1));
-
-  // We should get a notification every time module data is updated.
-  EXPECT_EQ(2, notification_count);
-}
-
-TEST_F(StoryStorageTest, UpdateModuleData) {
-  // Call UpdateModuleData() on a record that doesn't exist yet.
-  auto storage = CreateStorage("page");
-
-  // We're going to observe changes on another storage instance, which
-  // simulates another device.
-  auto other_storage = CreateStorage("page");
-  bool got_notification{};
-  ModuleData notified_module_data;
-  other_storage->set_on_module_data_updated([&](ModuleData data) {
-    got_notification = true;
-    notified_module_data = std::move(data);
-  });
-
-  std::vector<std::string> path;
-  path.push_back("a");
-
-  // Case 1: Don't mutate anything.
-  bool update_done{};
-  storage
-      ->UpdateModuleData(path, [](ModuleDataPtr* ptr) { EXPECT_FALSE(*ptr); })
-      ->Then([&] { update_done = true; });
-  RunLoopUntil([&] { return update_done; });
-
-  bool read_done{};
-  ModuleData read_data;
-  storage->ReadModuleData(path)->Then([&](ModuleDataPtr data) {
-    read_done = true;
-    EXPECT_FALSE(data);
-  });
-  RunLoopUntil([&] { return read_done; });
-  // Since nothing changed, we should not have seen a notification.
-  EXPECT_FALSE(got_notification);
-
-  // Case 2: Initialize an otherwise empty record.
-  update_done = false;
-  storage
-      ->UpdateModuleData(path,
-                         [&](ModuleDataPtr* ptr) {
-                           EXPECT_FALSE(*ptr);
-
-                           *ptr = ModuleData::New();
-                           (*ptr)->module_path = path;
-                           (*ptr)->module_url = "foobar";
-                         })
-      ->Then([&] { update_done = true; });
-  RunLoopUntil([&] { return update_done; });
-
-  read_done = false;
-  storage->ReadModuleData(path)->Then([&](ModuleDataPtr data) {
-    read_done = true;
-    ASSERT_TRUE(data);
-    EXPECT_EQ(path, data->module_path);
-    EXPECT_EQ("foobar", data->module_url);
-  });
-  RunLoopUntil([&] { return read_done; });
-  // Now something changed, so we should see a notification.
-  EXPECT_TRUE(got_notification);
-  EXPECT_EQ("foobar", notified_module_data.module_url);
-
-  // Case 3: Leave alone an existing record.
-  got_notification = false;
-  storage->UpdateModuleData(path,
-                            [&](ModuleDataPtr* ptr) { EXPECT_TRUE(*ptr); });
-
-  read_done = false;
-  storage->ReadModuleData(path)->Then([&](ModuleDataPtr data) {
-    read_done = true;
-    ASSERT_TRUE(data);
-    EXPECT_EQ("foobar", data->module_url);
-  });
-  RunLoopUntil([&] { return read_done; });
-  // Now something changed, so we should see a notification.
-  EXPECT_FALSE(got_notification);
-
-  // Case 4: Mutate an existing record.
-  storage->UpdateModuleData(path, [&](ModuleDataPtr* ptr) {
-    EXPECT_TRUE(*ptr);
-    (*ptr)->module_url = "baz";
-  });
-
-  read_done = false;
-  storage->ReadModuleData(path)->Then([&](ModuleDataPtr data) {
-    read_done = true;
-    ASSERT_TRUE(data);
-    EXPECT_EQ("baz", data->module_url);
-  });
-  RunLoopUntil([&] { return read_done; });
-  // Now something changed, so we should see a notification.
-  EXPECT_TRUE(got_notification);
-  EXPECT_EQ("baz", notified_module_data.module_url);
-}
-
-namespace {
-LinkPath MakeLinkPath(const std::string& name) {
-  LinkPath path;
-  path.link_name = name;
-  return path;
-}
-}  // namespace
-
-TEST_F(StoryStorageTest, GetLink_Null) {
-  auto storage = CreateStorage("page");
-
-  // Default for an un-set Link is to get a "null" back.
-  bool get_done{};
-  fidl::StringPtr value;
-  storage->GetLinkValue(MakeLinkPath("link"))
-      ->Then([&](StoryStorage::Status status, fidl::StringPtr v) {
-        EXPECT_EQ(StoryStorage::Status::OK, status);
-        value = v;
-        get_done = true;
-      });
-  RunLoopUntil([&] { return get_done; });
-  EXPECT_EQ("null", value);
-}
-
-TEST_F(StoryStorageTest, UpdateLinkValue) {
-  auto storage = CreateStorage("page");
-
-  // Let's set a value.
-  int mutate_count{0};
-  int context;
-  storage
-      ->UpdateLinkValue(MakeLinkPath("link"),
-                        [](fidl::StringPtr* current_value) {
-                          EXPECT_TRUE(current_value->is_null());
-                          *current_value = "10";
-                        },
-                        &context)
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(StoryStorage::Status::OK, status);
-        ++mutate_count;
-      });
-
-  // If we mutate again, we should see the old value.
-  storage
-      ->UpdateLinkValue(MakeLinkPath("link"),
-                        [](fidl::StringPtr* current_value) {
-                          EXPECT_EQ("10", *current_value);
-                          *current_value = "20";
-                        },
-                        &context)
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(StoryStorage::Status::OK, status);
-        ++mutate_count;
-      });
-
-  // Now let's fetch it and see the newest value.
-  bool get_done{};
-  fidl::StringPtr value;
-  storage->GetLinkValue(MakeLinkPath("link"))
-      ->Then([&](StoryStorage::Status status, fidl::StringPtr v) {
-        EXPECT_EQ(StoryStorage::Status::OK, status);
-        value = v;
-        get_done = true;
-      });
-  RunLoopUntil([&] { return get_done; });
-
-  EXPECT_EQ(2, mutate_count);
-  EXPECT_EQ("20", value);
-}
-
-TEST_F(StoryStorageTest, WatchingLink_IgnoresOthers) {
-  // When we watch a link, we should see changes only for that link.
-  auto storage = CreateStorage("page");
-
-  // We'll be watching "foo", but updating "bar".
-  int notified_count{0};
-  auto cancel =
-      storage->WatchLink(MakeLinkPath("foo"),
-                         [&](const fidl::StringPtr& value,
-                             const void* /* context */) { ++notified_count; });
-
-  bool mutate_done{};
-  int context;
-  storage
-      ->UpdateLinkValue(MakeLinkPath("bar"),
-                        [](fidl::StringPtr* value) { *value = "10"; }, &context)
-      ->Then([&](StoryStorage::Status status) { mutate_done = true; });
-  RunLoopUntil([&] { return mutate_done; });
-  EXPECT_EQ(0, notified_count);
-}
-
-TEST_F(StoryStorageTest, WatchingLink_IgnoresNoopUpdates) {
-  // When we watch a link, we should see changes only for that link.
-  auto storage = CreateStorage("page");
-
-  int notified_count{0};
-  auto cancel =
-      storage->WatchLink(MakeLinkPath("foo"),
-                         [&](const fidl::StringPtr& value,
-                             const void* /* context */) { ++notified_count; });
-
-  bool mutate_done{};
-  int context;
-  storage
-      ->UpdateLinkValue(MakeLinkPath("foo"),
-                        [](fidl::StringPtr* value) { /* do nothing */ },
-                        &context)
-      ->Then([&](StoryStorage::Status status) { mutate_done = true; });
-  RunLoopUntil([&] { return mutate_done; });
-  EXPECT_EQ(0, notified_count);
-}
-
-TEST_F(StoryStorageTest, WatchingLink_SeesUpdates) {
-  // When we make changes to Link values, we should see those changes in our
-  // observation functions. When we cancel the observer, we shouldn't see any
-  // more notifications.
-  auto storage = CreateStorage("page");
-
-  // We'll tell StoryStorage to stop notifying us about "bar" later by using
-  // |bar_cancel|.
-  int notified_count{0};
-  fidl::StringPtr notified_value;
-  const void* notified_context;
-  auto watch_cancel = storage->WatchLink(
-      MakeLinkPath("bar"),
-      [&](const fidl::StringPtr& value, const void* context) {
-        ++notified_count;
-        notified_value = value;
-        notified_context = context;
-      });
-
-  // Change "bar"'s value to "10".
-  bool mutate_done{};
-  int context;
-  storage
-      ->UpdateLinkValue(MakeLinkPath("bar"),
-                        [](fidl::StringPtr* value) { *value = "10"; }, &context)
-      ->Then([&](StoryStorage::Status status) { mutate_done = true; });
-  RunLoopUntil([&] { return mutate_done; });
-  EXPECT_EQ(1, notified_count);
-  EXPECT_EQ("10", notified_value);
-  EXPECT_EQ(&context, notified_context);
-
-  // Change it two more times. We expect to be notified of the first one, but
-  // not the second because we are going to cancel our watcher.
-  storage
-      ->UpdateLinkValue(MakeLinkPath("bar"),
-                        [](fidl::StringPtr* value) { *value = "20"; }, &context)
-      ->Then([&](StoryStorage::Status status) {
-        watch_cancel.call();  // Remove the watcher for bar.
-      });
-
-  mutate_done = false;
-  storage
-      ->UpdateLinkValue(MakeLinkPath("bar"),
-                        [](fidl::StringPtr* value) { *value = "30"; }, &context)
-      ->Then([&](StoryStorage::Status status) { mutate_done = true; });
-  RunLoopUntil([&] { return mutate_done; });
-
-  EXPECT_EQ(2, notified_count);
-  EXPECT_EQ("20", notified_value);
-  EXPECT_EQ(&context, notified_context);
-}
-
-TEST_F(StoryStorageTest, WatchingOtherStorageInstance) {
-  // Observations made on other StoryStorage instances get a special nullptr
-  // context.
-  auto storage = CreateStorage("page");
-
-  auto other_storage = CreateStorage("page");
-
-  int notified_count{0};
-  fidl::StringPtr notified_value;
-  const void* notified_context;
-  auto watch_cancel = other_storage->WatchLink(
-      MakeLinkPath("foo"),
-      [&](const fidl::StringPtr& value, const void* context) {
-        ++notified_count;
-        notified_value = value;
-        notified_context = context;
-        return true;
-      });
-
-  int context;
-  storage->UpdateLinkValue(MakeLinkPath("foo"),
-                           [](fidl::StringPtr* value) { *value = "10"; },
-                           &context);
-
-  RunLoopUntil([&] { return notified_count > 0; });
-  EXPECT_EQ(1, notified_count);
-  EXPECT_EQ("10", notified_value);
-  EXPECT_EQ(nullptr, notified_context);
-}
-
-// Creates an entity with a valid type and data and verifies they are returned
-// as expected.
-TEST_F(StoryStorageTest, CreateAndReadEntity) {
-  auto storage = CreateStorage("page");
-  std::string cookie = "cookie";
-  std::string expected_type = "com.fuchsia.test.type";
-
-  std::string data_string = "test_data";
-  fuchsia::mem::Buffer buffer;
-  FXL_CHECK(fsl::VmoFromString(data_string, &buffer));
-
-  bool created_entity{};
-  storage->SetEntityData(cookie, expected_type, std::move(buffer))
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(status, StoryStorage::Status::OK);
-        created_entity = true;
-      });
-  RunLoopUntil([&] { return created_entity; });
-
-  bool read_entity_type{};
-  storage->GetEntityType(cookie)->Then(
-      [&](StoryStorage::Status status, std::string type) {
-        EXPECT_EQ(type, expected_type);
-        read_entity_type = true;
-      });
-  RunLoopUntil([&] { return read_entity_type; });
-
-  bool read_entity_data{};
-  storage->GetEntityData(cookie, expected_type)
-      ->Then([&](StoryStorage::Status status, fuchsia::mem::BufferPtr buffer) {
-        EXPECT_TRUE(buffer);
-        std::string read_data;
-        EXPECT_TRUE(fsl::StringFromVmo(*buffer, &read_data));
-        EXPECT_EQ(read_data, data_string);
-        read_entity_data = true;
-      });
-  RunLoopUntil([&] { return read_entity_data; });
-}
-
-// Creates an entity with a valid type and data and attempts to get the data of
-// a different type.
-TEST_F(StoryStorageTest, CreateAndReadEntityIncorrectType) {
-  auto storage = CreateStorage("page");
-  std::string cookie = "cookie";
-  std::string expected_type = "com.fuchsia.test.type";
-
-  std::string data_string = "test_data";
-  fuchsia::mem::Buffer buffer;
-  FXL_CHECK(fsl::VmoFromString(data_string, &buffer));
-
-  bool created_entity{};
-  storage->SetEntityData(cookie, expected_type, std::move(buffer))
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(status, StoryStorage::Status::OK);
-        created_entity = true;
-      });
-  RunLoopUntil([&] { return created_entity; });
-
-  bool read_entity_data{};
-  storage->GetEntityData(cookie, expected_type + expected_type)
-      ->Then([&](StoryStorage::Status status, fuchsia::mem::BufferPtr buffer) {
-        EXPECT_EQ(status, StoryStorage::Status::INVALID_ENTITY_TYPE);
-        read_entity_data = true;
-      });
-  RunLoopUntil([&] { return read_entity_data; });
-}
-
-// Creates an entity with a valid type and data and attempts to get the data of
-// a different cookie.
-TEST_F(StoryStorageTest, CreateAndReadEntityIncorrectCookie) {
-  auto storage = CreateStorage("page");
-  std::string cookie = "cookie";
-  std::string expected_type = "com.fuchsia.test.type";
-
-  std::string data_string = "test_data";
-  fuchsia::mem::Buffer buffer;
-  FXL_CHECK(fsl::VmoFromString(data_string, &buffer));
-
-  bool created_entity{};
-  storage->SetEntityData(cookie, expected_type, std::move(buffer))
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(status, StoryStorage::Status::OK);
-        created_entity = true;
-      });
-  RunLoopUntil([&] { return created_entity; });
-
-  bool read_entity_data{};
-  storage->GetEntityData(cookie + cookie, expected_type)
-      ->Then([&](StoryStorage::Status status, fuchsia::mem::BufferPtr buffer) {
-        EXPECT_EQ(status, StoryStorage::Status::INVALID_ENTITY_COOKIE);
-        read_entity_data = true;
-      });
-  RunLoopUntil([&] { return read_entity_data; });
-}
-
-// Attempts to create an entity with an empty type and verifies it fails.
-TEST_F(StoryStorageTest, CreateEntityWithEmptyType) {
-  auto storage = CreateStorage("page");
-  std::string cookie = "cookie";
-  std::string expected_type = "";
-
-  std::string data_string = "test_data";
-  fuchsia::mem::Buffer buffer;
-  FXL_CHECK(fsl::VmoFromString(data_string, &buffer));
-
-  bool created_entity{};
-  storage->SetEntityData(cookie, expected_type, std::move(buffer))
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(status, StoryStorage::Status::INVALID_ENTITY_TYPE);
-        created_entity = true;
-      });
-  RunLoopUntil([&] { return created_entity; });
-}
-
-// Attempts to create an entity with an empty cookie and verifies it fails.
-TEST_F(StoryStorageTest, CreateEntityWithEmptyCookie) {
-  auto storage = CreateStorage("page");
-  std::string cookie = "";
-  std::string expected_type = "com.fuchsia.test.type";
-
-  std::string data_string = "test_data";
-  fuchsia::mem::Buffer buffer;
-  FXL_CHECK(fsl::VmoFromString(data_string, &buffer));
-
-  bool created_entity{};
-  storage->SetEntityData(cookie, expected_type, std::move(buffer))
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(status, StoryStorage::Status::INVALID_ENTITY_COOKIE);
-        created_entity = true;
-      });
-  RunLoopUntil([&] { return created_entity; });
-}
-
-// Creates an entity and performs a second write with a different type, and
-// verifies the second write fails and that the second attempted write doesn't
-// corrupt the data.
-TEST_F(StoryStorageTest, WriteEntityDataWithIncorrectType) {
-  auto storage = CreateStorage("page");
-  std::string cookie = "cookie";
-  std::string expected_type = "com.fuchsia.test.type";
-  std::string incorrect_type = "com.fuchsia.test.incorrect.type";
-
-  std::string data_string = "test_data";
-  fuchsia::mem::Buffer buffer;
-  FXL_CHECK(fsl::VmoFromString(data_string, &buffer));
-
-  bool created_entity{};
-  storage->SetEntityData(cookie, expected_type, std::move(buffer))
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(status, StoryStorage::Status::OK);
-        created_entity = true;
-      });
-  RunLoopUntil([&] { return created_entity; });
-
-  bool wrote_entity{};
-  storage->SetEntityData(cookie, incorrect_type, fuchsia::mem::Buffer())
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(status, StoryStorage::Status::INVALID_ENTITY_TYPE);
-        wrote_entity = true;
-      });
-  RunLoopUntil([&] { return wrote_entity; });
-
-  // Verify that the second write didn't mess up the data or type.
-  bool read_entity_type{};
-  storage->GetEntityType(cookie)->Then(
-      [&](StoryStorage::Status status, std::string type) {
-        EXPECT_EQ(type, expected_type);
-        read_entity_type = true;
-      });
-  RunLoopUntil([&] { return read_entity_type; });
-
-  bool read_entity_data{};
-  storage->GetEntityData(cookie, expected_type)
-      ->Then([&](StoryStorage::Status status, fuchsia::mem::BufferPtr buffer) {
-        EXPECT_TRUE(buffer);
-        std::string read_data;
-        EXPECT_TRUE(fsl::StringFromVmo(*buffer, &read_data));
-        EXPECT_EQ(read_data, data_string);
-        read_entity_data = true;
-      });
-  RunLoopUntil([&] { return read_entity_data; });
-}
-
-// Creates an entity and performs a second write with the same type, and
-// verifies the data is written correctly.
-TEST_F(StoryStorageTest, WriteToEntityTwice) {
-  auto storage = CreateStorage("page");
-  std::string cookie = "cookie";
-  std::string expected_type = "com.fuchsia.test.type";
-
-  std::string data_string = "test_data";
-  fuchsia::mem::Buffer buffer;
-  FXL_CHECK(fsl::VmoFromString(data_string, &buffer));
-
-  std::string second_data_string = "more_test_data";
-  fuchsia::mem::Buffer second_buffer;
-  FXL_CHECK(fsl::VmoFromString(second_data_string, &second_buffer));
-
-  bool created_entity{};
-  storage->SetEntityData(cookie, expected_type, std::move(buffer))
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(status, StoryStorage::Status::OK);
-        created_entity = true;
-      });
-  RunLoopUntil([&] { return created_entity; });
-
-  bool wrote_entity{};
-  storage->SetEntityData(cookie, expected_type, std::move(second_buffer))
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(status, StoryStorage::Status::OK);
-        wrote_entity = true;
-      });
-  RunLoopUntil([&] { return wrote_entity; });
-
-  // Verify that the second write successfully updated the data.
-  bool read_entity_type{};
-  storage->GetEntityType(cookie)->Then(
-      [&](StoryStorage::Status status, std::string type) {
-        EXPECT_EQ(type, expected_type);
-        read_entity_type = true;
-      });
-  RunLoopUntil([&] { return read_entity_type; });
-
-  bool read_entity_data{};
-  storage->GetEntityData(cookie, expected_type)
-      ->Then([&](StoryStorage::Status status, fuchsia::mem::BufferPtr buffer) {
-        EXPECT_TRUE(buffer);
-        std::string read_data;
-        EXPECT_TRUE(fsl::StringFromVmo(*buffer, &read_data));
-        EXPECT_EQ(read_data, second_data_string);
-        read_entity_data = true;
-      });
-  RunLoopUntil([&] { return read_entity_data; });
-}
-
-// Creates an entity with a watcher and verifies that updates to the entity are
-// delivered to the watcher.
-TEST_F(StoryStorageTest, WatchEntityData) {
-  auto storage = CreateStorage("page");
-  std::string expected_cookie = "cookie";
-  std::string expected_type = "com.fuchsia.test.type";
-
-  std::string data_string = "test_data";
-  fuchsia::mem::Buffer buffer;
-  FXL_CHECK(fsl::VmoFromString(data_string, &buffer));
-
-  bool saw_entity_update{};
-  bool saw_entity_update_with_no_data{};
-  auto watcher_impl =
-      EntityWatcherImpl([&](std::unique_ptr<fuchsia::mem::Buffer> value) {
-        // Verify that the first callback is called with no data, since the
-        // entity data has yet to be set.
-        if (!value && !saw_entity_update_with_no_data) {
-          saw_entity_update_with_no_data = true;
-          return;
-        }
-
-        ASSERT_TRUE(value) << "Saw multiple empty entity updates.";
-
-        std::string read_data;
-        EXPECT_TRUE(fsl::StringFromVmo(*value, &read_data));
-        EXPECT_EQ(read_data, data_string);
-
-        saw_entity_update = true;
-      });
-
-  fuchsia::modular::EntityWatcherPtr watcher_ptr;
-  watcher_impl.Connect(watcher_ptr.NewRequest());
-
-  storage->WatchEntity(expected_cookie, expected_type, std::move(watcher_ptr));
-
-  bool created_entity{};
-  storage->SetEntityData(expected_cookie, expected_type, std::move(buffer))
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(status, StoryStorage::Status::OK);
-        created_entity = true;
-      });
-  RunLoopUntil([&] { return created_entity; });
-  RunLoopUntil([&] { return saw_entity_update; });
-  EXPECT_TRUE(saw_entity_update_with_no_data);
-}
-
-// Creates an entity with multiple watchers and verifies that updates to the
-// entity are delivered to all watchers.
-TEST_F(StoryStorageTest, WatchEntityDataMultipleWatchers) {
-  auto storage = CreateStorage("page");
-  std::string expected_cookie = "cookie";
-  std::string expected_type = "com.fuchsia.test.type";
-
-  std::string data_string = "test_data";
-  fuchsia::mem::Buffer buffer;
-  FXL_CHECK(fsl::VmoFromString(data_string, &buffer));
-
-  bool saw_entity_update{};
-  auto watcher_impl =
-      EntityWatcherImpl([&](std::unique_ptr<fuchsia::mem::Buffer> value) {
-        if (!value) {
-          // The first update may not contain any data, so skip it.
-          return;
-        }
-
-        std::string read_data;
-        EXPECT_TRUE(fsl::StringFromVmo(*value, &read_data));
-        EXPECT_EQ(read_data, data_string);
-
-        saw_entity_update = true;
-      });
-
-  fuchsia::modular::EntityWatcherPtr watcher_ptr;
-  watcher_impl.Connect(watcher_ptr.NewRequest());
-  storage->WatchEntity(expected_cookie, expected_type, std::move(watcher_ptr));
-
-  bool saw_entity_update_too{};
-  auto second_watcher_impl =
-      EntityWatcherImpl([&](std::unique_ptr<fuchsia::mem::Buffer> value) {
-        if (!value) {
-          // The first update may not contain any data, so skip it.
-          return;
-        }
-
-        std::string read_data;
-        EXPECT_TRUE(fsl::StringFromVmo(*value, &read_data));
-        EXPECT_EQ(read_data, data_string);
-
-        saw_entity_update_too = true;
-      });
-
-  fuchsia::modular::EntityWatcherPtr second_watcher_ptr;
-  second_watcher_impl.Connect(second_watcher_ptr.NewRequest());
-  storage->WatchEntity(expected_cookie, expected_type,
-                       std::move(second_watcher_ptr));
-
-  bool created_entity{};
-  storage->SetEntityData(expected_cookie, expected_type, std::move(buffer))
-      ->Then([&](StoryStorage::Status status) {
-        EXPECT_EQ(status, StoryStorage::Status::OK);
-        created_entity = true;
-      });
-  RunLoopUntil([&] { return created_entity; });
-  RunLoopUntil([&] { return saw_entity_update && saw_entity_update_too; });
-}
-
-// Creates a name for a given Entity cookie and verifies it is retrieved
-// successfully.
-TEST_F(StoryStorageTest, NameEntity) {
-  auto storage = CreateStorage("page");
-  std::string expected_cookie = "cookie";
-  std::string expected_name = "the best entity";
-
-  storage->SetEntityName(expected_cookie, expected_name);
-
-  bool did_get_cookie{};
-  storage->GetEntityCookieForName(expected_name)
-      ->Then([&](StoryStorage::Status status, const std::string& cookie) {
-        EXPECT_EQ(cookie, expected_cookie);
-        did_get_cookie = true;
-      });
-  RunLoopUntil([&] { return did_get_cookie; });
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/storage/story_storage_xdr.cc b/bin/sessionmgr/storage/story_storage_xdr.cc
deleted file mode 100644
index baed8c6..0000000
--- a/bin/sessionmgr/storage/story_storage_xdr.cc
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/storage/story_storage_xdr.h"
-#include "peridot/lib/module_manifest/module_manifest_xdr.h"
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fsl/vmo/strings.h>
-
-namespace modular {
-
-void XdrLinkPath(XdrContext* const xdr,
-                 fuchsia::modular::LinkPath* const data) {
-  xdr->Field("module_path", &data->module_path);
-  xdr->Field("link_name", &data->link_name);
-}
-
-void XdrModuleParameterMapEntry(
-    XdrContext* const xdr,
-    fuchsia::modular::ModuleParameterMapEntry* const data) {
-  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
-  // the field names in FIDL were changed.
-  xdr->Field("key", &data->name);
-  xdr->Field("link_path", &data->link_path, XdrLinkPath);
-}
-
-void XdrModuleParameterMap(XdrContext* const xdr,
-                           fuchsia::modular::ModuleParameterMap* const data) {
-  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
-  // the field names in FIDL were changed.
-  xdr->Field("key_to_link_map", &data->entries, XdrModuleParameterMapEntry);
-}
-
-void XdrSurfaceRelation(XdrContext* const xdr,
-                        fuchsia::modular::SurfaceRelation* const data) {
-  xdr->Field("arrangement", &data->arrangement);
-  xdr->Field("dependency", &data->dependency);
-  xdr->Field("emphasis", &data->emphasis);
-}
-
-void XdrIntentParameterData(XdrContext* const xdr,
-                            fuchsia::modular::IntentParameterData* const data) {
-  static constexpr char kTag[] = "tag";
-  static constexpr char kEntityReference[] = "entity_reference";
-  static constexpr char kJson[] = "json";
-  static constexpr char kEntityType[] = "entity_type";
-
-  switch (xdr->op()) {
-    case XdrOp::FROM_JSON: {
-      std::string tag;
-      xdr->Field(kTag, &tag);
-
-      if (tag == kEntityReference) {
-        fidl::StringPtr value;
-        xdr->Field(kEntityReference, &value);
-        data->set_entity_reference(std::move(value));
-      } else if (tag == kJson) {
-        fidl::StringPtr value;
-        xdr->Field(kJson, &value);
-        fsl::SizedVmo vmo;
-        FXL_CHECK(fsl::VmoFromString(*value, &vmo));
-        data->set_json(std::move(vmo).ToTransport());
-      } else if (tag == kEntityType) {
-        ::std::vector<::std::string> value;
-        xdr->Field(kEntityType, &value);
-        data->set_entity_type(std::move(value));
-      } else {
-        FXL_LOG(ERROR) << "XdrIntentParameterData FROM_JSON unknown tag: "
-                       << tag;
-      }
-      break;
-    }
-
-    case XdrOp::TO_JSON: {
-      std::string tag;
-
-      switch (data->Which()) {
-        case fuchsia::modular::IntentParameterData::Tag::kEntityReference: {
-          tag = kEntityReference;
-          fidl::StringPtr value = data->entity_reference();
-          xdr->Field(kEntityReference, &value);
-          break;
-        }
-        case fuchsia::modular::IntentParameterData::Tag::kJson: {
-          tag = kJson;
-          std::string json_string;
-          FXL_CHECK(fsl::StringFromVmo(data->json(), &json_string));
-          fidl::StringPtr value = json_string;
-          xdr->Field(kJson, &value);
-          break;
-        }
-        case fuchsia::modular::IntentParameterData::Tag::kEntityType: {
-          tag = kEntityType;
-          std::vector<std::string> value = data->entity_type();
-          xdr->Field(kEntityType, &value);
-          break;
-        }
-        case fuchsia::modular::IntentParameterData::Tag::Invalid:
-          FXL_LOG(ERROR) << "XdrIntentParameterData TO_JSON unknown tag: "
-                         << static_cast<int>(data->Which());
-          break;
-      }
-
-      xdr->Field(kTag, &tag);
-      break;
-    }
-  }
-}
-
-void XdrIntentParameter(XdrContext* const xdr,
-                        fuchsia::modular::IntentParameter* const data) {
-  xdr->Field("name", &data->name);
-  xdr->Field("data", &data->data, XdrIntentParameterData);
-}
-
-void XdrIntent(XdrContext* const xdr, fuchsia::modular::Intent* const data) {
-  xdr->Field("action_name", &data->action);
-  xdr->Field("action_handler", &data->handler);
-  xdr->Field("parameters", &data->parameters, XdrIntentParameter);
-}
-
-void XdrModuleData_v1(XdrContext* const xdr,
-                      fuchsia::modular::ModuleData* const data) {
-  xdr->Field("url", &data->module_url);
-  xdr->Field("module_path", &data->module_path);
-  xdr->Field("module_source", &data->module_source);
-  xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
-  xdr->Field("module_stopped", &data->module_deleted);
-  xdr->Field("intent", &data->intent, XdrIntent);
-
-  // In previous versions we did not have these fields.
-  data->parameter_map.entries.resize(0);
-}
-
-void XdrModuleData_v2(XdrContext* const xdr,
-                      fuchsia::modular::ModuleData* const data) {
-  xdr->Field("url", &data->module_url);
-  xdr->Field("module_path", &data->module_path);
-  xdr->Field("module_source", &data->module_source);
-  xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
-  xdr->Field("module_stopped", &data->module_deleted);
-  xdr->Field("intent", &data->intent, XdrIntent);
-  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
-  // the field name in FIDL was changed.
-  xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
-}
-
-void XdrModuleData_v3(XdrContext* const xdr,
-                      fuchsia::modular::ModuleData* const data) {
-  xdr->Field("url", &data->module_url);
-  xdr->Field("module_path", &data->module_path);
-  xdr->Field("module_source", &data->module_source);
-  xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
-  xdr->Field("module_stopped", &data->module_deleted);
-  xdr->Field("intent", &data->intent, XdrIntent);
-  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
-  // the field name in FIDL was changed.
-  xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
-}
-
-void XdrModuleData_v4(XdrContext* const xdr,
-                      fuchsia::modular::ModuleData* const data) {
-  if (!xdr->Version(4)) {
-    return;
-  }
-  xdr->Field("url", &data->module_url);
-  xdr->Field("module_path", &data->module_path);
-  xdr->Field("module_source", &data->module_source);
-  xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
-  xdr->Field("module_stopped", &data->module_deleted);
-  xdr->Field("intent", &data->intent, XdrIntent);
-  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
-  // the field name in FIDL was changed.
-  xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
-}
-
-void XdrModuleData_v5(XdrContext* const xdr,
-                      fuchsia::modular::ModuleData* const data) {
-  if (!xdr->Version(5)) {
-    return;
-  }
-  xdr->Field("url", &data->module_url);
-  xdr->Field("module_path", &data->module_path);
-  xdr->Field("module_source", &data->module_source);
-  xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
-  xdr->Field("module_deleted", &data->module_deleted);
-  xdr->Field("intent", &data->intent, XdrIntent);
-  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
-  // the field name in FIDL was changed.
-  xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
-}
-
-void XdrModuleData_v6(XdrContext* const xdr,
-                      fuchsia::modular::ModuleData* const data) {
-  if (!xdr->Version(6)) {
-    return;
-  }
-  xdr->Field("url", &data->module_url);
-  xdr->Field("module_path", &data->module_path);
-  xdr->Field("module_source", &data->module_source);
-  xdr->Field("surface_relation", &data->surface_relation, XdrSurfaceRelation);
-  xdr->Field("module_deleted", &data->module_deleted);
-  xdr->Field("intent", &data->intent, XdrIntent);
-  // NOTE: the JSON field naming doesn't match the FIDL struct naming because
-  // the field name in FIDL was changed.
-  xdr->Field("chain_data", &data->parameter_map, XdrModuleParameterMap);
-  xdr->Field("is_embedded", &data->is_embedded);
-}
-
-XdrFilterType<fuchsia::modular::ModuleData> XdrModuleData[] = {
-    XdrModuleData_v6, XdrModuleData_v5, XdrModuleData_v4, XdrModuleData_v3,
-    XdrModuleData_v2, XdrModuleData_v1, nullptr,
-};
-
-}  // namespace modular
diff --git a/bin/sessionmgr/storage/story_storage_xdr.h b/bin/sessionmgr/storage/story_storage_xdr.h
deleted file mode 100644
index 27fc99a..0000000
--- a/bin/sessionmgr/storage/story_storage_xdr.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORAGE_STORY_STORAGE_XDR_H_
-#define PERIDOT_BIN_SESSIONMGR_STORAGE_STORY_STORAGE_XDR_H_
-
-#include <fuchsia/modular/internal/cpp/fidl.h>
-
-#include "peridot/lib/fidl/json_xdr.h"
-
-namespace modular {
-
-extern XdrFilterType<fuchsia::modular::ModuleData> XdrModuleData[];
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORAGE_STORY_STORAGE_XDR_H_
diff --git a/bin/sessionmgr/story/BUILD.gn b/bin/sessionmgr/story/BUILD.gn
deleted file mode 100644
index ac799f4..0000000
--- a/bin/sessionmgr/story/BUILD.gn
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-import("//peridot/build/tests_package.gni")
-
-source_set("system") {
-  sources = [
-    "system.cc",
-    "system.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-  ]
-}
diff --git a/bin/sessionmgr/story/model/BUILD.gn b/bin/sessionmgr/story/model/BUILD.gn
deleted file mode 100644
index 101721f..0000000
--- a/bin/sessionmgr/story/model/BUILD.gn
+++ /dev/null
@@ -1,177 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/tests_package.gni")
-
-# Convenience dep for most Systems.
-group("model") {
-  public_deps = [
-    ":story_mutator",
-    ":story_observer",
-    "//peridot/public/fidl/fuchsia.modular.storymodel",
-  ]
-}
-
-hermetic_tests_package("story_model_unittests") {
-  deps = [
-    ":apply_mutations_unittest",
-    ":story_model_owner_unittest",
-    ":ledger_story_model_storage_unittest",
-  ]
-}
-
-source_set("story_observer") {
-  sources = [
-    "story_observer.h",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular.storymodel",
-  ]
-}
-
-source_set("story_mutator") {
-  sources = [
-    "story_mutator.cc",
-    "story_mutator.h",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular.storymodel",
-  ]
-}
-
-source_set("story_model_storage") {
-  sources = [
-    "story_model_storage.cc",
-    "story_model_storage.h",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular.storymodel",
-  ]
-}
-
-source_set("apply_mutations") {
-  sources = [
-    "apply_mutations.cc",
-    "apply_mutations.h",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular.storymodel",
-    "//peridot/public/lib/fostr/fidl/fuchsia.modular.storymodel",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-executable("apply_mutations_unittest") {
-  testonly = true
-
-  sources = [
-    "apply_mutations_unittest.cc",
-  ]
-
-  deps = [
-    ":apply_mutations",
-    "//third_party/googletest:gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("noop_story_model_storage") {
-  sources = [
-    "noop_story_model_storage.cc",
-    "noop_story_model_storage.h",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular.storymodel",
-  ]
-
-  deps = [
-    ":story_model_storage",
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-source_set("ledger_story_model_storage") {
-  sources = [
-    "ledger_story_model_storage.cc",
-    "ledger_story_model_storage.h",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular.storymodel",
-  ]
-
-  deps = [
-    ":apply_mutations",
-    ":story_model_storage",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/lib/ledger_client:promise",
-    "//peridot/public/fidl/fuchsia.ledger",
-  ]
-}
-
-executable("ledger_story_model_storage_unittest") {
-  testonly = true
-
-  sources = [
-    "ledger_story_model_storage_unittest.cc",
-  ]
-
-  deps = [
-    ":apply_mutations",
-    ":ledger_story_model_storage",
-    "testing",
-    "//garnet/public/lib/async_promise",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/lib/testing:test_with_ledger",
-    "//third_party/googletest:gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("story_model_owner") {
-  sources = [
-    "story_model_owner.cc",
-    "story_model_owner.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/async_promise",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular.storymodel",
-  ]
-
-  deps = [
-    ":apply_mutations",
-    ":story_model_storage",
-    ":story_mutator",
-    ":story_observer",
-  ]
-}
-
-executable("story_model_owner_unittest") {
-  testonly = true
-
-  sources = [
-    "story_model_owner_unittest.cc",
-  ]
-
-  deps = [
-    ":story_model_owner",
-    ":story_model_storage",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/sessionmgr/story/model/README.md b/bin/sessionmgr/story/model/README.md
deleted file mode 100644
index 72b7cd6..0000000
--- a/bin/sessionmgr/story/model/README.md
+++ /dev/null
@@ -1,103 +0,0 @@
-### StoryModel
-
-The `StoryModel` FIDL table is used to represent the state of a story.
-`sessionmgr` keeps a separate `StoryModel` in memory for each running story,
-and also persists changes to it onto storage.  Mutations to `StoryModel` are
-done using the `StoryMutator` interface and changes from these mutations
-are notified to registered observers (using the `StoryObserver`
-interface).
-
-This directory defines classes that define the control flow for mutating a
-`StoryModel` FIDL table.
-
-The following interfaces are defined:
-
-* `StoryMutator`: Allows clients to issue a series of `StoryModelMutation`
-  structs that describe mutations to a `StoryModel`.
-* `StoryObserver`: Used to ready `StoryModel` and observe changes to it.
-  Changes to `StoryModel` may happen through `StoryMutator` or, in the
-  case of a distributed storage implementation such as Ledger, from sync'ing
-  with peers.
-interface. Allows clients to read the current `StoryModel` state, and register
-for updates when the `StoryModel` changes.
-
-Both of the above are abstract base classes to aid in testing: clients that
-wish to mutate and/or observe a `StoryModel` will accept a `StoryMutator`
-or `StoryObserver` as a constructor argument.  Making them abstract allows
-injection of test implementations that do not require the full machinery
-introduced by `StoryModelOwner`.
-
-#### `StoryModelOwner` class
-
-`StoryModelOwner` is has its own implementations of `StoryMutator` and
-`StoryObserver`, and coordinates the flow of data from
-`StoryMutators` through a `StoryModelStorage`, applies those changes
-to a `StoryModel` and flows this new model to `StoryObserver` instances.
-It acts as a factory for its own implementations of `StoryMutators` and
-`StoryObservers`.
-
-#### `StoryModelStorage` interface
-
-Supplied to `StoryModelOwner` at the time of its creation, a
-`StoryModelStorage` is responsible for consuming mutation commands and
-updating its persistent storage layer by applying a set of mutation commands,
-as well as notifying of mutations that have been applied. A request to mutate
-does not necessary result in those exact mutations being observed (in the case
-of conflict resolution), nor do observed mutations imply a request was made (in
-the case of a `StoryModel` backed by distributed storage).
-
-A "no-op" StoryModelStorage (one that does not result in any disk-backed
-or other durable storage) would immediately notify of any incoming mutations
-without applying them anywhere. In this case the `StoryModel` would be resident
-in memory only.
-
-#### Flow of Control
-
-Mutation commands flow from anything that has a `StoryMutator` through a
-`StoryModelOwner`, `StoryModelStorage` and are translated into new
-`StoryModels`. From that point forward, observers see the new `StoryModel`
-values.
-
-```
-[some system] -> StoryMutator   ->  StoryModelOwner         |  commands
-                                                  |              |  "
-                                       StoryModelStorage    |  "
-                                                  |              |  "
-[other system] <- StoryObserver <-  StoryModelOwner         $  model
-```
-
-### Example
-
-The constructor for your average System that both mutates and observes a
-`StoryModel` would look like:
-```
-class Foo : public System {
- public:
-  Foo(std::unique_ptr<StoryMutator> mutator,
-      std::unique_ptr<StoryObserver> observer, ...);
-};
-```
-
-In production, we will create this by leveraging the `StoryModelOwner` to
-create those dependencies:
-
-```
-// assume StoryModelOwner has already been defined.
-auto foo_system = std::make_unique<Foo>(owner->NewMutator(), owner->NewObserver(), ...);
-```
-
-For testing, we leverage test versions of both:
-```
-auto test_mutator = std::make_unique<TestStoryMutator>();
-auto test_observer = std::make_unique<TestStoryObserver>();
-
-// Retain pointers to both |test_mutator| and |test_observer| so we can trigger
-// behavior and validate side-effects.
-auto mutator_ptr = test_mutator.get();
-auto observer_ptr = test_observer.get();
-auto foo_system = std::make_unique<Foo>(std::move(test_mutator), std::move(test_observer));
-
-observer_ptr->NotifyOfModel(new_model);  // Push a new model to observers!
-// |foo_system| should have generated new mutations as a side-effect.
-EXPECT_TRUE(3, mutator_ptr->GetNumCommandsIssued());
-```
\ No newline at end of file
diff --git a/bin/sessionmgr/story/model/apply_mutations.cc b/bin/sessionmgr/story/model/apply_mutations.cc
deleted file mode 100644
index d0308ee..0000000
--- a/bin/sessionmgr/story/model/apply_mutations.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/fxl/logging.h>
-
-#include "peridot/bin/sessionmgr/story/model/apply_mutations.h"
-
-#include "lib/fostr/fidl/fuchsia/modular/storymodel/formatting.h"
-
-using fuchsia::modular::StoryVisibilityState;
-using fuchsia::modular::StoryState;
-using fuchsia::modular::storymodel::StoryModel;
-using fuchsia::modular::storymodel::StoryModelMutation;
-
-namespace modular {
-
-namespace {
-
-void ApplySetVisibilityState(const StoryVisibilityState visibility_state, StoryModel* story_model) {
-  story_model->set_visibility_state(visibility_state);
-}
-
-void ApplySetRuntimeState(const StoryState story_state, StoryModel* story_model) {
-  story_model->set_runtime_state(story_state);
-}
-
-}  // namespace
-
-StoryModel ApplyMutations(const StoryModel& current_model,
-                          const std::vector<StoryModelMutation>& commands) {
-  StoryModel new_model;
-  fidl::Clone(current_model, &new_model);
-
-  for (const auto& command : commands) {
-    switch (command.Which()) {
-      case StoryModelMutation::Tag::kSetVisibilityState:
-        ApplySetVisibilityState(command.set_visibility_state(), &new_model);
-        break;
-      case StoryModelMutation::Tag::kSetRuntimeState:
-        ApplySetRuntimeState(command.set_runtime_state(), &new_model);
-        break;
-      case StoryModelMutation::Tag::Invalid:
-        FXL_LOG(FATAL) << "Encountered invalid StoryModelMutation: " << command;
-    }
-  }
-
-  return new_model;
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story/model/apply_mutations.h b/bin/sessionmgr/story/model/apply_mutations.h
deleted file mode 100644
index 230392a..0000000
--- a/bin/sessionmgr/story/model/apply_mutations.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_MODEL_APPLY_MUTATIONS_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_MODEL_APPLY_MUTATIONS_H_
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-
-namespace modular {
-
-// Returns a new StoryModel which is the result of applying |commands| to
-// |current_model|.
-fuchsia::modular::storymodel::StoryModel ApplyMutations(
-    const fuchsia::modular::storymodel::StoryModel& current_model,
-    const std::vector<fuchsia::modular::storymodel::StoryModelMutation>&
-        commands);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_MODEL_APPLY_MUTATIONS_H_
diff --git a/bin/sessionmgr/story/model/apply_mutations_unittest.cc b/bin/sessionmgr/story/model/apply_mutations_unittest.cc
deleted file mode 100644
index fc4ba17..0000000
--- a/bin/sessionmgr/story/model/apply_mutations_unittest.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-#include <lib/fit/bridge.h>
-#include <lib/fit/function.h>
-#include <lib/fit/single_threaded_executor.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/sessionmgr/story/model/apply_mutations.h"
-
-using fuchsia::modular::StoryState;
-using fuchsia::modular::StoryVisibilityState;
-using fuchsia::modular::storymodel::StoryModel;
-using fuchsia::modular::storymodel::StoryModelMutation;
-
-namespace modular {
-namespace {
-
-// Test a single StoryModelMutation.set_runtimes_state command to change
-// StoryModel.runtime_state.
-TEST(ApplyMutationsTest, set_runtime_state) {
-  StoryModel before;
-  *before.mutable_runtime_state() = StoryState::STOPPED;
-
-  std::vector<StoryModelMutation> commands(1);
-  commands[0].set_set_runtime_state(StoryState::RUNNING);
-  auto result = ApplyMutations(before, commands);
-  EXPECT_EQ(StoryState::RUNNING, *result.runtime_state());
-}
-
-// Test a single StoryModelMutation.set_visibility_state command to change
-// StoryModel.visibility_state.
-TEST(ApplyMutationsTest, set_visibility_state) {
-  StoryModel before;
-  *before.mutable_visibility_state() = StoryVisibilityState::DEFAULT;
-
-  std::vector<StoryModelMutation> commands(1);
-  commands[0].set_set_visibility_state(StoryVisibilityState::IMMERSIVE);
-  auto result = ApplyMutations(before, commands);
-  EXPECT_EQ(StoryVisibilityState::IMMERSIVE, *result.visibility_state());
-}
-
-// Test two StoryModelMutation.set_visibility_state commands to change
-// StoryModel.visibility_state to one value and back. Tests that multiple
-// commands in a list are applied in order.
-TEST(ApplyMutationsTest,
-     MultipleMutations_AppliedInOrder_set_visibility_state) {
-  StoryModel before;
-
-  std::vector<StoryModelMutation> commands(2);
-  commands[0].set_set_visibility_state(StoryVisibilityState::IMMERSIVE);
-  commands[1].set_set_visibility_state(StoryVisibilityState::DEFAULT);
-  auto result = ApplyMutations(before, commands);
-  EXPECT_EQ(StoryVisibilityState::DEFAULT, *result.visibility_state());
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/story/model/ledger_story_model_storage.cc b/bin/sessionmgr/story/model/ledger_story_model_storage.cc
deleted file mode 100644
index 25e3135..0000000
--- a/bin/sessionmgr/story/model/ledger_story_model_storage.cc
+++ /dev/null
@@ -1,411 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story/model/ledger_story_model_storage.h"
-
-#include <lib/fit/bridge.h>
-#include <lib/fit/promise.h>
-#include <vector>
-#include <string>
-
-#include "lib/fidl/cpp/object_coding.h"  // for EncodeObject()/DecodeObject()
-#include "lib/fsl/vmo/vector.h"
-#include "lib/fxl/logging.h"
-#include "peridot/bin/sessionmgr/story/model/apply_mutations.h"
-#include "peridot/lib/ledger_client/promise.h"  // for fit::promise<> wrappers
-
-using fuchsia::modular::storymodel::StoryModel;
-using fuchsia::modular::storymodel::StoryModelMutation;
-
-namespace modular {
-
-namespace {
-// Synopsis of Ledger page structure:
-//
-// storymodel/                        - base prefix for all data for this story
-//   device/<device id>               - key for device data for <device id>
-//   shared/                          - prefix for data shared across devices
-
-const char kStoryModelKeyPrefix[] = "storymodel/";
-const char kDeviceKeyPrefix[] = "storymodel/device/";
-// const char kSharedKeyPrefix[] = "shared/";
-
-std::string MakeDeviceKey(const std::string& device_id) {
-  return kDeviceKeyPrefix + device_id;
-}
-}  // namespace
-
-namespace {
-// Encodes a FIDL table into a byte representation safe for persisting to
-// storage.
-template <class T>
-std::vector<uint8_t> EncodeForStorage(T* table) {
-  std::vector<uint8_t> encoded;
-  // This can only fail if |table| contains handles. StoryModel and its fields
-  // do not.
-  FXL_CHECK(fidl::EncodeObject(table, &encoded, nullptr /* error_msg_out */) ==
-            ZX_OK);
-  return encoded;
-}
-
-// Decodes bytes encoded by EncodeForStorage() into their corresponding FIDL
-// table.
-template <class T>
-void DecodeFromStorage(std::vector<uint8_t> encoded, T* table) {
-  // DecodeObject() takes a non-const pointer, even though it doesn't
-  // modify the data.
-  FXL_CHECK(fidl::DecodeObject(encoded.data(), encoded.size(), table,
-                               nullptr /* error_msg_out */) == ZX_OK);
-}
-}  // namespace
-
-LedgerStoryModelStorage::LedgerStoryModelStorage(
-    LedgerClient* const ledger_client, fuchsia::ledger::PageId page_id,
-    std::string device_id)
-    : PageClient("LedgerStoryModelStorage", ledger_client, std::move(page_id),
-                 kStoryModelKeyPrefix),
-      device_id_(std::move(device_id)) {}
-
-LedgerStoryModelStorage::~LedgerStoryModelStorage() = default;
-
-// Helper functions to support OnPageChange() and OnPageDelete().
-namespace {
-// Appends to |commands| StoryModelMutation objects that, when applied to a
-// StoryModel, reflect the device state in |device_state_bytes|.
-void GenerateObservedMutationsForDeviceState(
-    std::vector<uint8_t> device_state_bytes,
-    std::vector<StoryModelMutation>* commands) {
-  StoryModel model;
-  DecodeFromStorage(std::move(device_state_bytes), &model);
-
-  if (model.has_runtime_state()) {
-    commands->resize(commands->size() + 1);
-    commands->back().set_set_runtime_state(*model.runtime_state());
-  }
-  if (model.has_visibility_state()) {
-    commands->resize(commands->size() + 1);
-    commands->back().set_set_visibility_state(*model.visibility_state());
-  }
-}
-
-void GenerateObservedMutationsForDeviceState(
-    const fuchsia::mem::Buffer& buffer,
-    std::vector<StoryModelMutation>* commands) {
-  std::vector<uint8_t> bytes;
-  FXL_CHECK(fsl::VectorFromVmo(buffer, &bytes));
-  GenerateObservedMutationsForDeviceState(std::move(bytes), commands);
-}
-}  // namespace
-
-void LedgerStoryModelStorage::OnChange(
-    fuchsia::ledger::PageChange page_change,
-    fuchsia::ledger::ResultState result_state, OnChangeCallback callback) {
-  switch (result_state) {
-    case fuchsia::ledger::ResultState::COMPLETED:
-      ProcessCompletePageChange(std::move(page_change));
-      break;
-    case fuchsia::ledger::ResultState::PARTIAL_STARTED:
-      partial_page_change_ = fuchsia::ledger::PageChange();
-      // Continue to merging of values with |partial_page_change_|.
-    case fuchsia::ledger::ResultState::PARTIAL_CONTINUED:
-    case fuchsia::ledger::ResultState::PARTIAL_COMPLETED:
-      // Merge the entries in |page_change| with |partial_page_change_|.
-      partial_page_change_.changed_entries.insert(
-          partial_page_change_.changed_entries.end(),
-          std::make_move_iterator(page_change.changed_entries.begin()),
-          std::make_move_iterator(page_change.changed_entries.end()));
-      partial_page_change_.deleted_keys.insert(
-          partial_page_change_.deleted_keys.end(),
-          std::make_move_iterator(page_change.deleted_keys.begin()),
-          std::make_move_iterator(page_change.deleted_keys.end()));
-
-      if (result_state == fuchsia::ledger::ResultState::PARTIAL_COMPLETED) {
-        ProcessCompletePageChange(std::move(partial_page_change_));
-      }
-  }
-
-  callback(nullptr /* snapshot request */);
-}
-
-void LedgerStoryModelStorage::ProcessCompletePageChange(
-    fuchsia::ledger::PageChange page_change) {
-  std::vector<StoryModelMutation> commands;
-
-  for (auto& entry : page_change.changed_entries) {
-    auto key = to_string(entry.key);
-    if (key == MakeDeviceKey(device_id_)) {
-      FXL_CHECK(entry.value)
-          << key << ": This key should never be deleted. Something is wrong.";
-      // Read the value and generate equivalent StoryModelMutation commands.
-      GenerateObservedMutationsForDeviceState(std::move(*entry.value),
-                                              &commands);
-    } else if (key.find(kDeviceKeyPrefix) == 0) {
-      // This is device data from another device!
-      // TODO(thatguy): Store it in the local StoryModel when we care about
-      // observing these data.
-    } else {
-      FXL_LOG(FATAL) << "LedgerStoryModelStorage::OnPageChange(): key " << key
-                     << " unexpected in the Ledger.";
-    }
-  }
-
-  Observe(std::move(commands));
-
-  // Don't do anything with deleted keys at this time.
-}
-
-void LedgerStoryModelStorage::OnPageConflict(Conflict* conflict) {
-  // The default merge policy in LedgerClient is LEFT, meaning whatever value
-  // was in the left branch for each key is taken.
-  //
-  // TODO(MF-157): LedgerClient breaks a single merge conflict for multiple
-  // keys into on OnPageConflict() call per key. For a more advanced conflict
-  // resolution policy, it is likely necessary to look at the conflict in full.
-}
-
-// Helper functions to support task construction in Execute().
-namespace {
-// Partitions |commands| into two vectors:
-//
-//   1) Those that mutate state that is device-local (ie, runtime state of the
-//   story)
-//
-//   2) Those that mutate state that is shared among all devices (ie, the set
-//   of mods)
-struct PartitionedCommands {
-  // These commands represent mutations that apply only to device-local state.
-  std::vector<StoryModelMutation> device_commands;
-  // And these apply to shared (cross-device) state.
-  std::vector<StoryModelMutation> shared_commands;
-};
-PartitionedCommands PartitionCommandsForDeviceAndShared(
-    std::vector<StoryModelMutation> commands) {
-  PartitionedCommands partitioned_commands;
-
-  for (auto& i : commands) {
-    switch (i.Which()) {
-      case StoryModelMutation::Tag::kSetRuntimeState:
-      case StoryModelMutation::Tag::kSetVisibilityState:
-        partitioned_commands.device_commands.push_back(std::move(i));
-        break;
-      case StoryModelMutation::Tag::Invalid:
-        FXL_LOG(FATAL) << "Encountered invalid StoryModelMutation.";
-        break;
-    }
-  }
-
-  return partitioned_commands;
-}
-
-// TODO(thatguy): Move these functions to ledger_client/promise.h
-
-// Reads the value in the given key and returns an object of type T. If |key|
-// does not have a value, returns a default-constructed T.
-template <class T>
-fit::promise<T> ReadObjectFromKey(fuchsia::ledger::PageSnapshot* snapshot,
-                                  const std::string& key) {
-  return PageSnapshotPromise::GetInline(snapshot, key)
-      .and_then([](const std::unique_ptr<std::vector<uint8_t>>& value) {
-        if (!value) {
-          return fit::ok(T());
-        }
-
-        T object;
-        DecodeFromStorage(std::move(*value), &object);
-        return fit::ok(std::move(object));
-      });
-}
-
-// Writes |value| to |key|.
-template <class T>
-fit::promise<> WriteObjectToKey(fuchsia::ledger::Page* page,
-                                const std::string& key, T value) {
-  auto bytes = EncodeForStorage(&value);
-  // TODO(thatguy): Calculate if this value is too big for a FIDL message.  If
-  // so, fall back on Page.CreateReferenceFromBuffer() and Page.PutReference().
-  return PagePromise::Put(page, key, std::move(bytes));
-}
-
-// Reads the latest device-local state, applies |commands| to it, and then
-// writes it back to the Ledger.
-//
-// Store all the device-local state under a single key, and re-use
-// a sparsely populated StoryModel table as our data structure for simplicity.
-//
-// The returned promise is resolved once calls to mutate the Page have
-// returned.
-fit::promise<> UpdateDeviceState(fuchsia::ledger::Page* page,
-                                 fuchsia::ledger::PageSnapshot* snapshot,
-                                 const std::string& device_id,
-                                 std::vector<StoryModelMutation> commands) {
-  // Task synopsis:
-  //
-  // 1) Read the current contents at |key| from the page snapshot.
-  // 2) Apply |commands| to those contents.
-  // 3) Write the new contents back to |key|.
-  auto key = MakeDeviceKey(device_id);
-  return ReadObjectFromKey<StoryModel>(snapshot, key)
-      .and_then([page, key, commands = std::move(commands)](
-                    const StoryModel& current_value) {
-        auto new_value = ApplyMutations(current_value, commands);
-        return WriteObjectToKey(page, key, std::move(new_value));
-      });
-}
-
-// Updates the shared state section of the ledger based on |commands|.
-//
-// The returned promise is resolved once calls to mutate the Page have
-// returned.
-fit::promise<> UpdateSharedState(fuchsia::ledger::Page* page,
-                                 fuchsia::ledger::PageSnapshot* snapshot,
-                                 std::vector<StoryModelMutation> commands) {
-  // There is no shared state yet.
-  return fit::make_promise([] { return fit::ok(); });
-}
-}  // namespace
-
-fit::promise<> LedgerStoryModelStorage::Load() {
-  // Synopsis of Load() task:
-  //
-  // 1) Read from device-local state and build commands.
-  // 2) Scan the shared state and build commands.
-  // 3) Wait for the above tasks and then issue all of the commands to
-  // Observe().
-  //
-  // NOTE: currently we don't have any shared state, so we skip (2).
-
-  struct State {
-    fuchsia::ledger::PageSnapshotPtr page_snapshot;
-    std::vector<StoryModelMutation> commands;
-  };
-  auto state = std::make_unique<State>();
-
-  return fit::make_promise([this, state = state.get()](fit::context& c) {
-           // Get a snapshot. Join on the result later and take advantage of
-           // pipelining instead.
-           auto get_snapshot_promise = PagePromise::GetSnapshot(
-               page(), state->page_snapshot.NewRequest());
-
-           auto key = MakeDeviceKey(device_id_);
-           auto read_promise =
-               PageSnapshotPromise::GetInline(state->page_snapshot.get(), key)
-                   .and_then([state](
-                                 const std::unique_ptr<std::vector<uint8_t>>&
-                                     device_state_bytes) {
-                     if (device_state_bytes) {
-                       GenerateObservedMutationsForDeviceState(
-                           std::move(*device_state_bytes), &state->commands);
-                     }
-                     return fit::ok();
-                   });
-
-           return fit::join_promises(std::move(get_snapshot_promise),
-                                     std::move(read_promise));
-         })
-      .and_then([this, state = state.get()](
-                    std::tuple<fit::result<>, fit::result<>> results)
-                    -> fit::result<> {
-        auto [get_snapshot_result, read_result] = results;
-        if (get_snapshot_result.is_error() || read_result.is_error()) {
-          return fit::error();
-        }
-
-        Observe(std::move(state->commands));
-        return fit::ok();
-      })
-      // Keep |state| alive until execution reaches here.
-      .inspect([state = std::move(state)](fit::result<>& r) {})
-      .wrap_with(scope_);
-}
-
-fit::promise<> LedgerStoryModelStorage::Flush() {
-  // The returned promise will block until all pending mutation opertaions have
-  // resolved. These pending operations are also wrapped with |sequencer_| (in
-  // Execute()), which applies this sequential behavior to promises it wraps.
-  return fit::make_promise([] { return fit::ok(); }).wrap_with(sequencer_);
-}
-
-fit::promise<> LedgerStoryModelStorage::Execute(
-    std::vector<StoryModelMutation> commands) {
-  // Synopsis of the Execute() task:
-  //
-  // 1) Start a Page transaction.
-  // 2) Get a PageSnapshot.
-  // 3) Partition |commands| into those affecting per-device state and shared
-  // state and then update each partition in storage in parallel.
-  // 4) Commit() if successful, and Rollback() if not.
-  //
-  // To take maximum advantage of FIDL pipelining and concurrency, do (1), (2),
-  // and (3). Before (4), join on all the results and fail if
-  // any of 1-3 failed.
-
-  // Some state must outlast several of the fit::promise callbacks below.
-  // Capture it in a struct on the heap, and then move ownership to a point
-  // late enough in our promise by calling
-  // fit::promise.inspect().
-  struct State {
-    fuchsia::ledger::PageSnapshotPtr page_snapshot;
-  };
-  auto state = std::make_unique<State>();
-
-  return fit::make_promise(
-             [this, state = state.get(),
-              commands = std::move(commands)]() mutable -> fit::promise<> {
-               // Start the transaction, but don't block on its result. Rather,
-               // join it later to ensure that a failed StartTransaction()
-               // triggers a failure of the overall task.
-               auto start_transaction_promise =
-                   PagePromise::StartTransaction(page());
-
-               // Get a snapshot. As with StartTransaction(), join on the
-               // result later and take advantage of pipelining instead.
-               auto get_snapshot_promise = PagePromise::GetSnapshot(
-                   page(), state->page_snapshot.NewRequest());
-
-               // Partition up the commands into those that affect device-only
-               // state, and those that affect shared (among all devices) state.
-               auto [device_commands, shared_commands] =
-                   PartitionCommandsForDeviceAndShared(std::move(commands));
-
-               // Dispatch the update commands.
-               auto update_device_state_promise =
-                   UpdateDeviceState(page(), state->page_snapshot.get(),
-                                     device_id_, std::move(device_commands));
-               auto update_shared_state_promise =
-                   UpdateSharedState(page(), state->page_snapshot.get(),
-                                     std::move(shared_commands));
-
-               // Wait on all four pending promises. Fail if any one of them
-               // result in an error.
-               return fit::join_promises(std::move(start_transaction_promise),
-                                         std::move(get_snapshot_promise),
-                                         std::move(update_device_state_promise),
-                                         std::move(update_shared_state_promise))
-                   .and_then([](std::tuple<fit::result<>, fit::result<>,
-                                           fit::result<>, fit::result<>>
-                                    results) -> fit::result<> {
-                     auto [start_transaction_result, get_snapshot_result,
-                           device_result, shared_result] = results;
-                     if (start_transaction_result.is_error() ||
-                         get_snapshot_result.is_error() ||
-                         device_result.is_error() || shared_result.is_error()) {
-                       return fit::error();
-                     }
-                     return fit::ok();
-                   });
-             })
-      // Keep |state| alive until execution reaches here. It is not needed in
-      // any subsequent continuation functions.
-      .inspect([state = std::move(state)](fit::result<>& r) {})
-      .and_then([page = page()] { return PagePromise::Commit(page); })
-      .or_else([page = page()] {
-        // Even if RollbackTransaction() succeeds, fail the overall task.
-        return PagePromise::Rollback(page).and_then(
-            [] { return fit::error(); });
-      })
-      .wrap_with(sequencer_)  // Waits until last Execute() is done.
-      .wrap_with(scope_);     // Aborts if |this| is destroyed.
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story/model/ledger_story_model_storage.h b/bin/sessionmgr/story/model/ledger_story_model_storage.h
deleted file mode 100644
index 690bafd..0000000
--- a/bin/sessionmgr/story/model/ledger_story_model_storage.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_MODEL_LEDGER_STORY_MODEL_STORAGE_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_MODEL_LEDGER_STORY_MODEL_STORAGE_H_
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-#include <lib/fit/scope.h>
-#include <lib/fit/sequencer.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/sessionmgr/story/model/story_model_storage.h"
-
-#include "peridot/lib/ledger_client/page_client.h"
-
-namespace modular {
-
-class LedgerClient;
-
-// LedgerStoryModelStorage writes a StoryModel into a Ledger Page instance. It
-// partitions the StoryModel into two sections:
-//
-// 1) Values that are scoped to this device (such as the Story's runtime state)
-// 2) Values that are shared among all devices (such as the list of mod URLs)
-//
-// The two sections are stored in separate prefixes of the Ledger: (1) is
-// prefixed using the device's id, and (2) is prefixed in a shared location.
-class LedgerStoryModelStorage : public StoryModelStorage, PageClient {
- public:
-  // Constructs a new instance which stores all data in |page_id| within
-  // |ledger_client|'s Ledger. Scopes device-local state to a key namespace
-  // therein with |device_id|.
-  LedgerStoryModelStorage(LedgerClient* ledger_client,
-                          fuchsia::ledger::PageId page_id,
-                          std::string device_id);
-  ~LedgerStoryModelStorage() override;
-
- private:
-  // |PageWatcher|
-  void OnChange(fuchsia::ledger::PageChange page,
-                fuchsia::ledger::ResultState result_state,
-                OnChangeCallback callback) override;
-
-  // |PageClient|
-  void OnPageConflict(Conflict* conflict) override;
-
-  // |StoryModelStorage|
-  fit::promise<> Load() override;
-
-  // |StoryModelStorage|
-  fit::promise<> Flush() override;
-
-  // |StoryModelStorage|
-  fit::promise<> Execute(
-      std::vector<fuchsia::modular::storymodel::StoryModelMutation> commands)
-      override;
-
-  // Called from OnChange().
-  void ProcessCompletePageChange(fuchsia::ledger::PageChange page_change);
-
-  const std::string device_id_;
-
-  // For very large changes to the Ledger page, OnChange() may be called
-  // multiple times, each time with a partial representation of the change. The
-  // changes are accumulated in |partial_page_change_| until OnChange() is
-  // called with the final set (where |result_state| ==
-  // ResultState::PARTIAL_COMPLETE).
-  fuchsia::ledger::PageChange partial_page_change_;
-
-  // With |scope_| is destroyed (which is when |this| is destructed), all
-  // fit::promises created in Mutate() will be abandoned. This is important
-  // because those promises capture |this| in their handler functions.
-  fit::scope scope_;
-
-  // All of the writes to the Ledger are sequenced: the fuchsia.ledger.Page API
-  // dictates that only one transaction may be ongoing at a time. Each call to
-  // Execute() results in a promise that calls StartTransaction() and Commit()
-  // at its end. |sequencer_| is used to ensure that no subsequent Execute()
-  // task begins before the previous has completed.
-  fit::sequencer sequencer_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerStoryModelStorage);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_MODEL_LEDGER_STORY_MODEL_STORAGE_H_
diff --git a/bin/sessionmgr/story/model/ledger_story_model_storage_unittest.cc b/bin/sessionmgr/story/model/ledger_story_model_storage_unittest.cc
deleted file mode 100644
index b5f4db1..0000000
--- a/bin/sessionmgr/story/model/ledger_story_model_storage_unittest.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-#include <lib/async_promise/executor.h>
-#include <lib/fit/bridge.h>
-#include <lib/fit/function.h>
-#include <lib/fit/single_threaded_executor.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/sessionmgr/story/model/apply_mutations.h"
-#include "peridot/bin/sessionmgr/story/model/ledger_story_model_storage.h"
-#include "peridot/bin/sessionmgr/story/model/testing/mutation_matchers.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_id.h"
-#include "peridot/lib/testing/test_with_ledger.h"
-
-using fuchsia::modular::StoryState;
-using fuchsia::modular::StoryVisibilityState;
-using fuchsia::modular::storymodel::StoryModel;
-using fuchsia::modular::storymodel::StoryModelMutation;
-
-namespace modular {
-namespace {
-
-// TODO: there is no good candidate for testing conflict resolution in the
-// StoryModel as of yet. What would be good is, e.g.: setting a value on a
-// ModuleModel while simultaneously deleting the entire entry.
-
-class LedgerStoryModelStorageTest : public testing::TestWithLedger {
- public:
-  async::Executor executor;
-
-  LedgerStoryModelStorageTest() : executor(dispatcher()) {}
-
-  // Creates a new LedgerStoryModelStorage instance and returns:
-  //
-  // 1) A unique_ptr to the new instance.
-  // 2) A ptr to a vector of lists of StoryModelMutations observed from that
-  // instance.
-  // 3) A ptr to a StoryModel updated with the observed commands.
-  std::tuple<std::unique_ptr<StoryModelStorage>,
-             std::vector<std::vector<StoryModelMutation>>*, StoryModel*>
-  Create(std::string page_id, std::string device_id) {
-    auto storage = std::make_unique<LedgerStoryModelStorage>(
-        ledger_client(), MakePageId(page_id), device_id);
-
-    auto observed_commands =
-        observed_mutations_.emplace(observed_mutations_.end());
-    auto observed_model = observed_models_.emplace(observed_models_.end());
-    storage->SetObserveCallback([=](std::vector<StoryModelMutation> commands) {
-      *observed_model = ApplyMutations(*observed_model, commands);
-      observed_commands->push_back(std::move(commands));
-    });
-    return std::make_tuple(std::move(storage), &*observed_commands,
-                           &*observed_model);
-  }
-
-  // This is broken out into its own function because we use C++ structured
-  // bindings to capture the result of Create() above. These cannot be
-  // implicitly captured in lambdas without more verbose syntax. This function
-  // converts the binding into a real variable which is possible to capture.
-  void RunLoopUntilNumMutationsObserved(
-      std::vector<std::vector<StoryModelMutation>>* observed_mutations,
-      uint32_t n) {
-    RunLoopUntil([&] { return observed_mutations->size() >= n; });
-  }
-
- private:
-  // A list (per StoryModelStorage instance) of the commands issued to each call
-  // to StoryModelStorage.Observe().
-  std::list<std::vector<std::vector<StoryModelMutation>>> observed_mutations_;
-  std::list<StoryModel> observed_models_;
-};
-
-// Store some device-local values (runtime state, visibility state), and
-// observe the values coming back to us.
-TEST_F(LedgerStoryModelStorageTest, DeviceLocal_RoundTrip) {
-  auto [storage, observed_mutations, observed_model] =
-      Create("page1", "device1");
-
-  std::vector<StoryModelMutation> commands(2);
-  commands[0].set_set_runtime_state(StoryState::RUNNING);
-  commands[1].set_set_visibility_state(StoryVisibilityState::IMMERSIVE);
-
-  fit::result<> result;
-  executor.schedule_task(
-      storage->Execute(std::move(commands)).then([&](fit::result<>& r) {
-        result = std::move(r);
-      }));
-  RunLoopUntil([&] { return !!result; });
-  EXPECT_TRUE(result.is_ok());
-
-  // We expect to see these values resulting in a notification from the ledger
-  // eventually.
-  RunLoopUntilNumMutationsObserved(observed_mutations, 1);
-  EXPECT_EQ(1lu, observed_mutations->size());
-  EXPECT_THAT(observed_mutations->at(0),
-              ::testing::ElementsAre(
-                  IsSetRuntimeStateMutation(StoryState::RUNNING),
-                  IsSetVisibilityMutation(StoryVisibilityState::IMMERSIVE)));
-
-  // Now change only StoryState. We should see the result of our previous
-  // change to StoryVisibilityState preserved.
-  commands.resize(1);
-  commands[0].set_set_runtime_state(StoryState::STOPPED);
-
-  result = fit::result<>();
-  executor.schedule_task(
-      storage->Execute(std::move(commands)).then([&](fit::result<>& r) {
-        result = std::move(r);
-      }));
-  RunLoopUntil([&] { return !!result; });
-  EXPECT_TRUE(result.is_ok());
-
-  RunLoopUntilNumMutationsObserved(observed_mutations, 2);
-  EXPECT_EQ(2lu, observed_mutations->size());
-  EXPECT_THAT(observed_mutations->at(1),
-              ::testing::ElementsAre(
-                  IsSetRuntimeStateMutation(StoryState::STOPPED),
-                  IsSetVisibilityMutation(StoryVisibilityState::IMMERSIVE)));
-}
-
-// Show that when we store values for two different device IDs in the same
-// Ledger page, they do not cause any conflicts.
-TEST_F(LedgerStoryModelStorageTest, DeviceLocal_DeviceIsolation) {
-  auto [storage1, observed_mutations1, observed_model1] =
-      Create("page1", "device1");
-  auto [storage2, observed_mutations2, observed_model2] =
-      Create("page1", "device2");
-
-  // Set runtime state to RUNNING on device1, and set visibility state to
-  // IMMERSIVE on device2.
-  {
-    std::vector<StoryModelMutation> commands(1);
-    commands[0].set_set_runtime_state(StoryState::RUNNING);
-    executor.schedule_task(storage1->Execute(std::move(commands)));
-  }
-  {
-    std::vector<StoryModelMutation> commands(1);
-    commands[0].set_set_visibility_state(StoryVisibilityState::IMMERSIVE);
-    executor.schedule_task(storage2->Execute(std::move(commands)));
-  }
-
-  RunLoopUntilNumMutationsObserved(observed_mutations1, 1);
-  RunLoopUntilNumMutationsObserved(observed_mutations2, 1);
-
-  EXPECT_TRUE(observed_model1->has_runtime_state());
-  EXPECT_FALSE(observed_model1->has_visibility_state());
-  EXPECT_TRUE(observed_model2->has_visibility_state());
-  EXPECT_FALSE(observed_model2->has_runtime_state());
-}
-
-// Create two update tasks but schedule them out of order. We expect them to
-// run in order.
-TEST_F(LedgerStoryModelStorageTest, UpdatesAreSequential) {
-  auto [storage, observed_mutations, observed_model] = Create("page", "device");
-
-  std::vector<StoryModelMutation> commands(1);
-  commands[0].set_set_runtime_state(StoryState::RUNNING);
-  auto promise1 = storage->Execute(std::move(commands));
-
-  commands.resize(1);
-  commands[0].set_set_runtime_state(StoryState::STOPPING);
-  auto promise2 = storage->Execute(std::move(commands));
-
-  executor.schedule_task(std::move(promise2));
-  RunLoopUntilIdle();  // For good measure.
-  executor.schedule_task(std::move(promise1));
-
-  RunLoopUntilNumMutationsObserved(observed_mutations, 2);
-  EXPECT_EQ(StoryState::STOPPING, *observed_model->runtime_state());
-}
-
-// When Load() is called, read what is stored in the Ledger back out and
-// expect to see commands that represent that state through the storage
-// observer.
-TEST_F(LedgerStoryModelStorageTest, Load) {
-  StoryModel expected_model;
-  {
-    auto [storage, observed_mutations, observed_model] =
-        Create("page", "device");
-
-    std::vector<StoryModelMutation> commands(2);
-    commands[0].set_set_runtime_state(StoryState::RUNNING);
-    commands[1].set_set_visibility_state(StoryVisibilityState::IMMERSIVE);
-    // TODO(thatguy): As we add more StoryModelMutations, add more lines here.
-    executor.schedule_task(storage->Execute(std::move(commands)));
-    RunLoopUntilNumMutationsObserved(observed_mutations, 1);
-    expected_model = std::move(*observed_model);
-  }
-
-  auto [storage, observed_mutations, observed_model] = Create("page", "device");
-
-  bool done{false};
-  executor.schedule_task(
-      storage->Load().then([&](fit::result<>&) { done = true; }));
-  RunLoopUntil([&] { return done; });
-  EXPECT_EQ(expected_model, *observed_model);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/story/model/meta/apply_mutations_unittest.cmx b/bin/sessionmgr/story/model/meta/apply_mutations_unittest.cmx
deleted file mode 100644
index 8b1229c..0000000
--- a/bin/sessionmgr/story/model/meta/apply_mutations_unittest.cmx
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "program": {
-    "binary": "test/apply_mutations_unittest"
-  },
-  "sandbox": {
-    "services": []
-  }
-}
-
diff --git a/bin/sessionmgr/story/model/meta/ledger_story_model_storage_unittest.cmx b/bin/sessionmgr/story/model/meta/ledger_story_model_storage_unittest.cmx
deleted file mode 100644
index bb0807c..0000000
--- a/bin/sessionmgr/story/model/meta/ledger_story_model_storage_unittest.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "program": {
-    "binary": "test/ledger_story_model_storage_unittest"
-  },
-  "sandbox": {
-    "services": [
-      "fuchsia.sys.Launcher"
-    ]
-  }
-}
diff --git a/bin/sessionmgr/story/model/meta/story_model_owner_unittest.cmx b/bin/sessionmgr/story/model/meta/story_model_owner_unittest.cmx
deleted file mode 100644
index b0d07ca..0000000
--- a/bin/sessionmgr/story/model/meta/story_model_owner_unittest.cmx
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "program": {
-    "binary": "test/story_model_owner_unittest"
-  },
-  "sandbox": {
-    "services": []
-  }
-}
diff --git a/bin/sessionmgr/story/model/noop_story_model_storage.cc b/bin/sessionmgr/story/model/noop_story_model_storage.cc
deleted file mode 100644
index 0f143ad..0000000
--- a/bin/sessionmgr/story/model/noop_story_model_storage.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story/model/noop_story_model_storage.h"
-
-#include <lib/fit/promise.h>
-
-namespace modular {
-
-NoopStoryModelStorage::NoopStoryModelStorage() = default;
-NoopStoryModelStorage::~NoopStoryModelStorage() = default;
-
-fit::promise<> NoopStoryModelStorage::Load() {
-  return fit::make_promise([] { return fit::ok(); });
-}
-
-fit::promise<> NoopStoryModelStorage::Flush() {
-  return fit::make_promise([] { return fit::ok(); });
-}
-
-fit::promise<> NoopStoryModelStorage::Execute(
-    std::vector<fuchsia::modular::storymodel::StoryModelMutation> commands) {
-  return fit::make_promise([this, commands = std::move(commands)]() mutable {
-           Observe(std::move(commands));
-           return fit::ok();
-         })
-      .wrap_with(scope_);
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story/model/noop_story_model_storage.h b/bin/sessionmgr/story/model/noop_story_model_storage.h
deleted file mode 100644
index a10f9a2..0000000
--- a/bin/sessionmgr/story/model/noop_story_model_storage.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_MODEL_NOOP_STORY_MODEL_STORAGE_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_MODEL_NOOP_STORY_MODEL_STORAGE_H_
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-#include <lib/fit/scope.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/sessionmgr/story/model/story_model_storage.h"
-
-namespace modular {
-
-// Performs no persistence. Dispatch()es any requested mutations.
-class NoopStoryModelStorage : public StoryModelStorage {
- public:
-  NoopStoryModelStorage();
-  ~NoopStoryModelStorage() override;
-
- private:
-  fit::promise<> Load() override;
-  fit::promise<> Flush() override;
-  fit::promise<> Execute(
-      std::vector<fuchsia::modular::storymodel::StoryModelMutation> commands)
-      override;
-
-  // When |scope_| is destroyed (which is when |this| is destructed), all
-  // fit::promises we created in Mutate() will be abandoned. This is important
-  // because those promises capture |this| in their handler functions.
-  fit::scope scope_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(NoopStoryModelStorage);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_MODEL_NOOP_STORY_MODEL_STORAGE_H_
diff --git a/bin/sessionmgr/story/model/story_model_owner.cc b/bin/sessionmgr/story/model/story_model_owner.cc
deleted file mode 100644
index 362bd1d..0000000
--- a/bin/sessionmgr/story/model/story_model_owner.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story/model/story_model_owner.h"
-
-#include <lib/fit/bridge.h>
-#include <lib/fit/defer.h>
-#include <lib/fxl/logging.h>
-#include "peridot/bin/sessionmgr/story/model/apply_mutations.h"
-#include "peridot/bin/sessionmgr/story/model/story_model_storage.h"
-#include "peridot/bin/sessionmgr/story/model/story_mutator.h"
-
-using fuchsia::modular::storymodel::ModuleModel;
-using fuchsia::modular::storymodel::StoryModel;
-using fuchsia::modular::storymodel::StoryModelMutation;
-
-namespace modular {
-
-namespace {
-// Sets default values for all fields of a new StoryModel. Defaults are
-// documented in
-// peridot/lib/fidl/public/fuchsia.modular.storymodel/story_model.fidl.
-void InitializeModelDefaults(StoryModel* model) {
-  model->set_runtime_state(fuchsia::modular::StoryState::STOPPED);
-  model->set_visibility_state(fuchsia::modular::StoryVisibilityState::DEFAULT);
-  model->set_modules({});
-}
-}  // namespace
-
-// Delegates Execute() to the StoryModelOwner.
-class StoryModelOwner::Mutator : public StoryMutator {
- public:
-  Mutator(fxl::WeakPtr<StoryModelOwner> weak_owner) : weak_owner_(weak_owner) {}
-  ~Mutator() override = default;
-
- private:
-  // |StoryMutator|
-  fit::consumer<> ExecuteInternal(
-      std::vector<StoryModelMutation> commands) override {
-    if (!weak_owner_) {
-      fit::bridge<> bridge;
-      bridge.completer.complete_error();
-      return std::move(bridge.consumer);
-    }
-    return weak_owner_->ExecuteCommands(std::move(commands));
-  }
-
-  fxl::WeakPtr<StoryModelOwner> weak_owner_;
-};
-
-// Manages the lifecycle of multiple listener callbacks. When Observer dies,
-// all callbacks registered with RegisterListener() are unregistered from the
-// backing StoryModelOwner.
-class StoryModelOwner::Observer : public StoryObserver {
- public:
-  Observer(fxl::WeakPtr<StoryModelOwner> weak_owner)
-      : weak_owner_(weak_owner) {}
-  ~Observer() {
-    // If our owner is gone, all of the listener functions have already been
-    // cleaned up. We need to cancel all the deferred actions since they
-    // capture and make a call on our owner.
-    if (!weak_owner_) {
-      for (auto& i : deferred_cleanup_) {
-        i.cancel();
-      }
-    }
-  }
-
- private:
-  void RegisterListener(
-      fit::function<void(const StoryModel&)> listener) override {
-    if (!weak_owner_) {
-      return;
-      // |listener| is destroyed.
-    }
-
-    deferred_cleanup_.push_back(
-        weak_owner_->RegisterListener(std::move(listener)));
-  }
-
-  const StoryModel& model() override {
-    FXL_CHECK(weak_owner_);
-    return weak_owner_->model_;
-  }
-
-  fxl::WeakPtr<StoryModelOwner> weak_owner_;
-  // When we are destroyed, we want to clean up any listeners we've added to
-  // |shared_state_->owner|.
-  std::vector<fit::deferred_action<fit::function<void()>>> deferred_cleanup_;
-};
-
-StoryModelOwner::StoryModelOwner(
-    const std::string& story_name, fit::executor* executor,
-    std::unique_ptr<StoryModelStorage> model_storage)
-    : model_storage_(std::move(model_storage)),
-      weak_ptr_factory_(this),
-      executor_(executor) {
-  FXL_CHECK(model_storage_ != nullptr);
-  model_.mutable_name()->assign(story_name);
-  InitializeModelDefaults(&model_);
-  model_storage_->SetObserveCallback(
-      [this](std::vector<StoryModelMutation> commands) {
-        HandleObservedMutations(std::move(commands));
-      });
-}
-
-StoryModelOwner::~StoryModelOwner() = default;
-
-std::unique_ptr<StoryMutator> StoryModelOwner::NewMutator() {
-  return std::make_unique<Mutator>(weak_ptr_factory_.GetWeakPtr());
-}
-
-std::unique_ptr<StoryObserver> StoryModelOwner::NewObserver() {
-  return std::make_unique<Observer>(weak_ptr_factory_.GetWeakPtr());
-}
-
-void StoryModelOwner::LoadStorage() {
-  FXL_CHECK(!seen_any_requests_to_execute_)
-      << "Must call LoadStorage() before any calls to StoryMutator.Execute();";
-  executor_->schedule_task(model_storage_->Load());
-}
-
-fit::consumer<> StoryModelOwner::FlushStorage() {
-  fit::bridge<> bridge;
-  executor_->schedule_task(model_storage_->Flush().then(
-      [completer = std::move(bridge.completer)](fit::result<>& result) mutable {
-        if (result.is_ok()) {
-          completer.complete_ok();
-        } else {
-          completer.complete_error();
-        }
-      }));
-  return std::move(bridge.consumer);
-}
-
-fit::deferred_action<fit::function<void()>> StoryModelOwner::RegisterListener(
-    fit::function<void(const StoryModel&)> listener) {
-  auto it = listeners_.insert(listeners_.end(), std::move(listener));
-  return fit::defer(
-      fit::function<void()>([this, it] { listeners_.erase(it); }));
-}
-
-fit::consumer<> StoryModelOwner::ExecuteCommands(
-    std::vector<StoryModelMutation> commands) {
-  seen_any_requests_to_execute_ = true;
-  // fit::bridge allows this function to return (and eventually complete) a
-  // promise that is owned by the caller and still schedule a promise as a task
-  // to execute the model update locally.
-  //
-  // If the caller chooses to ignore the result, our local promise will still be
-  // scheduled and executed.
-  fit::bridge<> bridge;
-  auto promise = model_storage_->Execute(std::move(commands))
-                     .then([completer = std::move(bridge.completer)](
-                               fit::result<>& result) mutable {
-                       if (result.is_ok()) {
-                         completer.complete_ok();
-                       } else {
-                         completer.complete_error();
-                       }
-                     });
-
-  executor_->schedule_task(std::move(promise));
-  return std::move(bridge.consumer);
-}
-
-void StoryModelOwner::HandleObservedMutations(
-    std::vector<StoryModelMutation> commands) {
-  // This is not thread-safe. We rely on the fact that
-  // HandleObservedMutations() will only be called on a single thread.
-  StoryModel old_model;
-  FXL_CHECK(fidl::Clone(model_, &old_model) == ZX_OK);
-  model_ = ApplyMutations(old_model, std::move(commands));
-
-  // Don't notify anyone if the model didn't change.
-  if (model_ == old_model) {
-    return;
-  }
-
-  executor_->schedule_task(fit::make_promise([this] {
-                             for (auto& listener : listeners_) {
-                               listener(model_);
-                             }
-                             return fit::ok();
-                           }).wrap_with(scope_));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story/model/story_model_owner.h b/bin/sessionmgr/story/model/story_model_owner.h
deleted file mode 100644
index 11fdbc0..0000000
--- a/bin/sessionmgr/story/model/story_model_owner.h
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MODEL_OWNER_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MODEL_OWNER_H_
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-#include <lib/async_promise/executor.h>
-#include <lib/fit/defer.h>
-#include <lib/fit/scope.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include <list>
-#include <memory>
-
-#include "peridot/bin/sessionmgr/story/model/story_mutator.h"
-#include "peridot/bin/sessionmgr/story/model/story_observer.h"
-
-namespace modular {
-
-class StoryModelStorage;
-
-// Owns a single instance of StoryModel and manages the flow of control from a
-// stream of mutations to observers.
-//
-// Clients do not depend on or have any direct knowledge of StoryModelOwner.
-// Rather, they depend on either or both a StoryObserver and
-// StoryMutator, depending on if they need to observe or mutate the model.
-//
-// See README.md.
-//
-// This class is not thread-safe.
-class StoryModelOwner {
- public:
-  // |story_name| is applied to StoryModel.name.
-  //
-  // Uses |executor| to schedule internal mutation tasks. Delegates mutation
-  // commands to and reacts to observation of applied mutations from
-  // |model_storage|.
-  explicit StoryModelOwner(const std::string& story_name,
-                           fit::executor* executor,
-                           std::unique_ptr<StoryModelStorage> model_storage);
-  ~StoryModelOwner();
-
-  // Instructs |model_storage| to load persisted data. After calling, clients
-  // may begin to see notifications through any created StoryObservers.
-  //
-  // This method must be called no more than once and before any associated
-  // calls to StoryMutator.Execute().
-  void LoadStorage();
-
-  // Returns a consumer which is completed when |model_storage| has
-  // successfully executed any pending tasks to mutate its underlying storage.
-  // Note this does not indicate that the storage layer has notifed |this| of
-  // the application of those mutations.
-  //
-  // To avoid losing any pending changes to the model, it is recommended to
-  // call Flush() and wait for completion before destroying |this|.
-  fit::consumer<> FlushStorage();
-
-  // Returns a mutator object that can be provided to a System that requires
-  // the ability to issue commands to mutate the model. This can be provided to
-  // Systems as a constructor argument.
-  //
-  // The returned StoryMutator may outlive |this|, but will return an
-  // error for all attempts to mutate the model.
-  std::unique_ptr<StoryMutator> NewMutator();
-
-  // Returns an object that can be used to register observer callbacks to the
-  // be notified of the model's current state when changes are made. This
-  // should be provided to Systems as a constructor argument.
-  //
-  // The returned StoryObserver may outlive |this|. See the documentation
-  // for StoryObserver for caveats.
-  std::unique_ptr<StoryObserver> NewObserver();
-
- private:
-  class Mutator;
-  class Observer;
-
-  // Registers |listener| to be called whenever mutation commands are applied
-  // to |model_|. Returns a deferred action that will deregister |listener|
-  // when it goes out of scope.
-  //
-  // Called by instances of Observer.
-  fit::deferred_action<fit::function<void()>> RegisterListener(
-      fit::function<void(const fuchsia::modular::storymodel::StoryModel&)>
-          listener);
-
-  // Calls |model_storage_| to execute |commands|.
-  //
-  // Called by instances of Mutator.
-  fit::consumer<> ExecuteCommands(
-      std::vector<fuchsia::modular::storymodel::StoryModelMutation> commands);
-
-  // Applies |commands| to |model_| and notifies all |listeners_| with the
-  // updated StoryModel.
-  //
-  // Called indirectly by |model_storage_| through a callback.
-  void HandleObservedMutations(
-      std::vector<fuchsia::modular::storymodel::StoryModelMutation> commands);
-
-  // Set to true on the first call to ExecuteCommands().
-  bool seen_any_requests_to_execute_{false};
-
-  std::unique_ptr<StoryModelStorage> model_storage_;
-
-  // The most recent StoryModel value. Accessed by StoryObservers at any
-  // time. Updated by HandleObservedMutations().
-  fuchsia::modular::storymodel::StoryModel model_;
-
-  // Used to signal to instances of StoryMutator/Observer when |this| is
-  // destroyed.
-  fxl::WeakPtrFactory<StoryModelOwner> weak_ptr_factory_;
-
-  // A list<> so that we can get stable iterators for cleanup purposes. See
-  // RegisterListener().
-  std::list<
-      fit::function<void(const fuchsia::modular::storymodel::StoryModel&)>>
-      listeners_;
-
-  fit::executor* executor_;  // Not owned.
-
-  // Since we schedule our fit::promises for execution on |executor_|, which can
-  // outlive |this|, we use this to wrap our fit::promises (using
-  // fit::promise.wrap_with(scope_)) such that when |this| is destroyed, all
-  // pending promises are abandoned.
-  fit::scope scope_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryModelOwner);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MODEL_OWNER_H_
diff --git a/bin/sessionmgr/story/model/story_model_owner_unittest.cc b/bin/sessionmgr/story/model/story_model_owner_unittest.cc
deleted file mode 100644
index 5fa3112..0000000
--- a/bin/sessionmgr/story/model/story_model_owner_unittest.cc
+++ /dev/null
@@ -1,273 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/fit/bridge.h>
-#include <lib/fit/function.h>
-#include <lib/fit/single_threaded_executor.h>
-
-#include "lib/gtest/test_loop_fixture.h"
-#include "peridot/bin/sessionmgr/story/model/story_model_owner.h"
-#include "peridot/bin/sessionmgr/story/model/story_model_storage.h"
-
-using fuchsia::modular::StoryVisibilityState;
-using fuchsia::modular::storymodel::StoryModel;
-using fuchsia::modular::storymodel::StoryModelMutation;
-
-namespace modular {
-namespace {
-
-// This persistence system acts as a mock for calls to Execute(), and promotes
-// Observe() from protected to public so that we can call it directly from the
-// test body.
-class TestModelStorage : public StoryModelStorage {
- public:
-  struct ExecuteCall {
-    std::vector<StoryModelMutation> commands;
-
-    // Call this after a call to Execute() to complete the returned promise.
-    fit::completer<> completer;
-  };
-  std::vector<ExecuteCall> calls;
-
-  fit::promise<> Load() override {
-    return fit::make_promise([] { return fit::ok(); });
-  }
-
-  fit::promise<> Flush() override {
-    return fit::make_promise([] { return fit::ok(); });
-  }
-
-  fit::promise<> Execute(std::vector<StoryModelMutation> commands) override {
-    fit::bridge<> bridge;
-
-    // Store the arguments we got.
-    ExecuteCall call{.commands = std::move(commands),
-                     .completer = std::move(bridge.completer)};
-    calls.push_back(std::move(call));
-
-    return bridge.consumer.promise();
-  }
-
-  using StoryModelStorage::Observe;
-};
-
-class StoryModelOwnerTest : public ::gtest::TestLoopFixture {
- public:
-  StoryModelOwnerTest() : TestLoopFixture() { ResetExecutor(); }
-
-  std::unique_ptr<StoryModelOwner> Create(const std::string& story_name) {
-    auto model_storage = std::make_unique<TestModelStorage>();
-    model_storage_ = model_storage.get();
-
-    auto owner = std::make_unique<StoryModelOwner>(story_name, executor_.get(),
-                                                   std::move(model_storage));
-    return owner;
-  }
-
-  void ResetExecutor() { executor_.reset(new async::Executor(dispatcher())); }
-
-  TestModelStorage* model_storage() { return model_storage_; }
-
- private:
-  std::unique_ptr<async::Executor> executor_;
-  TestModelStorage* model_storage_;
-};
-
-TEST_F(StoryModelOwnerTest, SuccessfulMutate) {
-  // Show that a single mutation flows through the StoryModelOwner to
-  // StoryModelStorage, and then applies the resulting commands.
-  auto owner = Create("test_name");
-
-  auto mutator = owner->NewMutator();
-  bool done{false};
-  auto result_task =
-      mutator->set_visibility_state(StoryVisibilityState::IMMERSIVE)
-          .promise()
-          .and_then([&] { done = true; })
-          .or_else([] { FAIL(); });
-  RunLoopUntilIdle();
-
-  // The persistence system should have been called.
-  ASSERT_EQ(1lu, model_storage()->calls.size());
-  ASSERT_EQ(1lu, model_storage()->calls[0].commands.size());
-  EXPECT_TRUE(model_storage()->calls[0].commands[0].is_set_visibility_state());
-  EXPECT_EQ(StoryVisibilityState::IMMERSIVE,
-            model_storage()->calls[0].commands[0].set_visibility_state());
-
-  // Complete the pending persistence call.
-  model_storage()->calls[0].completer.complete_ok();
-  RunLoopUntilIdle();
-  fit::run_single_threaded(std::move(result_task));
-  EXPECT_TRUE(done);
-
-  // The existing model hasn't changed, because the StoryModelStorage
-  // has not heard back from its storage that the mutation occurred.
-  auto observer = owner->NewObserver();
-  EXPECT_EQ("test_name", *observer->model().name());
-  EXPECT_EQ(StoryVisibilityState::DEFAULT,
-            *observer->model().visibility_state());
-
-  // Now dispatch mutations from the persistence system, and we should observe
-  // that ApplyMutations() is invoked.
-  model_storage()->Observe(std::move(model_storage()->calls[0].commands));
-
-  // And the new model value that ApplyMutations returned should be reflected in
-  // the owner.
-  EXPECT_EQ(StoryVisibilityState::IMMERSIVE,
-            *observer->model().visibility_state());
-}
-
-TEST_F(StoryModelOwnerTest, FailedMutate) {
-  auto owner = Create("test");
-  auto mutator = owner->NewMutator();
-  bool task_executed{false};
-  bool saw_error{false};
-  auto result_task =
-      mutator->set_visibility_state(StoryVisibilityState::IMMERSIVE)
-          .promise()
-          .and_then([&] { task_executed = true; })
-          .or_else([&] { saw_error = true; });
-  RunLoopUntilIdle();
-  model_storage()->calls[0].completer.complete_error();
-  RunLoopUntilIdle();
-  fit::run_single_threaded(std::move(result_task));
-  EXPECT_FALSE(task_executed);
-  EXPECT_TRUE(saw_error);
-}
-
-TEST_F(StoryModelOwnerTest, AbandonedMutate) {
-  // If for some reason the underlying mutation is abandoned, we should observe
-  // an error.
-  auto owner = Create("test");
-  auto mutator = owner->NewMutator();
-  bool task_executed{false};
-  bool saw_error{false};
-  auto result_task =
-      mutator->set_visibility_state(StoryVisibilityState::IMMERSIVE)
-          .promise_or(fit::error())  // turn abandonment into an error.
-          .and_then([&] { task_executed = true; })
-          .or_else([&] { saw_error = true; });
-  RunLoopUntilIdle();
-  // Clearing the list of calls will destroy the completer, which has the
-  // side-effect of abandoning the returned task.
-  model_storage()->calls.clear();
-  RunLoopUntilIdle();
-  fit::run_single_threaded(std::move(result_task));
-  EXPECT_FALSE(task_executed);
-  EXPECT_TRUE(saw_error);
-}
-
-TEST_F(StoryModelOwnerTest, MutatorLifecycle_OwnerDestroyed) {
-  // When the StoryModelOwner is destroyed but someone is still holding onto a
-  // StoryMutator that mutator should return an error on Execute().
-  auto owner = Create("test");
-  auto mutator = owner->NewMutator();
-  owner.reset();
-  bool task_executed{false};
-  bool saw_error{false};
-  auto result_task =
-      mutator->set_visibility_state(StoryVisibilityState::IMMERSIVE)
-          .promise()
-          .and_then([&] { task_executed = true; })
-          .or_else([&] { saw_error = true; });
-  RunLoopUntilIdle();
-  fit::run_single_threaded(std::move(result_task));
-  EXPECT_FALSE(task_executed);
-  EXPECT_TRUE(saw_error);
-}
-
-TEST_F(StoryModelOwnerTest, ObserversAreNotified) {
-  // One can create an observer and learn of the new state.
-  auto owner = Create("test");
-  auto mutator = owner->NewMutator();
-  auto observer = owner->NewObserver();
-
-  bool got_update1{false};
-  observer->RegisterListener([&](const StoryModel& model) {
-    got_update1 = true;
-    EXPECT_EQ(StoryVisibilityState::IMMERSIVE, *model.visibility_state());
-  });
-
-  // Another listener should also get the update!
-  bool got_update2{false};
-  observer->RegisterListener(
-      [&](const StoryModel& model) { got_update2 = true; });
-
-  // Also on another observer.
-  auto observer2 = owner->NewObserver();
-  bool got_update3{false};
-  observer2->RegisterListener(
-      [&](const StoryModel& model) { got_update3 = true; });
-
-  std::vector<StoryModelMutation> commands;
-  commands.resize(1);
-  commands[0].set_set_visibility_state(StoryVisibilityState::IMMERSIVE);
-  model_storage()->Observe(std::move(commands));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(got_update1);
-  EXPECT_TRUE(got_update2);
-  EXPECT_TRUE(got_update3);
-}
-
-TEST_F(StoryModelOwnerTest, ObserversAreNotNotifiedOnNoChange) {
-  // Observers aren't told when an observed mutation doesn't change the model.
-  auto owner = Create("test");
-  auto mutator = owner->NewMutator();
-  auto observer = owner->NewObserver();
-
-  bool got_update{false};
-  observer->RegisterListener([&](const StoryModel& model) {
-    got_update = true;
-  });
-
-  std::vector<StoryModelMutation> commands;
-  commands.resize(1);
-  commands[0].set_set_visibility_state(StoryVisibilityState::DEFAULT);
-  model_storage()->Observe(std::move(commands));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(got_update);
-}
-
-TEST_F(StoryModelOwnerTest, ObserversLifecycle_ClientDestroyed) {
-  // When the client destroys its observer object, it no longer receives
-  // updates.
-  auto owner = Create("test");
-  auto mutator = owner->NewMutator();
-  auto observer = owner->NewObserver();
-
-  bool got_update{false};
-  observer->RegisterListener(
-      [&](const StoryModel& model) { got_update = true; });
-
-  std::vector<StoryModelMutation> commands;
-  commands.resize(1);
-  commands[0].set_set_visibility_state(StoryVisibilityState::IMMERSIVE);
-  model_storage()->Observe(std::move(commands));
-
-  observer.reset();
-  RunLoopUntilIdle();
-  EXPECT_FALSE(got_update);
-}
-
-TEST_F(StoryModelOwnerTest, ObserversLifecycle_OwnerDestroyed) {
-  // When the StoryModelOwner is destroyed, clients can learn of the fact by
-  // using a fit::defer on the listener callback.
-  auto owner = Create("test");
-  auto mutator = owner->NewMutator();
-  auto observer = owner->NewObserver();
-
-  bool destroyed{false};
-  observer->RegisterListener([defer = fit::defer([&] { destroyed = true; })](
-                                 const StoryModel& model) {});
-
-  owner.reset();
-  EXPECT_TRUE(destroyed);
-
-  // Explicitly destroy |observer| to ensure that its cleanup isn't affected by
-  // |owner| being destroyed.
-  observer.reset();
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/story/model/story_model_storage.cc b/bin/sessionmgr/story/model/story_model_storage.cc
deleted file mode 100644
index b37a571..0000000
--- a/bin/sessionmgr/story/model/story_model_storage.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story/model/story_model_storage.h"
-
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-StoryModelStorage::StoryModelStorage() = default;
-StoryModelStorage::~StoryModelStorage() = default;
-
-void StoryModelStorage::SetObserveCallback(
-    fit::function<
-        void(std::vector<fuchsia::modular::storymodel::StoryModelMutation>)>
-        callback) {
-  observe_callback_ = std::move(callback);
-}
-
-void StoryModelStorage::Observe(
-    std::vector<fuchsia::modular::storymodel::StoryModelMutation> commands) {
-  FXL_DCHECK(observe_callback_);
-  observe_callback_(std::move(commands));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story/model/story_model_storage.h b/bin/sessionmgr/story/model/story_model_storage.h
deleted file mode 100644
index 24521f3..0000000
--- a/bin/sessionmgr/story/model/story_model_storage.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MODEL_STORAGE_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MODEL_STORAGE_H_
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-#include <lib/async_promise/executor.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include <list>
-#include <memory>
-
-namespace modular {
-
-// The purpose of a StoryModelStorage is to apply StoryModelMutations to a
-// persistent storage layer and flow observed changes from the storage layer to
-// Observe().
-//
-// Due to the nature of some storage systems (such as Ledger), a call to
-// Mutate() doesn't necessarily result in an equivalent Observe().
-//
-// A trivial example: two peers, A and B, both call Mutate() with conflicting
-// instructions. Peer A learns of peer B's mutation before calling Observe(),
-// and conflict resolution results in no change to the model. In this case,
-// Observe() will not be called.
-class StoryModelStorage {
- public:
-  StoryModelStorage();
-  virtual ~StoryModelStorage();
-
-  // Registers a callback that is called when Observe() is called by
-  // implementers.
-  void SetObserveCallback(
-      fit::function<
-          void(std::vector<fuchsia::modular::storymodel::StoryModelMutation>)>
-          callback);
-
-  // Returns a task that, when executed, loads existing data in storage and
-  // calls Observe() with mutations that will update a default-initialized
-  // StoryModel to reflect the values in storage, THEN resolves the returned
-  // promise.
-  virtual fit::promise<> Load() = 0;
-
-  // Returns a task that, when complete, guarantees all prior calls to Execute()
-  // are complete. Any calls to Execute() that are issued after Flush() are not
-  // guaranteed to be complete.
-  virtual fit::promise<> Flush() = 0;
-
-  // Returns a task that, when executed, applies |commands| to the underlying
-  // storage system. Clients can expect that similar mutations will be observed
-  // through SetObserveCallback()'s |callback| at some point in the future.
-  // However, in the case of conflict resolution or a similar process, the set
-  // of observed mutations may be different.
-  virtual fit::promise<> Execute(
-      std::vector<fuchsia::modular::storymodel::StoryModelMutation>
-          commands) = 0;
-
- protected:
-  // Calls to Observe() must always be made from the same thread: ordering
-  // of the observed mutations matters.
-  void Observe(std::vector<fuchsia::modular::storymodel::StoryModelMutation>);
-
- private:
-  fit::function<void(
-      std::vector<fuchsia::modular::storymodel::StoryModelMutation>)>
-      observe_callback_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryModelStorage);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MODEL_STORAGE_H_
diff --git a/bin/sessionmgr/story/model/story_mutator.cc b/bin/sessionmgr/story/model/story_mutator.cc
deleted file mode 100644
index c91c1e0..0000000
--- a/bin/sessionmgr/story/model/story_mutator.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <vector>
-
-#include "peridot/bin/sessionmgr/story/model/story_mutator.h"
-
-using fuchsia::modular::storymodel::StoryModelMutation;
-
-namespace modular {
-
-StoryMutator::StoryMutator() = default;
-StoryMutator::~StoryMutator() = default;
-
-fit::consumer<> StoryMutator::set_runtime_state(
-    fuchsia::modular::StoryState state) {
-  std::vector<StoryModelMutation> commands(1);
-  commands[0].set_set_runtime_state(state);
-  return ExecuteInternal(std::move(commands));
-}
-
-fit::consumer<> StoryMutator::set_visibility_state(
-    fuchsia::modular::StoryVisibilityState state) {
-  std::vector<StoryModelMutation> commands(1);
-  commands[0].set_set_visibility_state(state);
-  return ExecuteInternal(std::move(commands));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story/model/story_mutator.h b/bin/sessionmgr/story/model/story_mutator.h
deleted file mode 100644
index 58f6943..0000000
--- a/bin/sessionmgr/story/model/story_mutator.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MUTATOR_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MUTATOR_H_
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-#include <lib/fit/bridge.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-// Implemented by and created by the StoryModelOwner.
-//
-// An instance of StoryMutator is provided to all clients that wish to perform
-// mutations on a StoryModel. It is responsible for consuming mutation commands
-// (exposed as methods publicly and converted to StoryModelMutation internally)
-// and dispatching them be applied to a shared StoryModel instance.
-//
-// This is an interface in order to aid in testing clients that depend on
-// StoryMutator.
-class StoryMutator {
- public:
-  StoryMutator();
-  virtual ~StoryMutator();
-
-  // The following mutators issue a single mutation instruction to
-  // change the StoryModel.
-  //
-  // The returned fit::consumer<> will eventually be completed with the result
-  // of the mutation operation, HOWEVER success does not guarantee that
-  // observers of the StoryModel will see those same changes reflected, and thus
-  // clients should NOT perform side-effects under that assumption.
-  //
-  // It IS safe to perform side-effects once mutations have been observed
-  // through StoryObserver.
-  //
-  // A failure guarantees that the mutation was not applied and it is safe to
-  // retry.
-
-  // Sets the value of |StoryModel.runtime_state|.
-  fit::consumer<> set_runtime_state(
-      fuchsia::modular::StoryState state);
-
-  // Sets the value of |StoryModel.visibility_state|.
-  fit::consumer<> set_visibility_state(
-      fuchsia::modular::StoryVisibilityState state);
-
- private:
-  // Executes |commands| in order and in a single transaction.
-  virtual fit::consumer<> ExecuteInternal(
-      std::vector<fuchsia::modular::storymodel::StoryModelMutation>
-          commands) = 0;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryMutator);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_MUTATOR_H_
diff --git a/bin/sessionmgr/story/model/story_observer.h b/bin/sessionmgr/story/model/story_observer.h
deleted file mode 100644
index f1eb211..0000000
--- a/bin/sessionmgr/story/model/story_observer.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_OBSERVER_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_OBSERVER_H_
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-// Implemented bv StoryModelOwner. A client of StoryObserver can query the
-// current state of a StoryModel or register a callback to be notified of
-// changes.
-class StoryObserver {
- public:
-  StoryObserver() = default;
-  virtual ~StoryObserver() = default;
-
-  // Registers |listener| as a callback for StoryModel updates. If |this| is
-  // destroyed, or the StoryModelOwner that created |this| is destroyed, all
-  // registered listeners will also be destroyed.
-  //
-  // Clients may learn that the StoryModelOwner is destroyed by deferring
-  // a callback in the capture list of |listener|. Example:
-  //
-  //   auto on_abandoned = [] { /* do some cleanup */ };
-  //   observer.RegisterListener(
-  //       [on_destroy = fit::defer(on_abandoned)]
-  //       (const StoryModel& model) {
-  //         /* do something with the update */
-  //       });
-  //
-  // Note that the received StoryModel is only valid for the lifetime
-  // of the call to |listener|.
-  virtual void RegisterListener(
-      fit::function<void(const fuchsia::modular::storymodel::StoryModel& model)>
-          listener) = 0;
-
-  // Returns the current state of the StoryModel.
-  virtual const fuchsia::modular::storymodel::StoryModel& model() = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryObserver);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_MODEL_STORY_OBSERVER_H_
diff --git a/bin/sessionmgr/story/model/testing/BUILD.gn b/bin/sessionmgr/story/model/testing/BUILD.gn
deleted file mode 100644
index ab87913..0000000
--- a/bin/sessionmgr/story/model/testing/BUILD.gn
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-group("testing") {
-  testonly = true
-
-  public_deps = [
-    ":mutation_matchers",
-    ":test_mutator",
-  ]
-}
-
-source_set("mutation_matchers") {
-  testonly = true
-
-  sources = [
-    "mutation_matchers.h",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular.storymodel",
-    "//peridot/public/lib/fostr/fidl/fuchsia.modular",
-    "//peridot/public/lib/fostr/fidl/fuchsia.modular.storymodel",
-    "//third_party/googletest:gmock",
-  ]
-}
-
-source_set("test_mutator") {
-  testonly = true
-
-  sources = [
-    "test_mutator.cc",
-    "test_mutator.h",
-  ]
-
-  deps = [
-    "//peridot/bin/sessionmgr/story/model",
-    "//peridot/public/fidl/fuchsia.modular.storymodel",
-  ]
-}
diff --git a/bin/sessionmgr/story/model/testing/mutation_matchers.h b/bin/sessionmgr/story/model/testing/mutation_matchers.h
deleted file mode 100644
index c9b8730..0000000
--- a/bin/sessionmgr/story/model/testing/mutation_matchers.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#pragma once
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-
-#include "gmock/gmock.h"  // For MATCHER macros.
-#include "lib/fostr/fidl/fuchsia/modular/formatting.h"
-#include "lib/fostr/fidl/fuchsia/modular/storymodel/formatting.h"
-
-namespace modular {
-
-// |arg| is a StoryModelMutation, |expected| is a StoryVisibilitystate.
-MATCHER_P(IsSetVisibilityMutation, expected, "") {
-  *result_listener << "is set_visibility_state " << expected;
-  if (!arg.is_set_visibility_state())
-    return false;
-  return expected == arg.set_visibility_state();
-}
-
-// |arg| is a StoryModelMutation, |expected| is a StoryState.
-MATCHER_P(IsSetRuntimeStateMutation, expected, "") {
-  *result_listener << "is set_runtime_state " << expected;
-  if (!arg.is_set_runtime_state())
-    return false;
-  return expected == arg.set_runtime_state();
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story/model/testing/test_mutator.cc b/bin/sessionmgr/story/model/testing/test_mutator.cc
deleted file mode 100644
index 1ee3a2a..0000000
--- a/bin/sessionmgr/story/model/testing/test_mutator.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story/model/testing/test_mutator.h"
-
-namespace modular {
-
-
-std::unique_ptr<StoryMutator> TestMutator::Create(TestMutator** ptr) {
-  auto mutator = std::make_unique<TestMutator>();
-  *ptr = mutator.get();
-  return mutator;
-}
-
-fit::consumer<> TestMutator::ExecuteInternal(
-    std::vector<fuchsia::modular::storymodel::StoryModelMutation> commands) {
-  fit::bridge<> bridge;
-  ExecuteCall call{.completer = std::move(bridge.completer),
-                   .commands = std::move(commands)};
-  execute_calls.push_back(std::move(call));
-  return std::move(bridge.consumer);
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story/model/testing/test_mutator.h b/bin/sessionmgr/story/model/testing/test_mutator.h
deleted file mode 100644
index 52f044c..0000000
--- a/bin/sessionmgr/story/model/testing/test_mutator.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#pragma once
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-#include <lib/fit/bridge.h>
-
-#include "peridot/bin/sessionmgr/story/model/story_mutator.h"
-
-namespace modular {
-
-// A version of StoryMutator for use in tests.
-//
-// Collects all calls to StoryMutator.Execute() in public member
-// |execute_calls|. Each element of |execute_calls| consists of:
-//
-// * |ExecuteCall.commands| are the StoryModelMutation commands that were
-// issued in the Execute() call.
-// * |ExecuteCall.completer| is used to complete the fit::promise<> that
-// Execute() returns. The test author must call |completer.complete_ok()| or
-// |completer.complete_error()| for any tasks blocked on the Execute() call to
-// unblock.
-class TestMutator : public StoryMutator {
- public:
-  // Convenience factory allowing the caller to retain a pointer to the TestMutator
-  // when constructing a class that accepts a StoryMutator as a constructor argument.
-  //
-  // Usage:
-  //
-  // TestMutator* test_mutator;
-  // Foo foo(TestMutator::Create(&test_mutator));
-  static std::unique_ptr<StoryMutator> Create(TestMutator** ptr);
-
-  fit::consumer<> ExecuteInternal(
-      std::vector<fuchsia::modular::storymodel::StoryModelMutation> commands)
-      override;
-
-  struct ExecuteCall {
-    fit::completer<> completer;
-    std::vector<fuchsia::modular::storymodel::StoryModelMutation> commands;
-  };
-  std::vector<ExecuteCall> execute_calls;
-};
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story/system.cc b/bin/sessionmgr/story/system.cc
deleted file mode 100644
index e740e48..0000000
--- a/bin/sessionmgr/story/system.cc
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story/system.h"
-
-namespace modular {
-
-System::~System() {}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story/system.h b/bin/sessionmgr/story/system.h
deleted file mode 100644
index 371c8e9..0000000
--- a/bin/sessionmgr/story/system.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_SYSTEM_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_SYSTEM_H_
-
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-// Common interface for all story runtime systems.
-class System {
- public:
-  System() {}
-  virtual ~System();
-
-  // TODO(thatguy): Add lifecycle methods Initialize() and Teardown().
-  // TODO(thatguy): Add Inspect API hooks for debug output.
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(System);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_SYSTEM_H_
diff --git a/bin/sessionmgr/story/systems/BUILD.gn b/bin/sessionmgr/story/systems/BUILD.gn
deleted file mode 100644
index a50db14..0000000
--- a/bin/sessionmgr/story/systems/BUILD.gn
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/tests_package.gni")
-
-hermetic_tests_package("story_systems_unittests") {
-  deps = [
-    ":story_visibility_system_unittest",
-  ]
-}
-
-source_set("story_visibility_system") {
-  sources = [
-    "story_visibility_system.cc",
-    "story_visibility_system.h",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  deps = [
-    "//peridot/bin/sessionmgr/story:system",
-    "//peridot/bin/sessionmgr/story/model",
-    "//peridot/public/fidl/fuchsia.modular.storymodel",
-  ]
-}
-
-executable("story_visibility_system_unittest") {
-  testonly = true
-
-  sources = [
-    "story_visibility_system_unittest.cc",
-  ]
-
-  deps = [
-    ":story_visibility_system",
-    "//peridot/bin/sessionmgr/story/model",
-    "//peridot/bin/sessionmgr/story/model/testing",
-    "//third_party/googletest:gmock",
-    "//third_party/googletest:gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/sessionmgr/story/systems/meta/story_visibility_system_unittest.cmx b/bin/sessionmgr/story/systems/meta/story_visibility_system_unittest.cmx
deleted file mode 100644
index 7a3c73c..0000000
--- a/bin/sessionmgr/story/systems/meta/story_visibility_system_unittest.cmx
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "program": {
-    "binary": "test/story_visibility_system_unittest"
-  },
-  "sandbox": {
-    "services": []
-  }
-}
diff --git a/bin/sessionmgr/story/systems/story_visibility_system.cc b/bin/sessionmgr/story/systems/story_visibility_system.cc
deleted file mode 100644
index 42f3d7d..0000000
--- a/bin/sessionmgr/story/systems/story_visibility_system.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-
-#include "peridot/bin/sessionmgr/story/systems/story_visibility_system.h"
-
-#include "peridot/bin/sessionmgr/story/model/story_mutator.h"
-
-namespace modular {
-
-using fuchsia::modular::StoryVisibilityState;
-using fuchsia::modular::storymodel::StoryModel;
-using fuchsia::modular::storymodel::StoryModelMutation;
-
-StoryVisibilitySystem::StoryVisibilitySystem(
-    std::unique_ptr<StoryMutator> mutator)
-    : mutator_(std::move(mutator)) {}
-
-StoryVisibilitySystem::~StoryVisibilitySystem() {}
-
-void StoryVisibilitySystem::RequestStoryVisibilityStateChange(
-    const StoryVisibilityState visibility_state) {
-  // Ignore any error resulting from this operation.
-  mutator_->set_visibility_state(visibility_state);
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story/systems/story_visibility_system.h b/bin/sessionmgr/story/systems/story_visibility_system.h
deleted file mode 100644
index 5b33c29..0000000
--- a/bin/sessionmgr/story/systems/story_visibility_system.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_SYSTEMS_STORY_VISIBILITY_SYSTEM_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_SYSTEMS_STORY_VISIBILITY_SYSTEM_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <memory>
-
-#include "peridot/bin/sessionmgr/story/system.h"
-
-namespace modular {
-
-class StoryMutator;
-
-// This sytem implements the policy for translating requests from Modules to
-// change the visibility state of the story into the final visibility state of
-// the story.
-//
-// The current policy is "allow all".
-class StoryVisibilitySystem : public System {
- public:
-  StoryVisibilitySystem(std::unique_ptr<StoryMutator> model_mutator);
-  ~StoryVisibilitySystem() override;
-
-  void RequestStoryVisibilityStateChange(
-      const fuchsia::modular::StoryVisibilityState visibility_state);
-
- private:
-  std::unique_ptr<StoryMutator> mutator_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_SYSTEMS_STORY_VISIBILITY_SYSTEM_H_
diff --git a/bin/sessionmgr/story/systems/story_visibility_system_unittest.cc b/bin/sessionmgr/story/systems/story_visibility_system_unittest.cc
deleted file mode 100644
index 6dea661..0000000
--- a/bin/sessionmgr/story/systems/story_visibility_system_unittest.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-
-#include "gmock/gmock.h"  // For EXPECT_THAT and matchers.
-#include "gtest/gtest.h"
-#include "peridot/bin/sessionmgr/story/model/testing/mutation_matchers.h"
-#include "peridot/bin/sessionmgr/story/model/testing/test_mutator.h"
-#include "peridot/bin/sessionmgr/story/systems/story_visibility_system.h"
-
-using fuchsia::modular::storymodel::StoryModel;
-using fuchsia::modular::storymodel::StoryModelMutation;
-
-namespace modular {
-namespace {
-
-class StoryVisibilitySystemTest : public ::testing::Test {
- protected:
-  StoryVisibilitySystemTest() {
-    system_ =
-        std::make_unique<StoryVisibilitySystem>(TestMutator::Create(&mutator_));
-  }
-
-  std::unique_ptr<StoryVisibilitySystem> system_;
-  TestMutator* mutator_;
-};
-
-TEST_F(StoryVisibilitySystemTest, All) {
-  system_->RequestStoryVisibilityStateChange(
-      fuchsia::modular::StoryVisibilityState::IMMERSIVE);
-
-  EXPECT_EQ(1lu, mutator_->execute_calls.size());
-  EXPECT_THAT(mutator_->execute_calls[0].commands,
-              testing::ElementsAre(IsSetVisibilityMutation(
-                  fuchsia::modular::StoryVisibilityState::IMMERSIVE)));
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/story_runner/BUILD.gn b/bin/sessionmgr/story_runner/BUILD.gn
deleted file mode 100644
index bb689ee..0000000
--- a/bin/sessionmgr/story_runner/BUILD.gn
+++ /dev/null
@@ -1,146 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-import("//peridot/build/tests_package.gni")
-
-hermetic_tests_package("story_runner_unittests") {
-  deps = [
-    ":link_impl_unittest",
-    ":story_controller_impl_unittest",  # incomplete, for now.
-  ]
-}
-
-# NOTE: We are in the process of deconstructing story_runner into its
-# constituent components. Please see MF-85.
-source_set("story_runner") {
-  sources = [
-    "link_impl.cc",
-    "link_impl.h",
-    "module_context_impl.cc",
-    "module_context_impl.h",
-    "module_controller_impl.cc",
-    "module_controller_impl.h",
-    "ongoing_activity_impl.cc",
-    "ongoing_activity_impl.h",
-    "story_controller_impl.cc",
-    "story_controller_impl.h",
-    "story_entity_provider.cc",
-    "story_entity_provider.h",
-    "story_provider_impl.cc",
-    "story_provider_impl.h",
-    "story_shell_context_impl.cc",
-    "story_shell_context_impl.h",
-  ]
-
-  public_deps = [
-    "//garnet/bin/ui/snapshot:snapshot_loader",
-    "//garnet/public/fidl/fuchsia.ui.policy",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/basemgr/cobalt",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/bin/sessionmgr:component_context",
-    "//peridot/bin/sessionmgr:focus",
-    "//peridot/bin/sessionmgr:presentation_provider",
-    "//peridot/bin/sessionmgr/agent_runner",
-    "//peridot/bin/sessionmgr/message_queue",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls:add_mod_call",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls:find_modules_call",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls:get_types_from_entity_call",
-    "//peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls:initialize_chain_call",
-    "//peridot/bin/sessionmgr/storage:constants_and_utils",
-    "//peridot/bin/sessionmgr/story/model",
-    "//peridot/bin/sessionmgr/story/systems:story_visibility_system",
-    "//peridot/lib/common:names",
-    "//peridot/lib/common:teardown",
-    "//peridot/lib/fidl:app_client",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:environment",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/fidl:proxy",
-    "//peridot/lib/ledger_client:operations",
-    "//peridot/lib/ledger_client:page_client",
-    "//peridot/lib/ledger_client:types",
-    "//peridot/lib/module_manifest:module_facet_reader",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/util",
-    "//peridot/lib/util:debug",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-    "//peridot/public/lib/async/cpp:future",
-    "//peridot/public/lib/async/cpp:operation",
-    "//peridot/public/lib/context/cpp:context_helper",
-    "//peridot/public/lib/entity/cpp:json",
-    "//peridot/public/lib/fostr/fidl/fuchsia.modular",
-  ]
-
-  deps = [
-    "//peridot/bin/sessionmgr/storage",
-    "//peridot/bin/sessionmgr/story:system",
-    "//peridot/bin/sessionmgr/story/model",
-    "//peridot/bin/sessionmgr/story/model:noop_story_model_storage",
-    "//peridot/bin/sessionmgr/story/model:story_model_owner",
-    "//peridot/lib/fidl:clone",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("dev_story_shell") {
-  meta = [
-    {
-      path = "meta/dev_story_shell.cmx"
-      dest = "dev_story_shell.cmx"
-    },
-  ]
-  sources = [
-    "dev_story_shell.cc",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:single_service_app",
-    "//peridot/lib/fidl:view_host",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable("story_controller_impl_unittest") {
-  testonly = true
-
-  sources = [
-    "story_controller_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":story_runner",
-    "//peridot/lib/fidl:clone",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-executable("link_impl_unittest") {
-  testonly = true
-
-  sources = [
-    "link_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":story_runner",
-    "//peridot/bin/sessionmgr/agent_runner",
-    "//peridot/lib/fidl:clone",
-    "//peridot/lib/testing:test_with_ledger",
-    "//peridot/public/lib/entity/cpp:json",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/sessionmgr/story_runner/README.md b/bin/sessionmgr/story_runner/README.md
deleted file mode 100644
index e0fc842..0000000
--- a/bin/sessionmgr/story_runner/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-NOTE: The contents of this directory will slowly migrate into:
-
-../story/model
-../story/system
-../story/fidl
-
-during the process of a refactor. Please avoid adding new contents
-here.
diff --git a/bin/sessionmgr/story_runner/dev_story_shell.cc b/bin/sessionmgr/story_runner/dev_story_shell.cc
deleted file mode 100644
index 3d1aca5..0000000
--- a/bin/sessionmgr/story_runner/dev_story_shell.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Implementation of the fuchsia::modular::StoryShell service that just lays out
-// the views of all modules side by side.
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/fidl/single_service_app.h"
-#include "peridot/lib/fidl/view_host.h"
-
-namespace {
-
-class DevStoryShellApp
-    : public modular::SingleServiceApp<fuchsia::modular::StoryShell> {
- public:
-  DevStoryShellApp(component::StartupContext* const startup_context)
-      : SingleServiceApp(startup_context) {}
-
-  ~DevStoryShellApp() override = default;
-
- private:
-  // |SingleServiceApp|
-  void CreateView(
-      zx::eventpair view_token,
-      fidl::InterfaceRequest<
-          fuchsia::sys::ServiceProvider> /*incoming_services*/,
-      fidl::InterfaceHandle<
-          fuchsia::sys::ServiceProvider> /*outgoing_services*/) override {
-    view_owner_request_ =
-        fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>(
-            zx::channel(view_token.release()));
-    Connect();
-  }
-
-  // |fuchsia::modular::StoryShell|
-  void Initialize(fidl::InterfaceHandle<fuchsia::modular::StoryShellContext>
-                      story_shell_context) override {
-    story_shell_context_.Bind(std::move(story_shell_context));
-    Connect();
-  }
-
-  // |fuchsia::modular::StoryShell|
-  void AddSurface(
-      fuchsia::modular::ViewConnection view_connection,
-      fuchsia::modular::SurfaceInfo /*surface_info*/) override {
-    if (view_) {
-      view_->ConnectView(std::move(view_connection.owner));
-    } else {
-      child_views_.push_back(std::move(view_connection.owner));
-    }
-  }
-
-  // |fuchsia::modular::StoryShell|
-  void FocusSurface(std::string /*surface_id*/) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void DefocusSurface(std::string /*surface_id*/,
-                   DefocusSurfaceCallback callback) override {
-    callback();
-  }
-
-  // |fuchsia::modular::StoryShell|
-  void AddContainer(
-      std::string /*container_name*/, fidl::StringPtr /*parent_id*/,
-      fuchsia::modular::SurfaceRelation /* relation */,
-      std::vector<fuchsia::modular::ContainerLayout> /*layout*/,
-      std::vector<
-          fuchsia::modular::ContainerRelationEntry> /* relationships */,
-      std::vector<fuchsia::modular::ContainerView> /* views */) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void RemoveSurface(std::string /*surface_id*/) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void ReconnectView(fuchsia::modular::ViewConnection view_connection) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void UpdateSurface(fuchsia::modular::ViewConnection view_connection,
-        fuchsia::modular::SurfaceInfo /*surface_info*/) override {};
-
-  void Connect() {
-    if (story_shell_context_.is_bound() && view_owner_request_) {
-      auto scenic =
-          startup_context()
-              ->ConnectToEnvironmentService<fuchsia::ui::scenic::Scenic>();
-      scenic::ViewContext view_context = {
-          .session_and_listener_request =
-              scenic::CreateScenicSessionPtrAndListenerRequest(scenic.get()),
-          .view_token =
-              zx::eventpair(view_owner_request_.TakeChannel().release()),
-          .startup_context = startup_context(),
-      };
-      view_ = std::make_unique<modular::ViewHost>(std::move(view_context));
-
-      for (auto& view_owner : child_views_) {
-        view_->ConnectView(std::move(view_owner));
-      }
-
-      child_views_.clear();
-    }
-  }
-
-  std::unique_ptr<modular::ViewHost> view_;
-  std::vector<fidl::InterfaceHandle<fuchsia::ui::viewsv1token::ViewOwner>>
-      child_views_;
-
-  fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-      view_owner_request_;
-  fuchsia::modular::StoryShellContextPtr story_shell_context_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(DevStoryShellApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AppDriver<DevStoryShellApp> driver(
-      context->outgoing().deprecated_services(),
-      std::make_unique<DevStoryShellApp>(context.get()),
-      [&loop] { loop.Quit(); });
-
-  loop.Run();
-  return 0;
-}
diff --git a/bin/sessionmgr/story_runner/link_impl.cc b/bin/sessionmgr/story_runner/link_impl.cc
deleted file mode 100644
index b81780d..0000000
--- a/bin/sessionmgr/story_runner/link_impl.cc
+++ /dev/null
@@ -1,250 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story_runner/link_impl.h"
-
-#include <functional>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/entity/cpp/json.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fostr/fidl/fuchsia/modular/formatting.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/lib/util/debug.h"
-
-using fuchsia::modular::LinkWatcherPtr;
-
-namespace modular {
-
-namespace {
-
-// Applies a JSON mutation operation using |apply_fn|. Its parameters are
-// references because we treat |apply_fn| as part of ApplyOp's body.
-void ApplyOp(
-    fidl::StringPtr* value_str, const std::vector<std::string>& path,
-    std::function<void(CrtJsonDoc& doc, CrtJsonPointer& pointer)> apply_fn) {
-  CrtJsonDoc value;
-  if (!value_str->is_null()) {
-    value.Parse(*value_str);
-  }
-  auto pointer = CreatePointer(value, path);
-  apply_fn(value, pointer);
-  *value_str = JsonValueToString(value);
-}
-
-bool ApplySetOp(fidl::StringPtr* value_str,
-                const fidl::VectorPtr<std::string>& path,
-                const fidl::StringPtr& new_value_at_path_str) {
-  CrtJsonDoc new_value_at_path;
-  new_value_at_path.Parse(new_value_at_path_str);
-  if (new_value_at_path.HasParseError()) {
-    return false;
-  }
-
-  auto apply_fn = [&new_value_at_path](CrtJsonDoc& doc, CrtJsonPointer& p) {
-    p.Set(doc, std::move(new_value_at_path));
-  };
-  ApplyOp(value_str, path, apply_fn);
-  return true;
-}
-
-void ApplyEraseOp(fidl::StringPtr* value_str,
-                  const std::vector<std::string>& path) {
-  auto apply_fn = [](CrtJsonDoc& doc, CrtJsonPointer& p) { p.Erase(doc); };
-  ApplyOp(value_str, path, apply_fn);
-}
-
-fuchsia::mem::Buffer StringToVmo(const std::string& string) {
-  fsl::SizedVmo vmo;
-  FXL_CHECK(fsl::VmoFromString(string, &vmo));
-  return std::move(vmo).ToTransport();
-}
-
-}  // namespace
-
-LinkImpl::LinkImpl(StoryStorage* const story_storage, LinkPath link_path)
-    : story_storage_(story_storage),
-      link_path_(std::move(link_path)),
-      weak_factory_(this),
-      link_watcher_auto_cancel_(nullptr) {
-  FXL_DCHECK(story_storage != nullptr);
-
-  // When |link_watcher_auto_cancel_| goes out of scope, |story_storage_| will
-  // stop calling OnLinkValueChanged.
-  link_watcher_auto_cancel_ = story_storage_->WatchLink(
-      link_path_, [this](const fidl::StringPtr& value, const void* context) {
-        OnLinkValueChanged(value, context);
-      });
-}
-
-LinkImpl::~LinkImpl() = default;
-
-void LinkImpl::Get(fidl::VectorPtr<std::string> path,
-                   GetCallback callback) {
-  // TODO: Need error reporting. MI4-1082
-  story_storage_->GetLinkValue(link_path_)
-      ->WeakMap(
-          GetWeakPtr(),
-          fxl::MakeCopyable([this /* for link_path_ */, path = std::move(path)](
-                                StoryStorage::Status status,
-                                fidl::StringPtr value) mutable {
-            if (status != StoryStorage::Status::OK) {
-              FXL_LOG(ERROR) << "Getting link " << link_path_
-                             << " failed: " << static_cast<int>(status);
-
-              return std::string("null");
-            }
-
-            else if (!path || path->empty()) {
-              // Common case requires no parsing of the JSON.
-              return *value;
-            } else {
-              // Extract just the |path| portion of the value.
-              CrtJsonDoc json;
-              json.Parse(value);
-              if (json.HasParseError()) {
-                return std::string("null");
-              }
-              auto& value_at_path = CreatePointer(json, *path)
-                                        .GetWithDefault(json, CrtJsonValue());
-              return JsonValueToString(value_at_path);
-            }
-          }))
-      ->WeakThen(GetWeakPtr(),
-                 [callback = std::move(callback)](std::string json) {
-                   fsl::SizedVmo vmo;
-                   FXL_CHECK(fsl::VmoFromString(json, &vmo));
-                   auto vmo_ptr = std::make_unique<fuchsia::mem::Buffer>(
-                       std::move(vmo).ToTransport());
-                   callback(std::move(vmo_ptr));
-                 });
-}
-
-void LinkImpl::Set(fidl::VectorPtr<std::string> path,
-                   fuchsia::mem::Buffer json) {
-  std::string json_string;
-  FXL_CHECK(fsl::StringFromVmo(json, &json_string));
-  Set(std::move(path), json_string);
-}
-
-void LinkImpl::Set(fidl::VectorPtr<std::string> path,
-                   const std::string& json) {
-  // TODO: Need error reporting. MI4-1082
-  story_storage_
-      ->UpdateLinkValue(
-          link_path_,
-          fxl::MakeCopyable([this /* for link_path_ */, path = std::move(path),
-                             json = std::move(json)](fidl::StringPtr* value) {
-            if (!ApplySetOp(value, path, json)) {
-              FXL_LOG(ERROR) << "LinkImpl.Set failed for link " << link_path_
-                             << " with json " << json;
-            }
-          }),
-          this /* context */)
-      ->Then([](StoryStorage::Status status) {
-        // TODO: Error reporting. MI4-1082
-      });
-}
-
-void LinkImpl::Erase(std::vector<std::string> path) {
-  // TODO: Need error reporting. MI4-1082
-  story_storage_
-      ->UpdateLinkValue(
-          link_path_,
-          fxl::MakeCopyable([this /* for link_path_ */,
-                             path = std::move(path)](fidl::StringPtr* value) {
-            ApplyEraseOp(value, path);
-          }),
-          this /* context */)
-      ->Then([](StoryStorage::Status status) {
-        // TODO: Error reporting. MI4-1082
-      });
-}
-
-void LinkImpl::GetEntity(GetEntityCallback callback) {
-  // TODO: Need error reporting. MI4-1082
-
-  story_storage_->GetLinkValue(link_path_)
-      ->WeakThen(GetWeakPtr(), [this, callback](StoryStorage::Status status,
-                                                fidl::StringPtr value) {
-        if (status != StoryStorage::Status::OK) {
-          FXL_LOG(ERROR) << "Getting link " << link_path_
-                         << " failed: " << static_cast<int>(status);
-          callback(nullptr);
-        }
-        // Convert the contents to an Entity reference, if possible.
-        std::string ref;
-        if (!EntityReferenceFromJson(value, &ref)) {
-          FXL_LOG(ERROR) << "Link value for " << link_path_
-                         << " is not an entity reference.";
-          callback(nullptr);
-          return;
-        }
-
-        callback(ref);
-      });
-}
-
-void LinkImpl::SetEntity(fidl::StringPtr entity_reference) {
-  // SetEntity() is just a variation on Set(), so delegate to Set().
-  Set(nullptr, EntityReferenceToJson(entity_reference));
-}
-
-void LinkImpl::Sync(SyncCallback callback) {
-  story_storage_->Sync()->WeakThen(GetWeakPtr(), callback);
-}
-
-void LinkImpl::OnLinkValueChanged(const fidl::StringPtr& value,
-                                  const void* context) {
-  // If context == this, the change came from us. Otherwise, it either came
-  // from a different LinkImpl (in which case context != nullptr), or a
-  // different StoryStorage altogether (even on a different device).
-  if (context != this) {
-    for (auto& dst : normal_watchers_.ptrs()) {
-      (*dst)->Notify(StringToVmo(value));
-    }
-  }
-
-  // No matter what, everyone in |everything_watchers_| sees everything.
-  for (auto& dst : everything_watchers_.ptrs()) {
-    (*dst)->Notify(StringToVmo(value));
-  }
-}
-
-void LinkImpl::Watch(fidl::InterfaceHandle<LinkWatcher> watcher) {
-  // Move |watcher| into the callback for Get(): we are guaranteed
-  // that no other operation will run on |story_storage_| until our callback
-  // is complete, which means the next mutation that happens will be sent to
-  // |watcher|.
-  Get(nullptr, fxl::MakeCopyable(
-                   [this, watcher = std::move(watcher)](
-                       std::unique_ptr<fuchsia::mem::Buffer> value) mutable {
-                     auto ptr = watcher.Bind();
-                     ptr->Notify(std::move(*value));
-                     normal_watchers_.AddInterfacePtr(std::move(ptr));
-                   }));
-}
-
-void LinkImpl::WatchAll(
-    fidl::InterfaceHandle<fuchsia::modular::LinkWatcher> watcher) {
-  Get(nullptr, fxl::MakeCopyable(
-                   [this, watcher = std::move(watcher)](
-                       std::unique_ptr<fuchsia::mem::Buffer> value) mutable {
-                     auto ptr = watcher.Bind();
-                     ptr->Notify(std::move(*value));
-                     everything_watchers_.AddInterfacePtr(std::move(ptr));
-                   }));
-}
-
-fxl::WeakPtr<LinkImpl> LinkImpl::GetWeakPtr() {
-  return weak_factory_.GetWeakPtr();
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story_runner/link_impl.h b/bin/sessionmgr/story_runner/link_impl.h
deleted file mode 100644
index 8afbb87..0000000
--- a/bin/sessionmgr/story_runner/link_impl.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_LINK_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_LINK_IMPL_H_
-
-#include <set>
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/modular/internal/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fidl/cpp/interface_ptr.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_client.h"
-#include "peridot/lib/ledger_client/types.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-
-using fuchsia::modular::Link;
-using fuchsia::modular::LinkPath;
-using fuchsia::modular::LinkWatcher;
-
-namespace modular {
-
-class StoryStorage;
-
-// Use the CrtAllocator and not the pool allocator so that merging doesn't
-// require deep copying.
-using CrtJsonDoc =
-    rapidjson::GenericDocument<rapidjson::UTF8<>, rapidjson::CrtAllocator>;
-using CrtJsonValue = CrtJsonDoc::ValueType;
-using CrtJsonPointer = rapidjson::GenericPointer<CrtJsonValue>;
-
-// A Link is a mutable and observable value that is persistent across story
-// restarts, synchronized across devices, and can be shared between modules.
-//
-// When a module requests to run more modules using
-// ModuleContext::StartModule(), one or more Link instances are associated with
-// each such request (as specified in the Intent). Link instances can be shared
-// between multiple modules. The same Link instance can be used in multiple
-// StartModule() requests, so it can be shared between more than two modules.
-// Link instances have names that are local to each Module, and can be accessed
-// by calling ModuleContext.GetLink(name).
-//
-// If a watcher is registered through one handle using the Watch() method, it
-// only receives notifications for changes by requests through other handles.
-class LinkImpl : public Link {
- public:
-  // The |link_path| contains the series of module names (where the last
-  // element is the module that created this Link) that this Link is namespaced
-  // under. If |create_link_info| is null, then this is a request to connect to
-  // an existing link.
-  LinkImpl(StoryStorage* story_storage, LinkPath link_path);
-
-  ~LinkImpl() override;
-
-  void Set(fidl::VectorPtr<std::string> path,
-           fuchsia::mem::Buffer json) override;
-  void Get(fidl::VectorPtr<std::string> path,
-           GetCallback callback) override;
-  void Erase(std::vector<std::string> path) override;
-  void GetEntity(GetEntityCallback callback) override;
-  void SetEntity(fidl::StringPtr entity_reference) override;
-  void Watch(fidl::InterfaceHandle<LinkWatcher> watcher) override;
-  void WatchAll(fidl::InterfaceHandle<LinkWatcher> watcher) override;
-  void Sync(SyncCallback callback) override;
-
-  // Used by StoryControllerImpl;
-  const LinkPath& link_path() const { return link_path_; }
-
- private:
-  // Called by |story_storage_|.
-  void OnLinkValueChanged(const fidl::StringPtr& value, const void* context);
-
-  // Convenience method which interacts with the story storage.
-  void Set(fidl::VectorPtr<std::string> path, const std::string& json);
-
-  fxl::WeakPtr<LinkImpl> GetWeakPtr();
-
-  StoryStorage* const story_storage_;
-  const LinkPath link_path_;
-
-  // Bindings as a result from Watch() are stored in |normal_watchers_|, while
-  // calls to WatchAll() are stored in |everything_watchers_|. They are separate
-  // because Watch() bindings ignore any change notifications that originated
-  // on this instance of LinkImpl.
-  fidl::InterfacePtrSet<LinkWatcher> normal_watchers_;
-  fidl::InterfacePtrSet<LinkWatcher> everything_watchers_;
-
-  fxl::WeakPtrFactory<LinkImpl> weak_factory_;
-  StoryStorage::LinkWatcherAutoCancel link_watcher_auto_cancel_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LinkImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_LINK_IMPL_H_
diff --git a/bin/sessionmgr/story_runner/link_impl_unittest.cc b/bin/sessionmgr/story_runner/link_impl_unittest.cc
deleted file mode 100644
index e23a838..0000000
--- a/bin/sessionmgr/story_runner/link_impl_unittest.cc
+++ /dev/null
@@ -1,300 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story_runner/link_impl.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/entity/cpp/json.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/fidl/json_xdr.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_client.h"
-#include "peridot/lib/ledger_client/page_id.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/lib/testing/test_with_ledger.h"
-
-using fuchsia::modular::CreateLinkInfo;
-using fuchsia::modular::CreateLinkInfoPtr;
-using fuchsia::modular::Link;
-using fuchsia::modular::LinkPath;
-using fuchsia::modular::LinkPtr;
-using fuchsia::modular::LinkWatcher;
-using fuchsia::modular::LinkWatcherPtr;
-
-namespace modular {
-namespace {
-
-class TestLinkWatcher : public LinkWatcher {
- public:
-  TestLinkWatcher(std::function<void(fidl::StringPtr)> fn) : fn_(fn) {}
-
- private:
-  void Notify(fuchsia::mem::Buffer json) override {
-    std::string json_string;
-    FXL_CHECK(fsl::StringFromVmo(json, &json_string));
-    fn_(json_string);
-  }
-
-  std::function<void(fidl::StringPtr)> fn_;
-};
-
-class LinkImplTest : public testing::TestWithLedger {
- public:
-  std::unique_ptr<StoryStorage> MakeStorage(std::string ledger_page) {
-    auto page_id = MakePageId(ledger_page);
-    return std::make_unique<StoryStorage>(ledger_client(), page_id);
-  }
-
-  LinkPtr MakeLink(StoryStorage* const storage, std::string name) {
-    LinkPath link_path;
-    link_path.link_name = name;
-
-    LinkPtr ptr;
-    auto impl = std::make_unique<LinkImpl>(storage, std::move(link_path));
-    links_.AddBinding(std::move(impl), ptr.NewRequest());
-    return ptr;
-  }
-
-  void Watch(Link* link, std::function<void(fidl::StringPtr)> fn) {
-    auto watcher = std::make_unique<TestLinkWatcher>(fn);
-    LinkWatcherPtr ptr;
-    watchers_.AddBinding(std::move(watcher), ptr.NewRequest());
-    link->Watch(std::move(ptr));
-  }
-
-  void WatchAll(Link* link, std::function<void(fidl::StringPtr)> fn) {
-    auto watcher = std::make_unique<TestLinkWatcher>(fn);
-    LinkWatcherPtr ptr;
-    watchers_.AddBinding(std::move(watcher), ptr.NewRequest());
-    link->WatchAll(std::move(ptr));
-  }
-
-  void SetLink(Link* link, std::vector<std::string> path,
-               const std::string& value) {
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(value, &vmo));
-    link->Set(fidl::VectorPtr(std::move(path)), std::move(vmo).ToTransport());
-  }
-
-  fidl::BindingSet<Link, std::unique_ptr<LinkImpl>> links_;
-  fidl::BindingSet<LinkWatcher, std::unique_ptr<TestLinkWatcher>> watchers_;
-};
-
-TEST_F(LinkImplTest, GetNull) {
-  auto storage = MakeStorage("page");
-  auto link = MakeLink(storage.get(), "foo");
-
-  bool get_done{};
-  link->Get(nullptr /* path */,
-            [&](std::unique_ptr<fuchsia::mem::Buffer> value) {
-              std::string content_string;
-              FXL_CHECK(fsl::StringFromVmo(*value, &content_string));
-              get_done = true;
-              EXPECT_EQ("null", content_string);
-            });
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&] { return get_done; }));
-
-  get_done = false;
-  fidl::VectorPtr<std::string> path;
-  path->push_back("one");
-  link->Get(std::move(path), [&](std::unique_ptr<fuchsia::mem::Buffer> value) {
-    std::string content_string;
-    FXL_CHECK(fsl::StringFromVmo(*value, &content_string));
-    get_done = true;
-    EXPECT_EQ("null", content_string);
-  });
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&] { return get_done; }));
-}
-
-TEST_F(LinkImplTest, WatchDefaultBehavior) {
-  // When we ask to watch a link, we should be notified immediately (on the
-  // next iteration of the event loop) of its current value.
-  auto storage = MakeStorage("page");
-  auto link = MakeLink(storage.get(), "mylink");
-
-  int notified_count{0};
-  Watch(link.get(), [&](const fidl::StringPtr& value) {
-    ++notified_count;
-    EXPECT_EQ("null", value);
-  });
-  // We are only notified after the event loop runs.
-  EXPECT_EQ(0, notified_count);
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&] { return notified_count == 1; }));
-
-  // Same for WatchAll.
-  WatchAll(link.get(), [&](const fidl::StringPtr& value) {
-    ++notified_count;
-    EXPECT_EQ("null", value);
-  });
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&] { return notified_count == 2; }));
-}
-
-TEST_F(LinkImplTest, SetAndWatch) {
-  auto storage = MakeStorage("page");
-  auto link = MakeLink(storage.get(), "mylink");
-
-  // Watch for our own changes, which we shouldn't see. The initial value
-  // ("null"), is sent immediately, though.
-  Watch(link.get(),
-        [&](const fidl::StringPtr& value) { EXPECT_EQ("null", value); });
-
-  // Also use WatchAll(), on which we should see our own changes.
-  fidl::StringPtr notified_value;
-  int notified_count{0};
-  WatchAll(link.get(), [&](const fidl::StringPtr& value) {
-    notified_value = value;
-    ++notified_count;
-  });
-
-  SetLink(link.get(), {}, "42");
-
-  bool synced{};
-  link->Sync([&synced] { synced = true; });
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&synced] { return synced; }));
-
-  EXPECT_EQ(2, notified_count);
-  EXPECT_EQ("42", notified_value);
-}
-
-TEST_F(LinkImplTest, SetAndWatchAndGet) {
-  auto storage = MakeStorage("page");
-  auto link = MakeLink(storage.get(), "mylink");
-
-  fidl::StringPtr notified_value;
-  int notified_count{0};
-  WatchAll(link.get(), [&](const fidl::StringPtr& value) {
-    notified_value = value;
-    ++notified_count;
-  });
-
-  SetLink(link.get(), {}, R"({
-    "one": 1,
-    "two": 2
-  })");
-  fidl::VectorPtr<std::string> path;
-  path->push_back("two");
-  SetLink(link.get(), std::move(path), R"("two")");
-
-  path->clear();
-  path->push_back("three");
-  SetLink(link.get(), std::move(path), R"(3)");
-
-  bool synced{};
-  link->Sync([&synced] { synced = true; });
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&] { return synced; }));
-
-  const std::string expected_value = R"({"one":1,"two":"two","three":3})";
-  EXPECT_EQ(4, notified_count);  // initial, 3x Set
-  EXPECT_EQ(expected_value, notified_value);
-
-  bool get_done{};
-  link->Get(nullptr /* path */,
-            [&](std::unique_ptr<fuchsia::mem::Buffer> value) {
-              std::string content_string;
-              FXL_CHECK(fsl::StringFromVmo(*value, &content_string));
-              get_done = true;
-              EXPECT_EQ(expected_value, content_string);
-            });
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&] { return get_done; }));
-}
-
-TEST_F(LinkImplTest, SetNonJsonAndGetJsonPointer) {
-  auto storage = MakeStorage("page");
-  auto link = MakeLink(storage.get(), "mylink");
-
-  SetLink(link.get(), {}, R"({
-    "one": 1,
-    "two": 2invalidjson
-  })");
-
-  bool synced{};
-  link->Sync([&synced] { synced = true; });
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&] { return synced; }));
-
-  fidl::VectorPtr<std::string> path;
-  path->push_back("one");
-  bool get_done{};
-  link->Get(std::move(path), [&](std::unique_ptr<fuchsia::mem::Buffer> value) {
-    std::string content_string;
-    FXL_CHECK(fsl::StringFromVmo(*value, &content_string));
-    get_done = true;
-    EXPECT_EQ("null", content_string);
-  });
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&] { return get_done; }));
-}
-
-TEST_F(LinkImplTest, Erase) {
-  auto storage = MakeStorage("page");
-  auto link = MakeLink(storage.get(), "mylink");
-
-  SetLink(link.get(), {}, R"({
-    "one": 1,
-    "two": 2
-  })");
-  std::vector<std::string> path;
-  path.push_back("two");
-  link->Erase(std::move(path));
-
-  const std::string expected_value = R"({"one":1})";
-  bool get_done{};
-  link->Get(nullptr /* path */,
-            [&](std::unique_ptr<fuchsia::mem::Buffer> value) {
-              std::string content_string;
-              FXL_CHECK(fsl::StringFromVmo(*value, &content_string));
-              get_done = true;
-              EXPECT_EQ(expected_value, content_string);
-            });
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&] { return get_done; }));
-}
-
-TEST_F(LinkImplTest, SetAndGetEntity) {
-  auto storage = MakeStorage("page");
-  auto link = MakeLink(storage.get(), "mylink");
-
-  link->SetEntity("ref");
-  bool done{};
-  link->GetEntity([&](const fidl::StringPtr value) {
-    EXPECT_EQ("ref", value);
-    done = true;
-  });
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&] { return done; }));
-}
-
-TEST_F(LinkImplTest, MultipleConnections) {
-  // Create two storage instances, where each one gets its own connection to
-  // the Ledger. Then, create a LinkImpl on top of each, and test end-to-end.
-  auto storage1 = MakeStorage("page");
-  auto link1 = MakeLink(storage1.get(), "mylink");
-
-  auto storage2 = MakeStorage("page");
-  auto link2 = MakeLink(storage2.get(), "mylink");
-
-  int notified_count{0};
-  fidl::StringPtr last_value;
-  WatchAll(link1.get(), [&](const fidl::StringPtr& value) {
-    ++notified_count;
-    last_value = value;
-  });
-
-  // Set two values on |link2|. On |link1|, we are guaranteed to get a
-  // notification about the second value, eventually.
-  SetLink(link2.get(), {}, "3");
-  SetLink(link2.get(), {}, "4");
-  EXPECT_TRUE(RunLoopWithTimeoutOrUntil([&] { return last_value == "4"; }));
-  // There is always an initial notification of the current state, so we
-  // will have been notified either 2 or 3 times: 2 if we only got a
-  // notification about the set to "4", and 3 if we got both the set to "3" and
-  // "4".
-  EXPECT_TRUE(notified_count == 2 || notified_count == 3) << notified_count;
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/story_runner/meta/dev_story_shell.cmx b/bin/sessionmgr/story_runner/meta/dev_story_shell.cmx
deleted file mode 100644
index 04707e9..0000000
--- a/bin/sessionmgr/story_runner/meta/dev_story_shell.cmx
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.sys.Launcher",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager"
-        ]
-    }
-}
diff --git a/bin/sessionmgr/story_runner/meta/link_impl_unittest.cmx b/bin/sessionmgr/story_runner/meta/link_impl_unittest.cmx
deleted file mode 100644
index e20c62c..0000000
--- a/bin/sessionmgr/story_runner/meta/link_impl_unittest.cmx
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "program": {
-    "binary": "test/link_impl_unittest"
-  },
-  "sandbox": {
-    "services": [
-      "fuchsia.sys.Launcher"
-    ]
-  }
-}
diff --git a/bin/sessionmgr/story_runner/meta/story_controller_impl_unittest.cmx b/bin/sessionmgr/story_runner/meta/story_controller_impl_unittest.cmx
deleted file mode 100644
index 37abc5e..0000000
--- a/bin/sessionmgr/story_runner/meta/story_controller_impl_unittest.cmx
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "program": {
-    "binary": "test/story_controller_impl_unittest"
-  },
-  "sandbox": {
-    "services": []
-  }
-}
diff --git a/bin/sessionmgr/story_runner/module_context_impl.cc b/bin/sessionmgr/story_runner/module_context_impl.cc
deleted file mode 100644
index ff78b8d..0000000
--- a/bin/sessionmgr/story_runner/module_context_impl.cc
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story_runner/module_context_impl.h"
-
-#include <string>
-
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/strings/join_strings.h>
-
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/bin/sessionmgr/story/systems/story_visibility_system.h"
-#include "peridot/bin/sessionmgr/story_runner/story_controller_impl.h"
-#include "peridot/lib/fidl/clone.h"
-
-namespace modular {
-
-ModuleContextImpl::ModuleContextImpl(
-    const ModuleContextInfo& info,
-    const fuchsia::modular::ModuleData* const module_data,
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-        service_provider_request)
-    : module_data_(module_data),
-      story_controller_impl_(info.story_controller_impl),
-      story_visibility_system_(info.story_visibility_system),
-      component_context_impl_(info.component_context_info,
-                              EncodeModuleComponentNamespace(
-                                  info.story_controller_impl->GetStoryId()),
-                              EncodeModulePath(module_data_->module_path),
-                              module_data_->module_url),
-      user_intelligence_provider_(info.user_intelligence_provider) {
-  service_provider_impl_.AddService<fuchsia::modular::ComponentContext>(
-      [this](
-          fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request) {
-        component_context_impl_.Connect(std::move(request));
-      });
-  service_provider_impl_.AddService<fuchsia::modular::ModuleContext>(
-      [this](fidl::InterfaceRequest<fuchsia::modular::ModuleContext> request) {
-        bindings_.AddBinding(this, std::move(request));
-      });
-  service_provider_impl_.AddService<fuchsia::modular::IntelligenceServices>(
-      [this](fidl::InterfaceRequest<fuchsia::modular::IntelligenceServices>
-                 request) {
-        auto module_scope = fuchsia::modular::ModuleScope::New();
-        module_scope->module_path = module_data_->module_path;
-        module_scope->url = module_data_->module_url;
-        module_scope->story_id = story_controller_impl_->GetStoryId();
-
-        auto scope = fuchsia::modular::ComponentScope::New();
-        scope->set_module_scope(std::move(*module_scope));
-        user_intelligence_provider_->GetComponentIntelligenceServices(
-            std::move(*scope), std::move(request));
-      });
-  service_provider_impl_.AddBinding(std::move(service_provider_request));
-}
-
-ModuleContextImpl::~ModuleContextImpl() {}
-
-void ModuleContextImpl::GetLink(
-    fidl::StringPtr name,
-    fidl::InterfaceRequest<fuchsia::modular::Link> request) {
-  fuchsia::modular::LinkPathPtr link_path;
-  // See if there's a parameter mapping for this link.
-  link_path = story_controller_impl_->GetLinkPathForParameterName(
-      module_data_->module_path, name);
-  story_controller_impl_->ConnectLinkPath(std::move(link_path),
-                                          std::move(request));
-}
-
-void ModuleContextImpl::EmbedModule(
-    std::string name, fuchsia::modular::Intent intent,
-    fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-        module_controller,
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> view_owner,
-    EmbedModuleCallback callback) {
-  AddModParams params;
-  params.parent_mod_path = module_data_->module_path;
-  params.mod_name = name;
-  params.intent = std::move(intent);
-  params.module_source = fuchsia::modular::ModuleSource::INTERNAL;
-  params.surface_relation = nullptr;
-  params.is_embedded = true;
-  story_controller_impl_->EmbedModule(std::move(params),
-                                      std::move(module_controller),
-                                      std::move(view_owner), callback);
-}
-
-void ModuleContextImpl::AddModuleToStory(
-    std::string name, fuchsia::modular::Intent intent,
-    fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-        module_controller,
-    fuchsia::modular::SurfaceRelationPtr surface_relation,
-    AddModuleToStoryCallback callback) {
-  AddModParams params;
-  params.parent_mod_path = module_data_->module_path;
-  params.mod_name = name;
-  params.intent = std::move(intent);
-  params.module_source = fuchsia::modular::ModuleSource::INTERNAL;
-  params.surface_relation = std::move(surface_relation);
-  params.is_embedded = false;
-  story_controller_impl_->AddModuleToStory(
-      std::move(params), std::move(module_controller), callback);
-}
-
-void ModuleContextImpl::StartContainerInShell(
-    std::string name, fuchsia::modular::SurfaceRelation parent_relation,
-    std::vector<fuchsia::modular::ContainerLayout> layout,
-    std::vector<fuchsia::modular::ContainerRelationEntry> relationships,
-    std::vector<fuchsia::modular::ContainerNode> nodes) {
-  FXL_LOG(ERROR) << "ModuleContext.StartContainerInShell() not implemented.";
-}
-
-void ModuleContextImpl::GetComponentContext(
-    fidl::InterfaceRequest<fuchsia::modular::ComponentContext>
-        context_request) {
-  component_context_impl_.Connect(std::move(context_request));
-}
-
-void ModuleContextImpl::GetStoryId(GetStoryIdCallback callback) {
-  callback(story_controller_impl_->GetStoryId());
-}
-
-void ModuleContextImpl::RequestFocus() {
-  story_controller_impl_->FocusModule(module_data_->module_path);
-  story_controller_impl_->RequestStoryFocus();
-}
-
-void ModuleContextImpl::Active() {}
-
-void ModuleContextImpl::RemoveSelfFromStory() {
-  story_controller_impl_->RemoveModuleFromStory(module_data_->module_path);
-}
-
-void ModuleContextImpl::RequestStoryVisibilityState(
-    fuchsia::modular::StoryVisibilityState visibility_state) {
-  story_visibility_system_->RequestStoryVisibilityStateChange(visibility_state);
-}
-
-void ModuleContextImpl::StartOngoingActivity(
-    fuchsia::modular::OngoingActivityType ongoing_activity_type,
-    fidl::InterfaceRequest<fuchsia::modular::OngoingActivity> request) {
-  story_controller_impl_->StartOngoingActivity(ongoing_activity_type,
-                                               std::move(request));
-}
-
-void ModuleContextImpl::CreateEntity(
-    std::string type, fuchsia::mem::Buffer data,
-    fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request,
-    CreateEntityCallback callback) {
-  story_controller_impl_->CreateEntity(
-      type, std::move(data), std::move(entity_request), std::move(callback));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story_runner/module_context_impl.h b/bin/sessionmgr/story_runner/module_context_impl.h
deleted file mode 100644
index 35cb4ca..0000000
--- a/bin/sessionmgr/story_runner/module_context_impl.h
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_MODULE_CONTEXT_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_MODULE_CONTEXT_IMPL_H_
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/component/cpp/service_provider_impl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/sessionmgr/component_context_impl.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.h"
-
-namespace modular {
-
-class StoryControllerImpl;
-class StoryVisibilitySystem;
-
-// The dependencies of ModuleContextImpl common to all instances.
-struct ModuleContextInfo {
-  const ComponentContextInfo component_context_info;
-  StoryControllerImpl* const story_controller_impl;
-  StoryVisibilitySystem* const story_visibility_system;
-  fuchsia::modular::UserIntelligenceProvider* const user_intelligence_provider;
-};
-
-// ModuleContextImpl keeps a single connection from a module instance in
-// the story to a StoryControllerImpl. This way, requests that the module makes
-// on its Story handle can be associated with the Module instance.
-class ModuleContextImpl : fuchsia::modular::ModuleContext {
- public:
-  // |module_data| identifies this particular module instance using the path of
-  // modules that have ended up starting this module in the module_path
-  // property. The last item in this list is this module's name. |module_path|
-  // can be used to internally name resources that belong to this module
-  // (message queues, Links).
-  ModuleContextImpl(const ModuleContextInfo& info,
-                    const fuchsia::modular::ModuleData* module_data,
-                    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-                        service_provider_request);
-
-  ~ModuleContextImpl() override;
-
- private:
-  // |fuchsia::modular::ModuleContext|
-  void GetLink(fidl::StringPtr name,
-               fidl::InterfaceRequest<fuchsia::modular::Link> request) override;
-
-  // |fuchsia::modular::ModuleContext|
-  void EmbedModule(
-      std::string name, fuchsia::modular::Intent intent,
-      fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-          module_controller,
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> view_owner,
-      EmbedModuleCallback callback) override;
-
-  // |fuchsia::modular::ModuleContext|
-  void AddModuleToStory(
-      std::string name, fuchsia::modular::Intent intent,
-      fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-          module_controller,
-      fuchsia::modular::SurfaceRelationPtr surface_relation,
-      AddModuleToStoryCallback callback) override;
-
-  // |fuchsia::modular::ModuleContext|
-  void StartContainerInShell(
-      std::string name, fuchsia::modular::SurfaceRelation parent_relation,
-      std::vector<fuchsia::modular::ContainerLayout> layout,
-      std::vector<fuchsia::modular::ContainerRelationEntry> relationships,
-      std::vector<fuchsia::modular::ContainerNode> nodes) override;
-
-  // |fuchsia::modular::ModuleContext|
-  void GetComponentContext(
-      fidl::InterfaceRequest<fuchsia::modular::ComponentContext>
-          context_request) override;
-
-  // |fuchsia::modular::ModuleContext|
-  void GetStoryId(GetStoryIdCallback callback) override;
-
-  // |fuchsia::modular::ModuleContext|
-  void RequestFocus() override;
-
-  // |fuchsia::modular::ModuleContext|
-  void Active() override;
-
-  // |fuchsia::modular::ModuleContext|
-  void RemoveSelfFromStory() override;
-
-  // |fuchsia::modular::ModuleContext|
-  void RequestStoryVisibilityState(
-      fuchsia::modular::StoryVisibilityState visibility_state) override;
-
-  // |fuchsia::modular::ModuleContext|
-  void StartOngoingActivity(
-      fuchsia::modular::OngoingActivityType ongoing_activity_type,
-      fidl::InterfaceRequest<fuchsia::modular::OngoingActivity> request)
-      override;
-
-  // |fuchsia::modular::ModuleContext|
-  void CreateEntity(
-      std::string type, fuchsia::mem::Buffer data,
-      fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request,
-      CreateEntityCallback callback) override;
-
-  // Identifies the module by its path, holds the URL of the running module, and
-  // the link it was started with.
-  const fuchsia::modular::ModuleData* const module_data_;
-
-  // Not owned. The StoryControllerImpl for the Story in which this Module
-  // lives.
-  StoryControllerImpl* const story_controller_impl_;
-
-  StoryVisibilitySystem* const story_visibility_system_;  // Not owned.
-
-  ComponentContextImpl component_context_impl_;
-
-  fuchsia::modular::UserIntelligenceProvider* const
-      user_intelligence_provider_;  // Not owned
-
-  fidl::BindingSet<fuchsia::modular::ModuleContext> bindings_;
-
-  // A service provider that represents the services to be added into an
-  // application's namespace.
-  component::ServiceProviderImpl service_provider_impl_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ModuleContextImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_MODULE_CONTEXT_IMPL_H_
diff --git a/bin/sessionmgr/story_runner/module_controller_impl.cc b/bin/sessionmgr/story_runner/module_controller_impl.cc
deleted file mode 100644
index 97efddd..0000000
--- a/bin/sessionmgr/story_runner/module_controller_impl.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story_runner/module_controller_impl.h"
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fidl/cpp/interface_ptr.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/time/time_delta.h>
-
-#include "peridot/bin/sessionmgr/story_runner/story_controller_impl.h"
-#include "peridot/lib/common/teardown.h"
-#include "peridot/lib/fidl/clone.h"
-
-namespace modular {
-
-constexpr char kAppStoragePath[] = "/data/APP_DATA";
-
-namespace {
-
-// A stopgap solution to map a module's url to a directory name where the
-// module's /data is mapped. We need three properties here - (1) two module urls
-// that are the same get mapped to the same hash, (2) two modules urls that are
-// different don't get the same name (with very high probability) and (3) the
-// name is visually inspectable.
-std::string HashModuleUrl(const std::string& module_url) {
-  std::size_t found = module_url.find_last_of('/');
-  auto last_part =
-      found == module_url.length() - 1 ? "" : module_url.substr(found + 1);
-  return std::to_string(std::hash<std::string>{}(module_url)) + last_part;
-}
-
-};  // namespace
-
-ModuleControllerImpl::ModuleControllerImpl(
-    StoryControllerImpl* const story_controller_impl,
-    fuchsia::sys::Launcher* const launcher,
-    fuchsia::modular::AppConfig module_config,
-    const fuchsia::modular::ModuleData* const module_data,
-    fuchsia::sys::ServiceListPtr service_list,
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-        view_provider_request)
-    : story_controller_impl_(story_controller_impl),
-      app_client_(
-          launcher, CloneStruct(module_config),
-          std::string(kAppStoragePath) + HashModuleUrl(module_config.url),
-          std::move(service_list)),
-      module_data_(module_data) {
-  app_client_.SetAppErrorHandler([this] { OnAppConnectionError(); });
-  app_client_.services().ConnectToService(std::move(view_provider_request));
-}
-
-ModuleControllerImpl::~ModuleControllerImpl() {}
-
-void ModuleControllerImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::ModuleController> request) {
-  module_controller_bindings_.AddBinding(this, std::move(request));
-  // Notify of initial state on connection.
-  NotifyStateChange();
-}
-
-// If the ComponentController connection closes, it means the module cannot be
-// started. We indicate this by the ERROR state.
-void ModuleControllerImpl::OnAppConnectionError() {
-  SetState(fuchsia::modular::ModuleState::ERROR);
-}
-
-void ModuleControllerImpl::SetState(
-    const fuchsia::modular::ModuleState new_state) {
-  if (state_ == new_state) {
-    return;
-  }
-
-  state_ = new_state;
-  NotifyStateChange();
-}
-
-void ModuleControllerImpl::Teardown(std::function<void()> done) {
-  teardown_done_callbacks_.push_back(done);
-
-  if (teardown_done_callbacks_.size() != 1) {
-    // Not the first request, Stop() in progress.
-    return;
-  }
-
-  auto cont = [this] {
-    SetState(fuchsia::modular::ModuleState::STOPPED);
-
-    // We take ownership of *this from |story_controller_impl_| so that
-    // teardown happens in StoryControllerImpl but *this is still alive when we
-    // call |teardown_done_callbacks_|. One or more of the callbacks may be a
-    // result callback for fuchsia::modular::ModuleController::Stop() and since
-    // *this owns the fidl::Binding for the channel on which the result message
-    // will be sent, it must be alive when the message is posted.
-    // TODO(thatguy,mesch): This point is reachable from two distinct
-    // code-paths: originating from ModuleControllerImpl::Stop() or
-    // StoryControllerImpl::Stop(). It is not clear whether ReleaseModule()
-    // must be called *before* these done callbacks are called, or whether we
-    // can move this call below the loop and have ReleaseModule also delete
-    // *this.
-    story_controller_impl_->ReleaseModule(this);
-
-    for (auto& done : teardown_done_callbacks_) {
-      done();
-    }
-
-    // |this| must be deleted after the callbacks so that the |done()| calls
-    // above can be dispatched while the bindings still exist in case they are
-    // FIDL method callbacks.
-    //
-    // The destructor of |this| deletes |app_client_|, which will kill the
-    // related application if it's still running.
-    delete this;
-  };
-
-  // At this point, it's no longer an error if the module closes its
-  // connection, or the application exits.
-  app_client_.SetAppErrorHandler(nullptr);
-
-  // Tear down the module application through the normal procedure with timeout.
-  app_client_.Teardown(kBasicTimeout, cont);
-}
-
-void ModuleControllerImpl::Focus() {
-  story_controller_impl_->FocusModule(module_data_->module_path);
-}
-
-void ModuleControllerImpl::Defocus() {
-  story_controller_impl_->DefocusModule(module_data_->module_path);
-}
-
-void ModuleControllerImpl::Stop(StopCallback done) {
-  story_controller_impl_->StopModule(module_data_->module_path, done);
-}
-
-void ModuleControllerImpl::NotifyStateChange() {
-  for (auto& binding : module_controller_bindings_.bindings()) {
-    binding->events().OnStateChange(state_);
-  }
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story_runner/module_controller_impl.h b/bin/sessionmgr/story_runner/module_controller_impl.h
deleted file mode 100644
index 62a2333..0000000
--- a/bin/sessionmgr/story_runner/module_controller_impl.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_MODULE_CONTROLLER_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_MODULE_CONTROLLER_IMPL_H_
-
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fidl/cpp/interface_ptr.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/fidl/app_client.h"
-
-namespace modular {
-
-class StoryControllerImpl;
-
-// Implements the fuchsia::modular::ModuleController interface, which is given
-// to the client that called
-// fuchsia::modular::ModuleContext.(Start|Embed)Module(). Exactly one
-// ModuleControllerImpl instance is associated with each
-// ModuleContextImpl instance.
-class ModuleControllerImpl : fuchsia::modular::ModuleController {
- public:
-  ModuleControllerImpl(
-      StoryControllerImpl* story_controller_impl,
-      fuchsia::sys::Launcher* launcher,
-      fuchsia::modular::AppConfig module_config,
-      const fuchsia::modular::ModuleData* module_data,
-      fuchsia::sys::ServiceListPtr service_list,
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-          view_provider_request);
-
-  ~ModuleControllerImpl() override;
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::ModuleController> request);
-
-  // Notifies of a state change of the module.
-  void SetState(fuchsia::modular::ModuleState new_state);
-
-  // Calls Teardown() on the AppClient of the module component instance,
-  // notifies state change, then ReleaseModule()s the connection and finally
-  // calls |done|.
-  //
-  // Multiple calls to Teardown() are allowed, and all |done| callbacks are run
-  // in order when teardown is complete.
-  void Teardown(std::function<void()> done);
-
-  component::Services& services() { return app_client_.services(); }
-
- private:
-  // |fuchsia::modular::ModuleController|
-  void Focus() override;
-
-  // |fuchsia::modular::ModuleController|
-  void Defocus() override;
-
-  // |fuchsia::modular::ModuleController|
-  void Stop(StopCallback done) override;
-
-  // Call to dispatch |ModuleController|'s OnStateChange event.
-  void NotifyStateChange();
-
-  // Used as application error handler on the Module app client.
-  void OnAppConnectionError();
-
-  // The story this Module instance runs in.
-  StoryControllerImpl* const story_controller_impl_;
-
-  AppClient<fuchsia::modular::Lifecycle> app_client_;
-
-  // The Module path and other information about the module instance.
-  const fuchsia::modular::ModuleData* const module_data_;
-
-  // The service provided here.
-  fidl::BindingSet<fuchsia::modular::ModuleController>
-      module_controller_bindings_;
-
-  // The state of this Module instance. Stored here to notify through events
-  // when it changes.
-  fuchsia::modular::ModuleState state_{fuchsia::modular::ModuleState::RUNNING};
-
-  // Callbacks passed to Teardown() calls. If there is one Stop() request
-  // pending, a second one is only queued, no second call to Stop() is made.
-  std::vector<std::function<void()>> teardown_done_callbacks_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ModuleControllerImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_MODULE_CONTROLLER_IMPL_H_
diff --git a/bin/sessionmgr/story_runner/ongoing_activity_impl.cc b/bin/sessionmgr/story_runner/ongoing_activity_impl.cc
deleted file mode 100644
index 917b43e..0000000
--- a/bin/sessionmgr/story_runner/ongoing_activity_impl.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story_runner/ongoing_activity_impl.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-namespace modular {
-
-using fuchsia::modular::OngoingActivityType;
-
-OngoingActivityImpl::OngoingActivityImpl(
-    OngoingActivityType ongoing_activity_type, fit::closure on_destroy)
-    : ongoing_activity_type_(ongoing_activity_type),
-      on_destroy_(std::move(on_destroy)) {}
-
-OngoingActivityImpl::~OngoingActivityImpl() { on_destroy_(); }
-
-OngoingActivityType OngoingActivityImpl::GetType() {
-  return ongoing_activity_type_;
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story_runner/ongoing_activity_impl.h b/bin/sessionmgr/story_runner/ongoing_activity_impl.h
deleted file mode 100644
index 298a009..0000000
--- a/bin/sessionmgr/story_runner/ongoing_activity_impl.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_ONGOING_ACTIVITY_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_ONGOING_ACTIVITY_IMPL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-class OngoingActivityImpl : public fuchsia::modular::OngoingActivity {
- public:
-  OngoingActivityImpl(
-      fuchsia::modular::OngoingActivityType ongoing_activity_type,
-      fit::closure on_destroy);
-
-  ~OngoingActivityImpl() override;
-
-  fuchsia::modular::OngoingActivityType GetType();
-
- private:
-  const fuchsia::modular::OngoingActivityType ongoing_activity_type_;
-  fit::closure on_destroy_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(OngoingActivityImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_ONGOING_ACTIVITY_IMPL_H_
diff --git a/bin/sessionmgr/story_runner/story_controller_impl.cc b/bin/sessionmgr/story_runner/story_controller_impl.cc
deleted file mode 100644
index 3adaa11..0000000
--- a/bin/sessionmgr/story_runner/story_controller_impl.cc
+++ /dev/null
@@ -1,1581 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story_runner/story_controller_impl.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/modular/internal/cpp/fidl.h>
-#include <fuchsia/modular/storymodel/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/policy/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/async/cpp/future.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/entity/cpp/json.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fsl/types/type_converters.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/join_strings.h>
-#include <lib/fxl/strings/split_string.h>
-#include <lib/fxl/type_converter.h>
-
-#include "peridot/bin/basemgr/cobalt/cobalt.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/find_modules_call.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/get_types_from_entity_call.h"
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/initialize_chain_call.h"
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-#include "peridot/bin/sessionmgr/story/model/story_observer.h"
-#include "peridot/bin/sessionmgr/story_runner/link_impl.h"
-#include "peridot/bin/sessionmgr/story_runner/module_context_impl.h"
-#include "peridot/bin/sessionmgr/story_runner/module_controller_impl.h"
-#include "peridot/bin/sessionmgr/story_runner/ongoing_activity_impl.h"
-#include "peridot/bin/sessionmgr/story_runner/story_provider_impl.h"
-#include "peridot/bin/sessionmgr/story_runner/story_shell_context_impl.h"
-#include "peridot/lib/common/names.h"
-#include "peridot/lib/common/teardown.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/ledger_client/operations.h"
-#include "peridot/lib/util/string_escape.h"
-
-// Used to create std::set<LinkPath>.
-namespace std {
-template <>
-struct less<fuchsia::modular::LinkPath> {
-  bool operator()(const fuchsia::modular::LinkPath& left,
-                  const fuchsia::modular::LinkPath& right) const {
-    if (left.module_path == right.module_path) {
-      return left.link_name < right.link_name;
-    }
-    return left.module_path < right.module_path;
-  }
-};
-}  // namespace std
-
-namespace modular {
-
-constexpr char kStoryEnvironmentLabelPrefix[] = "story-";
-constexpr auto kUpdateSnapshotTimeout = zx::sec(1);
-
-namespace {
-
-constexpr char kSurfaceIDSeparator[] = ":";
-fidl::StringPtr ModulePathToSurfaceID(
-    const std::vector<std::string>& module_path) {
-  std::vector<std::string> path;
-  // Sanitize all the |module_name|s that make up this |module_path|.
-  for (const auto& module_name : module_path) {
-    path.push_back(StringEscape(module_name, kSurfaceIDSeparator));
-  }
-  return fxl::JoinStrings(path, kSurfaceIDSeparator);
-}
-
-std::vector<std::string> ModulePathFromSurfaceID(
-    const std::string& surface_id) {
-  std::vector<std::string> path;
-  for (const auto& parts : SplitEscapedString(fxl::StringView(surface_id),
-                                              kSurfaceIDSeparator[0])) {
-    path.push_back(parts.ToString());
-  }
-  return path;
-}
-
-std::vector<std::string> ParentModulePath(
-    const std::vector<std::string>& module_path) {
-  std::vector<std::string> ret;
-
-  if (module_path.size() > 0) {
-    for (size_t i = 0; i < module_path.size() - 1; i++) {
-      ret.push_back(module_path.at(i));
-    }
-  }
-  return ret;
-}
-
-}  // namespace
-
-bool ShouldRestartModuleForNewIntent(
-    const fuchsia::modular::Intent& old_intent,
-    const fuchsia::modular::Intent& new_intent) {
-  if (old_intent.handler != new_intent.handler) {
-    return true;
-  }
-
-  return false;
-}
-
-// Launches (brings up a running instance) of a module.
-//
-// If the module is to be composed into the story shell, notifies the story
-// shell of the new module. If the module is composed internally, connects the
-// view owner request appropriately.
-class StoryControllerImpl::LaunchModuleCall : public Operation<> {
- public:
-  LaunchModuleCall(StoryControllerImpl* const story_controller_impl,
-                   fuchsia::modular::ModuleData module_data,
-                   fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-                       module_controller_request,
-                   fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-                       view_owner_request,
-                   ResultCall result_call)
-      : Operation("StoryControllerImpl::LaunchModuleCall",
-                  std::move(result_call)),
-        story_controller_impl_(story_controller_impl),
-        module_data_(std::move(module_data)),
-        module_controller_request_(std::move(module_controller_request)),
-        view_owner_request_(std::move(view_owner_request)),
-        start_time_(zx_clock_get(ZX_CLOCK_UTC)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    RunningModInfo* const running_mod_info =
-        story_controller_impl_->FindRunningModInfo(module_data_.module_path);
-
-    // We launch the new module if it doesn't run yet.
-    if (!running_mod_info) {
-      Launch(flow);
-      return;
-    }
-
-    // If the new module is already running, but with a different Intent, we
-    // tear it down then launch a new instance.
-    if (ShouldRestartModuleForNewIntent(*running_mod_info->module_data->intent,
-                                        *module_data_.intent)) {
-      running_mod_info->module_controller_impl->Teardown([this, flow] {
-        // NOTE(mesch): |running_mod_info| is invalid at this point.
-        Launch(flow);
-      });
-      return;
-    }
-
-    // Otherwise, the module is already running. Connect
-    // |module_controller_request_| to the existing instance of
-    // fuchsia::modular::ModuleController.
-    if (module_controller_request_.is_valid()) {
-      running_mod_info->module_controller_impl->Connect(
-          std::move(module_controller_request_));
-    }
-
-    // Since the module is already running send it the new intent.
-    NotifyModuleOfIntent(*running_mod_info);
-  }
-
-  void Launch(FlowToken /*flow*/) {
-    FXL_LOG(INFO) << "StoryControllerImpl::LaunchModule() "
-                  << module_data_.module_url << " "
-                  << ModulePathToSurfaceID(module_data_.module_path);
-    fuchsia::modular::AppConfig module_config;
-    module_config.url = module_data_.module_url;
-
-    fuchsia::ui::viewsv1::ViewProviderPtr view_provider;
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-        view_provider_request = view_provider.NewRequest();
-    view_provider->CreateView(std::move(view_owner_request_), nullptr);
-
-    fuchsia::sys::ServiceProviderPtr module_context_provider;
-    auto module_context_provider_request = module_context_provider.NewRequest();
-    auto service_list = fuchsia::sys::ServiceList::New();
-    service_list->names.push_back(fuchsia::modular::ComponentContext::Name_);
-    service_list->names.push_back(fuchsia::modular::ModuleContext::Name_);
-    service_list->names.push_back(
-        fuchsia::modular::IntelligenceServices::Name_);
-    service_list->provider = std::move(module_context_provider);
-
-    RunningModInfo running_mod_info;
-    running_mod_info.module_data = CloneOptional(module_data_);
-
-    // ModuleControllerImpl's constructor launches the child application.
-    running_mod_info.module_controller_impl =
-        std::make_unique<ModuleControllerImpl>(
-            story_controller_impl_,
-            story_controller_impl_->story_environment_->GetLauncher(),
-            std::move(module_config), running_mod_info.module_data.get(),
-            std::move(service_list), std::move(view_provider_request));
-
-    // Modules added/started through PuppetMaster don't have a module
-    // controller request.
-    if (module_controller_request_.is_valid()) {
-      running_mod_info.module_controller_impl->Connect(
-          std::move(module_controller_request_));
-    }
-
-    ModuleContextInfo module_context_info = {
-        story_controller_impl_->story_provider_impl_->component_context_info(),
-        story_controller_impl_,
-        story_controller_impl_->story_visibility_system_,
-        story_controller_impl_->story_provider_impl_
-            ->user_intelligence_provider()};
-
-    running_mod_info.module_context_impl = std::make_unique<ModuleContextImpl>(
-        module_context_info, running_mod_info.module_data.get(),
-        std::move(module_context_provider_request));
-
-    NotifyModuleOfIntent(running_mod_info);
-
-    story_controller_impl_->running_mod_infos_.emplace_back(
-        std::move(running_mod_info));
-
-    for (auto& i : story_controller_impl_->watchers_.ptrs()) {
-      fuchsia::modular::ModuleData module_data;
-      module_data_.Clone(&module_data);
-      (*i)->OnModuleAdded(std::move(module_data));
-    }
-
-    ReportModuleLaunchTime(
-        module_data_.module_url,
-        zx::duration(zx_clock_get(ZX_CLOCK_UTC) - start_time_));
-  }
-
-  // Connects to the module's intent handler and sends it the intent from
-  // |module_data_.intent|.
-  void NotifyModuleOfIntent(const RunningModInfo& running_mod_info) {
-    if (!module_data_.intent) {
-      return;
-    }
-    fuchsia::modular::IntentHandlerPtr intent_handler;
-    running_mod_info.module_controller_impl->services().ConnectToService(
-        intent_handler.NewRequest());
-    fuchsia::modular::Intent intent;
-    module_data_.intent->Clone(&intent);
-
-    intent_handler->HandleIntent(std::move(intent));
-  }
-
-  StoryControllerImpl* const story_controller_impl_;  // not owned
-  fuchsia::modular::ModuleData module_data_;
-  fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-      module_controller_request_;
-  fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-      view_owner_request_;
-  const zx_time_t start_time_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LaunchModuleCall);
-};
-
-// KillModuleCall tears down the module by the given module_data. It is enqueued
-// when ledger confirms that the module was stopped, see OnModuleDataUpdated().
-class StoryControllerImpl::KillModuleCall : public Operation<> {
- public:
-  KillModuleCall(StoryControllerImpl* const story_controller_impl,
-                 fuchsia::modular::ModuleData module_data,
-                 const std::function<void()>& done)
-      : Operation("StoryControllerImpl::KillModuleCall", [] {}),
-        story_controller_impl_(story_controller_impl),
-        module_data_(std::move(module_data)),
-        done_(done) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-    // If the module is external, we also notify story shell about it going
-    // away. An internal module is stopped by its parent module, and it's up to
-    // the parent module to defocus it first. TODO(mesch): Why not always
-    // defocus?
-    auto future =
-        Future<>::Create("StoryControllerImpl.KillModuleCall.Run.future");
-    if (story_controller_impl_->story_shell_ &&
-        module_data_.module_source ==
-            fuchsia::modular::ModuleSource::EXTERNAL) {
-      story_controller_impl_->story_shell_->DefocusSurface(
-          ModulePathToSurfaceID(module_data_.module_path), future->Completer());
-    } else {
-      future->Complete();
-    }
-
-    future->Then([this, flow] {
-      // Teardown the module, which discards the module controller. Since
-      // multiple KillModuleCall operations can be queued by module data
-      // updates, we must check whether the module has already been killed.
-      auto* const running_mod_info =
-          story_controller_impl_->FindRunningModInfo(module_data_.module_path);
-      if (!running_mod_info) {
-        FXL_LOG(INFO) << "No ModuleController for Module '"
-                      << ModulePathToSurfaceID(module_data_.module_path)
-                      << "'. Was ModuleController.Stop() called twice?";
-        InvokeDone();
-        return;
-      }
-
-      // The result callback |done_| must be invoked BEFORE the Teardown()
-      // callback returns, just in case it is, or it invokes, a callback of a
-      // FIDL method on ModuleController (happens in the case that this
-      // Operation instance executes a ModuleController.Stop() FIDL method
-      // invocation).
-      //
-      // After the Teardown() callback returns, the ModuleControllerImpl is
-      // deleted, and any FIDL connections that have invoked methods on it are
-      // closed.
-      //
-      // Be aware that done_ is NOT the Done() callback of the Operation.
-      running_mod_info->module_controller_impl->Teardown(
-          [this, flow] { InvokeDone(); });
-    });
-  }
-
-  void InvokeDone() {
-    // Whatever the done_ callback captures (specifically, a flow token) must be
-    // released after the done_ callback has returned. Otherwise, the calling
-    // operation will not call Done() and does not get deleted until this
-    // Operation instance gets deleted. This is probably fine, but it's
-    // different from calling operations without flow tokens, which call their
-    // own Done() directly.
-    //
-    // Notice the StopCall doesn't use a flow token, but just calls Done()
-    // directly from within done_, but the OnModuleDataUpadatedCall has a flow
-    // token.
-
-    // We must guard against the possibility that done_() causes this to be
-    // deleted (happens when called from StopCall).
-    auto weak_this = GetWeakPtr();
-
-    done_();
-
-    if (weak_this) {
-      done_ = nullptr;
-    }
-  }
-
-  StoryControllerImpl* const story_controller_impl_;  // not owned
-  fuchsia::modular::ModuleData module_data_;
-  std::function<void()> done_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(KillModuleCall);
-};
-
-// Calls LaunchModuleCall to get a running instance, and delegates visual
-// composition to the story shell.
-class StoryControllerImpl::LaunchModuleInShellCall : public Operation<> {
- public:
-  LaunchModuleInShellCall(
-      StoryControllerImpl* const story_controller_impl,
-      fuchsia::modular::ModuleData module_data,
-      fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-          module_controller_request,
-      ResultCall result_call)
-      : Operation("StoryControllerImpl::LaunchModuleInShellCall",
-                  std::move(result_call), module_data.module_url),
-        story_controller_impl_(story_controller_impl),
-        module_data_(std::move(module_data)),
-        module_controller_request_(std::move(module_controller_request)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    // TODO(mesch): The LaunchModuleCall may result in just a new
-    // fuchsia::modular::ModuleController connection to an existing
-    // ModuleControllerImpl. In that case, the view owner request is
-    // closed, and the view owner should not be sent to the story
-    // shell.
-    operation_queue_.Add(new LaunchModuleCall(
-        story_controller_impl_, fidl::Clone(module_data_),
-        std::move(module_controller_request_), view_owner_.NewRequest(),
-        [this, flow] { LoadModuleManifest(flow); }));
-    view_owner_.set_error_handler([module_url =
-                                       module_data_.module_url](zx_status_t) {
-      FXL_LOG(ERROR) << "ViewOwner associated with module_url=" << module_url
-                     << " died. This module likely won't be able to display "
-                        "anything on the screen.";
-    });
-  }
-
-  void LoadModuleManifest(FlowToken flow) {
-    story_controller_impl_->story_provider_impl_->module_facet_reader()
-        ->GetModuleManifest(
-            module_data_.module_url,
-            [this, flow](fuchsia::modular::ModuleManifestPtr manifest) {
-              module_manifest_ = std::move(manifest);
-              MaybeConnectViewToStoryShell(flow);
-            });
-  }
-
-  // We only add a module to story shell if it's either a root module or its
-  // anchor module is already known to story shell. Otherwise, we pend its view
-  // (StoryControllerImpl::pending_story_shell_views_) and pass it to the story
-  // shell once its anchor module is ready.
-  void MaybeConnectViewToStoryShell(FlowToken flow) {
-    // If this is called during Stop(), story_shell_ might already have been
-    // reset. TODO(mesch): Then the whole operation should fail.
-    if (!story_controller_impl_->story_shell_) {
-      return;
-    }
-
-    if (module_data_.module_path.size() == 1) {
-      // This is a root module; pass it's view on to the story shell.
-      ConnectViewToStoryShell(flow, "");
-      return;
-    }
-
-    auto* const running_mod_info =
-        story_controller_impl_->FindRunningModInfo(module_data_.module_path);
-    FXL_CHECK(running_mod_info);  // This was just created in LaunchModuleCall.
-
-    auto* const anchor = story_controller_impl_->FindAnchor(running_mod_info);
-    if (anchor) {
-      const auto anchor_surface_id =
-          ModulePathToSurfaceID(anchor->module_data->module_path);
-      if (story_controller_impl_->connected_views_.count(anchor_surface_id)) {
-        ConnectViewToStoryShell(flow, anchor_surface_id);
-        return;
-      }
-    }
-
-    auto manifest_clone = fuchsia::modular::ModuleManifest::New();
-    fidl::Clone(module_manifest_, &manifest_clone);
-
-    fuchsia::modular::SurfaceRelationPtr surface_relation_clone;
-    if (module_data_.surface_relation) {
-      surface_relation_clone = fuchsia::modular::SurfaceRelation::New();
-      module_data_.surface_relation->Clone(surface_relation_clone.get());
-    }
-
-    story_controller_impl_->pending_story_shell_views_.emplace(
-        ModulePathToSurfaceID(module_data_.module_path),
-        PendingViewForStoryShell{
-            module_data_.module_path, std::move(manifest_clone),
-            std::move(surface_relation_clone), module_data_.module_source,
-            std::move(view_owner_)});
-  }
-
-  void ConnectViewToStoryShell(FlowToken flow,
-                               fidl::StringPtr anchor_surface_id) {
-    const auto surface_id = ModulePathToSurfaceID(module_data_.module_path);
-
-    fuchsia::modular::ViewConnection view_connection;
-    view_connection.surface_id = surface_id;
-    view_connection.owner = std::move(view_owner_);
-
-    fuchsia::modular::SurfaceInfo surface_info;
-    surface_info.parent_id = anchor_surface_id;
-    surface_info.surface_relation = std::move(module_data_.surface_relation);
-    surface_info.module_manifest = std::move(module_manifest_);
-    surface_info.module_source = std::move(module_data_.module_source);
-    story_controller_impl_->story_shell_->AddSurface(std::move(view_connection),
-                                                     std::move(surface_info));
-
-    story_controller_impl_->connected_views_.emplace(surface_id);
-    story_controller_impl_->ProcessPendingStoryShellViews();
-    story_controller_impl_->story_shell_->FocusSurface(surface_id);
-  }
-
-  StoryControllerImpl* const story_controller_impl_;
-  fuchsia::modular::ModuleData module_data_;
-  fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-      module_controller_request_;
-
-  fuchsia::modular::ModuleControllerPtr module_controller_;
-  fuchsia::ui::viewsv1token::ViewOwnerPtr view_owner_;
-
-  fuchsia::modular::ModuleManifestPtr module_manifest_;
-
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LaunchModuleInShellCall);
-};
-
-class StoryControllerImpl::StopCall : public Operation<> {
- public:
-  StopCall(StoryControllerImpl* const story_controller_impl, const bool bulk,
-           std::function<void()> done)
-      : Operation("StoryControllerImpl::StopCall", done),
-        story_controller_impl_(story_controller_impl),
-        bulk_(bulk) {}
-
- private:
-  void Run() override {
-    if (!story_controller_impl_->IsRunning()) {
-      Done();
-      return;
-    }
-
-    story_controller_impl_->SetRuntimeState(
-        fuchsia::modular::StoryState::STOPPING);
-
-    // If this StopCall is part of a bulk operation of story provider that stops
-    // all stories at once, no DetachView() notification is given to the session
-    // shell.
-    if (bulk_) {
-      StopStory();
-      return;
-    }
-
-    // Invocation of DetachView() follows below.
-    //
-    // The following callback is scheduled twice, once as response from
-    // DetachView(), and again as a timeout.
-    //
-    // The shared bool did_run keeps track of the number of invocations, and
-    // allows to suppress the second one.
-    //
-    // The weak pointer is needed because the method invocation would not be
-    // cancelled when the OperationQueue holding this Operation instance is
-    // deleted, because the method is invoked on an instance outside of the
-    // instance that owns the OperationQueue that holds this Operation instance.
-    //
-    // The argument from_timeout informs whether the invocation was from the
-    // timeout or from the method callback. It's used only to log diagnostics.
-    // If we would not want to have this diagnostic, we could use this callback
-    // directly to schedule it twice. In that case, it would be important that
-    // passing it to DetachView() has copy semantics, as it does now passing it
-    // to the capture list of two separate lambdas, and not move semantics, i.e.
-    // that the argument is of DetachView() is NOT a fit::function but a
-    // std::function.
-    //
-    // Both weak and shared pointers are copyable, so we don't need to do
-    // anything to make this lambda copyable. (But it will be copied when used
-    // below.)
-    auto cont = [this, weak_this = GetWeakPtr(),
-                 did_run = std::make_shared<bool>(false),
-                 story_id = story_controller_impl_->story_id_](
-                    const bool from_timeout) {
-      if (*did_run) {
-        return;
-      }
-
-      *did_run = true;
-
-      if (from_timeout) {
-        FXL_LOG(INFO) << "DetachView() timed out: story_id=" << story_id;
-      }
-
-      if (weak_this) {
-        StopStory();
-      }
-    };
-
-    story_controller_impl_->DetachView([cont] { cont(false); });
-
-    async::PostDelayedTask(async_get_default_dispatcher(),
-                           [cont] { cont(true); }, kBasicTimeout);
-  }
-
-  void StopStory() {
-    std::vector<FuturePtr<>> did_teardowns;
-    did_teardowns.reserve(story_controller_impl_->running_mod_infos_.size());
-
-    // Tear down all connections with a fuchsia::modular::ModuleController
-    // first, then the links between them.
-    for (auto& running_mod_info : story_controller_impl_->running_mod_infos_) {
-      auto did_teardown =
-          Future<>::Create("StoryControllerImpl.StopCall.Run.did_teardown");
-      running_mod_info.module_controller_impl->Teardown(
-          did_teardown->Completer());
-      did_teardowns.emplace_back(did_teardown);
-    }
-
-    Wait("StoryControllerImpl.StopCall.Run.Wait", did_teardowns)
-        ->AsyncMap([this] {
-          auto did_teardown = Future<>::Create(
-              "StoryControllerImpl.StopCall.Run.did_teardown2");
-          // If StopCall runs on a story that's not running, there is no story
-          // shell.
-          if (story_controller_impl_->story_shell_) {
-            story_controller_impl_->story_shell_app_->Teardown(
-                kBasicTimeout, did_teardown->Completer());
-          } else {
-            did_teardown->Complete();
-          }
-
-          return did_teardown;
-        })
-        ->AsyncMap([this] {
-          story_controller_impl_->story_shell_app_.reset();
-          story_controller_impl_->story_shell_.Unbind();
-
-          // Ensure every story storage operation has completed.
-          return story_controller_impl_->story_storage_->Sync();
-        })
-        ->Then([this] {
-          // Clear the remaining links and connections in case there are some
-          // left. At this point, no DisposeLink() calls can arrive anymore.
-          story_controller_impl_->link_impls_.CloseAll();
-
-          // There should be no ongoing activities since all the modules have
-          // been destroyed at this point.
-          FXL_DCHECK(story_controller_impl_->ongoing_activities_.size() == 0);
-
-          story_controller_impl_->SetRuntimeState(
-              fuchsia::modular::StoryState::STOPPED);
-
-          story_controller_impl_->DestroyStoryEnvironment();
-
-          Done();
-        });
-  }
-
-  StoryControllerImpl* const story_controller_impl_;  // not owned
-
-  // Whether this Stop operation is part of stopping all stories at once. In
-  // that case, DetachView() is not called.
-  const bool bulk_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StopCall);
-};
-
-class StoryControllerImpl::StopModuleCall : public Operation<> {
- public:
-  StopModuleCall(StoryStorage* const story_storage,
-                 const std::vector<std::string>& module_path,
-                 const std::function<void()>& done)
-      : Operation("StoryControllerImpl::StopModuleCall", done),
-        story_storage_(story_storage),
-        module_path_(module_path) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    // Mark this module as stopped, which is a global state shared between
-    // machines to track when the module is explicitly stopped. The module will
-    // stop when ledger notifies us back about the module state change,
-    // see OnModuleDataUpdated().
-    story_storage_->UpdateModuleData(
-        module_path_, [flow](fuchsia::modular::ModuleDataPtr* module_data_ptr) {
-          FXL_DCHECK(*module_data_ptr);
-          (*module_data_ptr)->module_deleted = true;
-        });
-  }
-
-  StoryStorage* const story_storage_;  // not owned
-  const std::vector<std::string> module_path_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StopModuleCall);
-};
-
-class StoryControllerImpl::StopModuleAndStoryIfEmptyCall : public Operation<> {
- public:
-  StopModuleAndStoryIfEmptyCall(
-      StoryControllerImpl* const story_controller_impl,
-      const std::vector<std::string>& module_path,
-      const std::function<void()>& done)
-      : Operation("StoryControllerImpl::StopModuleAndStoryIfEmptyCall", done),
-        story_controller_impl_(story_controller_impl),
-        module_path_(module_path) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-    // If this is the last module in the story, stop the whole story instead
-    // (which will cause this mod to be stopped also).
-    auto* const running_mod_info =
-        story_controller_impl_->FindRunningModInfo(module_path_);
-    if (running_mod_info &&
-        story_controller_impl_->running_mod_infos_.size() == 1) {
-      operation_queue_.Add(
-          new StopCall(story_controller_impl_, false /* bulk */, [flow] {}));
-    } else {
-      // Otherwise, stop this one module.
-      operation_queue_.Add(new StopModuleCall(
-          story_controller_impl_->story_storage_, module_path_, [flow] {}));
-    }
-  }
-
-  StoryControllerImpl* const story_controller_impl_;  // not owned
-  const std::vector<std::string> module_path_;
-
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StopModuleAndStoryIfEmptyCall);
-};
-
-class StoryControllerImpl::OnModuleDataUpdatedCall : public Operation<> {
- public:
-  OnModuleDataUpdatedCall(StoryControllerImpl* const story_controller_impl,
-                          fuchsia::modular::ModuleData module_data)
-      : Operation("StoryControllerImpl::LedgerNotificationCall", [] {}),
-        story_controller_impl_(story_controller_impl),
-        module_data_(std::move(module_data)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-    if (!story_controller_impl_->IsRunning()) {
-      return;
-    }
-
-    // Check for existing module at the given path.
-    auto* const running_mod_info =
-        story_controller_impl_->FindRunningModInfo(module_data_.module_path);
-    if (module_data_.module_deleted) {
-      // If the module is running, kill it.
-      if (running_mod_info) {
-        operation_queue_.Add(new KillModuleCall(
-            story_controller_impl_, std::move(module_data_), [flow] {}));
-      }
-      return;
-    }
-
-    // We do not auto-start Modules that were added through ModuleContext on
-    // other devices.
-    //
-    // TODO(thatguy): Revisit this decision. It seems wrong: we do not want
-    // to auto-start mods added through ModuleContext.EmbedModule(), because
-    // we do not have the necessary capabilities (the ViewOwner). However,
-    // mods added through ModuleContext.AddModuleToStory() can be started
-    // automatically.
-    if (module_data_.module_source ==
-        fuchsia::modular::ModuleSource::INTERNAL) {
-      return;
-    }
-
-    // We reach this point only if we want to start or update an existing
-    // external module.
-    operation_queue_.Add(new LaunchModuleInShellCall(
-        story_controller_impl_, std::move(module_data_),
-        nullptr /* module_controller_request */, [flow] {}));
-  }
-
-  OperationQueue operation_queue_;
-  StoryControllerImpl* const story_controller_impl_;  // not owned
-  fuchsia::modular::ModuleData module_data_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(OnModuleDataUpdatedCall);
-};
-
-class StoryControllerImpl::FocusCall : public Operation<> {
- public:
-  FocusCall(StoryControllerImpl* const story_controller_impl,
-            std::vector<std::string> module_path)
-      : Operation("StoryControllerImpl::FocusCall", [] {}),
-        story_controller_impl_(story_controller_impl),
-        module_path_(std::move(module_path)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    if (!story_controller_impl_->story_shell_) {
-      return;
-    }
-
-    story_controller_impl_->story_shell_->FocusSurface(
-        ModulePathToSurfaceID(module_path_));
-  }
-
-  OperationQueue operation_queue_;
-  StoryControllerImpl* const story_controller_impl_;  // not owned
-  const std::vector<std::string> module_path_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FocusCall);
-};
-
-class StoryControllerImpl::DefocusCall : public Operation<> {
- public:
-  DefocusCall(StoryControllerImpl* const story_controller_impl,
-              std::vector<std::string> module_path)
-      : Operation("StoryControllerImpl::DefocusCall", [] {}),
-        story_controller_impl_(story_controller_impl),
-        module_path_(std::move(module_path)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    if (!story_controller_impl_->story_shell_) {
-      return;
-    }
-
-    // NOTE(mesch): We don't wait for defocus to return. TODO(mesch): What is
-    // the return callback good for anyway?
-    story_controller_impl_->story_shell_->DefocusSurface(
-        ModulePathToSurfaceID(module_path_), [] {});
-  }
-
-  OperationQueue operation_queue_;
-  StoryControllerImpl* const story_controller_impl_;  // not owned
-  const std::vector<std::string> module_path_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DefocusCall);
-};
-
-// An operation that first performs module resolution with the provided
-// fuchsia::modular::Intent and subsequently starts the most appropriate
-// resolved module in the story shell.
-class StoryControllerImpl::AddIntentCall
-    : public Operation<fuchsia::modular::StartModuleStatus> {
- public:
-  AddIntentCall(StoryControllerImpl* const story_controller_impl,
-                AddModParams add_mod_params,
-                fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-                    module_controller_request,
-                fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-                    view_owner_request,
-                ResultCall result_call)
-      : Operation("StoryControllerImpl::AddIntentCall", std::move(result_call)),
-        story_controller_impl_(story_controller_impl),
-        add_mod_params_(std::move(add_mod_params)),
-        module_controller_request_(std::move(module_controller_request)),
-        view_owner_request_(std::move(view_owner_request)) {}
-
- private:
-  void Run() {
-    FlowToken flow{this, &start_module_status_};
-    AddAddModOperation(
-        &operation_queue_, story_controller_impl_->story_storage_,
-        story_controller_impl_->story_provider_impl_->module_resolver(),
-        story_controller_impl_->story_provider_impl_->entity_resolver(),
-        std::move(add_mod_params_),
-        [this, flow](fuchsia::modular::ExecuteResult result,
-                     fuchsia::modular::ModuleData module_data) {
-          if (result.status ==
-              fuchsia::modular::ExecuteStatus::NO_MODULES_FOUND) {
-            start_module_status_ =
-                fuchsia::modular::StartModuleStatus::NO_MODULES_FOUND;
-            return;
-          }
-          if (result.status != fuchsia::modular::ExecuteStatus::OK) {
-            FXL_LOG(WARNING)
-                << "StoryController::AddIntentCall::AddModCall returned "
-                << "error response with message: " << result.error_message;
-          }
-          module_data_ = std::move(module_data);
-          LaunchModuleIfStoryRunning(flow);
-        });
-  }
-
-  void LaunchModuleIfStoryRunning(FlowToken flow) {
-    if (story_controller_impl_->IsRunning()) {
-      // TODO(thatguy): Should we be checking surface_relation also?
-      if (!view_owner_request_) {
-        operation_queue_.Add(new LaunchModuleInShellCall(
-            story_controller_impl_, std::move(module_data_),
-            std::move(module_controller_request_), [flow] {}));
-      } else {
-        operation_queue_.Add(new LaunchModuleCall(
-            story_controller_impl_, std::move(module_data_),
-            std::move(module_controller_request_),
-            std::move(view_owner_request_), [this, flow] {
-              // LaunchModuleInShellCall above already calls
-              // ProcessPendingStoryShellViews(). NOTE(thatguy): This
-              // cannot be moved into LaunchModuleCall, because
-              // LaunchModuleInShellCall uses LaunchModuleCall
-              // as the very first step of its operation. This
-              // would inform the story shell of a new module
-              // before we had told it about its
-              // surface-relation parent (which we do as the
-              // second part of LaunchModuleInShellCall).  So
-              // we must defer to here.
-              story_controller_impl_->ProcessPendingStoryShellViews();
-            }));
-      }
-    }
-
-    start_module_status_ = fuchsia::modular::StartModuleStatus::SUCCESS;
-  }
-
-  OperationQueue operation_queue_;
-  StoryControllerImpl* const story_controller_impl_;
-
-  // Some of the fields in add_mod_params_ are used to initializel
-  // module_data_ in AddModuleFromResult().
-  AddModParams add_mod_params_;
-  fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-      module_controller_request_;
-  fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-      view_owner_request_;
-
-  // Created by AddModuleFromResult, and ultimately written to story state.
-  fuchsia::modular::ModuleData module_data_;
-
-  fuchsia::modular::StartModuleStatus start_module_status_{
-      fuchsia::modular::StartModuleStatus::NO_MODULES_FOUND};
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AddIntentCall);
-};
-
-class StoryControllerImpl::StartCall : public Operation<> {
- public:
-  StartCall(StoryControllerImpl* const story_controller_impl,
-            StoryStorage* const storage)
-      : Operation("StoryControllerImpl::StartCall", [] {}),
-        story_controller_impl_(story_controller_impl),
-        storage_(storage) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    // If the story is running, we do nothing.
-    if (story_controller_impl_->IsRunning()) {
-      FXL_LOG(INFO)
-          << "StoryControllerImpl::StartCall() while already running: ignored.";
-      return;
-    }
-
-    story_controller_impl_->StartStoryShell();
-
-    // Start all modules that were not themselves explicitly started by another
-    // module.
-    storage_->ReadAllModuleData()->Then(
-        [this, flow](std::vector<fuchsia::modular::ModuleData> data) {
-          story_controller_impl_->InitStoryEnvironment();
-          for (auto& module_data : data) {
-            // Don't start the module if it is embedded, or if it has been
-            // marked deleted.
-            if (module_data.module_deleted || module_data.is_embedded) {
-              continue;
-            }
-            FXL_CHECK(module_data.intent);
-            operation_queue_.Add(new LaunchModuleInShellCall(
-                story_controller_impl_, std::move(module_data),
-                nullptr /* module_controller_request */, [flow] {}));
-          }
-
-          story_controller_impl_->SetRuntimeState(
-              fuchsia::modular::StoryState::RUNNING);
-        });
-  }
-
-  StoryControllerImpl* const story_controller_impl_;  // not owned
-  StoryStorage* const storage_;                       // not owned
-
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StartCall);
-};
-
-class StoryControllerImpl::UpdateSnapshotCall : public Operation<> {
- public:
-  UpdateSnapshotCall(StoryControllerImpl* const story_controller_impl,
-                     std::function<void()> done)
-      : Operation("StoryControllerImpl::UpdateSnapshotCall", done),
-        story_controller_impl_(story_controller_impl) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    // If the story shell is not running, we avoid updating the snapshot.
-    if (!story_controller_impl_->IsRunning()) {
-      FXL_LOG(INFO) << "StoryControllerImpl::UpdateSnapshotCall() called when "
-                       "story shell is not initialized.";
-      return;
-    }
-
-    FlowTokenHolder branch{flow};
-    // |flow| will branch into normal and timeout paths. |flow| must go out of
-    // scope when either of the paths finishes. We pass a weak ptr of
-    // story_controller_impl to the callback in case the operation goes out of
-    // scope from timeout.
-    story_controller_impl_->story_provider_impl_->TakeSnapshot(
-        story_controller_impl_->story_id_,
-        [weak_ptr = story_controller_impl_->weak_factory_.GetWeakPtr(),
-         branch](fuchsia::mem::Buffer snapshot) {
-          if (!weak_ptr) {
-            return;
-          }
-
-          if (snapshot.size == 0) {
-            FXL_LOG(INFO)
-                << "TakeSnapshot returned an invalid snapshot for story: "
-                << weak_ptr->story_id_;
-            return;
-          }
-
-          // Even if the snapshot comes back after timeout, we attempt to
-          // process it by loading the snapshot and saving it to storage. This
-          // call assumes that the snapshot loader has already been connected.
-          if (!weak_ptr->snapshot_loader_.is_bound()) {
-            FXL_LOG(ERROR) << "UpdateSnapshotCall called when snapshot loader "
-                              "has not been connected for story: "
-                           << weak_ptr->story_id_;
-          } else {
-            fuchsia::mem::Buffer snapshot_copy;
-            snapshot.Clone(&snapshot_copy);
-            weak_ptr->snapshot_loader_->Load(std::move(snapshot_copy));
-          }
-
-          weak_ptr->session_storage_
-              ->WriteSnapshot(weak_ptr->story_id_, std::move(snapshot))
-              ->Then([weak_ptr, branch]() {
-                auto flow = branch.Continue();
-                if (!flow) {
-                  FXL_LOG(INFO) << "Saved snapshot for story after timeout: "
-                                << weak_ptr->story_id_;
-                } else {
-                  FXL_LOG(INFO)
-                      << "Saved snapshot for story: " << weak_ptr->story_id_;
-                }
-              });
-        });
-
-    async::PostDelayedTask(
-        async_get_default_dispatcher(),
-        [this, branch] {
-          auto flow = branch.Continue();
-          if (flow) {
-            FXL_LOG(INFO) << "Timed out while updating snapshot for story: "
-                          << story_controller_impl_->story_id_;
-          }
-        },
-        kUpdateSnapshotTimeout);
-  }
-
-  StoryControllerImpl* const story_controller_impl_;  // not owned
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(UpdateSnapshotCall);
-};
-
-class StoryControllerImpl::StartSnapshotLoaderCall : public Operation<> {
- public:
-  StartSnapshotLoaderCall(
-      StoryControllerImpl* const story_controller_impl,
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> request)
-      : Operation("StoryControllerImpl::StartSnapshotLoaderCall", [] {}),
-        story_controller_impl_(story_controller_impl),
-        request_(std::move(request)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    story_controller_impl_->story_provider_impl_->StartSnapshotLoader(
-        std::move(request_),
-        story_controller_impl_->snapshot_loader_.NewRequest());
-
-    story_controller_impl_->session_storage_
-        ->ReadSnapshot(story_controller_impl_->story_id_)
-        ->Then([this, flow](fuchsia::mem::BufferPtr snapshot) {
-          if (!snapshot) {
-            FXL_LOG(INFO)
-                << "ReadSnapshot returned a null/invalid snapshot for story: "
-                << story_controller_impl_->story_id_;
-            return;
-          }
-
-          story_controller_impl_->snapshot_loader_->Load(
-              std::move(*snapshot.get()));
-        });
-  }
-
-  StoryControllerImpl* const story_controller_impl_;  // not owned
-  fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> request_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StartSnapshotLoaderCall);
-};
-
-StoryControllerImpl::StoryControllerImpl(
-    SessionStorage* const session_storage, StoryStorage* const story_storage,
-    std::unique_ptr<StoryMutator> story_mutator,
-    std::unique_ptr<StoryObserver> story_observer,
-    StoryVisibilitySystem* const story_visibility_system,
-    StoryProviderImpl* const story_provider_impl)
-    : story_id_(*story_observer->model().name()),
-      story_provider_impl_(story_provider_impl),
-      session_storage_(session_storage),
-      story_storage_(story_storage),
-      story_mutator_(std::move(story_mutator)),
-      story_observer_(std::move(story_observer)),
-      story_visibility_system_(story_visibility_system),
-      story_shell_context_impl_{story_id_, story_provider_impl, this},
-      weak_factory_(this) {
-  auto story_scope = fuchsia::modular::StoryScope::New();
-  story_scope->story_id = story_id_;
-  auto scope = fuchsia::modular::ComponentScope::New();
-  scope->set_story_scope(std::move(*story_scope));
-  story_provider_impl_->user_intelligence_provider()
-      ->GetComponentIntelligenceServices(std::move(*scope),
-                                         intelligence_services_.NewRequest());
-  story_storage_->set_on_module_data_updated(
-      [this](fuchsia::modular::ModuleData module_data) {
-        OnModuleDataUpdated(std::move(module_data));
-      });
-
-  story_observer_->RegisterListener(
-      [this](const fuchsia::modular::storymodel::StoryModel& model) {
-        NotifyStoryWatchers(model);
-      });
-}
-
-StoryControllerImpl::~StoryControllerImpl() = default;
-
-void StoryControllerImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::StoryController> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-bool StoryControllerImpl::IsRunning() {
-  switch (*story_observer_->model().runtime_state()) {
-    case fuchsia::modular::StoryState::RUNNING:
-      return true;
-    case fuchsia::modular::StoryState::STOPPING:
-    case fuchsia::modular::StoryState::STOPPED:
-      return false;
-  }
-}
-
-fidl::VectorPtr<fuchsia::modular::OngoingActivityType>
-StoryControllerImpl::GetOngoingActivities() {
-  fidl::VectorPtr<fuchsia::modular::OngoingActivityType> ongoing_activities;
-  ongoing_activities.resize(0);
-  for (auto& entry : ongoing_activities_.bindings()) {
-    ongoing_activities.push_back(entry->impl()->GetType());
-  }
-
-  return ongoing_activities;
-}
-
-void StoryControllerImpl::Sync(const std::function<void()>& done) {
-  operation_queue_.Add(new SyncCall(done));
-}
-
-void StoryControllerImpl::FocusModule(
-    const std::vector<std::string>& module_path) {
-  operation_queue_.Add(new FocusCall(this, module_path));
-}
-
-void StoryControllerImpl::DefocusModule(
-    const std::vector<std::string>& module_path) {
-  operation_queue_.Add(new DefocusCall(this, module_path));
-}
-
-void StoryControllerImpl::StopModule(
-    const std::vector<std::string>& module_path,
-    const std::function<void()>& done) {
-  operation_queue_.Add(new StopModuleCall(story_storage_, module_path, done));
-}
-
-void StoryControllerImpl::ReleaseModule(
-    ModuleControllerImpl* const module_controller_impl) {
-  auto fit = std::find_if(running_mod_infos_.begin(), running_mod_infos_.end(),
-                          [module_controller_impl](const RunningModInfo& c) {
-                            return c.module_controller_impl.get() ==
-                                   module_controller_impl;
-                          });
-  FXL_DCHECK(fit != running_mod_infos_.end());
-  fit->module_controller_impl.release();
-  pending_story_shell_views_.erase(
-      ModulePathToSurfaceID(fit->module_data->module_path));
-  running_mod_infos_.erase(fit);
-}
-
-fidl::StringPtr StoryControllerImpl::GetStoryId() const {
-  return *story_observer_->model().name();
-}
-
-void StoryControllerImpl::RequestStoryFocus() {
-  story_provider_impl_->RequestStoryFocus(story_id_);
-}
-
-// TODO(drees) Collapse functionality into GetLink.
-void StoryControllerImpl::ConnectLinkPath(
-    fuchsia::modular::LinkPathPtr link_path,
-    fidl::InterfaceRequest<fuchsia::modular::Link> request) {
-  // Cache a copy of the current active links, because link_impls_.AddBinding()
-  // will change the set to include the newly created link connection.
-  auto active_links = GetActiveLinksInternal();
-
-  LinkPath link_path_clone;
-  link_path->Clone(&link_path_clone);
-  link_impls_.AddBinding(
-      std::make_unique<LinkImpl>(story_storage_, std::move(link_path_clone)),
-      std::move(request));
-
-  // TODO: remove this. MI4-1084
-  if (active_links.count(*link_path) == 0) {
-    // This is a new link: notify watchers.
-    for (auto& i : links_watchers_.ptrs()) {
-      LinkPath link_path_clone;
-      link_path->Clone(&link_path_clone);
-      (*i)->OnNewLink(std::move(link_path_clone));
-    }
-  }
-}
-
-fuchsia::modular::LinkPathPtr StoryControllerImpl::GetLinkPathForParameterName(
-    const std::vector<std::string>& module_path, std::string name) {
-  auto mod_info = FindRunningModInfo(module_path);
-  // NOTE: |mod_info| will only be valid if the module at |module_path| is
-  // running. Strictly speaking, this is unsafe. The source of truth is the
-  // Ledger, accessible through StoryStorage, but the call would be dispatcher,
-  // which would change the flow of all clients of this method. For now, we
-  // leave as-is.
-  FXL_DCHECK(mod_info) << ModulePathToSurfaceID(module_path);
-
-  const auto& param_map = mod_info->module_data->parameter_map;
-  auto it = std::find_if(
-      param_map.entries.begin(), param_map.entries.end(),
-      [&name](const fuchsia::modular::ModuleParameterMapEntry& data) {
-        return data.name == name;
-      });
-
-  fuchsia::modular::LinkPathPtr link_path = nullptr;
-  if (it != param_map.entries.end()) {
-    link_path = CloneOptional(it->link_path);
-  }
-
-  if (!link_path) {
-    link_path = fuchsia::modular::LinkPath::New();
-    link_path->module_path = module_path;
-    link_path->link_name = name;
-  }
-
-  return link_path;
-}
-
-void StoryControllerImpl::EmbedModule(
-    AddModParams add_mod_params,
-    fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-        module_controller_request,
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-        view_owner_request,
-    std::function<void(fuchsia::modular::StartModuleStatus)> callback) {
-  operation_queue_.Add(new AddIntentCall(
-      this, std::move(add_mod_params), std::move(module_controller_request),
-      std::move(view_owner_request), std::move(callback)));
-}
-
-void StoryControllerImpl::AddModuleToStory(
-    AddModParams add_mod_params,
-    fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-        module_controller_request,
-    std::function<void(fuchsia::modular::StartModuleStatus)> callback) {
-  operation_queue_.Add(new AddIntentCall(
-      this, std::move(add_mod_params), std::move(module_controller_request),
-      nullptr /* view_owner_request */, std::move(callback)));
-}
-
-void StoryControllerImpl::ProcessPendingStoryShellViews() {
-  // NOTE(mesch): As it stands, this machinery to send modules in traversal
-  // order to the story shell is N^3 over the lifetime of the story, where N
-  // is the number of modules. This function is N^2, and it's called once for
-  // each of the N modules. However, N is small, and moreover its scale is
-  // limited my much more severe constraints. Eventually, we will address this
-  // by changing story shell to be able to accomodate modules out of traversal
-  // order.
-  if (!story_shell_) {
-    return;
-  }
-
-  std::vector<fidl::StringPtr> added_keys;
-
-  for (auto& kv : pending_story_shell_views_) {
-    auto* const running_mod_info = FindRunningModInfo(kv.second.module_path);
-    if (!running_mod_info) {
-      continue;
-    }
-
-    auto* const anchor = FindAnchor(running_mod_info);
-    if (!anchor) {
-      continue;
-    }
-
-    const auto anchor_surface_id =
-        ModulePathToSurfaceID(anchor->module_data->module_path);
-    if (!connected_views_.count(anchor_surface_id)) {
-      continue;
-    }
-
-    const auto surface_id = ModulePathToSurfaceID(kv.second.module_path);
-    fuchsia::modular::ViewConnection view_connection;
-    view_connection.surface_id = surface_id;
-    view_connection.owner = std::move(kv.second.view_owner);
-    fuchsia::modular::SurfaceInfo surface_info;
-    surface_info.parent_id = anchor_surface_id;
-    surface_info.surface_relation = std::move(kv.second.surface_relation);
-    surface_info.module_manifest = std::move(kv.second.module_manifest);
-    surface_info.module_source = std::move(kv.second.module_source);
-    story_shell_->AddSurface(std::move(view_connection),
-                             std::move(surface_info));
-    connected_views_.emplace(surface_id);
-
-    added_keys.push_back(kv.first);
-  }
-
-  if (added_keys.size()) {
-    for (auto& key : added_keys) {
-      pending_story_shell_views_.erase(key);
-    }
-    ProcessPendingStoryShellViews();
-  }
-}
-
-std::set<fuchsia::modular::LinkPath>
-StoryControllerImpl::GetActiveLinksInternal() {
-  std::set<fuchsia::modular::LinkPath> paths;
-  for (auto& entry : link_impls_.bindings()) {
-    LinkPath p;
-    entry->impl()->link_path().Clone(&p);
-    paths.insert(std::move(p));
-  }
-  return paths;
-}
-
-void StoryControllerImpl::OnModuleDataUpdated(
-    fuchsia::modular::ModuleData module_data) {
-  operation_queue_.Add(
-      new OnModuleDataUpdatedCall(this, std::move(module_data)));
-}
-
-void StoryControllerImpl::GetInfo(GetInfoCallback callback) {
-  // Synced such that if GetInfo() is called after Start() or Stop(), the
-  // state after the previously invoked operation is returned.
-  //
-  // If this call enters a race with a StoryProvider.DeleteStory() call,
-  // resulting in |this| being destroyed, |callback| will be dropped.
-  operation_queue_.Add(new SyncCall([this, callback] {
-    auto story_info = story_provider_impl_->GetCachedStoryInfo(story_id_);
-    FXL_CHECK(story_info);
-    callback(std::move(*story_info), *story_observer_->model().runtime_state());
-  }));
-}
-
-void StoryControllerImpl::RequestStart() {
-  operation_queue_.Add(new StartCall(this, story_storage_));
-}
-
-void StoryControllerImpl::Stop(StopCallback done) {
-  operation_queue_.Add(new StopCall(this, false /* bulk */, done));
-}
-
-void StoryControllerImpl::StopBulk(const bool bulk, StopCallback done) {
-  operation_queue_.Add(new StopCall(this, bulk, done));
-}
-
-void StoryControllerImpl::TakeAndLoadSnapshot(
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> request,
-    TakeAndLoadSnapshotCallback done) {
-  // Currently we start a new snapshot view on every TakeAndLoadSnapshot
-  // invocation. We can optimize later by connecting the snapshot loader on
-  // start and re-using it for the lifetime of the story.
-  operation_queue_.Add(new StartSnapshotLoaderCall(this, std::move(request)));
-  operation_queue_.Add(new UpdateSnapshotCall(this, done));
-}
-
-void StoryControllerImpl::Watch(
-    fidl::InterfaceHandle<fuchsia::modular::StoryWatcher> watcher) {
-  auto ptr = watcher.Bind();
-  NotifyOneStoryWatcher(story_observer_->model(), ptr.get());
-  watchers_.AddInterfacePtr(std::move(ptr));
-}
-
-void StoryControllerImpl::GetActiveModules(GetActiveModulesCallback callback) {
-  // We execute this in a SyncCall so that we are sure we don't fall in a
-  // crack between a module being created and inserted in the connections
-  // collection during some Operation.
-  operation_queue_.Add(
-      new SyncCall(fxl::MakeCopyable([this, callback]() mutable {
-        std::vector<fuchsia::modular::ModuleData> result;
-
-        result.resize(running_mod_infos_.size());
-        for (size_t i = 0; i < running_mod_infos_.size(); i++) {
-          running_mod_infos_[i].module_data->Clone(&result.at(i));
-        }
-        callback(std::move(result));
-      })));
-}
-
-void StoryControllerImpl::GetModules(GetModulesCallback callback) {
-  auto on_run = Future<>::Create("StoryControllerImpl.GetModules.on_run");
-  auto done =
-      on_run->AsyncMap([this] { return story_storage_->ReadAllModuleData(); });
-  operation_queue_.Add(WrapFutureAsOperation(
-      "StoryControllerImpl.GetModules.op", on_run, done, callback));
-}
-
-void StoryControllerImpl::GetModuleController(
-    std::vector<std::string> module_path,
-    fidl::InterfaceRequest<fuchsia::modular::ModuleController> request) {
-  operation_queue_.Add(new SyncCall(
-      fxl::MakeCopyable([this, module_path = std::move(module_path),
-                         request = std::move(request)]() mutable {
-        for (auto& running_mod_info : running_mod_infos_) {
-          if (module_path == running_mod_info.module_data->module_path) {
-            running_mod_info.module_controller_impl->Connect(
-                std::move(request));
-            return;
-          }
-        }
-
-        // Trying to get a controller for a module that is not active just
-        // drops the connection request.
-      })));
-}
-
-void StoryControllerImpl::GetActiveLinks(
-    fidl::InterfaceHandle<fuchsia::modular::StoryLinksWatcher> watcher,
-    GetActiveLinksCallback callback) {
-  auto result = fidl::VectorPtr<fuchsia::modular::LinkPath>::New(0);
-
-  std::set<fuchsia::modular::LinkPath> active_links = GetActiveLinksInternal();
-  for (auto& p : active_links) {
-    LinkPath clone;
-    p.Clone(&clone);
-    result.push_back(std::move(clone));
-  }
-
-  if (watcher) {
-    links_watchers_.AddInterfacePtr(watcher.Bind());
-  }
-  callback(std::move(result));
-}
-
-void StoryControllerImpl::GetLink(
-    fuchsia::modular::LinkPath link_path,
-    fidl::InterfaceRequest<fuchsia::modular::Link> request) {
-  ConnectLinkPath(fidl::MakeOptional(std::move(link_path)), std::move(request));
-}
-
-void StoryControllerImpl::StartStoryShell() {
-  fuchsia::ui::viewsv1token::ViewOwnerPtr view_owner;
-  auto request = view_owner.NewRequest();
-  story_provider_impl_->AttachView(story_id_, std::move(view_owner));
-
-  story_shell_app_ =
-      story_provider_impl_->StartStoryShell(story_id_, std::move(request));
-  story_shell_app_->services().ConnectToService(story_shell_.NewRequest());
-  fuchsia::modular::StoryShellContextPtr story_shell_context;
-  story_shell_context_impl_.Connect(story_shell_context.NewRequest());
-  story_shell_->Initialize(std::move(story_shell_context));
-  story_shell_.events().OnSurfaceFocused =
-      fit::bind_member(this, &StoryControllerImpl::OnSurfaceFocused);
-}
-
-void StoryControllerImpl::DetachView(std::function<void()> done) {
-  story_provider_impl_->DetachView(story_id_, std::move(done));
-}
-
-void StoryControllerImpl::SetRuntimeState(
-    const fuchsia::modular::StoryState new_state) {
-  story_mutator_->set_runtime_state(new_state);
-}
-
-void StoryControllerImpl::NotifyStoryWatchers(
-    const fuchsia::modular::storymodel::StoryModel& model) {
-  for (auto& i : watchers_.ptrs()) {
-    NotifyOneStoryWatcher(model, (*i).get());
-  }
-}
-
-void StoryControllerImpl::NotifyOneStoryWatcher(
-    const fuchsia::modular::storymodel::StoryModel& model,
-    fuchsia::modular::StoryWatcher* watcher) {
-  watcher->OnStateChange(*model.runtime_state());
-}
-
-bool StoryControllerImpl::IsExternalModule(
-    const std::vector<std::string>& module_path) {
-  auto* const i = FindRunningModInfo(module_path);
-  if (!i) {
-    return false;
-  }
-
-  return i->module_data->module_source ==
-         fuchsia::modular::ModuleSource::EXTERNAL;
-}
-
-StoryControllerImpl::RunningModInfo* StoryControllerImpl::FindRunningModInfo(
-    const std::vector<std::string>& module_path) {
-  for (auto& c : running_mod_infos_) {
-    if (c.module_data->module_path == module_path) {
-      return &c;
-    }
-  }
-  return nullptr;
-}
-
-StoryControllerImpl::RunningModInfo* StoryControllerImpl::FindAnchor(
-    RunningModInfo* running_mod_info) {
-  if (!running_mod_info) {
-    return nullptr;
-  }
-
-  auto* anchor = FindRunningModInfo(
-      ParentModulePath(running_mod_info->module_data->module_path));
-
-  // Traverse up until there is a non-embedded module.
-  while (anchor && anchor->module_data->is_embedded) {
-    anchor =
-        FindRunningModInfo(ParentModulePath(anchor->module_data->module_path));
-  }
-
-  return anchor;
-}
-
-void StoryControllerImpl::RemoveModuleFromStory(
-    const std::vector<std::string>& module_path) {
-  operation_queue_.Add(
-      new StopModuleAndStoryIfEmptyCall(this, module_path, [] {}));
-}
-
-void StoryControllerImpl::InitStoryEnvironment() {
-  FXL_DCHECK(!story_environment_)
-      << "Story scope already running for story_id = " << story_id_;
-
-  static const auto* const kEnvServices =
-      new std::vector<std::string>{fuchsia::modular::ContextWriter::Name_};
-  story_environment_ = std::make_unique<Environment>(
-      story_provider_impl_->user_environment(),
-      kStoryEnvironmentLabelPrefix + story_id_.get(), *kEnvServices,
-      /* kill_on_oom = */ false);
-  story_environment_->AddService<fuchsia::modular::ContextWriter>(
-      [this](fidl::InterfaceRequest<fuchsia::modular::ContextWriter> request) {
-        intelligence_services_->GetContextWriter(std::move(request));
-      });
-}
-
-void StoryControllerImpl::DestroyStoryEnvironment() {
-  story_environment_.reset();
-}
-
-void StoryControllerImpl::StartOngoingActivity(
-    const fuchsia::modular::OngoingActivityType ongoing_activity_type,
-    fidl::InterfaceRequest<fuchsia::modular::OngoingActivity> request) {
-  // Newly created/destroyed ongoing activities should be dispatched to the
-  // story provider.
-  auto dispatch_to_story_provider = [this] {
-    story_provider_impl_->NotifyStoryActivityChange(story_id_,
-                                                    GetOngoingActivities());
-  };
-
-  // When a connection is closed on the client-side, the OngoingActivityImpl is
-  // destroyed after it is removed from the binding set, so we dispatch to the
-  // story provider in the destructor of OngoingActivityImpl.
-  ongoing_activities_.AddBinding(
-      std::make_unique<OngoingActivityImpl>(
-          ongoing_activity_type,
-          /* on_destroy= */ dispatch_to_story_provider),
-      std::move(request));
-
-  // Conversely, when a connection is created, the OngoingActivityImpl is
-  // initialized before added to the binding set, so we need to dispatch after
-  // bind.
-  dispatch_to_story_provider();
-}
-
-void StoryControllerImpl::CreateEntity(
-    std::string type, fuchsia::mem::Buffer data,
-    fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request,
-    std::function<void(std::string /* entity_reference */)> callback) {
-  story_provider_impl_->CreateEntity(story_id_, type, std::move(data),
-                                     std::move(entity_request),
-                                     std::move(callback));
-}
-
-void StoryControllerImpl::OnSurfaceFocused(fidl::StringPtr surface_id) {
-  auto module_path = ModulePathFromSurfaceID(surface_id);
-
-  for (auto& watcher : watchers_.ptrs()) {
-    (*watcher)->OnModuleFocused(std::move(module_path));
-  }
-}
-
-}  // namespace modular
\ No newline at end of file
diff --git a/bin/sessionmgr/story_runner/story_controller_impl.h b/bin/sessionmgr/story_runner/story_controller_impl.h
deleted file mode 100644
index dbd22b2..0000000
--- a/bin/sessionmgr/story_runner/story_controller_impl.h
+++ /dev/null
@@ -1,345 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// The Story service is the context in which a story executes. It
-// starts modules and provides them with a handle to itself, so they
-// can start more modules. It also serves as the factory for
-// fuchsia::modular::Link instances, which are used to share data between
-// modules.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_CONTROLLER_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_CONTROLLER_IMPL_H_
-
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/scenic/snapshot/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fidl/cpp/interface_ptr.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/sessionmgr/puppet_master/command_runners/operation_calls/add_mod_call.h"
-#include "peridot/bin/sessionmgr/storage/session_storage.h"
-#include "peridot/bin/sessionmgr/story/model/story_mutator.h"
-#include "peridot/bin/sessionmgr/story/model/story_observer.h"
-#include "peridot/bin/sessionmgr/story_runner/link_impl.h"
-#include "peridot/bin/sessionmgr/story_runner/ongoing_activity_impl.h"
-#include "peridot/bin/sessionmgr/story_runner/story_shell_context_impl.h"
-#include "peridot/lib/fidl/app_client.h"
-#include "peridot/lib/fidl/environment.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_client.h"
-#include "peridot/lib/ledger_client/types.h"
-
-namespace modular {
-
-class ModuleContextImpl;
-class ModuleControllerImpl;
-class StoryModelMutator;
-class StoryProviderImpl;
-class StoryStorage;
-class StoryVisibilitySystem;
-
-// The story runner, which holds all the links and runs all the modules as well
-// as the story shell. It also implements the StoryController service to give
-// clients control over the story.
-class StoryControllerImpl : fuchsia::modular::StoryController {
- public:
-  StoryControllerImpl(SessionStorage* session_storage,
-                      StoryStorage* story_storage,
-                      std::unique_ptr<StoryMutator> story_mutator,
-                      std::unique_ptr<StoryObserver> story_observer,
-                      StoryVisibilitySystem* story_visibility_system,
-                      StoryProviderImpl* story_provider_impl);
-  ~StoryControllerImpl() override;
-
-  // Called by StoryProviderImpl.
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::StoryController> request);
-
-  // Called by StoryProviderImpl.
-  bool IsRunning();
-
-  // Called by StoryProviderImpl.
-  //
-  // Returns a list of the ongoing activities in this story.
-  fidl::VectorPtr<fuchsia::modular::OngoingActivityType> GetOngoingActivities();
-
-  void Sync(const std::function<void()>& done);
-
-  // Called by ModuleControllerImpl and ModuleContextImpl.
-  void FocusModule(const std::vector<std::string>& module_path);
-
-  // Called by ModuleControllerImpl.
-  void DefocusModule(const std::vector<std::string>& module_path);
-
-  // Called by ModuleControllerImpl.
-  void StopModule(const std::vector<std::string>& module_path,
-                  const std::function<void()>& done);
-
-  // Called by ModuleControllerImpl.
-  //
-  // Releases ownership of |controller| and cleans up any related internal
-  // storage. It is the caller's responsibility to delete |controller|.
-  void ReleaseModule(ModuleControllerImpl* module_controller_impl);
-
-  // Called by ModuleContextImpl.
-  fidl::StringPtr GetStoryId() const;
-
-  // Called by ModuleContextImpl.
-  void RequestStoryFocus();
-
-  // Called by ModuleContextImpl.
-  void ConnectLinkPath(fuchsia::modular::LinkPathPtr link_path,
-                       fidl::InterfaceRequest<fuchsia::modular::Link> request);
-
-  // Called by ModuleContextImpl.
-  fuchsia::modular::LinkPathPtr GetLinkPathForParameterName(
-      const std::vector<std::string>& module_path, std::string name);
-
-  // Called by ModuleContextImpl.
-  void EmbedModule(
-      AddModParams add_mod_params,
-      fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-          module_controller_request,
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-          view_owner_request,
-      std::function<void(fuchsia::modular::StartModuleStatus)> callback);
-
-  // Called by ModuleContextImpl.
-  void AddModuleToStory(
-      AddModParams add_mod_params,
-      fidl::InterfaceRequest<fuchsia::modular::ModuleController>
-          module_controller_request,
-      std::function<void(fuchsia::modular::StartModuleStatus)> callback);
-
-  // Stops the module at |module_path| in response to a call to
-  // |ModuleContext.RemoveSelfFromStory|.
-  void RemoveModuleFromStory(const std::vector<std::string>& module_path);
-
-  // Called by ModuleContextImpl.
-  void StartOngoingActivity(
-      const fuchsia::modular::OngoingActivityType ongoing_activity_type,
-      fidl::InterfaceRequest<fuchsia::modular::OngoingActivity> request);
-
-  // Called by ModuleContextImpl.
-  void CreateEntity(
-      std::string type, fuchsia::mem::Buffer data,
-      fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request,
-      std::function<void(std::string /* entity_reference */)> callback);
-
-  // Stops the story as part of a story provider operation. The story provider
-  // can indicate whether this is part of an operation where all stories are
-  // stopped at once in order to stop the session shell, indicated by bulk being
-  // true. Happens at logout or when session shells are swapped. In that
-  // situation, DetachView() is not called for this story.
-  void StopBulk(bool bulk, StopCallback done);
-
- private:
-  // Operations implemented here.
-  class AddIntentCall;
-  class DefocusCall;
-  class FocusCall;
-  class KillModuleCall;
-  class LaunchModuleCall;
-  class LaunchModuleInShellCall;
-  class OnModuleDataUpdatedCall;
-  class ResolveParameterCall;
-  class StartCall;
-  class StopCall;
-  class StopModuleCall;
-  class StopModuleAndStoryIfEmptyCall;
-  class StartSnapshotLoaderCall;
-  class UpdateSnapshotCall;
-
-  // For each *running* Module in the Story, there is one RunningModInfo.
-  struct RunningModInfo {
-    // NOTE: |module_data| is a cached copy of what is stored in
-    // |story_storage_|, the source of truth. It is updated in two
-    // places:
-    //
-    // 1) In LaunchModuleCall (used by LaunchModuleInShellCall) in the case
-    // that either a) the module isn't running yet or b) ModuleData.intent
-    // differs from what is cached.
-    //
-    // 2) Indirectly from OnModuleDataUpdated(), which is called when another
-    // device updates the Module by calling LaunchModuleInShellCall. However,
-    // this only happens if the Module is EXTERNAL (it was not explicitly added
-    // by another Module).
-    //
-    // TODO(thatguy): we should ensure that the local cached copy is always
-    // up to date no matter what.
-    fuchsia::modular::ModuleDataPtr module_data;
-    std::unique_ptr<ModuleContextImpl> module_context_impl;
-    std::unique_ptr<ModuleControllerImpl> module_controller_impl;
-  };
-
-  // A module's story shell-related information that we pend until we are able
-  // to pass it off to the story shell.
-  struct PendingViewForStoryShell {
-    std::vector<std::string> module_path;
-    fuchsia::modular::ModuleManifestPtr module_manifest;
-    fuchsia::modular::SurfaceRelationPtr surface_relation;
-    fuchsia::modular::ModuleSource module_source;
-    fuchsia::ui::viewsv1token::ViewOwnerPtr view_owner;
-  };
-
-  // |StoryController|
-  void Stop(StopCallback done) override;
-  void GetInfo(GetInfoCallback callback) override;
-  void RequestStart() override;
-  void TakeAndLoadSnapshot(
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> request,
-      TakeAndLoadSnapshotCallback done) override;
-  void Watch(
-      fidl::InterfaceHandle<fuchsia::modular::StoryWatcher> watcher) override;
-  void GetActiveModules(GetActiveModulesCallback callback) override;
-  void GetModules(GetModulesCallback callback) override;
-  void GetModuleController(
-      std::vector<std::string> module_path,
-      fidl::InterfaceRequest<fuchsia::modular::ModuleController> request)
-      override;
-  void GetActiveLinks(
-      fidl::InterfaceHandle<fuchsia::modular::StoryLinksWatcher> watcher,
-      GetActiveLinksCallback callback) override;
-  void GetLink(fuchsia::modular::LinkPath link_path,
-               fidl::InterfaceRequest<fuchsia::modular::Link> request) override;
-
-  // Communicates with SessionShell.
-  void StartStoryShell();
-  void DetachView(std::function<void()> done);
-
-  // Called whenever |story_storage_| sees an updated ModuleData from another
-  // device.
-  void OnModuleDataUpdated(fuchsia::modular::ModuleData module_data);
-
-  // Misc internal helpers.
-  void SetRuntimeState(fuchsia::modular::StoryState new_state);
-  void NotifyStoryWatchers(
-      const fuchsia::modular::storymodel::StoryModel& model);
-  void NotifyOneStoryWatcher(
-      const fuchsia::modular::storymodel::StoryModel& model,
-      fuchsia::modular::StoryWatcher* watcher);
-  void ProcessPendingStoryShellViews();
-  std::set<fuchsia::modular::LinkPath> GetActiveLinksInternal();
-
-  bool IsExternalModule(const std::vector<std::string>& module_path);
-
-  // Handles SessionShell OnModuleFocused event that indicates whether or not a
-  // surface was focused.
-  void OnSurfaceFocused(fidl::StringPtr surface_id);
-
-  // Initializes the Environment under which all new processes in the story are
-  // launched. Use |story_environment_| to manipulate the environment's
-  // services.
-  void InitStoryEnvironment();
-
-  // Destroys the Environment created for this story, tearing down all
-  // processes.
-  void DestroyStoryEnvironment();
-
-  // Finds the active RunningModInfo for a module at the given module path. May
-  // return nullptr if the module at the path is not running, regardless of
-  // whether a module at that path is known to the story.
-  RunningModInfo* FindRunningModInfo(
-      const std::vector<std::string>& module_path);
-
-  // Finds the active RunningModInfo for the story shell anchor of a module
-  // with the given |running_mod_info|. The anchor is the closest ancestor
-  // module of the given module that is not embedded and actually known to the
-  // story shell. This requires that it must be running, otherwise it cannot be
-  // connected to the story shell. May return nullptr if the anchor module, or
-  // any intermediate module, is not running, regardless of whether a module at
-  // such path is known to the story.
-  RunningModInfo* FindAnchor(RunningModInfo* running_mod_info);
-
-  // The ID of the story, copied from |story_observer_| for convenience in
-  // transitioning clients.  TODO(thatguy): Remove users of this in favor of
-  // reading from the |story_observer_| directly.
-  const fidl::StringPtr story_id_;
-
-  StoryProviderImpl* const story_provider_impl_;  // Not owned.
-  SessionStorage* const session_storage_;         // Not owned.
-  StoryStorage* const story_storage_;             // Not owned.
-
-  std::unique_ptr<StoryMutator> story_mutator_;
-  std::unique_ptr<StoryObserver> story_observer_;
-  StoryVisibilitySystem* const story_visibility_system_;  // Not owned.
-
-  // The application environment (which abstracts a zx::job) in which the
-  // modules within this story run. This environment is only valid (not null) if
-  // the story is running.
-  std::unique_ptr<Environment> story_environment_;
-
-  // Implements the primary service provided here:
-  // fuchsia::modular::StoryController.
-  fidl::BindingSet<fuchsia::modular::StoryController> bindings_;
-
-  // Watcher for various aspects of the story.
-  fidl::InterfacePtrSet<fuchsia::modular::StoryWatcher> watchers_;
-  fidl::InterfacePtrSet<fuchsia::modular::StoryLinksWatcher> links_watchers_;
-
-  // Everything for the story shell. Relationships between modules are conveyed
-  // to the story shell using their instance IDs.
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> story_shell_app_;
-  fuchsia::modular::StoryShellPtr story_shell_;
-
-  StoryShellContextImpl story_shell_context_impl_;
-
-  // The module instances (identified by their serialized module paths) already
-  // known to story shell. Does not include modules whose views are pending and
-  // not yet sent to story shell.
-  std::set<fidl::StringPtr> connected_views_;
-
-  // Since story shell cannot display views whose parents are not yet displayed,
-  // |pending_story_shell_views_| holds the view of a non-embedded running
-  // module (identified by its serialized module path) until its parent is
-  // connected to story shell.
-  std::map<std::string, PendingViewForStoryShell> pending_story_shell_views_;
-
-  std::vector<RunningModInfo> running_mod_infos_;
-
-  // The second ingredient of a story: Links. They connect Modules.
-  fidl::BindingSet<Link, std::unique_ptr<LinkImpl>> link_impls_;
-
-  // This is the source of truth on which activities are currently ongoing in
-  // the story's modules.
-  fidl::BindingSet<fuchsia::modular::OngoingActivity,
-                   std::unique_ptr<OngoingActivityImpl>>
-      ongoing_activities_;
-
-  // Used to load snapshots.
-  fuchsia::scenic::snapshot::LoaderPtr snapshot_loader_;
-
-  // A collection of services, scoped to this Story, for use by intelligent
-  // Modules.
-  fuchsia::modular::IntelligenceServicesPtr intelligence_services_;
-
-  // Asynchronous operations are sequenced in a queue.
-  OperationQueue operation_queue_;
-
-  fxl::WeakPtrFactory<StoryControllerImpl> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryControllerImpl);
-};
-
-// NOTE: This is only exposed publicly for testing.
-bool ShouldRestartModuleForNewIntent(
-    const fuchsia::modular::Intent& old_intent,
-    const fuchsia::modular::Intent& new_intent);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_CONTROLLER_IMPL_H_
diff --git a/bin/sessionmgr/story_runner/story_controller_impl_unittest.cc b/bin/sessionmgr/story_runner/story_controller_impl_unittest.cc
deleted file mode 100644
index e9f2390..0000000
--- a/bin/sessionmgr/story_runner/story_controller_impl_unittest.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-////////////////////////////////////////////////////////////////////////////
-// NOTE: This is an incomplete test of StoryControllerImpl. We are closer now to
-// being able to construct a StoryControllerImpl without a StoryProviderImpl,
-// but not yet.
-//
-// Fow now this only tests one public function in story_controller_impl.cc
-// (ShouldRestartModuleForNewIntent).
-////////////////////////////////////////////////////////////////////////////
-
-#include "peridot/bin/sessionmgr/story_runner/story_controller_impl.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "gtest/gtest.h"
-
-using fuchsia::modular::Intent;
-
-namespace modular {
-namespace {
-
-TEST(StoryControllerImplTest, ShouldRestartModuleForNewIntent) {
-  Intent one;
-  Intent two;
-
-  // Handler differs.
-  one.handler = "handler1";
-  two.handler = "handler2";
-  EXPECT_TRUE(ShouldRestartModuleForNewIntent(one, two));
-  two.handler = "handler1";
-  EXPECT_FALSE(ShouldRestartModuleForNewIntent(one, two));
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/sessionmgr/story_runner/story_entity_provider.cc b/bin/sessionmgr/story_runner/story_entity_provider.cc
deleted file mode 100644
index 18b5d96..0000000
--- a/bin/sessionmgr/story_runner/story_entity_provider.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story_runner/story_entity_provider.h"
-
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/random/uuid.h>
-#include <utility>
-
-namespace modular {
-
-StoryEntityProvider::StoryEntityProvider(StoryStorage* story_storage)
-    : story_storage_(story_storage) {}
-
-StoryEntityProvider::~StoryEntityProvider() = default;
-
-void StoryEntityProvider::CreateEntity(
-    const std::string& type, fuchsia::mem::Buffer data,
-    std::function<void(std::string /* cookie */)> callback) {
-  const std::string cookie = fxl::GenerateUUID();
-  story_storage_->SetEntityData(cookie, type, std::move(data))
-      ->Then([this, cookie,
-              callback = std::move(callback)](StoryStorage::Status status) {
-        if (status == StoryStorage::Status::OK) {
-          callback(cookie);
-        } else {
-          callback(nullptr);
-        }
-      });
-}
-
-void StoryEntityProvider::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::EntityProvider> provider_request) {
-  provider_bindings_.AddBinding(this, std::move(provider_request));
-}
-
-void StoryEntityProvider::GetTypes(std::string cookie,
-                                   GetTypesCallback callback) {
-  story_storage_->GetEntityType(cookie)->Then(
-      [callback = std::move(callback)](StoryStorage::Status status,
-                                       std::string type) {
-        std::vector<std::string> types;
-        types.push_back(type);
-        callback(std::move(types));
-      });
-}
-
-void StoryEntityProvider::GetData(std::string cookie, std::string type,
-                                  GetDataCallback callback) {
-  story_storage_->GetEntityData(cookie, type)
-      ->Then([callback = std::move(callback)](StoryStorage::Status status,
-                                              fuchsia::mem::BufferPtr data) {
-        callback(std::move(data));
-      });
-}
-
-void StoryEntityProvider::WriteData(std::string cookie,
-                                    std::string type,
-                                    fuchsia::mem::Buffer data,
-                                    WriteDataCallback callback) {
-  story_storage_->SetEntityData(cookie, type, std::move(data))
-      ->Then([callback = std::move(callback)](StoryStorage::Status status) {
-        switch (status) {
-          case StoryStorage::Status::OK:
-            callback(fuchsia::modular::EntityWriteStatus::OK);
-            break;
-          case StoryStorage::Status::INVALID_ENTITY_TYPE:
-            // fallthrough
-          case StoryStorage::Status::INVALID_ENTITY_COOKIE:
-            // fallthrough
-          case StoryStorage::Status::LEDGER_ERROR:
-            // fallthrough
-          case StoryStorage::Status::VMO_COPY_ERROR:
-            callback(fuchsia::modular::EntityWriteStatus::ERROR);
-            break;
-        };
-      });
-}
-
-void StoryEntityProvider::Watch(
-    std::string cookie, std::string type,
-    fidl::InterfaceHandle<fuchsia::modular::EntityWatcher> watcher) {
-  fuchsia::modular::EntityWatcherPtr entity_watcher = watcher.Bind();
-  story_storage_->WatchEntity(cookie, type, std::move(entity_watcher));
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story_runner/story_entity_provider.h b/bin/sessionmgr/story_runner/story_entity_provider.h
deleted file mode 100644
index b733141..0000000
--- a/bin/sessionmgr/story_runner/story_entity_provider.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_ENTITY_PROVIDER_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_ENTITY_PROVIDER_H_
-
-#include <map>
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-
-namespace modular {
-
-// The entity provider which is used to provide entities associated with a
-// particular story.
-class StoryEntityProvider : public fuchsia::modular::EntityProvider {
- public:
-  // Creates a new StoryEntityProvider associated with the story backed by
-  // |story_storage|.
-  StoryEntityProvider(StoryStorage* story_storage);
-
-  ~StoryEntityProvider();
-
-  // Creates a new entity with the given |type| and |data|.
-  //
-  // |callback| will be called with the entity cookie, or an empty string if the
-  //  creation failed.
-  void CreateEntity(const std::string& type, fuchsia::mem::Buffer data,
-                    std::function<void(std::string /* cookie */)> callback);
-
-  void Connect(fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-                   provider_request);
-
- private:
-  // |fuchsia::modular::EntityProvider|
-  void GetTypes(std::string cookie, GetTypesCallback callback) override;
-
-  // |fuchsia::modular::EntityProvider|
-  void GetData(std::string cookie, std::string type,
-               GetDataCallback callback) override;
-
-  // |fuchsia::modular::EntityProvider|
-  void WriteData(std::string cookie, std::string type,
-                 fuchsia::mem::Buffer data,
-                 WriteDataCallback callback) override;
-
-  // |fuchsia::modular::EntityProvider|
-  void Watch(
-      std::string cookie, std::string type,
-      fidl::InterfaceHandle<fuchsia::modular::EntityWatcher> watcher) override;
-
-  const std::string story_id_;
-  StoryStorage* story_storage_;  // Not owned.
-
-  fidl::BindingSet<fuchsia::modular::EntityProvider> provider_bindings_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_ENTITY_PROVIDER_H_
-
diff --git a/bin/sessionmgr/story_runner/story_provider_impl.cc b/bin/sessionmgr/story_runner/story_provider_impl.cc
deleted file mode 100644
index a46b29f..0000000
--- a/bin/sessionmgr/story_runner/story_provider_impl.cc
+++ /dev/null
@@ -1,798 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story_runner/story_provider_impl.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include <fuchsia/scenic/snapshot/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/handles/object_info.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/random/uuid.h>
-#include <lib/zx/time.h>
-
-#include "peridot/bin/basemgr/cobalt/cobalt.h"
-#include "peridot/bin/sessionmgr/focus.h"
-#include "peridot/bin/sessionmgr/presentation_provider.h"
-#include "peridot/bin/sessionmgr/storage/constants_and_utils.h"
-#include "peridot/bin/sessionmgr/storage/session_storage.h"
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-#include "peridot/bin/sessionmgr/story/systems/story_visibility_system.h"
-#include "peridot/bin/sessionmgr/story_runner/link_impl.h"
-#include "peridot/bin/sessionmgr/story_runner/story_controller_impl.h"
-#include "peridot/lib/common/names.h"
-#include "peridot/lib/common/teardown.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/fidl/proxy.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-
-// In tests prefetching mondrian saved ~30ms in story start up time.
-#define PREFETCH_MONDRIAN 1
-
-namespace modular {
-
-constexpr char kSnapshotLoaderUrl[] = "snapshot";
-
-class StoryProviderImpl::StopStoryCall : public Operation<> {
- public:
-  using StoryRuntimesMap = std::map<std::string, struct StoryRuntimeContainer>;
-
-  StopStoryCall(fidl::StringPtr story_id, const bool bulk,
-                StoryRuntimesMap* const story_runtime_containers,
-                MessageQueueManager* const message_queue_manager,
-                ResultCall result_call)
-      : Operation("StoryProviderImpl::DeleteStoryCall", std::move(result_call)),
-        story_id_(story_id),
-        bulk_(bulk),
-        story_runtime_containers_(story_runtime_containers),
-        message_queue_manager_(message_queue_manager) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    auto i = story_runtime_containers_->find(story_id_);
-    if (i == story_runtime_containers_->end()) {
-      FXL_LOG(WARNING) << "I was told to teardown story " << story_id_
-                       << ", but I can't find it.";
-      return;
-    }
-
-    FXL_DCHECK(i->second.controller_impl != nullptr);
-    i->second.controller_impl->StopBulk(bulk_,
-                                        [this, flow] { CleanupRuntime(flow); });
-  }
-
-  void CleanupRuntime(FlowToken flow) {
-    // Here we delete the instance from whose operation a result callback was
-    // received. Thus we must assume that the callback returns to a method of
-    // the instance. If we delete the instance right here, |this| would be
-    // deleted not just for the remainder of this function here, but also for
-    // the remainder of all functions above us in the callstack, including
-    // functions that run as methods of other objects owned by |this| or
-    // provided to |this|. To avoid such problems, the delete is invoked
-    // through the run loop.
-    //
-    // TODO(thatguy); Understand the above comment, and rewrite it.
-    async::PostTask(async_get_default_dispatcher(), [this, flow] {
-      story_runtime_containers_->erase(story_id_);
-      message_queue_manager_->DeleteNamespace(
-          EncodeModuleComponentNamespace(story_id_), [flow] {});
-    });
-  }
-
- private:
-  const fidl::StringPtr story_id_;
-  const bool bulk_;
-  StoryRuntimesMap* const story_runtime_containers_;
-  MessageQueueManager* const message_queue_manager_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StopStoryCall);
-};
-
-// Loads a StoryRuntimeContainer object and stores it in
-// |story_provider_impl.story_runtime_containers_| so that the story is ready
-// to be run.
-class StoryProviderImpl::LoadStoryRuntimeCall
-    : public Operation<StoryRuntimeContainer*> {
- public:
-  LoadStoryRuntimeCall(StoryProviderImpl* const story_provider_impl,
-                       SessionStorage* const session_storage,
-                       fidl::StringPtr story_id, ResultCall result_call)
-      : Operation("StoryProviderImpl::LoadStoryRuntimeCall",
-                  std::move(result_call)),
-        story_provider_impl_(story_provider_impl),
-        session_storage_(session_storage),
-        story_id_(story_id) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &story_runtime_container_};
-
-    // Use the existing controller, if possible.
-    // This won't race against itself because it's managed by an operation
-    // queue.
-    auto i = story_provider_impl_->story_runtime_containers_.find(story_id_);
-    if (i != story_provider_impl_->story_runtime_containers_.end()) {
-      story_runtime_container_ = &i->second;
-      return;
-    }
-
-    session_storage_->GetStoryData(story_id_)->WeakThen(
-        GetWeakPtr(),
-        [this, flow](fuchsia::modular::internal::StoryDataPtr story_data) {
-          if (!story_data) {
-            return;
-            // Operation finishes since |flow| goes out of scope.
-          }
-          Cont(std::move(story_data), flow);
-        });
-  }
-
-  void Cont(fuchsia::modular::internal::StoryDataPtr story_data,
-            FlowToken flow) {
-    session_storage_->GetStoryStorage(story_id_)->WeakThen(
-        GetWeakPtr(),
-        fxl::MakeCopyable(
-            [this, story_data = std::move(story_data),
-             flow](std::unique_ptr<StoryStorage> story_storage) mutable {
-              struct StoryRuntimeContainer container {
-                .executor = std::make_unique<async::Executor>(
-                    async_get_default_dispatcher()),
-                .storage = std::move(story_storage),
-                .current_data = std::move(story_data),
-              };
-
-              container.model_owner = std::make_unique<StoryModelOwner>(
-                  story_id_, container.executor.get(),
-                  std::make_unique<NoopStoryModelStorage>());
-              container.model_observer = container.model_owner->NewObserver();
-
-              // Create systems that are part of this story.
-              auto story_visibility_system =
-                  std::make_unique<StoryVisibilitySystem>(
-                      container.model_owner->NewMutator());
-
-              container.controller_impl = std::make_unique<StoryControllerImpl>(
-                  session_storage_, container.storage.get(),
-                  container.model_owner->NewMutator(),
-                  container.model_owner->NewObserver(),
-                  story_visibility_system.get(), story_provider_impl_);
-              container.entity_provider = std::make_unique<StoryEntityProvider>(
-                  container.storage.get());
-
-              // Hand ownership of systems over to |container|.
-              container.systems.push_back(std::move(story_visibility_system));
-
-              // Register a listener on the StoryModel so that we can signal
-              // our watchers when relevant data changes.
-              container.model_observer->RegisterListener(
-                  [id = story_id_, story_provider = story_provider_impl_](
-                      const fuchsia::modular::storymodel::StoryModel& model) {
-                    story_provider->NotifyStoryStateChange(id);
-                  });
-
-              auto it = story_provider_impl_->story_runtime_containers_.emplace(
-                  story_id_, std::move(container));
-              story_runtime_container_ = &it.first->second;
-            }));
-  }
-
-  StoryProviderImpl* const story_provider_impl_;  // not owned
-  SessionStorage* const session_storage_;         // not owned
-  const fidl::StringPtr story_id_;
-
-  // Return value.
-  StoryRuntimeContainer* story_runtime_container_ = nullptr;
-
-  // Sub operations run in this queue.
-  OperationQueue operation_queue_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LoadStoryRuntimeCall);
-};
-
-class StoryProviderImpl::StopAllStoriesCall : public Operation<> {
- public:
-  StopAllStoriesCall(StoryProviderImpl* const story_provider_impl,
-                     ResultCall result_call)
-      : Operation("StoryProviderImpl::StopAllStoriesCall",
-                  std::move(result_call)),
-        story_provider_impl_(story_provider_impl) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    for (auto& it : story_provider_impl_->story_runtime_containers_) {
-      // Each callback has a copy of |flow| which only goes out-of-scope
-      // once the story corresponding to |it| stops.
-      //
-      // TODO(thatguy): If the StoryControllerImpl is deleted before it can
-      // complete StopWithoutNotifying(), we will never be called back and the
-      // OperationQueue on which we're running will block.  Moving over to
-      // fit::promise will allow us to observe cancellation.
-      operations_.Add(new StopStoryCall(
-          it.first, true /* bulk */,
-          &story_provider_impl_->story_runtime_containers_,
-          story_provider_impl_->component_context_info_.message_queue_manager,
-          [flow] {}));
-    }
-  }
-
-  OperationCollection operations_;
-
-  StoryProviderImpl* const story_provider_impl_;  // not owned
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StopAllStoriesCall);
-};
-
-class StoryProviderImpl::StopStoryShellCall : public Operation<> {
- public:
-  StopStoryShellCall(StoryProviderImpl* const story_provider_impl,
-                     ResultCall result_call)
-      : Operation("StoryProviderImpl::StopStoryShellCall",
-                  std::move(result_call)),
-        story_provider_impl_(story_provider_impl) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-    if (story_provider_impl_->preloaded_story_shell_app_) {
-      // Calling Teardown() below will branch |flow| into normal and timeout
-      // paths. |flow| must go out of scope when either of the paths
-      // finishes.
-      FlowTokenHolder branch{flow};
-      story_provider_impl_->preloaded_story_shell_app_->Teardown(
-          kBasicTimeout,
-          [branch] { std::unique_ptr<FlowToken> flow = branch.Continue(); });
-    }
-  }
-
-  StoryProviderImpl* const story_provider_impl_;  // not owned
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StopStoryShellCall);
-};
-
-class StoryProviderImpl::GetStoryEntityProviderCall
-    : public Operation<StoryEntityProvider*> {
- public:
-  GetStoryEntityProviderCall(StoryProviderImpl* const story_provider_impl,
-                             const std::string& story_id,
-                             ResultCall result_call)
-      : Operation("StoryProviderImpl::GetStoryEntityProviderCall",
-                  std::move(result_call)),
-        story_provider_impl_(story_provider_impl),
-        story_id_(story_id) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &story_entity_provider_};
-
-    operation_queue_.Add(new LoadStoryRuntimeCall(
-        story_provider_impl_, story_provider_impl_->session_storage_, story_id_,
-        [this, flow](StoryRuntimeContainer* story_controller_container) {
-          if (story_controller_container) {
-            story_entity_provider_ =
-                story_controller_container->entity_provider.get();
-          }
-        }));
-  }
-
-  StoryProviderImpl* const story_provider_impl_;  // not owned
-
-  // The returned story entity provider.
-  StoryEntityProvider* story_entity_provider_ = nullptr;
-
-  fuchsia::modular::StoryInfoPtr story_info_;
-
-  OperationQueue operation_queue_;
-
-  std::string story_id_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(GetStoryEntityProviderCall);
-};
-
-StoryProviderImpl::StoryProviderImpl(
-    Environment* const user_environment, std::string device_id,
-    SessionStorage* const session_storage,
-    fuchsia::modular::AppConfig story_shell,
-    const ComponentContextInfo& component_context_info,
-    fuchsia::modular::FocusProviderPtr focus_provider,
-    fuchsia::modular::UserIntelligenceProvider* const
-        user_intelligence_provider,
-    fuchsia::modular::ModuleResolver* const module_resolver,
-    EntityProviderRunner* const entity_provider_runner,
-    modular::ModuleFacetReader* const module_facet_reader,
-    PresentationProvider* const presentation_provider,
-    fuchsia::ui::viewsv1::ViewSnapshotPtr view_snapshot, const bool test)
-    : user_environment_(user_environment),
-      session_storage_(session_storage),
-      device_id_(std::move(device_id)),
-      story_shell_(std::move(story_shell)),
-      test_(test),
-      component_context_info_(component_context_info),
-      user_intelligence_provider_(user_intelligence_provider),
-      module_resolver_(module_resolver),
-      entity_provider_runner_(entity_provider_runner),
-      module_facet_reader_(module_facet_reader),
-      presentation_provider_(presentation_provider),
-      focus_provider_(std::move(focus_provider)),
-      focus_watcher_binding_(this),
-      view_snapshot_(std::move(view_snapshot)),
-      weak_factory_(this) {
-  session_storage_->set_on_story_deleted(
-      [weak_ptr = weak_factory_.GetWeakPtr()](fidl::StringPtr story_id) {
-        if (!weak_ptr)
-          return;
-        weak_ptr->OnStoryStorageDeleted(std::move(story_id));
-      });
-  session_storage_->set_on_story_updated(
-      [weak_ptr = weak_factory_.GetWeakPtr()](
-          fidl::StringPtr story_id,
-          fuchsia::modular::internal::StoryData story_data) {
-        if (!weak_ptr)
-          return;
-        weak_ptr->OnStoryStorageUpdated(std::move(story_id),
-                                        std::move(story_data));
-      });
-
-  focus_provider_->Watch(focus_watcher_binding_.NewBinding());
-  if (!test_) {
-    // As an optimization, since app startup time is long, we optimistically
-    // load a story shell instance even if there are no stories that need it
-    // yet. This can reduce the time to first frame.
-    MaybeLoadStoryShellDelayed();
-  }
-}
-
-StoryProviderImpl::~StoryProviderImpl() = default;
-
-void StoryProviderImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::StoryProvider> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void StoryProviderImpl::StopAllStories(const std::function<void()>& callback) {
-  operation_queue_.Add(new StopAllStoriesCall(this, callback));
-}
-
-void StoryProviderImpl::SetSessionShell(
-    fuchsia::modular::SessionShellPtr session_shell) {
-  // Not on operation queue, because it's called only after all stories have
-  // been stopped or none are running yet, i.e. when no Operations that would
-  // call this interface are scheduled. If there is an operation pending here,
-  // then it would pertain to a story running in the new session shell started
-  // by puppet master or an agent, so we must assign this now.
-  //
-  // TODO(mesch): It may well be that we need to revisit this when we support
-  // starting stories, or swapping session shells, through puppet master, i.e.
-  // from outside the session shell.
-  //
-  // TODO(mesch): Add a WARNING log if the operation is not empty.
-  session_shell_ = std::move(session_shell);
-}
-
-void StoryProviderImpl::Teardown(const std::function<void()>& callback) {
-  // Closing all binding to this instance ensures that no new messages come
-  // in, though previous messages need to be processed. The stopping of
-  // stories is done on |operation_queue_| since that must strictly happen
-  // after all pending messgages have been processed.
-  bindings_.CloseAll();
-  operation_queue_.Add(new StopAllStoriesCall(this, [] {}));
-  operation_queue_.Add(new StopStoryShellCall(this, callback));
-}
-
-// |fuchsia::modular::StoryProvider|
-void StoryProviderImpl::Watch(
-    fidl::InterfaceHandle<fuchsia::modular::StoryProviderWatcher> watcher) {
-  auto watcher_ptr = watcher.Bind();
-  for (const auto& item : story_runtime_containers_) {
-    const auto& container = item.second;
-    watcher_ptr->OnChange(
-        CloneStruct(container.current_data->story_info),
-        *container.model_observer->model().runtime_state(),
-        *container.model_observer->model().visibility_state());
-  }
-  watchers_.AddInterfacePtr(std::move(watcher_ptr));
-}
-
-// |fuchsia::modular::StoryProvider|
-void StoryProviderImpl::WatchActivity(
-    fidl::InterfaceHandle<fuchsia::modular::StoryActivityWatcher> watcher) {
-  auto watcher_ptr = watcher.Bind();
-  for (const auto& item : story_runtime_containers_) {
-    const auto& container = item.second;
-    watcher_ptr->OnStoryActivityChange(
-        *container.model_observer->model().name(),
-        container.controller_impl->GetOngoingActivities());
-  }
-  activity_watchers_.AddInterfacePtr(std::move(watcher_ptr));
-}
-
-std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>>
-StoryProviderImpl::StartStoryShell(
-    fidl::StringPtr story_id,
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> request) {
-  MaybeLoadStoryShell();
-
-  auto app_client = std::move(preloaded_story_shell_app_);
-
-  // TODO(SCN-1019): This is a temporary hack to cache the endpoint ID of the
-  // view so that framework can make snapshot requests.
-  view_endpoints_[story_id] = fsl::GetKoid(request.channel().get());
-
-  fuchsia::ui::viewsv1::ViewProviderPtr view_provider;
-  app_client->services().ConnectToService(view_provider.NewRequest());
-  view_provider->CreateView(std::move(request), nullptr);
-
-  // Kickoff another fuchsia::modular::StoryShell, to make it faster for next
-  // story. We optimize even further by delaying the loading of the next story
-  // shell instance by waiting a few seconds.
-  if (!test_) {
-    MaybeLoadStoryShellDelayed();
-  }
-
-  return app_client;
-}
-
-void StoryProviderImpl::MaybeLoadStoryShellDelayed() {
-#if PREFETCH_MONDRIAN
-  async::PostDelayedTask(
-      async_get_default_dispatcher(),
-      [weak_this = weak_factory_.GetWeakPtr()] {
-        if (weak_this) {
-          weak_this->operation_queue_.Add(new SyncCall([weak_this] {
-            if (weak_this) {
-              weak_this->MaybeLoadStoryShell();
-            }
-          }));
-        }
-      },
-      zx::sec(5));
-#endif
-}
-
-void StoryProviderImpl::MaybeLoadStoryShell() {
-  if (preloaded_story_shell_app_) {
-    return;
-  }
-
-  preloaded_story_shell_app_ =
-      std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
-          user_environment_->GetLauncher(), CloneStruct(story_shell_));
-}
-
-fuchsia::modular::StoryInfoPtr StoryProviderImpl::GetCachedStoryInfo(
-    std::string story_id) {
-  auto it = story_runtime_containers_.find(story_id);
-  if (it == story_runtime_containers_.end()) {
-    return nullptr;
-  }
-
-  return CloneOptional(it->second.current_data->story_info);
-}
-
-// |fuchsia::modular::StoryProvider|
-void StoryProviderImpl::GetStoryInfo(std::string story_id,
-                                     GetStoryInfoCallback callback) {
-  auto on_run = Future<>::Create("StoryProviderImpl.GetStoryInfo.on_run");
-  auto done =
-      on_run
-          ->AsyncMap([this, story_id] {
-            return session_storage_->GetStoryData(story_id);
-          })
-          ->Map([](fuchsia::modular::internal::StoryDataPtr story_data)
-                    -> fuchsia::modular::StoryInfoPtr {
-            if (!story_data) {
-              return nullptr;
-            }
-            return fidl::MakeOptional(std::move(story_data->story_info));
-          });
-  operation_queue_.Add(WrapFutureAsOperation("StoryProviderImpl::GetStoryInfo",
-                                             on_run, done, callback));
-}
-
-// Called by StoryControllerImpl on behalf of ModuleContextImpl
-void StoryProviderImpl::RequestStoryFocus(fidl::StringPtr story_id) {
-  FXL_LOG(INFO) << "RequestStoryFocus() " << story_id;
-  focus_provider_->Request(story_id);
-}
-
-void StoryProviderImpl::AttachView(
-    fidl::StringPtr story_id,
-    fuchsia::ui::viewsv1token::ViewOwnerPtr view_owner) {
-  FXL_CHECK(session_shell_);
-  fuchsia::modular::ViewIdentifier view_id;
-  view_id.story_id = std::move(story_id);
-  session_shell_->AttachView(std::move(view_id), std::move(view_owner));
-}
-
-void StoryProviderImpl::DetachView(fidl::StringPtr story_id,
-                                   std::function<void()> done) {
-  FXL_CHECK(session_shell_);
-  fuchsia::modular::ViewIdentifier view_id;
-  view_id.story_id = std::move(story_id);
-  session_shell_->DetachView(std::move(view_id), std::move(done));
-}
-
-void StoryProviderImpl::NotifyStoryStateChange(fidl::StringPtr story_id) {
-  auto it = story_runtime_containers_.find(story_id);
-  if (it == story_runtime_containers_.end()) {
-    // If this call arrives while DeleteStory() is in
-    // progress, the story controller might already be gone
-    // from here.
-    return;
-  }
-  NotifyStoryWatchers(it->second.current_data.get(),
-                      *it->second.model_observer->model().runtime_state(),
-                      *it->second.model_observer->model().visibility_state());
-}
-
-void StoryProviderImpl::NotifyStoryActivityChange(
-    fidl::StringPtr story_id,
-    fidl::VectorPtr<fuchsia::modular::OngoingActivityType> ongoing_activities) {
-  for (const auto& i : activity_watchers_.ptrs()) {
-    (*i)->OnStoryActivityChange(story_id, ongoing_activities.Clone());
-  }
-}
-
-// |fuchsia::modular::StoryProvider|
-void StoryProviderImpl::GetController(
-    std::string story_id,
-    fidl::InterfaceRequest<fuchsia::modular::StoryController> request) {
-  operation_queue_.Add(new LoadStoryRuntimeCall(
-      this, session_storage_, story_id,
-      fxl::MakeCopyable(
-          [request = std::move(request)](
-              StoryRuntimeContainer* story_controller_container) mutable {
-            if (story_controller_container) {
-              story_controller_container->controller_impl->Connect(
-                  std::move(request));
-            }
-          })));
-}
-
-// |fuchsia::modular::StoryProvider|
-void StoryProviderImpl::GetStories(
-    fidl::InterfaceHandle<fuchsia::modular::StoryProviderWatcher> watcher,
-    PreviousStoriesCallback callback) {
-  auto watcher_ptr = watcher.Bind();
-  auto on_run = Future<>::Create("StoryProviderImpl.GetStories.on_run");
-  auto done =
-      on_run->AsyncMap([this] { return session_storage_->GetAllStoryData(); })
-          ->Map(fxl::MakeCopyable(
-              [this, watcher_ptr = std::move(watcher_ptr)](
-                  std::vector<fuchsia::modular::internal::StoryData>
-                      all_story_data) mutable {
-                std::vector<fuchsia::modular::StoryInfo> result;
-
-                for (auto& story_data : all_story_data) {
-                  if (!story_data.story_options.kind_of_proto_story) {
-                    result.push_back(std::move(story_data.story_info));
-                  }
-                }
-
-                if (watcher_ptr) {
-                  watchers_.AddInterfacePtr(std::move(watcher_ptr));
-                }
-                return result;
-              }));
-
-  operation_queue_.Add(WrapFutureAsOperation("StoryProviderImpl::GetStories",
-                                             on_run, done, callback));
-}
-
-// |fuchsia::modular::StoryProvider|
-void StoryProviderImpl::PreviousStories(PreviousStoriesCallback callback) {
-  auto on_run = Future<>::Create("StoryProviderImpl.PreviousStories.on_run");
-  auto done =
-      on_run->AsyncMap([this] { return session_storage_->GetAllStoryData(); })
-          ->Map([](std::vector<fuchsia::modular::internal::StoryData>
-                       all_story_data) {
-            std::vector<fuchsia::modular::StoryInfo> result;
-
-            for (auto& story_data : all_story_data) {
-              if (!story_data.story_options.kind_of_proto_story) {
-                result.push_back(std::move(story_data.story_info));
-              }
-            }
-            return result;
-          });
-  operation_queue_.Add(WrapFutureAsOperation(
-      "StoryProviderImpl::PreviousStories", on_run, done, callback));
-}
-
-void StoryProviderImpl::OnStoryStorageUpdated(
-    fidl::StringPtr story_id,
-    fuchsia::modular::internal::StoryData story_data) {
-  // If we have a StoryRuntimeContainer for this story id, update our cached
-  // StoryData and get runtime state available from it.
-  //
-  // Otherwise, use defaults for an unloaded story.
-  fuchsia::modular::StoryState runtime_state = fuchsia::modular::StoryState::STOPPED;
-  fuchsia::modular::StoryVisibilityState visibility_state =
-      fuchsia::modular::StoryVisibilityState::DEFAULT;
-  auto i = story_runtime_containers_.find(story_data.story_info.id);
-  if (i != story_runtime_containers_.end()) {
-    runtime_state = *i->second.model_observer->model().runtime_state();
-    visibility_state = *i->second.model_observer->model().visibility_state();
-    i->second.current_data = CloneOptional(story_data);
-  }
-  NotifyStoryWatchers(&story_data, runtime_state, visibility_state);
-}
-
-void StoryProviderImpl::OnStoryStorageDeleted(fidl::StringPtr story_id) {
-  operation_queue_.Add(new StopStoryCall(
-      story_id, false /* bulk */, &story_runtime_containers_,
-      component_context_info_.message_queue_manager, [this, story_id] {
-        for (const auto& i : watchers_.ptrs()) {
-          (*i)->OnDelete(story_id);
-        }
-      }));
-}
-
-// |fuchsia::modular::FocusWatcher|
-void StoryProviderImpl::OnFocusChange(fuchsia::modular::FocusInfoPtr info) {
-  operation_queue_.Add(
-      new SyncCall(fxl::MakeCopyable([this, info = std::move(info)]() {
-        if (info->device_id != device_id_) {
-          return;
-        }
-
-        if (info->focused_story_id.is_null()) {
-          return;
-        }
-
-        auto i = story_runtime_containers_.find(info->focused_story_id.get());
-        if (i == story_runtime_containers_.end()) {
-          FXL_LOG(ERROR) << "Story controller not found for focused story "
-                         << info->focused_story_id;
-          return;
-        }
-
-        // Last focus time is recorded in the ledger, and story provider
-        // watchers are notified through watching SessionStorage.
-        auto on_run =
-            Future<>::Create("StoryProviderImpl.OnFocusChange.on_run");
-        auto done = on_run->AsyncMap([this, story_id = info->focused_story_id] {
-          return session_storage_->UpdateLastFocusedTimestamp(
-              story_id, zx_clock_get(ZX_CLOCK_UTC));
-        });
-        std::function<void()> callback = [] {};
-        operation_queue_.Add(WrapFutureAsOperation(
-            "StoryProviderImpl::OnFocusChange", on_run, done, callback));
-      })));
-}
-
-void StoryProviderImpl::NotifyStoryWatchers(
-    const fuchsia::modular::internal::StoryData* story_data,
-    const fuchsia::modular::StoryState story_state,
-    const fuchsia::modular::StoryVisibilityState story_visibility_state) {
-  if (!story_data || story_data->story_options.kind_of_proto_story) {
-    return;
-  }
-  for (const auto& i : watchers_.ptrs()) {
-    (*i)->OnChange(CloneStruct(story_data->story_info), story_state,
-                   story_visibility_state);
-  }
-}
-
-void StoryProviderImpl::CreateEntity(
-    const std::string& story_id, fidl::StringPtr type,
-    fuchsia::mem::Buffer data,
-    fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request,
-    std::function<void(std::string /* entity_reference */)> callback) {
-  operation_queue_.Add(new GetStoryEntityProviderCall(
-      this, story_id,
-      fxl::MakeCopyable([this, type, story_id, data = std::move(data),
-                         callback = std::move(callback),
-                         entity_request = std::move(entity_request)](
-                            StoryEntityProvider* entity_provider) mutable {
-        // Once the entity provider for the given story is available, create
-        // the entity.
-        entity_provider->CreateEntity(
-            type, std::move(data),
-            fxl::MakeCopyable([this, entity_request = std::move(entity_request),
-                               callback = std::move(callback),
-                               story_id](std::string cookie) mutable {
-              if (cookie.empty()) {
-                // Return nullptr to indicate the entity creation failed.
-                callback(nullptr);
-                return;
-              }
-
-              std::string entity_reference =
-                  entity_provider_runner_->CreateStoryEntityReference(story_id,
-                                                                      cookie);
-
-              // Once the entity reference has been created, it can be
-              // used to connect the entity request.
-              fuchsia::modular::EntityResolverPtr resolver;
-              entity_provider_runner_->ConnectEntityResolver(
-                  resolver.NewRequest());
-              resolver->ResolveEntity(entity_reference,
-                                      std::move(entity_request));
-
-              callback(entity_reference);
-            }));
-      })));
-}
-
-void StoryProviderImpl::ConnectToStoryEntityProvider(
-    const std::string& story_id,
-    fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-        entity_provider_request) {
-  operation_queue_.Add(new GetStoryEntityProviderCall(
-      this, story_id,
-      fxl::MakeCopyable(
-          [entity_provider_request = std::move(entity_provider_request)](
-              StoryEntityProvider* entity_provider) mutable {
-            entity_provider->Connect(std::move(entity_provider_request));
-          })));
-}
-
-void StoryProviderImpl::GetPresentation(
-    fidl::StringPtr story_id,
-    fidl::InterfaceRequest<fuchsia::ui::policy::Presentation> request) {
-  presentation_provider_->GetPresentation(std::move(story_id),
-                                          std::move(request));
-}
-
-void StoryProviderImpl::WatchVisualState(
-    fidl::StringPtr story_id,
-    fidl::InterfaceHandle<fuchsia::modular::StoryVisualStateWatcher> watcher) {
-  presentation_provider_->WatchVisualState(std::move(story_id),
-                                           std::move(watcher));
-}
-
-void StoryProviderImpl::TakeSnapshot(
-    fidl::StringPtr story_id,
-    fit::function<void(fuchsia::mem::Buffer)> callback) {
-  auto it = view_endpoints_.find(story_id);
-  if (it != view_endpoints_.end()) {
-    view_snapshot_->TakeSnapshot(it->second, [callback = std::move(callback)](
-                                                 fuchsia::mem::Buffer buffer) {
-      callback(std::move(buffer));
-    });
-  } else {
-    callback(fuchsia::mem::Buffer{});
-  }
-}
-
-void StoryProviderImpl::StartSnapshotLoader(
-    fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-        view_owner_request,
-    fidl::InterfaceRequest<fuchsia::scenic::snapshot::Loader> loader_request) {
-  if (!snapshot_loader_app_) {
-    fuchsia::modular::AppConfig snapshot_loader_config;
-    snapshot_loader_config.url = kSnapshotLoaderUrl;
-
-    snapshot_loader_app_ =
-        std::make_unique<AppClient<fuchsia::modular::Lifecycle>>(
-            user_environment_->GetLauncher(),
-            std::move(snapshot_loader_config));
-  }
-
-  fuchsia::sys::ServiceProviderPtr service_provider;
-  fuchsia::ui::viewsv1::ViewProviderPtr view_provider;
-  snapshot_loader_app_->services().ConnectToService(view_provider.NewRequest());
-  view_provider->CreateView(std::move(view_owner_request),
-                            service_provider.NewRequest());
-
-  service_provider->ConnectToService(fuchsia::scenic::snapshot::Loader::Name_,
-                                     loader_request.TakeChannel());
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story_runner/story_provider_impl.h b/bin/sessionmgr/story_runner/story_provider_impl.h
deleted file mode 100644
index e1b2ce4..0000000
--- a/bin/sessionmgr/story_runner/story_provider_impl.h
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_PROVIDER_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_PROVIDER_IMPL_H_
-
-#include <map>
-#include <memory>
-#include <set>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/modular/internal/cpp/fidl.h>
-#include <fuchsia/scenic/snapshot/cpp/fidl.h>
-#include <fuchsia/ui/policy/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_ptr.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner.h"
-#include "peridot/bin/sessionmgr/component_context_impl.h"
-#include "peridot/bin/sessionmgr/message_queue/message_queue_manager.h"
-#include "peridot/bin/sessionmgr/story/model/noop_story_model_storage.h"
-#include "peridot/bin/sessionmgr/story/model/story_model_owner.h"
-#include "peridot/bin/sessionmgr/story/system.h"
-#include "peridot/bin/sessionmgr/story_runner/story_entity_provider.h"
-#include "peridot/lib/fidl/app_client.h"
-#include "peridot/lib/fidl/environment.h"
-#include "peridot/lib/fidl/proxy.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_client.h"
-#include "peridot/lib/ledger_client/types.h"
-#include "peridot/lib/module_manifest/module_facet_reader.h"
-
-namespace modular {
-
-class PresentationProvider;
-class Resolver;
-class SessionStorage;
-class StoryControllerImpl;
-class StoryStorage;
-
-class StoryProviderImpl : fuchsia::modular::StoryProvider,
-                          fuchsia::modular::FocusWatcher {
- public:
-  StoryProviderImpl(
-      Environment* user_environment, std::string device_id,
-      SessionStorage* session_storage, fuchsia::modular::AppConfig story_shell,
-      const ComponentContextInfo& component_context_info,
-      fuchsia::modular::FocusProviderPtr focus_provider,
-      fuchsia::modular::UserIntelligenceProvider* user_intelligence_provider,
-      fuchsia::modular::ModuleResolver* module_resolver,
-      EntityProviderRunner* entity_provider_runner,
-      modular::ModuleFacetReader* module_facet_reader,
-      PresentationProvider* presentation_provider,
-      fuchsia::ui::viewsv1::ViewSnapshotPtr view_snapshot, bool test);
-
-  ~StoryProviderImpl() override;
-
-  void Connect(fidl::InterfaceRequest<fuchsia::modular::StoryProvider> request);
-
-  // Used when the session shell is swapped.
-  void StopAllStories(const std::function<void()>& callback);
-
-  // The session shell to send story views to. It is not a constructor argument
-  // because it is updated when the session shell is swapped.
-  void SetSessionShell(fuchsia::modular::SessionShellPtr session_shell);
-
-  // Stops serving the fuchsia::modular::StoryProvider interface and stops all
-  // stories.
-  void Teardown(const std::function<void()>& callback);
-
-  // Called by StoryControllerImpl.
-  const Environment* user_environment() const { return user_environment_; }
-
-  // The device ID for this user/device.
-  const std::string device_id() const { return device_id_; }
-
-  // Called by StoryControllerImpl.
-  const ComponentContextInfo& component_context_info() {
-    return component_context_info_;
-  }
-
-  // Called by StoryControllerImpl.
-  fuchsia::modular::UserIntelligenceProvider* user_intelligence_provider() {
-    return user_intelligence_provider_;
-  }
-
-  // Called by StoryControllerImpl.
-  fuchsia::modular::ModuleResolver* module_resolver() {
-    return module_resolver_;
-  }
-
-  fuchsia::modular::EntityResolver* entity_resolver() {
-    return entity_provider_runner_;
-  }
-
-  modular::ModuleFacetReader* module_facet_reader() {
-    return module_facet_reader_;
-  }
-
-  // Called by StoryControllerImpl.
-  const fuchsia::modular::AppConfig& story_shell() const {
-    return story_shell_;
-  }
-
-  // Called by StoryControllerImpl.
-  //
-  // Returns an AppClient rather than taking an interface request
-  // as an argument because the application is preloaded.
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> StartStoryShell(
-      fidl::StringPtr story_id,
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> request);
-
-  // Called by StoryControllerImpl.
-  //
-  // Returns nullptr if the StoryInfo for |story_id| is not cached.
-  fuchsia::modular::StoryInfoPtr GetCachedStoryInfo(std::string story_id);
-
-  // |fuchsia::modular::StoryProvider|.
-  void GetStoryInfo(std::string story_id,
-                    GetStoryInfoCallback callback) override;
-
-  // Called by StoryControllerImpl. Sends request to
-  // fuchsia::modular::FocusProvider
-  void RequestStoryFocus(fidl::StringPtr story_id);
-
-  // Called by StoryControllerImpl. Sends, using AttachView(), the view of the
-  // story identified by |story_id| to the current session shell.
-  void AttachView(fidl::StringPtr story_id,
-                  fuchsia::ui::viewsv1token::ViewOwnerPtr view_owner);
-
-  // Called by StoryControllerImpl. Notifies, using DetachView(), the current
-  // session shell that the view of the story identified by |story_id| is about
-  // to close.
-  void DetachView(fidl::StringPtr story_id, std::function<void()> done);
-
-  // Called by StoryControllerImpl.
-  void NotifyStoryActivityChange(
-      fidl::StringPtr story_id,
-      fidl::VectorPtr<fuchsia::modular::OngoingActivityType>
-          ongoing_activities);
-
-  // Called by StoryControllerImpl. Sends request to
-  // fuchsia::modular::SessionShell through PresentationProvider.
-  void GetPresentation(
-      fidl::StringPtr story_id,
-      fidl::InterfaceRequest<fuchsia::ui::policy::Presentation> request);
-  void WatchVisualState(
-      fidl::StringPtr story_id,
-      fidl::InterfaceHandle<fuchsia::modular::StoryVisualStateWatcher> watcher);
-
-  // Called by StoryControllerImpl. Takes a snapshot of the story by the given
-  // |story_id|. Callback is returned with the snapshot of the story, or an
-  // empty buffer (size == 0) if the snapshot could not be taken.
-  void TakeSnapshot(fidl::StringPtr story_id,
-                    fit::function<void(fuchsia::mem::Buffer)> callback);
-
-  // Called by StoryControllerImpl. Creates a new view with the given
-  // |view_owner_request| and connects the snapshot loader with the given
-  // |loader_request|.
-  void StartSnapshotLoader(
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-          view_owner_request,
-      fidl::InterfaceRequest<fuchsia::scenic::snapshot::Loader> loader_request);
-
-  // Creates an entity with the specified |type| and |data| in the story with
-  // |story_id|.
-  //
-  // |callback| will be called with a reference to the created entity. If the
-  // creation failed the |entity_request| is dropped.
-  void CreateEntity(
-      const std::string& story_id, fidl::StringPtr type,
-      fuchsia::mem::Buffer data,
-      fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request,
-      std::function<void(std::string /* entity_reference */)> callback);
-
-  // Creates an entity with the specified |type| and |data| in the story with
-  // |story_id|.
-  //
-  // The story provider guarantees the uniqueness of the EntityProvider
-  // associated with any given story.
-  void ConnectToStoryEntityProvider(
-      const std::string& story_id,
-      fidl::InterfaceRequest<fuchsia::modular::EntityProvider>
-          entity_provider_request);
-
- private:
-  // |fuchsia::modular::StoryProvider|
-  void GetController(std::string story_id,
-                     fidl::InterfaceRequest<fuchsia::modular::StoryController>
-                         request) override;
-
-  // |fuchsia::modular::StoryProvider|
-  void GetStories(
-      fidl::InterfaceHandle<fuchsia::modular::StoryProviderWatcher> watcher,
-      PreviousStoriesCallback callback) override;
-
-  // |fuchsia::modular::StoryProvider|
-  void PreviousStories(PreviousStoriesCallback callback) override;
-
-  // |fuchsia::modular::StoryProvider|
-  void Watch(fidl::InterfaceHandle<fuchsia::modular::StoryProviderWatcher>
-                 watcher) override;
-
-  // |fuchsia::modular::StoryProvider|
-  void WatchActivity(
-      fidl::InterfaceHandle<fuchsia::modular::StoryActivityWatcher> watcher)
-      override;
-
-  // |fuchsia::modular::FocusWatcher|
-  void OnFocusChange(fuchsia::modular::FocusInfoPtr info) override;
-
-  // Called by *session_storage_.
-  void OnStoryStorageDeleted(fidl::StringPtr story_id);
-  void OnStoryStorageUpdated(fidl::StringPtr story_id,
-                             fuchsia::modular::internal::StoryData story_data);
-
-  // Called indirectly through observation of loaded StoryModels. Calls
-  // NotifyStoryWatchers().
-  void NotifyStoryStateChange(fidl::StringPtr story_id);
-
-  void NotifyStoryWatchers(
-      const fuchsia::modular::internal::StoryData* story_data,
-      fuchsia::modular::StoryState story_state,
-      fuchsia::modular::StoryVisibilityState story_visibility_state);
-
-  void MaybeLoadStoryShell();
-
-  void MaybeLoadStoryShellDelayed();
-
-  Environment* const user_environment_;
-
-  SessionStorage* session_storage_;  // Not owned.
-
-  // The service from the session shell run by the sessionmgr. Owned here
-  // because only used from here.
-  fuchsia::modular::SessionShellPtr session_shell_;
-
-  // Unique ID generated for this user/device combination.
-  const std::string device_id_;
-
-  // The bindings for this instance.
-  fidl::BindingSet<fuchsia::modular::StoryProvider> bindings_;
-
-  // Used to preload story shell before it is requested.
-  fuchsia::modular::AppConfig story_shell_;
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>>
-      preloaded_story_shell_app_;
-
-  // When running in a test, we don't preload story shells, because then the
-  // preloaded next instance of the story doesn't pass its test points.
-  const bool test_;
-
-  fidl::InterfacePtrSet<fuchsia::modular::StoryProviderWatcher> watchers_;
-  fidl::InterfacePtrSet<fuchsia::modular::StoryActivityWatcher>
-      activity_watchers_;
-
-  // The story controllers of the currently active stories, indexed by their
-  // story IDs.
-  //
-  // Only user logout or delete story calls ever remove story controllers from
-  // this collection, but controllers for stopped stories stay in it.
-  //
-  // Also keeps a cached version of the StoryData for every story so it does
-  // not have to be loaded from disk when querying about this story.
-  struct StoryRuntimeContainer {
-    // The executor on which asynchronous tasks are scheduled for this story.
-    //
-    // TODO(thatguy): Migrate all operations under |controller_impl| to use
-    // fit::promise and |executor|. MF-117
-    // TODO(thatguy): Once fit::scope is complete, share one executor for the
-    // whole process and take advantage of fit::scope to auto-cancel tasks when
-    // |this| dies.
-    std::unique_ptr<fit::executor> executor;
-
-    // StoryRuntime itself contains a StoryModelOwner and manages systems with
-    // asynchronous initialization and teardown operations.
-    std::unique_ptr<StoryModelOwner> model_owner;
-
-    // For ease of memory management, we store all runtime systems in
-    // |systems|.
-    std::vector<std::unique_ptr<System>> systems;
-
-    // This allows us to observe changes to the StoryModel owned by |runtime|.
-    std::unique_ptr<StoryObserver> model_observer;
-
-    // NOTE: The following are transitioning to StoryModel and associated
-    // classes above, as outlined in MF-85.
-    std::unique_ptr<StoryControllerImpl> controller_impl;
-    std::unique_ptr<StoryStorage> storage;
-    std::unique_ptr<StoryEntityProvider> entity_provider;
-    fuchsia::modular::internal::StoryDataPtr current_data;
-  };
-  std::map<std::string, StoryRuntimeContainer> story_runtime_containers_;
-
-  const ComponentContextInfo component_context_info_;
-
-  fuchsia::modular::UserIntelligenceProvider* const
-      user_intelligence_provider_;                           // Not owned.
-  fuchsia::modular::ModuleResolver* const module_resolver_;  // Not owned.
-  EntityProviderRunner* const entity_provider_runner_;       // Not owned.
-  modular::ModuleFacetReader* const module_facet_reader_;    // Not owned.
-  PresentationProvider* const presentation_provider_;        // Not owned.
-
-  // When a story gets created, or when it gets focused on this device, we write
-  // a record of the current context in the story page. So we need to watch the
-  // context and the focus. This serves to compute relative importance of
-  // stories in the timeline, as determined by the current context.
-  fuchsia::modular::FocusProviderPtr focus_provider_;
-  fidl::Binding<fuchsia::modular::FocusWatcher> focus_watcher_binding_;
-
-  // Service provided by scenic to take snapshots of stories.
-  fuchsia::ui::viewsv1::ViewSnapshotPtr view_snapshot_;
-
-  // Cached mapping of story ID's to the story view koids. Used as a token to
-  // take snapshots of stories. This is a temporary hack because koids are
-  // guessable. The intention is to have this hack until the framework is
-  // provided with a more secure API from scenic to take snapshots, which is
-  // TBD.
-  std::map<fidl::StringPtr, zx_koid_t> view_endpoints_;
-
-  // Snapshot loader component which is used to create new snapshot views. There
-  // is only one instance of this component running per session.
-  std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> snapshot_loader_app_;
-
-  // This is a container of all operations that are currently enqueued to run in
-  // a FIFO manner. All operations exposed via |fuchsia::modular::StoryProvider|
-  // interface are queued here.
-  //
-  // The advantage of doing this is that if an operation consists of multiple
-  // asynchronous calls then no state needs to be maintained for incomplete /
-  // pending operations.
-  //
-  // TODO(mesch): If a story provider operation invokes a story operation that
-  // causes the story updating its story info state, that update operation gets
-  // scheduled on this queue again, after the current operation. It would be
-  // better to be able to schedule such an operation on the story queue because
-  // it's a per story operation even if it affects the per story key in the root
-  // page, and then the update of story info is bounded by the outer operation.
-  OperationQueue operation_queue_;
-
-  fxl::WeakPtrFactory<StoryProviderImpl> weak_factory_;
-
-  // Operations implemented here.
-  class LoadStoryRuntimeCall;
-  class StopStoryCall;
-  class StopAllStoriesCall;
-  class StopStoryShellCall;
-  class GetStoryEntityProviderCall;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryProviderImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_PROVIDER_IMPL_H_
diff --git a/bin/sessionmgr/story_runner/story_shell_context_impl.cc b/bin/sessionmgr/story_runner/story_shell_context_impl.cc
deleted file mode 100644
index 83d5cdc..0000000
--- a/bin/sessionmgr/story_runner/story_shell_context_impl.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/story_runner/story_shell_context_impl.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/sessionmgr/story_runner/story_controller_impl.h"
-#include "peridot/bin/sessionmgr/story_runner/story_provider_impl.h"
-
-namespace modular {
-
-namespace {
-
-constexpr char kStoryShellLinkName[] = "story-shell-link";
-
-};  // namespace
-
-StoryShellContextImpl::StoryShellContextImpl(
-    fidl::StringPtr story_id, StoryProviderImpl* const story_provider_impl,
-    StoryControllerImpl* const story_controller_impl)
-    : story_id_(story_id),
-      story_provider_impl_(story_provider_impl),
-      story_controller_impl_(story_controller_impl) {}
-
-StoryShellContextImpl::~StoryShellContextImpl() = default;
-
-void StoryShellContextImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::StoryShellContext> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void StoryShellContextImpl::GetPresentation(
-    fidl::InterfaceRequest<fuchsia::ui::policy::Presentation> request) {
-  story_provider_impl_->GetPresentation(story_id_, std::move(request));
-}
-
-void StoryShellContextImpl::WatchVisualState(
-    fidl::InterfaceHandle<fuchsia::modular::StoryVisualStateWatcher> watcher) {
-  story_provider_impl_->WatchVisualState(story_id_, std::move(watcher));
-}
-
-void StoryShellContextImpl::GetLink(
-    fidl::InterfaceRequest<fuchsia::modular::Link> request) {
-  fuchsia::modular::LinkPathPtr link_path = fuchsia::modular::LinkPath::New();
-  link_path->module_path.resize(0);
-  // Note: This will never clash with link references for links owned by
-  // modules, because those will have a non-empty module path.
-  link_path->link_name = kStoryShellLinkName;
-  story_controller_impl_->ConnectLinkPath(std::move(link_path),
-                                          std::move(request));
-}
-
-void StoryShellContextImpl::RequestView(std::string surface_id) {}
-
-void StoryShellContextImpl::OnSurfaceOffScreen(std::string surface_id) {}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/story_runner/story_shell_context_impl.h b/bin/sessionmgr/story_runner/story_shell_context_impl.h
deleted file mode 100644
index 7fa4099..0000000
--- a/bin/sessionmgr/story_runner/story_shell_context_impl.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_SHELL_CONTEXT_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_SHELL_CONTEXT_IMPL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/string.h>
-
-namespace modular {
-
-class StoryControllerImpl;
-class StoryProviderImpl;
-
-class StoryShellContextImpl : fuchsia::modular::StoryShellContext {
- public:
-  StoryShellContextImpl(fidl::StringPtr story_id,
-                        StoryProviderImpl* story_provider_impl,
-                        StoryControllerImpl* story_controller_impl);
-  ~StoryShellContextImpl() override;
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::StoryShellContext> request);
-
- private:
-  // |fuchsia::modular::StoryShellContext|
-  void GetPresentation(fidl::InterfaceRequest<fuchsia::ui::policy::Presentation>
-                           request) override;
-  void WatchVisualState(
-      fidl::InterfaceHandle<fuchsia::modular::StoryVisualStateWatcher> watcher)
-      override;
-  void GetLink(fidl::InterfaceRequest<fuchsia::modular::Link> request) override;
-  void RequestView(std::string surface_id) override;
-  void OnSurfaceOffScreen(std::string surface_id) override;
-
-  const fidl::StringPtr story_id_;
-  // Not owned. The StoryProviderImpl corresponding to this context.
-  StoryProviderImpl* const story_provider_impl_;
-  // Not owned. The StoryControllerImpl for the Story corresponding to this
-  // context.
-  StoryControllerImpl* const story_controller_impl_;
-
-  fidl::BindingSet<fuchsia::modular::StoryShellContext> bindings_;
-};
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_STORY_RUNNER_STORY_SHELL_CONTEXT_IMPL_H_
diff --git a/bin/sessionmgr/user_intelligence_provider_impl.cc b/bin/sessionmgr/user_intelligence_provider_impl.cc
deleted file mode 100644
index 7a99a00..0000000
--- a/bin/sessionmgr/user_intelligence_provider_impl.cc
+++ /dev/null
@@ -1,332 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/sessionmgr/user_intelligence_provider_impl.h"
-
-#include <fuchsia/bluetooth/le/cpp/fidl.h>
-#include <fuchsia/cobalt/cpp/fidl.h>
-#include <fuchsia/maxwell/internal/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-#include "peridot/bin/basemgr/cobalt/cobalt.h"
-#include "peridot/bin/sessionmgr/intelligence_services_impl.h"
-
-namespace modular {
-
-namespace {
-
-constexpr char kUsageLogUrl[] =
-    "fuchsia-pkg://fuchsia.com/usage_log#meta/usage_log.cmx";
-constexpr char kKronkUrl[] = "kronk";
-constexpr char kStoryInfoAgentUrl[] =
-    "fuchsia-pkg://fuchsia.com/story_info#meta/story_info.cmx";
-static constexpr modular::RateLimitedRetry::Threshold kSessionAgentRetryLimit =
-    {3, zx::sec(45)};
-
-fuchsia::modular::ComponentScope CloneScope(
-    const fuchsia::modular::ComponentScope& scope) {
-  fuchsia::modular::ComponentScope result;
-  fidl::Clone(scope, &result);
-  return result;
-}
-
-}  // namespace
-
-template <class Interface>
-UserIntelligenceProviderImpl::SessionAgentData::DeferredInterfaceRequest::
-    DeferredInterfaceRequest(fidl::InterfaceRequest<Interface> request)
-    : name(Interface::Name_), channel(request.TakeChannel()) {}
-
-UserIntelligenceProviderImpl::SessionAgentData::SessionAgentData()
-    : restart(kSessionAgentRetryLimit) {}
-
-template <class Interface>
-void UserIntelligenceProviderImpl::SessionAgentData::
-    ConnectOrQueueServiceRequest(fidl::InterfaceRequest<Interface> request) {
-  if (services) {
-    component::ConnectToService(services.get(), std::move(request));
-  } else {
-    pending_service_requests.emplace_back(std::move(request));
-  }
-}
-
-UserIntelligenceProviderImpl::UserIntelligenceProviderImpl(
-    component::StartupContext* const context,
-    fidl::InterfaceHandle<fuchsia::modular::ContextEngine>
-        context_engine_handle,
-    fit::function<
-        void(fidl::InterfaceRequest<fuchsia::modular::VisibleStoriesProvider>)>
-        visible_stories_provider_connector,
-    fit::function<void(fidl::InterfaceRequest<fuchsia::modular::StoryProvider>)>
-        story_provider_connector,
-    fit::function<void(fidl::InterfaceRequest<fuchsia::modular::FocusProvider>)>
-        focus_provider_connector,
-    fit::function<void(fidl::InterfaceRequest<fuchsia::modular::PuppetMaster>)>
-        puppet_master_connector)
-    : context_(context),
-      visible_stories_provider_connector_(
-          std::move(visible_stories_provider_connector)),
-      story_provider_connector_(std::move(story_provider_connector)),
-      focus_provider_connector_(std::move(focus_provider_connector)),
-      puppet_master_connector_(std::move(puppet_master_connector)) {
-  context_engine_.Bind(std::move(context_engine_handle));
-
-  // Start dependent processes. We get some component-scope services from
-  // these processes.
-  StartSuggestionEngine();
-}
-
-void UserIntelligenceProviderImpl::GetComponentIntelligenceServices(
-    fuchsia::modular::ComponentScope scope,
-    fidl::InterfaceRequest<fuchsia::modular::IntelligenceServices> request) {
-  intelligence_services_bindings_.AddBinding(
-      std::make_unique<IntelligenceServicesImpl>(
-          std::move(scope), context_engine_.get(), suggestion_engine_.get()),
-      std::move(request));
-}
-
-void UserIntelligenceProviderImpl::GetSuggestionProvider(
-    fidl::InterfaceRequest<fuchsia::modular::SuggestionProvider> request) {
-  suggestion_services_.ConnectToService(std::move(request));
-}
-
-void UserIntelligenceProviderImpl::GetSpeechToText(
-    fidl::InterfaceRequest<fuchsia::speech::SpeechToText> request) {
-  auto it = session_agents_.find(kKronkUrl);
-  if (it != session_agents_.end()) {
-    it->second.ConnectOrQueueServiceRequest(std::move(request));
-  } else {
-    FXL_LOG(WARNING) << "No speech-to-text agent loaded";
-  }
-}
-
-void UserIntelligenceProviderImpl::StartAgents(
-    fidl::InterfaceHandle<fuchsia::modular::ComponentContext>
-        component_context_handle,
-    std::vector<std::string> session_agents,
-    std::vector<std::string> startup_agents) {
-  component_context_.Bind(std::move(component_context_handle));
-
-  FXL_LOG(INFO) << "Starting session_agents:";
-  for (const auto& agent : session_agents) {
-    FXL_LOG(INFO) << " " << agent;
-    StartSessionAgent(agent);
-  }
-
-  FXL_LOG(INFO) << "Starting startup_agents:";
-  for (const auto& agent : startup_agents) {
-    FXL_LOG(INFO) << " " << agent;
-    StartAgent(agent);
-  }
-
-  StartAgent(kStoryInfoAgentUrl);
-}
-
-void UserIntelligenceProviderImpl::GetServicesForAgent(
-    std::string url, GetServicesForAgentCallback callback) {
-  fuchsia::sys::ServiceList service_list;
-  agent_namespaces_.emplace_back(service_list.provider.NewRequest());
-  auto* agent_host = &agent_namespaces_.back();
-  service_list.names = AddAgentServices(url, agent_host);
-  callback(std::move(service_list));
-}
-
-void UserIntelligenceProviderImpl::StartSuggestionEngine() {
-  auto service_list = fuchsia::sys::ServiceList::New();
-
-  service_list->names.push_back(fuchsia::modular::ContextReader::Name_);
-  suggestion_engine_service_provider_
-      .AddService<fuchsia::modular::ContextReader>(
-          [this](
-              fidl::InterfaceRequest<fuchsia::modular::ContextReader> request) {
-            fuchsia::modular::ComponentScope scope;
-            scope.set_global_scope(fuchsia::modular::GlobalScope());
-            context_engine_->GetReader(std::move(scope), std::move(request));
-          });
-
-  service_list->names.push_back(fuchsia::modular::PuppetMaster::Name_);
-  suggestion_engine_service_provider_
-      .AddService<fuchsia::modular::PuppetMaster>(
-          [this](
-              fidl::InterfaceRequest<fuchsia::modular::PuppetMaster> request) {
-            puppet_master_connector_(std::move(request));
-          });
-
-  fuchsia::sys::ServiceProviderPtr service_provider;
-  suggestion_engine_service_provider_.AddBinding(service_provider.NewRequest());
-  service_list->provider = std::move(service_provider);
-
-  fuchsia::sys::LaunchInfo launch_info;
-  launch_info.url = "fuchsia-pkg://fuchsia.com/suggestion_engine#meta/suggestion_engine.cmx";
-  launch_info.directory_request = suggestion_services_.NewRequest();
-  launch_info.additional_services = std::move(service_list);
-  context_->launcher()->CreateComponent(std::move(launch_info), nullptr);
-  suggestion_engine_ =
-      suggestion_services_
-          .ConnectToService<fuchsia::modular::SuggestionEngine>();
-}
-
-void UserIntelligenceProviderImpl::StartAgent(const std::string& url) {
-  fuchsia::modular::AgentControllerPtr controller;
-  fuchsia::sys::ServiceProviderPtr services;
-  component_context_->ConnectToAgent(url, services.NewRequest(),
-                                     controller.NewRequest());
-  agent_controllers_.push_back(std::move(controller));
-}
-
-void UserIntelligenceProviderImpl::StartSessionAgent(const std::string& url) {
-  SessionAgentData* const agent_data = &session_agents_[url];
-
-  component_context_->ConnectToAgent(url, agent_data->services.NewRequest(),
-                                     agent_data->controller.NewRequest());
-
-  // complete any pending connection requests
-  for (auto& request : agent_data->pending_service_requests) {
-    agent_data->services->ConnectToService(request.name,
-                                           std::move(request.channel));
-  }
-  agent_data->pending_service_requests.clear();
-
-  // fuchsia::modular::Agent runner closes the agent controller connection when
-  // the agent terminates. We restart the agent (up to a limit) when we notice
-  // this.
-  //
-  // NOTE(rosswang,mesch): Although the interface we're actually interested in
-  // is |data[url].services|, we still need to put the restart handler on the
-  // controller. When the agent crashes, |data[url].services| often gets closed
-  // quite a bit earlier (~1 second) than the agent runner notices via the
-  // application controller (which it must use as opposed to any interface on
-  // the agent itself since the agent is not required to implement any
-  // interfaces itself, even though it is recommended that it does). If we try
-  // to restart the agent at that time, the agent runner would attempt to simply
-  // send the connection request to the crashed agent instance and not relaunch
-  // the agent.
-  //
-  // It is also because of this delay that we must queue any pending service
-  // connection requests until we can restart.
-  agent_data->controller.set_error_handler([this, url](zx_status_t status) {
-    auto it = session_agents_.find(url);
-    FXL_DCHECK(it != session_agents_.end())
-        << "Controller and services not registered for " << url;
-    auto& agent_data = it->second;
-    agent_data.services.Unbind();
-    agent_data.controller.Unbind();
-    ReportSessionAgentEvent(url, SessionAgentEvent::CRASH);
-
-    if (agent_data.restart.ShouldRetry()) {
-      FXL_LOG(INFO) << "Restarting " << url << "...";
-      StartSessionAgent(url);
-    } else {
-      FXL_LOG(WARNING) << url << " failed to restart more than "
-                       << kSessionAgentRetryLimit.count << " times in "
-                       << kSessionAgentRetryLimit.period.to_secs()
-                       << " seconds.";
-      ReportSessionAgentEvent(url, SessionAgentEvent::CRASH_LIMIT);
-      // Erase so that incoming connection requests fail fast rather than
-      // enqueue forever.
-      session_agents_.erase(it);
-    }
-  });
-}
-
-std::vector<std::string> UserIntelligenceProviderImpl::AddAgentServices(
-    const std::string& url, component::ServiceNamespace* agent_host) {
-  fuchsia::modular::ComponentScope agent_info;
-  fuchsia::modular::AgentScope agent_scope;
-  agent_scope.url = url;
-  agent_info.set_agent_scope(std::move(agent_scope));
-  std::vector<std::string> service_names;
-
-  service_names.push_back(fuchsia::modular::ContextWriter::Name_);
-  agent_host->AddService<fuchsia::modular::ContextWriter>(fxl::MakeCopyable(
-      [this, client_info = CloneScope(agent_info),
-       url](fidl::InterfaceRequest<fuchsia::modular::ContextWriter> request) {
-        context_engine_->GetWriter(CloneScope(client_info), std::move(request));
-      }));
-
-  service_names.push_back(fuchsia::modular::ContextReader::Name_);
-  agent_host->AddService<fuchsia::modular::ContextReader>(fxl::MakeCopyable(
-      [this, client_info = CloneScope(agent_info),
-       url](fidl::InterfaceRequest<fuchsia::modular::ContextReader> request) {
-        context_engine_->GetReader(CloneScope(client_info), std::move(request));
-      }));
-
-  service_names.push_back(fuchsia::modular::IntelligenceServices::Name_);
-  agent_host->AddService<fuchsia::modular::IntelligenceServices>(
-      fxl::MakeCopyable(
-          [this, client_info = CloneScope(agent_info),
-           url](fidl::InterfaceRequest<fuchsia::modular::IntelligenceServices>
-                    request) {
-            this->GetComponentIntelligenceServices(CloneScope(client_info),
-                                                   std::move(request));
-          }));
-
-  service_names.push_back(fuchsia::modular::ProposalPublisher::Name_);
-  agent_host->AddService<fuchsia::modular::ProposalPublisher>(
-      [this, url](
-          fidl::InterfaceRequest<fuchsia::modular::ProposalPublisher> request) {
-        suggestion_engine_->RegisterProposalPublisher(url, std::move(request));
-      });
-
-  if (url == kUsageLogUrl) {
-    service_names.push_back(fuchsia::modular::ContextDebug::Name_);
-    agent_host->AddService<fuchsia::modular::ContextDebug>(
-        [this](fidl::InterfaceRequest<fuchsia::modular::ContextDebug> request) {
-          context_engine_->GetContextDebug(std::move(request));
-        });
-
-    service_names.push_back(fuchsia::modular::SuggestionDebug::Name_);
-    agent_host->AddService<fuchsia::modular::SuggestionDebug>(
-        [this](
-            fidl::InterfaceRequest<fuchsia::modular::SuggestionDebug> request) {
-          suggestion_services_.ConnectToService(std::move(request));
-        });
-  }
-
-  if (url == kStoryInfoAgentUrl) {
-    service_names.push_back(fuchsia::modular::VisibleStoriesProvider::Name_);
-    agent_host->AddService<fuchsia::modular::VisibleStoriesProvider>(
-        [this](fidl::InterfaceRequest<fuchsia::modular::VisibleStoriesProvider>
-                   request) {
-          visible_stories_provider_connector_(std::move(request));
-        });
-
-    service_names.push_back(fuchsia::modular::StoryProvider::Name_);
-    agent_host->AddService<fuchsia::modular::StoryProvider>(
-        [this](
-            fidl::InterfaceRequest<fuchsia::modular::StoryProvider> request) {
-          story_provider_connector_(std::move(request));
-        });
-
-    service_names.push_back(fuchsia::modular::FocusProvider::Name_);
-    agent_host->AddService<fuchsia::modular::FocusProvider>(
-        [this](
-            fidl::InterfaceRequest<fuchsia::modular::FocusProvider> request) {
-          focus_provider_connector_(std::move(request));
-        });
-  }
-
-  if (session_agents_.find(url) != session_agents_.end()) {
-    // All services added below should be exclusive to session agents.
-    service_names.push_back(fuchsia::modular::PuppetMaster::Name_);
-    agent_host->AddService<fuchsia::modular::PuppetMaster>(
-        [this](fidl::InterfaceRequest<fuchsia::modular::PuppetMaster> request) {
-          puppet_master_connector_(std::move(request));
-        });
-
-    service_names.push_back(fuchsia::modular::FocusProvider::Name_);
-    agent_host->AddService<fuchsia::modular::FocusProvider>(
-        [this,
-         url](fidl::InterfaceRequest<fuchsia::modular::FocusProvider> request) {
-          focus_provider_connector_(std::move(request));
-        });
-  }
-
-  return service_names;
-}
-
-}  // namespace modular
diff --git a/bin/sessionmgr/user_intelligence_provider_impl.h b/bin/sessionmgr/user_intelligence_provider_impl.h
deleted file mode 100644
index cbf6779..0000000
--- a/bin/sessionmgr/user_intelligence_provider_impl.h
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SESSIONMGR_USER_INTELLIGENCE_PROVIDER_IMPL_H_
-#define PERIDOT_BIN_SESSIONMGR_USER_INTELLIGENCE_PROVIDER_IMPL_H_
-
-#include <deque>
-#include <string>
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/svc/cpp/services.h>
-#include <lib/zx/channel.h>
-
-#include "peridot/lib/util/rate_limited_retry.h"
-
-namespace modular {
-
-class UserIntelligenceProviderImpl
-    : public fuchsia::modular::UserIntelligenceProvider {
- public:
-  // |context| is not owned and must outlive this instance.
-  UserIntelligenceProviderImpl(
-      component::StartupContext* context,
-      fidl::InterfaceHandle<fuchsia::modular::ContextEngine>
-          context_engine_handle,
-      fit::function<void(
-          fidl::InterfaceRequest<fuchsia::modular::VisibleStoriesProvider>)>
-          visible_stories_provider_connector,
-      fit::function<
-          void(fidl::InterfaceRequest<fuchsia::modular::StoryProvider>)>
-          story_provider_connector,
-      fit::function<
-          void(fidl::InterfaceRequest<fuchsia::modular::FocusProvider>)>
-          focus_provider_connector,
-      fit::function<
-          void(fidl::InterfaceRequest<fuchsia::modular::PuppetMaster>)>
-          puppet_master_connector);
-
-  ~UserIntelligenceProviderImpl() override = default;
-
-  void GetComponentIntelligenceServices(
-      fuchsia::modular::ComponentScope scope,
-      fidl::InterfaceRequest<fuchsia::modular::IntelligenceServices> request)
-      override;
-
-  void GetSuggestionProvider(
-      fidl::InterfaceRequest<fuchsia::modular::SuggestionProvider> request)
-      override;
-
-  void GetSpeechToText(
-      fidl::InterfaceRequest<fuchsia::speech::SpeechToText> request) override;
-
-  void StartAgents(fidl::InterfaceHandle<fuchsia::modular::ComponentContext>
-                       component_context_handle,
-                   std::vector<std::string> session_agents,
-                   std::vector<std::string> startup_agents) override;
-
-  void GetServicesForAgent(std::string url,
-                           GetServicesForAgentCallback callback) override;
-
- private:
-  struct SessionAgentData {
-    struct DeferredInterfaceRequest {
-      template <class Interface>
-      DeferredInterfaceRequest(fidl::InterfaceRequest<Interface> request);
-
-      const char* name;
-      zx::channel channel;
-    };
-
-    SessionAgentData();
-
-    template <class Interface>
-    void ConnectOrQueueServiceRequest(
-        fidl::InterfaceRequest<Interface> request);
-
-    fuchsia::modular::AgentControllerPtr controller;
-
-    fuchsia::sys::ServiceProviderPtr services;
-    // If an agent crashes, there is a period (~1 sec) where its |services|
-    // interface is invalid before its controller is closed. During that
-    // period, we should queue requests until we've restarted the agent.
-    std::vector<DeferredInterfaceRequest> pending_service_requests;
-
-    modular::RateLimitedRetry restart;
-  };
-
-  using ServiceProviderInitializer = std::function<void(
-      const std::string& url, component::ServiceNamespace* agent_host)>;
-  // A ServiceProviderInitializer that adds standard agent services, including
-  // attributed context and suggestion service entry points. Returns the names
-  // of the services added.
-  std::vector<std::string> AddAgentServices(
-      const std::string& url, component::ServiceNamespace* agent_host);
-
-  // Starts suggestion engine.
-  void StartSuggestionEngine();
-
-  void StartAgent(const std::string& url);
-
-  void StartActionLog(fuchsia::modular::SuggestionEngine* suggestion_engine);
-  void StartSessionAgent(const std::string& url);
-
-  component::StartupContext* context_;  // Not owned.
-
-  fuchsia::modular::ContextEnginePtr context_engine_;
-
-  component::Services suggestion_services_;
-  component::ServiceProviderImpl suggestion_engine_service_provider_;
-  fuchsia::modular::SuggestionEnginePtr suggestion_engine_;
-
-  std::map<std::string, SessionAgentData> session_agents_;
-
-  fidl::BindingSet<fuchsia::modular::IntelligenceServices,
-                   std::unique_ptr<fuchsia::modular::IntelligenceServices>>
-      intelligence_services_bindings_;
-
-  fidl::InterfacePtr<fuchsia::modular::ComponentContext> component_context_;
-  fidl::InterfacePtr<fuchsia::modular::StoryProvider> story_provider_;
-  fidl::InterfacePtr<fuchsia::modular::FocusProvider> focus_provider_;
-  fidl::InterfacePtr<fuchsia::modular::VisibleStoriesProvider>
-      visible_stories_provider_;
-
-  fit::function<void(
-      fidl::InterfaceRequest<fuchsia::modular::VisibleStoriesProvider>)>
-      visible_stories_provider_connector_;
-  fit::function<void(fidl::InterfaceRequest<fuchsia::modular::StoryProvider>)>
-      story_provider_connector_;
-  fit::function<void(fidl::InterfaceRequest<fuchsia::modular::FocusProvider>)>
-      focus_provider_connector_;
-  fit::function<void(fidl::InterfaceRequest<fuchsia::modular::PuppetMaster>)>
-      puppet_master_connector_;
-
-  // Framework fuchsia::modular::Agent controllers. Hanging onto these tells the
-  // Framework we want the Agents to keep running.
-  std::vector<fuchsia::modular::AgentControllerPtr> agent_controllers_;
-
-  // ServiceNamespace(s) backing the services provided to these agents via its
-  // namespace.
-  std::deque<component::ServiceNamespace> agent_namespaces_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SESSIONMGR_USER_INTELLIGENCE_PROVIDER_IMPL_H_
diff --git a/bin/suggestion_engine/BUILD.gn b/bin/suggestion_engine/BUILD.gn
deleted file mode 100644
index bbf2ae8..0000000
--- a/bin/suggestion_engine/BUILD.gn
+++ /dev/null
@@ -1,184 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-import("//peridot/build/tests_package.gni")
-
-executable_package("suggestion_engine") {
-  meta = [
-    {
-      path = "meta/suggestion_engine.cmx"
-      dest = "suggestion_engine.cmx"
-    },
-  ]
-
-  resources = [
-    {
-      path = "resources/mod_pairs.json"
-      dest = "ranking_data/mod_pairs.json"
-    },
-  ]
-
-  sources = [
-    "suggestion_engine_main.cc",
-  ]
-
-  deps = [
-    ":debug",
-    ":suggestion_engine_impl",
-    "//garnet/public/lib/component/cpp",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-source_set("suggestion_engine_impl") {
-  sources = [
-    "media_player.cc",
-    "media_player.h",
-    "navigation_processor.cc",
-    "navigation_processor.h",
-    "next_processor.cc",
-    "next_processor.h",
-    "proposal_publisher_impl.cc",
-    "proposal_publisher_impl.h",
-    "query_processor.cc",
-    "query_processor.h",
-    "query_runner.cc",
-    "query_runner.h",
-    "suggestion_engine_helper.cc",
-    "suggestion_engine_helper.h",
-    "suggestion_engine_impl.cc",
-    "suggestion_engine_impl.h",
-  ]
-
-  deps = [
-    ":debug",
-    ":interruption_processor",
-    ":models",
-    "//garnet/public/fidl/fuchsia.media",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/media/timeline",
-    "//peridot/bin/suggestion_engine/decision_policies:all",
-    "//peridot/bin/suggestion_engine/filters:all",
-    "//peridot/bin/suggestion_engine/rankers:all",
-    "//peridot/bin/suggestion_engine/ranking_features:all",
-    "//peridot/lib/bound_set",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/util:rate_limited_retry",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/context/cpp:context_helper",
-  ]
-
-  public_deps = [
-    ":state",
-  ]
-}
-
-tests_package("suggestion_engine_unittests") {
-  deps = [
-    ":suggestion_engine_impl_unittest",
-    "//peridot/bin/suggestion_engine/decision_policies:rank_over_threshold_decision_policy_unittest",
-    "//peridot/bin/suggestion_engine/filters:conjugate_ranked_passive_filter_unittest",
-    "//peridot/bin/suggestion_engine/filters:ranked_active_filter_unittest",
-    "//peridot/bin/suggestion_engine/filters:ranked_passive_filter_unittest",
-    "//peridot/bin/suggestion_engine/rankers:linear_ranker_unittest",
-    "//peridot/bin/suggestion_engine/ranking_features:affinity_ranking_feature_unittest",
-    "//peridot/bin/suggestion_engine/ranking_features:annoyance_ranking_feature_unittest",
-    "//peridot/bin/suggestion_engine/ranking_features:dead_story_ranking_feature_unittest",
-    "//peridot/bin/suggestion_engine/ranking_features:interrupting_ranking_feature_unittest",
-    "//peridot/bin/suggestion_engine/ranking_features:kronk_ranking_feature_unittest",
-    "//peridot/bin/suggestion_engine/ranking_features:mod_pair_ranking_feature_unittest",
-    "//peridot/bin/suggestion_engine/ranking_features:proposal_hint_ranking_feature_unittest",
-    "//peridot/bin/suggestion_engine/ranking_features:query_match_ranking_feature_unittest",
-  ]
-}
-
-source_set("interruption_processor") {
-  sources = [
-    "interruptions_processor.cc",
-    "interruptions_processor.h",
-  ]
-
-  deps = [
-    ":models",
-    "//peridot/bin/suggestion_engine/decision_policies:all",
-    "//peridot/bin/suggestion_engine/ranking_features:ranking_feature",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("state") {
-  sources = [
-    "ranked_suggestions_list.cc",
-    "ranked_suggestions_list.h",
-  ]
-
-  deps = [
-    ":models",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/suggestion_engine/filters:base",
-    "//peridot/bin/suggestion_engine/rankers:ranker",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/context/cpp:context_helper",
-  ]
-  public_deps = [
-    "//peridot/bin/suggestion_engine/ranking_features:ranking_feature",
-  ]
-}
-
-source_set("models") {
-  sources = [
-    "ranked_suggestion.cc",
-    "ranked_suggestion.h",
-    "suggestion_prototype.cc",
-    "suggestion_prototype.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("debug") {
-  sources = [
-    "debug.cc",
-    "debug.h",
-  ]
-
-  deps = [
-    ":models",
-    ":state",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  public_deps = [
-    "//peridot/lib/util:idle_waiter",
-  ]
-}
-
-executable("suggestion_engine_impl_unittest") {
-  testonly = true
-
-  sources = [
-    "suggestion_engine_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":suggestion_engine_impl",
-    "//garnet/public/lib/fsl",
-    "//peridot/bin/sessionmgr/puppet_master:puppet_master_impl",
-    "//peridot/lib/testing:test_story_command_executor",
-    "//peridot/lib/testing:test_with_session_storage",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/suggestion_engine/debug.cc b/bin/suggestion_engine/debug.cc
deleted file mode 100644
index 98bbafa..0000000
--- a/bin/suggestion_engine/debug.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/debug.h"
-
-#include <functional>
-
-#include <lib/fidl/cpp/optional.h>
-
-namespace modular {
-
-SuggestionDebugImpl::SuggestionDebugImpl() : weak_ptr_factory_(this){};
-SuggestionDebugImpl::~SuggestionDebugImpl() = default;
-
-fxl::WeakPtr<SuggestionDebugImpl> SuggestionDebugImpl::GetWeakPtr() {
-  return weak_ptr_factory_.GetWeakPtr();
-}
-
-void makeProposalSummary(const SuggestionPrototype* suggestion,
-                         fuchsia::modular::ProposalSummary* summary) {
-  summary->id = suggestion->proposal.id;
-  summary->publisher_url = suggestion->source_url;
-  fidl::Clone(suggestion->proposal.display, &summary->display);
-}
-
-void makeProposalSummaries(
-    const RankedSuggestionsList* suggestions,
-    std::vector<fuchsia::modular::ProposalSummary>* summaries) {
-  for (const auto& suggestion : suggestions->Get()) {
-    fuchsia::modular::ProposalSummary summary;
-    makeProposalSummary(suggestion->prototype, &summary);
-    summaries->push_back(std::move(summary));
-  }
-}
-
-void SuggestionDebugImpl::OnAskStart(std::string query,
-                                     const RankedSuggestionsList* suggestions) {
-  for (auto& listener : ask_proposal_listeners_.ptrs()) {
-    std::vector<fuchsia::modular::ProposalSummary> proposals;
-    makeProposalSummaries(suggestions, &proposals);
-    (*listener)->OnAskStart(query, std::move(proposals));
-  }
-}
-
-void SuggestionDebugImpl::OnSuggestionSelected(
-    const SuggestionPrototype* selected_suggestion) {
-  for (auto& listener : ask_proposal_listeners_.ptrs()) {
-    if (selected_suggestion) {
-      auto summary = fuchsia::modular::ProposalSummary::New();
-      makeProposalSummary(selected_suggestion, summary.get());
-      (*listener)->OnProposalSelected(std::move(summary));
-    } else {
-      (*listener)->OnProposalSelected(nullptr);
-    }
-  }
-}
-
-void SuggestionDebugImpl::OnInterrupt(
-    const SuggestionPrototype* interrupt_suggestion) {
-  for (auto& listener : interruption_proposal_listeners_.ptrs()) {
-    fuchsia::modular::ProposalSummary summary;
-    makeProposalSummary(interrupt_suggestion, &summary);
-    (*listener)->OnInterrupt(std::move(summary));
-  }
-}
-
-void SuggestionDebugImpl::OnNextUpdate(
-    const RankedSuggestionsList* suggestions) {
-  for (auto& listener : next_proposal_listeners_.ptrs()) {
-    std::vector<fuchsia::modular::ProposalSummary> proposals;
-    makeProposalSummaries(suggestions, &proposals);
-    (*listener)->OnNextUpdate(std::move(proposals));
-    cached_next_proposals_.reset(std::move(proposals));
-  }
-}
-
-util::IdleWaiter* SuggestionDebugImpl::GetIdleWaiter() { return &idle_waiter_; }
-
-void SuggestionDebugImpl::WatchAskProposals(
-    fidl::InterfaceHandle<fuchsia::modular::AskProposalListener> listener) {
-  auto listener_ptr = listener.Bind();
-  ask_proposal_listeners_.AddInterfacePtr(std::move(listener_ptr));
-}
-
-void SuggestionDebugImpl::WatchInterruptionProposals(
-    fidl::InterfaceHandle<fuchsia::modular::InterruptionProposalListener>
-        listener) {
-  auto listener_ptr = listener.Bind();
-  interruption_proposal_listeners_.AddInterfacePtr(std::move(listener_ptr));
-}
-
-void SuggestionDebugImpl::WatchNextProposals(
-    fidl::InterfaceHandle<fuchsia::modular::NextProposalListener> listener) {
-  auto listener_ptr = listener.Bind();
-  next_proposal_listeners_.AddInterfacePtr(std::move(listener_ptr));
-  if (cached_next_proposals_) {
-    listener_ptr->OnNextUpdate(cached_next_proposals_.take());
-  }
-}
-
-void SuggestionDebugImpl::WaitUntilIdle(WaitUntilIdleCallback callback) {
-  idle_waiter_.WaitUntilIdle(callback);
-}
-
-void SuggestionDebugImpl::RunUntilIdle(RunUntilIdleCallback callback) {
-  idle_waiter_.loop()->RunUntilIdle();
-  callback();
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/debug.h b/bin/suggestion_engine/debug.h
deleted file mode 100644
index 9ebc951..0000000
--- a/bin/suggestion_engine/debug.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_DEBUG_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_DEBUG_H_
-
-#include <list>
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/suggestion_engine/ranked_suggestions_list.h"
-#include "peridot/bin/suggestion_engine/suggestion_prototype.h"
-#include "peridot/lib/util/idle_waiter.h"
-
-namespace modular {
-
-// Provides a debug interface that is accessible through the MI dashboard.
-class SuggestionDebugImpl : public fuchsia::modular::SuggestionDebug {
- public:
-  SuggestionDebugImpl();
-  ~SuggestionDebugImpl() override;
-
-  fxl::WeakPtr<SuggestionDebugImpl> GetWeakPtr();
-
-  void OnAskStart(std::string query, const RankedSuggestionsList* suggestions);
-  void OnSuggestionSelected(const SuggestionPrototype* selected_suggestion);
-  void OnInterrupt(const SuggestionPrototype* interrupt_suggestion);
-  void OnNextUpdate(const RankedSuggestionsList* suggestions);
-
-  util::IdleWaiter* GetIdleWaiter();
-
- private:
-  // |fuchsia::modular::SuggestionDebug|
-  void WatchAskProposals(
-      fidl::InterfaceHandle<fuchsia::modular::AskProposalListener> listener)
-      override;
-  // |fuchsia::modular::SuggestionDebug|
-  void WatchInterruptionProposals(
-      fidl::InterfaceHandle<fuchsia::modular::InterruptionProposalListener>
-          listener) override;
-  // |fuchsia::modular::SuggestionDebug|
-  void WatchNextProposals(
-      fidl::InterfaceHandle<fuchsia::modular::NextProposalListener> listener)
-      override;
-  // |fuchsia::modular::SuggestionDebug|
-  void WaitUntilIdle(WaitUntilIdleCallback callback) override;
-  // |fuchsia::modular::SuggestionDebug|
-  void RunUntilIdle(RunUntilIdleCallback callback) override;
-
-  fidl::InterfacePtrSet<fuchsia::modular::AskProposalListener>
-      ask_proposal_listeners_;
-  fidl::InterfacePtrSet<fuchsia::modular::InterruptionProposalListener>
-      interruption_proposal_listeners_;
-  fidl::InterfacePtrSet<fuchsia::modular::NextProposalListener>
-      next_proposal_listeners_;
-
-  // The cached set of next proposals.
-  fidl::VectorPtr<fuchsia::modular::ProposalSummary> cached_next_proposals_;
-
-  util::IdleWaiter idle_waiter_;
-  fxl::WeakPtrFactory<SuggestionDebugImpl> weak_ptr_factory_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_DEBUG_H_
diff --git a/bin/suggestion_engine/decision_policies/BUILD.gn b/bin/suggestion_engine/decision_policies/BUILD.gn
deleted file mode 100644
index 47a3b59..0000000
--- a/bin/suggestion_engine/decision_policies/BUILD.gn
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-group("all") {
-  public_deps = [
-    ":decision_policy",
-    ":rank_over_threshold_decision_policy",
-  ]
-}
-
-source_set("decision_policy") {
-  sources = [
-    "decision_policy.cc",
-    "decision_policy.h",
-  ]
-
-  deps = [
-    "//peridot/bin/suggestion_engine:models",
-  ]
-}
-
-source_set("rank_over_threshold_decision_policy") {
-  sources = [
-    "rank_over_threshold_decision_policy.cc",
-    "rank_over_threshold_decision_policy.h",
-  ]
-
-  deps = [
-    ":decision_policy",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  public_deps = [
-    "//peridot/bin/suggestion_engine/rankers:ranker",
-  ]
-}
-
-executable("rank_over_threshold_decision_policy_unittest") {
-  testonly = true
-
-  sources = [
-    "rank_over_threshold_decision_policy_unittest.cc",
-  ]
-
-  deps = [
-    ":rank_over_threshold_decision_policy",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/suggestion_engine/decision_policies/decision_policy.cc b/bin/suggestion_engine/decision_policies/decision_policy.cc
deleted file mode 100644
index 73f73b7..0000000
--- a/bin/suggestion_engine/decision_policies/decision_policy.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/decision_policies/decision_policy.h"
-
-namespace modular {
-
-DecisionPolicy::DecisionPolicy() = default;
-
-DecisionPolicy::~DecisionPolicy() = default;
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/decision_policies/decision_policy.h b/bin/suggestion_engine/decision_policies/decision_policy.h
deleted file mode 100644
index e8b5035..0000000
--- a/bin/suggestion_engine/decision_policies/decision_policy.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_DECISION_POLICIES_DECISION_POLICY_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_DECISION_POLICIES_DECISION_POLICY_H_
-
-#include "peridot/bin/suggestion_engine/ranked_suggestion.h"
-
-namespace modular {
-
-// Base class for performing a decision on some ranked suggestion.
-class DecisionPolicy {
- public:
-  DecisionPolicy();
-  virtual ~DecisionPolicy();
-
-  // Decides if a value is valid given some policy.
-  virtual bool Accept(const RankedSuggestion& value) = 0;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_DECISION_POLICIES_DECISION_POLICY_H_
diff --git a/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy.cc b/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy.cc
deleted file mode 100644
index 8651c26..0000000
--- a/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy.h"
-
-namespace modular {
-
-RankOverThresholdDecisionPolicy::RankOverThresholdDecisionPolicy(
-    std::unique_ptr<Ranker> ranker, double threshold)
-    : ranker_(std::move(ranker)), threshold_(threshold) {}
-
-RankOverThresholdDecisionPolicy::~RankOverThresholdDecisionPolicy() = default;
-
-bool RankOverThresholdDecisionPolicy::Accept(
-    const RankedSuggestion& suggestion) {
-  double confidence = ranker_->Rank(suggestion);
-  return confidence >= threshold_;
-};
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy.h b/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy.h
deleted file mode 100644
index 8fc4b2d..0000000
--- a/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_DECISION_POLICIES_RANK_OVER_THRESHOLD_DECISION_POLICY_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_DECISION_POLICIES_RANK_OVER_THRESHOLD_DECISION_POLICY_H_
-
-#include "peridot/bin/suggestion_engine/decision_policies/decision_policy.h"
-#include "peridot/bin/suggestion_engine/rankers/ranker.h"
-
-namespace modular {
-
-namespace {
-constexpr double kDefaultThreshold = 1.0;
-}  // namespace
-
-// Base class for performing a decision on some value.
-class RankOverThresholdDecisionPolicy : public DecisionPolicy {
- public:
-  RankOverThresholdDecisionPolicy(std::unique_ptr<Ranker> ranker,
-                                  double threshold = kDefaultThreshold);
-  ~RankOverThresholdDecisionPolicy() override;
-
-  bool Accept(const RankedSuggestion& suggestion) override;
-
- private:
-  const std::unique_ptr<Ranker> ranker_;
-
-  const double threshold_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_DECISION_POLICIES_RANK_OVER_THRESHOLD_DECISION_POLICY_H_
diff --git a/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy_unittest.cc b/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy_unittest.cc
deleted file mode 100644
index 49feb74..0000000
--- a/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy_unittest.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy.h"
-
-#include "gtest/gtest.h"
-#include "peridot/bin/suggestion_engine/rankers/ranker.h"
-
-namespace modular {
-namespace {
-
-class TestRanker : public Ranker {
- public:
-  double Rank(const fuchsia::modular::UserInput& query,
-              const RankedSuggestion& suggestion) override {
-    return suggestion.confidence;
-  }
-};
-
-class RankOverThresholdDecisionPolicyTest : public ::testing::Test {
- public:
-  void SetUp() override {
-    decision_policy = std::make_unique<RankOverThresholdDecisionPolicy>(
-        std::make_unique<TestRanker>(), 0.5);
-  }
-
- protected:
-  std::unique_ptr<RankOverThresholdDecisionPolicy> decision_policy;
-};
-
-TEST_F(RankOverThresholdDecisionPolicyTest, Accept) {
-  RankedSuggestion suggestion;
-  suggestion.confidence = 0.6;
-  EXPECT_TRUE(decision_policy->Accept(suggestion));
-  suggestion.confidence = 0.5;
-  EXPECT_TRUE(decision_policy->Accept(suggestion));
-}
-
-TEST_F(RankOverThresholdDecisionPolicyTest, NotAccept) {
-  RankedSuggestion suggestion;
-  suggestion.confidence = 0.4;
-  EXPECT_FALSE(decision_policy->Accept(suggestion));
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/filters/BUILD.gn b/bin/suggestion_engine/filters/BUILD.gn
deleted file mode 100644
index 94e59b3..0000000
--- a/bin/suggestion_engine/filters/BUILD.gn
+++ /dev/null
@@ -1,135 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-group("all") {
-  public_deps = [
-    ":base",
-    ":conjugate_ranked_passive_filter",
-    ":ranked_active_filter",
-    ":ranked_passive_filter",
-  ]
-}
-
-group("base") {
-  public_deps = [
-    ":suggestion_active_filter",
-    ":suggestion_passive_filter",
-  ]
-}
-
-source_set("suggestion_passive_filter") {
-  sources = [
-    "suggestion_passive_filter.cc",
-    "suggestion_passive_filter.h",
-  ]
-
-  deps = [
-    "//peridot/bin/suggestion_engine:models",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("suggestion_active_filter") {
-  sources = [
-    "suggestion_active_filter.cc",
-    "suggestion_active_filter.h",
-  ]
-
-  deps = [
-    "//peridot/bin/suggestion_engine:models",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("conjugate_ranked_passive_filter") {
-  sources = [
-    "conjugate_ranked_passive_filter.cc",
-    "conjugate_ranked_passive_filter.h",
-  ]
-
-  deps = [
-    ":suggestion_passive_filter",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  public_deps = [
-    "//peridot/bin/suggestion_engine/ranking_features:ranking_feature",
-  ]
-}
-
-executable("conjugate_ranked_passive_filter_unittest") {
-  testonly = true
-
-  sources = [
-    "conjugate_ranked_passive_filter_unittest.cc",
-  ]
-
-  deps = [
-    ":conjugate_ranked_passive_filter",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("ranked_passive_filter") {
-  sources = [
-    "ranked_passive_filter.cc",
-    "ranked_passive_filter.h",
-  ]
-
-  deps = [
-    ":suggestion_passive_filter",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  public_deps = [
-    "//peridot/bin/suggestion_engine/ranking_features:ranking_feature",
-  ]
-}
-
-executable("ranked_passive_filter_unittest") {
-  testonly = true
-
-  sources = [
-    "ranked_passive_filter_unittest.cc",
-  ]
-
-  deps = [
-    ":ranked_passive_filter",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("ranked_active_filter") {
-  sources = [
-    "ranked_active_filter.cc",
-    "ranked_active_filter.h",
-  ]
-
-  deps = [
-    ":suggestion_active_filter",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  public_deps = [
-    "//peridot/bin/suggestion_engine/ranking_features:ranking_feature",
-  ]
-}
-
-executable("ranked_active_filter_unittest") {
-  testonly = true
-
-  sources = [
-    "ranked_active_filter_unittest.cc",
-  ]
-
-  deps = [
-    ":ranked_active_filter",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/suggestion_engine/filters/conjugate_ranked_passive_filter.cc b/bin/suggestion_engine/filters/conjugate_ranked_passive_filter.cc
deleted file mode 100644
index 6489709..0000000
--- a/bin/suggestion_engine/filters/conjugate_ranked_passive_filter.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/filters/conjugate_ranked_passive_filter.h"
-
-#include <list>
-
-namespace modular {
-
-ConjugateRankedPassiveFilter::ConjugateRankedPassiveFilter(
-    std::shared_ptr<RankingFeature> ranking_feature)
-    : ranking_feature_(ranking_feature) {}
-
-ConjugateRankedPassiveFilter::~ConjugateRankedPassiveFilter() = default;
-
-// If the confidence of the ranking feature is 0.0 then this filter returns
-// true.
-// Example usage with FocusedStoryRankingFeature. It should hide suggestions
-// with story affinity true that are not focused:
-//   - StoryAffinity=false, Focused=...   => 1.0 => false
-//   - StoryAffinity=true,  Focused=true  => 1.0 => false
-//   - StoryAffinity=true,  Focused=false => 0.0 => true
-bool ConjugateRankedPassiveFilter::Filter(
-    const std::unique_ptr<RankedSuggestion>& ranked_suggestion) {
-  double confidence = ranking_feature_->ComputeFeature(
-      fuchsia::modular::UserInput(), *ranked_suggestion);
-  return confidence == kMinConfidence;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/filters/conjugate_ranked_passive_filter.h b/bin/suggestion_engine/filters/conjugate_ranked_passive_filter.h
deleted file mode 100644
index 77ea8ed..0000000
--- a/bin/suggestion_engine/filters/conjugate_ranked_passive_filter.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_CONJUGATE_RANKED_PASSIVE_FILTER_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_CONJUGATE_RANKED_PASSIVE_FILTER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/filters/suggestion_passive_filter.h"
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-class ConjugateRankedPassiveFilter : public SuggestionPassiveFilter {
- public:
-  ConjugateRankedPassiveFilter(std::shared_ptr<RankingFeature> ranking_feature);
-  ~ConjugateRankedPassiveFilter() override;
-
-  bool Filter(
-      const std::unique_ptr<RankedSuggestion>& ranked_suggestion) override;
-
- private:
-  std::shared_ptr<RankingFeature> ranking_feature_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_CONJUGATE_RANKED_PASSIVE_FILTER_H_
diff --git a/bin/suggestion_engine/filters/conjugate_ranked_passive_filter_unittest.cc b/bin/suggestion_engine/filters/conjugate_ranked_passive_filter_unittest.cc
deleted file mode 100644
index 155687f..0000000
--- a/bin/suggestion_engine/filters/conjugate_ranked_passive_filter_unittest.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/filters/conjugate_ranked_passive_filter.h"
-
-#include "gtest/gtest.h"
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-namespace {
-
-class ConfidenceRankingFeature : public RankingFeature {
- public:
-  ConfidenceRankingFeature() {}
-
- private:
-  double ComputeFeatureInternal(const fuchsia::modular::UserInput& query,
-                                const RankedSuggestion& suggestion) override {
-    return suggestion.confidence;
-  }
-};
-
-class ConjugateRankedPassiveFilterTest : public ::testing::Test {
- public:
-  void SetUp() override {
-    filter = std::make_unique<ConjugateRankedPassiveFilter>(
-        std::make_shared<ConfidenceRankingFeature>());
-  }
-
- protected:
-  std::unique_ptr<ConjugateRankedPassiveFilter> filter;
-};
-
-TEST_F(ConjugateRankedPassiveFilterTest, FilterMinConfidence) {
-  auto suggestion = std::make_unique<RankedSuggestion>();
-  suggestion->confidence = 0.0;
-  EXPECT_TRUE(filter->Filter(suggestion));
-}
-
-TEST_F(ConjugateRankedPassiveFilterTest, FilterOtherConfidence) {
-  auto suggestion = std::make_unique<RankedSuggestion>();
-  suggestion->confidence = 0.5;
-  EXPECT_FALSE(filter->Filter(suggestion));
-
-  auto suggestion2 = std::make_unique<RankedSuggestion>();
-  suggestion2->confidence = 1.0;
-  EXPECT_FALSE(filter->Filter(suggestion2));
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/filters/ranked_active_filter.cc b/bin/suggestion_engine/filters/ranked_active_filter.cc
deleted file mode 100644
index c0966ef..0000000
--- a/bin/suggestion_engine/filters/ranked_active_filter.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/filters/ranked_active_filter.h"
-
-#include <list>
-
-namespace modular {
-
-RankedActiveFilter::RankedActiveFilter(
-    std::shared_ptr<RankingFeature> ranking_feature)
-    : ranking_feature_(ranking_feature) {}
-
-RankedActiveFilter::~RankedActiveFilter() = default;
-
-void RankedActiveFilter::Filter(
-    std::vector<std::unique_ptr<RankedSuggestion>>* const suggestions) {
-  suggestions->erase(
-      std::remove_if(
-          suggestions->begin(), suggestions->end(),
-          [this](const std::unique_ptr<RankedSuggestion>& ranked_suggestion) {
-            double confidence = ranking_feature_->ComputeFeature(
-                fuchsia::modular::UserInput(), *ranked_suggestion);
-            return confidence >= kMaxConfidence;
-          }),
-      suggestions->end());
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/filters/ranked_active_filter.h b/bin/suggestion_engine/filters/ranked_active_filter.h
deleted file mode 100644
index 2719ee6..0000000
--- a/bin/suggestion_engine/filters/ranked_active_filter.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_RANKED_ACTIVE_FILTER_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_RANKED_ACTIVE_FILTER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/filters/suggestion_active_filter.h"
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-class RankedActiveFilter : public SuggestionActiveFilter {
- public:
-  RankedActiveFilter(std::shared_ptr<RankingFeature> ranking_feature);
-  ~RankedActiveFilter() override;
-
-  void Filter(std::vector<std::unique_ptr<RankedSuggestion>>* const suggestions)
-      override;
-
- private:
-  std::shared_ptr<RankingFeature> ranking_feature_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_RANKED_ACTIVE_FILTER_H_
diff --git a/bin/suggestion_engine/filters/ranked_active_filter_unittest.cc b/bin/suggestion_engine/filters/ranked_active_filter_unittest.cc
deleted file mode 100644
index 790d52b..0000000
--- a/bin/suggestion_engine/filters/ranked_active_filter_unittest.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/filters/ranked_active_filter.h"
-
-#include "gtest/gtest.h"
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-namespace {
-
-class ConfidenceRankingFeature : public RankingFeature {
- public:
-  ConfidenceRankingFeature() {}
-
- private:
-  double ComputeFeatureInternal(const fuchsia::modular::UserInput& query,
-                                const RankedSuggestion& suggestion) override {
-    return suggestion.confidence;
-  }
-};
-
-class RankedActiveFilterTest : public ::testing::Test {
- public:
-  void SetUp() override {
-    filter = std::make_unique<RankedActiveFilter>(
-        std::make_shared<ConfidenceRankingFeature>());
-  }
-
- protected:
-  std::unique_ptr<RankedActiveFilter> filter;
-};
-
-void AddTestRankedSuggestion(
-    std::vector<std::unique_ptr<RankedSuggestion>>* const list,
-    double confidence) {
-  auto suggestion = std::make_unique<RankedSuggestion>();
-  suggestion->confidence = confidence;
-  list->push_back(std::move(suggestion));
-}
-
-TEST_F(RankedActiveFilterTest, Filter) {
-  // Should filter all ranked suggestions for which the ranking feature
-  // evaluates to 1 (max confidence).
-  std::vector<std::unique_ptr<RankedSuggestion>> list;
-  AddTestRankedSuggestion(&list, 0.1);
-  AddTestRankedSuggestion(&list, 1.0);
-  AddTestRankedSuggestion(&list, 0.5);
-  AddTestRankedSuggestion(&list, 1.0);
-  AddTestRankedSuggestion(&list, 0.9);
-  AddTestRankedSuggestion(&list, 1.0);
-
-  filter->Filter(&list);
-
-  EXPECT_EQ(list.size(), 3u);
-  EXPECT_EQ(list[0]->confidence, 0.1);
-  EXPECT_EQ(list[1]->confidence, 0.5);
-  EXPECT_EQ(list[2]->confidence, 0.9);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/filters/ranked_passive_filter.cc b/bin/suggestion_engine/filters/ranked_passive_filter.cc
deleted file mode 100644
index 36664c4..0000000
--- a/bin/suggestion_engine/filters/ranked_passive_filter.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/filters/ranked_passive_filter.h"
-
-#include <list>
-
-namespace modular {
-
-RankedPassiveFilter::RankedPassiveFilter(
-    std::shared_ptr<RankingFeature> ranking_feature)
-    : ranking_feature_(ranking_feature) {}
-
-RankedPassiveFilter::~RankedPassiveFilter() = default;
-
-// If the confidence of the ranking feature is 1.0 then this filter returns
-// true.
-bool RankedPassiveFilter::Filter(
-    const std::unique_ptr<RankedSuggestion>& ranked_suggestion) {
-  double confidence = ranking_feature_->ComputeFeature(
-      fuchsia::modular::UserInput(), *ranked_suggestion);
-  return confidence == kMaxConfidence;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/filters/ranked_passive_filter.h b/bin/suggestion_engine/filters/ranked_passive_filter.h
deleted file mode 100644
index 6833f9b..0000000
--- a/bin/suggestion_engine/filters/ranked_passive_filter.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_RANKED_PASSIVE_FILTER_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_RANKED_PASSIVE_FILTER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/filters/suggestion_passive_filter.h"
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-class RankedPassiveFilter : public SuggestionPassiveFilter {
- public:
-  RankedPassiveFilter(std::shared_ptr<RankingFeature> ranking_feature);
-  ~RankedPassiveFilter() override;
-
-  bool Filter(const std::unique_ptr<RankedSuggestion>& suggestion) override;
-
- private:
-  std::shared_ptr<RankingFeature> ranking_feature_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_RANKED_PASSIVE_FILTER_H_
diff --git a/bin/suggestion_engine/filters/ranked_passive_filter_unittest.cc b/bin/suggestion_engine/filters/ranked_passive_filter_unittest.cc
deleted file mode 100644
index a16932e..0000000
--- a/bin/suggestion_engine/filters/ranked_passive_filter_unittest.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/filters/ranked_passive_filter.h"
-
-#include "gtest/gtest.h"
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-namespace {
-
-class ConfidenceRankingFeature : public RankingFeature {
- public:
-  ConfidenceRankingFeature() {}
-
- private:
-  double ComputeFeatureInternal(const fuchsia::modular::UserInput& query,
-                                const RankedSuggestion& suggestion) override {
-    return suggestion.confidence;
-  }
-};
-
-class RankedPassiveFilterTest : public ::testing::Test {
- public:
-  void SetUp() override {
-    filter = std::make_unique<RankedPassiveFilter>(
-        std::make_shared<ConfidenceRankingFeature>());
-  }
-
- protected:
-  std::unique_ptr<RankedPassiveFilter> filter;
-};
-
-TEST_F(RankedPassiveFilterTest, FilterMaxConfidence) {
-  auto suggestion = std::make_unique<RankedSuggestion>();
-  suggestion->confidence = 1.0;
-  EXPECT_TRUE(filter->Filter(suggestion));
-}
-
-TEST_F(RankedPassiveFilterTest, FilterOtherConfidence) {
-  auto suggestion = std::make_unique<RankedSuggestion>();
-  suggestion->confidence = 0.5;
-  EXPECT_FALSE(filter->Filter(suggestion));
-
-  auto suggestion2 = std::make_unique<RankedSuggestion>();
-  suggestion2->confidence = 0.0;
-  EXPECT_FALSE(filter->Filter(suggestion2));
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/filters/suggestion_active_filter.cc b/bin/suggestion_engine/filters/suggestion_active_filter.cc
deleted file mode 100644
index e706ed7..0000000
--- a/bin/suggestion_engine/filters/suggestion_active_filter.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/filters/suggestion_active_filter.h"
-
-namespace modular {
-
-SuggestionActiveFilter::SuggestionActiveFilter() = default;
-
-SuggestionActiveFilter::~SuggestionActiveFilter() = default;
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/filters/suggestion_active_filter.h b/bin/suggestion_engine/filters/suggestion_active_filter.h
deleted file mode 100644
index b226574..0000000
--- a/bin/suggestion_engine/filters/suggestion_active_filter.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_SUGGESTION_ACTIVE_FILTER_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_SUGGESTION_ACTIVE_FILTER_H_
-
-#include <vector>
-
-#include "peridot/bin/suggestion_engine/ranked_suggestion.h"
-
-namespace modular {
-
-class SuggestionActiveFilter {
- public:
-  SuggestionActiveFilter();
-  virtual ~SuggestionActiveFilter();
-
-  // Browse through the vector of ranked suggestions and remove/alter the
-  // suggestions.
-  virtual void Filter(
-      std::vector<std::unique_ptr<RankedSuggestion>>* const suggestions) = 0;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_SUGGESTION_ACTIVE_FILTER_H_
diff --git a/bin/suggestion_engine/filters/suggestion_passive_filter.cc b/bin/suggestion_engine/filters/suggestion_passive_filter.cc
deleted file mode 100644
index 3542494..0000000
--- a/bin/suggestion_engine/filters/suggestion_passive_filter.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/filters/suggestion_passive_filter.h"
-
-namespace modular {
-
-SuggestionPassiveFilter::SuggestionPassiveFilter() = default;
-
-SuggestionPassiveFilter::~SuggestionPassiveFilter() = default;
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/filters/suggestion_passive_filter.h b/bin/suggestion_engine/filters/suggestion_passive_filter.h
deleted file mode 100644
index 2a55198..0000000
--- a/bin/suggestion_engine/filters/suggestion_passive_filter.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_SUGGESTION_PASSIVE_FILTER_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_SUGGESTION_PASSIVE_FILTER_H_
-
-#include "peridot/bin/suggestion_engine/ranked_suggestion.h"
-
-namespace modular {
-
-class SuggestionPassiveFilter {
- public:
-  SuggestionPassiveFilter();
-  virtual ~SuggestionPassiveFilter();
-
-  // Evaluate the suggestion based on the filter criteria and return a boolean
-  // value.
-  virtual bool Filter(const std::unique_ptr<RankedSuggestion>& suggestion) = 0;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_FILTERS_SUGGESTION_PASSIVE_FILTER_H_
diff --git a/bin/suggestion_engine/interruptions_processor.cc b/bin/suggestion_engine/interruptions_processor.cc
deleted file mode 100644
index 252b84a..0000000
--- a/bin/suggestion_engine/interruptions_processor.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/interruptions_processor.h"
-
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-InterruptionsProcessor::InterruptionsProcessor() = default;
-InterruptionsProcessor::~InterruptionsProcessor() = default;
-
-void InterruptionsProcessor::RegisterListener(
-    fidl::InterfaceHandle<fuchsia::modular::InterruptionListener> listener) {
-  listeners_.AddInterfacePtr(listener.Bind());
-}
-
-void InterruptionsProcessor::SetDecisionPolicy(
-    std::unique_ptr<DecisionPolicy> decision_policy) {
-  decision_policy_ = std::move(decision_policy);
-}
-
-bool InterruptionsProcessor::MaybeInterrupt(
-    const RankedSuggestion& suggestion) {
-  if (decision_policy_->Accept(suggestion)) {
-    for (auto& listener : listeners_.ptrs()) {
-      DispatchInterruption(listener->get(), suggestion);
-    }
-    return true;
-  }
-  return false;
-}
-
-void InterruptionsProcessor::DispatchInterruption(
-    fuchsia::modular::InterruptionListener* const listener,
-    const RankedSuggestion& ranked_suggestion) {
-  fuchsia::modular::Suggestion suggestion = CreateSuggestion(ranked_suggestion);
-  suggestion.confidence = kMaxConfidence;
-  listener->OnInterrupt(std::move(suggestion));
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/interruptions_processor.h b/bin/suggestion_engine/interruptions_processor.h
deleted file mode 100644
index f2933e3..0000000
--- a/bin/suggestion_engine/interruptions_processor.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_INTERRUPTIONS_PROCESSOR_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_INTERRUPTIONS_PROCESSOR_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-
-#include "peridot/bin/suggestion_engine/decision_policies/decision_policy.h"
-#include "peridot/bin/suggestion_engine/ranked_suggestion.h"
-
-namespace modular {
-
-// The InterruptionProcessor determines whether a proposal should interrupt
-// the user. If the decision to interrupt is made, this processor also
-// determines when and how the interruption should occur.
-//
-// All interrupting suggestions remain stored as contextual "next"
-// suggestions.
-class InterruptionsProcessor {
- public:
-  InterruptionsProcessor();
-  ~InterruptionsProcessor();
-
-  // Ranker that will be used to know if a suggestion should interrupt.
-  void SetDecisionPolicy(std::unique_ptr<DecisionPolicy> decision_policy);
-
-  // Add listener that will be notified when an interruption comes.
-  void RegisterListener(
-      fidl::InterfaceHandle<fuchsia::modular::InterruptionListener> listener);
-
-  // Based on ranker confidence, dispatch an interruption for the given
-  // suggestion
-  bool MaybeInterrupt(const RankedSuggestion& suggestion);
-
- private:
-  void DispatchInterruption(
-      fuchsia::modular::InterruptionListener* const listener,
-      const RankedSuggestion& ranked_suggestion);
-
-  fidl::InterfacePtrSet<fuchsia::modular::InterruptionListener> listeners_;
-
-  std::unique_ptr<DecisionPolicy> decision_policy_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_INTERRUPTIONS_PROCESSOR_H_
diff --git a/bin/suggestion_engine/media_player.cc b/bin/suggestion_engine/media_player.cc
deleted file mode 100644
index e39493a..0000000
--- a/bin/suggestion_engine/media_player.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/media_player.h"
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/media/timeline/timeline.h>
-#include <lib/media/timeline/timeline_rate.h>
-
-namespace modular {
-
-MediaPlayer::MediaPlayer(fuchsia::media::AudioPtr audio,
-                         std::shared_ptr<SuggestionDebugImpl> debug)
-    : audio_(std::move(audio)), debug_(debug) {
-  audio_.set_error_handler([this](zx_status_t status) {
-    // TODO(miguelfrde): better error handling. If we observe this message it
-    // means that the underlying channel was closed.
-    FXL_LOG(WARNING) << "Audio connection error";
-    audio_ = nullptr;
-  });
-}
-
-MediaPlayer::~MediaPlayer() = default;
-
-void MediaPlayer::SetSpeechStatusCallback(SpeechStatusCallback callback) {
-  speech_status_callback_ = std::move(callback);
-}
-
-void MediaPlayer::PlayAudioResponse(
-    fidl::InterfaceRequest<fuchsia::media::AudioRenderer> audio_response) {
-  if (!audio_) {
-    FXL_LOG(ERROR) << "Not playing query audio response because our audio "
-                      "service connection died earlier.";
-    return;
-  }
-
-  audio_->CreateAudioRenderer(audio_renderer_.NewRequest());
-  audio_renderer_binding_ =
-      std::make_unique<fidl::Binding<fuchsia::media::AudioRenderer>>(
-          audio_renderer_.get());
-  audio_renderer_binding_->set_error_handler([this](zx_status_t status) {
-    speech_status_callback_(fuchsia::modular::SpeechStatus::IDLE);
-  });
-  audio_renderer_binding_->Bind(std::move(audio_response));
-
-  speech_status_callback_(fuchsia::modular::SpeechStatus::RESPONDING);
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/media_player.h b/bin/suggestion_engine/media_player.h
deleted file mode 100644
index f559bf8..0000000
--- a/bin/suggestion_engine/media_player.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_MEDIA_PLAYER_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_MEDIA_PLAYER_H_
-
-#include <vector>
-
-#include <fuchsia/media/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-
-#include "peridot/bin/suggestion_engine/debug.h"
-#include "peridot/lib/util/idle_waiter.h"
-
-namespace modular {
-
-using SpeechStatusCallback =
-    std::function<void(fuchsia::modular::SpeechStatus)>;
-
-// Class in charge of playing media (speech) responses coming from query
-// responses.
-class MediaPlayer {
- public:
-  // Instantiates a new MediaPlayer object.
-  // |audio| is a binding to the audio service that will be used.
-  // |debug| is used for debugging and testing purposes. Should be provided.
-  MediaPlayer(fuchsia::media::AudioPtr audio,
-              std::shared_ptr<SuggestionDebugImpl> debug);
-  ~MediaPlayer();
-
-  // Sets callback that is called whenever a change to
-  // fuchsia::modular::SpeechStatus occurs.
-  void SetSpeechStatusCallback(SpeechStatusCallback callback);
-
-  // Plays audio response coming from a query response.
-  void PlayAudioResponse(
-      fidl::InterfaceRequest<fuchsia::media::AudioRenderer> audio_response);
-
- private:
-  fuchsia::media::AudioPtr audio_;
-
-  // Suggestion Engine maintains ownership of an |AudioRendererPtr| during
-  // playback to enforce policy and have visibility into playback status (via
-  // whether or not the channel is closed). Only one agent is allowed to play
-  // responses at a time.
-  fuchsia::media::AudioRendererPtr audio_renderer_;
-  std::unique_ptr<fidl::Binding<fuchsia::media::AudioRenderer>>
-      audio_renderer_binding_;
-
-  std::shared_ptr<SuggestionDebugImpl> debug_;
-  SpeechStatusCallback speech_status_callback_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_MEDIA_PLAYER_H_
diff --git a/bin/suggestion_engine/meta/suggestion_engine.cmx b/bin/suggestion_engine/meta/suggestion_engine.cmx
deleted file mode 100644
index 180b1e6..0000000
--- a/bin/suggestion_engine/meta/suggestion_engine.cmx
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.modular.ContextReader",
-            "fuchsia.modular.PuppetMaster"
-        ]
-    }
-}
diff --git a/bin/suggestion_engine/navigation_processor.cc b/bin/suggestion_engine/navigation_processor.cc
deleted file mode 100644
index 035ddc3..0000000
--- a/bin/suggestion_engine/navigation_processor.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/navigation_processor.h"
-
-namespace modular {
-
-NavigationProcessor::NavigationProcessor() = default;
-NavigationProcessor::~NavigationProcessor() = default;
-
-void NavigationProcessor::RegisterListener(
-    fidl::InterfaceHandle<fuchsia::modular::NavigationListener> listener) {
-  listeners_.AddInterfacePtr(listener.Bind());
-}
-
-void NavigationProcessor::Navigate(
-    fuchsia::modular::NavigationAction navigation) {
-  for (const auto& listener : listeners_.ptrs()) {
-    (*listener)->OnNavigation(navigation);
-  }
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/navigation_processor.h b/bin/suggestion_engine/navigation_processor.h
deleted file mode 100644
index d143f18..0000000
--- a/bin/suggestion_engine/navigation_processor.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_NAVIGATION_PROCESSOR_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_NAVIGATION_PROCESSOR_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "lib/fidl/cpp/interface_ptr_set.h"
-#include "lib/fxl/memory/weak_ptr.h"
-#include "peridot/bin/suggestion_engine/decision_policies/decision_policy.h"
-
-namespace modular {
-
-// The NavigationProcessor dispatches received navigation events.
-class NavigationProcessor {
- public:
-  NavigationProcessor();
-  ~NavigationProcessor();
-
-  // Add listener that will be notified when a navigation event comes.
-  void RegisterListener(
-      fidl::InterfaceHandle<fuchsia::modular::NavigationListener> listener);
-
-  // Immediately send the navigation event to listeners.
-  void Navigate(fuchsia::modular::NavigationAction navigation);
-
- private:
-  fidl::InterfacePtrSet<fuchsia::modular::NavigationListener> listeners_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_NAVIGATION_PROCESSOR_H_
diff --git a/bin/suggestion_engine/next_processor.cc b/bin/suggestion_engine/next_processor.cc
deleted file mode 100644
index 7d62689..0000000
--- a/bin/suggestion_engine/next_processor.cc
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/next_processor.h"
-
-#include "peridot/bin/suggestion_engine/suggestion_engine_helper.h"
-
-namespace modular {
-
-NextProcessor::NextProcessor(std::shared_ptr<SuggestionDebugImpl> debug)
-    : debug_(debug), processing_(false) {}
-
-NextProcessor::~NextProcessor() = default;
-
-void NextProcessor::RegisterListener(
-    fidl::InterfaceHandle<fuchsia::modular::NextListener> listener,
-    const size_t max_results) {
-  auto listenerPtr = listener.Bind();
-
-  // Notify the listener of the current next suggestions
-  NotifyOfResults(listenerPtr, max_results);
-
-  // Save the listener
-  listeners_.emplace_back(std::move(listenerPtr), max_results);
-
-  // Register connection error handler on new listener to remove from list
-  // if connection drops.  This code is mostly borrowed from InterfacePtrSet
-  fuchsia::modular::NextListenerPtr& nextPtr = listeners_.back().first;
-  fuchsia::modular::NextListener* pointer = nextPtr.get();
-  nextPtr.set_error_handler([pointer, this](zx_status_t status) {
-    auto it = std::find_if(
-        listeners_.begin(), listeners_.end(),
-        [pointer](const auto& p) { return (p.first.get() == pointer); });
-    assert(it != listeners_.end());
-    listeners_.erase(it);
-  });
-}
-
-void NextProcessor::RegisterInterruptionListener(
-    fidl::InterfaceHandle<fuchsia::modular::InterruptionListener> listener) {
-  interruptions_processor_.RegisterListener(std::move(listener));
-}
-
-void NextProcessor::AddProposal(const std::string& component_url,
-                                fuchsia::modular::Proposal proposal) {
-  AddProposal(component_url, "" /* preloaded_story_id */, std::move(proposal));
-}
-
-void NextProcessor::AddProposal(const std::string& component_url,
-                                const std::string& preloaded_story_id,
-                                fuchsia::modular::Proposal proposal) {
-  NotifyOfProcessingChange(true);
-  // The component_url and proposal ID form a unique identifier for a proposal.
-  // If one already exists, remove it before adding the new one.
-  RemoveProposal(component_url, proposal.id);
-
-  auto prototype = CreateSuggestionPrototype(
-      &prototypes_, component_url, preloaded_story_id, std::move(proposal));
-
-  if (prototype->proposal.listener) {
-    prototype->bound_listener = prototype->proposal.listener.Bind();
-    prototype->bound_listener.set_error_handler(
-        [this, proposal_id = prototype->proposal.id,
-         component_url](zx_status_t status) {
-          RemoveProposal(component_url, proposal_id);
-        });
-  }
-
-  auto ranked_suggestion = RankedSuggestion::New(prototype);
-
-  // TODO(miguelfrde): Make NextProcessor not depend on InterruptionsProcessor.
-  if (interruptions_processor_.MaybeInterrupt(*ranked_suggestion)) {
-    ranked_suggestion->interrupting = true;
-    debug_->OnInterrupt(prototype);
-  }
-
-  suggestions_.AddSuggestion(std::move(ranked_suggestion));
-  UpdateRanking();
-}
-
-void NextProcessor::RemoveProposal(const std::string& component_url,
-                                   const std::string& proposal_id) {
-  const auto key = std::make_pair(component_url, proposal_id);
-  auto toRemove = prototypes_.find(key);
-  if (toRemove != prototypes_.end()) {
-    // can't erase right off the bat because the prototype must remain valid
-    // until removed from the ranked list
-    RemoveProposalFromList(component_url, proposal_id);
-    prototypes_.erase(toRemove);
-  }
-}
-
-SuggestionPrototype* NextProcessor::GetSuggestion(
-    const std::string& component_url, const std::string& proposal_id) const {
-  RankedSuggestion* ranked_suggestion =
-      suggestions_.GetSuggestion(component_url, proposal_id);
-  if (ranked_suggestion) {
-    return ranked_suggestion->prototype;
-  }
-  return nullptr;
-}
-
-void NextProcessor::RemoveProposalFromList(const std::string& component_url,
-                                           const std::string& proposal_id) {
-  NotifyOfProcessingChange(true);
-  if (suggestions_.RemoveProposal(component_url, proposal_id)) {
-    UpdateRanking();
-  }
-}
-
-void NextProcessor::SetActiveFilters(
-    std::vector<std::unique_ptr<SuggestionActiveFilter>>&& active_filters) {
-  suggestions_.SetActiveFilters(std::move(active_filters));
-}
-
-void NextProcessor::SetPassiveFilters(
-    std::vector<std::unique_ptr<SuggestionPassiveFilter>>&& passive_filters) {
-  suggestions_.SetPassiveFilters(std::move(passive_filters));
-}
-
-void NextProcessor::SetRanker(std::unique_ptr<Ranker> ranker) {
-  suggestions_.SetRanker(std::move(ranker));
-}
-
-void NextProcessor::SetInterruptionDecisionPolicy(
-    std::unique_ptr<DecisionPolicy> decision_policy) {
-  interruptions_processor_.SetDecisionPolicy(std::move(decision_policy));
-}
-
-RankedSuggestion* NextProcessor::GetSuggestion(
-    const std::string& suggestion_id) const {
-  return suggestions_.GetSuggestion(suggestion_id);
-}
-
-void NextProcessor::UpdateRanking() {
-  suggestions_.Refresh();
-  NotifyAllOfResults();
-  debug_->OnNextUpdate(&suggestions_);
-  NotifyOfProcessingChange(false);
-}
-
-void NextProcessor::NotifyAllOfResults() {
-  for (const auto& it : listeners_) {
-    if (it.first) {
-      NotifyOfResults(it.first, it.second);
-    }
-  }
-}
-
-void NextProcessor::NotifyOfProcessingChange(const bool processing) {
-  if (processing_ != processing) {
-    processing_ = processing;
-    // Notify all listeners that the processing state has changed
-    for (const auto& it : listeners_) {
-      if (it.first) {
-        it.first->OnProcessingChange(processing_);
-      }
-    }
-  }
-}
-
-void NextProcessor::NotifyOfResults(
-    const fuchsia::modular::NextListenerPtr& listener,
-    const size_t max_results) {
-  const auto& suggestion_vector = suggestions_.Get();
-
-  std::vector<fuchsia::modular::Suggestion> window;
-  for (size_t i = 0;
-       window.size() < max_results && i < suggestion_vector.size(); i++) {
-    if (!suggestion_vector[i]->hidden) {
-      window.push_back(CreateSuggestion(*suggestion_vector[i]));
-    }
-  }
-
-  listener->OnNextResults(std::move(window));
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/next_processor.h b/bin/suggestion_engine/next_processor.h
deleted file mode 100644
index 6a4ec29..0000000
--- a/bin/suggestion_engine/next_processor.h
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_NEXT_PROCESSOR_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_NEXT_PROCESSOR_H_
-
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-
-#include "peridot/bin/suggestion_engine/debug.h"
-#include "peridot/bin/suggestion_engine/decision_policies/decision_policy.h"
-#include "peridot/bin/suggestion_engine/filters/suggestion_active_filter.h"
-#include "peridot/bin/suggestion_engine/filters/suggestion_passive_filter.h"
-#include "peridot/bin/suggestion_engine/interruptions_processor.h"
-#include "peridot/bin/suggestion_engine/proposal_publisher_impl.h"
-#include "peridot/bin/suggestion_engine/ranked_suggestion.h"
-#include "peridot/bin/suggestion_engine/ranked_suggestions_list.h"
-#include "peridot/bin/suggestion_engine/rankers/ranker.h"
-#include "peridot/bin/suggestion_engine/suggestion_prototype.h"
-
-namespace modular {
-
-class ProposalPublisherImpl;
-class SuggestionEngineImpl;
-
-// The NextProcessor manages all contextual proposals for the suggestion
-// engine.
-class NextProcessor {
- public:
-  NextProcessor(std::shared_ptr<SuggestionDebugImpl> debug);
-  virtual ~NextProcessor();
-
-  void RegisterListener(
-      fidl::InterfaceHandle<fuchsia::modular::NextListener> listener,
-      size_t max_results);
-
-  void RegisterInterruptionListener(
-      fidl::InterfaceHandle<fuchsia::modular::InterruptionListener> listener);
-
-  // Adds a next suggestion created from the provided proposal.
-  //
-  // |component_url| The url of the component that created the proposal.
-  // |proposal| The proposal to create the suggestion from.
-  void AddProposal(const std::string& component_url,
-                   fuchsia::modular::Proposal proposal);
-
-  // Adds a next suggestion created from the provided proposal. This method
-  // allows the caller to specify a story that can be used to dynamically
-  // preview the created suggestion.
-  //
-  // |component_url| The url of the component that created the proposal.
-  // |preloaded_story_id| The identifier for a story that can be used to
-  //     display a dynamic suggestion for the proposal. If empty, no such
-  //     story exists.
-  // |proposal| The proposal to create the suggestion from.
-  void AddProposal(const std::string& component_url,
-                   const std::string& preloaded_story_id,
-                   fuchsia::modular::Proposal proposal);
-
-  // Removes the identified proposal from the next processor.
-  //
-  // |component_url| The url of the component that created the proposal.
-  // |proposal_id| The identifier for the proposal.
-  void RemoveProposal(const std::string& component_url,
-                      const std::string& proposal_id);
-
-  // Returns a pointer to the suggestion associated with the provided
-  // |component_url| and |proposal_id|, or nullptr if no such suggestion exists.
-  SuggestionPrototype* GetSuggestion(const std::string& component_url,
-                                     const std::string& proposal_id) const;
-
-  void SetActiveFilters(
-      std::vector<std::unique_ptr<SuggestionActiveFilter>>&& active_filters);
-
-  void SetPassiveFilters(
-      std::vector<std::unique_ptr<SuggestionPassiveFilter>>&& passive_filters);
-
-  void SetRanker(std::unique_ptr<Ranker> ranker);
-
-  void SetInterruptionDecisionPolicy(
-      std::unique_ptr<DecisionPolicy> decision_policy);
-
-  // Gets a suggestion stored in the processor.
-  RankedSuggestion* GetSuggestion(const std::string& suggestion_id) const;
-
-  // Reranks suggestions if dirty and updates listeners
-  void UpdateRanking();
-
-  // Notify the listeners of new suggestions
-  void NotifyAllOfResults();
-
-  // Notifies the listeners that the processing state has changed.
-  void NotifyOfProcessingChange(bool processing);
-
- private:
-  // (proposer ID, proposal ID) => suggestion prototype
-  using SuggestionPrototypeMap = std::map<std::pair<std::string, std::string>,
-                                          std::unique_ptr<SuggestionPrototype>>;
-
-  void NotifyOfResults(const fuchsia::modular::NextListenerPtr& listener,
-                       size_t max_results);
-
-  void RemoveProposalFromList(const std::string& component_url,
-                              const std::string& proposal_id);
-
-  InterruptionsProcessor interruptions_processor_;
-  RankedSuggestionsList suggestions_;
-  std::shared_ptr<SuggestionDebugImpl> debug_;
-  SuggestionPrototypeMap prototypes_;
-  bool processing_;
-
-  std::vector<std::pair<fuchsia::modular::NextListenerPtr, size_t>> listeners_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_NEXT_PROCESSOR_H_
diff --git a/bin/suggestion_engine/proposal_publisher_impl.cc b/bin/suggestion_engine/proposal_publisher_impl.cc
deleted file mode 100644
index da03970..0000000
--- a/bin/suggestion_engine/proposal_publisher_impl.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/proposal_publisher_impl.h"
-
-#include "peridot/bin/suggestion_engine/suggestion_engine_impl.h"
-
-namespace modular {
-
-ProposalPublisherImpl::ProposalPublisherImpl(SuggestionEngineImpl* engine,
-                                             const std::string& component_url)
-    : engine_(engine),
-      component_url_(component_url),
-      bindings_(this),
-      weak_ptr_factory_(this) {}
-
-ProposalPublisherImpl::~ProposalPublisherImpl() = default;
-
-void ProposalPublisherImpl::AddBinding(
-    fidl::InterfaceRequest<fuchsia::modular::ProposalPublisher> request) {
-  bindings_.emplace(new fidl::Binding<fuchsia::modular::ProposalPublisher>(
-      this, std::move(request)));
-}
-
-void ProposalPublisherImpl::Propose(fuchsia::modular::Proposal proposal) {
-  engine_->AddNextProposal(this, std::move(proposal));
-}
-
-void ProposalPublisherImpl::ProposeNavigation(
-    fuchsia::modular::NavigationAction navigation) {
-  engine_->ProposeNavigation(navigation);
-}
-
-void ProposalPublisherImpl::Remove(std::string proposal_id) {
-  engine_->RemoveNextProposal(component_url_, proposal_id);
-}
-
-ProposalPublisherImpl::BindingSet::BindingSet(ProposalPublisherImpl* impl)
-    : impl_(impl) {}
-
-ProposalPublisherImpl::BindingSet::~BindingSet() = default;
-
-void ProposalPublisherImpl::BindingSet::OnConnectionError(
-    fidl::Binding<fuchsia::modular::ProposalPublisher>* binding) {
-  ::modular::BindingSet<fuchsia::modular::ProposalPublisher>::OnConnectionError(
-      binding);
-
-  if (impl_->ShouldEraseSelf())
-    impl_->EraseSelf();
-}
-
-bool ProposalPublisherImpl::ShouldEraseSelf() const {
-  return bindings_.empty() && !weak_ptr_factory_.HasWeakPtrs();
-}
-
-void ProposalPublisherImpl::EraseSelf() {
-  engine_->RemoveSourceClient(component_url_);
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/proposal_publisher_impl.h b/bin/suggestion_engine/proposal_publisher_impl.h
deleted file mode 100644
index 8bd4cc0..0000000
--- a/bin/suggestion_engine/proposal_publisher_impl.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_PROPOSAL_PUBLISHER_IMPL_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_PROPOSAL_PUBLISHER_IMPL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/lib/bound_set/bound_set.h"
-
-namespace modular {
-
-class SuggestionEngineImpl;
-
-/*
-  ProposalPublisherImpl tracks proposals and their resulting suggestions
-  from a single suggestion agent. Source entries are created on demand and kept
-  alive as long as any proposals or publisher bindings exist.
-
- TODO: The component_url should eventually be replaced with a more consistent
-  identifier that's reused across components to identify specific executables.
-*/
-class ProposalPublisherImpl : public fuchsia::modular::ProposalPublisher {
- public:
-  ProposalPublisherImpl(SuggestionEngineImpl* engine,
-                        const std::string& component_url);
-
-  ~ProposalPublisherImpl() override;
-
-  void AddBinding(
-      fidl::InterfaceRequest<fuchsia::modular::ProposalPublisher> request);
-
-  void Propose(fuchsia::modular::Proposal proposal) override;
-  void Remove(std::string proposal_id) override;
-
-  void ProposeNavigation(
-      fuchsia::modular::NavigationAction navigation) override;
-
-  const std::string component_url() { return component_url_; }
-
- private:
-  class BindingSet
-      : public ::modular::BindingSet<fuchsia::modular::ProposalPublisher> {
-   public:
-    BindingSet(ProposalPublisherImpl* impl);
-    ~BindingSet() override;
-
-   protected:
-    void OnConnectionError(
-        fidl::Binding<fuchsia::modular::ProposalPublisher>* binding) override;
-
-   private:
-    ProposalPublisherImpl* const impl_;
-  };
-
-  bool ShouldEraseSelf() const;
-  void EraseSelf();
-
-  SuggestionEngineImpl* const engine_;
-  const std::string component_url_;
-  BindingSet bindings_;
-
-  fxl::WeakPtrFactory<ProposalPublisherImpl> weak_ptr_factory_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_PROPOSAL_PUBLISHER_IMPL_H_
diff --git a/bin/suggestion_engine/query_processor.cc b/bin/suggestion_engine/query_processor.cc
deleted file mode 100644
index d0e72ed..0000000
--- a/bin/suggestion_engine/query_processor.cc
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/query_processor.h"
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-
-#include "peridot/bin/suggestion_engine/suggestion_engine_helper.h"
-#include "peridot/lib/fidl/json_xdr.h"
-
-namespace modular {
-
-namespace {
-
-constexpr char kQueryContextKey[] = "/suggestion_engine/current_query";
-
-}  // namespace
-
-QueryProcessor::QueryProcessor(std::shared_ptr<SuggestionDebugImpl> debug)
-    : debug_(debug) {}
-
-QueryProcessor::~QueryProcessor() = default;
-
-void QueryProcessor::Initialize(
-    fidl::InterfaceHandle<fuchsia::modular::ContextWriter> context_writer) {
-  context_writer_.Bind(std::move(context_writer));
-}
-
-void QueryProcessor::ExecuteQuery(
-    fuchsia::modular::UserInput input, int count,
-    fidl::InterfaceHandle<fuchsia::modular::QueryListener> listener) {
-  // Process:
-  //   1. Close out and clean up any existing query process
-  //   2. Update the context engine with the new query
-  //   3. Set up the ask variables in suggestion engine
-  //   4. Get suggestions from each of the QueryHandlers
-  //   5. Filter and Rank the suggestions as received
-  //   6. Send "done" to SuggestionListener
-
-  // Step 1
-  CleanUpPreviousQuery();
-
-  // Step 2
-  std::string query = input.text;
-  if (!query.empty() && context_writer_.is_bound()) {
-    // Update context engine
-    std::string formattedQuery;
-
-    XdrFilterType<std::string> filter_list[] = {
-        XdrFilter<std::string>,
-        nullptr,
-    };
-
-    XdrWrite(&formattedQuery, &query, filter_list);
-    context_writer_->WriteEntityTopic(kQueryContextKey, formattedQuery);
-
-    // Update suggestion engine debug interface
-    debug_->OnAskStart(query, &suggestions_);
-  }
-
-  // Steps 3 - 6
-  activity_ = debug_->GetIdleWaiter()->RegisterOngoingActivity();
-  active_query_ = std::make_unique<QueryRunner>(std::move(listener),
-                                                std::move(input), count);
-  active_query_->SetResponseCallback(
-      [this, input](const std::string& handler_url,
-                    fuchsia::modular::QueryResponse response) {
-        OnQueryResponse(input, handler_url, std::move(response));
-      });
-  active_query_->SetEndRequestCallback(
-      [this, input] { OnQueryEndRequest(input); });
-  active_query_->Run(query_handlers_);
-}
-
-void QueryProcessor::RegisterQueryHandler(
-    fidl::StringPtr url, fidl::InterfaceHandle<fuchsia::modular::QueryHandler>
-                             query_handler_handle) {
-  auto query_handler = query_handler_handle.Bind();
-  query_handlers_.emplace_back(std::move(query_handler), url);
-
-  fuchsia::modular::QueryHandlerPtr& handler = query_handlers_.back().handler;
-  handler.set_error_handler([this, ptr = handler.get()](zx_status_t status) {
-    auto it = std::find_if(query_handlers_.begin(), query_handlers_.end(),
-                           [ptr](const QueryHandlerRecord& record) {
-                             return record.handler.get() == ptr;
-                           });
-
-    FXL_DCHECK(it != query_handlers_.end());
-    auto to_erase = query_handlers_.end() - 1;
-    std::iter_swap(it, to_erase);
-    query_handlers_.erase(to_erase);
-  });
-}
-
-void QueryProcessor::SetFilters(
-    std::vector<std::unique_ptr<SuggestionActiveFilter>>&& active_filters,
-    std::vector<std::unique_ptr<SuggestionPassiveFilter>>&& passive_filters) {
-  suggestions_.SetActiveFilters(std::move(active_filters));
-  suggestions_.SetPassiveFilters(std::move(passive_filters));
-}
-
-void QueryProcessor::SetRanker(std::unique_ptr<Ranker> ranker) {
-  suggestions_.SetRanker(std::move(ranker));
-}
-
-RankedSuggestion* QueryProcessor::GetSuggestion(
-    const std::string& suggestion_uuid) const {
-  return suggestions_.GetSuggestion(suggestion_uuid);
-}
-
-void QueryProcessor::CleanUpPreviousQuery() {
-  active_query_.reset();
-  suggestions_.RemoveAllSuggestions();
-}
-
-void QueryProcessor::AddProposal(const std::string& source_url,
-                                 fuchsia::modular::Proposal proposal) {
-  suggestions_.RemoveProposal(source_url, proposal.id);
-
-  SuggestionPrototype* suggestion =
-      CreateSuggestionPrototype(&query_prototypes_, source_url,
-                                "" /* Emtpy story_id */, std::move(proposal));
-  suggestions_.AddSuggestion(suggestion);
-}
-
-void QueryProcessor::OnQueryResponse(fuchsia::modular::UserInput input,
-                                     const std::string& handler_url,
-                                     fuchsia::modular::QueryResponse response) {
-  // Ranking currently happens as each set of proposals are added.
-  for (size_t i = 0; i < response.proposals.size(); ++i) {
-    AddProposal(handler_url, std::move(response.proposals.at(i)));
-  }
-  suggestions_.Refresh(input);
-
-  // Update the fuchsia::modular::QueryListener with new results
-  NotifyOfResults();
-
-  // Update the suggestion engine debug interface
-  debug_->OnAskStart(input.text, &suggestions_);
-}
-
-void QueryProcessor::OnQueryEndRequest(fuchsia::modular::UserInput input) {
-  debug_->OnAskStart(input.text, &suggestions_);
-  // Idle immediately, we no longer handle audio responses here.
-  activity_ = nullptr;
-}
-
-void QueryProcessor::NotifyOfResults() {
-  const auto& suggestion_vector = suggestions_.Get();
-
-  std::vector<fuchsia::modular::Suggestion> window;
-  for (size_t i = 0;
-       i < active_query_->max_results() && i < suggestion_vector.size(); i++) {
-    window.push_back(CreateSuggestion(*suggestion_vector[i]));
-  }
-
-  if (!window.empty()) {
-    active_query_->listener()->OnQueryResults(std::move(window));
-  }
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/query_processor.h b/bin/suggestion_engine/query_processor.h
deleted file mode 100644
index 8a444cd..0000000
--- a/bin/suggestion_engine/query_processor.h
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_QUERY_PROCESSOR_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_QUERY_PROCESSOR_H_
-
-#include <set>
-
-#include <fuchsia/media/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/suggestion_engine/media_player.h"
-#include "peridot/bin/suggestion_engine/query_runner.h"
-#include "peridot/bin/suggestion_engine/rankers/ranker.h"
-#include "peridot/bin/suggestion_engine/suggestion_prototype.h"
-#include "peridot/lib/util/idle_waiter.h"
-
-namespace modular {
-
-class SuggestionEngineImpl;
-
-// The query processor handles the pull-based query suggestion process,
-// including requesting suggestions from QueryHandlers, collating and
-// ranking those suggestions, and then providing them to the user.
-class QueryProcessor {
- public:
-  QueryProcessor(std::shared_ptr<SuggestionDebugImpl> debug);
-  ~QueryProcessor();
-
-  void Initialize(
-      fidl::InterfaceHandle<fuchsia::modular::ContextWriter> context_writer);
-
-  // Runs a query and notifies listener with results from it with the given
-  // input and providing 'count' results. It also caches all query results for
-  // future fetching using GetSuggestion(). Each time ExecuteQuery is called,
-  // suggestions from the previous query are cleared by calling
-  // CleanUpPreviousQuery() internally.
-  void ExecuteQuery(
-      fuchsia::modular::UserInput input, int count,
-      fidl::InterfaceHandle<fuchsia::modular::QueryListener> listener);
-
-  // Registers a handler that will be notified when a new query comes for its
-  // fullfillment.
-  void RegisterQueryHandler(
-      fidl::StringPtr url, fidl::InterfaceHandle<fuchsia::modular::QueryHandler>
-                               query_handler_handle);
-
-  void SetFilters(
-      std::vector<std::unique_ptr<SuggestionActiveFilter>>&& active_filters,
-      std::vector<std::unique_ptr<SuggestionPassiveFilter>>&& passive_filters);
-
-  void SetRanker(std::unique_ptr<Ranker> ranker);
-
-  // Returns a query suggestion with the given id.
-  // While a query is being executed or if no query has been executed, nullptr
-  // will be returned for any |suggestion_id|. If |suggestion_id| is not in the
-  // set of results given to the |listener| provided to the most recent
-  // invocation of ExecuteQuery(), return nullptr.
-  RankedSuggestion* GetSuggestion(const std::string& suggestion_uuid) const;
-
-  // Cleans up all resources associated with a query, including clearing
-  // the previous ask suggestions, closing any still open SuggestionListeners,
-  // etc.
-  void CleanUpPreviousQuery();
-
- private:
-  // (proposer ID, proposal ID) => suggestion prototype
-  using SuggestionPrototypeMap = std::map<std::pair<std::string, std::string>,
-                                          std::unique_ptr<SuggestionPrototype>>;
-
-  void AddProposal(const std::string& source_url,
-                   fuchsia::modular::Proposal proposal);
-
-  void OnQueryResponse(fuchsia::modular::UserInput input,
-                       const std::string& handler_url,
-                       fuchsia::modular::QueryResponse response);
-
-  void OnQueryEndRequest(fuchsia::modular::UserInput input);
-
-  void NotifyOfResults();
-
-  std::shared_ptr<SuggestionDebugImpl> debug_;
-  RankedSuggestionsList suggestions_;
-  SuggestionPrototypeMap query_prototypes_;
-
-  // Unique ptr for the query runner executing the query being processed.
-  std::unique_ptr<QueryRunner> active_query_;
-
-  // The fuchsia::modular::ContextWriter that publishes the current user query
-  // to the fuchsia::modular::ContextEngine.
-  fuchsia::modular::ContextWriterPtr context_writer_;
-
-  // The set of all QueryHandlers that have been registered mapped to their
-  // URLs (stored as strings).
-  std::vector<QueryHandlerRecord> query_handlers_;
-
-  util::IdleWaiter::ActivityToken activity_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_QUERY_PROCESSOR_H_
diff --git a/bin/suggestion_engine/query_runner.cc b/bin/suggestion_engine/query_runner.cc
deleted file mode 100644
index c6a4100..0000000
--- a/bin/suggestion_engine/query_runner.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-#include "peridot/bin/suggestion_engine/query_runner.h"
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/zx/time.h>
-
-namespace modular {
-
-namespace {
-
-// Force queries to complete after some delay for better UX until/unless we can
-// bring back staggered results in a way that isn't jarring and doesn't overly
-// complicate the API.
-constexpr zx::duration kQueryTimeout = zx::sec(9);
-
-}  // namespace
-
-class QueryRunner::HandlerRequest {
- public:
-  HandlerRequest(fxl::WeakPtr<QueryRunner> runner,
-                 const std::string& handler_url)
-      : runner_(runner), handler_url_(handler_url) {}
-
-  ~HandlerRequest() {
-    if (!runner_)
-      return;
-
-    if (completed_) {
-      FXL_VLOG(1) << "Handler " << handler_url_ << " complete";
-    } else {
-      FXL_LOG(WARNING) << "Handler " << handler_url_
-                       << " closed without completing for query \""
-                       << runner_->input_.text << "\".";
-    }
-
-    // find + erase rather than erase key to properly handle duplicate URLs
-    // (only remove one)
-    runner_->outstanding_handlers_.erase(
-        runner_->outstanding_handlers_.find(handler_url_));
-    FXL_VLOG(1) << runner_->outstanding_handlers_.size() << " remaining";
-    if (runner_->outstanding_handlers_.empty()) {
-      runner_->EndRequest();
-    }
-  }
-
-  void Complete(fuchsia::modular::QueryResponse response) {
-    if (runner_) {
-      runner_->on_query_response_callback_(handler_url_, std::move(response));
-      completed_ = true;
-    }
-  }
-
- private:
-  fxl::WeakPtr<QueryRunner> runner_;
-  std::string handler_url_;
-  bool completed_ = false;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(HandlerRequest);
-};
-
-QueryRunner::QueryRunner(
-    fidl::InterfaceHandle<fuchsia::modular::QueryListener> listener,
-    fuchsia::modular::UserInput input, int count)
-    : listener_(listener.Bind()),
-      input_(input),
-      max_results_(count),
-      request_ended_(false),
-      weak_ptr_factory_(this) {}
-
-// TODO(rosswang): Consider moving some of the cleanup logic into here, but
-// beware that this may not happen until after the next QueryProcessor has been
-// constructed (active_query_ = std::make_unique...).
-QueryRunner::~QueryRunner() {
-  if (!request_ended_) {
-    EndRequest();
-  }
-}
-
-void QueryRunner::Run(const std::vector<QueryHandlerRecord>& query_handlers) {
-  if (query_handlers.empty()) {
-    EndRequest();
-  } else {
-    for (const auto& handler_record : query_handlers) {
-      DispatchQuery(handler_record);
-    }
-
-    async::PostDelayedTask(async_get_default_dispatcher(),
-                           [w = weak_ptr_factory_.GetWeakPtr()] {
-                             if (w) {
-                               w->TimeOut();
-                             }
-                           },
-                           kQueryTimeout);
-  }
-}
-
-void QueryRunner::SetEndRequestCallback(std::function<void()> callback) {
-  on_end_request_callback_ = std::move(callback);
-}
-
-void QueryRunner::SetResponseCallback(
-    std::function<void(std::string, fuchsia::modular::QueryResponse)>
-        callback) {
-  on_query_response_callback_ = std::move(callback);
-}
-
-void QueryRunner::DispatchQuery(const QueryHandlerRecord& handler_record) {
-  FXL_DCHECK(!request_ended_);
-
-  outstanding_handlers_.insert(handler_record.url);
-
-  handler_record.handler->OnQuery(
-      input_, [request = std::make_shared<HandlerRequest>(
-                   weak_ptr_factory_.GetWeakPtr(), handler_record.url)](
-                  fuchsia::modular::QueryResponse response) {
-        request->Complete(std::move(response));
-      });
-}
-
-void QueryRunner::EndRequest() {
-  FXL_DCHECK(!request_ended_);
-  listener_->OnQueryComplete();
-  on_end_request_callback_();
-  weak_ptr_factory_.InvalidateWeakPtrs();
-  request_ended_ = true;
-}
-
-void QueryRunner::TimeOut() {
-  if (!outstanding_handlers_.empty()) {
-    FXL_LOG(WARNING) << "Query timeout for \"" << input_.text
-                     << "\". Still awaiting results from:";
-    for (const std::string& handler_url : outstanding_handlers_) {
-      FXL_LOG(WARNING) << "    " << handler_url;
-    }
-    EndRequest();
-  }
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/query_runner.h b/bin/suggestion_engine/query_runner.h
deleted file mode 100644
index 1c78d38..0000000
--- a/bin/suggestion_engine/query_runner.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_QUERY_RUNNER_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_QUERY_RUNNER_H_
-
-#include <set>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-namespace modular {
-
-struct QueryHandlerRecord;
-
-// QueryRunner is in charge of executing a query and interacting with the query
-// handlers, making sure all of them return or timeout if the query takes too
-// long to resolve. Through its callbacks it notifies when a query response
-// arrives and when all handlers finish processing the query or it times out.
-class QueryRunner {
- public:
-  QueryRunner(fidl::InterfaceHandle<fuchsia::modular::QueryListener> listener,
-              fuchsia::modular::UserInput input, int count);
-  ~QueryRunner();
-
-  // Starts running a query notifying the provided handlers and processes their
-  // responses.
-  void Run(const std::vector<QueryHandlerRecord>& query_handlers);
-
-  // Sets a callback that will be executed when a query request ends.
-  void SetEndRequestCallback(std::function<void()> callback);
-
-  // Sets a callback that will be executed when a response for the query in
-  // execution is received.
-  void SetResponseCallback(
-      std::function<void(std::string, fuchsia::modular::QueryResponse)>
-          callback);
-
-  fuchsia::modular::QueryListener* listener() const { return listener_.get(); }
-  size_t max_results() const { return max_results_; }
-
- private:
-  class HandlerRequest;
-
-  void DispatchQuery(const QueryHandlerRecord& handler_record);
-  void TimeOut();
-  void EndRequest();
-
-  fuchsia::modular::QueryListenerPtr listener_;
-  const fuchsia::modular::UserInput input_;
-  const size_t max_results_;
-  bool request_ended_;
-  fxl::WeakPtrFactory<QueryRunner> weak_ptr_factory_;
-
-  std::function<void(std::string, fuchsia::modular::QueryResponse)>
-      on_query_response_callback_;
-  std::function<void()> on_end_request_callback_;
-
-  std::multiset<std::string> outstanding_handlers_;
-};
-
-struct QueryHandlerRecord {
-  QueryHandlerRecord(fuchsia::modular::QueryHandlerPtr handler, std::string url)
-      : handler(std::move(handler)), url(std::move(url)) {}
-
-  fuchsia::modular::QueryHandlerPtr handler;
-  std::string url;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_QUERY_RUNNER_H_
diff --git a/bin/suggestion_engine/ranked_suggestion.cc b/bin/suggestion_engine/ranked_suggestion.cc
deleted file mode 100644
index 5c349b4..0000000
--- a/bin/suggestion_engine/ranked_suggestion.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranked_suggestion.h"
-
-namespace modular {
-
-std::unique_ptr<RankedSuggestion> RankedSuggestion::New(
-    SuggestionPrototype* prototype) {
-  std::unique_ptr<RankedSuggestion> ranked_suggestion =
-      std::make_unique<RankedSuggestion>();
-  ranked_suggestion->prototype = prototype;
-  ranked_suggestion->hidden = false;
-  ranked_suggestion->interrupting = false;
-  return ranked_suggestion;
-}
-
-fuchsia::modular::Suggestion CreateSuggestion(
-    const RankedSuggestion& suggestion_data) {
-  fuchsia::modular::Suggestion suggestion =
-      CreateSuggestion(*suggestion_data.prototype);
-  suggestion.confidence = suggestion_data.confidence;
-  return suggestion;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranked_suggestion.h b/bin/suggestion_engine/ranked_suggestion.h
deleted file mode 100644
index fe7ab87..0000000
--- a/bin/suggestion_engine/ranked_suggestion.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKED_SUGGESTION_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKED_SUGGESTION_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/suggestion_prototype.h"
-
-namespace modular {
-
-// |rank| and |adjusted_confidence| should satisfy the invariant that for any
-// sorted set of ranked suggestions, |rank| is increasing and
-// |adjusted_confidence| is nonincreasing.
-struct RankedSuggestion {
-  // Metadata of the suggestion.
-  SuggestionPrototype* prototype;
-
-  // Confidence of the suggestion. Updated during ranking.
-  double confidence;
-
-  // Whether or not the suggestion should be hidden (filtered by passive
-  // filters) in the list and not returned when fetching next suggestions.
-  bool hidden;
-
-  // Whether or not the suggesiton is currently being used as interruption. It
-  // should be filtered from the list that returns next suggestions.
-  bool interrupting;
-
-  static std::unique_ptr<RankedSuggestion> New(SuggestionPrototype* prototype);
-};
-
-fuchsia::modular::Suggestion CreateSuggestion(
-    const RankedSuggestion& suggestion_data);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKED_SUGGESTION_H_
diff --git a/bin/suggestion_engine/ranked_suggestions_list.cc b/bin/suggestion_engine/ranked_suggestions_list.cc
deleted file mode 100644
index b4d80be..0000000
--- a/bin/suggestion_engine/ranked_suggestions_list.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranked_suggestions_list.h"
-
-#include <algorithm>
-#include <string>
-
-#include <lib/context/cpp/context_helper.h>
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-MatchPredicate GetSuggestionMatcher(const std::string& component_url,
-                                    const std::string& proposal_id) {
-  return [component_url,
-          proposal_id](const std::unique_ptr<RankedSuggestion>& suggestion) {
-    return (suggestion->prototype->proposal.id == proposal_id) &&
-           (suggestion->prototype->source_url == component_url);
-  };
-}
-
-MatchPredicate GetSuggestionMatcher(const std::string& suggestion_id) {
-  return [suggestion_id](const std::unique_ptr<RankedSuggestion>& suggestion) {
-    return suggestion->prototype->suggestion_id == suggestion_id;
-  };
-}
-
-RankedSuggestionsList::RankedSuggestionsList() {}
-
-RankedSuggestionsList::~RankedSuggestionsList() = default;
-
-void RankedSuggestionsList::SetActiveFilters(
-    std::vector<std::unique_ptr<SuggestionActiveFilter>>&& active_filters) {
-  suggestion_active_filters_ = std::move(active_filters);
-}
-
-void RankedSuggestionsList::SetPassiveFilters(
-    std::vector<std::unique_ptr<SuggestionPassiveFilter>>&& passive_filters) {
-  suggestion_passive_filters_ = std::move(passive_filters);
-}
-
-void RankedSuggestionsList::SetRanker(std::unique_ptr<Ranker> ranker) {
-  ranker_ = std::move(ranker);
-}
-
-RankedSuggestion* RankedSuggestionsList::GetMatchingSuggestion(
-    MatchPredicate matchFunction) const {
-  auto findIter =
-      std::find_if(suggestions_.begin(), suggestions_.end(), matchFunction);
-  if (findIter != suggestions_.end()) {
-    return findIter->get();
-  }
-  return nullptr;
-}
-
-bool RankedSuggestionsList::RemoveMatchingSuggestion(
-    MatchPredicate matchFunction) {
-  auto remove_iter =
-      std::remove_if(suggestions_.begin(), suggestions_.end(), matchFunction);
-  if (remove_iter == suggestions_.end()) {
-    return false;
-  } else {
-    suggestions_.erase(remove_iter, suggestions_.end());
-    return true;
-  }
-}
-
-void RankedSuggestionsList::Rank(const fuchsia::modular::UserInput& query) {
-  if (!ranker_) {
-    FXL_LOG(WARNING)
-        << "RankedSuggestionList.Rank ignored since no ranker was set.";
-    return;
-  }
-  for (auto& suggestion : suggestions_) {
-    suggestion->confidence = ranker_->Rank(query, *suggestion);
-    FXL_VLOG(1) << "fuchsia::modular::Proposal "
-                << suggestion->prototype->proposal.display.headline
-                << " confidence " << suggestion->prototype->proposal.confidence
-                << " => " << suggestion->confidence;
-  }
-  DoStableSort();
-}
-
-void RankedSuggestionsList::AddSuggestion(SuggestionPrototype* prototype) {
-  suggestions_.push_back(RankedSuggestion::New(prototype));
-}
-
-void RankedSuggestionsList::AddSuggestion(
-    std::unique_ptr<RankedSuggestion> ranked_suggestion) {
-  suggestions_.push_back(std::move(ranked_suggestion));
-}
-
-bool RankedSuggestionsList::RemoveProposal(const std::string& component_url,
-                                           const std::string& proposal_id) {
-  return RemoveMatchingSuggestion(
-      GetSuggestionMatcher(component_url, proposal_id));
-}
-
-RankedSuggestion* RankedSuggestionsList::GetSuggestion(
-    const std::string& suggestion_id) const {
-  return GetMatchingSuggestion(GetSuggestionMatcher(suggestion_id));
-}
-
-RankedSuggestion* RankedSuggestionsList::GetSuggestion(
-    const std::string& component_url, const std::string& proposal_id) const {
-  return GetMatchingSuggestion(
-      GetSuggestionMatcher(component_url, proposal_id));
-}
-
-void RankedSuggestionsList::RemoveAllSuggestions() { suggestions_.clear(); }
-
-void RankedSuggestionsList::Refresh(const fuchsia::modular::UserInput& query) {
-  // Apply the active filters that modify the entire suggestions list.
-  // TODO(miguelfrde): Fix. Currently not WAI. For dead stories for example,
-  // this will remove suggestions that belong to a story that is being created.
-  for (const auto& active_filter : suggestion_active_filters_) {
-    active_filter->Filter(&suggestions_);
-  }
-
-  // Apply the passive filters that hide some of the suggestions.
-  for (auto& suggestion : suggestions_) {
-    suggestion->hidden = std::any_of(
-        suggestion_passive_filters_.begin(), suggestion_passive_filters_.end(),
-        [&suggestion](const std::unique_ptr<SuggestionPassiveFilter>& f) {
-          return f->Filter(suggestion);
-        });
-  }
-
-  // Rerank and sort the updated suggestions_ list
-  Rank(query);
-}
-
-// Start of private sorting methods.
-
-void RankedSuggestionsList::DoStableSort() {
-  std::stable_sort(suggestions_.begin(), suggestions_.end(),
-                   [](const std::unique_ptr<RankedSuggestion>& a,
-                      const std::unique_ptr<RankedSuggestion>& b) {
-                     return a->confidence > b->confidence;
-                   });
-}
-
-// End of private sorting methods.
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranked_suggestions_list.h b/bin/suggestion_engine/ranked_suggestions_list.h
deleted file mode 100644
index d48923e..0000000
--- a/bin/suggestion_engine/ranked_suggestions_list.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKED_SUGGESTIONS_LIST_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKED_SUGGESTIONS_LIST_H_
-
-#include <functional>
-#include <queue>
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/filters/suggestion_active_filter.h"
-#include "peridot/bin/suggestion_engine/filters/suggestion_passive_filter.h"
-#include "peridot/bin/suggestion_engine/rankers/ranker.h"
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-#include "peridot/bin/suggestion_engine/suggestion_prototype.h"
-
-namespace modular {
-using MatchPredicate =
-    std::function<bool(const std::unique_ptr<RankedSuggestion>& suggestion)>;
-
-// Stores a list of RankedSuggestion objects and the features by which they
-// should be ranked.  Ranking must be explicitly triggered via the Rank
-// method.
-class RankedSuggestionsList {
- public:
-  RankedSuggestionsList();
-  ~RankedSuggestionsList();
-
-  void SetRanker(std::unique_ptr<Ranker> ranker);
-
-  void SetActiveFilters(
-      std::vector<std::unique_ptr<SuggestionActiveFilter>>&& active_filters);
-
-  void SetPassiveFilters(
-      std::vector<std::unique_ptr<SuggestionPassiveFilter>>&& passive_filters);
-
-  void AddSuggestion(SuggestionPrototype* const prototype);
-
-  void AddSuggestion(std::unique_ptr<RankedSuggestion> ranked_suggestion);
-
-  // Returns |true| if and only if the suggestion was present and is removed.
-  bool RemoveProposal(const std::string& component_url,
-                      const std::string& proposal_id);
-
-  void RemoveAllSuggestions();
-
-  RankedSuggestion* GetSuggestion(const std::string& suggestion_id) const;
-
-  RankedSuggestion* GetSuggestion(const std::string& component_url,
-                                  const std::string& proposal_id) const;
-
-  const std::vector<std::unique_ptr<RankedSuggestion>>& Get() const {
-    return suggestions_;
-  }
-
-  void Refresh(
-      const fuchsia::modular::UserInput& query = fuchsia::modular::UserInput());
-
- private:
-  RankedSuggestion* GetMatchingSuggestion(MatchPredicate matchFunction) const;
-  bool RemoveMatchingSuggestion(MatchPredicate matchFunction);
-  void DoStableSort();
-  void Rank(
-      const fuchsia::modular::UserInput& query = fuchsia::modular::UserInput());
-
-  // The sorted vector of RankedSuggestions, sorted by
-  // |ranking_function_|. The vector is re-sorted whenever its
-  // contents are modified or when |ranking_function_| is updated.
-  // TODO(jwnichols): Should ranking happen automatically or specifically
-  // when requested?  I think I would lean toward the latter, since ranking
-  // may be expensive.
-  std::vector<std::unique_ptr<RankedSuggestion>> suggestions_;
-
-  std::unique_ptr<Ranker> ranker_;
-
-  // The fuchsia::modular::Suggestion Filters associated with this List of
-  // Ranked Suggestions
-  std::vector<std::unique_ptr<SuggestionActiveFilter>>
-      suggestion_active_filters_;
-  std::vector<std::unique_ptr<SuggestionPassiveFilter>>
-      suggestion_passive_filters_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKED_SUGGESTIONS_LIST_H_
diff --git a/bin/suggestion_engine/rankers/BUILD.gn b/bin/suggestion_engine/rankers/BUILD.gn
deleted file mode 100644
index f84d05b..0000000
--- a/bin/suggestion_engine/rankers/BUILD.gn
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-group("all") {
-  public_deps = [
-    ":linear_ranker",
-    ":ranker",
-  ]
-}
-
-source_set("ranker") {
-  sources = [
-    "ranker.cc",
-    "ranker.h",
-  ]
-
-  deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  public_deps = [
-    "//peridot/bin/suggestion_engine:models",
-  ]
-}
-
-source_set("linear_ranker") {
-  sources = [
-    "linear_ranker.cc",
-    "linear_ranker.h",
-  ]
-
-  deps = [
-    ":ranker",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  public_deps = [
-    "//peridot/bin/suggestion_engine/ranking_features:ranking_feature",
-  ]
-}
-
-executable("linear_ranker_unittest") {
-  testonly = true
-
-  sources = [
-    "linear_ranker_unittest.cc",
-  ]
-
-  deps = [
-    ":linear_ranker",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/suggestion_engine/rankers/linear_ranker.cc b/bin/suggestion_engine/rankers/linear_ranker.cc
deleted file mode 100644
index e856702..0000000
--- a/bin/suggestion_engine/rankers/linear_ranker.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/rankers/linear_ranker.h"
-
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-LinearRanker::LinearRanker() : normalization_factor_(0.0) {}
-
-LinearRanker::~LinearRanker() = default;
-
-void LinearRanker::AddRankingFeature(
-    double weight, std::shared_ptr<RankingFeature> ranking_feature) {
-  ranking_features_.emplace_back(weight, ranking_feature);
-  // Only incorporate positive weights into the normalization factor.
-  if (weight > 0.0) {
-    normalization_factor_ += weight;
-  }
-}
-
-double LinearRanker::Rank(const fuchsia::modular::UserInput& query,
-                          const RankedSuggestion& suggestion) {
-  double confidence = 0.0;
-  for (auto& feature : ranking_features_) {
-    confidence +=
-        feature.first * feature.second->ComputeFeature(query, suggestion);
-  }
-  // TODO(jwnichols): Reconsider this normalization approach.
-  // Weights may be negative, so there is some chance that the calculated
-  // confidence score will be negative.  We pull the calculated score up to
-  // zero to guarantee final confidence values stay within the 0-1 range.
-  FXL_CHECK(normalization_factor_ > 0.0);
-  return std::max(confidence, 0.0) / normalization_factor_;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/rankers/linear_ranker.h b/bin/suggestion_engine/rankers/linear_ranker.h
deleted file mode 100644
index fbc4f3c..0000000
--- a/bin/suggestion_engine/rankers/linear_ranker.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKERS_LINEAR_RANKER_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKERS_LINEAR_RANKER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/ranked_suggestion.h"
-#include "peridot/bin/suggestion_engine/rankers/ranker.h"
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-// Ranks based on a linear combination using the set ranking features and its
-// weights.
-// Rank(q, x) =
-class LinearRanker : public Ranker {
- public:
-  LinearRanker();
-  ~LinearRanker() override;
-
-  // Computes the new confidence of the suggestion.
-  // Rank(q, s) = w_1*f_1(q, s) + w_2*f_2(q, s) + ... + w_i*f_i(q, s) where
-  // f_i is a ranking feature and w_i is its weight provided through
-  // AddRankingFeature.
-  // The data from |query| and |suggestion| needed depends on the data each
-  // ranking feature needs.
-  double Rank(const fuchsia::modular::UserInput& query,
-              const RankedSuggestion& suggestion) override;
-
-  // Sets a ranking feature and associates it to the given weight for the linear
-  // combination.
-  void AddRankingFeature(double weight,
-                         std::shared_ptr<RankingFeature> ranking_feature);
-
- private:
-  // Ranking features as a list of (weight, feature) pairs
-  std::vector<std::pair<double, std::shared_ptr<RankingFeature>>>
-      ranking_features_;
-
-  // The sum of the weights stored in the ranking_features_ vector
-  double normalization_factor_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKERS_LINEAR_RANKER_H_
diff --git a/bin/suggestion_engine/rankers/linear_ranker_unittest.cc b/bin/suggestion_engine/rankers/linear_ranker_unittest.cc
deleted file mode 100644
index d0e3699..0000000
--- a/bin/suggestion_engine/rankers/linear_ranker_unittest.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/rankers/linear_ranker.h"
-
-#include "gtest/gtest.h"
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-namespace {
-
-class ConstantRankingFeature : public RankingFeature {
- public:
-  ConstantRankingFeature(double value) : value_(value) {}
-
- private:
-  double ComputeFeatureInternal(const fuchsia::modular::UserInput& query,
-                                const RankedSuggestion& suggestion) override {
-    return value_;
-  };
-
-  double value_;
-};
-
-class LinearRankerTest : public ::testing::Test {
- protected:
-  fuchsia::modular::UserInput query_;
-  RankedSuggestion suggestion_;
-  LinearRanker ranker_;
-};
-
-TEST_F(LinearRankerTest, Rank) {
-  // Performs a simple ranking operation with all positive values.
-  // Operation: (1*1 + 4*0.5)/(1 + 4) = 0.6
-  ranker_.AddRankingFeature(1, std::make_shared<ConstantRankingFeature>(1.0));
-  ranker_.AddRankingFeature(4, std::make_shared<ConstantRankingFeature>(0.5));
-  EXPECT_EQ(ranker_.Rank(query_, suggestion_), 0.6);
-}
-
-TEST_F(LinearRankerTest, RankIgnoreNegativeWeigthsForNormalization) {
-  // Checks that negative weights are ignored for the normalization factor.
-  // Operation: (4*0.5 - 1*1) / 4;
-  ranker_.AddRankingFeature(4, std::make_shared<ConstantRankingFeature>(0.5));
-  ranker_.AddRankingFeature(-1, std::make_shared<ConstantRankingFeature>(1.0));
-  EXPECT_EQ(ranker_.Rank(query_, suggestion_), 0.25);
-}
-
-TEST_F(LinearRankerTest, RankZeroIfNegative) {
-  // Makes the linear combination of ranking features and weights zero if it is
-  // less than zero.
-  // Operation: (-1*0.5 + 2*0.1)/2 = -0.3 => 0
-  ranker_.AddRankingFeature(-1, std::make_shared<ConstantRankingFeature>(0.5));
-  ranker_.AddRankingFeature(2, std::make_shared<ConstantRankingFeature>(0.1));
-  EXPECT_EQ(ranker_.Rank(query_, suggestion_), 0.0);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/rankers/ranker.cc b/bin/suggestion_engine/rankers/ranker.cc
deleted file mode 100644
index 10bf09c..0000000
--- a/bin/suggestion_engine/rankers/ranker.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/rankers/ranker.h"
-
-namespace modular {
-
-Ranker::Ranker() = default;
-
-Ranker::~Ranker() = default;
-
-double Ranker::Rank(const RankedSuggestion& suggestion) {
-  return Rank(fuchsia::modular::UserInput(), suggestion);
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/rankers/ranker.h b/bin/suggestion_engine/rankers/ranker.h
deleted file mode 100644
index 64f2a65..0000000
--- a/bin/suggestion_engine/rankers/ranker.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKERS_RANKER_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKERS_RANKER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/ranked_suggestion.h"
-
-namespace modular {
-
-// Base class for performing ranking on a suggestion.
-class Ranker {
- public:
-  Ranker();
-  virtual ~Ranker();
-
-  // Ranks a suggestion based on a given query (which might be empty) and
-  // returns the confidence that would be the new suggestion.confidence.
-  virtual double Rank(const fuchsia::modular::UserInput& query,
-                      const RankedSuggestion& suggestion) = 0;
-
-  // Ranks a suggestion without any query input.
-  double Rank(const RankedSuggestion& suggestion);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKERS_RANKER_H_
diff --git a/bin/suggestion_engine/ranking_features/BUILD.gn b/bin/suggestion_engine/ranking_features/BUILD.gn
deleted file mode 100644
index 130d50f..0000000
--- a/bin/suggestion_engine/ranking_features/BUILD.gn
+++ /dev/null
@@ -1,253 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-group("all") {
-  public_deps = [
-    ":affinity_ranking_feature",
-    ":annoyance_ranking_feature",
-    ":dead_story_ranking_feature",
-    ":interrupting_ranking_feature",
-    ":kronk_ranking_feature",
-    ":mod_pair_ranking_feature",
-    ":proposal_hint_ranking_feature",
-    ":query_match_ranking_feature",
-    ":ranking_feature",
-  ]
-}
-
-source_set("ranking_feature") {
-  sources = [
-    "ranking_feature.cc",
-    "ranking_feature.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-  ]
-
-  public_deps = [
-    "//peridot/bin/suggestion_engine:models",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//third_party/rapidjson",
-  ]
-}
-
-source_set("annoyance_ranking_feature") {
-  sources = [
-    "annoyance_ranking_feature.cc",
-    "annoyance_ranking_feature.h",
-  ]
-
-  public_deps = [
-    ":ranking_feature",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-executable("annoyance_ranking_feature_unittest") {
-  testonly = true
-
-  sources = [
-    "annoyance_ranking_feature_unittest.cc",
-  ]
-
-  deps = [
-    ":annoyance_ranking_feature",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("affinity_ranking_feature") {
-  sources = [
-    "affinity_ranking_feature.cc",
-    "affinity_ranking_feature.h",
-  ]
-
-  public_deps = [
-    ":ranking_feature",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-executable("affinity_ranking_feature_unittest") {
-  testonly = true
-
-  sources = [
-    "affinity_ranking_feature_unittest.cc",
-  ]
-
-  deps = [
-    ":affinity_ranking_feature",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("interrupting_ranking_feature") {
-  sources = [
-    "interrupting_ranking_feature.cc",
-    "interrupting_ranking_feature.h",
-  ]
-
-  public_deps = [
-    ":ranking_feature",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-executable("interrupting_ranking_feature_unittest") {
-  testonly = true
-
-  sources = [
-    "interrupting_ranking_feature_unittest.cc",
-  ]
-
-  deps = [
-    ":interrupting_ranking_feature",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("kronk_ranking_feature") {
-  sources = [
-    "kronk_ranking_feature.cc",
-    "kronk_ranking_feature.h",
-  ]
-
-  public_deps = [
-    ":ranking_feature",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-executable("kronk_ranking_feature_unittest") {
-  testonly = true
-
-  sources = [
-    "kronk_ranking_feature_unittest.cc",
-  ]
-
-  deps = [
-    ":kronk_ranking_feature",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("mod_pair_ranking_feature") {
-  sources = [
-    "mod_pair_ranking_feature.cc",
-    "mod_pair_ranking_feature.h",
-  ]
-
-  public_deps = [
-    ":ranking_feature",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/public/lib/context/cpp:context_helper",
-    "//third_party/rapidjson",
-  ]
-}
-
-executable("mod_pair_ranking_feature_unittest") {
-  testonly = true
-
-  sources = [
-    "mod_pair_ranking_feature_unittest.cc",
-  ]
-
-  deps = [
-    ":mod_pair_ranking_feature",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("proposal_hint_ranking_feature") {
-  sources = [
-    "proposal_hint_ranking_feature.cc",
-    "proposal_hint_ranking_feature.h",
-  ]
-
-  public_deps = [
-    ":ranking_feature",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-executable("proposal_hint_ranking_feature_unittest") {
-  testonly = true
-
-  sources = [
-    "proposal_hint_ranking_feature_unittest.cc",
-  ]
-
-  deps = [
-    ":proposal_hint_ranking_feature",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("query_match_ranking_feature") {
-  sources = [
-    "query_match_ranking_feature.cc",
-    "query_match_ranking_feature.h",
-  ]
-
-  public_deps = [
-    ":ranking_feature",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-executable("query_match_ranking_feature_unittest") {
-  testonly = true
-
-  sources = [
-    "query_match_ranking_feature_unittest.cc",
-  ]
-
-  deps = [
-    ":query_match_ranking_feature",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-source_set("dead_story_ranking_feature") {
-  sources = [
-    "dead_story_ranking_feature.cc",
-    "dead_story_ranking_feature.h",
-  ]
-
-  public_deps = [
-    ":ranking_feature",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-executable("dead_story_ranking_feature_unittest") {
-  testonly = true
-
-  sources = [
-    "dead_story_ranking_feature_unittest.cc",
-  ]
-
-  deps = [
-    ":dead_story_ranking_feature",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/bin/suggestion_engine/ranking_features/affinity_ranking_feature.cc b/bin/suggestion_engine/ranking_features/affinity_ranking_feature.cc
deleted file mode 100644
index 4b26092..0000000
--- a/bin/suggestion_engine/ranking_features/affinity_ranking_feature.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/affinity_ranking_feature.h"
-
-#include <lib/fsl/types/type_converters.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/join_strings.h>
-#include <lib/fxl/type_converter.h>
-
-namespace modular {
-
-namespace {
-
-bool MatchesMod(const fuchsia::modular::ModuleAffinity& affinity,
-                const std::vector<std::string>& mod_path,
-                const std::string& affinity_story) {
-  // If the stories are not the same return early.
-  if (affinity.story_name != affinity_story) {
-    return false;
-  }
-
-  // Since module_paths are composed using the name of the parent view (note
-  // this is how it's working today, but not how it should be expected to work.
-  // Module names are opaque identifiers we shouldn't rely on for this kind of
-  // logic), we compare the one in focused with the affinity we are interested.
-  // Exmaple:
-  //  - In focus: a/b/c
-  //  - Affinity: a/b
-  // Since the name is the same up to a/b, then we have higher confidence.
-  // TODO(miguelfrde): rather than using this in a boolean fashion, return a
-  // meaningful confidence that represents this behavior and supports cases such
-  // as a/b/c vs a/d. For the case above it could be 0.66 and for the case of
-  // a/d 0.33.
-  for (uint32_t i = 0; i < mod_path.size(); i++) {
-    if (i >= affinity.module_name.size()) {
-      break;
-    }
-    if (mod_path.at(i) != affinity.module_name.at(i)) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-}  // namespace
-
-AffinityRankingFeature::AffinityRankingFeature() {}
-
-AffinityRankingFeature::~AffinityRankingFeature() = default;
-
-double AffinityRankingFeature::ComputeFeatureInternal(
-    const fuchsia::modular::UserInput& query,
-    const RankedSuggestion& suggestion) {
-  const auto& proposal = suggestion.prototype->proposal;
-  if (proposal.affinity.empty()) {
-    return kMaxConfidence;
-  }
-  for (const auto& context_value : *ContextValues()) {
-    const auto& affinity_story_id = context_value.meta.story->id;
-    for (const auto& affinity : proposal.affinity) {
-      if (affinity.is_story_affinity() &&
-          affinity_story_id == affinity.story_affinity().story_name) {
-        return kMaxConfidence;
-      }
-      if (affinity.is_module_affinity() &&
-          MatchesMod(affinity.module_affinity(), context_value.meta.mod->path,
-                     affinity_story_id)) {
-        return kMaxConfidence;
-      }
-    }
-  }
-  return kMinConfidence;
-}
-
-fuchsia::modular::ContextSelectorPtr
-AffinityRankingFeature::CreateContextSelectorInternal() {
-  // Get currently focused mod and in focused story.
-  auto selector = fuchsia::modular::ContextSelector::New();
-  selector->type = fuchsia::modular::ContextValueType::MODULE;
-  selector->meta = fuchsia::modular::ContextMetadata::New();
-  selector->meta->story = fuchsia::modular::StoryMetadata::New();
-  selector->meta->story->focused = fuchsia::modular::FocusedState::New();
-  selector->meta->story->focused->state =
-      fuchsia::modular::FocusedStateState::FOCUSED;
-  selector->meta->mod = fuchsia::modular::ModuleMetadata::New();
-  selector->meta->mod->focused = fuchsia::modular::FocusedState::New();
-  selector->meta->mod->focused->state =
-      fuchsia::modular::FocusedStateState::FOCUSED;
-  return selector;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/affinity_ranking_feature.h b/bin/suggestion_engine/ranking_features/affinity_ranking_feature.h
deleted file mode 100644
index 90fc0e4..0000000
--- a/bin/suggestion_engine/ranking_features/affinity_ranking_feature.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_AFFINITY_RANKING_FEATURE_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_AFFINITY_RANKING_FEATURE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-class AffinityRankingFeature : public RankingFeature {
- public:
-  AffinityRankingFeature();
-  ~AffinityRankingFeature() override;
-
- private:
-  double ComputeFeatureInternal(const fuchsia::modular::UserInput& query,
-                                const RankedSuggestion& suggestion) override;
-
-  fuchsia::modular::ContextSelectorPtr CreateContextSelectorInternal() override;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_AFFINITY_RANKING_FEATURE_H_
diff --git a/bin/suggestion_engine/ranking_features/affinity_ranking_feature_unittest.cc b/bin/suggestion_engine/ranking_features/affinity_ranking_feature_unittest.cc
deleted file mode 100644
index e6978cc..0000000
--- a/bin/suggestion_engine/ranking_features/affinity_ranking_feature_unittest.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/affinity_ranking_feature.h"
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-class AffinityRankingFeatureTest : public ::testing::Test {
- protected:
-  AffinityRankingFeature affinity_feature;
-  fuchsia::modular::UserInput query;
-};
-
-// Creates the values from a context query to mock the modules in a focused
-// story based on which this ranking feature computes its value.
-void SetStoryAffinityContextUpdate(
-    fidl::VectorPtr<fuchsia::modular::ContextValue>& context_update,
-    const std::string& story_id) {
-  fuchsia::modular::ContextValue value;
-  value.meta.story = fuchsia::modular::StoryMetadata::New();
-  value.meta.story->id = story_id;
-  context_update.push_back(std::move(value));
-}
-
-void SetModuleAffinityContextUpdate(
-    fidl::VectorPtr<fuchsia::modular::ContextValue>& context_update,
-    const std::string& story_id, std::vector<std::string> mod_path) {
-  fuchsia::modular::ContextValue value;
-  value.meta.story = fuchsia::modular::StoryMetadata::New();
-  value.meta.story->id = story_id;
-  value.meta.mod = fuchsia::modular::ModuleMetadata::New();
-  value.meta.mod->focused = fuchsia::modular::FocusedState::New();
-  value.meta.mod->focused->state = fuchsia::modular::FocusedStateState::FOCUSED;
-  for (auto& mod_path_part : mod_path) {
-    value.meta.mod->path.push_back(mod_path_part);
-  }
-  context_update.push_back(std::move(value));
-}
-
-SuggestionPrototype BuildSuggestionPrototype() {
-  fuchsia::modular::Proposal proposal;
-  SuggestionPrototype prototype;
-  prototype.source_url = "fake_url";
-  prototype.proposal = std::move(proposal);
-  return prototype;
-}
-
-SuggestionPrototype BuildSuggestionPrototypeWithStoryAffinity(
-    std::string story_name) {
-  auto prototype = BuildSuggestionPrototype();
-  auto& proposal = prototype.proposal;
-  fuchsia::modular::StoryAffinity story_affinity;
-  story_affinity.story_name = story_name;
-  fuchsia::modular::ProposalAffinity affinity;
-  affinity.set_story_affinity(std::move(story_affinity));
-  proposal.affinity.push_back(std::move(affinity));
-  return prototype;
-}
-
-SuggestionPrototype BuildSuggestionPrototypeWithModuleAffinity(
-    std::string story_name, std::string mod_name) {
-  auto prototype = BuildSuggestionPrototype();
-  auto& proposal = prototype.proposal;
-  fuchsia::modular::ModuleAffinity module_affinity;
-  module_affinity.story_name = story_name;
-  module_affinity.module_name.push_back(mod_name);
-  fuchsia::modular::ProposalAffinity affinity;
-  affinity.set_module_affinity(std::move(module_affinity));
-  proposal.affinity.push_back(std::move(affinity));
-  return prototype;
-}
-
-TEST_F(AffinityRankingFeatureTest, ComputeFeatureStoryAffinity) {
-  auto prototype = BuildSuggestionPrototypeWithStoryAffinity("affinity");
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  SetStoryAffinityContextUpdate(context_update, "affinity");
-  affinity_feature.UpdateContext(context_update);
-
-  double value = affinity_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 1.0);
-}
-
-TEST_F(AffinityRankingFeatureTest, ComputeFeatureNonAffinity) {
-  auto prototype = BuildSuggestionPrototypeWithStoryAffinity("other_story");
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  SetStoryAffinityContextUpdate(context_update, "affinity");
-  affinity_feature.UpdateContext(context_update);
-
-  double value = affinity_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 0.0);
-}
-
-TEST_F(AffinityRankingFeatureTest, ComputeFeatureNonAffinityNoStoryAffinity) {
-  auto prototype = BuildSuggestionPrototype();
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  SetStoryAffinityContextUpdate(context_update, "affinity");
-  affinity_feature.UpdateContext(context_update);
-
-  double value = affinity_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 1.0);
-}
-
-TEST_F(AffinityRankingFeatureTest, ComputeFeatureModAffinity) {
-  auto prototype =
-      BuildSuggestionPrototypeWithModuleAffinity("affinity", "mod_a");
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  SetModuleAffinityContextUpdate(context_update, "affinity", {"mod_a"});
-  affinity_feature.UpdateContext(context_update);
-
-  double value = affinity_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 1.0);
-}
-
-TEST_F(AffinityRankingFeatureTest, ComputeFeatureModNonAffinity) {
-  auto prototype =
-      BuildSuggestionPrototypeWithModuleAffinity("affinity", "mod_a");
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  SetModuleAffinityContextUpdate(context_update, "affinity", {"other_mod"});
-  affinity_feature.UpdateContext(context_update);
-
-  double value = affinity_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 0.0);
-}
-
-TEST_F(AffinityRankingFeatureTest, ComputeFeatureParentModAffinity) {
-  // TODO(miguelfrde): instead of returning 1.0 we should update this to return
-  // 0.5. There's a relevant note in the implementation.
-  auto prototype =
-      BuildSuggestionPrototypeWithModuleAffinity("affinity", "mod_a");
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  SetModuleAffinityContextUpdate(context_update, "affinity",
-                                 {"mod_a", "mod_b"});
-  affinity_feature.UpdateContext(context_update);
-
-  double value = affinity_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 1.0);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/annoyance_ranking_feature.cc b/bin/suggestion_engine/ranking_features/annoyance_ranking_feature.cc
deleted file mode 100644
index 57c3664..0000000
--- a/bin/suggestion_engine/ranking_features/annoyance_ranking_feature.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/annoyance_ranking_feature.h"
-
-namespace modular {
-
-AnnoyanceRankingFeature::AnnoyanceRankingFeature() = default;
-
-AnnoyanceRankingFeature::~AnnoyanceRankingFeature() = default;
-
-double AnnoyanceRankingFeature::ComputeFeatureInternal(
-    const fuchsia::modular::UserInput& query,
-    const RankedSuggestion& suggestion) {
-  if (suggestion.prototype->proposal.display.annoyance !=
-      fuchsia::modular::AnnoyanceType::NONE) {
-    return kMaxConfidence;
-  }
-  return kMinConfidence;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/annoyance_ranking_feature.h b/bin/suggestion_engine/ranking_features/annoyance_ranking_feature.h
deleted file mode 100644
index 8898990..0000000
--- a/bin/suggestion_engine/ranking_features/annoyance_ranking_feature.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_ANNOYANCE_RANKING_FEATURE_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_ANNOYANCE_RANKING_FEATURE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-class AnnoyanceRankingFeature : public RankingFeature {
- public:
-  AnnoyanceRankingFeature();
-  ~AnnoyanceRankingFeature() override;
-
- private:
-  double ComputeFeatureInternal(const fuchsia::modular::UserInput& query,
-                                const RankedSuggestion& suggestion) override;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_ANNOYANCE_RANKING_FEATURE_H_
diff --git a/bin/suggestion_engine/ranking_features/annoyance_ranking_feature_unittest.cc b/bin/suggestion_engine/ranking_features/annoyance_ranking_feature_unittest.cc
deleted file mode 100644
index 39bc471..0000000
--- a/bin/suggestion_engine/ranking_features/annoyance_ranking_feature_unittest.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/annoyance_ranking_feature.h"
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-class AnnoyanceRankingFeatureTest : public ::testing::Test {
- protected:
-  RankedSuggestion GetSuggestion(fuchsia::modular::AnnoyanceType annoyance) {
-    fuchsia::modular::SuggestionDisplay display;
-    display.annoyance = annoyance;
-    fuchsia::modular::Proposal proposal;
-    proposal.display = std::move(display);
-    SuggestionPrototype prototype;
-    prototype.proposal = std::move(proposal);
-    RankedSuggestion suggestion;
-    suggestion.prototype = &prototype;
-    return suggestion;
-  }
-  AnnoyanceRankingFeature annoyance_ranking_feature;
-  fuchsia::modular::UserInput query;
-};
-
-TEST_F(AnnoyanceRankingFeatureTest, ComputeFeatureAnnoyance) {
-  auto suggestion = GetSuggestion(fuchsia::modular::AnnoyanceType::INTERRUPT);
-  double value = annoyance_ranking_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, kMaxConfidence);
-}
-
-TEST_F(AnnoyanceRankingFeatureTest, ComputeFeatureNonAnnoyance) {
-  auto suggestion = GetSuggestion(fuchsia::modular::AnnoyanceType::NONE);
-  double value = annoyance_ranking_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, kMinConfidence);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/dead_story_ranking_feature.cc b/bin/suggestion_engine/ranking_features/dead_story_ranking_feature.cc
deleted file mode 100644
index fcd99a7..0000000
--- a/bin/suggestion_engine/ranking_features/dead_story_ranking_feature.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/dead_story_ranking_feature.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-namespace modular {
-
-DeadStoryRankingFeature::DeadStoryRankingFeature() {}
-
-DeadStoryRankingFeature::~DeadStoryRankingFeature() = default;
-
-double DeadStoryRankingFeature::ComputeFeatureInternal(
-    const fuchsia::modular::UserInput& query,
-    const RankedSuggestion& ranked_suggestion) {
-  const auto& proposal = ranked_suggestion.prototype->proposal;
-
-  // Proposal not tied to any story.
-  if (proposal.affinity.empty()) {
-    return kMinConfidence;
-  }
-
-  // TODO(miguelfrde): cache ids of stories in context in an unordered_set for
-  // average O(1) lookup.
-  for (const auto& context_value : *ContextValues()) {
-    const auto& story_name = context_value.meta.story->id;
-    for (const auto& affinity : proposal.affinity) {
-      switch (affinity.Which()) {
-        case fuchsia::modular::ProposalAffinity::Tag::kModuleAffinity:
-          if (story_name == affinity.module_affinity().story_name) {
-            return kMinConfidence;
-          }
-          break;
-        case fuchsia::modular::ProposalAffinity::Tag::kStoryAffinity:
-          if (story_name == affinity.story_affinity().story_name) {
-            return kMinConfidence;
-          }
-          break;
-        default:
-          break;
-      }
-    }
-  }
-  return kMaxConfidence;
-}
-
-fuchsia::modular::ContextSelectorPtr
-DeadStoryRankingFeature::CreateContextSelectorInternal() {
-  // Get stories in context.
-  auto selector = fuchsia::modular::ContextSelector::New();
-  selector->type = fuchsia::modular::ContextValueType::STORY;
-  return selector;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/dead_story_ranking_feature.h b/bin/suggestion_engine/ranking_features/dead_story_ranking_feature.h
deleted file mode 100644
index 0a58171..0000000
--- a/bin/suggestion_engine/ranking_features/dead_story_ranking_feature.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_DEAD_STORY_RANKING_FEATURE_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_DEAD_STORY_RANKING_FEATURE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-class DeadStoryRankingFeature : public RankingFeature {
- public:
-  DeadStoryRankingFeature();
-  ~DeadStoryRankingFeature() override;
-
- private:
-  double ComputeFeatureInternal(
-      const fuchsia::modular::UserInput& query,
-      const RankedSuggestion& ranked_suggestion) override;
-
-  fuchsia::modular::ContextSelectorPtr CreateContextSelectorInternal() override;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_DEAD_STORY_RANKING_FEATURE_H_
diff --git a/bin/suggestion_engine/ranking_features/dead_story_ranking_feature_unittest.cc b/bin/suggestion_engine/ranking_features/dead_story_ranking_feature_unittest.cc
deleted file mode 100644
index cbb1d94..0000000
--- a/bin/suggestion_engine/ranking_features/dead_story_ranking_feature_unittest.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/dead_story_ranking_feature.h"
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-class DeadStoryRankingFeatureTest : public ::testing::Test {
- protected:
-  fuchsia::modular::UserInput query;
-  DeadStoryRankingFeature dead_story_feature;
-};
-
-// Creates the values from a context query to mock the modules in a focused
-// story based on which this ranking feature computes its value.
-void SetRunningStoryContextUpdate(
-    fidl::VectorPtr<fuchsia::modular::ContextValue>& context_update) {
-  fuchsia::modular::ContextValue value;
-  value.meta.story = fuchsia::modular::StoryMetadata::New();
-  value.meta.story->id = "running_story";
-  context_update.push_back(std::move(value));
-}
-
-SuggestionPrototype BuildSuggestionPrototype(std::string story_name,
-                                             bool has_story_affinity) {
-  fuchsia::modular::Proposal proposal;
-  if (has_story_affinity) {
-    fuchsia::modular::StoryAffinity story_affinity;
-    story_affinity.story_name = story_name;
-    fuchsia::modular::ProposalAffinity affinity;
-    affinity.set_story_affinity(std::move(story_affinity));
-    proposal.affinity.push_back(std::move(affinity));
-  }
-  SuggestionPrototype prototype;
-  prototype.source_url = "fake_url";
-  prototype.proposal = std::move(proposal);
-  return prototype;
-}
-
-TEST_F(DeadStoryRankingFeatureTest, RunningStoryAndAffinity) {
-  auto prototype = BuildSuggestionPrototype("running_story", true);
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  SetRunningStoryContextUpdate(context_update);
-  dead_story_feature.UpdateContext(context_update);
-  double value = dead_story_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 0.0);
-}
-
-TEST_F(DeadStoryRankingFeatureTest, RunningButNoAffinity) {
-  auto prototype = BuildSuggestionPrototype("running_story", false);
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  SetRunningStoryContextUpdate(context_update);
-  dead_story_feature.UpdateContext(context_update);
-  double value = dead_story_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 0.0);
-}
-
-TEST_F(DeadStoryRankingFeatureTest, NotRunningAndNoAffinity) {
-  auto prototype = BuildSuggestionPrototype("dead_story", false);
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  SetRunningStoryContextUpdate(context_update);
-  dead_story_feature.UpdateContext(context_update);
-  double value = dead_story_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 0.0);
-}
-
-TEST_F(DeadStoryRankingFeatureTest, NotRunningStoryAndAffinity) {
-  auto prototype = BuildSuggestionPrototype("dead_story", true);
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  SetRunningStoryContextUpdate(context_update);
-  dead_story_feature.UpdateContext(context_update);
-  double value = dead_story_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 1.0);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/interrupting_ranking_feature.cc b/bin/suggestion_engine/ranking_features/interrupting_ranking_feature.cc
deleted file mode 100644
index 2aedf41..0000000
--- a/bin/suggestion_engine/ranking_features/interrupting_ranking_feature.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/interrupting_ranking_feature.h"
-
-namespace modular {
-
-InterruptingRankingFeature::InterruptingRankingFeature() {}
-
-InterruptingRankingFeature::~InterruptingRankingFeature() = default;
-
-double InterruptingRankingFeature::ComputeFeatureInternal(
-    const fuchsia::modular::UserInput& query,
-    const RankedSuggestion& ranked_suggestion) {
-  if (ranked_suggestion.interrupting) {
-    return kMaxConfidence;
-  }
-  return kMinConfidence;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/interrupting_ranking_feature.h b/bin/suggestion_engine/ranking_features/interrupting_ranking_feature.h
deleted file mode 100644
index 7509ea9..0000000
--- a/bin/suggestion_engine/ranking_features/interrupting_ranking_feature.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_INTERRUPTING_RANKING_FEATURE_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_INTERRUPTING_RANKING_FEATURE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-class InterruptingRankingFeature : public RankingFeature {
- public:
-  InterruptingRankingFeature();
-  ~InterruptingRankingFeature() override;
-
- private:
-  double ComputeFeatureInternal(const fuchsia::modular::UserInput& query,
-                                const RankedSuggestion& suggestion) override;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_INTERRUPTING_RANKING_FEATURE_H_
diff --git a/bin/suggestion_engine/ranking_features/interrupting_ranking_feature_unittest.cc b/bin/suggestion_engine/ranking_features/interrupting_ranking_feature_unittest.cc
deleted file mode 100644
index 7b8a926..0000000
--- a/bin/suggestion_engine/ranking_features/interrupting_ranking_feature_unittest.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/interrupting_ranking_feature.h"
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-class InterruptingRankingFeatureTest : public ::testing::Test {
- protected:
-  InterruptingRankingFeature ranking_feature;
-  fuchsia::modular::UserInput query;
-};
-
-TEST_F(InterruptingRankingFeatureTest, ComputeFeatureInterrupting) {
-  RankedSuggestion suggestion;
-  suggestion.interrupting = true;
-
-  double value = ranking_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 1.0);
-}
-
-TEST_F(InterruptingRankingFeatureTest, ComputeFeatureNonInterrupting) {
-  RankedSuggestion suggestion;
-  suggestion.interrupting = false;
-
-  double value = ranking_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 0.0);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/kronk_ranking_feature.cc b/bin/suggestion_engine/ranking_features/kronk_ranking_feature.cc
deleted file mode 100644
index 1f7ddac..0000000
--- a/bin/suggestion_engine/ranking_features/kronk_ranking_feature.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/kronk_ranking_feature.h"
-
-namespace modular {
-
-KronkRankingFeature::KronkRankingFeature() = default;
-
-KronkRankingFeature::~KronkRankingFeature() = default;
-
-double KronkRankingFeature::ComputeFeatureInternal(
-    const fuchsia::modular::UserInput& query,
-    const RankedSuggestion& suggestion) {
-  if (suggestion.prototype->source_url.find("kronk") != std::string::npos) {
-    return kMaxConfidence;
-  } else {
-    return kMinConfidence;
-  }
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/kronk_ranking_feature.h b/bin/suggestion_engine/ranking_features/kronk_ranking_feature.h
deleted file mode 100644
index dcceede..0000000
--- a/bin/suggestion_engine/ranking_features/kronk_ranking_feature.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_KRONK_RANKING_FEATURE_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_KRONK_RANKING_FEATURE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-class KronkRankingFeature : public RankingFeature {
- public:
-  KronkRankingFeature();
-  ~KronkRankingFeature() override;
-
- private:
-  double ComputeFeatureInternal(const fuchsia::modular::UserInput& query,
-                                const RankedSuggestion& suggestion) override;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_KRONK_RANKING_FEATURE_H_
diff --git a/bin/suggestion_engine/ranking_features/kronk_ranking_feature_unittest.cc b/bin/suggestion_engine/ranking_features/kronk_ranking_feature_unittest.cc
deleted file mode 100644
index b24635a..0000000
--- a/bin/suggestion_engine/ranking_features/kronk_ranking_feature_unittest.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/kronk_ranking_feature.h"
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-class KronkRankingFeatureTest : public ::testing::Test {
- protected:
-  KronkRankingFeature kronk_ranking_feature;
-  fuchsia::modular::UserInput query;
-};
-
-TEST_F(KronkRankingFeatureTest, TestComputeFeatureKronk) {
-  SuggestionPrototype prototype;
-  prototype.source_url = "kronk";
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-  double value = kronk_ranking_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, kMaxConfidence);
-}
-
-TEST_F(KronkRankingFeatureTest, TestComputeFeatureNonKronk) {
-  SuggestionPrototype prototype;
-  prototype.source_url = "chat";
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-  double value = kronk_ranking_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, kMinConfidence);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature.cc b/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature.cc
deleted file mode 100644
index 7064b61..0000000
--- a/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature.h"
-
-#include <lib/context/cpp/context_helper.h>
-#include <lib/fxl/logging.h>
-
-#include "rapidjson/document.h"
-#include "rapidjson/schema.h"
-
-namespace modular {
-
-namespace {
-// Sample map using data collected between Feb 6-20, 2018
-constexpr char kDataFilePath[] = "/pkg/data/ranking_data/mod_pairs.json";
-}  // namespace
-
-ModPairRankingFeature::ModPairRankingFeature(const bool init_data) {
-  if (init_data) {
-    LoadDataFromFile(kDataFilePath);
-  }
-}
-
-ModPairRankingFeature::~ModPairRankingFeature() = default;
-
-void ModPairRankingFeature::LoadDataFromFile(const std::string& filepath) {
-  auto maybe_result = FetchJsonObject(filepath);
-  if (!maybe_result.has_value()) {
-    FXL_LOG(WARNING) << "Failed to fetch mod pairs ranking feature data.";
-    return;
-  }
-  auto& result = maybe_result.value();
-  module_pairs_.clear();
-  for (rapidjson::Value::ConstMemberIterator iter = result.MemberBegin();
-       iter != result.MemberEnd(); ++iter) {
-    const std::string existing_mod_url = iter->name.GetString();
-    rapidjson::Value& other_mods = result[existing_mod_url.c_str()];
-    for (rapidjson::Value::ConstMemberIterator iter2 = other_mods.MemberBegin();
-         iter2 != other_mods.MemberEnd(); ++iter2) {
-      const std::string added_mod_url = iter2->name.GetString();
-      module_pairs_[existing_mod_url][added_mod_url] = iter2->value.GetDouble();
-    }
-  }
-}
-
-double ModPairRankingFeature::ComputeFeatureInternal(
-    const fuchsia::modular::UserInput& query,
-    const RankedSuggestion& suggestion) {
-  double prob = 0.0;
-
-  for (auto& command : suggestion.prototype->proposal.on_selected) {
-    fidl::StringPtr module_url;
-    switch (command.Which()) {
-      case fuchsia::modular::StoryCommand::Tag::kAddMod: {
-        module_url = command.add_mod().intent.handler;
-        break;
-      }
-      case fuchsia::modular::StoryCommand::Tag::kSetKindOfProtoStoryOption:
-      case fuchsia::modular::StoryCommand::Tag::kSetFocusState:
-      case fuchsia::modular::StoryCommand::Tag::kFocusMod:
-      case fuchsia::modular::StoryCommand::Tag::kSetLinkValue:
-      case fuchsia::modular::StoryCommand::Tag::kRemoveMod:
-      case fuchsia::modular::StoryCommand::Tag::Invalid:
-        continue;
-    }
-    if (module_url.is_null() || module_url->empty()) {
-      continue;
-    }
-    // Currently computing: max{P(m|mi) for mi in modules_in_source_story}
-    // TODO(miguelfrde): compute P(module_url | modules in source story)
-    for (auto& context_value : *ContextValues()) {
-      const std::string existing_mod_url = context_value.meta.mod->url;
-      if (module_pairs_.count(existing_mod_url) &&
-          module_pairs_[existing_mod_url].count(module_url)) {
-        prob = std::max(prob, module_pairs_[existing_mod_url][module_url]);
-      }
-    }
-  }
-  return prob;
-}
-
-fuchsia::modular::ContextSelectorPtr
-ModPairRankingFeature::CreateContextSelectorInternal() {
-  // Get modules in the currently focused story.
-  auto selector = fuchsia::modular::ContextSelector::New();
-  selector->type = fuchsia::modular::ContextValueType::MODULE;
-  selector->meta = fuchsia::modular::ContextMetadata::New();
-  selector->meta->story = fuchsia::modular::StoryMetadata::New();
-  selector->meta->story->focused = fuchsia::modular::FocusedState::New();
-  selector->meta->story->focused->state =
-      fuchsia::modular::FocusedStateState::FOCUSED;
-  return selector;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature.h b/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature.h
deleted file mode 100644
index 7dedf81..0000000
--- a/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_MOD_PAIR_RANKING_FEATURE_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_MOD_PAIR_RANKING_FEATURE_H_
-
-#include <unordered_map>
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-class ModPairRankingFeature : public RankingFeature {
- public:
-  ModPairRankingFeature(bool init_data = true);
-  ~ModPairRankingFeature() override;
-
-  void LoadDataFromFile(const std::string& filepath);
-
- private:
-  double ComputeFeatureInternal(const fuchsia::modular::UserInput& query,
-                                const RankedSuggestion& suggestion) override;
-
-  fuchsia::modular::ContextSelectorPtr CreateContextSelectorInternal() override;
-
-  std::unordered_map<std::string, std::unordered_map<std::string, double>>
-      module_pairs_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_MOD_PAIR_RANKING_FEATURE_H_
diff --git a/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature_unittest.cc b/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature_unittest.cc
deleted file mode 100644
index 74fadac..0000000
--- a/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature_unittest.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature.h"
-
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/files/path.h>
-#include <lib/fxl/files/scoped_temp_dir.h>
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-constexpr char kTestData[] = R"({
-  "mod1": {
-    "mod2": 0.5,
-    "mod3": 0.5
-  },
-  "mod2": {
-    "mod3": 1.0
-  },
-  "mod3": {
-    "mod1": 0.2,
-    "mod4": 0.8
-  }
-})";
-
-class ModPairRankingFeatureTest : public ::testing::Test {
- public:
-  void SetUp() override {
-    std::string tmp_file;
-    ASSERT_TRUE(CreateFile(kTestData, &tmp_file));
-    mod_pair_feature.LoadDataFromFile(tmp_file);
-  }
-
- protected:
-  ModPairRankingFeature mod_pair_feature{false};
-  fuchsia::modular::UserInput query;
-
- private:
-  bool CreateFile(const std::string& content, std::string* const tmp_file) {
-    if (!tmp_dir_.NewTempFile(tmp_file)) {
-      return false;
-    }
-    return files::WriteFile(*tmp_file, content.c_str(), content.size());
-  }
-
-  files::ScopedTempDir tmp_dir_;
-};
-
-// Creates the values from a context query to mock the modules in a focused
-// story based on which this ranking feature computes its value.
-void AddValueToContextUpdate(
-    fidl::VectorPtr<fuchsia::modular::ContextValue>& context_update,
-    const std::string& mod) {
-  fuchsia::modular::ContextValue value;
-  value.meta.mod = fuchsia::modular::ModuleMetadata::New();
-  value.meta.mod->url = mod;
-  context_update.push_back(std::move(value));
-}
-
-TEST_F(ModPairRankingFeatureTest, ComputeFeatureAddModuleAction) {
-  fuchsia::modular::Intent intent;
-  intent.handler = "mod4";
-  fuchsia::modular::AddMod add_mod;
-  add_mod.intent = std::move(intent);
-  fuchsia::modular::StoryCommand command;
-  command.set_add_mod(std::move(add_mod));
-  fuchsia::modular::Proposal proposal;
-  proposal.on_selected.push_back(std::move(command));
-  SuggestionPrototype prototype;
-  prototype.proposal = std::move(proposal);
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  AddValueToContextUpdate(context_update, "mod3");
-  mod_pair_feature.UpdateContext(std::move(context_update));
-  double value = mod_pair_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 0.8);
-}
-
-TEST_F(ModPairRankingFeatureTest, ComputeFeatureNoModule) {
-  fuchsia::modular::Intent intent;
-  intent.handler = "mod-fiction";
-  fuchsia::modular::AddMod add_mod;
-  add_mod.intent = std::move(intent);
-  fuchsia::modular::StoryCommand command;
-  command.set_add_mod(std::move(add_mod));
-  fuchsia::modular::Proposal proposal;
-  proposal.on_selected.push_back(std::move(command));
-  SuggestionPrototype prototype;
-  prototype.proposal = std::move(proposal);
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  AddValueToContextUpdate(context_update, "mod1");
-  mod_pair_feature.UpdateContext(std::move(context_update));
-  double value = mod_pair_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, kMinConfidence);
-}
-
-TEST_F(ModPairRankingFeatureTest, ComputeFeatureMultipleActions) {
-  fuchsia::modular::AddMod add_mod;
-  add_mod.intent.handler = "mod-fiction";
-  fuchsia::modular::StoryCommand command;
-  command.set_add_mod(std::move(add_mod));
-  fuchsia::modular::Proposal proposal;
-  proposal.on_selected.push_back(std::move(command));
-  SuggestionPrototype prototype;
-  prototype.proposal = std::move(proposal);
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  add_mod = fuchsia::modular::AddMod();
-  add_mod.intent.handler = "mod3";
-  fuchsia::modular::StoryCommand command2;
-  command2.set_add_mod(std::move(add_mod));
-  suggestion.prototype->proposal.on_selected.push_back(std::move(command2));
-
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_update;
-  AddValueToContextUpdate(context_update, "mod1");
-  AddValueToContextUpdate(context_update, "mod2");
-  mod_pair_feature.UpdateContext(std::move(context_update));
-  double value = mod_pair_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 1.0);
-}
-
-TEST_F(ModPairRankingFeatureTest, CreateContextSelector) {
-  auto selector = mod_pair_feature.CreateContextSelector();
-  EXPECT_NE(selector, nullptr);
-  EXPECT_EQ(selector->type, fuchsia::modular::ContextValueType::MODULE);
-  EXPECT_EQ(selector->meta->story->focused->state,
-            fuchsia::modular::FocusedStateState::FOCUSED);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature.cc b/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature.cc
deleted file mode 100644
index 34c528b..0000000
--- a/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature.h"
-
-namespace modular {
-
-ProposalHintRankingFeature::ProposalHintRankingFeature() = default;
-
-ProposalHintRankingFeature::~ProposalHintRankingFeature() = default;
-
-double ProposalHintRankingFeature::ComputeFeatureInternal(
-    const fuchsia::modular::UserInput& query,
-    const RankedSuggestion& suggestion) {
-  return suggestion.prototype->proposal.confidence;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature.h b/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature.h
deleted file mode 100644
index 3dbe514..0000000
--- a/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_PROPOSAL_HINT_RANKING_FEATURE_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_PROPOSAL_HINT_RANKING_FEATURE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-class ProposalHintRankingFeature : public RankingFeature {
- public:
-  ProposalHintRankingFeature();
-  ~ProposalHintRankingFeature() override;
-
- private:
-  double ComputeFeatureInternal(const fuchsia::modular::UserInput& query,
-                                const RankedSuggestion& suggestion) override;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_PROPOSAL_HINT_RANKING_FEATURE_H_
diff --git a/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature_unittest.cc b/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature_unittest.cc
deleted file mode 100644
index 6e8fafd..0000000
--- a/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature_unittest.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature.h"
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-class ProposalHintRankingFeatureTest : public ::testing::Test {
- protected:
-  ProposalHintRankingFeature proposal_hint_feature;
-  fuchsia::modular::UserInput query;
-};
-
-TEST_F(ProposalHintRankingFeatureTest, TestComputeFeature) {
-  fuchsia::modular::Proposal proposal;
-  proposal.confidence = 0.5;
-  SuggestionPrototype prototype;
-  prototype.proposal = std::move(proposal);
-  prototype.source_url = "chat";
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-  double value = proposal_hint_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, 0.5);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/query_match_ranking_feature.cc b/bin/suggestion_engine/ranking_features/query_match_ranking_feature.cc
deleted file mode 100644
index 3d3cc8f..0000000
--- a/bin/suggestion_engine/ranking_features/query_match_ranking_feature.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/query_match_ranking_feature.h"
-
-namespace modular {
-
-QueryMatchRankingFeature::QueryMatchRankingFeature() = default;
-
-QueryMatchRankingFeature::~QueryMatchRankingFeature() = default;
-
-double QueryMatchRankingFeature::ComputeFeatureInternal(
-    const fuchsia::modular::UserInput& query,
-    const RankedSuggestion& suggestion) {
-  std::string text = suggestion.prototype->proposal.display.headline;
-  std::string norm_query = query.text;
-
-  std::transform(text.begin(), text.end(), text.begin(), ::tolower);
-  std::transform(norm_query.begin(), norm_query.end(), norm_query.begin(),
-                 ::tolower);
-
-  // TODO(jwnichols): replace with a score based on Longest Common Substring
-  auto pos = text.find(norm_query);
-  if (pos == std::string::npos)
-    return kMinConfidence;
-
-  return static_cast<double>(norm_query.size()) /
-         static_cast<double>(text.size());
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/query_match_ranking_feature.h b/bin/suggestion_engine/ranking_features/query_match_ranking_feature.h
deleted file mode 100644
index cc0130c..0000000
--- a/bin/suggestion_engine/ranking_features/query_match_ranking_feature.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_QUERY_MATCH_RANKING_FEATURE_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_QUERY_MATCH_RANKING_FEATURE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-namespace modular {
-
-class QueryMatchRankingFeature : public RankingFeature {
- public:
-  QueryMatchRankingFeature();
-  ~QueryMatchRankingFeature() override;
-
- private:
-  double ComputeFeatureInternal(const fuchsia::modular::UserInput& query,
-                                const RankedSuggestion& suggestion) override;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_QUERY_MATCH_RANKING_FEATURE_H_
diff --git a/bin/suggestion_engine/ranking_features/query_match_ranking_feature_unittest.cc b/bin/suggestion_engine/ranking_features/query_match_ranking_feature_unittest.cc
deleted file mode 100644
index 02ef5e0..0000000
--- a/bin/suggestion_engine/ranking_features/query_match_ranking_feature_unittest.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/query_match_ranking_feature.h"
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-class QueryMatchRankingFeatureTest : public ::testing::Test {
- protected:
-  QueryMatchRankingFeature query_match_feature;
-};
-
-TEST_F(QueryMatchRankingFeatureTest, TestComputeFeatureRelated) {
-  fuchsia::modular::SuggestionDisplay display;
-  display.headline = "play bar by foo";
-  fuchsia::modular::Proposal proposal;
-  proposal.display = std::move(display);
-  SuggestionPrototype prototype;
-  prototype.proposal = std::move(proposal);
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fuchsia::modular::UserInput query;
-  query.text = "play bar";
-
-  double value = query_match_feature.ComputeFeature(query, suggestion);
-  EXPECT_NEAR(value, 0.533333, 0.00001);
-}
-
-TEST_F(QueryMatchRankingFeatureTest, TestComputeFeatureUnrelated) {
-  fuchsia::modular::SuggestionDisplay display;
-  display.headline = "play bar by foo";
-  fuchsia::modular::Proposal proposal;
-  proposal.display = std::move(display);
-  SuggestionPrototype prototype;
-  prototype.proposal = std::move(proposal);
-  RankedSuggestion suggestion;
-  suggestion.prototype = &prototype;
-
-  fuchsia::modular::UserInput query;
-  query.text = "open chat";
-
-  double value = query_match_feature.ComputeFeature(query, suggestion);
-  EXPECT_EQ(value, kMinConfidence);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/ranking_feature.cc b/bin/suggestion_engine/ranking_features/ranking_feature.cc
deleted file mode 100644
index f5a81e2..0000000
--- a/bin/suggestion_engine/ranking_features/ranking_feature.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-
-#include "rapidjson/document.h"
-#include "rapidjson/error/en.h"
-#include "rapidjson/schema.h"
-#include "rapidjson/stringbuffer.h"
-
-namespace modular {
-
-int RankingFeature::instances_ = 0;
-
-RankingFeature::RankingFeature() : id_(instances_++) {}
-
-RankingFeature::~RankingFeature() = default;
-
-double RankingFeature::ComputeFeature(const fuchsia::modular::UserInput& query,
-                                      const RankedSuggestion& suggestion) {
-  const double feature = ComputeFeatureInternal(query, suggestion);
-  FXL_CHECK(feature <= kMaxConfidence);
-  FXL_CHECK(feature >= kMinConfidence);
-  return feature;
-}
-
-fuchsia::modular::ContextSelectorPtr RankingFeature::CreateContextSelector() {
-  return CreateContextSelectorInternal();
-}
-
-void RankingFeature::UpdateContext(
-    const std::vector<fuchsia::modular::ContextValue>&
-        context_update_values) {
-  context_values_.reset(fidl::Clone(context_update_values));
-}
-
-fuchsia::modular::ContextSelectorPtr
-RankingFeature::CreateContextSelectorInternal() {
-  // By default we return a nullptr, meaning that the ranking feature doesn't
-  // require context. If a ranking feature requires context, it should create a
-  // context selector, set the values it needs and return it.
-  return nullptr;
-}
-
-fidl::VectorPtr<fuchsia::modular::ContextValue>&
-RankingFeature::ContextValues() {
-  return context_values_;
-}
-
-std::optional<rapidjson::Document> RankingFeature::FetchJsonObject(
-    const std::string& path) {
-  // Load data file to string.
-  std::string data;
-  if (!files::ReadFileToString(path, &data)) {
-    FXL_LOG(WARNING) << "Missing ranking feature data file: " << path;
-    return std::nullopt;
-  }
-
-  // Parse json data string.
-  rapidjson::Document data_doc;
-  data_doc.Parse(data);
-  if (data_doc.HasParseError()) {
-    FXL_LOG(WARNING) << "Invalid JSON (" << path << " at "
-                     << data_doc.GetErrorOffset() << "): "
-                     << rapidjson::GetParseError_En(data_doc.GetParseError());
-    return std::nullopt;
-  }
-
-  return std::move(data_doc);
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/ranking_features/ranking_feature.h b/bin/suggestion_engine/ranking_features/ranking_feature.h
deleted file mode 100644
index 91074c9..0000000
--- a/bin/suggestion_engine/ranking_features/ranking_feature.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_RANKING_FEATURE_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_RANKING_FEATURE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/suggestion_engine/ranked_suggestion.h"
-#include "rapidjson/document.h"
-
-namespace modular {
-
-constexpr double kMaxConfidence = 1.0;
-constexpr double kMinConfidence = 0.0;
-
-class RankingFeature {
- public:
-  RankingFeature();
-  virtual ~RankingFeature();
-
-  // Compute the numeric value for a feature, ensuring bounds on the result
-  // in the range of [0.0,1.0]
-  double ComputeFeature(const fuchsia::modular::UserInput& query,
-                        const RankedSuggestion& suggestion);
-
-  // Fills the context selector with the values and meta the feature needs to
-  // request from the context. Returns true if it filled anything, false
-  // otherwise.
-  fuchsia::modular::ContextSelectorPtr CreateContextSelector();
-
-  // Updates the context that the feature needs.
-  void UpdateContext(const std::vector<fuchsia::modular::ContextValue>&
-                         context_update_values);
-
- protected:
-  // Compute the numeric feature for a feature, to be overridden by subclasses
-  virtual double ComputeFeatureInternal(
-      const fuchsia::modular::UserInput& query,
-      const RankedSuggestion& suggestion) = 0;
-
-  // Create the context selector. Returns nullptr if the feature doesn't require
-  // context.
-  virtual fuchsia::modular::ContextSelectorPtr CreateContextSelectorInternal();
-
-  // Loads a json file into the second value of the pair. The first value
-  // indicates if the file could be loaded and parsed.
-  std::optional<rapidjson::Document> FetchJsonObject(const std::string& path);
-
-  // Returns current context values the ranking feature has.
-  fidl::VectorPtr<fuchsia::modular::ContextValue>& ContextValues();
-
- private:
-  static int instances_;
-  fidl::VectorPtr<fuchsia::modular::ContextValue> context_values_;
-  const int id_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_RANKING_FEATURES_RANKING_FEATURE_H_
diff --git a/bin/suggestion_engine/resources/mod_pairs.json b/bin/suggestion_engine/resources/mod_pairs.json
deleted file mode 100644
index e22ccea..0000000
--- a/bin/suggestion_engine/resources/mod_pairs.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "/system/apps/restaurant/restaurant_list": {
-    "file:///system/apps/restaurant/restaurant_review_list": 1.0
-  },
-  "chat_conversation": {
-    "contacts_picker": 0.3333333333333333,
-    "file:///system/apps/web_view": 0.3333333333333333,
-    "gallery": 0.3333333333333333
-  },
-  "chat_conversation_list": {
-    "chat_conversation": 0.3333333333333333,
-    "contacts_picker": 0.6,
-    "gallery": 0.06666666666666667
-  },
-  "contact_list": {
-    "contact_card": 1.0
-  },
-  "contacts_picker": {
-    "chat_conversation": 1.0
-  },
-  "dashboard": {
-    "chat_conversation": 0.4444444444444444,
-    "file:///system/apps/web_view": 0.2222222222222222,
-    "web_view": 0.3333333333333333
-  },
-  "documents_browser": {
-    "documents_info": 1.0
-  },
-  "example_manual_relationships": {
-    "Captions": 1.0
-  },
-  "file:///system/apps/concert_event_list": {
-    "concert_event_page": 1.0
-  },
-  "file:///system/apps/map": {
-    "file:///system/apps/weather_forecast": 1.0
-  },
-  "file:///system/apps/web_view": {
-    "chat_conversation": 1.0
-  },
-  "file:///system/apps/youtube_related_videos": {
-    "video": 1.0
-  },
-  "file:///system/apps/youtube_video": {
-    "file:///system/apps/youtube_related_videos": 0.64,
-    "video": 0.36
-  },
-  "gallery": {
-    "chat_conversation": 0.5,
-    "contacts_picker": 0.5
-  },
-  "restaurant/restaurant_list": {
-    "file:///system/apps/restaurant/restaurant_page": 1.0
-  },
-  "video": {
-    "file:///system/apps/youtube_related_videos": 0.5,
-    "file:///system/apps/youtube_video": 0.5
-  },
-  "web_view": {
-    "chat_conversation": 1.0
-  },
-  "youtube_related_videos": {
-    "video": 1.0
-  },
-  "youtube_story": {
-    "file:///system/apps/youtube_related_videos": 0.1507537688442211,
-    "file:///system/apps/youtube_video": 0.15577889447236182,
-    "video": 0.27638190954773867,
-    "youtube_related_videos": 0.20603015075376885,
-    "youtube_video": 0.21105527638190955
-  },
-  "youtube_video": {
-    "video": 0.4533333333333333,
-    "youtube_related_videos": 0.5466666666666666
-  }
-}
diff --git a/bin/suggestion_engine/suggestion_engine_helper.cc b/bin/suggestion_engine/suggestion_engine_helper.cc
deleted file mode 100644
index ed22db2..0000000
--- a/bin/suggestion_engine/suggestion_engine_helper.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/suggestion_engine_helper.h"
-
-#include <lib/fxl/random/uuid.h>
-
-namespace modular {
-
-SuggestionPrototype* CreateSuggestionPrototype(
-    SuggestionPrototypeMap* owner, const std::string& source_url,
-    fuchsia::modular::Proposal proposal) {
-  return CreateSuggestionPrototype(owner, source_url, "", std::move(proposal));
-}
-
-SuggestionPrototype* CreateSuggestionPrototype(
-    SuggestionPrototypeMap* owner, const std::string& source_url,
-    const std::string& preloaded_story_id,
-    fuchsia::modular::Proposal proposal) {
-  auto prototype_pair = owner->emplace(std::make_pair(source_url, proposal.id),
-                                       std::make_unique<SuggestionPrototype>());
-
-  SuggestionPrototype* suggestion_prototype =
-      prototype_pair.first->second.get();
-  suggestion_prototype->preloaded_story_id = preloaded_story_id;
-  suggestion_prototype->suggestion_id = fxl::GenerateUUID();
-  suggestion_prototype->source_url = source_url;
-  suggestion_prototype->timestamp = zx::clock::get_monotonic();
-  suggestion_prototype->proposal = std::move(proposal);
-
-  return suggestion_prototype;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/suggestion_engine_helper.h b/bin/suggestion_engine/suggestion_engine_helper.h
deleted file mode 100644
index e8d63be..0000000
--- a/bin/suggestion_engine/suggestion_engine_helper.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_SUGGESTION_ENGINE_HELPER_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_SUGGESTION_ENGINE_HELPER_H_
-
-#include "peridot/bin/suggestion_engine/suggestion_prototype.h"
-
-namespace modular {
-
-// (proposer ID, proposal ID) => suggestion prototype
-using SuggestionPrototypeMap = std::map<std::pair<std::string, std::string>,
-                                        std::unique_ptr<SuggestionPrototype>>;
-
-SuggestionPrototype* CreateSuggestionPrototype(
-    SuggestionPrototypeMap* owner, const std::string& source_url,
-    const std::string& story_id, fuchsia::modular::Proposal proposal);
-
-SuggestionPrototype* CreateSuggestionPrototype(
-    SuggestionPrototypeMap* owner, const std::string& source_url,
-    const std::string& story_id, const std::string& preloaded_story_id,
-    fuchsia::modular::Proposal proposal);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_SUGGESTION_ENGINE_HELPER_H_
diff --git a/bin/suggestion_engine/suggestion_engine_impl.cc b/bin/suggestion_engine/suggestion_engine_impl.cc
deleted file mode 100644
index e1e98e2..0000000
--- a/bin/suggestion_engine/suggestion_engine_impl.cc
+++ /dev/null
@@ -1,401 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/suggestion_engine_impl.h"
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/context/cpp/context_helper.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/time/time_delta.h>
-#include <lib/fxl/time/time_point.h>
-#include "lib/fidl/cpp/clone.h"
-#include "lib/fxl/random/uuid.h"
-
-#include "peridot/bin/suggestion_engine/decision_policies/rank_over_threshold_decision_policy.h"
-#include "peridot/bin/suggestion_engine/filters/conjugate_ranked_passive_filter.h"
-#include "peridot/bin/suggestion_engine/filters/ranked_active_filter.h"
-#include "peridot/bin/suggestion_engine/filters/ranked_passive_filter.h"
-#include "peridot/bin/suggestion_engine/rankers/linear_ranker.h"
-#include "peridot/bin/suggestion_engine/ranking_features/affinity_ranking_feature.h"
-#include "peridot/bin/suggestion_engine/ranking_features/annoyance_ranking_feature.h"
-#include "peridot/bin/suggestion_engine/ranking_features/dead_story_ranking_feature.h"
-#include "peridot/bin/suggestion_engine/ranking_features/interrupting_ranking_feature.h"
-#include "peridot/bin/suggestion_engine/ranking_features/kronk_ranking_feature.h"
-#include "peridot/bin/suggestion_engine/ranking_features/mod_pair_ranking_feature.h"
-#include "peridot/bin/suggestion_engine/ranking_features/proposal_hint_ranking_feature.h"
-#include "peridot/bin/suggestion_engine/ranking_features/query_match_ranking_feature.h"
-#include "peridot/bin/suggestion_engine/ranking_features/ranking_feature.h"
-#include "peridot/lib/fidl/json_xdr.h"
-
-namespace modular {
-
-SuggestionEngineImpl::SuggestionEngineImpl(
-    fuchsia::modular::ContextReaderPtr context_reader,
-    fuchsia::modular::PuppetMasterPtr puppet_master)
-    : debug_(std::make_shared<SuggestionDebugImpl>()),
-      next_processor_(debug_),
-      query_processor_(debug_),
-      context_reader_(std::move(context_reader)),
-      puppet_master_(std::move(puppet_master)),
-      context_listener_binding_(this) {
-  RegisterRankingFeatures();
-}
-
-SuggestionEngineImpl::~SuggestionEngineImpl() = default;
-
-fxl::WeakPtr<SuggestionDebugImpl> SuggestionEngineImpl::debug() {
-  return debug_->GetWeakPtr();
-}
-
-void SuggestionEngineImpl::AddNextProposal(
-    ProposalPublisherImpl* source, fuchsia::modular::Proposal proposal) {
-  if (proposal.wants_rich_suggestion) {
-    if (ComponentCanUseRichSuggestions(source->component_url())) {
-      AddProposalWithRichSuggestion(source, std::move(proposal));
-      return;
-    }
-    FXL_LOG(INFO) << "Attempt to add rich suggestion for unallowed component "
-                  << source->component_url();
-  }
-  next_processor_.AddProposal(source->component_url(), std::move(proposal));
-}
-
-void SuggestionEngineImpl::ProposeNavigation(
-    const fuchsia::modular::NavigationAction navigation) {
-  navigation_processor_.Navigate(navigation);
-}
-
-void SuggestionEngineImpl::AddProposalWithRichSuggestion(
-    ProposalPublisherImpl* source, fuchsia::modular::Proposal proposal) {
-  if (!proposal.story_name) {
-    // Puppet master will generate a story name on execution of the
-    // proposal actions.
-    proposal.story_name = "";
-  }
-
-  SuggestionPrototype* suggestion =
-      next_processor_.GetSuggestion(source->component_url(), proposal.id);
-
-  // We keep track of the previous story since a new one will be created for a
-  // existing proposal.
-  // TODO(miguelfrde): this logic should probably belong in NextProcessor. We
-  // should also allow clients to reuse the story_name and mod_name to update
-  // the mod in the suggestion directly rather than creating a new one, however
-  // this is not working yet.
-  std::string existing_story;
-  if (suggestion && !suggestion->preloaded_story_id.empty()) {
-    existing_story = suggestion->preloaded_story_id;
-  }
-
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master;
-  puppet_master_->ControlStory(proposal.story_name,
-                               story_puppet_master.NewRequest());
-  fuchsia::modular::StoryOptions story_options;
-  story_options.kind_of_proto_story = true;
-  story_puppet_master->SetCreateOptions(std::move(story_options));
-
-  auto fut = modular::Future<fuchsia::modular::ExecuteResult>::Create(
-      "SuggestionEngine::AddProposalWithRichSuggestion.fut");
-  story_puppet_master->Enqueue(std::move(proposal.on_selected));
-  story_puppet_master->Execute(fut->Completer());
-  fut->Then(fxl::MakeCopyable(
-      [this, fut, source_url = source->component_url(),
-       proposal = std::move(proposal), sp = std::move(story_puppet_master),
-       existing_story](fuchsia::modular::ExecuteResult result) mutable {
-        if (result.status != fuchsia::modular::ExecuteStatus::OK) {
-          FXL_LOG(WARNING) << "Preloading of rich suggestion actions resulted "
-                           << "non successful status="
-                           << (uint32_t)result.status
-                           << " message=" << result.error_message;
-        }
-        if (proposal.story_name->empty()) {
-          proposal.story_name = result.story_id;
-        }
-
-        if (existing_story.empty()) {
-          next_processor_.AddProposal(source_url, result.story_id,
-                                      std::move(proposal));
-        }
-      }));
-}
-
-void SuggestionEngineImpl::RemoveNextProposal(const std::string& component_url,
-                                              const std::string& proposal_id) {
-  SuggestionPrototype* suggestion =
-      next_processor_.GetSuggestion(component_url, proposal_id);
-  if (suggestion && !suggestion->preloaded_story_id.empty()) {
-    auto story_name = suggestion->proposal.story_name;
-    puppet_master_->DeleteStory(
-        story_name, [this, story_name, component_url, proposal_id] {
-          next_processor_.RemoveProposal(component_url, proposal_id);
-        });
-  } else {
-    next_processor_.RemoveProposal(component_url, proposal_id);
-  }
-}
-
-void SuggestionEngineImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::SuggestionEngine> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void SuggestionEngineImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::SuggestionProvider> request) {
-  suggestion_provider_bindings_.AddBinding(this, std::move(request));
-}
-
-void SuggestionEngineImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::SuggestionDebug> request) {
-  debug_bindings_.AddBinding(debug_.get(), std::move(request));
-}
-
-// |fuchsia::modular::SuggestionProvider|
-void SuggestionEngineImpl::Query(
-    fidl::InterfaceHandle<fuchsia::modular::QueryListener> listener,
-    fuchsia::modular::UserInput input, int count) {
-  query_processor_.ExecuteQuery(std::move(input), count, std::move(listener));
-}
-
-// |fuchsia::modular::SuggestionProvider|
-void SuggestionEngineImpl::SubscribeToInterruptions(
-    fidl::InterfaceHandle<fuchsia::modular::InterruptionListener> listener) {
-  next_processor_.RegisterInterruptionListener(std::move(listener));
-}
-
-// |fuchsia::modular::SuggestionProvider|
-void SuggestionEngineImpl::SubscribeToNavigation(
-    fidl::InterfaceHandle<fuchsia::modular::NavigationListener> listener) {
-  navigation_processor_.RegisterListener(std::move(listener));
-}
-
-// |fuchsia::modular::SuggestionProvider|
-void SuggestionEngineImpl::SubscribeToNext(
-    fidl::InterfaceHandle<fuchsia::modular::NextListener> listener, int count) {
-  next_processor_.RegisterListener(std::move(listener), count);
-}
-
-// |fuchsia::modular::SuggestionProvider|
-void SuggestionEngineImpl::NotifyInteraction(
-    std::string suggestion_uuid,
-    fuchsia::modular::Interaction interaction) {
-  // Find the suggestion
-  bool suggestion_in_ask = false;
-  RankedSuggestion* suggestion = next_processor_.GetSuggestion(suggestion_uuid);
-  if (!suggestion) {
-    suggestion = query_processor_.GetSuggestion(suggestion_uuid);
-    suggestion_in_ask = true;
-  }
-
-  if (!suggestion) {
-    FXL_LOG(WARNING) << "Requested suggestion in notify interaction not found. "
-                     << "UUID: " << suggestion_uuid;
-    return;
-  }
-
-  // If it exists (and it should), perform the action and clean up
-  auto component_url = suggestion->prototype->source_url;
-  std::string log_detail = suggestion->prototype
-                               ? short_proposal_str(*suggestion->prototype)
-                               : "invalid";
-
-  FXL_LOG(INFO) << (interaction.type ==
-                            fuchsia::modular::InteractionType::SELECTED
-                        ? "Accepted"
-                        : "Dismissed")
-                << " suggestion " << suggestion_uuid << " (" << log_detail
-                << ")";
-
-  debug_->OnSuggestionSelected(suggestion->prototype);
-
-  auto& proposal = suggestion->prototype->proposal;
-  auto proposal_id = proposal.id;
-  auto preloaded_story_id = suggestion->prototype->preloaded_story_id;
-  suggestion->interrupting = false;
-
-  switch (interaction.type) {
-    case fuchsia::modular::InteractionType::SELECTED: {
-      HandleSelectedInteraction(
-          component_url, preloaded_story_id, proposal,
-          std::move(suggestion->prototype->bound_listener), suggestion_in_ask);
-      break;
-    }
-    case fuchsia::modular::InteractionType::DISMISSED: {
-      if (suggestion_in_ask) {
-        query_processor_.CleanUpPreviousQuery();
-      } else {
-        RemoveNextProposal(component_url, proposal_id);
-      }
-      break;
-    }
-    case fuchsia::modular::InteractionType::EXPIRED:
-    case fuchsia::modular::InteractionType::SNOOZED: {
-      // No need to remove since it was either expired by a timeout in
-      // session shell or snoozed by the user, however we should still refresh
-      // the next processor (if not in ask) given that `interrupting=false` set
-      // above.
-      if (!suggestion_in_ask) {
-        next_processor_.UpdateRanking();
-      }
-      break;
-    }
-  }
-}
-
-// |fuchsia::modular::SuggestionEngine|
-void SuggestionEngineImpl::RegisterProposalPublisher(
-    std::string url,
-    fidl::InterfaceRequest<fuchsia::modular::ProposalPublisher> publisher) {
-  // Check to see if a fuchsia::modular::ProposalPublisher has already been
-  // created for the component with this url. If not, create one.
-  std::unique_ptr<ProposalPublisherImpl>& source = proposal_publishers_[url];
-  if (!source) {  // create if it didn't already exist
-    source = std::make_unique<ProposalPublisherImpl>(this, url);
-  }
-
-  source->AddBinding(std::move(publisher));
-}
-
-// |fuchsia::modular::SuggestionEngine|
-void SuggestionEngineImpl::RegisterQueryHandler(
-    std::string url, fidl::InterfaceHandle<fuchsia::modular::QueryHandler>
-                             query_handler_handle) {
-  query_processor_.RegisterQueryHandler(url, std::move(query_handler_handle));
-}
-
-// end fuchsia::modular::SuggestionEngine
-
-void SuggestionEngineImpl::RegisterRankingFeatures() {
-  // Create common ranking features
-  ranking_features["proposal_hint_rf"] =
-      std::make_shared<ProposalHintRankingFeature>();
-  ranking_features["kronk_rf"] = std::make_shared<KronkRankingFeature>();
-  ranking_features["mod_pairs_rf"] = std::make_shared<ModPairRankingFeature>();
-  ranking_features["query_match_rf"] =
-      std::make_shared<QueryMatchRankingFeature>();
-  ranking_features["affinity_rf"] = std::make_shared<AffinityRankingFeature>();
-  ranking_features["annoyance_rf"] =
-      std::make_shared<AnnoyanceRankingFeature>();
-  ranking_features["dead_story_rf"] =
-      std::make_shared<DeadStoryRankingFeature>();
-  ranking_features["is_interrupting_rf"] =
-      std::make_shared<InterruptingRankingFeature>();
-
-  // Get context updates every time a story is focused to rerank suggestions
-  // based on the story that is focused at the moment.
-  fuchsia::modular::ContextQuery query;
-  for (auto const& it : ranking_features) {
-    fuchsia::modular::ContextSelectorPtr selector =
-        it.second->CreateContextSelector();
-    if (selector) {
-      AddToContextQuery(&query, it.first, std::move(*selector));
-    }
-  }
-  context_reader_->Subscribe(std::move(query),
-                             context_listener_binding_.NewBinding());
-
-  // TODO(jwnichols): Replace the code configuration of the ranking features
-  // with a configuration file
-
-  // Set up the next ranking features
-  auto next_ranker = std::make_unique<LinearRanker>();
-  next_ranker->AddRankingFeature(1.0, ranking_features["proposal_hint_rf"]);
-  next_ranker->AddRankingFeature(-0.1, ranking_features["kronk_rf"]);
-  next_ranker->AddRankingFeature(0, ranking_features["mod_pairs_rf"]);
-  next_ranker->AddRankingFeature(1.0, ranking_features["affinity_rf"]);
-  next_processor_.SetRanker(std::move(next_ranker));
-
-  // Set up the query ranking features
-  auto query_ranker = std::make_unique<LinearRanker>();
-  query_ranker->AddRankingFeature(1.0, ranking_features["proposal_hint_rf"]);
-  query_ranker->AddRankingFeature(-0.1, ranking_features["kronk_rf"]);
-  query_ranker->AddRankingFeature(0, ranking_features["mod_pairs_rf"]);
-  query_ranker->AddRankingFeature(0, ranking_features["query_match_rf"]);
-  query_processor_.SetRanker(std::move(query_ranker));
-
-  // Set up the interrupt ranking features
-  auto interrupt_ranker = std::make_unique<LinearRanker>();
-  interrupt_ranker->AddRankingFeature(1.0, ranking_features["annoyance_rf"]);
-  auto decision_policy = std::make_unique<RankOverThresholdDecisionPolicy>(
-      std::move(interrupt_ranker));
-  next_processor_.SetInterruptionDecisionPolicy(std::move(decision_policy));
-
-  // Set up passive filters
-  std::vector<std::unique_ptr<SuggestionPassiveFilter>> passive_filters;
-  passive_filters.push_back(std::make_unique<ConjugateRankedPassiveFilter>(
-      ranking_features["affinity_rf"]));
-  passive_filters.push_back(std::make_unique<RankedPassiveFilter>(
-      ranking_features["is_interrupting_rf"]));
-  next_processor_.SetPassiveFilters(std::move(passive_filters));
-}
-
-void SuggestionEngineImpl::OnContextUpdate(
-    fuchsia::modular::ContextUpdate update) {
-  for (auto& entry : update.values) {
-    for (const auto& rf_it : ranking_features) {
-      if (entry.key == rf_it.first) {  // Update key == rf key
-        rf_it.second->UpdateContext(entry.value);
-      }
-    }
-  }
-  next_processor_.UpdateRanking();
-}
-
-bool SuggestionEngineImpl::ComponentCanUseRichSuggestions(
-    const std::string& component_url) {
-  // Only kronk is allowed to preload stories in suggestions to make
-  // rich suggestions.
-  // Proposinator is used for testing.
-  return component_url.find("kronk") != std::string::npos ||
-         component_url.find("krohnkite") != std::string::npos ||
-         component_url.find("Proposinator") != std::string::npos;
-}
-
-void SuggestionEngineImpl::HandleSelectedInteraction(
-    const std::string& component_url, const std::string& preloaded_story_id,
-    fuchsia::modular::Proposal& proposal,
-    fuchsia::modular::ProposalListenerPtr listener, bool suggestion_in_ask) {
-  // Rich suggestions are only in Next, so we don't check suggestion_in_ask.
-  if (!preloaded_story_id.empty()) {
-    if (listener) {
-      listener->OnProposalAccepted(proposal.id, preloaded_story_id);
-    }
-    // TODO(miguelfrde): eventually we should promote stories here. For now rich
-    // suggestions aren't removed or promoted.
-    return;
-  }
-
-  if (!proposal.story_name) {
-    // Puppet master will generate a story name.
-    proposal.story_name = "";
-  }
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master;
-  puppet_master_->ControlStory(proposal.story_name,
-                               story_puppet_master.NewRequest());
-  auto fut = modular::Future<fuchsia::modular::ExecuteResult>::Create(
-      "SuggestionEngine::HandleSelectedInteraction.fut");
-  // TODO(miguelfred): break up |commands| if it is too large of a list for one
-  // FIDL message.
-  story_puppet_master->Enqueue(std::move(proposal.on_selected));
-  story_puppet_master->Execute(fut->Completer());
-  fut->Then(fxl::MakeCopyable(
-      [this, proposal_id = proposal.id, suggestion_in_ask, component_url,
-       listener = std::move(listener), sp = std::move(story_puppet_master),
-       fut](fuchsia::modular::ExecuteResult result) mutable {
-        // TODO(miguelfrde): check status.
-        if (listener) {
-          listener->OnProposalAccepted(proposal_id, result.story_id);
-        }
-        if (suggestion_in_ask) {
-          query_processor_.CleanUpPreviousQuery();
-        } else {
-          next_processor_.RemoveProposal(component_url, proposal_id);
-        }
-      }));
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/suggestion_engine_impl.h b/bin/suggestion_engine/suggestion_engine_impl.h
deleted file mode 100644
index 1ac62e9..0000000
--- a/bin/suggestion_engine/suggestion_engine_impl.h
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_SUGGESTION_ENGINE_IMPL_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_SUGGESTION_ENGINE_IMPL_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/future.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/suggestion_engine/debug.h"
-#include "peridot/bin/suggestion_engine/interruptions_processor.h"
-#include "peridot/bin/suggestion_engine/navigation_processor.h"
-#include "peridot/bin/suggestion_engine/next_processor.h"
-#include "peridot/bin/suggestion_engine/proposal_publisher_impl.h"
-#include "peridot/bin/suggestion_engine/query_processor.h"
-#include "peridot/bin/suggestion_engine/ranked_suggestions_list.h"
-#include "peridot/lib/bound_set/bound_set.h"
-
-namespace modular {
-
-class ProposalPublisherImpl;
-
-// This class is currently responsible for 3 things:
-//
-// 1) Maintaining repositories of ranked Suggestions (stored inside
-//    the RankedSuggestionsList class) for both Query and Next proposals.
-//  a) Queries are handled by the QueryProcessor. QueryProcessor executes the
-//     queries and stores their results. QueryProcessor only executes one query
-//     at a time and stores results for only the last query.
-//
-//  b) Next suggestions are issued by ProposalPublishers through the
-//     Propose method, and can be issued at any time. The NextProcessor
-//     handles all processing and notification of these proposals and stores
-//     them.
-//
-//  c) New next proposals are also considered for interruption. The
-//     InterruptionProcessor examines proposals, decides whether they
-//     should interruption, and, if so, makes further decisions about
-//     when and how those interruptions should take place.
-//
-// 2) Storing the FIDL bindings for QueryHandlers and ProposalPublishers.
-//
-//  a) ProposalPublishers (for Next Suggestions) can be registered via the
-//     RegisterProposalPublisher method.
-//
-//  b) QueryHandlers are currently registered through the
-//     RegisterQueryHandler method.
-//
-// 3) Acts as a fuchsia::modular::SuggestionProvider for those wishing to
-// subscribe to
-//    Suggestions.
-class SuggestionEngineImpl : public fuchsia::modular::ContextListener,
-                             public fuchsia::modular::SuggestionEngine,
-                             public fuchsia::modular::SuggestionProvider {
- public:
-  SuggestionEngineImpl(fuchsia::modular::ContextReaderPtr context_reader,
-                       fuchsia::modular::PuppetMasterPtr puppet_master);
-  ~SuggestionEngineImpl() override;
-
-  fxl::WeakPtr<SuggestionDebugImpl> debug();
-
-  // TODO(andrewosh): The following two methods should be removed. New
-  // ProposalPublishers should be created whenever they're requested, and they
-  // should be erased automatically when the client disconnects (they should be
-  // stored in a BindingSet with an error handler that performs removal).
-  void RemoveSourceClient(const std::string& component_url) {
-    proposal_publishers_.erase(component_url);
-  }
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::SuggestionEngine> request);
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::SuggestionDebug> request);
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::SuggestionProvider> request);
-
-  // Should only be called from ProposalPublisherImpl.
-  void AddNextProposal(ProposalPublisherImpl* source,
-                       fuchsia::modular::Proposal proposal);
-
-  // Should only be called from ProposalPublisherImpl.
-  void RemoveNextProposal(const std::string& component_url,
-                          const std::string& proposal_id);
-
-  // Should only be called from ProposalPublisherImpl.
-  void ProposeNavigation(fuchsia::modular::NavigationAction navigation);
-
-  // |fuchsia::modular::SuggestionProvider|
-  void SubscribeToInterruptions(
-      fidl::InterfaceHandle<fuchsia::modular::InterruptionListener> listener)
-      override;
-
-  // |fuchsia::modular::SuggestionProvider|
-  void SubscribeToNavigation(
-      fidl::InterfaceHandle<fuchsia::modular::NavigationListener> listener)
-      override;
-
-  // |fuchsia::modular::SuggestionProvider|
-  void SubscribeToNext(
-      fidl::InterfaceHandle<fuchsia::modular::NextListener> listener,
-      int count) override;
-
-  // |fuchsia::modular::SuggestionProvider|
-  void Query(fidl::InterfaceHandle<fuchsia::modular::QueryListener> listener,
-             fuchsia::modular::UserInput input, int count) override;
-
-  // When a user interacts with a fuchsia::modular::Suggestion, the suggestion
-  // engine will be notified of consumed suggestion's ID. With this, we will do
-  // two things:
-  //
-  // 1) Perform the fuchsia::modular::Action contained in the
-  // fuchsia::modular::Suggestion
-  //    (suggestion->proposal.on_selected)
-  //
-  //    fuchsia::modular::Action handling should be extracted into separate
-  //    classes to simplify SuggestionEngineImpl (i.e. an ActionManager which
-  //    delegates action execution to ActionHandlers based on the
-  //    fuchsia::modular::Action's tag).
-  //
-  // 2) Remove consumed fuchsia::modular::Suggestion from the next_suggestions_
-  // repository,
-  //    if it came from there.  Clear the ask_suggestions_ repository if
-  //    it came from there.
-  //
-  // |fuchsia::modular::SuggestionProvider|
-  void NotifyInteraction(std::string suggestion_uuid,
-                         fuchsia::modular::Interaction interaction) override;
-
-  // |fuchsia::modular::SuggestionEngine|
-  void RegisterProposalPublisher(
-      std::string url,
-      fidl::InterfaceRequest<fuchsia::modular::ProposalPublisher> publisher)
-      override;
-
-  // |fuchsia::modular::SuggestionEngine|
-  void RegisterQueryHandler(
-      std::string url, fidl::InterfaceHandle<fuchsia::modular::QueryHandler>
-                               query_handler_handle) override;
-
-  void Terminate(std::function<void()> done) { done(); }
-
- private:
-  friend class NavigationProcessor;
-  friend class NextProcessor;
-  friend class QueryProcessor;
-
-  // Used by AddNextProposal to create a kind-of-proto-story and pre execute
-  // actions when |proposal.preload| is true.
-  void AddProposalWithRichSuggestion(ProposalPublisherImpl* source,
-                                     fuchsia::modular::Proposal proposal);
-
-  void RegisterRankingFeatures();
-
-  // |fuchsia::modular::ContextListener|
-  void OnContextUpdate(fuchsia::modular::ContextUpdate update) override;
-
-  // Returns true iff the component at |component_url| is allowed to make rich
-  // suggestions (i.e. pre-load stories to be displayed as suggestions).
-  bool ComponentCanUseRichSuggestions(const std::string& component_url);
-
-  // Executes the Interaction::SELECTED operation. If a |preloaded_story_id| is
-  // provided, it will be promoted. Otherwise the actions will be executed.
-  // Also notifies of OnProposalAccepted on the |proposal.listener|.
-  // If |suggestion_in_ask| is true means that the proposal belongs to a query
-  // suggestion. If false, to a next suggestion. This is information is used to
-  // know from which list to delete.
-  void HandleSelectedInteraction(const std::string& component_url,
-                                 const std::string& preloaded_story_id,
-                                 fuchsia::modular::Proposal& proposal,
-                                 fuchsia::modular::ProposalListenerPtr listener,
-                                 bool suggestion_in_ask);
-
-  fidl::BindingSet<fuchsia::modular::SuggestionEngine> bindings_;
-  fidl::BindingSet<fuchsia::modular::SuggestionProvider>
-      suggestion_provider_bindings_;
-  fidl::BindingSet<fuchsia::modular::SuggestionDebug> debug_bindings_;
-
-  // The debugging interface for all Suggestions.
-  std::shared_ptr<SuggestionDebugImpl> debug_;
-
-  // TODO(thatguy): All Channels also get a ReevaluateFilters method, which
-  // would remove Suggestions that are now filtered or add
-  // new ones that are no longer filtered.
-
-  // next and interruptions share the same backing
-  NextProcessor next_processor_;
-
-  // query execution and processing
-  QueryProcessor query_processor_;
-
-  // executes navigation actions
-  NavigationProcessor navigation_processor_;
-
-  std::map<std::string, std::shared_ptr<RankingFeature>> ranking_features;
-
-  // The ProposalPublishers that have registered with the
-  // fuchsia::modular::SuggestionEngine.
-  std::map<std::string, std::unique_ptr<ProposalPublisherImpl>>
-      proposal_publishers_;
-
-  // The context reader that is used to rank suggestions using the current
-  // context.
-  fuchsia::modular::ContextReaderPtr context_reader_;
-
-  // The puppet master connection that is used to execute actions.
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-
-  fidl::Binding<fuchsia::modular::ContextListener> context_listener_binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SuggestionEngineImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_SUGGESTION_ENGINE_IMPL_H_
diff --git a/bin/suggestion_engine/suggestion_engine_impl_unittest.cc b/bin/suggestion_engine/suggestion_engine_impl_unittest.cc
deleted file mode 100644
index e474cab..0000000
--- a/bin/suggestion_engine/suggestion_engine_impl_unittest.cc
+++ /dev/null
@@ -1,904 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/suggestion_engine_impl.h"
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/modular/internal/cpp/fidl.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "gtest/gtest.h"
-#include "peridot/bin/sessionmgr/puppet_master/puppet_master_impl.h"
-#include "peridot/bin/suggestion_engine/proposal_publisher_impl.h"
-#include "peridot/lib/testing/test_story_command_executor.h"
-#include "peridot/lib/testing/test_with_session_storage.h"
-
-namespace modular {
-namespace {
-
-class TestNextListener : public fuchsia::modular::NextListener {
- public:
-  void OnNextResults(
-      std::vector<fuchsia::modular::Suggestion> suggestions) override {
-    last_suggestions_ = std::move(suggestions);
-  }
-
-  void Reset() { last_suggestions_.clear(); }
-
-  void OnProcessingChange(bool processing) override{};
-
-  std::vector<fuchsia::modular::Suggestion>& last_suggestions() {
-    return last_suggestions_;
-  }
-
- private:
-  std::vector<fuchsia::modular::Suggestion> last_suggestions_;
-};
-
-class TestInterruptionListener : public fuchsia::modular::InterruptionListener {
- public:
-  void OnInterrupt(fuchsia::modular::Suggestion suggestion) override {
-    last_suggestion_ = std::move(suggestion);
-  }
-
-  fuchsia::modular::Suggestion& last_suggestion() { return last_suggestion_; }
-
- private:
-  fuchsia::modular::Suggestion last_suggestion_;
-};
-
-class TestNavigationListener : public fuchsia::modular::NavigationListener {
- public:
-  void OnNavigation(fuchsia::modular::NavigationAction navigation) override {
-    last_navigation_action_ = std::move(navigation);
-  }
-
-  fuchsia::modular::NavigationAction last_navigation_action() {
-    return last_navigation_action_;
-  }
-
- private:
-  fuchsia::modular::NavigationAction last_navigation_action_;
-};
-
-class TestContextReaderImpl : public fuchsia::modular::ContextReader {
- public:
-  TestContextReaderImpl(
-      fidl::InterfaceRequest<fuchsia::modular::ContextReader> request)
-      : binding_(this, std::move(request)) {}
-
- private:
-  // |fuchsia::modular::ContextReader|
-  void Subscribe(fuchsia::modular::ContextQuery query,
-                 fidl::InterfaceHandle<fuchsia::modular::ContextListener>
-                     listener) override {}
-
-  // |fuchsia::modular::ContextReader|
-  void Get(fuchsia::modular::ContextQuery query,
-           fuchsia::modular::ContextReader::GetCallback callback) override {}
-
-  fidl::Binding<fuchsia::modular::ContextReader> binding_;
-};
-
-class SuggestionEngineTest : public testing::TestWithSessionStorage {
- public:
-  SuggestionEngineTest()
-      : next_listener_binding_(&next_listener_),
-        interruption_listener_binding_(&interruption_listener_),
-        navigation_listener_binding_(&navigation_listener_) {}
-
-  void SetUp() override {
-    TestWithSessionStorage::SetUp();
-
-    // Get an unbound handles. We won't make use of these interfaces during the
-    // test except for our mock puppet master.
-    fuchsia::modular::ContextReaderPtr context_reader;
-    context_reader_impl_ =
-        std::make_unique<TestContextReaderImpl>(context_reader.NewRequest());
-
-    session_storage_ = MakeSessionStorage("page");
-    puppet_master_impl_ = std::make_unique<PuppetMasterImpl>(
-        session_storage_.get(), &test_executor_);
-    fuchsia::modular::PuppetMasterPtr puppet_master;
-    puppet_master_impl_->Connect(puppet_master.NewRequest());
-
-    suggestion_engine_impl_ = std::make_unique<SuggestionEngineImpl>(
-        std::move(context_reader), std::move(puppet_master));
-    suggestion_engine_impl_->Connect(engine_ptr_.NewRequest());
-    suggestion_engine_impl_->Connect(provider_ptr_.NewRequest());
-    suggestion_engine_impl_->Connect(debug_ptr_.NewRequest());
-
-    proposal_publisher_ = std::make_unique<ProposalPublisherImpl>(
-        suggestion_engine_impl_.get(), "Proposinator");
-  }
-
- protected:
-  void StartListeningForNext(int max_suggestions) {
-    suggestion_engine_impl_->SubscribeToNext(
-        next_listener_binding_.NewBinding(), max_suggestions);
-    next_listener_.Reset();
-  }
-
-  void StartListeningForInterruptions() {
-    suggestion_engine_impl_->SubscribeToInterruptions(
-        interruption_listener_binding_.NewBinding());
-  }
-
-  void StartListeningForNavigation() {
-    suggestion_engine_impl_->SubscribeToNavigation(
-        navigation_listener_binding_.NewBinding());
-  }
-
-  fuchsia::modular::Proposal MakeProposal(const std::string& id,
-                                          const std::string& headline) {
-    fuchsia::modular::SuggestionDisplay display;
-    display.headline = headline;
-    fuchsia::modular::Proposal proposal;
-    proposal.id = id;
-    proposal.display = std::move(display);
-    return proposal;
-  }
-
-  fuchsia::modular::Proposal MakeInterruptionProposal(
-      const std::string id, const std::string& headline,
-      fuchsia::modular::AnnoyanceType annoyance =
-          fuchsia::modular::AnnoyanceType::INTERRUPT) {
-    auto proposal = MakeProposal(id, headline);
-    proposal.display.annoyance = annoyance;
-    return proposal;
-  }
-
-  fuchsia::modular::Proposal MakeRichProposal(const std::string id,
-                                              const std::string& headline) {
-    auto proposal = MakeProposal(id, headline);
-    proposal.wants_rich_suggestion = true;
-    return proposal;
-  }
-
-  void AddAddModuleAction(fuchsia::modular::Proposal* proposal,
-                          const std::string& mod_name,
-                          const std::string& mod_url,
-                          const std::string& parent_mod = "",
-                          fuchsia::modular::SurfaceArrangement arrangement =
-                              fuchsia::modular::SurfaceArrangement::NONE) {
-    fuchsia::modular::Intent intent;
-    intent.handler = mod_url;
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back(mod_name);
-    add_mod.intent = std::move(intent);
-    if (!parent_mod.empty()) {
-      add_mod.surface_parent_mod_name.push_back(parent_mod);
-    }
-    add_mod.surface_relation.arrangement = arrangement;
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-    proposal->on_selected.push_back(std::move(command));
-  }
-
-  void AddFocusStoryAction(fuchsia::modular::Proposal* proposal) {
-    fuchsia::modular::SetFocusState focus_story;
-    focus_story.focused = true;
-    fuchsia::modular::StoryCommand command;
-    command.set_set_focus_state(std::move(focus_story));
-    proposal->on_selected.push_back(std::move(command));
-  }
-
-  void AddFocusModuleAction(fuchsia::modular::Proposal* proposal,
-                            const std::string& mod_name) {
-    fuchsia::modular::FocusMod focus_mod;
-    focus_mod.mod_name.push_back(mod_name);
-    fuchsia::modular::StoryCommand command;
-    command.set_focus_mod(std::move(focus_mod));
-    proposal->on_selected.push_back(std::move(command));
-  }
-
-  void AddSetLinkValueAction(fuchsia::modular::Proposal* proposal,
-                             const std::string& mod_name,
-                             const std::string& link_name,
-                             const std::string& link_value) {
-    fuchsia::modular::LinkPath link_path;
-    link_path.module_path.push_back(mod_name);
-    link_path.link_name = link_name;
-    fuchsia::modular::SetLinkValue set_link_value;
-    set_link_value.path = std::move(link_path);
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(link_value, &vmo));
-    set_link_value.value =
-        std::make_unique<fuchsia::mem::Buffer>(std::move(vmo).ToTransport());
-
-    fuchsia::modular::StoryCommand command;
-    command.set_set_link_value(std::move(set_link_value));
-    proposal->on_selected.push_back(std::move(command));
-  }
-
-  std::unique_ptr<ProposalPublisherImpl> proposal_publisher_;
-  std::unique_ptr<SessionStorage> session_storage_;
-  std::unique_ptr<PuppetMasterImpl> puppet_master_impl_;
-  std::unique_ptr<SuggestionEngineImpl> suggestion_engine_impl_;
-  std::unique_ptr<TestContextReaderImpl> context_reader_impl_;
-  fuchsia::modular::SuggestionEnginePtr engine_ptr_;
-  fuchsia::modular::SuggestionProviderPtr provider_ptr_;
-  fuchsia::modular::SuggestionDebugPtr debug_ptr_;
-  testing::TestStoryCommandExecutor test_executor_;
-
-  TestNextListener next_listener_;
-  fidl::Binding<fuchsia::modular::NextListener> next_listener_binding_;
-
-  TestInterruptionListener interruption_listener_;
-  fidl::Binding<fuchsia::modular::InterruptionListener>
-      interruption_listener_binding_;
-
-  TestNavigationListener navigation_listener_;
-  fidl::Binding<fuchsia::modular::NavigationListener>
-      navigation_listener_binding_;
-};
-
-TEST_F(SuggestionEngineTest, AddNextProposal) {
-  StartListeningForNext(10);
-
-  // Add proposal.
-  auto proposal = MakeProposal("1", "test_proposal");
-  proposal_publisher_->Propose(std::move(proposal));
-
-  RunLoopUntilIdle();
-
-  // We should see proposal in listener.
-  auto& results = next_listener_.last_suggestions();
-  ASSERT_EQ(1u, results.size());
-  EXPECT_EQ("test_proposal", results.at(0).display.headline);
-}
-
-TEST_F(SuggestionEngineTest, OnlyGetsMaxProposals) {
-  StartListeningForNext(2);
-
-  // Add three proposals.
-  proposal_publisher_->Propose(MakeProposal("1", "foo"));
-  proposal_publisher_->Propose(MakeProposal("2", "bar"));
-  proposal_publisher_->Propose(MakeProposal("3", "baz"));
-
-  RunLoopUntilIdle();
-
-  // We should see 2 proposals in listener.
-  auto& results = next_listener_.last_suggestions();
-  ASSERT_EQ(2u, results.size());
-  EXPECT_EQ("foo", results.at(0).display.headline);
-  EXPECT_EQ("bar", results.at(1).display.headline);
-}
-
-TEST_F(SuggestionEngineTest, AddNextProposalInterruption) {
-  StartListeningForNext(10);
-  StartListeningForInterruptions();
-
-  // Add interruptive proposal.
-  proposal_publisher_->Propose(MakeInterruptionProposal("1", "foo"));
-
-  RunLoopUntilIdle();
-
-  // Ensure notification.
-  auto& last_interruption = interruption_listener_.last_suggestion();
-  EXPECT_EQ("foo", last_interruption.display.headline);
-
-  // Suggestion shouldn't be in NEXT yet since it's interrupting.
-  auto& results = next_listener_.last_suggestions();
-  EXPECT_TRUE(results.empty());
-}
-
-TEST_F(SuggestionEngineTest, AddNextProposalRichNotAllowed) {
-  StartListeningForNext(10);
-
-  // Register publisher that can't submit rich proposals (see the url) and add
-  // proposal.
-  auto publisher = std::make_unique<ProposalPublisherImpl>(
-      suggestion_engine_impl_.get(), "foo");
-  publisher->Propose(MakeRichProposal("1", "foo"));
-
-  RunLoopUntilIdle();
-
-  // Suggestion shouldn't be rich: it has no preloaded story_id.
-  auto& results = next_listener_.last_suggestions();
-  ASSERT_EQ(1u, results.size());
-  EXPECT_EQ("foo", results.at(0).display.headline);
-  EXPECT_TRUE(results.at(0).preloaded_story_id->empty());
-}
-
-TEST_F(SuggestionEngineTest, AddNextProposalRich) {
-  StartListeningForNext(10);
-
-  // Add proposal.
-  auto proposal = MakeRichProposal("1", "foo_rich");
-  AddAddModuleAction(&proposal, "mod_name", "mod_url", "parent_mod",
-                     fuchsia::modular::SurfaceArrangement::ONTOP);
-  proposal_publisher_->Propose(std::move(proposal));
-
-  RunLoopUntil([&] { return next_listener_.last_suggestions().size() == 1; });
-
-  // Suggestion should be rich: it has a preloaded story_id.
-  auto& results = next_listener_.last_suggestions();
-  EXPECT_EQ("foo_rich", results.at(0).display.headline);
-  EXPECT_FALSE(results.at(0).preloaded_story_id->empty());
-  auto story_name = results.at(0).preloaded_story_id;
-
-  // The executor should have been called with a command to add a mod and
-  // created a story.
-  EXPECT_EQ(1, test_executor_.execute_count());
-  EXPECT_FALSE(test_executor_.last_story_id()->empty());
-  auto& commands = test_executor_.last_commands();
-  ASSERT_EQ(1u, commands.size());
-  ASSERT_TRUE(commands.at(0).is_add_mod());
-
-  auto& command = commands.at(0).add_mod();
-  ASSERT_EQ(1u, command.mod_name.size());
-  EXPECT_EQ("mod_name", command.mod_name.at(0));
-  EXPECT_EQ("mod_url", command.intent.handler);
-  EXPECT_EQ(fuchsia::modular::SurfaceArrangement::ONTOP,
-            command.surface_relation.arrangement);
-  ASSERT_EQ(1u, command.surface_parent_mod_name->size());
-  EXPECT_EQ("parent_mod", command.surface_parent_mod_name->at(0));
-
-  // Ensure the story was created as kind-of-proto story.
-  bool done{};
-  session_storage_->GetStoryData(story_name)
-      ->Then([&](fuchsia::modular::internal::StoryDataPtr story_data) {
-        ASSERT_NE(nullptr, story_data);
-        EXPECT_TRUE(story_data->story_options.kind_of_proto_story);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SuggestionEngineTest, AddNextProposalRichReusesStory) {
-  StartListeningForNext(10);
-  auto story_name = "rich_story";
-
-  // Add proposal.
-  {
-    auto proposal = MakeRichProposal("1", "foo_rich");
-    proposal.story_name = story_name;
-    AddAddModuleAction(&proposal, "mod_name", "mod_url", "parent_mod",
-                       fuchsia::modular::SurfaceArrangement::ONTOP);
-    proposal_publisher_->Propose(std::move(proposal));
-  }
-
-  RunLoopUntil([&] { return next_listener_.last_suggestions().size() == 1; });
-
-  // Up to here we expect the same as in the previous test (AddNextProposalRich)
-  // Submitting a new proposal with the same story_name should result on its
-  // story being directly updated and no notifications of new suggestions.
-  next_listener_.Reset();
-  test_executor_.Reset();
-  {
-    auto proposal = MakeRichProposal("1", "foo_rich");
-    proposal.story_name = story_name;
-    AddAddModuleAction(&proposal, "mod_name", "mod_url", "parent_mod",
-                       fuchsia::modular::SurfaceArrangement::COPRESENT);
-    proposal_publisher_->Propose(std::move(proposal));
-  }
-
-  RunLoopUntil([&] { return test_executor_.execute_count() == 1; });
-  EXPECT_TRUE(next_listener_.last_suggestions().empty());
-
-  // The executor should have been called with a command to add a mod and
-  // created a story.
-  EXPECT_EQ(1, test_executor_.execute_count());
-  EXPECT_FALSE(test_executor_.last_story_id()->empty());
-  auto& commands = test_executor_.last_commands();
-  ASSERT_EQ(1u, commands.size());
-  ASSERT_TRUE(commands.at(0).is_add_mod());
-
-  auto& command = commands.at(0).add_mod();
-  ASSERT_EQ(1u, command.mod_name.size());
-  EXPECT_EQ("mod_name", command.mod_name.at(0));
-  EXPECT_EQ("mod_url", command.intent.handler);
-  EXPECT_EQ(fuchsia::modular::SurfaceArrangement::COPRESENT,
-            command.surface_relation.arrangement);
-  ASSERT_EQ(1u, command.surface_parent_mod_name->size());
-  EXPECT_EQ("parent_mod", command.surface_parent_mod_name->at(0));
-
-  // Ensure the story is there.
-  bool done{};
-  session_storage_->GetStoryData(story_name)
-      ->Then([&](fuchsia::modular::internal::StoryDataPtr story_data) {
-        ASSERT_NE(nullptr, story_data);
-        EXPECT_TRUE(story_data->story_options.kind_of_proto_story);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SuggestionEngineTest, AddNextProposalRichRespectsStoryName) {
-  StartListeningForNext(10);
-
-  // Add proposal.
-  auto proposal = MakeRichProposal("1", "foo_rich");
-  proposal.story_name = "foo_story";
-  AddAddModuleAction(&proposal, "mod_name", "mod_url", "parent_mod",
-                     fuchsia::modular::SurfaceArrangement::ONTOP);
-  proposal_publisher_->Propose(std::move(proposal));
-
-  RunLoopUntil([&] { return next_listener_.last_suggestions().size() == 1; });
-
-  // Suggestion should be rich: it has a preloaded story_id.
-  auto& results = next_listener_.last_suggestions();
-  EXPECT_EQ("foo_story", results.at(0).preloaded_story_id);
-
-  // The executor should have been called with a command to add a mod and
-  // created a story.
-  EXPECT_EQ(1, test_executor_.execute_count());
-  EXPECT_EQ("foo_story", test_executor_.last_story_id());
-
-  // Ensure the story was created as kind-of-proto story.
-  bool done{};
-  session_storage_->GetStoryData("foo_story")
-      ->Then([&](fuchsia::modular::internal::StoryDataPtr story_data) {
-        ASSERT_NE(nullptr, story_data);
-        EXPECT_TRUE(story_data->story_options.kind_of_proto_story);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SuggestionEngineTest, RemoveNextProposal) {
-  StartListeningForNext(10);
-
-  // Add proposal
-  proposal_publisher_->Propose(MakeProposal("1", "foo"));
-
-  // Remove proposal
-  proposal_publisher_->Remove("1");
-
-  RunLoopUntilIdle();
-
-  auto& results = next_listener_.last_suggestions();
-  EXPECT_TRUE(results.empty());
-}
-
-TEST_F(SuggestionEngineTest, RemoveNextProposalRich) {
-  StartListeningForNext(10);
-
-  // Add proposal.
-  auto proposal = MakeRichProposal("1", "foo_rich");
-  proposal.story_name = "foo_story";
-  proposal_publisher_->Propose(std::move(proposal));
-
-  // TODO(miguelfrde): add an operation queue in the suggestion engine and
-  // remove this wait.
-  RunLoopUntil([&] { return next_listener_.last_suggestions().size() == 1; });
-
-  // Remove proposal.
-  proposal_publisher_->Remove("1");
-
-  RunLoopUntil([&] { return next_listener_.last_suggestions().empty(); });
-
-  // The story that at some point was created when adding the rich suggestion
-  // (not tested since other tests already cover it) should have been deleted.
-  bool done{};
-  session_storage_->GetStoryData("foo_story")
-      ->Then([&](fuchsia::modular::internal::StoryDataPtr story_data) {
-        EXPECT_EQ(nullptr, story_data);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SuggestionEngineTest, NotifyInteractionSelected) {
-  StartListeningForNext(10);
-
-  // Add proposal. One action of each action we support that translates to
-  // StoryCommand is added. This set of actions doesn't really make sense in an
-  // actual use case.
-  auto proposal = MakeProposal("1", "foo");
-  AddAddModuleAction(&proposal, "mod_name", "mod_url");
-  AddFocusStoryAction(&proposal);
-  AddFocusModuleAction(&proposal, "mod_name");
-  AddSetLinkValueAction(&proposal, "mod_name", "foo_link_name", "foo_value");
-  proposal_publisher_->Propose(std::move(proposal));
-
-  RunLoopUntilIdle();
-
-  // Get id of the resulting suggestion.
-  auto& results = next_listener_.last_suggestions();
-  ASSERT_EQ(1u, results.size());
-  auto suggestion_id = results.at(0).uuid;
-
-  fuchsia::modular::Interaction interaction;
-  interaction.type = fuchsia::modular::InteractionType::SELECTED;
-  suggestion_engine_impl_->NotifyInteraction(suggestion_id,
-                                             std::move(interaction));
-
-  RunLoopUntil([&] { return test_executor_.execute_count() == 1; });
-
-  // The executor should have been called with the right commands.
-  auto story_id = test_executor_.last_story_id();
-
-  auto& commands = test_executor_.last_commands();
-  ASSERT_EQ(4u, commands.size());
-  EXPECT_TRUE(commands.at(0).is_add_mod());
-  EXPECT_TRUE(commands.at(1).is_set_focus_state());
-  EXPECT_TRUE(commands.at(2).is_focus_mod());
-  EXPECT_TRUE(commands.at(3).is_set_link_value());
-
-  auto& add_mod = commands.at(0).add_mod();
-  ASSERT_EQ(1u, add_mod.mod_name.size());
-  EXPECT_EQ("mod_name", add_mod.mod_name.at(0));
-  EXPECT_EQ("mod_url", add_mod.intent.handler);
-
-  auto& set_focus_state = commands.at(1).set_focus_state();
-  EXPECT_TRUE(set_focus_state.focused);
-
-  auto& focus_mod = commands.at(2).focus_mod();
-  ASSERT_EQ(1u, focus_mod.mod_name.size());
-  EXPECT_EQ("mod_name", focus_mod.mod_name.at(0));
-
-  auto& set_link_value = commands.at(3).set_link_value();
-  ASSERT_EQ(1u, set_link_value.path.module_path.size());
-  EXPECT_EQ("mod_name", set_link_value.path.module_path.at(0));
-  EXPECT_EQ("foo_link_name", set_link_value.path.link_name);
-  std::string link_value;
-  FXL_CHECK(fsl::StringFromVmo(*set_link_value.value, &link_value));
-  EXPECT_EQ("foo_value", link_value);
-
-  // Ensure a regular story was created when we executed the proposal.
-  bool done{};
-  session_storage_->GetStoryData(story_id)->Then(
-      [&](fuchsia::modular::internal::StoryDataPtr story_data) {
-        EXPECT_NE(nullptr, story_data);
-        EXPECT_FALSE(story_data->story_options.kind_of_proto_story);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-
-  // We should have been notified with no suggestions after selecting this
-  // suggestion.
-  auto& listener_results = next_listener_.last_suggestions();
-  EXPECT_TRUE(listener_results.empty());
-}
-
-TEST_F(SuggestionEngineTest, NotifyInteractionSelectedWithStoryName) {
-  StartListeningForNext(10);
-
-  // Add proposal.
-  auto proposal = MakeProposal("1", "foo");
-  proposal.story_name = "foo_story";
-  AddFocusModuleAction(&proposal, "mod_name");
-  proposal_publisher_->Propose(std::move(proposal));
-
-  RunLoopUntilIdle();
-
-  // Get id of the resulting suggestion.
-  auto& results = next_listener_.last_suggestions();
-  ASSERT_EQ(1u, results.size());
-  auto suggestion_id = results.at(0).uuid;
-
-  // Select suggestion.
-  fuchsia::modular::Interaction interaction;
-  interaction.type = fuchsia::modular::InteractionType::SELECTED;
-  suggestion_engine_impl_->NotifyInteraction(suggestion_id,
-                                             std::move(interaction));
-
-  RunLoopUntil([&] { return test_executor_.execute_count() == 1; });
-
-  // The executor should have been called with the command associated to the
-  // action added above.
-  EXPECT_EQ("foo_story", test_executor_.last_story_id());
-
-  auto& commands = test_executor_.last_commands();
-  ASSERT_EQ(1u, commands.size());
-  EXPECT_TRUE(commands.at(0).is_focus_mod());
-  auto& focus_mod = commands.at(0).focus_mod();
-  ASSERT_EQ(1u, focus_mod.mod_name.size());
-  EXPECT_EQ("mod_name", focus_mod.mod_name.at(0));
-
-  // Ensure a regular story was created when we executed the proposal.
-  bool done{};
-  session_storage_->GetStoryData("foo_story")
-      ->Then([&](fuchsia::modular::internal::StoryDataPtr story_data) {
-        EXPECT_NE(nullptr, story_data);
-        EXPECT_FALSE(story_data->story_options.kind_of_proto_story);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-
-  // We should have been notified with no suggestions after selecting this
-  // suggestion.
-  auto& listener_results = next_listener_.last_suggestions();
-  EXPECT_TRUE(listener_results.empty());
-}
-
-TEST_F(SuggestionEngineTest, NotifyInteractionDismissed) {
-  StartListeningForNext(10);
-
-  // Add proposal.
-  auto proposal = MakeProposal("1", "foo");
-  AddFocusModuleAction(&proposal, "mod_name");
-  proposal_publisher_->Propose(std::move(proposal));
-
-  RunLoopUntilIdle();
-
-  // Get id of the resulting suggestion.
-  auto& results = next_listener_.last_suggestions();
-  ASSERT_EQ(1u, results.size());
-  auto suggestion_id = results.at(0).uuid;
-
-  fuchsia::modular::Interaction interaction;
-  interaction.type = fuchsia::modular::InteractionType::DISMISSED;
-  suggestion_engine_impl_->NotifyInteraction(suggestion_id,
-                                             std::move(interaction));
-
-  RunLoopUntilIdle();
-
-  // The executor shouldn't have been called.
-  EXPECT_EQ(0, test_executor_.execute_count());
-
-  // We should have been notified with no suggestions after dismissing this
-  // suggestion.
-  auto& listener_results = next_listener_.last_suggestions();
-  EXPECT_TRUE(listener_results.empty());
-}
-
-TEST_F(SuggestionEngineTest, NotifyInteractionDismissedWithStoryName) {
-  StartListeningForNext(10);
-
-  // Add proposal.
-  auto proposal = MakeProposal("1", "foo");
-  proposal.story_name = "foo_story";
-  AddFocusModuleAction(&proposal, "mod_name");
-  proposal_publisher_->Propose(std::move(proposal));
-
-  RunLoopUntilIdle();
-
-  // Get id of the resulting suggestion.
-  auto& results = next_listener_.last_suggestions();
-  ASSERT_EQ(1u, results.size());
-  auto suggestion_id = results.at(0).uuid;
-
-  fuchsia::modular::Interaction interaction;
-  interaction.type = fuchsia::modular::InteractionType::DISMISSED;
-  suggestion_engine_impl_->NotifyInteraction(suggestion_id,
-                                             std::move(interaction));
-
-  RunLoopUntilIdle();
-
-  // The executor shouldn't have been called.
-  EXPECT_EQ(0, test_executor_.execute_count());
-
-  // We should have been notified with no suggestions after dismissing this
-  // suggestion.
-  auto& listener_results = next_listener_.last_suggestions();
-  EXPECT_TRUE(listener_results.empty());
-
-  // Ensure no story was created when we executed the proposal.
-  bool done{};
-  session_storage_->GetStoryData("foo_story")
-      ->Then([&](fuchsia::modular::internal::StoryDataPtr story_data) {
-        EXPECT_EQ(nullptr, story_data);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SuggestionEngineTest, NotifyInteractionSelectedRich) {
-  StartListeningForNext(10);
-
-  // Add proposal.
-  auto proposal = MakeRichProposal("1", "foo_rich");
-  AddFocusModuleAction(&proposal, "mod_name");
-  proposal_publisher_->Propose(std::move(proposal));
-
-  RunLoopUntil([&] { return next_listener_.last_suggestions().size() == 1; });
-
-  // Get id of the resulting suggestion.
-  auto& results = next_listener_.last_suggestions();
-  auto suggestion_id = results.at(0).uuid;
-  EXPECT_FALSE(results.at(0).preloaded_story_id->empty());
-  auto story_name = results.at(0).preloaded_story_id;
-
-  test_executor_.Reset();
-
-  fuchsia::modular::Interaction interaction;
-  interaction.type = fuchsia::modular::InteractionType::SELECTED;
-  suggestion_engine_impl_->NotifyInteraction(suggestion_id,
-                                             std::move(interaction));
-
-  RunLoopUntilIdle();
-
-  // The executor should have been called for a second time with a command to
-  // promote the story that the adding of the the proposal created.
-  EXPECT_EQ(test_executor_.execute_count(), 0);
-
-  // Ensure the story that was created when we adedd the rich proposal still
-  // exists.
-  bool done{};
-  session_storage_->GetStoryData(story_name)
-      ->Then([&](fuchsia::modular::internal::StoryDataPtr story_data) {
-        EXPECT_NE(nullptr, story_data);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SuggestionEngineTest, NotifyInteractionDismissedRich) {
-  StartListeningForNext(10);
-
-  // Add proposal.
-  auto proposal = MakeRichProposal("1", "foo_rich");
-  AddFocusModuleAction(&proposal, "mod_name");
-  proposal_publisher_->Propose(std::move(proposal));
-
-  RunLoopUntil([&] { return next_listener_.last_suggestions().size() == 1; });
-
-  // Get id and story of the resulting suggestion.
-  auto& results = next_listener_.last_suggestions();
-  EXPECT_EQ(1, test_executor_.execute_count());
-  auto suggestion_id = results.at(0).uuid;
-
-  EXPECT_FALSE(results.at(0).preloaded_story_id->empty());
-  auto story_name = results.at(0).preloaded_story_id;
-
-  test_executor_.Reset();
-
-  fuchsia::modular::Interaction interaction;
-  interaction.type = fuchsia::modular::InteractionType::DISMISSED;
-  suggestion_engine_impl_->NotifyInteraction(suggestion_id,
-                                             std::move(interaction));
-
-  RunLoopUntil([&] { return next_listener_.last_suggestions().empty(); });
-
-  // The executor shouldn't have been called again.
-  EXPECT_EQ(0, test_executor_.execute_count());
-
-  // Ensure the story that was created when we added the rich proposal is gone.
-  bool done{};
-  session_storage_->GetStoryData(story_name)
-      ->Then([&](fuchsia::modular::internal::StoryDataPtr story_data) {
-        EXPECT_EQ(nullptr, story_data);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-TEST_F(SuggestionEngineTest, NotifyInteractionSnoozedInterruption) {
-  StartListeningForInterruptions();
-  StartListeningForNext(10);
-
-  // Add interruptive proposal.
-  proposal_publisher_->Propose(MakeInterruptionProposal("1", "foo"));
-
-  RunLoopUntilIdle();
-
-  // Get id of the resulting suggestion.
-  auto& suggestion = interruption_listener_.last_suggestion();
-  EXPECT_FALSE(suggestion.uuid.empty());
-  auto suggestion_id = suggestion.uuid;
-
-  EXPECT_TRUE(next_listener_.last_suggestions().empty());
-
-  fuchsia::modular::Interaction interaction;
-  interaction.type = fuchsia::modular::InteractionType::SNOOZED;
-  suggestion_engine_impl_->NotifyInteraction(suggestion_id,
-                                             std::move(interaction));
-
-  RunLoopUntil([&] { return next_listener_.last_suggestions().size() == 1; });
-
-  // The suggestion should still be there after being notified.
-  auto& listener_results = next_listener_.last_suggestions();
-  EXPECT_EQ(suggestion_id, listener_results.at(0).uuid);
-}
-
-TEST_F(SuggestionEngineTest, NotifyInteractionExpiredInterruption) {
-  StartListeningForInterruptions();
-  StartListeningForNext(10);
-
-  // Add interruptive proposal.
-  proposal_publisher_->Propose(MakeInterruptionProposal("1", "foo"));
-
-  RunLoopUntilIdle();
-
-  // Get id of the resulting suggestion.
-  auto& suggestion = interruption_listener_.last_suggestion();
-  EXPECT_FALSE(suggestion.uuid.empty());
-  auto suggestion_id = suggestion.uuid;
-
-  EXPECT_TRUE(next_listener_.last_suggestions().empty());
-
-  fuchsia::modular::Interaction interaction;
-  interaction.type = fuchsia::modular::InteractionType::EXPIRED;
-  suggestion_engine_impl_->NotifyInteraction(suggestion_id,
-                                             std::move(interaction));
-
-  RunLoopUntilIdle();
-
-  // The suggestion should still be there after being notified.
-  auto& listener_results = next_listener_.last_suggestions();
-  EXPECT_EQ(1u, listener_results.size());
-  EXPECT_EQ(suggestion_id, listener_results.at(0).uuid);
-}
-
-TEST_F(SuggestionEngineTest, NotifyInteractionSelectedInterruption) {
-  StartListeningForInterruptions();
-  StartListeningForNext(10);
-
-  // Add interruptive proposal.
-  auto proposal = MakeInterruptionProposal("1", "foo");
-  AddFocusModuleAction(&proposal, "mod_name");
-  proposal_publisher_->Propose(std::move(proposal));
-
-  RunLoopUntilIdle();
-
-  auto& suggestion = interruption_listener_.last_suggestion();
-  EXPECT_FALSE(suggestion.uuid.empty());
-  auto suggestion_id = suggestion.uuid;
-
-  fuchsia::modular::Interaction interaction;
-  interaction.type = fuchsia::modular::InteractionType::SELECTED;
-  suggestion_engine_impl_->NotifyInteraction(suggestion_id,
-                                             std::move(interaction));
-
-  RunLoopUntil([&] { return test_executor_.execute_count() == 1; });
-
-  // The executor should have been called with a command to add a mod and
-  // created a story.
-  auto story_id = test_executor_.last_story_id();
-  auto& commands = test_executor_.last_commands();
-  ASSERT_EQ(1u, commands.size());
-  auto& focus_mod = commands.at(0).focus_mod();
-  ASSERT_EQ(1u, focus_mod.mod_name.size());
-  EXPECT_EQ("mod_name", focus_mod.mod_name.at(0));
-
-  // Ensure a regular story was created when we executed the proposal.
-  bool done{};
-  session_storage_->GetStoryData(story_id)->Then(
-      [&](fuchsia::modular::internal::StoryDataPtr story_data) {
-        EXPECT_NE(nullptr, story_data);
-        EXPECT_FALSE(story_data->story_options.kind_of_proto_story);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-
-  // The suggestion shouldn't be there anymore.
-  EXPECT_TRUE(next_listener_.last_suggestions().empty());
-}
-
-TEST_F(SuggestionEngineTest, NotifyInteractionDismissedInterruption) {
-  StartListeningForInterruptions();
-  StartListeningForNext(10);
-
-  // Add interruptive proposal.
-  auto proposal = MakeInterruptionProposal("1", "foo");
-  AddFocusModuleAction(&proposal, "mod_name");
-  proposal_publisher_->Propose(std::move(proposal));
-
-  RunLoopUntilIdle();
-
-  auto& suggestion = interruption_listener_.last_suggestion();
-  EXPECT_FALSE(suggestion.uuid.empty());
-  auto suggestion_id = suggestion.uuid;
-
-  fuchsia::modular::Interaction interaction;
-  interaction.type = fuchsia::modular::InteractionType::DISMISSED;
-  suggestion_engine_impl_->NotifyInteraction(suggestion_id,
-                                             std::move(interaction));
-
-  RunLoopUntilIdle();
-
-  // The executor shouldn't have been called.
-  EXPECT_EQ(0, test_executor_.execute_count());
-
-  // The suggestion shouldn't be there anymore.
-  EXPECT_TRUE(next_listener_.last_suggestions().empty());
-}
-
-TEST_F(SuggestionEngineTest, ProposeNavigation) {
-  StartListeningForNavigation();
-
-  proposal_publisher_->ProposeNavigation(
-      fuchsia::modular::NavigationAction::HOME);
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(fuchsia::modular::NavigationAction::HOME,
-            navigation_listener_.last_navigation_action());
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/bin/suggestion_engine/suggestion_engine_main.cc b/bin/suggestion_engine/suggestion_engine_main.cc
deleted file mode 100644
index 1dcbedf..0000000
--- a/bin/suggestion_engine/suggestion_engine_main.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/bin/suggestion_engine/debug.h"
-#include "peridot/bin/suggestion_engine/suggestion_engine_impl.h"
-
-namespace modular {
-
-class SuggestionEngineApp {
- public:
-  SuggestionEngineApp(component::StartupContext* const context) {
-    fuchsia::modular::ContextReaderPtr context_reader;
-    fuchsia::modular::PuppetMasterPtr puppet_master;
-
-    context->ConnectToEnvironmentService(context_reader.NewRequest());
-    context->ConnectToEnvironmentService(puppet_master.NewRequest());
-
-    engine_impl_ = std::make_unique<modular::SuggestionEngineImpl>(
-        std::move(context_reader), std::move(puppet_master));
-
-    context->outgoing().AddPublicService<fuchsia::modular::SuggestionEngine>(
-        [this](fidl::InterfaceRequest<fuchsia::modular::SuggestionEngine>
-                   request) { engine_impl_->Connect(std::move(request)); });
-    context->outgoing().AddPublicService<fuchsia::modular::SuggestionProvider>(
-        [this](fidl::InterfaceRequest<fuchsia::modular::SuggestionProvider>
-                   request) { engine_impl_->Connect(std::move(request)); });
-    context->outgoing().AddPublicService<fuchsia::modular::SuggestionDebug>(
-        [this](
-            fidl::InterfaceRequest<fuchsia::modular::SuggestionDebug> request) {
-          engine_impl_->Connect(std::move(request));
-        });
-  }
-
-  void Terminate(const std::function<void()>& done) { done(); }
-
-  fxl::WeakPtr<SuggestionDebugImpl> debug() { return engine_impl_->debug(); }
-
- private:
-  std::unique_ptr<SuggestionEngineImpl> engine_impl_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SuggestionEngineApp);
-};
-
-}  // namespace modular
-
-int main(int argc, const char** argv) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  auto suggestion_engine =
-      std::make_unique<modular::SuggestionEngineApp>(context.get());
-
-  fxl::WeakPtr<modular::SuggestionDebugImpl> debug = suggestion_engine->debug();
-  debug->GetIdleWaiter()->SetLoop(&loop);
-
-  modular::AppDriver<modular::SuggestionEngineApp> driver(
-      context->outgoing().deprecated_services(), std::move(suggestion_engine),
-      [&loop] { loop.Quit(); });
-
-  // The |WaitUntilIdle| debug functionality escapes the main message loop to
-  // perform its test.
-  do {
-    loop.Run();
-    loop.ResetQuit();
-  } while (debug && debug->GetIdleWaiter()->FinishIdleCheck());
-
-  return 0;
-}
diff --git a/bin/suggestion_engine/suggestion_prototype.cc b/bin/suggestion_engine/suggestion_prototype.cc
deleted file mode 100644
index 1139698..0000000
--- a/bin/suggestion_engine/suggestion_prototype.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/bin/suggestion_engine/suggestion_prototype.h"
-
-#include <sstream>
-
-#include <lib/fidl/cpp/clone.h>
-
-namespace modular {
-
-std::string short_proposal_str(const SuggestionPrototype& prototype) {
-  std::ostringstream str;
-  str << "proposal " << prototype.proposal.id << " from "
-      << prototype.source_url;
-  return str.str();
-}
-
-fuchsia::modular::Suggestion CreateSuggestion(
-    const SuggestionPrototype& prototype) {
-  fuchsia::modular::Suggestion suggestion;
-  suggestion.uuid = prototype.suggestion_id;
-  if (!prototype.preloaded_story_id.empty()) {
-    suggestion.preloaded_story_id = prototype.preloaded_story_id;
-  }
-  fidl::Clone(prototype.proposal.display, &suggestion.display);
-  return suggestion;
-}
-
-}  // namespace modular
diff --git a/bin/suggestion_engine/suggestion_prototype.h b/bin/suggestion_engine/suggestion_prototype.h
deleted file mode 100644
index 9a94ce0..0000000
--- a/bin/suggestion_engine/suggestion_prototype.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_BIN_SUGGESTION_ENGINE_SUGGESTION_PROTOTYPE_H_
-#define PERIDOT_BIN_SUGGESTION_ENGINE_SUGGESTION_PROTOTYPE_H_
-
-#include <strstream>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/zx/time.h>
-
-namespace modular {
-
-struct SuggestionPrototype {
-  std::string suggestion_id;
-  std::string preloaded_story_id;
-  std::string source_url;
-  zx::time timestamp;
-  fuchsia::modular::Proposal proposal;
-  fidl::InterfacePtr<fuchsia::modular::ProposalListener> bound_listener;
-};
-
-std::string short_proposal_str(const SuggestionPrototype& prototype);
-
-// Creates a partial suggestion from a prototype. Confidence will not be set.
-fuchsia::modular::Suggestion CreateSuggestion(
-    const SuggestionPrototype& prototype);
-
-}  // namespace modular
-
-#endif  // PERIDOT_BIN_SUGGESTION_ENGINE_SUGGESTION_PROTOTYPE_H_
diff --git a/bin/test_driver/BUILD.gn b/bin/test_driver/BUILD.gn
deleted file mode 100644
index f64191c..0000000
--- a/bin/test_driver/BUILD.gn
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-executable_package("test_driver_module") {
-  testonly = true
-
-  sources = [
-    "test_driver_module.cc",
-  ]
-  deps = [
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:test_driver",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-
-  meta = [
-    {
-      path = "meta/test_driver_module.cmx"
-      dest = "test_driver_module.cmx"
-    },
-  ]
-}
diff --git a/bin/test_driver/README.md b/bin/test_driver/README.md
deleted file mode 100644
index e848635..0000000
--- a/bin/test_driver/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# test driver integration test
-
-This test executes a submodule as passed through a link, along with a test
-driver component used to run end-to-end tests on said submodule
-
-The submodule can be any arbitrary mod to test, so long as it is packaged on the
-system
-
-Here is an example test file that runs the `driver_example_mod`:
-
-```json
-{
-  "tests": [
-    {
-      "name": "driver_example_mod_tap_tests",
-      "exec": "basemgr --test --enable_presenter --account_provider=dev_token_manager --base_shell=dev_base_shell --base_shell_args=--test_timeout_ms=60000 --session_shell=dev_session_shell --session_shell_args=--root_module=test_driver_module,--module_under_test_url=driver_example_mod_wrapper,--test_driver_url=driver_example_mod_target_tests --story_shell=dev_story_shell"
-    }
-  ]
-}
-```
diff --git a/bin/test_driver/meta/test_driver_module.cmx b/bin/test_driver/meta/test_driver_module.cmx
deleted file mode 100644
index 779b010..0000000
--- a/bin/test_driver/meta/test_driver_module.cmx
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [
-            "shell"
-        ],
-        "services": [
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore"
-        ]
-    }
-}
diff --git a/bin/test_driver/test_driver_module.cc b/bin/test_driver/test_driver_module.cc
deleted file mode 100644
index 2580de3..0000000
--- a/bin/test_driver/test_driver_module.cc
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fdio/limits.h>
-#include <lib/fdio/util.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/lib/testing/test_driver.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-// The name of the test driver's child module.
-constexpr char kSubModuleName[] = "test_driver_sub_module";
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestPoint initialized_{"test driver module initialized"};
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_host_(module_host) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    initialized_.Pass();
-    sub_module_url_path_.push_back(modular::testing::kModuleUnderTestPath);
-    test_driver_url_path_.push_back(modular::testing::kTestDriverPath);
-    SetUp();
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  // Called via ModuleDriver.
-  TestPoint stopped_{"test driver module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  void SetUp() {
-    module_host_->module_context()->GetLink(
-        modular::testing::kTestDriverLinkName, link_.NewRequest());
-    link_->Get(fidl::VectorPtr(sub_module_url_path_),
-               [this](std::unique_ptr<fuchsia::mem::Buffer> link_data) {
-                 std::string sub_module_url;
-                 FXL_CHECK(fsl::StringFromVmo(*link_data, &sub_module_url));
-                 if (!RunSubModule(sub_module_url)) {
-                   Signal(modular::testing::kTestShutdown);
-                   return;
-                 };
-               });
-  }
-
-  TestPoint test_sub_module_launched_{"sub module launched"};
-
-  // Launches the module which is under test by the test driver.
-  bool RunSubModule(const std::string& sub_module_url) {
-    if (sub_module_url.empty()) {
-      modular::testing::Fail("No sub_module_url supplied.");
-      return false;
-    }
-    rapidjson::Document document;
-    document.Parse(sub_module_url.c_str());
-    fuchsia::modular::Intent intent;
-    intent.handler = document.GetString();
-    module_host_->module_context()->AddModuleToStory(
-        kSubModuleName, std::move(intent), sub_module_.NewRequest(), nullptr,
-        [this](const fuchsia::modular::StartModuleStatus status) {
-          if (status == fuchsia::modular::StartModuleStatus::SUCCESS) {
-            test_sub_module_launched_.Pass();
-            RunTestDriver();
-          }
-        });
-    return true;
-  }
-
-  void CreateTestDriverComponent(const std::string& url) {
-    module_host_->startup_context()->environment()->GetLauncher(
-        test_driver_launcher_.NewRequest());
-    fuchsia::sys::LaunchInfo launch_info;
-    launch_info.url = url;
-    launch_info.directory_request = test_driver_services_.NewRequest();
-    test_driver_launcher_->CreateComponent(
-        std::move(launch_info), test_driver_component_controller_.NewRequest());
-  }
-
-  TestPoint test_driver_completed_{"test driver completed execution"};
-
-  // Checks the return value of the test driver component after it runs to
-  // completion, setting the status of the test based on the exit code: non-zero
-  // is a failure, whereas zero is a success.
-  void RunTestDriver() {
-    link_->Get(
-        fidl::VectorPtr(test_driver_url_path_),
-        [this](std::unique_ptr<fuchsia::mem::Buffer> link_data) {
-          if (link_data == nullptr) {
-            Signal(modular::testing::kTestShutdown);
-            return;
-          }
-          std::string json;
-          FXL_CHECK(fsl::StringFromVmo(*link_data, &json));
-          rapidjson::Document document;
-          document.Parse(json.c_str());
-          std::string test_driver_url = document.GetString();
-          FXL_LOG(INFO) << "TestDriverModule launching test driver for URL: "
-                        << test_driver_url;
-
-          CreateTestDriverComponent(test_driver_url);
-          test_driver_component_controller_.events().OnTerminated =
-              [this](int64_t return_code,
-                     fuchsia::sys::TerminationReason reason) {
-                FXL_LOG(INFO)
-                    << "TestDriverModule test driver returned with code : "
-                    << return_code;
-                if (return_code) {
-                  modular::testing::Fail("Test driver failed.");
-                } else {
-                  test_driver_completed_.Pass();
-                }
-                Signal(modular::testing::kTestShutdown);
-              };
-        });
-  }
-
-  modular::ModuleHost* const module_host_;
-
-  component::Services test_driver_services_;
-  fuchsia::modular::LinkPtr link_;
-  fuchsia::sys::LauncherPtr test_driver_launcher_;
-  fuchsia::sys::ComponentControllerPtr test_driver_component_controller_;
-
-  std::vector<std::string> sub_module_url_path_;
-  std::vector<std::string> test_driver_url_path_;
-
-  fuchsia::modular::ModuleControllerPtr sub_module_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/bin/token_manager/BUILD.gn b/bin/token_manager/BUILD.gn
deleted file mode 100644
index b632f45..0000000
--- a/bin/token_manager/BUILD.gn
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-executable_package("dev_token_manager") {
-  meta = [
-    {
-      path = "meta/dev_token_manager.cmx"
-      dest = "dev_token_manager.cmx"
-    },
-  ]
-
-  sources = [
-    "dev_token_manager.cc",
-  ]
-
-  deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/trace-provider",
-  ]
-}
diff --git a/bin/token_manager/README.md b/bin/token_manager/README.md
deleted file mode 100644
index 730757f..0000000
--- a/bin/token_manager/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# dev_token_manager
-
-This implementation of the `TokenManager` and related services is used in all
-integration tests. See `//peridot/tests/modular_tests.json` for how.
diff --git a/bin/token_manager/dev_token_manager.cc b/bin/token_manager/dev_token_manager.cc
deleted file mode 100644
index babb2f0..0000000
--- a/bin/token_manager/dev_token_manager.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/auth/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/log_settings_command_line.h>
-#include <lib/fxl/macros.h>
-#include <trace-provider/provider.h>
-
-namespace fuchsia {
-namespace modular {
-namespace auth {
-
-class AccountProviderImpl : AccountProvider {
- public:
-  AccountProviderImpl(async::Loop* loop);
-
- private:
-  // |AccountProvider| implementation:
-  void Terminate() override;
-  void AddAccount(fuchsia::modular::auth::IdentityProvider identity_provider,
-                  AddAccountCallback callback) override;
-  void RemoveAccount(fuchsia::modular::auth::Account account, bool revoke_all,
-                     RemoveAccountCallback callback) override;
-
-  std::string GenerateAccountId();
-
-  async::Loop* const loop_;
-  std::shared_ptr<component::StartupContext> startup_context_;
-  fidl::Binding<AccountProvider> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AccountProviderImpl);
-};
-
-AccountProviderImpl::AccountProviderImpl(async::Loop* loop)
-    : loop_(loop),
-      startup_context_(component::StartupContext::CreateFromStartupInfo()),
-      binding_(this) {
-  FXL_DCHECK(loop);
-  startup_context_->outgoing().AddPublicService<AccountProvider>(
-      [this](fidl::InterfaceRequest<AccountProvider> request) {
-        binding_.Bind(std::move(request));
-      });
-}
-
-void AccountProviderImpl::Terminate() { loop_->Quit(); }
-
-std::string AccountProviderImpl::GenerateAccountId() {
-  uint32_t random_number = 0;
-  zx_cprng_draw(&random_number, sizeof random_number);
-  return std::to_string(random_number);
-}
-
-void AccountProviderImpl::AddAccount(
-    fuchsia::modular::auth::IdentityProvider identity_provider,
-    AddAccountCallback callback) {
-  auto account = fuchsia::modular::auth::Account::New();
-  account->id = GenerateAccountId();
-  account->identity_provider = identity_provider;
-  account->display_name = "";
-  account->url = "";
-  account->image_url = "";
-
-  switch (identity_provider) {
-    case fuchsia::modular::auth::IdentityProvider::DEV:
-      callback(std::move(account), nullptr);
-      return;
-    default:
-      callback(nullptr, "Unrecognized Identity Provider");
-  }
-}
-
-void AccountProviderImpl::RemoveAccount(fuchsia::modular::auth::Account account,
-                                        bool revoke_all,
-                                        RemoveAccountCallback callback) {}
-
-}  // namespace auth
-}  // namespace modular
-}  // namespace fuchsia
-
-int main(int argc, const char** argv) {
-  auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  if (!fxl::SetLogSettingsFromCommandLine(command_line)) {
-    return 1;
-  }
-
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  trace::TraceProvider trace_provider(loop.dispatcher());
-
-  fuchsia::modular::auth::AccountProviderImpl app(&loop);
-  loop.Run();
-  return 0;
-}
diff --git a/bin/token_manager/meta/dev_token_manager.cmx b/bin/token_manager/meta/dev_token_manager.cmx
deleted file mode 100644
index f242a93..0000000
--- a/bin/token_manager/meta/dev_token_manager.cmx
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/boards/arm64.gni b/boards/arm64.gni
deleted file mode 100644
index 6440ec5..0000000
--- a/boards/arm64.gni
+++ /dev/null
@@ -1 +0,0 @@
-import("//garnet/boards/arm64.gni")
diff --git a/boards/x64.gni b/boards/x64.gni
deleted file mode 100644
index 59e066f..0000000
--- a/boards/x64.gni
+++ /dev/null
@@ -1 +0,0 @@
-import("//garnet/boards/x64.gni")
diff --git a/build/executable_package.gni b/build/executable_package.gni
deleted file mode 100644
index 94a9753..0000000
--- a/build/executable_package.gni
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/package.gni")
-
-# A package() that just contains a single binary created as an executable()
-# under the name of the rule. We currently prefer packages with single binaries,
-# because only such binaries can be executed directly from the package name in
-# appmgr.
-template("executable_package") {
-  binary_rule = "${target_name}_bin"
-  binary_name = target_name
-
-  executable(binary_rule) {
-    output_name = "${binary_name}"
-    forward_variables_from(invoker,
-                           [
-                             "sources",
-                             "deps",
-                             "public_deps",
-                             "testonly",
-                           ])
-  }
-
-  package(target_name) {
-    forward_variables_from(invoker,
-                           [
-                             "deps",
-                             "deprecated_system_image",
-                             "public_deps",
-                             "testonly",
-                             "meta",
-                             "tests",
-                             "resources",
-                             "deprecated_bare_package_url",
-                           ])
-    if (defined(deps)) {
-      deps += [ ":${binary_rule}" ]
-    } else {
-      deps = [
-        ":${binary_rule}",
-      ]
-    }
-
-    if (!defined(deprecated_system_image) || !deprecated_system_image) {
-      binary = binary_name
-    } else {
-      binaries = [
-        {
-          name = binary_name
-        },
-      ]
-    }
-  }
-}
diff --git a/build/module_manifest.gni b/build/module_manifest.gni
deleted file mode 100644
index 56d63ee..0000000
--- a/build/module_manifest.gni
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2018 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/package.gni")
-
-# This is a rule used to generate an index of module packages that should be
-# indexed by the on-device module resolver when it starts up. This template is
-# meant to be used only once for each layer, but multiple may exist for
-# different device package sets.  This target generates a system package, so
-# this target *must* be included in your layer's build image.
-#
-# The following must be true for each of the listed packages:
-#
-# 0) Make sure this module package is built and included on the device image.
-#    E.g: For an index of all topaz modules, make sure all module packages are
-#    transitively included from //topaz/packages/topaz.
-# 1) Create a Module manifest file as per //peridot/docs/modular/manifests/module.md
-#    and include it in your module package. The flutter_app() template from
-#    topaz includes the specified module manifest in the package for you.
-# 2) Point the 'binary' attribute in your manifest to the module's package name.
-#
-# Example:
-#
-# import("//peridot/build/module_manifest.gni")
-#
-# initial_module_packages("manifests") {
-#   packages = [ "my_module_package1", "my_module_package2" ]
-# }
-template("initial_module_packages") {
-  assert(defined(invoker.packages),
-         "'packages' must be defined for $target_name")
-
-  # NOTE: The fully resolved path will be
-  # /system/data/module_manifest_repository
-  # This must match that given in bin/module_resolver/module_resolver_main.cc
-  module_index_filename = "$root_build_dir/module_package_index/$target_name"
-  write_file(module_index_filename, invoker.packages)
-
-  package(target_name) {
-    deprecated_system_image = true
-    resources = [
-      {
-        path = rebase_path(module_index_filename)
-        dest = "initial_module_packages/$target_name"
-      },
-    ]
-  }
-}
\ No newline at end of file
diff --git a/build/tests_package.gni b/build/tests_package.gni
deleted file mode 100644
index 63018e7..0000000
--- a/build/tests_package.gni
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/package.gni")
-import("//build/test/test_package.gni")
-
-# A variant of package() that only contains test executables. The test
-# executables are specified as the build products of the deps. A tests_package()
-# is always testonly = true. The deps are expected to be executable()s.
-#
-# Additional parameters
-#
-#   environments (optional, default: [ { dimensions = { device_type = "QEMU" } } ])
-#     [list of scopes] Device environments in which the tests should run. See
-#     //build/package.gni for more details.
-#
-template("tests_package") {
-  computed_tests = []
-  foreach(dep, invoker.deps) {
-    computed_tests += [
-      {
-        name = get_label_info(dep, "name")
-        if (defined(invoker.environments)) {
-          environments = invoker.environments
-        }
-      },
-    ]
-  }
-
-  package(target_name) {
-    testonly = true
-
-    forward_variables_from(invoker,
-                           [
-                             "deps",
-                             "meta",
-                             "resources",
-                           ])
-    tests = computed_tests
-  }
-}
-
-# A variant of test_package() that only contains test executables. It computes
-# the value of the 'tests' paremeter from 'deps'.
-#
-# This variant, as described in
-# https://fuchsia.git.corp.google.com/docs/+/master/development/tests/test_component.md,
-# requires a .cmx file for each test.
-#
-#
-# Additional parameters
-#
-#   environments (optional, default: [ { dimensions = { device_type = "QEMU" } } ])
-#     [list of scopes] Device environments in which the tests should run. See
-#     //build/package.gni for more details.
-#
-template("hermetic_tests_package") {
-  computed_tests = []
-  foreach(dep, invoker.deps) {
-    computed_tests += [
-      {
-        name = get_label_info(dep, "name")
-        if (defined(invoker.environments)) {
-          environments = invoker.environments
-        }
-      },
-    ]
-  }
-
-  test_package(target_name) {
-    forward_variables_from(invoker,
-                           [
-                             "deps",
-                             "meta",
-                             "resources",
-                           ])
-    tests = computed_tests
-  }
-}
diff --git a/cloud/go/src/remote_module_resolver/BUILD.gn b/cloud/go/src/remote_module_resolver/BUILD.gn
deleted file mode 100644
index 043d147..0000000
--- a/cloud/go/src/remote_module_resolver/BUILD.gn
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/go/go_binary.gni")
-import("//build/go/go_library.gni")
-import("//build/go/go_test.gni")
-import("//build/host.gni")
-import("//build/package.gni")
-
-go_library("remote_module_resolver_lib") {
-  name = "remote_module_resolver"
-
-  deps = [
-    ":gojsonpointer",
-    ":gojsonreference",
-    ":gojsonschema",
-  ]
-}
-
-go_library("gojsonpointer") {
-  name = "github.com/xeipuuv/gojsonpointer"
-  source_dir =
-      "//peridot/cloud/third_party/golibs/github.com/xeipuuv/gojsonpointer"
-}
-go_library("gojsonreference") {
-  name = "github.com/xeipuuv/gojsonreference"
-  source_dir =
-      "//peridot/cloud/third_party/golibs/github.com/xeipuuv/gojsonreference"
-}
-go_library("gojsonschema") {
-  name = "github.com/xeipuuv/gojsonschema"
-  source_dir =
-      "//peridot/cloud/third_party/golibs/github.com/xeipuuv/gojsonschema"
-}
-
-go_binary("remote_module_resolver") {
-  gopackage = "remote_module_resolver"
-  output_name = "remote_module_resolver"
-  deps = [
-    ":remote_module_resolver_lib",
-  ]
-}
-
-go_test("remote_module_resolver_test") {
-  gopackage = "remote_module_resolver/repository"
-  deps = [
-    ":remote_module_resolver_lib",
-  ]
-}
-
-install_host_tools("host") {
-  deps = [
-    ":remote_module_resolver",
-  ]
-  outputs = [
-    "remote_module_resolver",
-  ]
-}
-
-install_host_tools("host_tests") {
-  deps = [
-    ":remote_module_resolver_test",
-  ]
-  outputs = [
-    "remote_module_resolver_test",
-  ]
-}
diff --git a/cloud/go/src/remote_module_resolver/main.go b/cloud/go/src/remote_module_resolver/main.go
deleted file mode 100644
index 9370171..0000000
--- a/cloud/go/src/remote_module_resolver/main.go
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package main
-
-import (
-	"encoding/json"
-	"flag"
-	"fmt"
-	"io/ioutil"
-	"log"
-	"net/http"
-	"remote_module_resolver/repository"
-)
-
-var (
-	usage       = "Starts the module resolver HTTP service."
-	manifestDir = flag.String("manifests-directory", "/tmp/module_manifests", "Path to the directory containing module manifests.")
-	httpPort    = flag.Int("port", 15321, "TCP Port to run the resolver HTTP server on.")
-)
-
-func main() {
-	flag.CommandLine.Usage = func() {
-		fmt.Println(usage)
-		flag.CommandLine.PrintDefaults()
-	}
-	flag.Parse()
-	log.SetPrefix("remote module resolver: ")
-	log.SetFlags(log.Ltime & log.LstdFlags)
-	log.Println("Resolver listening to port ", *httpPort, " with manifest directory ", *manifestDir)
-
-	repo := repository.NewRepository(*manifestDir)
-	// /addmodule
-	//    POST body:  JSON module manifest contents
-	http.HandleFunc("/addmodule", func(writer http.ResponseWriter,
-		request *http.Request) {
-		if request.Method != "POST" {
-			writer.WriteHeader(http.StatusBadRequest)
-			writer.Write(nil)
-			return
-		}
-
-		defer request.Body.Close()
-		bytes, err := ioutil.ReadAll(request.Body)
-		if err != nil {
-			log.Println(err)
-			writer.WriteHeader(http.StatusBadRequest)
-			return
-		}
-		log.Println("/addmodule: ", string(bytes))
-		if err = repo.SaveAndIndexManifest(bytes); err != nil {
-			log.Println(err)
-			writer.WriteHeader(http.StatusBadRequest)
-			return
-		}
-		writer.WriteHeader(http.StatusOK)
-	})
-
-	// /findmodules
-	//   POST request body: json-encoded |repository.FindModulesRequest|
-	//   POST response body:  json-encoded |repository.ModuleResolution|
-	http.HandleFunc("/findmodules", func(writer http.ResponseWriter,
-		request *http.Request) {
-		if request.Method != "POST" {
-			writer.WriteHeader(http.StatusBadRequest)
-			return
-		}
-
-		defer request.Body.Close()
-		bytes, err := ioutil.ReadAll(request.Body)
-		if err != nil {
-			writer.WriteHeader(http.StatusBadRequest)
-			log.Println(err)
-			return
-		}
-
-		log.Println("/findmodules: ", string(bytes))
-		var reqInJson map[string]interface{}
-		if err = json.Unmarshal(bytes, &reqInJson); err != nil {
-			writer.WriteHeader(http.StatusBadRequest)
-			log.Println(err)
-			return
-		}
-
-		paramsMap := make(map[repository.ParameterName][]repository.ParameterType)
-		for _, kv := range reqInJson["parameters"].([]interface{}) {
-			kv := kv.(map[string]interface{})
-			paramsMap[kv["@k"].(repository.ParameterName)] = kv["@v"].([]repository.ParameterType)
-		}
-		results, err := repo.FindModules(repository.FindModulesRequest{Action: repository.ActionName(reqInJson["action"].(string)), Parameters: paramsMap})
-		if err != nil {
-			writer.WriteHeader(http.StatusBadRequest)
-			log.Println(err)
-			return
-		}
-
-		encoded, err := json.Marshal(results)
-		if err != nil {
-			writer.WriteHeader(http.StatusBadRequest)
-			log.Println(err)
-			return
-		}
-		writer.WriteHeader(http.StatusOK)
-		writer.Write(encoded)
-		return
-	})
-
-	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *httpPort), nil))
-}
diff --git a/cloud/go/src/remote_module_resolver/repository/manifest_set.go b/cloud/go/src/remote_module_resolver/repository/manifest_set.go
deleted file mode 100644
index 42059a1..0000000
--- a/cloud/go/src/remote_module_resolver/repository/manifest_set.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package repository
-
-// set of manifests ID'd by their moduleUrl.
-type ManifestSet map[ModuleUrl]struct{}
-
-// This modifies |dest| by leaving only the keys that are both in |dest| *and*
-// |source|. |source| is left unchanged.
-func (dest ManifestSet) intersect(source ManifestSet) {
-	for moduleUrl := range dest {
-		if _, ok := source[moduleUrl]; !ok {
-			delete(dest, moduleUrl)
-		}
-	}
-}
-
-// This modifies |dest| by including all things in |source|.
-func (dest ManifestSet) merge(source ManifestSet) {
-	for moduleUrl := range source {
-		dest[moduleUrl] = struct{}{}
-	}
-}
-
-func listToManifestSet(l []ModuleUrl) ManifestSet {
-	set := make(ManifestSet)
-	for _, item := range l {
-		set[item] = struct{}{}
-	}
-	return set
-}
diff --git a/cloud/go/src/remote_module_resolver/repository/module_manifest_schema.go b/cloud/go/src/remote_module_resolver/repository/module_manifest_schema.go
deleted file mode 100644
index 2ae26ea..0000000
--- a/cloud/go/src/remote_module_resolver/repository/module_manifest_schema.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package repository
-
-// TODO(vardhan): Use a flag to pass in path-to-manifest-schema that overrides
-// this default schema.
-const ModuleManifestSchema = `{
-  "$schema": "http://json-schema.org/schema#",
-  "title": "Schema for 'action_template' metadata file",
-  "definitions": {
-    "parameterArray": {
-      "type": "array",
-      "items": {
-        "$ref": "#/definitions/parameter"
-      },
-      "additionalItems": false,
-      "uniqueItems": true,
-      "minItems": 1
-    },
-    "parameter": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "$ref": "#/definitions/alphaNumString"
-        },
-        "type": {
-          "type": "string"
-        },
-        "required": {
-          "type": "boolean"
-        }
-      },
-      "required": [
-        "name",
-        "type"
-      ],
-      "additionalProperties": false
-    },
-    "alphaNumString": {
-      "type": "string",
-      "pattern": "^[a-zA-Z0-9_]+$"
-    },
-    "compositionPattern": {
-      "type": "string",
-      "enum": [
-        "ticker",
-        "comments-right"
-      ]
-    }
-  },
-  "type": "object",
-  "properties": {
-    "binary": {
-      "type": "string"
-    },
-    "suggestion_headline": {
-      "type": "string"
-    },
-    "action": {
-      "type": "string"
-    },
-    "parameters": {
-      "$ref": "#/definitions/parameterArray"
-    },
-    "composition_pattern": {
-      "$ref": "#/definitions/compositionPattern"
-    }
-  },
-  "required": [
-    "binary",
-    "action"
-  ],
-  "additionalProperties": false
-}`
diff --git a/cloud/go/src/remote_module_resolver/repository/repository.go b/cloud/go/src/remote_module_resolver/repository/repository.go
deleted file mode 100644
index f035374..0000000
--- a/cloud/go/src/remote_module_resolver/repository/repository.go
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package repository
-
-import (
-	"crypto/sha256"
-	"encoding/hex"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"github.com/xeipuuv/gojsonschema"
-	"io/ioutil"
-	"log"
-	"os"
-	"path"
-)
-
-type ParameterName string
-type ParameterType string
-type ModuleUrl string
-type ActionName string
-type FindModulesRequest struct {
-	Action ActionName
-	// The ability to accept multiple types per named parameter allows the
-	// requestor to specify additional polymorphic types.
-	Parameters map[ParameterName][]ParameterType
-}
-
-type ManifestContent struct {
-	Url     ModuleUrl
-	Content ParsedManifest
-}
-
-type ModuleResolution struct {
-	// [0, 1], 1 being most relevant.
-	Score    float32
-	Manifest ManifestContent
-}
-
-type ModuleResolver interface {
-	FindModules(req FindModulesRequest) ([]ModuleResolution, error)
-	SaveAndIndexManifest(rawModuleManifest []byte) error
-	IndexManifest(rawModuleManifest []byte) (ModuleUrl, error)
-	UnIndexManifest(moduleUrl ModuleUrl) error
-}
-
-type ParameterNameToManifestSet map[ParameterName]ManifestSet
-type ParsedManifest map[string]interface{}
-type Repository struct {
-	// Implements |ModuleResolver|.
-	// TODO(vardhan): Use a persistent DB for indexing and searching.
-
-	// The directory where module manifest files are located and where new
-	// ones will be stored.
-	manifestDir string
-
-	// The following are different indices pointing to a parsed manifest.
-	manifestsByModuleUrl  map[ModuleUrl]ParsedManifest
-	moduleUrlsByParameter map[ParameterType]ParameterNameToManifestSet
-	moduleUrlsByAction    map[ActionName]ManifestSet
-}
-
-func NewRepository(manifestDir string) *Repository {
-	repo := Repository{
-		manifestDir:           manifestDir,
-		manifestsByModuleUrl:  make(map[ModuleUrl]ParsedManifest),
-		moduleUrlsByParameter: make(map[ParameterType]ParameterNameToManifestSet),
-		moduleUrlsByAction:    make(map[ActionName]ManifestSet),
-	}
-	if manifestFiles, err := ioutil.ReadDir(manifestDir); err == nil {
-		for _, file := range manifestFiles {
-			if file.IsDir() {
-				continue
-			}
-			if bytes, err := ioutil.ReadFile(path.Join(manifestDir, file.Name())); err == nil {
-				_, err := repo.IndexManifest(bytes)
-				if err != nil {
-					log.Println("Could not index manifest file ", file.Name(), err)
-				}
-			} else {
-				log.Println("Could not read manifest file: ", err)
-			}
-		}
-	} else {
-		log.Println("Could not open manifest directory ", manifestDir, ":", err)
-	}
-
-	log.Println("Indexed ", len(repo.manifestsByModuleUrl), " manifests")
-	return &repo
-}
-
-func (r *Repository) SaveAndIndexManifest(rawModuleManifest []byte) error {
-	moduleUrl, err := r.IndexManifest(rawModuleManifest)
-	if err != nil {
-		return err
-	}
-
-	if stat, err := os.Stat(r.manifestDir); err != nil || !stat.IsDir() {
-		if err := os.Mkdir(r.manifestDir, 0755); err != nil {
-			return fmt.Errorf("Could not create manifest directory: %s", err)
-		}
-		if err := os.Chmod(r.manifestDir, 0755); err != nil {
-			return fmt.Errorf("Could not set manifest directory permissions: %s", err)
-		}
-	}
-
-	shaUrl := sha256.Sum256([]byte(moduleUrl))
-	fileName := hex.EncodeToString(shaUrl[:])
-	if err = ioutil.WriteFile(path.Join(r.manifestDir, fileName), rawModuleManifest, os.ModePerm); err != nil {
-		return fmt.Errorf("Could not save manifest to file: %s", err)
-	}
-
-	return nil
-}
-
-// On success, returns the module's Url.
-func (r *Repository) IndexManifest(rawModuleManifest []byte) (ModuleUrl, error) {
-	jsonManifest := make(ParsedManifest)
-	err := json.Unmarshal(rawModuleManifest, &jsonManifest)
-
-	schema := gojsonschema.NewStringLoader(ModuleManifestSchema)
-	manifest := gojsonschema.NewStringLoader(string(rawModuleManifest))
-	result, err := gojsonschema.Validate(schema, manifest)
-	if err != nil {
-		// The |schema| or |manifest| could not be parsed.
-		return "", err
-	}
-	if !result.Valid() {
-		// |manifest| does not follow the module manifest schema.
-		return "", errors.New("invalid module manifest schema")
-	}
-
-	action := ActionName(jsonManifest["action"].(string))
-	moduleUrl := ModuleUrl(jsonManifest["binary"].(string))
-
-	r.UnIndexManifest(moduleUrl)
-
-	// Index the manifest
-	r.manifestsByModuleUrl[moduleUrl] = jsonManifest
-	if _, ok := r.moduleUrlsByAction[action]; !ok {
-		r.moduleUrlsByAction[action] = make(ManifestSet)
-	}
-	r.moduleUrlsByAction[action][moduleUrl] = struct{}{}
-
-	for _, parameter := range jsonManifest["parameters"].([]interface{}) {
-		parameterMap := ParsedManifest(parameter.(map[string]interface{}))
-		paramName := ParameterName(parameterMap["name"].(string))
-		paramType := ParameterType(parameterMap["type"].(string))
-
-		if _, ok := r.moduleUrlsByParameter[paramType]; !ok {
-			r.moduleUrlsByParameter[paramType] = make(ParameterNameToManifestSet)
-		}
-		if _, ok := r.moduleUrlsByParameter[paramType][paramName]; !ok {
-			r.moduleUrlsByParameter[paramType][paramName] = make(ManifestSet)
-		}
-		r.moduleUrlsByParameter[paramType][paramName][moduleUrl] = struct{}{}
-	}
-	return moduleUrl, nil
-}
-
-func (r *Repository) UnIndexManifest(moduleUrl ModuleUrl) error {
-	if jsonManifest, ok := r.manifestsByModuleUrl[moduleUrl]; ok {
-		if parameters, ok := jsonManifest["parameters"]; ok {
-			for _, parameter := range parameters.([]interface{}) {
-				paramName := ParameterName(ParsedManifest(parameter.(map[string]interface{}))["name"].(string))
-				paramType := ParameterType(ParsedManifest(parameter.(map[string]interface{}))["type"].(string))
-				delete(r.moduleUrlsByParameter[paramType][paramName], moduleUrl)
-				if len(r.moduleUrlsByParameter[paramType][paramName]) == 0 {
-					delete(r.moduleUrlsByParameter[paramType], paramName)
-				}
-				if len(r.moduleUrlsByParameter[paramType]) == 0 {
-					delete(r.moduleUrlsByParameter, paramType)
-				}
-			}
-		}
-
-		delete(r.moduleUrlsByAction, jsonManifest["action"].(ActionName))
-		delete(r.manifestsByModuleUrl, moduleUrl)
-		return nil
-	}
-	return fmt.Errorf("could not remove manifest: none exists for %s", moduleUrl)
-}
-
-func (r *Repository) findManifestsByParameter(paramName ParameterName, paramType ParameterType) ManifestSet {
-	if nameMap, ok := r.moduleUrlsByParameter[paramType]; ok {
-		if manifests, ok := nameMap[paramName]; ok {
-			return manifests
-		}
-	}
-	return nil
-}
-
-func hasAllRequiredParameters(req FindModulesRequest, moduleManifest ParsedManifest) bool {
-	if parameters, ok := moduleManifest["parameters"]; ok {
-		for _, constraint := range parameters.([]interface{}) {
-			constraintKeys := constraint.(map[string]interface{})
-			paramName := ParameterName(constraintKeys["name"].(string))
-			// Parameters are required by default. Check if this was marked optional.
-			if isRequired, found := constraintKeys["required"]; !found || (found && isRequired.(bool)) {
-				// It is required. Check that it was specified in the request
-				if _, found := req.Parameters[paramName]; !found {
-					return false
-				}
-			}
-		}
-	}
-	return true
-}
-
-// TODO(vardhan): Make this a separate exported API, and rename |FindModules| ->
-// |FindModulesByAction|
-func (r *Repository) findModulesByParamTypes(req FindModulesRequest) ([]ModuleResolution, error) {
-	return []ModuleResolution{}, nil
-}
-
-func (r *Repository) FindModules(req FindModulesRequest) ([]ModuleResolution, error) {
-	if req.Action == "" {
-		return r.findModulesByParamTypes(req)
-	}
-
-	// 1. Find all module manifests that contain the action in the request.
-	candidateModules := make(ManifestSet)
-	for moduleUrl := range r.moduleUrlsByAction[req.Action] {
-		candidateModules[moduleUrl] = struct{}{}
-	}
-
-	// 2. Find all module manifests that contain the parameters in request.
-	// 3. Intersect the 1) and 2) to get the possible candidate manifests.
-	for paramName, paramTypes := range req.Parameters {
-		manifests := make(ManifestSet)
-		for _, paramType := range paramTypes {
-			manifests.merge(r.findManifestsByParameter(paramName, paramType))
-		}
-		candidateModules.intersect(manifests)
-	}
-
-	// 4. Filter through the candidates to make sure their required parameters are
-	//    provided in the request.
-	results := []ModuleResolution{}
-	for candidateModuleUrl := range candidateModules {
-		if !hasAllRequiredParameters(req, r.manifestsByModuleUrl[candidateModuleUrl]) {
-			continue
-		}
-
-		results = append(results, ModuleResolution{
-			Manifest: ManifestContent{
-				Url:     candidateModuleUrl,
-				Content: r.manifestsByModuleUrl[candidateModuleUrl]},
-			Score: 1.0})
-	}
-	return results, nil
-}
diff --git a/cloud/go/src/remote_module_resolver/repository/repository_test.go b/cloud/go/src/remote_module_resolver/repository/repository_test.go
deleted file mode 100644
index a77bf4b..0000000
--- a/cloud/go/src/remote_module_resolver/repository/repository_test.go
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package repository
-
-import (
-	"reflect"
-	"testing"
-)
-
-var moduleManifestsRepo = map[ModuleUrl][]byte{
-	"module_url1": []byte(`
-		{
-			"binary": "module_url1",
-			"action": "com.fuchsia.action",
-			"parameters": [
-					{
-							"name": "ParamName",
-							"type": "ParamType"
-					}
-			]
-		}`),
-
-	"module_url2": []byte(`
-		{
-			"binary": "module_url2",
-			"action": "com.fuchsia.action",
-			"parameters": [
-					{
-							"name": "ParamName",
-							"type": "ParamType"
-					}
-			]
-		}`),
-
-	"module_url3": []byte(`
-		{
-			"binary": "module_url3",
-			"action": "com.fuchsia.action",
-			"parameters": [
-					{
-							"name": "ParamName",
-							"type": "DifferentParamType"
-					}
-			]
-		}`),
-}
-
-// |FindModulesTestCase| describes a single test case that involves issuing a
-// FindModules query against a repository of modules, with an expected set of
-// modules as the result.
-type FindModulesTestCase struct {
-	// Which modules to index from |moduleManifestRepo| for this particular test?
-	IndexedModules []ModuleUrl
-	Query          FindModulesRequest
-	// Which expected set of modules should return from the |Query| above? This
-	// list is treated like a set.
-	ExpectedResults []ModuleUrl
-}
-
-func (testCase FindModulesTestCase) run(t *testing.T) {
-	var resolver ModuleResolver = NewRepository("")
-	for _, moduleUrl := range testCase.IndexedModules {
-		_, err := resolver.IndexManifest(moduleManifestsRepo[moduleUrl])
-		if err != nil {
-			t.Errorf("FAIL: Could not index module manifest '%s': %s", moduleUrl, err)
-			return
-		}
-	}
-	results, err := resolver.FindModules(testCase.Query)
-	if err != nil {
-		t.Errorf("FAIL: Could not execute query: %s", err)
-		return
-	}
-
-	resultUrls := []ModuleUrl{}
-	for _, result := range results {
-		resultUrls = append(resultUrls, result.Manifest.Url)
-	}
-
-	if !reflect.DeepEqual(listToManifestSet(resultUrls), listToManifestSet(testCase.ExpectedResults)) {
-		t.Errorf("FAIL: Did not get expected results. #expected = %d, #actual = %d",
-			len(testCase.ExpectedResults),
-			len(results))
-	}
-}
-
-func TestExactMatchSingleModule(t *testing.T) {
-	FindModulesTestCase{
-		IndexedModules: []ModuleUrl{"module_url1"},
-		Query: FindModulesRequest{
-			Action: "com.fuchsia.action",
-			Parameters: map[ParameterName][]ParameterType{
-				"ParamName": []ParameterType{"ParamType"},
-			},
-		},
-		ExpectedResults: []ModuleUrl{"module_url1"},
-	}.run(t)
-}
-
-func TestExactMatchMultipleModules(t *testing.T) {
-	FindModulesTestCase{
-		IndexedModules: []ModuleUrl{"module_url1", "module_url2"},
-		Query: FindModulesRequest{
-			Action: "com.fuchsia.action",
-			Parameters: map[ParameterName][]ParameterType{
-				"ParamName": []ParameterType{"ParamType", "UnknownParamType"},
-			},
-		},
-		ExpectedResults: []ModuleUrl{"module_url1", "module_url2"},
-	}.run(t)
-}
-
-func TestNoMatchUnknownParamType(t *testing.T) {
-	FindModulesTestCase{
-		IndexedModules: []ModuleUrl{"module_url1"},
-		Query: FindModulesRequest{
-			Action: "com.fuchsia.action",
-			Parameters: map[ParameterName][]ParameterType{
-				"ParamName": []ParameterType{"UnknownParamType"},
-			},
-		},
-		ExpectedResults: []ModuleUrl{},
-	}.run(t)
-}
-
-func TestDifferentParamTypes(t *testing.T) {
-	FindModulesTestCase{
-		IndexedModules: []ModuleUrl{"module_url1", "module_url3"},
-		Query: FindModulesRequest{
-			Action: "com.fuchsia.action",
-			Parameters: map[ParameterName][]ParameterType{
-				"ParamName": []ParameterType{"ParamType"},
-			},
-		},
-		ExpectedResults: []ModuleUrl{"module_url1"},
-	}.run(t)
-}
diff --git a/docs/conventions.md b/docs/conventions.md
deleted file mode 100644
index f61dc9d..0000000
--- a/docs/conventions.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Conventions
-
-This document tracks layer-wide conventions for Peridot code.
-
-## Testing helpers
-
-Test-only utils (but not the tests themselves) related to a given library should
-be placed under the directory of the library itself, in a subdirectory called
-`testing` (and not `test`).
-
-The test-only symbols should be declared in the same namespace as the library
-the test helpers are related to (and not in a `test` or `testing` subnamespace).
-
-The build targets containing  test-only utils should be marked as such using the
-GN `testonly = true` annotation.
diff --git a/docs/gen/build_arguments.md b/docs/gen/build_arguments.md
deleted file mode 100644
index e21b6a0..0000000
--- a/docs/gen/build_arguments.md
+++ /dev/null
@@ -1,1159 +0,0 @@
-# GN Build Arguments
-
-## All builds
-
-### host_os
-
-**Current value (from the default):** `"linux"`
-
-### icu_use_data_file
-Tells icu to load an external data file rather than rely on the icudata
-being linked directly into the binary.
-
-This flag is a bit confusing. As of this writing, icu.gyp set the value to
-0 but common.gypi sets the value to 1 for most platforms (and the 1 takes
-precedence).
-
-TODO(GYP) We'll probably need to enhance this logic to set the value to
-true or false in similar circumstances.
-
-**Current value (from the default):** `true`
-
-From [//third_party/icu/config.gni:15](https://fuchsia.googlesource.com/third_party/icu/+/15006476e9d2f5c7d6691f3658fecff4929aaf68/config.gni#15)
-
-### magma_enable_developer_build
-Enable this to have the msd include a suite of tests and invoke them
-automatically when the driver starts.
-
-**Current value (from the default):** `false`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:19](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#19)
-
-### use_goma
-Set to true to enable distributed compilation using Goma.
-
-**Current value (from the default):** `false`
-
-From [//build/toolchain/goma.gni:9](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/toolchain/goma.gni#9)
-
-### build_libvulkan
-This is a list of targets that will be built as vulkan ICDS. If more than one
-target is given then use_vulkan_loader_for_tests must be set to true, as
-otherwise tests won't know which libvulkan to use.
-
-**Current value (from the default):** `[]`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:38](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#38)
-
-### build_vsl_gc
-
-**Current value (from the default):** `true`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:22](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#22)
-
-### extra_variants
-Additional variant toolchain configs to support.
-This is just added to [`known_variants`](#known_variants).
-
-**Current value (from the default):** `[]`
-
-From [//build/config/BUILDCONFIG.gn:393](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/BUILDCONFIG.gn#393)
-
-### host_byteorder
-
-**Current value (from the default):** `"undefined"`
-
-From [//build/config/host_byteorder.gni:7](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/host_byteorder.gni#7)
-
-### scenic_ignore_vsync
-
-**Current value (from the default):** `false`
-
-From [//garnet/lib/ui/gfx/BUILD.gn:16](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/ui/gfx/BUILD.gn#16)
-
-### select_variant
-List of "selectors" to request variant builds of certain targets.
-Each selector specifies matching criteria and a chosen variant.
-The first selector in the list to match a given target determines
-which variant is used for that target.
-
-Each selector is either a string or a scope.  A shortcut selector is
-a string; it gets expanded to a full selector.  A full selector is a
-scope, described below.
-
-A string selector can match a name in
-[`select_variant_shortcuts`](#select_variant_shortcuts).  If it's not a
-specific shortcut listed there, then it can be the name of any variant
-described in [`known_variants`](#known_variants) and
-[`universal_variants`](#universal_variants) (and combinations thereof).
-A `selector` that's a simple variant name selects for every binary
-built in the target toolchain: `{ host=false variant=selector }`.
-
-If a string selector contains a slash, then it's `"shortcut/filename"`
-and selects only the binary in the target toolchain whose `output_name`
-matches `"filename"`, i.e. it adds `output_name=["filename"]` to each
-selector scope that the shortcut's name alone would yield.
-
-The scope that forms a full selector defines some of these:
-
-    variant (required)
-        [string or `false`] The variant that applies if this selector
-        matches.  This can be `false` to choose no variant, or a string
-        that names the variant.  See
-        [`known_variants`](#known_variants) and
-        [`universal_variants`](#universal_variants).
-
-The rest below are matching criteria.  All are optional.
-The selector matches if and only if all of its criteria match.
-If none of these is defined, then the selector always matches.
-
-The first selector in the list to match wins and then the rest of
-the list is ignored.  So construct more complex rules by using a
-"blacklist" selector with `variant=false` before a catch-all or
-"whitelist" selector that names a variant.
-
-Each "[strings]" criterion is a list of strings, and the criterion
-is satisfied if any of the strings matches against the candidate string.
-
-    host
-        [boolean] If true, the selector matches in the host toolchain.
-        If false, the selector matches in the target toolchain.
-
-    testonly
-        [boolean] If true, the selector matches targets with testonly=true.
-        If false, the selector matches in targets without testonly=true.
-
-    target_type
-        [strings]: `"executable"`, `"loadable_module"`, or `"driver_module"`
-
-    output_name
-        [strings]: target's `output_name` (default: its `target name`)
-
-    label
-        [strings]: target's full label with `:` (without toolchain suffix)
-
-    name
-        [strings]: target's simple name (label after last `/` or `:`)
-
-    dir
-        [strings]: target's label directory (`//dir` for `//dir:name`).
-
-**Current value (from the default):** `[]`
-
-From [//build/config/BUILDCONFIG.gn:613](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/BUILDCONFIG.gn#613)
-
-### synthesize_packages
-List of extra packages to synthesize on the fly.  This is only for
-things that do not appear normally in the source tree.  Synthesized
-packages can contain build artifacts only if they already exist in some
-part of the build.  They can contain arbitrary verbatim files.
-Synthesized packages can't express dependencies on other packages.
-
-Each element of this list is a scope that is very much like the body of
-a package() template invocation (see [//build/package.gni](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/package.gni)).  That scope
-must set `name` to the string naming the package, as would be the name
-in the package() target written in a GN file.  This must be unique
-among all package names.
-
-**Current value (from the default):** `[]`
-
-From [//build/gn/packages.gni:43](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/gn/packages.gni#43)
-
-### universal_variants
-
-**Current value (from the default):**
-```
-[{
-  configs = []
-  name = "release"
-  toolchain_args = {
-  is_debug = false
-}
-}]
-```
-
-From [//build/config/BUILDCONFIG.gn:413](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/BUILDCONFIG.gn#413)
-
-### always_zedboot
-Build boot images that prefer Zedboot over local boot (only for EFI).
-
-**Current value (from the default):** `false`
-
-From [//build/images/BUILD.gn:609](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#609)
-
-### amber_keys_dir
-Directory containing signing keys used by pm publish.
-
-**Current value (from the default):** `"//garnet/go/src/amber/keys"`
-
-From [//garnet/go/src/pm/pm.gni:14](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/go/src/pm/pm.gni#14)
-
-### current_cpu
-
-**Current value (from the default):** `""`
-
-### goma_dir
-Absolute directory containing the Goma source code.
-
-**Current value (from the default):** `"/home/swarming/goma"`
-
-From [//build/toolchain/goma.gni:12](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/toolchain/goma.gni#12)
-
-### data_partition_manifest
-Path to manifest file containing data to place into the initial /data
-partition.
-
-**Current value (from the default):** `""`
-
-From [//build/images/BUILD.gn:29](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#29)
-
-### scudo_default_options
-Default [Scudo](https://llvm.org/docs/ScudoHardenedAllocator.html)
-options (before the `SCUDO_OPTIONS` environment variable is read at
-runtime).  *NOTE:* This affects only components using the `scudo`
-variant (see GN build argument `select_variant`), and does not affect
-anything when the `use_scudo` build flag is set instead.
-
-**Current value (from the default):** `["abort_on_error=1", "QuarantineSizeKb=0", "ThreadLocalQuarantineSizeKb=0", "DeallocationTypeMismatch=false", "DeleteSizeMismatch=false", "allocator_may_return_null=true"]`
-
-From [//build/config/scudo/scudo.gni:15](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/scudo/scudo.gni#15)
-
-### toolchain_variant
-*This should never be set as a build argument.*
-It exists only to be set in `toolchain_args`.
-See [//build/toolchain/clang_toolchain.gni](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/toolchain/clang_toolchain.gni) for details.
-This variable is a scope giving details about the current toolchain:
-    `toolchain_variant.base`
-        [label] The "base" toolchain for this variant, *often the
-        right thing to use in comparisons, not `current_toolchain`.*
-        This is the toolchain actually referenced directly in GN
-        source code.  If the current toolchain is not
-        `shlib_toolchain` or a variant toolchain, this is the same
-        as `current_toolchain`.  In one of those derivative
-        toolchains, this is the toolchain the GN code probably
-        thought it was in.  This is the right thing to use in a test
-        like `toolchain_variant.base == target_toolchain`, rather
-        rather than comparing against `current_toolchain`.
-    `toolchain_variant.name`
-        [string] The name of this variant, as used in `variant` fields
-        in [`select_variant`](#select_variant) clauses.  In the base
-        toolchain and its `shlib_toolchain`, this is `""`.
-    `toolchain_variant.suffix`
-        [string] This is "-${toolchain_variant.name}", "" if name is empty.
-    `toolchain_variant.is_pic_default`
-        [bool] This is true in `shlib_toolchain`.
-The other fields are the variant's effects as defined in
-[`known_variants`](#known_variants).
-
-**Current value (from the default):**
-```
-{
-  base = "//build/toolchain/fuchsia:arm64"
-}
-```
-
-From [//build/config/BUILDCONFIG.gn:71](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/BUILDCONFIG.gn#71)
-
-### use_lto
-Use link time optimization (LTO).
-
-**Current value (from the default):** `false`
-
-From [//build/config/lto/config.gni:7](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/lto/config.gni#7)
-
-### zedboot_cmdline_files
-Files containing additional kernel command line arguments to bake into
-the Zedboot image.  The contents of these files (in order) come after any
-arguments directly in [`zedboot_cmdline_args`](#zedboot_cmdline_args).
-These can be GN `//` source pathnames or absolute system pathnames.
-
-**Current value (from the default):** `[]`
-
-From [//build/images/zedboot/BUILD.gn:21](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/zedboot/BUILD.gn#21)
-
-### dart_pool_depth
-Maximum number of Dart processes to run in parallel.
-
-Dart analyzer uses a lot of memory which may cause issues when building
-with many parallel jobs e.g. when using goma. To avoid out-of-memory
-errors we explicitly reduce the number of jobs.
-
-**Current value (from the default):** `16`
-
-From [//build/dart/toolchain.gni:11](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/dart/toolchain.gni#11)
-
-### enable_sketchy_subsystem
-
-**Current value (from the default):** `true`
-
-From [//garnet/bin/ui/scenic/BUILD.gn:13](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/bin/ui/scenic/BUILD.gn#13)
-
-### escher_use_null_vulkan_config_on_host
-Using Vulkan on host (i.e. Linux) is an involved affair that involves
-downloading the Vulkan SDK, setting environment variables, and so forth...
-all things that are difficult to achieve in a CQ environment.  Therefore,
-by default we use a stub implementation of Vulkan which fails to create a
-VkInstance.  This allows everything to build, and also allows running Escher
-unit tests which don't require Vulkan.
-
-**Current value (from the default):** `true`
-
-From [//garnet/public/lib/escher/BUILD.gn:15](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/public/lib/escher/BUILD.gn#15)
-
-### toolchain_manifests
-Manifest files describing target libraries from toolchains.
-Can be either // source paths or absolute system paths.
-
-**Current value (from the default):** `["/b/s/w/ir/kitchen-workdir/buildtools/linux-x64/clang/lib/aarch64-fuchsia.manifest"]`
-
-From [//build/images/manifest.gni:11](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/manifest.gni#11)
-
-### is_debug
-Debug build.
-
-**Current value (from the default):** `true`
-
-From [//build/config/BUILDCONFIG.gn:11](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/BUILDCONFIG.gn#11)
-
-### ledger_sync_credentials_file
-
-**Current value (from the default):** `""`
-
-From [//peridot/bin/ledger/testing/sync_params.gni:6](https://fuchsia.googlesource.com/peridot/+/2c5f509749861d23597bf7d8bde2172179938765/bin/ledger/testing/sync_params.gni#6)
-
-### zircon_system_groups
-Groups to include from the Zircon /boot manifest into /system
-(instead of into /boot like Zircon's own bootdata.bin does).
-Should not include any groups that are also in zircon_boot_groups,
-which see.  If zircon_boot_groups is "all" then this should be "".
-**TODO(mcgrathr)**: _Could default to "" for `!is_debug`, or "production
-build".  Note including `"test"` here places all of Zircon's tests into
-`/system/test`, which means that Fuchsia bots run those tests too._
-
-**Current value (from the default):** `"misc,test"`
-
-From [//build/images/BUILD.gn:40](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#40)
-
-### sdk_dirs
-The directories to search for parts of the SDK.
-
-By default, we search the public directories for the various layers.
-In the future, we'll search a pre-built SDK as well.
-
-**Current value (from the default):** `["//garnet/public", "//peridot/public", "//topaz/public"]`
-
-From [//build/config/fuchsia/sdk.gni:10](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/fuchsia/sdk.gni#10)
-
-### target_sysroot
-The absolute path of the sysroot that is used with the target toolchain.
-
-**Current value (from the default):** `""`
-
-From [//build/config/sysroot.gni:7](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/sysroot.gni#7)
-
-### zircon_asan_build_dir
-Zircon `USE_ASAN=true` build directory for `target_cpu` containing
-`bootfs.manifest` with libraries and `devhost.asan`.
-
-If left `""` (the default), then this is computed from
-[`zircon_build_dir`](#zircon_build_dir) and
-[`zircon_use_asan`](#zircon_use_asan).
-
-**Current value (from the default):** `""`
-
-From [//build/config/fuchsia/zircon.gni:32](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/fuchsia/zircon.gni#32)
-
-### zircon_tools_dir
-Where to find Zircon's host-side tools that are run as part of the build.
-
-**Current value (from the default):** `"//out/build-zircon/tools"`
-
-From [//build/config/fuchsia/zircon.gni:9](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/fuchsia/zircon.gni#9)
-
-### enable_frame_pointers
-Controls whether the compiler emits full stack frames for function calls.
-This reduces performance but increases the ability to generate good
-stack traces, especially when we have bugs around unwind table generation.
-It applies only for Fuchsia targets (see below where it is unset).
-
-TODO(ZX-2361): Theoretically unwind tables should be good enough so we can
-remove this option when the issues are addressed.
-
-**Current value (from the default):** `true`
-
-From [//build/config/BUILD.gn:16](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/BUILD.gn#16)
-
-### extra_authorized_keys_file
-Additional SSH authorized_keys file to include in the build.
-For example:
-  extra_authorized_keys_file=\"$HOME/.ssh/id_rsa.pub\"
-
-**Current value (from the default):** `""`
-
-From [//third_party/openssh-portable/fuchsia/developer-keys/BUILD.gn:11](https://fuchsia.googlesource.com/third_party/openssh-portable/+/06e7ff1f5cc2f48f85255ea20127746cd6fce423/fuchsia/developer-keys/BUILD.gn#11)
-
-### rustc_prefix
-Sets a custom base directory for `rustc` and `cargo`.
-This can be used to test custom Rust toolchains.
-
-**Current value (from the default):** `"//buildtools/linux-x64/rust/bin"`
-
-From [//build/rust/config.gni:17](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/rust/config.gni#17)
-
-### scenic_enable_vulkan_validation
-Include the vulkan validation layers in scenic even in release builds
-TODO(SCN-1003): Set the default to false once we know why disabling
-validation layers causes a display swapchain setup issue.
-
-**Current value (from the default):** `true`
-
-From [//garnet/bin/ui/BUILD.gn:12](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/bin/ui/BUILD.gn#12)
-
-### update_kernels
-List of kernel images to include in the update (OTA) package.
-If no list is provided, all built kernels are included. The names in the
-list are strings that must match the filename to be included in the update
-package.
-
-**Current value (from the default):** `[]`
-
-From [//build/images/BUILD.gn:364](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#364)
-
-### use_ccache
-Set to true to enable compiling with ccache
-
-**Current value (from the default):** `false`
-
-From [//build/toolchain/ccache.gni:9](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/toolchain/ccache.gni#9)
-
-### enable_crashpad
-When this is set, Crashpad will be used to handle exceptions (which uploads
-crashes to the crash server), rather than crashanalyzer in Zircon (which
-prints the crash log to the the system log).
-
-**Current value (from the default):** `false`
-
-From [//build/images/crashpad.gni:9](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/crashpad.gni#9)
-
-### kernel_cmdline_files
-Files containing additional kernel command line arguments to bake into
-the boot image.  The contents of these files (in order) come after any
-arguments directly in [`kernel_cmdline_args`](#kernel_cmdline_args).
-These can be GN `//` source pathnames or absolute system pathnames.
-
-**Current value (from the default):** `[]`
-
-From [//build/images/BUILD.gn:352](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#352)
-
-### known_variants
-List of variants that will form the basis for variant toolchains.
-To make use of a variant, set [`select_variant`](#select_variant).
-
-Normally this is not set as a build argument, but it serves to
-document the available set of variants.
-See also [`universal_variants`](#universal_variants).
-Only set this to remove all the default variants here.
-To add more, set [`extra_variants`](#extra_variants) instead.
-
-Each element of the list is one variant, which is a scope defining:
-
-  `configs` (optional)
-      [list of labels] Each label names a config that will be
-      automatically used by every target built in this variant.
-      For each config `${label}`, there must also be a target
-      `${label}_deps`, which each target built in this variant will
-      automatically depend on.  The `variant()` template is the
-      recommended way to define a config and its `_deps` target at
-      the same time.
-
-  `remove_common_configs` (optional)
-  `remove_shared_configs` (optional)
-      [list of labels] This list will be removed (with `-=`) from
-      the `default_common_binary_configs` list (or the
-      `default_shared_library_configs` list, respectively) after
-      all other defaults (and this variant's configs) have been
-      added.
-
-  `deps` (optional)
-      [list of labels] Added to the deps of every target linked in
-      this variant (as well as the automatic `${label}_deps` for
-      each label in configs).
-
-  `name` (required if configs is omitted)
-      [string] Name of the variant as used in
-      [`select_variant`](#select_variant) elements' `variant` fields.
-      It's a good idea to make it something concise and meaningful when
-      seen as e.g. part of a directory name under `$root_build_dir`.
-      If name is omitted, configs must be nonempty and the simple names
-      (not the full label, just the part after all `/`s and `:`s) of these
-      configs will be used in toolchain names (each prefixed by a "-"),
-      so the list of config names forming each variant must be unique
-      among the lists in `known_variants + extra_variants`.
-
-  `toolchain_args` (optional)
-      [scope] Each variable defined in this scope overrides a
-      build argument in the toolchain context of this variant.
-
-  `host_only` (optional)
-  `target_only` (optional)
-      [scope] This scope can contain any of the fields above.
-      These values are used only for host or target, respectively.
-      Any fields included here should not also be in the outer scope.
-
-
-**Current value (from the default):**
-```
-[{
-  configs = ["//build/config/lto"]
-}, {
-  configs = ["//build/config/lto:thinlto"]
-}, {
-  configs = ["//build/config/profile"]
-}, {
-  configs = ["//build/config/scudo"]
-}, {
-  configs = ["//build/config/sanitizers:ubsan"]
-}, {
-  configs = ["//build/config/sanitizers:ubsan", "//build/config/sanitizers:sancov"]
-}, {
-  configs = ["//build/config/sanitizers:asan"]
-  host_only = {
-  remove_shared_configs = ["//build/config:symbol_no_undefined"]
-}
-  toolchain_args = {
-  use_scudo = false
-}
-}, {
-  configs = ["//build/config/sanitizers:asan", "//build/config/sanitizers:sancov"]
-  host_only = {
-  remove_shared_configs = ["//build/config:symbol_no_undefined"]
-}
-  toolchain_args = {
-  use_scudo = false
-}
-}, {
-  configs = ["//build/config/sanitizers:asan"]
-  host_only = {
-  remove_shared_configs = ["//build/config:symbol_no_undefined"]
-}
-  name = "asan_no_detect_leaks"
-  toolchain_args = {
-  asan_default_options = "detect_leaks=0"
-  use_scudo = false
-}
-}, {
-  configs = ["//build/config/sanitizers:asan", "//build/config/sanitizers:fuzzer"]
-  host_only = {
-  remove_shared_configs = ["//build/config:symbol_no_undefined"]
-}
-  remove_shared_configs = ["//build/config:symbol_no_undefined"]
-  toolchain_args = {
-  use_scudo = false
-}
-}, {
-  configs = ["//build/config/sanitizers:ubsan", "//build/config/sanitizers:fuzzer"]
-  remove_shared_configs = ["//build/config:symbol_no_undefined"]
-}]
-```
-
-From [//build/config/BUILDCONFIG.gn:334](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/BUILDCONFIG.gn#334)
-
-### scenic_vulkan_swapchain
-
-**Current value (from the default):** `1`
-
-From [//garnet/lib/ui/gfx/BUILD.gn:12](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/ui/gfx/BUILD.gn#12)
-
-### target_cpu
-
-**Current value for `target_cpu = "arm64"`:** `"arm64"`
-
-From //root_build_dir/args.gn:1
-
-**Overridden from the default:** `""`
-
-**Current value for `target_cpu = "x64"`:** `"x64"`
-
-From //root_build_dir/args.gn:1
-
-**Overridden from the default:** `""`
-
-### use_prebuilt_ffmpeg
-Use a prebuilt ffmpeg binary rather than building it locally.  See
-[//garnet/bin/mediaplayer/ffmpeg/README.md](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/bin/mediaplayer/ffmpeg/README.md) for details.  This is
-ignored when building media_player in variant builds (e.g. sanitizers);
-in that case, ffmpeg is always built from source so as to be built with
-the selected variant's config.  When this is false (either explicitly
-or because media_player is a variant build) then //third_party/ffmpeg
-must be in the source tree, which requires:
-`jiri import -name garnet manifest/ffmpeg https://fuchsia.googlesource.com/garnet`
-
-**Current value (from the default):** `true`
-
-From [//garnet/bin/mediaplayer/ffmpeg/BUILD.gn:14](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/bin/mediaplayer/ffmpeg/BUILD.gn#14)
-
-### zircon_asserts
-
-**Current value (from the default):** `true`
-
-From [//build/config/fuchsia/BUILD.gn:138](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/fuchsia/BUILD.gn#138)
-
-### zircon_boot_manifests
-Manifest files describing files to go into the `/boot` filesystem.
-Can be either // source paths or absolute system paths.
-`zircon_boot_groups` controls which files are actually selected.
-
-Since Zircon manifest files are relative to a Zircon source directory
-rather than to the directory containing the manifest, these are assumed
-to reside in a build directory that's a direct subdirectory of the
-Zircon source directory and thus their contents can be taken as
-relative to `get_path_info(entry, "dir") + "/.."`.
-
-**Current value (from the default):** `["//out/build-zircon/build-arm64/bootfs.manifest"]`
-
-From [//build/images/manifest.gni:44](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/manifest.gni#44)
-
-### rust_lto
-Sets the default LTO type for rustc bulids.
-
-**Current value (from the default):** `"unset"`
-
-From [//build/rust/config.gni:20](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/rust/config.gni#20)
-
-### select_variant_canonical
-*This should never be set as a build argument.*
-It exists only to be set in `toolchain_args`.
-See [//build/toolchain/clang_toolchain.gni](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/toolchain/clang_toolchain.gni) for details.
-
-**Current value (from the default):** `[]`
-
-From [//build/config/BUILDCONFIG.gn:618](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/BUILDCONFIG.gn#618)
-
-### symbol_level
-How many symbols to include in the build. This affects the performance of
-the build since the symbols are large and dealing with them is slow.
-  2 means regular build with symbols.
-  1 means minimal symbols, usually enough for backtraces only. Symbols with
-internal linkage (static functions or those in anonymous namespaces) may not
-appear when using this level.
-  0 means no symbols.
-
-**Current value (from the default):** `2`
-
-From [//build/config/compiler.gni:13](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/compiler.gni#13)
-
-### zircon_boot_groups
-Groups to include from the Zircon /boot manifest into /boot.
-This is either "all" or a comma-separated list of one or more of:
-  core -- necessary to boot
-  misc -- utilities in /bin
-  test -- test binaries in /bin and /test
-
-**Current value (from the default):** `"core"`
-
-From [//build/images/BUILD.gn:25](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#25)
-
-### bootfs_extra
-List of extra manifest entries for files to add to the BOOTFS.
-Each entry can be a "TARGET=SOURCE" string, or it can be a scope
-with `sources` and `outputs` in the style of a copy() target:
-`outputs[0]` is used as `TARGET` (see `gn help source_expansion`).
-
-**Current value (from the default):** `[]`
-
-From [//build/images/BUILD.gn:358](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#358)
-
-### crashpad_dependencies
-
-**Current value (from the default):** `"fuchsia"`
-
-From [//third_party/crashpad/build/crashpad_buildconfig.gni:22](https://chromium.googlesource.com/crashpad/crashpad/+/411f0ae41d96518dfa9b75f58424d5d26eb7c75c/build/crashpad_buildconfig.gni#22)
-
-### enable_value_subsystem
-
-**Current value (from the default):** `false`
-
-From [//garnet/bin/ui/scenic/BUILD.gn:11](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/bin/ui/scenic/BUILD.gn#11)
-
-### host_cpu
-
-**Current value (from the default):** `"x64"`
-
-### select_variant_shortcuts
-List of short names for commonly-used variant selectors.  Normally this
-is not set as a build argument, but it serves to document the available
-set of short-cut names for variant selectors.  Each element of this list
-is a scope where `.name` is the short name and `.select_variant` is a
-a list that can be spliced into [`select_variant`](#select_variant).
-
-**Current value (from the default):**
-```
-[{
-  name = "host_asan"
-  select_variant = [{
-  dir = ["//third_party/yasm", "//third_party/vboot_reference", "//garnet/tools/vboot_reference"]
-  host = true
-  variant = "asan_no_detect_leaks"
-}, {
-  host = true
-  variant = "asan"
-}]
-}, {
-  name = "asan"
-  select_variant = [{
-  target_type = ["driver_module"]
-  variant = false
-}, {
-  host = false
-  variant = "asan"
-}]
-}]
-```
-
-From [//build/config/BUILDCONFIG.gn:439](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/BUILDCONFIG.gn#439)
-
-### thinlto_cache_dir
-ThinLTO cache directory path.
-
-**Current value (from the default):** `"thinlto-cache"`
-
-From [//build/config/lto/config.gni:16](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/lto/config.gni#16)
-
-### use_vulkan_loader_for_tests
-Mesa doesn't properly handle loader-less operation;
-their GetInstanceProcAddr implementation returns 0 for some interfaces.
-On ARM there may be multiple libvulkan_arms, so they can't all be linked
-to.
-
-**Current value (from the default):** `true`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:33](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#33)
-
-### amlogic_decoder_tests
-
-**Current value (from the default):** `false`
-
-From [//garnet/drivers/video/amlogic-decoder/BUILD.gn:10](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/drivers/video/amlogic-decoder/BUILD.gn#10)
-
-### enable_gfx_subsystem
-
-**Current value (from the default):** `true`
-
-From [//garnet/bin/ui/scenic/BUILD.gn:12](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/bin/ui/scenic/BUILD.gn#12)
-
-### expat_build_root
-
-**Current value (from the default):** `"//third_party/expat"`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:7](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#7)
-
-### rust_toolchain_triple_suffix
-Sets the fuchsia toolchain target triple suffix (after arch)
-
-**Current value (from the default):** `"fuchsia"`
-
-From [//build/rust/config.gni:23](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/rust/config.gni#23)
-
-### target_os
-
-**Current value (from the default):** `""`
-
-### zircon_use_asan
-Set this if [`zircon_build_dir`](#zircon_build_dir) was built with
-`USE_ASAN=true`, e.g. `[//scripts/build-zircon.sh](https://fuchsia.googlesource.com/scripts/+/29d2c8a30ee569575151a6fd55617d05b25612c1/build-zircon.sh) -A`.  This mainly
-affects the defaults for [`zircon_build_dir`](#zircon_build_dir) and
-[`zircon_build_abi_dir`](#zircon_build_abi_dir).  It also gets noticed
-by [//scripts/fx](https://fuchsia.googlesource.com/scripts/+/29d2c8a30ee569575151a6fd55617d05b25612c1/fx) commands that rebuild Zircon so that they use `-A`
-again next time.
-
-**Current value (from the default):** `false`
-
-From [//build/config/fuchsia/zircon.gni:40](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/fuchsia/zircon.gni#40)
-
-### build_sdk_archives
-Whether to build SDK tarballs.
-
-**Current value (from the default):** `false`
-
-From [//build/sdk/sdk.gni:11](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/sdk/sdk.gni#11)
-
-### glm_build_root
-
-**Current value (from the default):** `"//third_party/glm"`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:9](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#9)
-
-### magma_python_path
-
-**Current value (from the default):** `"/b/s/w/ir/kitchen-workdir/third_party/mako"`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:12](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#12)
-
-### system_package_key
-The package key to use for signing Fuchsia packages made by the
-`package()` template (and the `system_image` packge).  If this
-doesn't exist yet when it's needed, it will be generated.  New
-keys can be generated with the `pm -k FILE genkey` host command.
-
-**Current value (from the default):** `"//build/development.key"`
-
-From [//build/package.gni:16](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/package.gni#16)
-
-### prebuilt_libvulkan_arm_path
-
-**Current value (from the default):** `""`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:25](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#25)
-
-### use_thinlto
-Use ThinLTO variant of LTO if use_lto = true.
-
-**Current value (from the default):** `true`
-
-From [//build/config/lto/config.gni:10](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/lto/config.gni#10)
-
-### zircon_build_abi_dir
-Zircon build directory for `target_cpu`, containing link-time `.so.abi`
-files that GN `deps` on [//zircon/public](https://fuchsia.googlesource.com/zircon/+/9f5f424a60876c51d94d82f44c5a8820ecd3db51/public) libraries will link against.
-This should not be a sanitizer build.
-
-**Current value (from the default):** `"//out/build-zircon/build-arm64"`
-
-From [//build/config/fuchsia/zircon.gni:14](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/fuchsia/zircon.gni#14)
-
-### zircon_build_dir
-Zircon build directory for `target_cpu`, containing `.manifest` and
-`.zbi` files for Zircon's BOOTFS and kernel.  This provides the kernel
-and Zircon components used in the boot image.  It also provides the
-Zircon shared libraries used at runtime in Fuchsia packages.
-
-If left `""` (the default), then this is computed from
-[`zircon_build_abi_dir`](#zircon_build_abi_dir) and
-[`zircon_use_asan`](#zircon_use_asan).
-
-**Current value (from the default):** `""`
-
-From [//build/config/fuchsia/zircon.gni:24](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/fuchsia/zircon.gni#24)
-
-### crashpad_use_boringssl_for_http_transport_socket
-
-**Current value (from the default):** `true`
-
-From [//third_party/crashpad/util/net/tls.gni:18](https://chromium.googlesource.com/crashpad/crashpad/+/411f0ae41d96518dfa9b75f58424d5d26eb7c75c/util/net/tls.gni#18)
-
-### enable_input_subsystem
-
-**Current value (from the default):** `true`
-
-From [//garnet/bin/ui/scenic/BUILD.gn:14](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/bin/ui/scenic/BUILD.gn#14)
-
-### fuchsia_packages
-List of packages (a GN list of strings).
-This list of packages is added to the set of "available" packages, see
-`products` for more information.
-
-**Current value for `target_cpu = "arm64"`:** `["peridot/packages/buildbot"]`
-
-From //root_build_dir/args.gn:2
-
-**Overridden from the default:** `[]`
-
-From [//build/gn/packages.gni:30](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/gn/packages.gni#30)
-
-**Current value for `target_cpu = "x64"`:** `["peridot/packages/buildbot"]`
-
-From //root_build_dir/args.gn:2
-
-**Overridden from the default:** `[]`
-
-From [//build/gn/packages.gni:30](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/gn/packages.gni#30)
-
-### msd_intel_gen_build_root
-
-**Current value (from the default):** `"//garnet/drivers/gpu/msd-intel-gen"`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:8](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#8)
-
-### kernel_cmdline_args
-List of kernel command line arguments to bake into the boot image.
-See also [//zircon/docs/kernel_cmdline.md](https://fuchsia.googlesource.com/zircon/+/9f5f424a60876c51d94d82f44c5a8820ecd3db51/docs/kernel_cmdline.md) and
-[`devmgr_config`](#devmgr_config).
-
-**Current value (from the default):** `[]`
-
-From [//build/images/BUILD.gn:346](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#346)
-
-### magma_enable_tracing
-Enable this to include fuchsia tracing capability
-
-**Current value (from the default):** `true`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:15](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#15)
-
-### thinlto_jobs
-Number of parallel ThinLTO jobs.
-
-**Current value (from the default):** `8`
-
-From [//build/config/lto/config.gni:13](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/lto/config.gni#13)
-
-### vk_loader_debug
-
-**Current value (from the default):** `"warn,error"`
-
-From [//third_party/vulkan_loader_and_validation_layers/loader/BUILD.gn:26](https://fuchsia.googlesource.com/third_party/vulkan_loader_and_validation_layers/+/3106666ca09bdab1a0f3c4c5d4d614bf4dab1f3d/loader/BUILD.gn#26)
-
-### data_image_size
-The size of the minfs data partition image to create. Normally this image
-is added to FVM, and can therefore expand as needed. It must be at least
-10mb (the default) in order to be succesfully initialized.
-
-**Current value (from the default):** `"10m"`
-
-From [//build/images/BUILD.gn:593](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#593)
-
-### fuchsia_products
-List of product definition files describing the packages to build, and
-where they are to be installed in images and updates.
-
-A product definition file is a JSON file containing:
-monolith:
-  a list of packages included in OTA images, base system images, and the
-  distribution repository.
-preinstall:
-  a list of packages pre-installed on the system (also added to the
-  distribution repository)
-available:
-  a list of packages only added to the distribution repository)
-
-If a package is referenced in monolith and in preinstall, monolith takes
-priority, and the package will be added to OTA images as part of the
-verified boot set of static packages.
-
-If unset, layer will be guessed using //.jiri_manifest and
-//{layer}/products/default will be used.
-
-**Current value (from the default):** `[]`
-
-From [//build/gn/packages.gni:25](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/gn/packages.gni#25)
-
-### fvm_slice_size
-The size of the FVM partition images "slice size". The FVM slice size is a
-minimum size of a particular chunk of a partition that is stored within
-FVM. A very small slice size may lead to decreased throughput. A very large
-slice size may lead to wasted space. The selected default size of 8mb is
-selected for conservation of space, rather than performance.
-
-**Current value (from the default):** `"8388608"`
-
-From [//build/images/BUILD.gn:606](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#606)
-
-### host_tools_dir
-This is the directory where host tools intended for manual use by
-developers get installed.  It's something a developer might put
-into their shell's $PATH.  Host tools that are just needed as part
-of the build do not get copied here.  This directory is only for
-things that are generally useful for testing or debugging or
-whatnot outside of the GN build itself.  These are only installed
-by an explicit install_host_tools() rule (see [//build/host.gni](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/host.gni)).
-
-**Current value (from the default):** `"//root_build_dir/tools"`
-
-From [//build/host.gni:13](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/host.gni#13)
-
-### zedboot_devmgr_config
-List of arguments to populate /boot/config/devmgr in the Zedboot image.
-
-**Current value (from the default):** `["netsvc.netboot=true"]`
-
-From [//build/images/zedboot/BUILD.gn:24](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/zedboot/BUILD.gn#24)
-
-### amber_repository_blobs_dir
-
-**Current value (from the default):** `"//root_build_dir/amber-files/repository/blobs"`
-
-From [//garnet/go/src/pm/pm.gni:16](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/go/src/pm/pm.gni#16)
-
-### build_msd_arm_mali
-
-**Current value (from the default):** `true`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:21](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#21)
-
-### clang_prefix
-
-**Current value (from the default):** `"../buildtools/linux-x64/clang/bin"`
-
-From [//build/config/clang/clang.gni:9](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/clang/clang.gni#9)
-
-### extra_manifest_args
-Extra args to globally apply to the manifest generation script.
-
-**Current value (from the default):** `[]`
-
-From [//build/images/manifest.gni:47](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/manifest.gni#47)
-
-### zedboot_cmdline_args
-List of kernel command line arguments to bake into the Zedboot image.
-See [//zircon/docs/kernel_cmdline.md](https://fuchsia.googlesource.com/zircon/+/9f5f424a60876c51d94d82f44c5a8820ecd3db51/docs/kernel_cmdline.md) and
-[`zedboot_devmgr_config`](#zedboot_devmgr_config).
-
-**Current value (from the default):** `[]`
-
-From [//build/images/zedboot/BUILD.gn:15](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/zedboot/BUILD.gn#15)
-
-### cloudkms_key_dir
-
-**Current value (from the default):** `"projects/fuchsia-infra/locations/global/keyRings/test-secrets/cryptoKeys"`
-
-From [//build/testing/secret_spec.gni:8](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/testing/secret_spec.gni#8)
-
-### custom_signing_script
-If non-empty, the given script will be invoked to produce a signed ZBI
-image. The given script must accept -z for the input zbi path, and -o for
-the output signed zbi path. The path must be in GN-label syntax (i.e.
-starts with //).
-
-**Current value (from the default):** `""`
-
-From [//build/images/custom_signing.gni:10](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/custom_signing.gni#10)
-
-### devmgr_config
-List of arguments to add to /boot/config/devmgr.
-These come after synthesized arguments to configure blobfs and pkgfs,
-and the one generated for [`enable_crashpad`](#enable_crashpad).
-
-**Current value (from the default):** `[]`
-
-From [//build/images/BUILD.gn:341](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#341)
-
-### magma_build_root
-
-**Current value (from the default):** `"//garnet/lib/magma"`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:6](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#6)
-
-### use_scudo
-Enable the [Scudo](https://llvm.org/docs/ScudoHardenedAllocator.html)
-memory allocator.
-
-**Current value (from the default):** `true`
-
-From [//build/config/scudo/scudo.gni:8](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/scudo/scudo.gni#8)
-
-### zircon_aux_manifests
-
-**Current value (from the default):** `["//out/build-zircon/build-arm64-asan/bootfs.manifest"]`
-
-From [//build/images/manifest.gni:32](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/manifest.gni#32)
-
-### zircon_build_root
-
-**Current value (from the default):** `"//zircon"`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:10](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#10)
-
-### amber_repository_dir
-Directory containing files named by their merkleroot content IDs in
-ASCII hex.  The [//build/image](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/image):pm_publish_blobs target populates
-this with copies of build products, but never removes old files.
-
-**Current value (from the default):** `"//root_build_dir/amber-files"`
-
-From [//garnet/go/src/pm/pm.gni:11](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/go/src/pm/pm.gni#11)
-
-### build_intel_gen
-
-**Current value (from the default):** `false`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:23](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#23)
-
-### current_os
-
-**Current value (from the default):** `""`
-
-### fvm_image_size
-The size in bytes of the FVM partition image to create. Normally this is
-computed to be just large enough to fit the blob and data images. The
-default value is "", which means to size based on inputs. Specifying a size
-that is too small will result in build failure.
-
-**Current value (from the default):** `""`
-
-From [//build/images/BUILD.gn:599](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/images/BUILD.gn#599)
-
-## `target_cpu = "arm64"`
-
-### arm_tune
-The ARM variant-specific tuning mode. This will be a string like "armv6"
-or "cortex-a15". An empty string means to use the default for the
-arm_version.
-
-**Current value (from the default):** `""`
-
-From [//build/config/arm.gni:25](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/arm.gni#25)
-
-### arm_use_neon
-Whether to use the neon FPU instruction set or not.
-
-**Current value (from the default):** `true`
-
-From [//build/config/arm.gni:28](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/arm.gni#28)
-
-### arm_version
-
-**Current value (from the default):** `8`
-
-From [//build/config/arm.gni:12](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/arm.gni#12)
-
-### msd_arm_enable_all_cores
-Enable all 8 cores, which is faster but emits more heat.
-
-**Current value (from the default):** `true`
-
-From [//garnet/drivers/gpu/msd-arm-mali/src/BUILD.gn:9](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/drivers/gpu/msd-arm-mali/src/BUILD.gn#9)
-
-### msd_arm_enable_cache_coherency
-With this flag set the system tries to use cache coherent memory if the
-GPU supports it.
-
-**Current value (from the default):** `true`
-
-From [//garnet/drivers/gpu/msd-arm-mali/src/BUILD.gn:13](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/drivers/gpu/msd-arm-mali/src/BUILD.gn#13)
-
-### arm_float_abi
-The ARM floating point mode. This is either the string "hard", "soft", or
-"softfp". An empty string means to use the default one for the
-arm_version.
-
-**Current value (from the default):** `""`
-
-From [//build/config/arm.gni:20](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/arm.gni#20)
-
-### arm_optionally_use_neon
-Whether to enable optional NEON code paths.
-
-**Current value (from the default):** `false`
-
-From [//build/config/arm.gni:31](https://fuchsia.googlesource.com/build/+/fb9b46cbb98da8b92fdfd2dc1a8beba0836807e8/config/arm.gni#31)
-
-## `target_cpu = "x64"`
-
-### use_mock_magma
-
-**Current value (from the default):** `false`
-
-From [//third_party/mesa/src/intel/vulkan/BUILD.gn:25](https://fuchsia.googlesource.com/third_party/mesa/+/2f2abaa7aa5ab971d80c831f077df11747790d1f/src/intel/vulkan/BUILD.gn#25)
-
-### mesa_build_root
-
-**Current value (from the default):** `"//third_party/mesa"`
-
-From [//garnet/lib/magma/gnbuild/magma.gni:41](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/lib/magma/gnbuild/magma.gni#41)
-
-### msd_intel_enable_mapping_cache
-
-**Current value (from the default):** `false`
-
-From [//garnet/drivers/gpu/msd-intel-gen/src/BUILD.gn:8](https://fuchsia.googlesource.com/garnet/+/6dd381288512e11bfda06566bf15d5a6cc69a390/drivers/gpu/msd-intel-gen/src/BUILD.gn#8)
-
diff --git a/docs/images/fuchsia-logo-32x32.png b/docs/images/fuchsia-logo-32x32.png
deleted file mode 100644
index 72f753f..0000000
--- a/docs/images/fuchsia-logo-32x32.png
+++ /dev/null
Binary files differ
diff --git a/docs/ledger/README.md b/docs/ledger/README.md
deleted file mode 100644
index 0448ff7..0000000
--- a/docs/ledger/README.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Ledger
-
-[TOC]
-
-## What is Ledger?
-
-Ledger is a distributed storage system for Fuchsia.
-
-Each application (or more precisely, each [component]) running on behalf of a
-particular user has a separate data store provided and managed by Ledger, and
-vended to a client application by Fuchsia framework through its [component
-context].
-
-The data store for the particular component/user combination is private - not
-accessible to other apps of the same user, and not accessible to other users of
-the same app.
-
-Each data store is transparently **synchronized** across devices of its user
-through a [cloud provider]. Any data operations are made **offline-first** with
-no coordination with the cloud. If concurrent modifications result in a data
-conflict, the conflict is resolved using an app-configurable merge policy.
-
-Each data store is organized into collections exposing a **key-value store** API
-called *pages*. Page API supports storing data of arbitrary size, atomic changes
-across multiple keys, snapshots and modification observers.
-
-## Documentation
-
-Documentation for using Ledger:
-
- - [User Guide](user_guide.md)
-
-Documentation for integrating with Ledger in client apps:
-
- - [API Guide](api_guide.md)
- - [Data Organization](data_organization.md)
- - [Examples](examples.md)
-
-Documentation for setting up a remote Cloud sync provider:
-
- - [Firestore]
-
-Documentation for developing Ledger:
-
- - [Field Data](field_data.md)
- - [Style Guide](style_guide.md)
- - [Testing](testing.md)
-
-Design documentation:
-
- - [Architecture](architecture.md)
- - [Conflict Resolution](conflict_resolution.md)
- - [Data in Storage](data_in_storage.md)
- - [Life of a Put](life_of_a_put.md)
-
-
-[cloud provider]: /public/fidl/fuchsia.ledger.cloud/cloud_provider.fidl
-[component context]: /public/fidl/fuchsia.modular/component/component_context.fidl
-[Firestore]: /bin/cloud_provider_firestore/README.md
diff --git a/docs/ledger/api_guide.md b/docs/ledger/api_guide.md
deleted file mode 100644
index 376b5d5..0000000
--- a/docs/ledger/api_guide.md
+++ /dev/null
@@ -1,266 +0,0 @@
-# API Guide
-
-This document describes how to use Ledger for synchronized application storage
-in a client application. The goal of the document is to explain the key concepts
-and the most common operations, not necessarily to cover the entire API surface.
-
-[TOC]
-
-## Connecting to Ledger
-
-The Ledger API is exposed through a [FIDL interface].
-
-Access to Ledger is vended from the `fuchsia::modular::ComponentContext` of the running
-application. Each application component has a separate private data store for
-each user on behalf of which it runs.
-
-|||---|||
-#### C++
-
-``` cpp
-module_context->GetComponentContext(
-    component_context_.NewRequest());
-fuchsia::ledger::LedgerPtr ledger;
-ledger.set_error_handler([](zx_status_t status) {
-  // Handle ledger and connection errors.
-});
-component_context_->GetLedger(ledger.NewRequest());
-```
-
-#### Dart
-
-``` dart
-moduleContext.getComponentContext(
-    componentContext.ctrl.request());
-final LedgerProxy ledger = new LedgerProxy();
-ledger.ctrl.error.then((ProxyError error) {
-  // Handle ledger and connection errors.
-});
-componentContext.getLedger(ledger.ctrl.request());
-```
-|||---|||
-
-*** aside
-Note that the Ledger connection is provided through a FIDL *interface request*,
-so it can be immediately used to make requests.
-***
-
-## Working with pages
-
-Data stored in Ledger is grouped into separate independent key-value stores
-called *pages*.
-
-Pages are identified by ids of 16 bytes each. When creating a page, the
-application can pick its id (for example, to create/access a page with a name
-that is fixed and known in advance), or can request a new unique id to be
-generated by Ledger (for example, to create pages that correspond 1-1 to
-business logic objects). Ledger also offers a convenience method `GetRootPage()`
-which retrieves the page with id `[0, 0 ... , 0]`.
-
-|||---|||
-#### C++
-
-``` cpp
-fuchsia::ledger::PagePtr page;
-ledger->GetRootPage(page.NewRequest(),
-    [] (fuchsia::ledger::Status status) {
-  if (status != fuchsia::ledger::Status::OK) {
-    // Handle errors.
-  }
-});
-page.set_error_handler([] (zx_status_t status) {
-  // Handle connection errors.
-});
-```
-
-#### Dart
-
-``` dart
-final PageProxy page = new PageProxy();
-_ledger.getRootPage(
-    page.ctrl.request(), (Status status) {  
-  if (status != Status.ok) {
-    // Handle errors.
-  }
-});
-page.ctrl.error.then((ProxyError error) {
-  // Handle connection errors.
-}
-```
-|||---|||
-
-## Page API
-
-Each page exposes a key-value store API.
-
-The state of each page changes in commits which form a DAG. This DAG is not
-directly exposed to the developer through the Ledger API, but we mention it as
-it helps to understand how the page operations described below behave.
-
-*** promo
-History of a page can and does diverge when the page is modified concurrently on
-multiple devices (or even locally on separate connections to the same page).
-However, it's important to note that any given local page connection (/page
-proxy) always tracks **one path** through the commit history and only advances
-forward.
-***
-
-### Writing
-
-Values can be written/modified using mutation methods of the Page interface.
-
-There are two ways to write a value into a page:
-
- - directly, passing the value in a FIDL message (that's `Put()` and
-   `PutWithPriority()` methods). This is handy, but note that the developer
-   needs to ensure that the value does not exceed the maximum payload size of a
-   FIDL message.
- - in two steps: first streaming the data to be written to a "reference", and
-   then setting the value using the reference. (through a combination of
-   `CreateReferenceFromSocket()`, `CreateReferenceFromBuffer()` and
-   `PutReference()`. Note that the created reference is temporary and not
-   persisted through app restarts - it must be set through `PutReference()`, or
-   discarded.
-
-### Reading
-
-In order to ensure that reads across multiple entries (key-value pairs) are
-consistent, read operations are exposed through a snapshot API. Snapshot of the
-page can be obtained:
-
- - directly from the page interface (`GetSnapshot()`), yielding a snapshot
-   corresponding to the state of the page tracked by this page connection
- - through the [watcher](#Watch) interface, which when delivering each
-   notification allows to also request the snapshot corresponding to the state
-   associated with the notification
-
-Once the snapshot is obtained, data can be read using the `GetEntries()` method
-which retrieves multiple entries, or the `Get()` method which retrieves the
-value associated with the particular key.
-
-#### Range queries
-
-The `GetEntries()` method takes a `key_start` argument, allowing the app to
-perform a *range query*. In order to retrieve all entries between two keys, we
-need to call `GetEntries()` with the first key passed as `key_start`, and
-continue reading the paginated response as long as the returned values are in
-the desired range.
-
-### Lazy values
-
-`PutWithPriority()` and `PutReference()` methods allow the app to write a value
-as a *lazy value*. Compared with the default *eager values*, lazy values are not
-guaranteed to be proactively fetched to the local device when the Page syncs to
-the state that contains them. The **keys** of the lazy values are always synced
-eagerly, but the value itself might be missing.
-
-To ensure predictable performance of read operations, `Get()` and `GetEntries`
-methods never retrieve the missing lazy values from the network - these must be
-explicitly requested through a dedicated `Fetch()` method.
-
-### Watch
-
-The client application can register a watcher to be notified of changes to the
-state tracked by the local page connection. As typically we are interested in
-retrieving the initial base state at the moment of registering the watcher,
-the watchers are registered using the `GetSnapshot()` method.
-
-[C++ watcher example], [Dart watcher example].
-
-`GetSnapshot()` takes an optional `key_prefix` parameter, which allows the
-client app to register specifically for change notifications within a particular
-prefix of keys.
-
-### Transactions
-
-Transactions allow the application to make a set of changes that are guaranteed
-to be synced and surfaced atomically. A client application would typically:
-
- - start a transaction
- - get a snapshot of the page state through `GetSnapshot()` or a watcher (see
-   below), and read the data
- - make changes through the Page interface
- - commit the transaction
-
-Once a transaction is started, the state of the page tracked on the page
-connection is pinned and won't advance until the transaction is either committed
-or aborted - this ensures that the transaction writes affect precisely the state
-visible on the page snapshot.
-
-There can be only one transaction in progress per `Page` connection, but
-clients can create multiple connections to the same page. Each of these
-connections can run a transaction independently from the others.
-
-*** note
-*Watch and transactions*: As starting a transaction pins the state of the page
-visible on the particular page connection, the client app won't receive any
-watch notifications (for watchers registered on this page connection) while the
-transaction is in progress.
-
-Conversely, on a page connection with registered watchers, a
-`StartTransaction()` call will only return when the app finishes processing all
-pending change notification. This ensures the app knows the base state of the
-page when performing a transaction.
-***
-
-## Conflict resolution
-
-If the page history has diverged and has more than one head, conflict resolution
-will be invoked to merge the heads.
-
-*** aside
-Note that this condition is not associated with any particular local page
-connection - there could be multiple local page connections on different
-divergent heads. Conflict resolution is therefore configured through the Ledger
-connection.
-***
-
-By default, a key-by-key last-one-wins policy is used to merge divergent
-commits, based on best-effort, not-guaranteed-to-be-right, timestamps of each
-commit.
-
-The client might opt for a different merge policy by implementing the
-`ConflictResolverFactory` interface and setting it through a Ledger connection.
-
-Available conflict resolution policies:
-
- - last-one-wins (the default): `LAST_ONE_WINS`
-
-   For each entry modified on both sides, `LAST_ONE_WINS` takes the entry from
-   the most recent commit; for each entry modified only on one side (e.g.:
-   when adding a new key, or when modifying an existing one), the modification
-   is carried over. The most recent commit is determined using timestamps
-   assigned to the commits by the devices that created them. Note, however that
-   these timestamps are not guaranteed to be accurate.
- - custom, invoked only for conflicting (modified on both branches being
-   merged) entries: `AUTOMATIC_WITH_FALLBACK`
-
-   For all modified keys, if either they are modified only on one side, or
-   changed in the same way (added/updated with the same value, or deleted) in
-   both sides, `AUTOMATIC_WITH_FALLBACK` applies the change automatically. If,
-   however any key is modified on both sides with a non identical change, the
-   app gets a callback with all changed entries from both sides (not just the
-   conflicting ones).
- - custom, invoked for all merges (even if the entries modified by each branch
-   are non-conflicting): `CUSTOM`
-
-   Conflicting changes are ignored and there are no merges performed.
-
-
-See also [Conflict Resolution](conflict_resolution.md).
-
-## Synchronization
-
-Synchronization is configured at the Ledger level as described in the [user
-guide](user_guide.md). Once configured, the Ledger will upload local changes,
-and download changes made by other devices. These operations will happen
-automatically in the background, and clients do not have to manage them.
-
-## See also
-
- - [Data Organization](data_organization.md)
- - [Examples of client apps](examples.md)
-
-[FIDL interface]: /public/fidl/fuchsia.ledger/ledger.fidl
-[C++ watcher example]: /examples/todo_cpp/todo.h
-[Dart watcher example]: https://fuchsia.googlesource.com/topaz/+/master/examples/ledger/todo_list/lib/src/models/todo_list_model.dart
diff --git a/docs/ledger/architecture.md b/docs/ledger/architecture.md
deleted file mode 100644
index 773ad24..0000000
--- a/docs/ledger/architecture.md
+++ /dev/null
@@ -1,100 +0,0 @@
-# Architecture
-
-This document explains the internal architecture of Ledger.
-
-[TOC]
-
-## Overview
-
-The Ledger implementation is logically composed of the following components:
-
- - **Storage** that stores and provides access to the data locally,
- - client components that interact with storage:
-   - **Local client** that exposes Ledger FIDL API to locally running apps,
-   - **Cloud sync** that synchronizes the Ledger state across devices
-
-![architecture diagram](architecture.png)
-
-All of these components run together within the Ledger process.
-
-## Storage
-
-*** promo
-Ledger stores data in key-value stores called pages. A page changes in atomic
-commits, each commit adding, removing or modifying one or more entries in the
-key-value store.
-
-The commit history of each page forms a DAG in which each commit has either no
-parents (initial commit), 1 parent (regular commit) or 2 parents (merge commit).
-***
-
-The Storage component persists:
-
- - the commit history of each page
- - immutable storage objects holding the state of each page
- - sync metadata, including synchronization state of each object
-
-The contents of each commit are key-value pairs (entries), stored in a
-B-Tree-like structure with the following main properties:
-
- - entries are ordered by the keys, permitting efficient evaluation of range
-   queries
- - tree nodes are immutable, allowing referencing the same node from two (or
-   more) different commits and thus avoiding duplicating the state among
-   different commits with similar content
- - the B-Tree is history-independent, i.e. given the same set of entries, the
-   resulting structure of the tree will be the same, independently of the
-   insertion order. This property permits to efficiently compute the diff
-   between two given commits.
-
-Storage exposes a key-value API to Local client and creates new storage objects
-and commits in response to modifications the Local client makes. Similarly,
-Storage receives commits and storage objects synced from other devices from
-Cloud Sync.
-
-Code:
-
- - [/bin/ledger/storage], in particular:
-   - [/bin/ledger/storage/public] contains the public (exposed to other components) API
-   - [/bin/ledger/storage/impl] contains the implementation
-   - [/bin/ledger/storage/impl/btree] contains the implementation of the B-tree
-
-## Local client
-
-Local Client exposes a FIDL API to apps running on the device. In response to
-modifications to the key-value store requested by apps connecting to Ledger, it
-makes corresponding calls to Storage.
-
-When notified about a conflict by Storage, Local client resolves it according to
-the policy selected by the client app, calling back to it if necessary - see
-[Conflict resolution](api_guide.md#Conflict-resolution) in the API Guide.
-
-Code:
-
- - [/bin/ledger/app], in particular:
-   - [/bin/ledger/app/merging] implements conflict resolution
-
-## Cloud sync
-
-Cloud sync is notified by Storage about new locally-produced commits and is
-responsible for pushing them, along with the associated storage objects, to the
-cloud. Conversely, Cloud sync also tracks new commits being synced to the cloud
-by other devices, downloads them and registers them with Storage.
-
-Code:
-
- - [/bin/ledger/cloud_sync] implements high-level cloud sync logic, in particular:
-   - [/bin/ledger/cloud_sync/public] contains the public (exposed to other components) API
-   - [/bin/ledger/cloud_sync/impl] contains the implementation
- - [/bin/cloud_provider_firestore] implements integration with cloud services
-
-[/bin/ledger/storage]: /bin/ledger/storage/
-[/bin/ledger/storage/public]: /bin/ledger/storage/public/
-[/bin/ledger/storage/impl]: /bin/ledger/storage/impl/
-[/bin/ledger/storage/impl/btree]: /bin/ledger/storage/impl/btree/
-[/bin/ledger/app]: /bin/ledger/app/
-[/bin/ledger/app/merging]: /bin/ledger/app/merging/
-[/bin/ledger/cloud_sync]: /bin/ledger/cloud_sync/
-[/bin/ledger/cloud_sync/public]: /bin/ledger/cloud_sync/public/
-[/bin/ledger/cloud_sync/impl]: /bin/ledger/cloud_sync/impl/
-[/bin/cloud_provider_firestore]: /bin/ledger/cloud_provider_firestore/
diff --git a/docs/ledger/architecture.png b/docs/ledger/architecture.png
deleted file mode 100644
index 62bfc9c..0000000
--- a/docs/ledger/architecture.png
+++ /dev/null
Binary files differ
diff --git a/docs/ledger/conflict_resolution.md b/docs/ledger/conflict_resolution.md
deleted file mode 100644
index 2828d30..0000000
--- a/docs/ledger/conflict_resolution.md
+++ /dev/null
@@ -1,176 +0,0 @@
-# Conflict Resolution
-
-This document explains how Ledger handles conflicts.
-
-[TOC]
-
-## Conflicts
-
-Ledger is an offline-first database - devices can naturally diverge when making
-concurrent changes and thus, the change history forms a directed acyclic graph
-(DAG) of [commits](architecture.md#Storage). Whenever the local history DAG has
-more than one head commit, i.e. more than one leaf in the DAG, we call this
-state a **conflict**.
-
-*** aside
-A conflict can be created by **two devices** making a concurrent modification of
-the Ledger state, but also by a **single device** making two concurrent changes
-to the local state - this is usually not desirable, but certainly possible.
-***
-
-Whenever a conflict arises, Ledger by default merges the local heads
-automatically, using an entry-by-entry last-one-wins policy based on
-non-reliable timestamps of the two commits being merged. See the [Merge
-Strategies](#Merge-Strategies) section for more details.
-
-Client apps that want to override this behavior can opt for either one of the
-predefined merging policies or use a custom policy and handle the merges
-themselves, see [Conflict Resolution](api_guide.md#Conflict-resolution) in the
-API Guide.
-
-## Convergence
-
-As the same conflict can be resolved concurrently on two devices, the resulting
-state can once more be different between devices. This can potentially create a
-situation where two or more devices keep creating merge commits that are then
-synced and merged again. This situation is called a **merge storm**.
-
-Ledger employs a number of strategies in order to prevent merge storms:
-
- - a device uploads local changes **only** when the local state is resolved
-   (there is a single local head). If the local state is divergent, the device
-   first resolves the conflicts and only later uploads the result.
- - identical merge of two commits made concurrently on multiple devices results
-   in the exact same commit (as long as the conflict resolver makes the same
-   decisions, i.e. is deterministic). This is ensured because commits are
-   content-addressed based on the B-tree content and the commit metadata; and
-   commit metadata of a merge commit, including the commit timestamp, depends
-   only on the parent commits - the timestamp is selected as the biggest of two
-   parent timestamps.
- - when merging **two merge commits**, Ledger waits with exponential backoff,
-   allowing one device to win the race and have a final say on the resolved state.
-   The exponential backoff should occur only if the two devices create
-   conflicting merge commits, e.g. if the conflict resolution is not
-   deterministic (see below).
-
-## Merge Strategies
-
-For each [page](data_organization.md#Pages), client apps can define a *merge
-strategy*. These strategies determine the behavior of Ledger when a conflict is
-detected, and are appropriate for different situations.
-
-To avoid merge storms (as described above), we ensure that any automatic merge
-strategy is **deterministic**, so that two devices seeing the same conflict
-reach the same resolution.
-
-### Last-one-wins
-
-The *last-one-wins* merge strategy is the default one, i.e. the one applied if
-the client app didn't configure any other strategy. When using this strategy,
-the client app delegates all merging to Ledger and doesn't have to handle
-merges.
-
-The last-one-wins strategy operates by taking, for each conflicting key/value
-pair, the one present in the latest commit, ordered by creation timestamp.
-However, if a key/value pair is modified by one commit only (added, removed, or
-changed value), the modification is taken, regardless of the timestamp.
-
-This strategy is very convenient for applications that use Ledger to store
-independent key/value pairs, as it removes the burden of merging from the
-client application entirely. Storing independent key/value user preferences
-would be a good case for this strategy.
-
-*** aside
-The creation timestamps are generated on each device. Thus, unsynchronized
-clocks or clock drift between devices may result in older values taking
-precedence over new ones.
-
-We think this is fine because:
-* We want a fully automatic merge strategy for developers who don't have
-cross-key consistency needs and want to keep their app simple. Others should
-use the more advanced policies with custom mergers.
-* We could do an "arbitrary-one wins" merge policy and use the ordering of an
-internal ID other than a timestamp. As long as this ID (as the timestamp) is
-fixed for a given commit, then the merge is deterministic and we can have a
-valid merge. It seemed better to us to use a policy that makes sense to users
-in the usual case, rather than a random-looking policy.
-* This merge policy operates per key/value pair. This means that the timestamp
-is used only when a value has been changed on both sides: any merge strategy
-must discard at least one of the two values. We think this case is narrow
-enough that clock synchronization issues would be very limited.
-* This is only at the merge level. No other part of Ledger uses these
-timestamps. In particular, if a user ends up in a case of doing a merge with
-last-one-wins, drifted clocks, and conflicting keys, nothing in Ledger would
-break.
-
-***
-
-### Automatic with fallback
-
-The *automatic with fallback* merge strategy attempts to automatically merge
-commits when no key/value pair conflicts, and defer to a [custom conflict
-resolver](#Custom-conflict-resolvers) when at least one key/value pair
-conflicts.
-
-When using this strategy, client applications need to write a custom conflict
-resolver, but its usage is limited: if the client application modified
-disjointed (different) parts of a page on two devices, the modifications of
-each device will be applied automatically and the custom conflict resolver will
-not be called. However, if an entry was modified on both sides to contain
-different values, then the custom conflict resolver will be called.
-
-This strategy is convenient if a client application stores independent
-key/value pairs, but wants to control how the values are merged when modified on
-both places. For example, when storing a list as value, a client app may want
-to merge the list as to keep the modifications of both sides instead of picking
-only one. This strategy can also be used to prompt the user to choose the
-resolution they want.
-
-### Custom
-
-The *Custom* merge strategy defers to the client app each time there is a
-conflict. Remember, however, that Ledger does not consider a change from
-another device to be conflicting if there were no local changes during the same
-period, and will simply fast-forward the Ledger state.
-
-This strategy is useful when the client app is storing key/value pairs that
-have dependencies that need to be enforced by business-logic.
-
-### Custom conflict resolvers
-
-In order to facilitate convergence, any custom conflict resolution implemented
-by the client app should be **deterministic** - that is, the resulting merge
-commit should depend only on the two commits being merged. This ensures that the
-same conflict resolved concurrently on two devices yields the very same result.
-
-The pair of commits passed to the conflict resolver is ordered deterministically
-by Ledger, so the conflict resolver doesn’t need to be **commutative**.
-
-## Case studies
-
-This section discusses conflict resolution behavior in a number of scenarios.
-
-### Offline
-
-When a device that has been making modifications offline goes back online, the
-device downloads remote modifications first, then resolves any conflicts, and
-only after that uploads its own changes to the cloud. This way the other devices
-that are online and in sync with each other only need to fast-forward to catch
-up with remote changes. We sacrifice sync latency (it takes longer for changes
-from the offline device to be visible to others) for faster convergence and less
-bandwidth spend.
-
-![conflict_resolution_offline](conflict_resolution_offline.png)
-
-### Online
-
-When two online devices make a concurrent change (that is, both make their
-changes before seeing changes from the other device), the convergence is ensured
-as long as the conflict resolver is deterministic (see [Custom conflict
-resolvers](#Custom-conflict-resolvers)). When two devices concurrently resolve
-the same conflict, they produce the same resulting merge commit. This commit can
-be then uploaded to the cloud twice, once by each device, but any extra
-occurrences will be ignored by each participant and will not trigger further
-merges.
-
-![conflict_resolution_two_devices](conflict_resolution_two_devices.png)
diff --git a/docs/ledger/conflict_resolution_offline.png b/docs/ledger/conflict_resolution_offline.png
deleted file mode 100644
index b785e9c..0000000
--- a/docs/ledger/conflict_resolution_offline.png
+++ /dev/null
Binary files differ
diff --git a/docs/ledger/conflict_resolution_two_devices.png b/docs/ledger/conflict_resolution_two_devices.png
deleted file mode 100644
index 0d4eb47..0000000
--- a/docs/ledger/conflict_resolution_two_devices.png
+++ /dev/null
Binary files differ
diff --git a/docs/ledger/data_in_storage.md b/docs/ledger/data_in_storage.md
deleted file mode 100644
index c356228..0000000
--- a/docs/ledger/data_in_storage.md
+++ /dev/null
@@ -1,191 +0,0 @@
-# Data in Storage
-
-Storage implements persistent representation of data held in Ledger. Such data
-include:
-
-- commit, value and tree node objects
-- journal entries and metadata
-- information on head commits
-- information on which objects have been synced to the cloud
-- other synchronization metadata, such as the time of the last synchronization
-  to the cloud
-
-All data and metadata added in storage are persisted using LevelDB. For each
-[page](data_organization.md#Pages) a separate LevelDB instance is created in a
-dedicated filesystem path of the form:
-`{repo_dir}/{serialization_version}/ledgers/{ledger_dir}/{page_id_base64}/leveldb`.
-
-Additionally, metadata about all pages of a single user are persisted in a
-separate LevelDB instance. This includes information such as the last time a
-page was used.
-
-The rest of the document describes the key and value representation for each row
-created in LevelDB to store each data type.
-
-[TOC]
-
-# Per Page data storage
-
-## Commit objects
-
-- Row key: `commits/{commit_id}`
-- Row value: Contains the creation `timestamp`, `generation` (i.e. length of the
-  longest path to the first commit created for this page), `root_node_id` and
-  `parent_ids`, as serialized by Flatbuffers (see [commit.fbs]).
-
-## Value and tree node objects
-
-In storage there is no difference in the representation of value and node
-objects. Since these two types of objects can be quite big, they might be split
-in multiple pieces. Each **piece** is serialized in LevelDB as follows:
-
-- Row key: `objects/{object_digest}`
-- Row value: `{object_content}`
-
-For value objects, `{object_content}` is the actual user defined content, while
-for tree nodes, it is the list of node entries (key, object_id and priority),
-references to child nodes, and the node level. Tree node content is serialized
-using Flatbuffers (see [tree_node.fbs]).
-
-Note that when a Ledger user inserts a key-value pair, the key is stored in a
-tree node, while the value is stored separately, as described above.
-
-### Splitting objects in pieces
-
-Value or tree node objects might be split into smaller pieces that are stored
-separately. When processing a large object, its content is fed into a rolling
-hash which determines how the object should be split into chunks. For each such
-chunk, whose size is always between 4KiB and 64KiB, an identifier is computed
-and added in a list. Based on the rolling hash algorithm this list is split into
-index files, containing references (identifiers) towards either chunks of the
-original object's content, or other index files. At the end of the algorithm,
-the data chunks and index files form a tree, where the content of the object is
-stored on the leaves.
-
-See also [split.h] and [split.cc] for more details.
-
-## Journals
-
-Changes in Page (Put entry, Delete entry, Clear page) that have not yet been
-committed are organized in [journals]. A journal can be explicit, when it is
-part of an explicitly created transaction or part of a merge commit, or
-implicit, for any other case. On a system crash all explicit journals are
-considered invalid and once the system restarts they are removed from the
-storage. Implicit ones on the other hand, are immediately committed on system
-restart.
-
-A common prefix for all explicit journal entries (`journals/E`) helps remove
-them all together when necessary, and an additional metadata row, for implicit
-journals only, helps retrieve the ids of the not-yet-committed journals.
-
-Journal entry keys (for both implicit and explicit journals) are serialized in
-LevelDB as:
-
-Row key: `journals/{journal_id}/entry/{user_defined_key}`
-
-`{journal_id}` has an `E` prefix if the journal is explicit or an `I` prefix if
-it's implicit.
-
-- If the journal entry is about adding a new or updating an existing Ledger
-key-value pair, then:
-
-  Row value: `A{priority_byte}{object_identifier}`
-
-  Where `{priority_byte}` is either `E` if the priority is Eager, or `L` if it's
-  Lazy.
-
-- If the journal entry is about removing and existing key-value pair, the value
-  is:
-
-  Row value: `D`
-
-Moreover, if a journal contains a page clear operation, a row with an empty
-value is added to the journal. If it is present, when the journal is commited,
-the previous state of the page must be discarded.
-
-- Row key: `journals/{journal_id}/C`
-- Row value: (empty value)
-
-### Metadata row for implicit journals
-
-For every implicit journal an additional row is kept in LevelDB:
-- Row key: `journals/implicit_metadata/{journal-id}`
-- Row value: `{base_commit_id}`
-
-`{base_commit_id}` is the parent commit of this journal. Note that implicit
-journals always have a single parent (merge commits cannot be implicit
-journals).
-
-## Head commits
-
-The list of head commits is updated and maintained in storage. For each head a
-separate row is created:
-- Row key: `heads/{commit_id}`
-- Row value: `{creation_timestamp}`
-
-## Synchronization status
-
-### Commits
-A row is added for each commit that has been created locally, but is not yet
-synced to the cloud:
-- Row key: `unsynced/commits/{commit_id}`
-- Row value: `{generation}`
-
-### Value and Tree Node Objects
-Each piece, i.e. part of a value or tree node object, can be in any of the
-following states:
-
-- transient: the object piece has been used in a journal that is not yet committed
-- local: the object piece has been used in a commit, but is still not synced
-- synced: the object piece has been synced to the cloud
-
-For each piece, a status row is stored:
-
-- Row key: `{status}/object_digests/{object_piece_identifier}`
-- Row value: (empty value)
-
-Where status is one of `transient`, `local`, or `synced`.
-
-## Cloud sync metadata
-
-The cloud sync component persists in storage rows with some metadata.
-
-- Row key: `sync_metadata/{metadata_type}`
-- Row value: `{metadata_value}`
-
-Currently, cloud sync only stores a single such line, which contains the
-server-side timestamp of the last commit fetched from the cloud.
-
-
-# Pages metadata storage
-
-Additionally to user-created content and metadata on this content, Ledger
-persists information on Page usage, such as the timestamp of when each page was
-last used. This information is used for page eviction, i.e. removing local
-copies of pages, in order to free up device storage when that is necessary.
-
-Page usage information is stored in a dedicated path: `{repo_dir}/page_usage_db`
-using LevelDB.
-
-## Timestamp of last usage
-For each page that is locally stored on the device a row is created in the
-underlying database:
-
-- Row key: `opened/{ledger_name}{page_id}`
-- Row value: `{timestamp}` or `{0}`
-
-`{timestamp}` is the timestamp from when the given page was last closed. If the
-page is currently open, the value is a 0 timestamp.
-
-# See also
-
-For more information see also:
- - [Life of a Put](life_of_a_put.md)
- - [Ledger Architecture - Storage](architecture.md#Storage)
-
-
-[commit.fbs]: /bin/ledger/storage/impl/commit.fbs
-[split.cc]: /bin/ledger/storage/impl/split.cc
-[split.h]: /bin/ledger/storage/impl/split.h
-[tree_node.fbs]: /bin/ledger/storage/impl/btree/tree_node.fbs
-[journals]: life_of_a_put.md#Journals
diff --git a/docs/ledger/data_organization.md b/docs/ledger/data_organization.md
deleted file mode 100644
index 74250ae..0000000
--- a/docs/ledger/data_organization.md
+++ /dev/null
@@ -1,106 +0,0 @@
-# Data Organization
-
-This document describes recommended practices for structuring data that is
-stored in Ledger. We assume that the reader is already familiar with Ledger [API
-surface](api_guide.md).
-
-[TOC]
-
-## Pages
-
-Data stored in Ledger is grouped into separate independent key-value stores
-called *pages*.
-
-Deciding how to split data into pages has the following implications:
-
- - atomic changes across multiple values are possible only within one page, so
-   if there's data that has to be modified together, it must belong to the
-   same page
- - the current state of each page is either entirely present or entirely absent
-   on disk (save for [lazy values](api_guide.md#lazy-values)), hence splitting
-   data into multiple pages allows granular optimization of which data to keep
-   on disk on each device
-
-There are no restrictions on how many pages a client application can use.
-
-## Entries
-
-Each page stores an ordered list of key-value pairs, also called *entries*.
-
-Both keys and values are arbitrary byte arrays - the client application is free
-to construct the keys and values as needed based on their needs, but see some
-guidance below.
-
-### Key ordering
-
-Entries are sorted by key in the lexicographic order of the byte array. Entry
-retrieval methods always return them in order, it is also possible to use a
-range query to retrieve only a part of the ordered list.
-
-The lexicographic byte array ordering of the keys implies the following caveats:
-
- - **number ordering**: a key of `[1, 0, 0]` is ordered before the key of `[2]`.
-   If ordering between the items is important, it is essential to add padding to
-   any numbers that are part of the key, so that their width is fixed
- - **string ordering**: ordering of unicode strings in a way that matches human
-   expectations is non-trivial and byte-array ordering of utf8/16/32 strings is
-   unlikely to yield good results.
-
-### Range queries
-
-The entries stored in a page are sorted by keys, and can be retrieved using
-either exact matching or [range queries](api_guide.md#range-queries).
-
-Because of the range query support, it might be desirable to construct the keys
-in a way that matches the querying needs of the application. For example, a
-messaging application which needs to retrieve only the messages not older than a
-week might wish to structure the data as follows:
-
- - **key**: {timestamp}-{message UUID}
- - **value**: {message content}
-
-*** note
-**Caveat**: as the range queries can currently only yield results in the
-increasing order, in order to retrieve the newest messages, the timestamp needs
-to be constructed as (BIG NUMBER minus the current time).
-***
-
-Then, a [range query](api_guide.md#range-queries) can be used to retrieve the
-messages after the given timestamp.
-
-*** note
-Ledger does not support custom indexes and queries by value. Please do let us
-know about your use cases if this limitation prevents you from adopting Ledger.
-***
-
-### Avoiding collisions
-
-[UUIDs] should be used as part of the entry key in order to avoid unintended
-collisions, where needed. For example, a messaging application might want to
-include an UUID of a message stored in a Ledger entry as part of the entry key,
-in order to avoid collisions between two messages of the same timestamp:
-
- - **key**: {timestamp}-**{message UUID}**
- - **value**: {message content}
-
-## Granularity
-
-Deciding how to split page data into entries has implications on querying
-ability and [conflict resolution](api_guide.md#Conflict-resolution).
-
-If two pieces of data can change **independently** (for example: a name and an
-email of a contact in a contacts app), it is beneficial to put these pieces of
-data in separate entries. Because conflicts are resolved entry-by-entry,
-concurrent modifications of different entries can be automatically merged by the
-default conflict resolution policy.
-
-On the other hand, if two pieces of data are **related** (when one changes, the
-other piece of data needs to change accordingly), we need to either:
-
- - put them in the same entry (and serialize them in the application)
- - put them in separate entries, but use a custom conflict resolution policy
-   to preserve the invariants
- - put them in separate entries, but consistently always modify both of them
-   together within a [transaction](api_guide.md#transactions)
-
-[UUIDs]: https://en.wikipedia.org/wiki/Universally_unique_identifier
diff --git a/docs/ledger/examples.md b/docs/ledger/examples.md
deleted file mode 100644
index 8963b74..0000000
--- a/docs/ledger/examples.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Examples
-
-List of example apps that directly integrate with Ledger - this does not include
-apps that use Ledger through Framework fuchsia::modular::Link objects.
-
-## C++
-
- * [clipboard] - system clipboard agent which stores state in Ledger
- * [Ledger benchmarks] - benchmarks that exercise Ledger APIs and capture
-   performance traces
- * [story runner] - framework facility that stores the state of user stories in
-   Ledger
-
-## Dart
-
- * [chat] - a chat agent that uses Ledger to store messages
- * [contacts] - Ledger-based contacts agent
- * [todo list] - a todo-list module that uses Ledger to store the todo items
-   * this is a minimal working example of a Ledger-based app
-
-[chat]: https://fuchsia.googlesource.com/topaz/+/master/app/chat/
-[clipboard]: /bin/agents/clipboard/
-[contacts]: https://fuchsia.googlesource.com/topaz/+/master/app/contacts/
-[Ledger benchmarks]: /bin/ledger/tests/benchmark
-[story runner]: /bin/sessionmgr/story_runner/
-[todo list]: https://fuchsia.googlesource.com/topaz/+/master/examples/ledger/todo_list/
diff --git a/docs/ledger/field_data.md b/docs/ledger/field_data.md
deleted file mode 100644
index 74892fd..0000000
--- a/docs/ledger/field_data.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# Field Data
-
-Ledger uses [Cobalt] to record field data.
-
-In order to add more events:
-
- - edit Ledger code under [/bin/ledger/cobalt]
- - register the new events, see documentation for [Cobalt client]
-
-In order to view the recorded data, run:
-
-```
-cd garnet/bin/cobalt
-./download_report_client.py
-./report_client -project_id=100
-```
-
-Then, follow `report_client` hints to extract the data. For example, run the
-following to extract Ledger event counters from the last 5 days:
-
-```
-Command or 'help': run range -4 0 2
-```
-
-[Cobalt]: https://fuchsia.googlesource.com/cobalt
-[/bin/ledger/cobalt]: /bin/ledger/cobalt/
-[Cobalt client]: https://fuchsia.googlesource.com/garnet/+/master/bin/cobalt/
diff --git a/docs/ledger/firebase.md b/docs/ledger/firebase.md
deleted file mode 100644
index ac24d16..0000000
--- a/docs/ledger/firebase.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# Firebase Configuration
-
-This document describes how to configure a Firebase project so that it can be
-used for cloud sync by Ledger.
-
-## Create the Firebase project
-
-You can create a new Firebase project at https://firebase.google.com/.
-
-Take note of your *project ID* - this information is needed to configure a
-Fuchsia device to use your instance of Firebase. You can find out what the
-project ID is by looking at the console URL, which takes the form of:
-`https://console.firebase.google.com/project/<project id>`.
-
-## Configuration
-Go to the [Firebase Console](https://console.firebase.google.com/), and open
-your project.
-
-In `Database / Rules`, paste the rules below and click "Publish".
-
-```
-{
-  "rules": {
-    ".read": false,
-    ".write": false,
-    "$prefix": {
-      "$user": {
-        ".read": "$user === auth.uid",
-        ".write": "$user === auth.uid",
-        "$version": {
-          "$app": {
-            "$page": {
-              "commits": {
-                ".indexOn": ["timestamp"],
-                "$id": {
-                  ".validate": "!data.exists()"
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
-```
-
-In `Storage / Rules`, change the line starting with "allow" to match the example
-below and click "Publish".
-
-```
-service firebase.storage {
-  match /b/{bucket}/o {
-    match /{prefix}/{user} {
-      match /{allPaths=**} {
-        allow read, write: if request.auth.uid == user;
-      }
-    }
-  }
-}
-```
diff --git a/docs/ledger/life_of_a_put.md b/docs/ledger/life_of_a_put.md
deleted file mode 100644
index 1117dc2..0000000
--- a/docs/ledger/life_of_a_put.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# Life of a Put
-
-This document explains how Ledger works by following the mechanics of a single
-Put operation.
-
-The Putting of a value happens in 2 major stages:
-1. Locally updating the btree to take into account the new key-value.
-2. Synchronizing the new key-value with the cloud and other devices.
-
-## 1. Local update
-The client facing API of Ledger is defined in [ledger.fidl].
-There are multiple methods to do put operations, with slightly different
-semantics. For this example we can use the FIDL method
-``Put(array<uint8> key, array<uint8> value) => (Status status);``.
-
-This FIDL interface is implemented by PageImpl, which takes a generated callback
-type (PutCallback) used to pass the completion status back to the client.
-
-### Storing the Value to disk
-The first step to handling the FIDL call is storing the *value* (which can be
-large, e.g. multiple GB) onto the disk. The value (which can be passed as a byte
-array, a [VMO], or a socket) is wrapped in a DataSource.
-The data in the DataSource is cut in chunks (see [dynamic chunking] for an
-explanation of the idea, and the [splitting implementation] for details).
-The chunks not already on disks are then written to disk.
-
-*** note
-**A note regarding writing to disk:** Ledger writes all its data to disk using
-[LevelDB]. LevelDB's cache makes reading and writing data faster than when using
-the filesystem.
-***
-
-### Draining the pending PageWatcher updates
-Clients can register PageWatchers to observe changes to Pages. Before creating
-the [commit], we drain the pending updates to the PageWatchers registered for
-the given Page connection. After draining the pending updates, we stop the
-BranchTracker from sending new updates until we've handled the change.
-
-If the Put is part of a transaction, we wait for all PageWatchers to have
-handled the updates before continuing to the next step. The PageWatchers say
-that they've handled the OnChange by calling the (generated) OnChangeCallback.
-
-### Journals
-All changes are first written in a Journal before being committed. There are two
-types of journals: *explicit* journals when clients starts a transaction, and
-*implicit* journals when clients do a change without having started a
-transaction first.
-
-Changes in explicit journals are guaranteed to be seen together: a PageSnapshot
-and/or a PageWatcher will either contain/see **all** the changes, or none. If
-for some reason Ledger is unexpectedly closed, any non completed explicit
-transaction is dropped.
-
-In contrast, PageSnapshots and/or PageWatchers may see the individual changes
-from an implicit journal, and if Ledger is unexpectedly closed any in-progress
-implicit journal will be committed during the next startup.
-
-### Finishing a transaction
-When a transaction is completed, a commit is appended to one of the Page's
-heads.
-
-The BranchTracker of the Page connection is informed of this new commit as to
-make sure it tracks that branch and not some other branch. Not doing so would
-make changes seem to “disappear” as clients would see a different branch than
-the one with their change. The BranchTracker then notifies the relevant
-registered Watchers of the change.
-If there are multiple heads, the MergeResolver starts the process of merging the
-heads.
-
-## 2. Synchronization
-TODO
-### Cloud sync
-### P2P sync
-
-[ledger.fidl]: /public/fidl/fuchsia.ledger/ledger.fidl
-[VMO]: https://fuchsia.googlesource.com/zircon/+/master/docs/objects/vm_object.md
-[dynamic chunking]: https://github.com/YADL/yadl/wiki/Rabin-Karp-for-Variable-Chunking
-[splitting implementation]: /bin/ledger/storage/impl/split.cc
-[LevelDB]: https://en.wikipedia.org/wiki/LevelDB
-[commit]: architecture.md#storage
diff --git a/docs/ledger/style_guide.md b/docs/ledger/style_guide.md
deleted file mode 100644
index 996b05b..0000000
--- a/docs/ledger/style_guide.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# Style Guide
-
-This document describes the conventions adopted in Ledger for the relevant
-languages: English and C++.
-
-[TOC]
-
-## English
-
-This section applies to written communication in docs, code comments, commit
-messages, emails, etc.
-
-### ledger vs Ledger vs the ledger vs ...
-
-The project and the resulting application are called "Ledger". It is a proper
-name, hence it is not preceded by an article.
-
-**Do**: *Ledger synchronizes user data across devices*
-
-**Don't**: *~~the Ledger~~ synchronizes user data across devices*
-
-**Don't**: *~~ledger~~ synchronizes user data across devices*
-
-All of the data stored in Ledger on behalf of a user is sometimes referred to as
-this user's ledger. In that case "ledger" is a common name - not capitalized and
-preceded by an article.
-
-**Do**: *each user has a separate ledger*
-
-**Don't**: *each user has ~~separate Ledger~~*
-
-## C++
-
-Ledger, like the rest of Fuchsia, follows [Google C++ Style Guide]. In a few
-cases not covered there, we choose a convention.
-
-### Naming of callback parameters
-
-If there is a need to distinguish callback parameters of a method or a class,
-call them `on_<event>`.
-
-**Do**: `std::function<void(int)> on_done`
-
-**Don't**: ~~`std::function<void(int)> done_callback`~~
-
-### Usage of fxl::StringView vs std::string
-
-This section discusses which string types to use for C++ API arguments.
-
-Use a `fxl::StringView` (non-ref) if the functionality just reads the string:
-`fxl::StringView` can handle any stream of bytes without copies.
-
-Use a `std::string` (non-ref) if:
-
- - the functionality needs to take ownership of the string (it allows users of
-   the functionality to `std::move` the string if they don't reuse it
-   afterwards), or
- - you need to pass the string over to a function that requires an
-   `std::string`.
-
-You might want to use a `const std:string&` (const ref), if you need to call a
-function that itself takes a `const std:string&` (and you cannot or don't want
-to change it to take an `fxl::StringView`).
-
-[Google C++ Style Guide]: https://google.github.io/styleguide/cppguide.html
diff --git a/docs/ledger/testing.md b/docs/ledger/testing.md
deleted file mode 100644
index bc92a3f..0000000
--- a/docs/ledger/testing.md
+++ /dev/null
@@ -1,180 +0,0 @@
-# Testing
-
-This document describes different test types used in Ledger.
-
-*** note
-All of the tests run on a Fuchsia device (real or emulated). For the tests below
-we indicate the commands to trigger the execution from the host machine, but the
-execution itself happens on the target.
-***
-
-[TOC]
-
-## TL;DR
-
-```sh
-fx run-test ledger_tests
-```
-
-This command will run the following tests, that are enabled by default:
-
-* [unit tests](#unit-tests)
-* [integration tests](#integration-tests)
-* [local end-to-end tests](#local-e2e)
-* [Firestore cloud provider] unit tests
-
-It will not run the following tests, that need to be configured and executed
-manually:
-
-* [synchronization end-to-end tests](#sync-e2e)
-* [performance tests][benchmarks]
-* [fuzz tests](#fuzz-tests)
-* [Firestore cloud provider] end-to-end tests
-
-## Unit tests
-
-**Unit tests** are low-level tests written against the smallest testable parts
-of the code. Tests for `some_class.{h,cc}` are placed side-by-side the code
-being tested, in a `some_class_unittest.cc` file.
-
-Unit tests are regular [Google Test] tests. Most of them use our own
-[TestLoopFixture] base class to conveniently run them with a fake clock, and
-simulated multi-thread, in order to know when nothing will ever happen again.
-
-All unit tests in the Ledger tree are built into a single `ledger_unittests`
-binary. The binary is self-contained: it contains both the tests and the Ledger
-logic under test linked into a single Google Test binary.
-
-You can run it from the host with:
-
-```sh
-fx run-test -t ledger_unittests ledger_tests
-```
-
-## Integration tests
-
-**Integration tests** are written against client-facing FIDL services exposed by
-Ledger, although these services still run in the same process as the test code.
-
-Integration tests inherit from [IntegrationTest] and are placed under
-[/bin/ledger/tests/integration].
-
-All integration tests in the Ledger tree are built into a single
-`ledger_integration_tests` binary. You can run it from the host:
-
-```sh
-fx run-test -t ledger_integration_tests ledger_tests
-```
-
-*** aside
-Some of the integration tests emulate multiple Ledger instances synchronizing
-data with each other. Through advanced build magic and [testing abstractions],
-these are run both as integration tests (against fake in-memory implementation
-of the cloud provider interface), and as end-to-end synchronization tests
-(against a real server).
-***
-
-## End-to-end tests
-
-**End-to-end tests** are also written against client-facing FIDL services
-exposed by Ledger, but in this case the test code runs in a separate process,
-and connects to Ledger the same way any other client application would do. This
-is the highest-level way of testing that exercises all of the Ledger stack.
-
-### Local tests {#local-e2e}
-
-End-to-end tests not depending on cross-device synchronization are called "local
-end-to-end tests" and are defined in [/bin/ledger/tests/e2e_local]. All local
-end-to-end tests are built into a single `ledger_e2e_local` binary. You can run
-it from the host:
-
-```sh
-fx run-test -t ledger_e2e_local ledger_tests
-```
-
-### Synchronization tests {#sync-e2e}
-
-Synchronization end-to-end tests create multiple local Ledger instances
-configured to synchronize using a cloud provider backed by a real server. The
-cloud provider instances are set up to represent the same virtual user,
-therefore emulating multiple devices synchronizing their Ledger data through the
-real server.
-
-*** note
-Those tests exercise cloud sync against a real server. They are not run by
-default, and you need to follow the instructions below to set up server access
-and run them manually.
-***
-
-<a name="cloud-sync"></a>
-First, ensure you have an instance of the server configured and take note of the
-configuration params (service account credentials file and API key) - in order
-to obtain those, follow the [server configuration] instructions.
-
-Then, create a json sync credentials file file of the following format:
-```javascript
-{
-  "api-key": "<API_KEY>",
-  "service-account": <SERVICE_ACCOUNT_FILE_CONTENT>
-}
-```
-where <API_KEY> is the api key retrieved from the firebase console, and
-<SERVICE_ACCOUNT_FILE_CONTENT> is the content of the service account credentials
-file.
-
-Then, put the sync credentials file whenever you like, and set the full path to
-it in the GN variable:
-
-```sh
-fx set x64 --args ledger_sync_credentials_file=\"/full/path/to/sync_credentials.json\"
-```
-
-After rebuilding, the credentials file will be automatically embedded in the
-relevant sync test binaries. You will still need to pass the remaining
-parameters (server ID and API key) as command line parameters.
-
-You can now run the tests from the host as follows:
-
-```sh
-fx run-test -t ledger_e2e_sync ledger_tests
-```
-
-## Performance tests
-
-For performance tests, see [benchmarks].
-
-## Fuzz tests
-
-Ledger uses LibFuzzer for fuzz tests. We have a single fuzz package called
-`ledger_fuzzers`. It can be built as follows:
-
-```sh
-fx set x64 --monolith peridot/packages/tests/ledger --fuzz-with asan
-fx full-build
-```
-
-And then run:
-
-```sh
-fx fuzz start ledger
-```
-
-You can refer to the full [fuzzing] instructions for details.
-
-## See also
-
- - [Firestore cloud provider] has its own suite of tests, including unit tests
-   and end-to-end validation tests
-
-[Google Test]: https://github.com/google/googletest
-[TestLoopFixture]: https://fuchsia.googlesource.com/garnet/+/master/public/lib/gtest/test_loop_fixture.h
-[IntegrationTest]: /bin/ledger/tests/integration/integration_test.h
-[/bin/ledger/tests/integration]: /bin/ledger/tests/integration
-[Synchronization end-to-end tests]: /bin/ledger/tests/e2e_sync/README.md
-[/bin/ledger/tests/e2e_local]: /bin/ledger/tests/e2e_local
-[/bin/ledger/tests/e2e_sync]: /bin/ledger/tests/e2e_sync
-[server configuration]: /bin/cloud_provider_firestore/docs/configuration.md
-[testing abstractions]: /bin/ledger/testing/ledger_app_instance_factory.h
-[benchmarks]: /bin/ledger/tests/benchmark/README.md
-[Firestore cloud provider]: /bin/cloud_provider_firestore/README.md#testing
-[fuzzing]: https://fuchsia.googlesource.com/docs/+/master/development/workflows/libfuzzer.md
diff --git a/docs/ledger/user_guide.md b/docs/ledger/user_guide.md
deleted file mode 100644
index 3408430..0000000
--- a/docs/ledger/user_guide.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# User Guide
-
-[TOC]
-
-## Prerequisites
-
-### Disk Storage
-
-Ledger writes all data under `/data/modular/<USER_ID>/LEDGER`. In order for data
-to be persisted, ensure that a persistent partition is mounted under /data. See
-[minfs setup](https://fuchsia.googlesource.com/zircon/+/master/docs/minfs.md).
-
-### Networking
-
-Follow the instructions in
-[netstack](https://fuchsia.googlesource.com/netstack/+/d24151e74c745358b102f4f33a3c5f4d720ddc52/README.md)
-to ensure that your Fuchsia has Internet access.
-
-Run `curl` to verify that it worked:
-
-```
-curl http://example.com
-```
-
-You should see the HTML content of the `example.com` placeholder page.
-
-## Cloud sync
-
-When running in the guest mode, Ledger works locally but does not synchronize data
-with the cloud.
-
-When running in the regular mode, Ledger automatically synchronizes user data
-using a communal cloud instance.
-
-## Reset
-
-Deleting persistent storage (e.g. `rm -rf /data`) does not erase the Ledger
-state in the cloud, which will be synced back the next time a user signs in.
-
-In order to reset the Ledger state in the cloud, visit
-https://fuchsia-ledger.firebaseapp.com/ , sign in with the account you want to
-reset and hit the erase button.
-
-Any device that has local account state synced with the cloud before the erase
-becomes at this point incompatible with the cloud. Ledger will detect this on
-each device upon the next attempt to sync, erase all local data and log the user
-out. The account is usable again immediately after logging back in.
-
-## Debug and inspect
-
-The **Ledger Debug Dashboard** allows you to inspect the local state of the Ledger.
-
-You need to point your browser to the port 4001 of the Fuchsia machine to access
-the dashboard of the current user.
-The dashboard is also accessible from any device connected to the fuchsia machine
-on the same local network.
-
-The dashboard exposes the instances for the current user. When you select an instance,
-it displays its pages. When you select a page, it displays the commits graph, where the root node is
-colored in a different color than the other nodes. When you select a commit,
-it displays its entries (keys, values, priorities), generation (internal Ledger counter)
-and timestamp.
diff --git a/docs/lint.md b/docs/lint.md
deleted file mode 100644
index 451d06e..0000000
--- a/docs/lint.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# Lint
-
-We use clang-tidy to lint C++ code and aim to keep the repository warning-clean.
-The linter is configured in the [.clang-tidy](../.clang-tidy) file.
-
-## How to lint
-
-In order to run the current CL through the linter (assuming the current
-directory is `//peridot`), run:
-
-```
-../scripts/git-file-tidy [--out-dir out/debug-x64]
-```
-
-In order to run the entire repository through the linter, add `--all`. You can
-also add `--fix` in order to automatically generate fixes for some (but not all)
-of the warnings.
-
-## Suppressing warnings
-
-Any warning can be suppressed by adding a `// NOLINT` comment on the line on
-which it occurs. It is also possible to disable the check entirely within Ledger
-repository by editing the [.clang-tidy](../.clang-tidy) file.
-
-## Disabled checks
-
-This list tracks the reasons for which we disabled particular [checks]:
-
- - `clang-analyzer-core.NullDereference`, `clang-analyzer-unix.Malloc` - these
-    checks are triggering memory access warnings at rapidjson callsites (despite
-    the header filter regex) and we didn't find a more granular way to disable
-    them
- - `clang-diagnostic-unused-command-line-argument` - ninja-generated compilation
-    database contains the linker argument which ends up unused and triggers this
-    warning for every file
- - `misc-noexcept*` - Fuchsia doesn't use C++ exceptions
- - `modernize-deprecated-headers` - Fuchsia uses old-style C headers
- - `modernize-raw-string-literal` - the check was suggesting to convert `\xFF`
-    literals, which we'd rather keep in the escaped form.
- - `modernize-return-braced-init-list` - concerns about readability of returning
-    braced initialization list for constructor arguments, prefer to use a
-    constructor explicitly
- - `modernize-use-auto` - not all flagged callsites seemed worth converting to
-    `auto`
- - `modernize-use-equals-delete` - flagging all gtest TEST_F
- - `modernize-use-equals-default` - Ledger chose not to impose a preference for
-   "= default"
- - `performance-unnecessary-value-param` - it was flagging view classes
-   which we prefer to pass by value
- - `readability-implicit-bool-conversion` - Fuchsia C++ code commonly uses implicit
-   bool cast of pointers and numbers
-
-[checks]: https://clang.llvm.org/extra/clang-tidy/checks/list.html
diff --git a/docs/modular/agent.md b/docs/modular/agent.md
deleted file mode 100644
index 27c9401..0000000
--- a/docs/modular/agent.md
+++ /dev/null
@@ -1,85 +0,0 @@
-## Agents
-
-An `Agent` is a singleton-per-session component which runs outside of
-the scope of a Story without any graphical UI.
-
-Agents can schedule tasks (i.e. they can register to be woken up by the
-framework to perform work), and provide services to other modular components.
-
-Any modular component can connect to an agent and access its services (including
-modules, shells, and other agents).
-
-### Environment
-
-An agent is given access to two services provided by the modular framework in
-its incoming namespace:
-
-*   `fuchsia.modular.ComponentContext` which gives the agent access to
-    functionality which is shared across components run under the modular
-    framework (e.g. modules, shells, agents).
-*   `fuchsia.modular.AgentContext` which gives agents access to agent specific
-    functionality, like creating entity references and scheduling tasks.
-
-An agent is expected to provide two services to the modular framework in its
-outgoing namespace:
-
-*   `fuchsia.modular.Agent` which allows the framework to forward connection
-    requests from other components and tell the agent to run tasks.
-*   `fuchsia.modular.Lifecycle` which allows the framework to signal the agent
-    to terminate gracefully.
-
-The aforementioned services enable communication between agents and the modular
-framework, but agents can also expose custom FIDL services to components. For a
-more detailed explanation of the mechanism which enables this service exchange
-see Communication Mechanisms below.
-
-### Lifecycle
-
-For most agents, when a component connects to an agent the framework will give
-the component an `AgentController`. When the connecting component drops the
-`AgentController` connection, and there are no outstanding connections, the
-agent will be killed by the framework.
-
-There are some agents for which the `sessionmgr` maintains an `AgentController`,
-and thus the agent remains alive for the duration of the session. These
-"session" agents also get access to `fuchsia.modular.PuppetMaster` in their
-incoming namespace.
-
-### Communication mechanisms
-
-Components can communicate with agents in two different ways: either by
-connecting to a FIDL service exposed by the agent, or over a `MessageQueue`.
-
-Which communication method is appropriate depends on the semantics of the
-messages being passed. FIDL requires both agent and client to be running,
-whereas message queues allow the life cycles of the sender and receiver to be
-different.
-
-#### FIDL Services
-
-The modular framework will forward a `fuchsia.sys.ServiceProvider` request via
-`fuchsia::modular::Agent.Connect` call, and will also provide the agent with an
-identifier for the client which is requesting the service provider.
-
-Any services added to the service provider will be exposed directly to the
-connecting component.
-
-To illustrate this, consider a module connecting to an agent:
-
-The module calls `ConnectToAgent` on its `ComponentContext`, which contains a
-`ServiceProvider` request as well as an `AgentController` request.
-
-The agent controller request is used by the framework to keep the agent alive
-until the agent controller is closed by the client. If more than one client is
-connected to the same agent, the agent will be kept alive until all agent
-controllers have been closed.
-
-The service provider request is forwarded to the agent, along with a string
-which identifies the client connecting to the agent.
-
-#### Message Queues
-
-Messages sent over message queues are untyped, but allow the life cycles of the
-reader and writer to be decoupled. For example, an agent may provide a module
-with a message queue which it can use to send messages to the agent. The agent
-can then register to be woken up when a message is delivered on the queue.
diff --git a/docs/modular/entity.md b/docs/modular/entity.md
deleted file mode 100644
index 4079235..0000000
--- a/docs/modular/entity.md
+++ /dev/null
@@ -1,70 +0,0 @@
-## Entities
-
-The Fuchsia entity model facilitates information interchange by defining a
-common interface for _describing_, _referencing_, _accessing_, and _mutating_
-data objects (entities) which are shared between components (modules, agents,
-shells) running in the modular framework. It consists of the following major
-concepts:
-
-*   Entities: the data objects shared between components.
-*   Entity references: a serializable token which can be used to retrieve an
-    `Entity` handle.
-*   `Entity`: An interface which gives access to a shared data object.
-*   `EntityProvider`: the interface which allows agents to expose entities to
-    the system.
-*   `EntityResolver`: the Fuchsia API for requesting an `Entity` handle for a
-    given reference.
-
-### Lifecycle
-
-The lifecycle of the data backing an `Entity` is controlled by the
-`EntityProvider`. The lifecycle of the `Entity` handle is controlled by
-`sessionmgr`.
-
-#### Entities owned by Agents
-
-Agents don't create `Entity` handles directly. Agents connect to the
-`EntityReferenceFactory` which provides the agent with an entity reference in
-exchange for a `cookie`. The entity reference can then be shared with other
-modular components which can use their `EntityResolver` to dereference it into
-an `Entity` interface.
-
-Calls on that `Entity` interface will then be forwarded to the agent, along with
-the associated cookie.
-
-The agent is thus responsible for storing and providing the entity data,
-associating it with the correct cookie, and optionally handling requests for
-mutating the entity data.
-
-#### Entities owned by a Story
-
-Modules can create entities explicitly via their `ModuleContext` by providing a
-`fuchsia.mem.Buffer` and an associated type. The framework manages the lifecycle
-of such entities by storing them in the story's record. For this reason, when
-the story is deleted, so is the entity. Agents and modules outside the story can
-dereference the entity so long as the story still exists.
-
-#### Entity Resolution
-
-This section describes the internals of entity resolution.
-
-`EntityProviderRunner` implements the `fuchsia::modular::EntityResolver`
-interface, and is also responsible for creating entity references by
-implementing the `fuchsia::modular::EntityReferenceFactory` interface. A single
-instance of the `EntityProviderRunner` manages all the entity providers running
-in the system.
-
-The first step in entity resolution (i.e. the first thing which happens when
-`ResolveEntity` is called) is the runner determines whether the entity is
-provided by an agent or by the modular framework by inspecting the entity
-reference. The runner then asks an `EntityProviderLauncher` to launch the
-appropriate entity provider.
-
-If the entity provider is an agent, an `AgentController` is passed to the
-launcher, and the runner keeps the agent controller alive until the client
-closes the `Entity`.
-
-Each `Entity` request has an associated `EntityController` which the entity
-runner owns. The `EntityController` owns the `AgentController` if the entity
-provider was an agent, and is responsible for forwarding the entity interface
-methods to the entity provider.
diff --git a/docs/modular/intent.md b/docs/modular/intent.md
deleted file mode 100644
index 74be6e2..0000000
--- a/docs/modular/intent.md
+++ /dev/null
@@ -1,54 +0,0 @@
-## Intents
-
-An `Intent` is used to instruct a module to perform an action. The intent
-contains the action name, the arguments for the action parameters, and an
-optional handler which explicitly specifies which module is meant to perform the
-action.
-
-### Declaring Actions
-
-Modules can declare which actions they handle, and their associated parameters
-in their [module facet](module_facet.md). The modular framework will then index
-the module and treat it as a candidate for any incoming intents which contain
-the specified action, and don't have an explicit handler set.
-
-### Handling Intents
-
-When an intent is resolved the framework determines which module instance will
-handle it.
-
-The framework then connects to the module's `fuchsia::modular::IntentHandler`
-service, and calls `HandleIntent()`. The framework will connect to the intent
-handler interface each time a new intent is seen for a particular module
-instance, and intents can be sent to modules which are already running. Modules
-are expected to handle the transition between different intents gracefully.
-
-### Example
-
-To illustrate the intended use of intents, consider the following fictional
-example: a new story has been created with a module displaying a list of
-restaurants and the module wants to show directions to the currently selected
-restaurant.
-
-The restaurant module creates an intent with a `com.fuchsia.navigate` action
-with two parameters `start` and `end`, both of type `com.fuchsia.geolocation`
-and passes it to the modular framework via `ModuleContext.AddModuleToStory`.
-
-At this point, the framework will search for a module which has declared support
-for the `com.fuchsia.navigate` action. Once such a module is found, it is added
-to the story and started. The framework then connects to the started module's
-`IntentHandler` service and provides it with the intent.
-
-At this point, the restaurant list module's selected restaurant changes. It
-again creates an intent, with the same action as before but with new location
-arguments and calls `ModuleContext.AddModuleToStory`.
-
-The framework now knows there is already a module instance running (in this case
-`AddModuleToStory` uses the `name` parameter to identify module instances)o
-explicitly specify a which can handle the given action, and connects to its
-`IntentHandler` interface and provides it with the new intent. The navigation
-module can then update its UI to display directions to the new restaurant.
-
-If the restaurant module wanted a specific module (e.g. `Fuchsia Maps`) to
-handle the intent, it would set the `Intent.handler` to the component URL for
-the module.
diff --git a/docs/modular/module.md b/docs/modular/module.md
deleted file mode 100644
index 4d16564..0000000
--- a/docs/modular/module.md
+++ /dev/null
@@ -1,42 +0,0 @@
-## Modules
-
-A `Module` is a component which displays UI and runs as part of a `Story`.
-
-Multiple modules can be composed into a single story, and modules can add other
-modules to the story they are part of. Module's can either embed other modules
-within their own content, or they can delegate visual composition to the
-`StoryShell`.
-
-### Environment
-
-A module is given access to two services provided by the modular framework in
-its incoming namespace:
-
-*   `fuchsia.modular.ComponentContext` which gives the agent access to
-    functionality which is shared across components run under the modular
-    framework (e.g. modules, shells, agents).
-*   `fuchsia.modular.ModuleContext` which gives modules access to module
-    specific functionality, like adding other modules to its story and creating
-    entities.
-
-A module is expected to provide two services to the modular framework in its
-outgoing namespace:
-
-*   `fuchsia.ui.app.ViewProvider` which is used to display the module's UI.
-*   `fuchsia.modular.Lifecycle` which allows the framework to signal the module
-    to terminate gracefully.
-*   `fuchsia.modular.IntentHandler` which allows the framework to send
-    [intents](intent.md) to the module.
-
-### Lifecycle
-
-A module's lifecycle is bound to the lifecycle of the story it is part of. In
-addition, a given module can have multiple running instances in a single story.
-
-When a module starts another module it is given a module controller which it can
-use to control the lifecycle of the started module.
-
-### Communication Mechanisms
-
-Modules communicate with other modules via intents and entities, and with agents
-via FIDL and message queues.
diff --git a/docs/modular/module_facet.md b/docs/modular/module_facet.md
deleted file mode 100644
index 9657e2d..0000000
--- a/docs/modular/module_facet.md
+++ /dev/null
@@ -1,119 +0,0 @@
-# Module Facet
-
-Modules declare their run-time capabilities (e.g. which Intent actions they
-handle) in the module facet of their [component manifest][component-manifest]
-(i.e. their `.cmx` file).
-
-## What is a facet?
-
-Component facets are sections in the component manifest which aren't consumed
-directly by the component manager, but are left to be defined and consumed by
-other parts of Fuchsia. The Modular framework defines a `fuchsia.module` facet
-which module authors use to define module specific properties.
-
-This document describes how to declare a module facet in your component
-manifest.
-
-## Example
-
-The following is an excerpt of a component manifest that defines a module facet.
-
-```
-{
-   "facets": {
-      "fuchsia.module": {
-         "@version": 2,
-         "suggestion_headline": "See details about person",
-         "intent_filters": [
-            {
-               "action": "com.google.fuchsia.preview.v1",
-               "parameters": [
-                  {
-                     "name": "entityToPreview",
-                     "type": "https://fuchsia.com/types/Friend"
-                  }
-               ]
-            }
-         ],
-         "composition_pattern": "ticker"
-      }
-   }
-}
-```
-
-This module can be launched using an Intent with the action
-`com.google.fuchsia.preview.v1` action, and a `entityToPreview` parameter of
-type `https://fuchsia.com/types/Friend`.
-
-## Module Facet fields
-
-The module facet is defined under the `fuchsia.module` facet in a component
-manifest. See [example](#example).
-
-*   `@version` **unsigned integer** *(required)*
-    -   Describes the version of the module facet. The fields below indicate
-        which minimum `@version` they require.
-    -   **example**: `2`
-*   `composition_pattern`: **string** *(optional)*
-    -   **minimum `@version`**: 1
-    -   **possible values:**
-    *   `ticker`: Show the module at the bottom of the screen underneath another
-        module.
-    *   `comments-right`: show the module to the right of other modules.
-    -   **example**: `"ticker"`
-    -   Specifies the compositional pattern that will be used by the story shell
-        to display this module along-side other modules in the story. For
-        example, the ticker pattern gives a signal to the story shell that the
-        module should be placed below another module that it may share a link
-        with.
-*   `suggestion_headline`: **string** *(optional)*
-    -   **minimum `@version`**: 2
-    -   **possible values**: UTF-8 string
-    -   **example**: `"See details about this person"`
-    -   A human-readable string that may be used when suggesting this Module.
-*   `placeholder_color`: **string** *(optional)*
-    -   **minimum `@version`**: 2
-    -   **possible values**: hex color code, leading with a hashtag (`#`)
-    -   **example**: `"#ff00ff"`
-    -   Defines the color of the placeholder widget used while the module loads.
-*   `intent_filters`: **IntentFilter[]** *(optional)*
-    -   **minimum `@version`**: 2
-    -   **possible values**: JSON list of [IntentFilter](#IntentFilter)
-    -   **example**: See [example](#example).
-    -   A list of different Intent types this Module is able to handle. An
-        action dictates a semantic function this Module implements, as well as
-        the role of each of its parameters. When resolving an intent to a
-        module, the intent resolver uses an index of these intent filter lists
-        to determine which modules can handle an intent.
-
-### IntentFilter
-
-`IntentFilter` is a JSON object used to describe an intent type that a module is
-able to handle. The following describes the fields of the IntentFilter JSON
-object:
-
-*   `action`: **string** *(required)*
-    -   **minimum `@version`**: 2
-    -   **possible values**: ASCII string
-    -   The action this module is able to handle.
-*   `parameters`: **ParameterConstraint[]** *(required)*
-    -   **minimum `@version`**: 2
-    -   **possible values**: JSON List of
-        [ParameterConstraint](#ParameterConstraint)
-    -   Describes the names and types of the parameters required to execute the
-        specified action. Parameters are typically passed in as Entities.
-
-### ParameterConstraint
-
-`ParameterConstraint` describes a particular intent parameter's name, and it's
-acceptable type.
-
-*   `name`: **string** *(required)*
-    -   **minimum `@version`**: 2
-*   `type`: **string** *(required)*
-    -   **minimum `@version`**: 2
-    -   Type that is valid for this parameter.
-
-See [example](#example).
-
-[component-manifest]: https://fuchsia.googlesource.com/docs/+/master/the-book/package_metadata.md#Component-manifest
diff --git a/docs/modular/overview.md b/docs/modular/overview.md
deleted file mode 100644
index 4672439..0000000
--- a/docs/modular/overview.md
+++ /dev/null
@@ -1,43 +0,0 @@
-## Overview
-
-Modular is the application framework for Fuchsia. It manages user experiences by
-composing UI, data, and users from a diverse set of components into logical and
-visual containers called Stories.
-
-The framework defines classes of components to extend user experiences and
-provides software primitives for component composition, communication, task
-delegation, state management and data sharing.
-
-### Requirements to use Modular
-
-Modular supports software written in any language (e.g. Flutter, C++) for any
-Fuchsia supported runtime, as long as it is a Fuchsia Component.
-
-The Modular Framework communicates with components it launches via FIDL, the
-standard IPC mechanism for Fuchsia.
-
-### Extension Points
-
-The framework defines several different classes of components which can be
-implemented by developers to extend the behavior of user experiences:
-
-1.  [Modules](module.md) are components which display UI and are visually
-    composed in a [Story](story.md).
-1.  [Agents](agent.md) are components which run in the background to provide
-    services and data to Modules and other Agents.
-1.  [Shells](shell.md) manage system UI and mediate user interactions.
-1.  [EntityProviders](entity.md) are components which provide access to data
-    object (entities) which are shared between components running in modular.
-
-### `basemgr` and `sessionmgr`
-
-After Fuchsia device startup, `basemgr` and `sessionmgr` are processes that
-provide session management, component lifecycle management and state management.
-
-*   [`basemgr`](basemgr.md) is responsible for user authentication and
-    authorization. It leverages the Base Shell to present UI.
-
-*   [`sessionmgr`](sessionmgr.md) is responsible for the lifecycle of Stories,
-    Modules and Agents, as well as service and state coordination between them.
-    It leverages Session and Story Shells to manage the visual composition of
-    these components.
diff --git a/docs/modular/shell.md b/docs/modular/shell.md
deleted file mode 100644
index 6452ffb..0000000
--- a/docs/modular/shell.md
+++ /dev/null
@@ -1,40 +0,0 @@
-## Shells
-
-Shells are components which are responsible for composing UI. There are three
-shells:
-
-*   `BaseShell` displays UI associated with a device, prior to a session being
-    started.
-*   `SessionShell` displays the UI associated with a given session (e.g. list of
-    stories, settings UI).
-*   `StoryShell` displays a single story (i.e. the composition of the modules in
-    a story, each story gets its own `StoryShell` instance).
-
-### Environment
-
-A shell is given access to two services provided by the modular framework in its
-incoming namespace:
-
-*   `fuchsia.modular.ComponentContext` gives the agent access to functionality
-    which is shared across components run under the modular framework (e.g.
-    modules, shells, agents).
-*   `fuchsia.modular.[Base,Session,Story]ShellContext` gives access to shell
-    specific functionality for each type of shell, respectively.
-
-A shell is expected to provide two services to the modular framework in its
-outgoing namespace:
-
-*   `fuchsia.modular.[Base,Session,Story]Shell` the modular framework uses to
-    communicate requests to display UI.
-*   `fuchsia.modular.Lifecycle` allows the framework to signal the shell to
-    terminate gracefully.
-
-### Lifecycle
-
-The three shells have varying lifecycles:
-
-*   `BaseShell` runs between the time `basemgr` starts up until a session has
-    been established, and on demand thereafter to faciliate authentication
-    requests.
-*   `SessionShell` runs for the duration of a session.
-*   `StoryShell` runs while its associated story is running.
diff --git a/docs/modular/story.md b/docs/modular/story.md
deleted file mode 100644
index ad3e8e7..0000000
--- a/docs/modular/story.md
+++ /dev/null
@@ -1,16 +0,0 @@
-## Stories
-
-A story is a logical container for composing a set of modules.
-
-Stories and their associated state are stored in the user's Ledger.
-
-### Presentation
-
-The modular framework uses the `fuchsia.modular.StoryShell` interface to display
-the UI for stories.
-
-### Lifecycle
-
-Stories can be created, deleted, started, and stopped. Created and deleted refer
-to the existence of the story in the ledger, whereas started and stopped refer
-to whether or not the story and its associated modules are currently running.
diff --git a/docs/repository_structure.md b/docs/repository_structure.md
deleted file mode 100644
index 37c6a15..0000000
--- a/docs/repository_structure.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Peridot directory structure
-
-This document describes the directory structure of this repository.
-
-[TOC]
-
-## Common parts
-
-Peridot follows the common aspects of layer repository structure defined in
-[Layer repository structure](https://fuchsia.googlesource.com/docs/+/master/layer_repository_structure.md).
-
-This file documents the Peridot-specific pieces.
-
-## TODO
diff --git a/docs/standalone_build.md b/docs/standalone_build.md
deleted file mode 100644
index 848b10d..0000000
--- a/docs/standalone_build.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Peridot Standalone Build
-
-To get the source code for the Peridot layer, using the following commands
-(see [Getting Source](https://fuchsia.googlesource.com/docs/+/master/getting_source.md)
-for more information):
-
-```
-curl -s "https://fuchsia.googlesource.com/scripts/+/master/bootstrap?format=TEXT" | base64 --decode | bash -s peridot
-```
-
-To build the Peridot layer, use the following commands:
-
-## x64
-
-```
-fx set x64
-fx full-build
-```
-
-## arm64
-
-```
-fx set arm64
-fx full-build
-```
diff --git a/examples/.gitignore b/examples/.gitignore
deleted file mode 100644
index 16a1724..0000000
--- a/examples/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-.packages
diff --git a/examples/README.md b/examples/README.md
deleted file mode 100644
index f3d9cbc..0000000
--- a/examples/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Example applications that use the modular runtime for composition.
-
-Code in this directory is not in the modular namespace because it's meant to
-demonstrate how it looks like to be a client of the modular codebase.
-
-These examples are all in C++. For examples in dart/flutter, see
-[//topaz/examples/ui/](https://fuchsia.googlesource.com/topaz/+/HEAD/examples/ui/)
diff --git a/examples/cloud_components/index.json b/examples/cloud_components/index.json
deleted file mode 100644
index e68719e..0000000
--- a/examples/cloud_components/index.json
+++ /dev/null
@@ -1 +0,0 @@
-["https://storage.googleapis.com/maxwell-agents/web_view_component.json"]
diff --git a/examples/guides/how_to_write_a_module_cc.md b/examples/guides/how_to_write_a_module_cc.md
deleted file mode 100644
index 4b20e1b..0000000
--- a/examples/guides/how_to_write_a_module_cc.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# How-To: Write a Module in C++
-
-## Overview
-
-A `Module` is a UI component that can participate in a [Story](link to story doc),
-potentially composed of many different `Module`s. A `Module`'s lifecycle is tightly
-bound to the story to which it was added. In addition to the capabilities
-provided to all Peridot components via `fuchsia::modular::ComponentContext`, a `Module` is given
-additional capabilities via its `fuchsia::modular::ModuleContext`.
-
-## `SimpleMod`
-
-`SimpleMod` is a `Module` communicates with `SimpleAgent` via a `fuchsia::modular::MessageQueue`, and
-displays the messages from `SimpleAgent` on screen.
-
-### Mod Initialization
-
-The first step to writing a `Module` is implementing the initializer.
-
-```c++
-#include <lib/component/cpp/startup_context.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <ui/cpp/fidl.h>
-
-namespace simple {
-
-class SimpleModule : fuchsia::ui::viewsv1::ViewProvider {
- public:
-	SimpleModule(
-			modular::ModuleHost* module_host,
-			fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider> view_provider_request)
-			: view_provider_binding_(this) {
-		view_provider_binding_.Bind(std::move(view_provider_request));
-}
-
- private:
-	modular::ModuleHost* module_host_;
-	fidl::Binding<fuchsia::ui::viewsv1::ViewProvider> view_provider_binding_;
-	std::set<std::unique_ptr<SimpleView>> views_;
-};
-
-}  // namespace simple
-```
-
-The `ModuleHost` provides `SimpleModule` with its `StartupContext` and
-`fuchsia::modular::ModuleContext`.
-
-The `ViewProvider` request allows the system to connect to `SimpleModule`'s view.
-TODO: Update guide to explain view connections.
-
-### Connecting to `SimpleAgent`
-
-In order to provide `SimpleAgent` with a message queue `SimpleModule` first
-needs to connect to the agent via its `fuchsia::modular::ComponentContext`.
-
-```c++
-// Get the component context from the module context.
-modular::fuchsia::modular::ComponentContextPtr component_context;
-module_host->module_context()->GetComponentContext(
-    component_context.NewRequest());
-
-// Connect to the agent to retrieve it's outgoing services.
-modular::fuchsia::modular::AgentControllerPtr agent_controller;
-fuchsia::sys::ServiceProviderPtr agent_services;
-component_context->ConnectToAgent("system/bin/simple_agent",
-                                  agent_services.NewRequest(),
-                                  agent_controller.NewRequest());
-```
-
-### Creating a `fuchsia::modular::MessageQueue`
-
-`SimpleModule` needs to create a message queue and retrieve its token to hand
-it over to `SimpleAgent` so it can write messages to it.
-
-```c++
-// Request a new message queue from the component context.
-modular::MessageQueueClient message_queue;
-component_context->ObtainMessageQueue("agent_queue",
-                                      message_queue.NewRequest());
-
-// Get the token for the message queue and send it to the agent.
-message_queue.GetToken(fxl::MakeCopyable(
-    [agent_service = std::move(agent_service)](fidl::StringPtr token) {
-      agent_service->SetMessageQueue(token);
-    }));
-```
-
-### Communicating with `SimpleAgent
-
-In order to receive messages on the newly created message queue, `SimpleModule`
-registers a receiver callback with `MessageQueueClient`. Here, the receiver is a
-lambda that gets called with new messages.
-
-```c++
-// Register a callback with a message queue client that logs any
-// messages that SimpleAgent sends
-message_queue.RegsiterReceiver(
-    [](std::string msg, fit::function<void()> ack) {
-        ack();
-        FXL_LOG(INFO) << "New message: " << msg;
-    });
-```
-
-### Running the Module
-
-```c++
-int main(int argc, const char** argv) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<simple::SimpleModule> driver(context.get(),
-                                                     [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
-```
-
-`ModuleDriver` is a helper class that manages the `Module`'s lifecyle. Here it is
-given a newly created `StartupContext` and a callback that will be executed
-when the `Module` exits. `ModuleDriver` requires `SimpleModule` to implement the
-constructor shown above, as well as a `Terminate`:
-
-```c++
-void Terminate(const std::function<void()>& done);
-```
-
-The module is responsible for calling `done` once its shutdown sequence is complete.
-
diff --git a/examples/guides/how_to_write_an_agent_cc.md b/examples/guides/how_to_write_an_agent_cc.md
deleted file mode 100644
index f17e4e2..0000000
--- a/examples/guides/how_to_write_an_agent_cc.md
+++ /dev/null
@@ -1,187 +0,0 @@
-# How-To: Write an fuchsia::modular::Agent in C++
-
-## Overview
-
-An `fuchsia::modular::Agent` is a Peridot component that runs without any direct user interaction.
-The lifetime of a single fuchsia::modular::Agent instance is bounded by its session.  It can be
-shared by mods across many stories. In addition to the capabilities provided to all
-Peridot components via `fuchsia::modular::ComponentContext`, an `fuchsia::modular::Agent` is given additional
-capabilities via its `fuchsia::modular::AgentContext`.
-
-See [the simple directory](../simple/) for a complete implementation of
-the `fuchsia::modular::Agent` described here.
-
-## SimpleAgent
-
-`SimpleAgent` is an `fuchsia::modular::Agent` that periodically writes a simple message to
-a `fuchsia::modular::MessageQueue` (a common communication channel).
-
-`SimpleAgent` implements the `Simple` FIDL interface which exposes the
-ability to control which `fuchsia::modular::MessageQueue` the messages will be sent to.
-
-```
-library simple;
-
-[Discoverable]
-interface Simple {
-  // Provides the Simple interface with a message queue to which
-  // messages will be written periodically.
-  1: SetMessageQueue(string queue_token);
-};
-```
-
-### fuchsia::modular::Agent Initialization
-
-The first step to writing an `fuchsia::modular::Agent` is implementing the initializer:
-
-```c++
-#include <lib/app_driver/cpp/agent_driver.h>
-
-class SimpleAgent {
-  public:
-    SimpleAgent(AgentHost* const agent_host) {
-      ...
-    }
-};
-```
-
-The `AgentHost` parameter provides the `fuchsia::modular::Agent` with an `StartupContext`
-and an `fuchsia::modular::AgentContext`.
-
-#### `StartupContext`
-
-`StartupContext` gives the `fuchsia::modular::Agent` access to services provided to it by
-other system components via `incoming_services`. It also allows the `fuchsia::modular::Agent`
-to provide services to other components via `outgoing_services`.
-
-#### `fuchsia::modular::AgentContext`
-
-`fuchsia::modular::AgentContext` is an interface that is exposed to all `Agents`.
-For example, it allows agents to schedule `Task`s that will be executed at
-specific intervals.
-
-`fuchsia::modular::AgentContext` also gives `fuchsia::modular::Agent`s access to `fuchsia::modular::ComponentContext` which is an
-interface that is exposed to all Peridot components (i.e. `fuchsia::modular::Agent` and `Module`).
-For example, `fuchsia::modular::ComponentContext` provides access to `Ledger`, Peridot's cross-device
-storage solution.
-
-### Advertising the `Simple` Interface
-
-In order for the `SimpleAgent` to advertise the `Simple` interface to the system
-it needs to provide it in its `outgoing_services`.
-
-```c++
-  SimpleAgent(AgentHost* const agent_host) {
-    services_.AddService<Simple>(
-        [this](fidl::InterfaceRequest<Simple> request) {
-          simple_impl_->Connect(std::move(request));
-        });
-  }
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> outgoing_services) {
-    services_.AddBinding(std::move(outgoing_services));
-  }
-
- private:
-  // The services namespace that the `Simple` service is added to.
-  component::ServiceNamespace services_;
-
-  // The implementation of the Simple service.
-  std::unique_ptr<SimpleImpl> simple_impl_;
-```
-
-In the initializer above, `SimpleAgent` adds the `Simple` service to its `ServiceNamespace`.
- When `SimpleAgent` receives a `Connect` call, it needs to bind the handle held by `request`
- to the concrete implementation in `services_`. It does this by calling
-`AddBinding(std::move(outgoing_services))`.
-
-Now, when a component connects to the `SimpleAgent`, it will be able to connect
-to the `SimpleInterface` and call methods on it. Those method calls will be
-delegated to the `simple_impl_` per the callback given to `AddService()`.
-
-```c++
-class SimpleImpl : Simple {
-  SimpleImpl();
-  ~SimpleImpl();
-
-  void Connect(fidl::InterfaceRequest<Simple> request);
-
-  std::string message_queue_token() const { return token_; }
-
- private:
-  // |Simple| interface method.
-  void SetMessageQueue(fidl::StringPtr queue_token);
-
-  // The bindings to the Simple service.
-  fidl::BindingSet<Simple> bindings_;
-
-  // The current message queue token.
-  std::string token_;
-};
-```
-
-The `SimpleImpl` could be part of the `SimpleAgent` class, but it's good practice
-to separate out the implementation of an `fuchsia::modular::Agent` from the implementation(s) of the
-interface(s) it provides.
-
-## Running the fuchsia::modular::Agent
-
-```c++
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AgentDriver<simple_agent::SimpleAgent> driver(
-      context.get(), [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
-```
-
-`AgentDriver` is a helper class that helps manage the `fuchsia::modular::Agent` lifecycle. Here
-it is given a newly created `StartupContext` and a callback that will be
-executed when the `fuchsia::modular::Agent` exits. `AgentDriver` requires `SimpleAgent` to
-implement three methods, one of which is `Connect` which was shown above.
-
-The other two are:
-
-```c++
-void RunTask(const fidl::StringPtr& task_id,
-             const std::function<void()>& done) {
-  done();
-}
-
-void Terminate(const std::function<void()>& done) { done(); }
-```
-
-`RunTask` is called when a task, scheduled through `fuchsia::modular::AgentContext`'s `ScheduleTask`,
-is triggered.
-
-`Terminate` is called when the framework requests `fuchsia::modular::Agent` to
-exit gracefully.
-
-## Connecting to SimpleAgent
-
-To connect to the `SimpleAgent` from a different component:
-
-```c++
-// The agent is guaranteed to stay alive as long as |agent_controller| stays in scope.
-fuchsia::modular::AgentControllerPtr agent_controller;
-fuchsia::sys::ServiceProviderPtr agent_services;
-SimpleServicePtr agent_service;
-component_context->ConnectToAgent(agent_url,
-                                  agent_services.NewRequest(),
-                                  agent_controller.NewRequest());
-ConnectToService(agent_services.get(), agent_service.NewRequest());
-agent_service->SetMessageQueue(...);
-```
-
-Here the component context is asked to connect to the fuchsia::modular::Agent at `agent_url`, and is
-given a request for the services that the `SimpleAgent` will provide via `agent_services`,
-and a controller for the `fuchsia::modular::Agent` via `agent_controller`.
-
-Then the client connects to the `Simple` interface by invoking `ConnectToService` with
-a request for a new `SimpleServicePtr`. This interface pointer can be used immediately
-to provide the agent with the token for the `fuchsia::modular::MessageQueue` to send messages to.
-
-See the [SimpleModule](how_to_write_a_mod.md) guide for a more in-depth example.
diff --git a/examples/simple/BUILD.gn b/examples/simple/BUILD.gn
deleted file mode 100644
index 278c4b4..0000000
--- a/examples/simple/BUILD.gn
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-import("//peridot/build/executable_package.gni")
-
-executable_package("simple_agent") {
-
-  meta = [
-    {
-      path = "meta/simple_agent.cmx"
-      dest = "simple_agent.cmx"
-    },
-  ]
-
-  sources = [
-    "simple_agent.cc",
-    "simple_impl.cc",
-    "simple_impl.h",
-  ]
-
-  deps = [
-    ":interfaces",
-    "//garnet/public/lib/component/cpp",
-    "//peridot/public/lib/app_driver/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("simple_module") {
-
-  meta = [
-    {
-      path = "meta/simple_module.cmx"
-      dest = "simple_module.cmx"
-    },
-  ]
-
-  sources = [
-    "simple_module.cc",
-  ]
-
-  deps = [
-    ":interfaces",
-    "//garnet/public/lib/component/cpp",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/message_queue/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-fidl("interfaces") {
-  cpp_legacy_callbacks = true
-
-  name = "fuchsia.modular.examples.simple"
-
-  sources = [
-    "simple.fidl",
-  ]
-}
diff --git a/examples/simple/meta/simple_agent.cmx b/examples/simple/meta/simple_agent.cmx
deleted file mode 100644
index cddecbc..0000000
--- a/examples/simple/meta/simple_agent.cmx
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.examples.simple",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.netconnector.NetConnector",
-            "fuchsia.sys.Launcher",
-            "fuchsia.tracelink.Registry"
-        ]
-    }
-}
diff --git a/examples/simple/meta/simple_module.cmx b/examples/simple/meta/simple_module.cmx
deleted file mode 100644
index ece9e0f..0000000
--- a/examples/simple/meta/simple_module.cmx
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.netconnector.NetConnector",
-            "fuchsia.sys.Launcher",
-            "fuchsia.tracelink.Registry"
-        ]
-    }
-}
diff --git a/examples/simple/simple.fidl b/examples/simple/simple.fidl
deleted file mode 100644
index f789cff..0000000
--- a/examples/simple/simple.fidl
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular.examples.simple;
-
-[Discoverable]
-interface Simple {
-    // Provides the Simple interface with a message queue to which
-    // messages will be written periodically.
-    1: SetMessageQueue(string queue_token);
-};
diff --git a/examples/simple/simple_agent.cc b/examples/simple/simple_agent.cc
deleted file mode 100644
index 2c6a050..0000000
--- a/examples/simple/simple_agent.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/app_driver/cpp/agent_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-
-#include "peridot/examples/simple/simple_impl.h"
-
-using ::fuchsia::modular::examples::simple::Simple;
-
-namespace simple {
-
-class SimpleAgent {
- public:
-  SimpleAgent(modular::AgentHost* const agent_host)
-      : simple_impl_(new SimpleImpl) {
-    services_.AddService<Simple>(
-        [this](fidl::InterfaceRequest<Simple> request) {
-          simple_impl_->Connect(std::move(request));
-        });
-  }
-
-  // Called by |AgentDriver| to expose the agent's outgoing services.
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> outgoing_services) {
-    services_.AddBinding(std::move(outgoing_services));
-  }
-
-  // Called by |AgentDriver| to perform the task with |task_id|.
-  void RunTask(const fidl::StringPtr& task_id,
-               const std::function<void()>& done) {
-    done();
-  }
-
-  // Called by |AgentDriver| when the agent is to terminate.
-  void Terminate(const std::function<void()>& done) { done(); }
-
- private:
-  // The services namespace that the `Simple` service is added to.
-  component::ServiceNamespace services_;
-
-  // The implementation of the Simple service.
-  std::unique_ptr<SimpleImpl> simple_impl_;
-};
-
-}  // namespace simple
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AgentDriver<simple::SimpleAgent> driver(context.get(),
-                                                   [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/examples/simple/simple_impl.cc b/examples/simple/simple_impl.cc
deleted file mode 100644
index db8f0c0..0000000
--- a/examples/simple/simple_impl.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/examples/simple/simple_impl.h"
-
-using ::fuchsia::modular::examples::simple::Simple;
-
-namespace simple {
-
-SimpleImpl::SimpleImpl() = default;
-
-SimpleImpl::~SimpleImpl() = default;
-
-void SimpleImpl::Connect(fidl::InterfaceRequest<Simple> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void SimpleImpl::SetMessageQueue(std::string queue_token) {
-  token_ = queue_token;
-}
-
-}  // namespace simple
diff --git a/examples/simple/simple_impl.h b/examples/simple/simple_impl.h
deleted file mode 100644
index cfa3771..0000000
--- a/examples/simple/simple_impl.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_EXAMPLES_SIMPLE_SIMPLE_IMPL_H_
-#define PERIDOT_EXAMPLES_SIMPLE_SIMPLE_IMPL_H_
-
-#include <string>
-
-#include <fuchsia/modular/examples/simple/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fxl/macros.h>
-
-namespace simple {
-
-// An implementation of the Simple interface exposed by |SimpleAgent|.
-class SimpleImpl : ::fuchsia::modular::examples::simple::Simple {
- public:
-  using Simple = ::fuchsia::modular::examples::simple::Simple;
-
-  SimpleImpl();
-  ~SimpleImpl() override;
-
-  void Connect(fidl::InterfaceRequest<Simple> request);
-
-  std::string message_queue_token() const { return token_; }
-
- private:
-  // |Simple| interface method.
-  void SetMessageQueue(std::string queue_token) override;
-
-  // The bindings to the Simple service.
-  fidl::BindingSet<Simple> bindings_;
-
-  // The current message queue token.
-  std::string token_;
-};
-
-}  // namespace simple
-
-#endif  // PERIDOT_EXAMPLES_SIMPLE_SIMPLE_IMPL_H_
diff --git a/examples/simple/simple_module.cc b/examples/simple/simple_module.cc
deleted file mode 100644
index ab8faab..0000000
--- a/examples/simple/simple_module.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/examples/simple/cpp/fidl.h>
-#include <fuchsia/ui/scenic/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/message_queue/cpp/message_queue_client.h>
-
-using ::fuchsia::modular::examples::simple::SimplePtr;
-
-namespace simple {
-
-class SimpleModule : public fuchsia::ui::app::ViewProvider,
-                     public fuchsia::ui::viewsv1::ViewProvider {
- public:
-  SimpleModule(modular::ModuleHost* const module_host)
-      : old_view_provider_binding_(this), view_provider_binding_(this) {
-    // Get the component context from the module context.
-    fuchsia::modular::ComponentContextPtr component_context;
-    module_host->module_context()->GetComponentContext(
-        component_context.NewRequest());
-
-    // Connect to the agent to retrieve it's outgoing services.
-    fuchsia::modular::AgentControllerPtr agent_controller;
-    fuchsia::sys::ServiceProviderPtr agent_services;
-    component_context->ConnectToAgent("simple_agent",
-                                      agent_services.NewRequest(),
-                                      agent_controller.NewRequest());
-
-    // Connect to the SimpleService in the agent's services.
-    SimplePtr agent_service;
-    component::ConnectToService(agent_services.get(),
-                                agent_service.NewRequest());
-
-    // Request a new message queue from the component context.
-    component_context->ObtainMessageQueue("agent_queue",
-                                          message_queue_.NewRequest());
-
-    // Register a callback that receives new messages that SimpleAgent sends.
-    message_queue_.RegisterReceiver(
-        [](std::string msg, fit::function<void()> ack) {
-          ack();
-          FXL_LOG(INFO) << "new message: " << msg;
-        });
-
-    // Get the token for the message queue and send it to the agent.
-    message_queue_.GetToken(fxl::MakeCopyable(
-        [agent_service = std::move(agent_service)](fidl::StringPtr token) {
-          agent_service->SetMessageQueue(token);
-        }));
-    FXL_LOG(INFO) << "Initialized Simple Module.";
-  }
-
-  SimpleModule(modular::ModuleHost* const module_host,
-               fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>
-                   view_provider_request)
-      : SimpleModule(module_host) {
-    view_provider_binding_.Bind(std::move(view_provider_request));
-  }
-
-  SimpleModule(modular::ModuleHost* const module_host,
-               fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-                   view_provider_request)
-      : SimpleModule(module_host) {
-    old_view_provider_binding_.Bind(std::move(view_provider_request));
-  }
-
-  // Called by ModuleDriver.
-  void Terminate(const std::function<void()>& done) { done(); }
-
- private:
-  // |fuchsia::ui::app::ViewProvider|
-  void CreateView(
-      zx::eventpair view_token,
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
-      fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services)
-      override {}
-
-  // |fuchsia::ui::viewsv1::ViewProvider|
-  void CreateView(
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> view_owner,
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services) override {
-  }
-
-  fidl::Binding<fuchsia::ui::viewsv1::ViewProvider> old_view_provider_binding_;
-  fidl::Binding<fuchsia::ui::app::ViewProvider> view_provider_binding_;
-
-  modular::MessageQueueClient message_queue_;
-};
-
-}  // namespace simple
-
-int main(int argc, const char** argv) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<simple::SimpleModule> driver(context.get(),
-                                                     [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/examples/swap_cpp/BUILD.gn b/examples/swap_cpp/BUILD.gn
deleted file mode 100644
index 4446eab..0000000
--- a/examples/swap_cpp/BUILD.gn
+++ /dev/null
@@ -1,84 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-executable_package("swap_module1") {
-
-  meta = [
-    {
-      path = "meta/swap_module1.cmx"
-      dest = "swap_module1.cmx"
-    },
-  ]
-
-  sources = [
-    "swap_module1.cc",
-  ]
-  deps = [
-    ":module",
-    "//peridot/public/lib/app_driver/cpp:app_driver",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/trace-provider",
-  ]
-}
-
-executable_package("swap_module2") {
-
-  meta = [
-    {
-      path = "meta/swap_module2.cmx"
-      dest = "swap_module2.cmx"
-    },
-  ]
-
-  sources = [
-    "swap_module2.cc",
-  ]
-  deps = [
-    ":module",
-    "//peridot/public/lib/app_driver/cpp:app_driver",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/trace-provider",
-  ]
-}
-
-source_set("module") {
-  sources = [
-    "module.cc",
-    "module.h",
-  ]
-
-  public_deps = [
-    "//peridot/lib/fidl:single_service_app",
-  ]
-
-  deps = [
-    "//garnet/public/lib/ui/base_view/cpp",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-  ]
-}
-
-executable_package("swap_recipe") {
-
-  meta = [
-    {
-      path = "meta/swap_recipe.cmx"
-      dest = "swap_recipe.cmx"
-    },
-  ]
-
-  sources = [
-    "swap_recipe.cc",
-  ]
-  deps = [
-    "//garnet/public/lib/ui/base_view/cpp",
-    "//peridot/lib/fidl:single_service_app",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/trace-provider",
-  ]
-}
diff --git a/examples/swap_cpp/meta/swap_module1.cmx b/examples/swap_cpp/meta/swap_module1.cmx
deleted file mode 100644
index ece9e0f..0000000
--- a/examples/swap_cpp/meta/swap_module1.cmx
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.netconnector.NetConnector",
-            "fuchsia.sys.Launcher",
-            "fuchsia.tracelink.Registry"
-        ]
-    }
-}
diff --git a/examples/swap_cpp/meta/swap_module2.cmx b/examples/swap_cpp/meta/swap_module2.cmx
deleted file mode 100644
index ece9e0f..0000000
--- a/examples/swap_cpp/meta/swap_module2.cmx
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.netconnector.NetConnector",
-            "fuchsia.sys.Launcher",
-            "fuchsia.tracelink.Registry"
-        ]
-    }
-}
diff --git a/examples/swap_cpp/meta/swap_recipe.cmx b/examples/swap_cpp/meta/swap_recipe.cmx
deleted file mode 100644
index ece9e0f..0000000
--- a/examples/swap_cpp/meta/swap_recipe.cmx
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.netconnector.NetConnector",
-            "fuchsia.sys.Launcher",
-            "fuchsia.tracelink.Registry"
-        ]
-    }
-}
diff --git a/examples/swap_cpp/module.cc b/examples/swap_cpp/module.cc
deleted file mode 100644
index 415bfbd..0000000
--- a/examples/swap_cpp/module.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/examples/swap_cpp/module.h"
-
-#include <lib/component/cpp/startup_context.h>
-#include <utility>
-
-namespace modular_example {
-
-ModuleView::ModuleView(scenic::ViewContext view_context, uint32_t color)
-    : V1BaseView(std::move(view_context), "ModuleView"),
-      background_node_(session()) {
-  scenic::Material background_material(session());
-  background_material.SetColor((color >> 16) & 0xff, (color >> 8) & 0xff,
-                               color & 0xff, (color >> 24) & 0xff);
-  background_node_.SetMaterial(background_material);
-  parent_node().AddChild(background_node_);
-}
-
-void ModuleView::OnPropertiesChanged(fuchsia::ui::viewsv1::ViewProperties) {
-  scenic::Rectangle background_shape(session(), logical_size().width,
-                                     logical_size().height);
-  background_node_.SetShape(background_shape);
-  background_node_.SetTranslation(logical_size().width * .5f,
-                                  logical_size().height * .5f, 0.f);
-  InvalidateScene();
-}
-
-ModuleApp::ModuleApp(component::StartupContext* const startup_context,
-                     CreateViewCallback create)
-    : ViewApp(startup_context), create_(std::move(create)) {}
-
-void ModuleApp::CreateView(
-    zx::eventpair view_token,
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
-    fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services) {
-  auto scenic =
-      startup_context()
-          ->ConnectToEnvironmentService<fuchsia::ui::scenic::Scenic>();
-  scenic::ViewContext context = {
-      .session_and_listener_request =
-          scenic::CreateScenicSessionPtrAndListenerRequest(scenic.get()),
-      .view_token = std::move(view_token),
-      .incoming_services = std::move(incoming_services),
-      .outgoing_services = std::move(outgoing_services),
-      .startup_context = startup_context(),
-  };
-
-  view_.reset(create_(std::move(context)));
-}
-
-}  // namespace modular_example
diff --git a/examples/swap_cpp/module.h b/examples/swap_cpp/module.h
deleted file mode 100644
index 40f275f..0000000
--- a/examples/swap_cpp/module.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_EXAMPLES_SWAP_CPP_MODULE_H_
-#define PERIDOT_EXAMPLES_SWAP_CPP_MODULE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/ui/base_view/cpp/v1_base_view.h>
-#include <zx/eventpair.h>
-
-#include "peridot/lib/fidl/single_service_app.h"
-
-namespace modular_example {
-
-class ModuleView : public scenic::V1BaseView {
- public:
-  explicit ModuleView(scenic::ViewContext view_context, uint32_t color);
-
- private:
-  // |scenic::V1BaseView|
-  void OnPropertiesChanged(
-      fuchsia::ui::viewsv1::ViewProperties old_properties) override;
-
-  scenic::ShapeNode background_node_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ModuleView);
-};
-
-class ModuleApp : public modular::ViewApp {
- public:
-  using CreateViewCallback =
-      std::function<scenic::V1BaseView*(scenic::ViewContext view_context)>;
-
-  explicit ModuleApp(component::StartupContext* const startup_context,
-                     CreateViewCallback create);
-
- private:
-  // |ViewApp|
-  void CreateView(
-      zx::eventpair view_token,
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
-      fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services)
-      override;
-
-  CreateViewCallback create_;
-  std::unique_ptr<scenic::V1BaseView> view_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ModuleApp);
-};
-
-}  // namespace modular_example
-
-#endif  // PERIDOT_EXAMPLES_SWAP_CPP_MODULE_H_
diff --git a/examples/swap_cpp/swap_module1.cc b/examples/swap_cpp/swap_module1.cc
deleted file mode 100644
index af6f889..0000000
--- a/examples/swap_cpp/swap_module1.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <trace-provider/provider.h>
-
-#include "peridot/examples/swap_cpp/module.h"
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  trace::TraceProvider trace_provider(loop.dispatcher());
-
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AppDriver<modular_example::ModuleApp> driver(
-      context->outgoing().deprecated_services(),
-      std::make_unique<modular_example::ModuleApp>(
-          context.get(),
-          [](scenic::ViewContext view_context) {
-            return new modular_example::ModuleView(std::move(view_context),
-                                                   0xFF00FFFF);
-          }),
-      [&loop] { loop.Quit(); });
-
-  loop.Run();
-  return 0;
-}
diff --git a/examples/swap_cpp/swap_module2.cc b/examples/swap_cpp/swap_module2.cc
deleted file mode 100644
index 2f4ed3b..0000000
--- a/examples/swap_cpp/swap_module2.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <trace-provider/provider.h>
-
-#include "peridot/examples/swap_cpp/module.h"
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  trace::TraceProvider trace_provider(loop.dispatcher());
-
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AppDriver<modular_example::ModuleApp> driver(
-      context->outgoing().deprecated_services(),
-      std::make_unique<modular_example::ModuleApp>(
-          context.get(),
-          [](scenic::ViewContext view_context) {
-            return new modular_example::ModuleView(std::move(view_context),
-                                                   0xFFFF00FF);
-          }),
-      [&loop] { loop.Quit(); });
-
-  loop.Run();
-  return 0;
-}
diff --git a/examples/swap_cpp/swap_recipe.cc b/examples/swap_cpp/swap_recipe.cc
deleted file mode 100644
index abee4e3..0000000
--- a/examples/swap_cpp/swap_recipe.cc
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <array>
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/ui/base_view/cpp/v1_base_view.h>
-#include <trace-provider/provider.h>
-#include <zx/eventpair.h>
-
-#include "peridot/lib/fidl/single_service_app.h"
-
-namespace {
-
-constexpr uint32_t kChildKey = 1;
-constexpr int kSwapSeconds = 5;
-constexpr std::array<const char*, 2> kModuleQueries{
-    {"swap_module1", "swap_module2"}};
-
-class RecipeView : public scenic::V1BaseView {
- public:
-  explicit RecipeView(scenic::ViewContext view_context)
-      : V1BaseView(std::move(view_context), "RecipeView") {}
-
-  ~RecipeView() override = default;
-
-  void SetChild(zx::eventpair view_token) {
-    if (host_node_) {
-      GetViewContainer()->RemoveChild2(kChildKey, zx::eventpair());
-      host_node_->Detach();
-      host_node_.reset();
-    }
-
-    if (view_token) {
-      host_node_ = std::make_unique<scenic::EntityNode>(session());
-
-      zx::eventpair host_import_token;
-      host_node_->ExportAsRequest(&host_import_token);
-      parent_node().AddChild(*host_node_);
-
-      GetViewContainer()->AddChild2(kChildKey, std::move(view_token),
-                                    std::move(host_import_token));
-    }
-  }
-
- private:
-  // |scenic::V1BaseView|
-  void OnPropertiesChanged(fuchsia::ui::viewsv1::ViewProperties) override {
-    if (host_node_) {
-      auto child_properties = fuchsia::ui::viewsv1::ViewProperties::New();
-      fidl::Clone(properties(), child_properties.get());
-      GetViewContainer()->SetChildProperties(kChildKey,
-                                             std::move(child_properties));
-    }
-  }
-
-  std::unique_ptr<scenic::EntityNode> host_node_;
-};
-
-class RecipeApp : public modular::ViewApp {
- public:
-  RecipeApp(component::StartupContext* const startup_context)
-      : ViewApp(startup_context) {
-    startup_context->ConnectToEnvironmentService(module_context_.NewRequest());
-    SwapModule();
-  }
-
-  ~RecipeApp() override = default;
-
- private:
-  // |ViewApp|
-  void CreateView(
-      zx::eventpair view_token,
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
-      fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services)
-      override {
-    auto scenic =
-        startup_context()
-            ->ConnectToEnvironmentService<fuchsia::ui::scenic::Scenic>();
-    scenic::ViewContext view_context = {
-        .session_and_listener_request =
-            scenic::CreateScenicSessionPtrAndListenerRequest(scenic.get()),
-        .view_token = std::move(view_token),
-        .incoming_services = std::move(incoming_services),
-        .outgoing_services = std::move(outgoing_services),
-        .startup_context = startup_context(),
-    };
-    view_ = std::make_unique<RecipeView>(std::move(view_context));
-    SetChild();
-  }
-
-  void SwapModule() {
-    StartModule(kModuleQueries[query_index_]);
-    query_index_ = (query_index_ + 1) % kModuleQueries.size();
-    async::PostDelayedTask(async_get_default_dispatcher(),
-                           [this] { SwapModule(); }, zx::sec(kSwapSeconds));
-  }
-
-  void StartModule(const std::string& module_query) {
-    if (module_) {
-      module_->Stop([this, module_query] {
-        module_.Unbind();
-        module_view_.Unbind();
-        StartModule(module_query);
-      });
-      return;
-    }
-
-    // This module is named after its URL.
-    fuchsia::modular::Intent intent;
-    intent.handler = module_query;
-    module_context_->EmbedModule(
-        module_query, std::move(intent), module_.NewRequest(),
-        module_view_.NewRequest(),
-        [](const fuchsia::modular::StartModuleStatus&) {});
-    SetChild();
-  }
-
-  void SetChild() {
-    if (view_ && module_view_) {
-      view_->SetChild(
-          zx::eventpair(module_view_.Unbind().TakeChannel().release()));
-    }
-  }
-
-  fuchsia::modular::ModuleContextPtr module_context_;
-  fuchsia::modular::ModuleControllerPtr module_;
-  fuchsia::ui::viewsv1token::ViewOwnerPtr module_view_;
-  std::unique_ptr<RecipeView> view_;
-
-  int query_index_ = 0;
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  trace::TraceProvider trace_provider(loop.dispatcher());
-
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AppDriver<RecipeApp> driver(
-      context->outgoing().deprecated_services(),
-      std::make_unique<RecipeApp>(context.get()), [&loop] { loop.Quit(); });
-
-  loop.Run();
-  return 0;
-}
diff --git a/examples/todo_cpp/BUILD.gn b/examples/todo_cpp/BUILD.gn
deleted file mode 100644
index 206ad3c..0000000
--- a/examples/todo_cpp/BUILD.gn
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-executable_package("todo_cpp") {
-
-  meta = [
-    {
-      path = "meta/todo_cpp.cmx"
-      dest = "todo_cpp.cmx"
-    },
-  ]
-
-  deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/fit",
-  ]
-
-  sources = [
-    "generator.cc",
-    "generator.h",
-    "todo.cc",
-    "todo.h",
-  ]
-}
diff --git a/examples/todo_cpp/README.md b/examples/todo_cpp/README.md
deleted file mode 100644
index 36ef755..0000000
--- a/examples/todo_cpp/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# todo (headless)
-
-Example module that uses Ledger to store internal data.
-
-To run the module, run:
-
-```
-basemgr --base_shell=dev_base_shell --session_shell=dev_session_shell --session_shell_args=--root_module=example_todo_headless
-```
-
-This is a headless module, taking no input and writing the output to stdout.
-
-The module keeps a list of todo items in a Ledger page, randomly adds and
-removes items, and prints the state after each modification.  Items generated by
-each instance are tagged with a unique tag. To observe the application running
-on multiple devices and synchronizing the state using Ledger, [set up Cloud
-Sync](https://fuchsia.googlesource.com/ledger/+/HEAD/docs/user_guide.md#Setup)
-and run the module on each device.
-
-Example output:
-
-```
-[00053.199] 02933.02949> --- To Do ---
-[00053.199] 02933.02949> [ 18355 ] write a spec for the law of gravity
-[00053.199] 02933.02949> [ 24673 ] celebrate hipster bars south of Pigalle
-[00053.200] 02933.02949> [ 24673 ] solve the society
-[00053.200] 02933.02949> [ 18355 ] draw the pyramids
-[00053.200] 02933.02949> [ 24673 ] evaluate a better way forward
-```
diff --git a/examples/todo_cpp/generator.cc b/examples/todo_cpp/generator.cc
deleted file mode 100644
index 396d7aa..0000000
--- a/examples/todo_cpp/generator.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/examples/todo_cpp/generator.h"
-
-#include <iostream>
-
-#include <lib/fxl/strings/concatenate.h>
-
-namespace todo {
-Generator::Generator(std::default_random_engine* rng) : rng_(rng) {
-  actions_ = {
-      "acquire",      "cancel",      "consider",
-      "draw",         "evaluate",    "celebrate",
-      "find",         "identify",    "meet with",
-      "plan",         "solve",       "study",
-      "talk to",      "think about", "write an article about",
-      "check out",    "order",       "write a spec for",
-      "order",        "track down",  "memorize",
-      "git checkout",
-  };
-  action_distribution_ =
-      std::uniform_int_distribution<>(0, actions_.size() - 1);
-
-  objects_ = {
-      "Christopher Columbus",
-      "PHP",
-      "a better way forward",
-      "a glass of wine",
-      "a good book on C++",
-      "a huge simulation we are all part of",
-      "a nice dinner out",
-      "a sheep",
-      "an AZERTY keyboard",
-      "hipster bars south of Pigalle",
-      "kittens",
-      "manganese",
-      "more cheese",
-      "some bugs",
-      "staticly-typed programming languages",
-      "the cryptographic primitives",
-      "the espresso machine",
-      "the law of gravity",
-      "the neighbor",
-      "the pyramids",
-      "the society",
-      "velocity",
-  };
-  object_distribution_ =
-      std::uniform_int_distribution<>(0, objects_.size() - 1);
-
-  auto tag_distribution = std::uniform_int_distribution<>(10'000, 99'999);
-  tag_ =
-      fxl::Concatenate({"[ ", std::to_string(tag_distribution(*rng_)), " ] "});
-  std::cout << "Items generated by this instace are tagged with: " << tag_
-            << std::endl;
-}
-Generator::~Generator() {}
-
-std::string Generator::Generate() {
-  return fxl::Concatenate({tag_, actions_[action_distribution_(*rng_)], " ",
-                           objects_[object_distribution_(*rng_)]});
-}
-
-}  // namespace todo
diff --git a/examples/todo_cpp/generator.h b/examples/todo_cpp/generator.h
deleted file mode 100644
index 169890a..0000000
--- a/examples/todo_cpp/generator.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_EXAMPLES_TODO_CPP_GENERATOR_H_
-#define PERIDOT_EXAMPLES_TODO_CPP_GENERATOR_H_
-
-#include <random>
-#include <string>
-#include <vector>
-
-#include <lib/fxl/macros.h>
-
-namespace todo {
-
-class Generator {
- public:
-  explicit Generator(std::default_random_engine* rng);
-  ~Generator();
-
-  std::string Generate();
-
- private:
-  std::default_random_engine* rng_;
-  std::uniform_int_distribution<> action_distribution_;
-  std::vector<std::string> actions_;
-  std::uniform_int_distribution<> object_distribution_;
-  std::vector<std::string> objects_;
-  std::string tag_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(Generator);
-};
-
-}  // namespace todo
-
-#endif  // PERIDOT_EXAMPLES_TODO_CPP_GENERATOR_H_
diff --git a/examples/todo_cpp/meta/todo_cpp.cmx b/examples/todo_cpp/meta/todo_cpp.cmx
deleted file mode 100644
index ece9e0f..0000000
--- a/examples/todo_cpp/meta/todo_cpp.cmx
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "features": [],
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.net.oldhttp.HttpService",
-            "fuchsia.netconnector.NetConnector",
-            "fuchsia.sys.Launcher",
-            "fuchsia.tracelink.Registry"
-        ]
-    }
-}
diff --git a/examples/todo_cpp/todo.cc b/examples/todo_cpp/todo.cc
deleted file mode 100644
index 993ebee..0000000
--- a/examples/todo_cpp/todo.cc
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/examples/todo_cpp/todo.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <algorithm>
-#include <iostream>
-
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_printf.h>
-#include <lib/fxl/time/time_delta.h>
-
-namespace todo {
-
-namespace {
-
-const double kMeanListSize = 7.0;
-const double kListSizeStdDev = 2.0;
-const int kMinDelaySeconds = 1;
-const int kMaxDelaySeconds = 5;
-
-std::string ToString(const fuchsia::mem::Buffer& vmo) {
-  std::string ret;
-  if (!fsl::StringFromVmo(vmo, &ret)) {
-    FXL_DCHECK(false);
-  }
-  return ret;
-}
-
-fidl::VectorPtr<uint8_t> ToArray(const std::string& val) {
-  auto ret = fidl::VectorPtr<uint8_t>::New(val.size());
-  memcpy(ret->data(), val.data(), val.size());
-  return ret;
-}
-
-Key MakeKey() {
-  return ToArray(fxl::StringPrintf("%120ld-%u", time(nullptr), rand()));
-}
-
-std::function<void(zx_status_t)> NewErrorHandler(fit::closure quit_callback,
-                                                 std::string description) {
-  return [description, &quit_callback](zx_status_t status) {
-    FXL_LOG(ERROR) << description << " diconnected: " << status;
-    quit_callback();
-  };
-}
-
-std::function<void(fuchsia::ledger::Status)> HandleResponse(
-    fit::closure quit_callback, std::string description) {
-  return [description, &quit_callback](fuchsia::ledger::Status status) {
-    if (status != fuchsia::ledger::Status::OK) {
-      FXL_LOG(ERROR) << description << " failed";
-      quit_callback();
-    }
-  };
-}
-
-void GetEntries(fuchsia::ledger::PageSnapshotPtr snapshot,
-                std::vector<fuchsia::ledger::Entry> entries,
-                std::unique_ptr<fuchsia::ledger::Token> token,
-                std::function<void(fuchsia::ledger::Status,
-                                   std::vector<fuchsia::ledger::Entry>)>
-                    callback) {
-  fuchsia::ledger::PageSnapshot* snapshot_ptr = snapshot.get();
-  snapshot_ptr->GetEntries(
-      fidl::VectorPtr<uint8_t>::New(0), std::move(token),
-      fxl::MakeCopyable(
-          [snapshot = std::move(snapshot), entries = std::move(entries),
-           callback = std::move(callback)](fuchsia::ledger::Status status,
-                                           auto new_entries,
-                                           auto next_token) mutable {
-            if (status != fuchsia::ledger::Status::OK &&
-                status != fuchsia::ledger::Status::PARTIAL_RESULT) {
-              callback(status, {});
-              return;
-            }
-            for (size_t i = 0; i < new_entries.size(); ++i) {
-              entries.push_back(std::move(new_entries.at(i)));
-            }
-            if (status == fuchsia::ledger::Status::OK) {
-              callback(fuchsia::ledger::Status::OK, std::move(entries));
-              return;
-            }
-            GetEntries(std::move(snapshot), std::move(entries),
-                       std::move(next_token), std::move(callback));
-          }));
-}
-
-void GetEntries(fuchsia::ledger::PageSnapshotPtr snapshot,
-                std::function<void(fuchsia::ledger::Status,
-                                   std::vector<fuchsia::ledger::Entry>)>
-                    callback) {
-  GetEntries(std::move(snapshot), {}, nullptr, std::move(callback));
-}
-
-}  // namespace
-
-TodoApp::TodoApp(async::Loop* loop)
-    : loop_(loop),
-      rng_(time(nullptr)),
-      size_distribution_(kMeanListSize, kListSizeStdDev),
-      delay_distribution_(kMinDelaySeconds, kMaxDelaySeconds),
-      generator_(&rng_),
-      context_(component::StartupContext::CreateFromStartupInfo()),
-      page_watcher_binding_(this) {
-  context_->ConnectToEnvironmentService(module_context_.NewRequest());
-  module_context_->GetComponentContext(component_context_.NewRequest());
-  ledger_.set_error_handler(
-      NewErrorHandler([this] { loop_->Quit(); }, "Ledger"));
-  component_context_->GetLedger(ledger_.NewRequest());
-  ledger_->GetRootPage(
-      page_.NewRequest(),
-      HandleResponse([this] { loop_->Quit(); }, "GetRootPage"));
-
-  fuchsia::ledger::PageSnapshotPtr snapshot;
-  page_->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
-                     page_watcher_binding_.NewBinding(),
-                     HandleResponse([this] { loop_->Quit(); }, "Watch"));
-  List(std::move(snapshot));
-
-  async::PostTask(loop_->dispatcher(), [this] { Act(); });
-}
-
-void TodoApp::Terminate() { loop_->Quit(); }
-
-void TodoApp::OnChange(fuchsia::ledger::PageChange /*page_change*/,
-                       fuchsia::ledger::ResultState result_state,
-                       OnChangeCallback callback) {
-  if (result_state != fuchsia::ledger::ResultState::PARTIAL_STARTED &&
-      result_state != fuchsia::ledger::ResultState::COMPLETED) {
-    // Only request the entries list once, on the first OnChange call.
-    callback(nullptr);
-    return;
-  }
-
-  fuchsia::ledger::PageSnapshotPtr snapshot;
-  callback(snapshot.NewRequest());
-  List(std::move(snapshot));
-}
-
-void TodoApp::List(fuchsia::ledger::PageSnapshotPtr snapshot) {
-  GetEntries(std::move(snapshot),
-             [this](fuchsia::ledger::Status status, auto entries) {
-               if (status != fuchsia::ledger::Status::OK) {
-                 FXL_LOG(ERROR) << "GetEntries failed";
-                 loop_->Quit();
-                 return;
-               }
-
-               std::cout << "--- To Do ---" << std::endl;
-               for (auto& entry : entries) {
-                 std::cout << (entry.value ? ToString(*entry.value) : "<empty>")
-                           << std::endl;
-               }
-               std::cout << "---" << std::endl;
-             });
-}
-
-void TodoApp::GetKeys(std::function<void(std::vector<Key>)> callback) {
-  fuchsia::ledger::PageSnapshotPtr snapshot;
-  page_->GetSnapshot(snapshot.NewRequest(), {}, nullptr,
-                     HandleResponse([this] { loop_->Quit(); }, "GetSnapshot"));
-
-  fuchsia::ledger::PageSnapshot* snapshot_ptr = snapshot.get();
-  snapshot_ptr->GetKeys({}, nullptr,
-      fxl::MakeCopyable([snapshot = std::move(snapshot), callback](
-                            fuchsia::ledger::Status status, auto keys,
-                            auto next_token) { callback(std::move(keys)); }));
-}
-
-void TodoApp::AddNew() {
-  page_->Put(MakeKey(), ToArray(generator_.Generate()),
-             HandleResponse([this] { loop_->Quit(); }, "Put"));
-}
-
-void TodoApp::DeleteOne(std::vector<Key> keys) {
-  FXL_DCHECK(keys.size());
-  std::uniform_int_distribution<> distribution(0, keys.size() - 1);
-  page_->Delete(std::move(keys.at(distribution(rng_))),
-                HandleResponse([this] { loop_->Quit(); }, "Delete"));
-}
-
-void TodoApp::Act() {
-  GetKeys([this](std::vector<Key> keys) {
-    size_t target_size = std::round(size_distribution_(rng_));
-    if (keys.size() > std::max(static_cast<size_t>(0), target_size)) {
-      DeleteOne(std::move(keys));
-    } else {
-      AddNew();
-    }
-  });
-  zx::duration delay = zx::sec(delay_distribution_(rng_));
-  async::PostDelayedTask(
-      loop_->dispatcher(), [this] { Act(); }, delay);
-}
-
-}  // namespace todo
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  todo::TodoApp app(&loop);
-  loop.Run();
-  return 0;
-}
diff --git a/examples/todo_cpp/todo.h b/examples/todo_cpp/todo.h
deleted file mode 100644
index 2bd129c..0000000
--- a/examples/todo_cpp/todo.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_EXAMPLES_TODO_CPP_TODO_H_
-#define PERIDOT_EXAMPLES_TODO_CPP_TODO_H_
-
-#include <random>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/examples/todo_cpp/generator.h"
-
-namespace todo {
-
-using Key = std::vector<uint8_t>;
-
-class TodoApp : public fuchsia::ledger::PageWatcher,
-                fuchsia::modular::Lifecycle {
- public:
-  TodoApp(async::Loop* loop);
-
-  // fuchsia::ledger::PageWatcher:
-  void OnChange(fuchsia::ledger::PageChange page_change,
-                fuchsia::ledger::ResultState result_state,
-                OnChangeCallback callback) override;
-
- private:
-  // |modular.fuchsia::modular::Lifecycle|
-  void Terminate() override;
-
-  void List(fuchsia::ledger::PageSnapshotPtr snapshot);
-
-  void GetKeys(std::function<void(std::vector<Key>)> callback);
-
-  void AddNew();
-
-  void DeleteOne(std::vector<Key> keys);
-
-  void Act();
-
-  async::Loop* const loop_;
-  std::default_random_engine rng_;
-  std::normal_distribution<> size_distribution_;
-  std::uniform_int_distribution<> delay_distribution_;
-  Generator generator_;
-  std::unique_ptr<component::StartupContext> context_;
-  fidl::InterfacePtr<fuchsia::modular::ModuleContext> module_context_;
-  fuchsia::modular::ComponentContextPtr component_context_;
-  fuchsia::ledger::LedgerPtr ledger_;
-  fidl::Binding<fuchsia::ledger::PageWatcher> page_watcher_binding_;
-  fuchsia::ledger::PagePtr page_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TodoApp);
-};
-
-}  // namespace todo
-
-#endif  // PERIDOT_EXAMPLES_TODO_CPP_TODO_H_
diff --git a/infra/config/README.md b/infra/config/README.md
deleted file mode 100644
index c036d61..0000000
--- a/infra/config/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This directory contains configuration files for infra services.
diff --git a/infra/config/cq.cfg b/infra/config/cq.cfg
deleted file mode 100644
index 96a4d82..0000000
--- a/infra/config/cq.cfg
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# See http://luci-config.appspot.com/schemas/projects/refs:cq.cfg for the
-# documentation of this file format.
-
-version: 1
-cq_name: "modular"
-cq_status_url: "https://fuchsia-cq-status.appspot.com"
-git_repo_url: "https://fuchsia.googlesource.com/modular"
-
-gerrit {}
-
-verifiers {
-  try_job {
-    buckets {
-      name: "luci.modular.ci",
-      builders {
-        name: "Linux x86-64 Debug"
-      }
-      builders {
-        name: "Linux x86-64 Release"
-      }
-      builders {
-        name: "Linux arm64 Debug"
-      }
-      builders {
-        name: "Linux arm64 Release"
-      }
-    }
-  }
-  gerrit_cq_ability {
-    committer_list: "project-fuchsia-committers"
-    dry_run_access_list: "project-fuchsia-tryjob-access"
-  }
-  sign_cla {}
-}
diff --git a/lib/BUILD.gn b/lib/BUILD.gn
deleted file mode 100644
index 7b61a8b..0000000
--- a/lib/BUILD.gn
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-import("//build/package.gni")
-
-executable("peridot_lib_unittests") {
-  testonly = true
-
-  deps = [
-    "//peridot/lib/commit_pack:unittests",
-    "//peridot/lib/convert:unittests",
-    "//peridot/lib/fidl:unittests",
-    "//peridot/lib/firebase:unittests",
-    "//peridot/lib/firebase_auth:unittests",
-    "//peridot/lib/firebase_auth/testing:unittests",
-    "//peridot/lib/ledger_client:unittests",
-    "//peridot/lib/module_manifest:unittests",
-    "//peridot/lib/rng:unittests",
-    "//peridot/lib/scoped_tmpfs:unittests",
-    "//peridot/lib/session_shell_settings:unittests",
-    "//peridot/lib/socket:unittests",
-    "//peridot/lib/util:unittests",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-fidl("maxwell_internal") {
-  cpp_legacy_callbacks = true
-
-  name = "fuchsia.maxwell.internal"
-
-  sources = [
-    "module_manifest_source/fidl/module_package_indexer.fidl",
-  ]
-
-  deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
diff --git a/lib/MAINTAINERS b/lib/MAINTAINERS
deleted file mode 100644
index d0dd525..0000000
--- a/lib/MAINTAINERS
+++ /dev/null
@@ -1,3 +0,0 @@
-mesch@google.com
-qsr@google.com
-thatguy@google.com
diff --git a/lib/base64url/BUILD.gn b/lib/base64url/BUILD.gn
deleted file mode 100644
index a85417a..0000000
--- a/lib/base64url/BUILD.gn
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [
-  "//peridot/bin/*",
-  "//peridot/lib/*",
-]
-
-source_set("base64url") {
-  sources = [
-    "base64url.cc",
-    "base64url.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-  ]
-
-  deps = [
-    "//peridot/third_party/modp_b64",
-  ]
-}
diff --git a/lib/base64url/base64url.cc b/lib/base64url/base64url.cc
deleted file mode 100644
index 8a5fe41..0000000
--- a/lib/base64url/base64url.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/base64url/base64url.h"
-
-#include <lib/fxl/logging.h>
-
-#include "peridot/third_party/modp_b64/modp_b64.h"
-
-namespace base64url {
-
-std::string Base64UrlEncode(fxl::StringView input) {
-  std::string output;
-  size_t output_length = modp_b64_encode_strlen(input.size());
-  // In C++11, std::string guarantees that output[output.size()] is
-  // legal and points to a '\0' character. The last byte of modp_b64_encode() is
-  // a '\0' that will override output[output.size()].
-  output.resize(output_length);
-  size_t written = modp_b64_encode(&output[0], input.data(), input.size());
-  FXL_DCHECK(output_length == written);
-  return output;
-}
-
-bool Base64UrlDecode(fxl::StringView input, std::string* output) {
-  std::string tmp_output;
-  size_t output_maxlength = modp_b64_decode_len(input.size());
-  tmp_output.resize(output_maxlength);
-  size_t output_length =
-      modp_b64_decode(&tmp_output[0], input.data(), input.size());
-  if (output_length == MODP_B64_ERROR) {
-    return false;
-  }
-  tmp_output.resize(output_length);
-  output->swap(tmp_output);
-  return true;
-}
-
-}  // namespace base64url
diff --git a/lib/base64url/base64url.h b/lib/base64url/base64url.h
deleted file mode 100644
index 363adcb..0000000
--- a/lib/base64url/base64url.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_BASE64URL_BASE64URL_H_
-#define PERIDOT_LIB_BASE64URL_BASE64URL_H_
-
-#include <string>
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace base64url {
-
-// Encodes the input string in base64url.
-std::string Base64UrlEncode(fxl::StringView input);
-
-// Decodes the base64url input string. Returns true if successful and false
-// otherwise. The output string is only modified if successful. The decoding can
-// be done in-place.
-bool Base64UrlDecode(fxl::StringView input, std::string* output);
-
-}  // namespace base64url
-
-#endif  // PERIDOT_LIB_BASE64URL_BASE64URL_H_
diff --git a/lib/bound_set/BUILD.gn b/lib/bound_set/BUILD.gn
deleted file mode 100644
index d466527..0000000
--- a/lib/bound_set/BUILD.gn
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("bound_set") {
-  sources = [
-    "bound_set.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-  ]
-}
diff --git a/lib/bound_set/bound_set.h b/lib/bound_set/bound_set.h
deleted file mode 100644
index ee83781..0000000
--- a/lib/bound_set/bound_set.h
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_BOUND_SET_BOUND_SET_H_
-#define PERIDOT_LIB_BOUND_SET_BOUND_SET_H_
-
-#include <vector>
-
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_ptr.h>
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-// "Specialization" (overload) covering unique_ptr.
-template <typename T>
-T* GetFidlType(std::unique_ptr<T>* p) {
-  return p->get();
-}
-
-// General implementation intended to cover Binding and StrongBinding.
-template <typename FidlType, typename UniqueType = FidlType*>
-UniqueType Identify(FidlType* binding) {
-  return binding;
-}
-
-// An extensible/derivable InterfacePtrSet/(Strong)BindingSet that contains a
-// collection of objects of type T that contain FidlTypes (e.g. InterfacePtr,
-// Binding, or StrongBinding). Elements are automatically removed from the
-// collection and destroyed when their associated Channel experiences a
-// connection error. When the set is destroyed all of the Channels will be
-// closed.
-//
-// Unlike the Fidl library InterfacePtrSet and (Strong)BindingSet, this class
-// does not prevent further mutations to the underlying Fidl type. For well-
-// defined behavior, the Fidl types should not be modified after being added to
-// the set.
-//
-// Template parameters:
-// * FidlType - the Fidl type governing each element of the collection, e.g.
-//  InterfacePtr, Binding, or StrongBinding
-// * T - the element type of the collection
-// * GetFidlType - a function that extracts the FidlType from an element of the
-//  collection. Defaults to the identity function, which only works if T =
-//  FidlType.
-// * UniqueType - a type that uniquely identifies a FidlType in the collection.
-//  For InterfacePtrs, this is a pointer to the interface. For bindings, this is
-//  the pointer to the binding.
-// * Identify - a function that derives a UniqueType from a FidlType. Defaults
-//  behave as described at UniqueType.
-template <typename FidlType, typename T = FidlType,
-          FidlType* GetFidlType(T*) = GetFidlType, typename UniqueType = void*,
-          UniqueType Identify(FidlType*) = Identify>
-class BoundSet {
- public:
-  typedef typename std::vector<T>::iterator iterator;
-  BoundSet() {}
-  virtual ~BoundSet() {}
-
-  // |ptr| must be bound to a channel.
-  template <typename... _Args>
-  T* emplace(_Args&&... __args) {
-    elements_.emplace_back(std::forward<_Args>(__args)...);
-    T* const c = &elements_.back();
-    FidlType* const m = GetFidlType(c);
-    FXL_CHECK(m->is_bound());
-    UniqueType const id = Identify(m);
-    // Set the connection error handler for the newly added item to be a
-    // function that will erase it from the vector.
-    m->set_error_handler(
-        [this, id](zx_status_t status) { OnConnectionError(id); });
-    return c;
-  }
-
-  UniqueType GetId(T* object) { return Identify(GetFidlType(object)); }
-
-  // Removes the element at the given iterator. This effectively closes the pipe
-  // there if open, but it does not call OnConnectionError.
-  iterator erase(iterator it) { return elements_.erase(it); }
-  iterator erase(UniqueType id) {
-    auto it = Find(id);
-    FXL_CHECK(it != elements_.end());
-    return elements_.erase(it);
-  }
-
-  // Closes the Channel associated with each of the items in this set and
-  // clears the set. This does not call OnConnectionError for every interface in
-  // the set.
-  void clear() { elements_.clear(); }
-  bool empty() const { return elements_.empty(); }
-  size_t size() const { return elements_.size(); }
-
-  iterator begin() { return elements_.begin(); }
-  iterator end() { return elements_.end(); }
-
- protected:
-  virtual void OnConnectionError(UniqueType id) { erase(id); }
-
- private:
-  iterator Find(UniqueType id) {
-    return std::find_if(elements_.begin(), elements_.end(), [this, id](T& e) {
-      return Identify(GetFidlType(&e)) == id;
-    });
-  }
-
-  std::vector<T> elements_;
-};
-
-// Convenience alias of BoundSet to handle non-movable FIDL types, like Bindings
-// (and the mythical StrongBinding).
-//
-// Note that the default T here must be a unique_ptr rather than the FIDL type
-// itself since these FIDL types are not movable.
-template <typename FidlType, typename T = std::unique_ptr<FidlType>,
-          FidlType* GetFidlType(T*) = GetFidlType>
-using BoundNonMovableSet = BoundSet<FidlType, T, GetFidlType, FidlType*>;
-
-template <typename Interface,
-          typename T = std::unique_ptr<fidl::InterfacePtr<Interface>>,
-          fidl::InterfacePtr<Interface>* GetFidlType(T*) = GetFidlType>
-using BoundPtrSet =
-    BoundNonMovableSet<fidl::InterfacePtr<Interface>, T, GetFidlType>;
-
-// Convenience alias of BoundSet to handle Binding containers.
-template <typename Interface,
-          typename T = std::unique_ptr<fidl::Binding<Interface>>,
-          fidl::Binding<Interface>* GetFidlType(T*) = GetFidlType>
-using BindingSet = BoundNonMovableSet<fidl::Binding<Interface>, T, GetFidlType>;
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_BOUND_SET_BOUND_SET_H_
diff --git a/lib/commit_pack/BUILD.gn b/lib/commit_pack/BUILD.gn
deleted file mode 100644
index 2c785e6..0000000
--- a/lib/commit_pack/BUILD.gn
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/flatbuffers/flatbuffer.gni")
-
-flatbuffer("commit_pack_flatbuffer") {
-  sources = [
-    "//peridot/public/fidl/fuchsia.ledger.cloud/serialized_commits.fbs",
-  ]
-}
-
-source_set("commit_pack") {
-  sources = [
-    "commit_pack.cc",
-    "commit_pack.h",
-  ]
-
-  deps = [
-    ":commit_pack_flatbuffer",
-    "//peridot/lib/convert",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.ledger.cloud",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "commit_pack_unittest.cc",
-  ]
-
-  deps = [
-    ":commit_pack",
-    "//third_party/googletest:gtest",
-  ]
-}
diff --git a/lib/commit_pack/commit_pack.cc b/lib/commit_pack/commit_pack.cc
deleted file mode 100644
index 1b00de5..0000000
--- a/lib/commit_pack/commit_pack.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/commit_pack/commit_pack.h"
-
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/lib/convert/convert.h"
-#include "peridot/public/fidl/fuchsia.ledger.cloud/serialized_commits_generated.h"
-
-namespace cloud_provider {
-
-bool operator==(const CommitPackEntry& lhs, const CommitPackEntry& rhs) {
-  return lhs.id == rhs.id && lhs.data == rhs.data;
-}
-
-bool EncodeCommitPack(std::vector<CommitPackEntry> commits,
-                      CommitPack* commit_pack) {
-  FXL_DCHECK(commit_pack);
-  flatbuffers::FlatBufferBuilder builder;
-
-  auto entries_offsets = builder.CreateVector(
-      commits.size(),
-      static_cast<std::function<flatbuffers::Offset<SerializedCommit>(size_t)>>(
-          [&builder, &commits](size_t i) {
-            const auto& entry = commits[i];
-            return CreateSerializedCommit(
-                builder, convert::ToFlatBufferVector(&builder, entry.id),
-                convert::ToFlatBufferVector(&builder, entry.data));
-          }));
-
-  builder.Finish(CreateSerializedCommits(builder, entries_offsets));
-  return fsl::VmoFromString(convert::ToStringView(builder),
-                            &commit_pack->buffer);
-}
-
-bool DecodeCommitPack(const CommitPack& commit_pack,
-                      std::vector<CommitPackEntry>* commits) {
-  FXL_DCHECK(commits);
-  std::string data;
-  if (!fsl::StringFromVmo(commit_pack.buffer, &data)) {
-    return false;
-  }
-
-  flatbuffers::Verifier verifier(
-      reinterpret_cast<const unsigned char*>(data.data()), data.size());
-  if (!VerifySerializedCommitsBuffer(verifier)) {
-    return false;
-  }
-
-  const SerializedCommits* serialized_commits =
-      GetSerializedCommits(reinterpret_cast<const unsigned char*>(data.data()));
-
-  std::vector<CommitPackEntry> result;
-  result.reserve(serialized_commits->commits()->size());
-
-  for (const auto* serialized_commit : *(serialized_commits->commits())) {
-    result.push_back({convert::ToString(serialized_commit->id()),
-                      convert::ToString(serialized_commit->data())});
-  }
-
-  commits->swap(result);
-  return true;
-}
-
-}  // namespace cloud_provider
diff --git a/lib/commit_pack/commit_pack.h b/lib/commit_pack/commit_pack.h
deleted file mode 100644
index f303fc1..0000000
--- a/lib/commit_pack/commit_pack.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_COMMIT_PACK_COMMIT_PACK_H_
-#define PERIDOT_LIB_COMMIT_PACK_COMMIT_PACK_H_
-
-#include <string>
-#include <vector>
-
-#include <fuchsia/ledger/cloud/cpp/fidl.h>
-
-namespace cloud_provider {
-
-using CommitPack = fuchsia::ledger::cloud::CommitPack;
-
-// Represents a single commit to be encoded in the commit pack.
-struct CommitPackEntry {
-  std::string id;
-  std::string data;
-};
-
-bool operator==(const CommitPackEntry& lhs, const CommitPackEntry& rhs);
-
-bool EncodeCommitPack(std::vector<CommitPackEntry> commits,
-                      CommitPack* commit_pack);
-
-bool DecodeCommitPack(const CommitPack& commit_pack,
-                      std::vector<CommitPackEntry>* commits);
-
-}  // namespace cloud_provider
-
-#endif  // PERIDOT_LIB_COMMIT_PACK_COMMIT_PACK_H_
diff --git a/lib/commit_pack/commit_pack_unittest.cc b/lib/commit_pack/commit_pack_unittest.cc
deleted file mode 100644
index 4d76edb..0000000
--- a/lib/commit_pack/commit_pack_unittest.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/commit_pack/commit_pack.h"
-
-#include <gtest/gtest.h>
-
-namespace cloud_provider {
-namespace {
-
-using CommitPackTest = ::testing::TestWithParam<std::vector<CommitPackEntry>>;
-
-TEST_P(CommitPackTest, BackAndForth) {
-  const std::vector<CommitPackEntry> commits = GetParam();
-  CommitPack commit_pack;
-  ASSERT_TRUE(EncodeCommitPack(commits, &commit_pack));
-  std::vector<CommitPackEntry> result;
-  ASSERT_TRUE(DecodeCommitPack(commit_pack, &result));
-  EXPECT_EQ(commits, result);
-}
-
-INSTANTIATE_TEST_CASE_P(CommitPackTest, CommitPackTest,
-                        ::testing::Values(std::vector<CommitPackEntry>(),
-                                          std::vector<CommitPackEntry>{
-                                              {"id_0", "data_0"},
-                                              {"id_1", "data_1"}}));
-
-}  // namespace
-}  // namespace cloud_provider
diff --git a/lib/common/BUILD.gn b/lib/common/BUILD.gn
deleted file mode 100644
index 7244fc4..0000000
--- a/lib/common/BUILD.gn
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("common") {
-  deps = [
-    ":async_holder",
-    ":names",
-    ":story_provider_watcher_base",
-    ":teardown",
-  ]
-}
-
-source_set("async_holder") {
-  sources = [
-    "async_holder.cc",
-    "async_holder.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-source_set("names") {
-  sources = [
-    "names.h",
-  ]
-}
-
-source_set("story_provider_watcher_base") {
-  sources = [
-    "story_provider_watcher_base.cc",
-    "story_provider_watcher_base.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("teardown") {
-  sources = [
-    "teardown.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-source_set("xdr") {
-  sources = [
-    "xdr.cc",
-    "xdr.h",
-  ]
-
-  public_deps = [
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-  ]
-}
diff --git a/lib/common/MAINTAINERS b/lib/common/MAINTAINERS
deleted file mode 100644
index 91100a6..0000000
--- a/lib/common/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-mesch@google.com
diff --git a/lib/common/async_holder.cc b/lib/common/async_holder.cc
deleted file mode 100644
index 68e88dc..0000000
--- a/lib/common/async_holder.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/common/async_holder.h"
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-AsyncHolderBase::AsyncHolderBase(std::string name)
-    : name_(std::move(name)), down_(std::make_shared<bool>(false)) {}
-
-AsyncHolderBase::~AsyncHolderBase() {
-  if (!*down_) {
-    // This is not a warning because it happens because of an outer timeout, for
-    // which there already is a warning issued.
-    FXL_DLOG(INFO) << "Delete without teardown: " << name_;
-  }
-  *down_ = true;
-}
-
-void AsyncHolderBase::Teardown(zx::duration timeout,
-                               std::function<void()> done) {
-  auto cont = [this, down = down_,
-               done = std::move(done)](const bool from_timeout) {
-    if (*down) {
-      return;
-    }
-
-    *down = true;
-
-    if (from_timeout) {
-      FXL_LOG(WARNING) << "Teardown() timed out for " << name_;
-    }
-
-    ImplReset();
-
-    done();
-  };
-
-  auto cont_timeout = [cont] { cont(true); };
-
-  auto cont_normal = [cont] { cont(false); };
-
-  async::PostDelayedTask(async_get_default_dispatcher(), cont_timeout, timeout);
-  ImplTeardown(cont_normal);
-}
-
-}  // namespace modular
diff --git a/lib/common/async_holder.h b/lib/common/async_holder.h
deleted file mode 100644
index ef4e0f3..0000000
--- a/lib/common/async_holder.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_COMMON_ASYNC_HOLDER_H_
-#define PERIDOT_LIB_COMMON_ASYNC_HOLDER_H_
-
-#include <functional>
-#include <memory>
-#include <string>
-
-#include <lib/fxl/macros.h>
-#include <lib/zx/time.h>
-
-namespace modular {
-
-// A smart pointer that holds on to an implementation class and is able to
-// invoke Teardown() on the implementation with a timeout.
-//
-// TODO(mesch): The name is a bit of a mouthful. It's very similar to AppClient
-// and should align with that, but it owns impl and isn't a client of it.
-class AsyncHolderBase {
- public:
-  AsyncHolderBase(std::string name);
-  virtual ~AsyncHolderBase();
-
-  // Timeout is the first argument because: (1) the second argument can be very
-  // long, and it's incongruent to have the timeout dangling after it, (2) the
-  // timeout happens first, the done callback after that, so this ordering is
-  // actually quite natural.
-  void Teardown(zx::duration timeout, std::function<void()> done);
-
- private:
-  // Called by Teardown(). A timeout callback is scheduled simultaneously.
-  // Eventually ImplReset() is called, either when done() is invoked, or when
-  // the timeout elapses.
-  virtual void ImplTeardown(std::function<void()> done) = 0;
-
-  // Called after either the done callback of ImplTeardown() is invoked, or the
-  // timeout elapses. The timeout is the reason ImplReset() is separate from
-  // ImplTeardown().
-  virtual void ImplReset() = 0;
-
-  // For log messages only.
-  const std::string name_;
-
-  // This is the flag shared with the done and timeout callbacks of Teardown()
-  // that prevents double invocation. The destructor sets it to true to prevent
-  // pending callbacks from executing if the instance is deleted while a
-  // teardown is pending. This may happen when the Teardown() of the instance
-  // this holder is a member of runs into a timeout on its own.
-  std::shared_ptr<bool> down_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AsyncHolderBase);
-};
-
-template <class Impl>
-class AsyncHolder : public AsyncHolderBase {
- public:
-  AsyncHolder(const char* const name) : AsyncHolderBase(name) {}
-  ~AsyncHolder() override = default;
-
-  void reset(Impl* const impl) { impl_.reset(impl); }
-
-  // Must not be used to invoke Impl::Teardown().
-  Impl* operator->() {
-    FXL_DCHECK(impl_.get());
-    return impl_.get();
-  }
-
-  // Must not be used to invoke Impl::Teardown().
-  Impl* get() { return impl_.get(); }
-
- private:
-  void ImplTeardown(std::function<void()> done) override {
-    FXL_DCHECK(impl_.get());
-    impl_->Teardown(done);
-  }
-
-  void ImplReset() override { impl_.reset(); }
-
-  std::unique_ptr<Impl> impl_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(AsyncHolder);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_COMMON_ASYNC_HOLDER_H_
diff --git a/lib/common/names.h b/lib/common/names.h
deleted file mode 100644
index 9c9fd22..0000000
--- a/lib/common/names.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_COMMON_NAMES_H_
-#define PERIDOT_LIB_COMMON_NAMES_H_
-
-namespace modular {
-
-// A framework-assigned name for the first module of a story (aka root mod)
-// created when using StoryProvider.CreateStory() or
-// StoryProvider.CreateStoryWithInfo() with a non-null |module_url| parameter.
-constexpr char kRootModuleName[] = "root";
-
-// The service name of the Presentation service that is routed between
-// BaseShell and SessionShell. The same service exchange between SessionShell
-// and StoryShell uses the SessionShellPresentationProvider service, which is
-// discoverable.
-// TODO(SCN-595): mozart.Presentation is being renamed to ui.Presenter.
-constexpr char kPresentationService[] = "mozart.Presentation";
-
-// TODO(MF-134): This key is duplicated in
-// topaz/lib/settings/lib/device_info.dart. Remove this key once factory reset
-// is provided to topaz as a service.
-// The key for factory reset toggles.
-constexpr char kFactoryResetKey[] = "FactoryReset";
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_COMMON_NAMES_H_
diff --git a/lib/common/story_provider_watcher_base.cc b/lib/common/story_provider_watcher_base.cc
deleted file mode 100644
index 529192a..0000000
--- a/lib/common/story_provider_watcher_base.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "story_provider_watcher_base.h"
-
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/string.h>
-
-namespace modular {
-
-StoryProviderWatcherBase::StoryProviderWatcherBase()
-    : continue_([] {}), binding_(this) {}
-
-StoryProviderWatcherBase::~StoryProviderWatcherBase() = default;
-
-void StoryProviderWatcherBase::Continue(std::function<void()> at) {
-  continue_ = std::move(at);
-}
-
-void StoryProviderWatcherBase::Watch(
-    fuchsia::modular::StoryProvider* const story_provider) {
-  story_provider->Watch(binding_.NewBinding());
-}
-
-void StoryProviderWatcherBase::Reset() { binding_.Unbind(); }
-
-void StoryProviderWatcherBase::OnDelete(::std::string /*story_id*/) {}
-
-void StoryProviderWatcherBase::OnChange(
-    fuchsia::modular::StoryInfo /*story_info*/,
-    fuchsia::modular::StoryState /*story_state*/,
-    fuchsia::modular::StoryVisibilityState /*story_visibility_state*/) {
-  continue_();
-}
-
-}  // namespace modular
diff --git a/lib/common/story_provider_watcher_base.h b/lib/common/story_provider_watcher_base.h
deleted file mode 100644
index e1edbbb..0000000
--- a/lib/common/story_provider_watcher_base.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_COMMON_STORY_PROVIDER_WATCHER_BASE_H_
-#define PERIDOT_LIB_COMMON_STORY_PROVIDER_WATCHER_BASE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-// A simple story provider watcher implementation that calls the Continue()
-// callback whenever OnChange() is received. This default implementation ignores
-// OnDelete(), but you can override this class to handle OnDelete().
-class StoryProviderWatcherBase : fuchsia::modular::StoryProviderWatcher {
- public:
-  StoryProviderWatcherBase();
-  ~StoryProviderWatcherBase() override;
-
-  // Sets the callback that will be called whenever OnChange is received.
-  // Derived classes can change this behavior by overriding OnChange() and
-  // making the callback based on the desired criteria.
-  void Continue(std::function<void()> at);
-
-  // Registers itself a watcher on the given story provider. Only one story
-  // provider can be watched at a time.
-  void Watch(fuchsia::modular::StoryProvider* story_provider);
-
-  // Deregisters itself from the watched story provider.
-  void Reset();
-
- protected:
-  std::function<void()> continue_;
-
- private:
-  // |fuchsia::modular::StoryProviderWatcher|
-  void OnDelete(::std::string story_id) override;
-
-  // |fuchsia::modular::StoryProviderWatcher|
-  void OnChange(
-      fuchsia::modular::StoryInfo story_info,
-      fuchsia::modular::StoryState story_state,
-      fuchsia::modular::StoryVisibilityState story_visibility_state) override;
-
-  fidl::Binding<fuchsia::modular::StoryProviderWatcher> binding_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryProviderWatcherBase);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_COMMON_STORY_PROVIDER_WATCHER_BASE_H_
diff --git a/lib/common/teardown.h b/lib/common/teardown.h
deleted file mode 100644
index 8d0b93d..0000000
--- a/lib/common/teardown.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_COMMON_TEARDOWN_H_
-#define PERIDOT_LIB_COMMON_TEARDOWN_H_
-
-#include <lib/zx/time.h>
-
-namespace modular {
-
-// Standard timeout for dispatcher teardown.
-constexpr auto kBasicTimeout = zx::sec(1);
-
-// Timeouts for teardown of composite objects need to be larger than the basic
-// timeout, because they run through the teardown of their parts, at least
-// partially sequentially.
-//
-// TODO(mesch): Obviously, this should adjust, be negotiated, or be set
-// automatically as needed rather than hardcoded.
-
-// fuchsia::modular::Agent + overhead.
-constexpr auto kAgentRunnerTimeout = kBasicTimeout * 2;
-
-// Stories + overhead.
-constexpr auto kStoryProviderTimeout = kBasicTimeout * 2;
-
-// Multiple parts as described.
-constexpr auto kSessionmgrTimeout =
-    kBasicTimeout * 3 + kAgentRunnerTimeout + kStoryProviderTimeout;
-
-constexpr auto kUserProviderTimeout = kBasicTimeout + kSessionmgrTimeout;
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_COMMON_TEARDOWN_H_
diff --git a/lib/common/xdr.cc b/lib/common/xdr.cc
deleted file mode 100644
index 99f5dfc..0000000
--- a/lib/common/xdr.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/common/xdr.h"
-
-#include <fuchsia/modular/auth/cpp/fidl.h>
-
-namespace modular {
-
-void XdrAccount_v1(XdrContext* const xdr,
-                   fuchsia::modular::auth::Account* const data) {
-  xdr->Field("id", &data->id);
-  xdr->Field("identity_provider", &data->identity_provider);
-  xdr->Field("display_name", &data->display_name);
-  xdr->Field("profile_url", &data->url);
-  xdr->Field("image_url", &data->image_url);
-}
-
-void XdrAccount_v2(XdrContext* const xdr,
-                   fuchsia::modular::auth::Account* const data) {
-  if (!xdr->Version(2)) {
-    return;
-  }
-  xdr->Field("id", &data->id);
-  xdr->Field("identity_provider", &data->identity_provider);
-  xdr->Field("display_name", &data->display_name);
-  xdr->Field("profile_url", &data->url);
-  xdr->Field("image_url", &data->image_url);
-}
-
-extern const XdrFilterType<fuchsia::modular::auth::Account> XdrAccount[] = {
-    XdrAccount_v2,
-    XdrAccount_v1,
-    nullptr,
-};
-
-}  // namespace modular
diff --git a/lib/common/xdr.h b/lib/common/xdr.h
deleted file mode 100644
index 51792a1..0000000
--- a/lib/common/xdr.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_COMMON_XDR_H_
-#define PERIDOT_LIB_COMMON_XDR_H_
-
-#include "peridot/lib/fidl/json_xdr.h"
-
-namespace fuchsia {
-namespace modular {
-namespace auth {
-class Account;
-}  // namespace auth
-}  // namespace modular
-}  // namespace fuchsia
-
-namespace modular {
-
-extern const XdrFilterType<fuchsia::modular::auth::Account> XdrAccount[];
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_COMMON_XDR_H_
diff --git a/lib/convert/BUILD.gn b/lib/convert/BUILD.gn
deleted file mode 100644
index 734c647..0000000
--- a/lib/convert/BUILD.gn
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/flatbuffers/flatbuffer.gni")
-
-visibility = [
-  "//peridot/bin/*",
-  "//peridot/lib/*",
-]
-
-source_set("convert") {
-  sources = [
-    "convert.cc",
-    "convert.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//third_party/flatbuffers",
-    "//third_party/leveldb",
-    "//third_party/rapidjson",
-    "//zircon/public/lib/zx",
-  ]
-}
-
-flatbuffer("byte_storage_test") {
-  testonly = true
-
-  sources = [
-    "bytes_test.fbs",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "collection_view_unittest.cc",
-    "convert_unittest.cc",
-  ]
-
-  deps = [
-    ":byte_storage_test",
-    ":convert",
-    "//third_party/googletest:gtest",
-  ]
-}
diff --git a/lib/convert/bytes_test.fbs b/lib/convert/bytes_test.fbs
deleted file mode 100644
index 96085e9..0000000
--- a/lib/convert/bytes_test.fbs
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-namespace convert;
-
-table BytesTest {
-  bytes: [ubyte];
-}
-
-root_type BytesTest;
diff --git a/lib/convert/collection_view.h b/lib/convert/collection_view.h
deleted file mode 100644
index b7a2616..0000000
--- a/lib/convert/collection_view.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_CONVERT_COLLECTION_VIEW_H_
-#define PERIDOT_LIB_CONVERT_COLLECTION_VIEW_H_
-
-#include <algorithm>
-#include <iterator>
-
-#include <lib/fxl/logging.h>
-
-namespace convert {
-
-// View over the given collection. Doesn't take ownership of the collection that
-// must outlives this class.
-//
-// Single-argument constructor is marked as NOLINT to suppress
-// `google-explicit-constructor` clang-tidy warning - in this case the implicit
-// conversion is intended.
-template <typename T>
-class CollectionView {
- public:
-  using iterator = typename T::iterator;
-  using const_iterator = typename T::const_iterator;
-
-  CollectionView(T& collection)  // NOLINT
-      : collection_(collection),
-        begin_(std::begin(collection)),
-        end_(std::end(collection)) {}
-  CollectionView(T& collection, iterator begin, iterator end)
-      : collection_(collection),
-        begin_(std::move(begin)),
-        end_(std::move(end)) {}
-  CollectionView(const CollectionView& collection) = default;
-  CollectionView& operator=(const CollectionView& collection) = default;
-
-  const_iterator begin() const { return begin_; }
-  const_iterator end() const { return end_; }
-  iterator begin() { return begin_; }
-  iterator end() { return end_; }
-
-  // Returns a view over this view with the first element removed.
-  CollectionView Tail() const {
-    if (begin_ == end_) {
-      return CollectionView<T>(collection_, end_, end_);
-    }
-    return CollectionView(collection_, std::next(begin_), end_);
-  }
-
-  // Returns a sub view of this view.
-  CollectionView SubCollection(size_t begin, size_t length) const {
-    if (begin >= size()) {
-      return CollectionView<T>(collection_, end_, end_);
-    }
-    auto begin_it = std::next(begin_, begin);
-    size_t final_length =
-        std::min(length, static_cast<size_t>(std::distance(begin_it, end_)));
-    return CollectionView(collection_, begin_it,
-                          std::next(begin_it, final_length));
-  }
-
-  const auto& operator[](size_t pos) const {
-    FXL_DCHECK(pos < size());
-    return *std::next(begin_, pos);
-  }
-
-  auto& operator[](size_t pos) {
-    FXL_DCHECK(pos < static_cast<size_t>(std::distance(begin_, end_)));
-    return *std::next(begin_, pos);
-  }
-
-  bool empty() const { return begin_ == end_; }
-
-  size_t size() const { return std::distance(begin_, end_); }
-
- private:
-  T& collection_;
-  iterator begin_;
-  iterator end_;
-};
-
-}  // namespace convert
-
-#endif  // PERIDOT_LIB_CONVERT_COLLECTION_VIEW_H_
diff --git a/lib/convert/collection_view_unittest.cc b/lib/convert/collection_view_unittest.cc
deleted file mode 100644
index 9b7cd31..0000000
--- a/lib/convert/collection_view_unittest.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/convert/collection_view.h"
-
-#include <iterator>
-#include <set>
-#include <unordered_set>
-#include <vector>
-
-#include "gtest/gtest.h"
-
-// Add helper to print our types.
-namespace testing {
-namespace internal {
-template <>
-std::string GetTypeName<std::vector<uint32_t>>() {
-  return "std::vector<uint32_t>";
-}
-template <>
-std::string GetTypeName<std::unordered_set<uint32_t>>() {
-  return "std::unordered_set<uint32_t>";
-}
-template <>
-std::string GetTypeName<std::set<uint32_t>>() {
-  return "std::set<uint32_t>";
-}
-}  // namespace internal
-}  // namespace testing
-
-namespace convert {
-namespace {
-
-template <typename T>
-::testing::AssertionResult Equals(const T& collection, size_t begin,
-                                  size_t length, CollectionView<T> view) {
-  auto it1 = std::next(collection.begin(), begin);
-  auto it2 = view.begin();
-  for (size_t i = 0; i < length; ++i) {
-    if (it1 == collection.end()) {
-      return ::testing::AssertionFailure() << "collection is not large enough.";
-    }
-    if (it2 == view.end()) {
-      return ::testing::AssertionFailure() << "view is not large enough.";
-    }
-  }
-  if (*it1 != *it2) {
-    return ::testing::AssertionFailure() << "view is incorrect.";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-template <typename T>
-using CollectionViewTest = ::testing::Test;
-
-using CollectionTypes =
-    ::testing::Types<std::vector<uint32_t>, std::unordered_set<uint32_t>,
-                     std::set<uint32_t>>;
-
-TYPED_TEST_CASE(CollectionViewTest, CollectionTypes);
-
-TYPED_TEST(CollectionViewTest, Views) {
-  TypeParam values = {0, 1, 2, 3, 4, 5};
-  CollectionView<TypeParam> view = values;
-
-  EXPECT_TRUE(Equals(values, 0, values.size(), view));
-  EXPECT_TRUE(Equals(values, 1, values.size(), view.Tail()));
-  EXPECT_TRUE(Equals(values, 1, values.size() - 2,
-                     view.SubCollection(1, values.size() - 2)));
-  EXPECT_EQ(*std::next(values.begin()), view.Tail()[0]);
-}
-
-}  // namespace
-}  // namespace convert
diff --git a/lib/convert/convert.cc b/lib/convert/convert.cc
deleted file mode 100644
index 9d97a49..0000000
--- a/lib/convert/convert.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/convert/convert.h"
-
-#include <string.h>
-
-#include <leveldb/slice.h>
-
-namespace convert {
-
-namespace {
-const char kHexDigits[] = "0123456789ABCDEF";
-}
-
-std::vector<uint8_t> ExtendedStringView::ToArray() {
-  std::vector<uint8_t> result(size());
-  memcpy(result.data(), data(), size());
-  return result;
-}
-
-flatbuffers::Offset<flatbuffers::Vector<uint8_t>>
-ExtendedStringView::ToFlatBufferVector(
-    flatbuffers::FlatBufferBuilder* builder) {
-  return builder->CreateVector(reinterpret_cast<const unsigned char*>(data()),
-                               size());
-}
-
-std::string ExtendedStringView::ToHex() {
-  std::string result;
-  result.reserve(size() * 2);
-  for (unsigned char c : *this) {
-    result.push_back(kHexDigits[c >> 4]);
-    result.push_back(kHexDigits[c & 0xf]);
-  }
-  return result;
-}
-
-std::vector<uint8_t> ToArray(ExtendedStringView value) {
-  return value.ToArray();
-}
-
-std::string ToString(ExtendedStringView value) { return value.ToString(); }
-
-flatbuffers::Offset<flatbuffers::Vector<uint8_t>> ToFlatBufferVector(
-    flatbuffers::FlatBufferBuilder* builder, ExtendedStringView value) {
-  return value.ToFlatBufferVector(builder);
-}
-
-std::string ToHex(ExtendedStringView value) { return value.ToHex(); }
-
-}  // namespace convert
diff --git a/lib/convert/convert.h b/lib/convert/convert.h
deleted file mode 100644
index 946528d..0000000
--- a/lib/convert/convert.h
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_CONVERT_CONVERT_H_
-#define PERIDOT_LIB_CONVERT_CONVERT_H_
-
-#include <string>
-
-#include <flatbuffers/flatbuffers.h>
-#include <leveldb/db.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fidl/cpp/vector.h>
-#include <lib/fxl/strings/string_view.h>
-#include <rapidjson/document.h>
-
-namespace convert {
-
-// Provides conversions between fidl::VectorPtr, leveldb::Slice and std::string
-// representations of a data object.
-//
-// This class doesn't take ownership of the data used to construct it. The data
-// must outlive it. It is used to allow transparent handling of FIDL arrays,
-// leveldb slices and strings.
-//
-// Single-argument constructors and conversion operators are marked as NOLINT to
-// suppress `google-explicit-constructor` clang-tidy warning - in this case the
-// implicit conversion is intended.
-class ExtendedStringView : public fxl::StringView {
- public:
-  ExtendedStringView(const std::vector<uint8_t>& array)  // NOLINT
-      : fxl::StringView(reinterpret_cast<const char*>(array.data()),
-                        array.size()) {}
-  ExtendedStringView(const fidl::VectorPtr<uint8_t>& array)  // NOLINT
-      : fxl::StringView(reinterpret_cast<const char*>(array->data()),
-                        array->size()) {}
-  template <size_t N>
-  constexpr ExtendedStringView(const fidl::Array<uint8_t, N>& array)  // NOLINT
-      : fxl::StringView(reinterpret_cast<const char*>(array.data()), N) {}
-  ExtendedStringView(const leveldb::Slice& slice)  // NOLINT
-      : fxl::StringView(slice.data(), slice.size()) {}
-  ExtendedStringView(const std::string& string)  // NOLINT
-      : fxl::StringView(string) {}
-  constexpr ExtendedStringView(fxl::StringView string_view)  // NOLINT
-      : fxl::StringView(string_view) {}
-  ExtendedStringView(const rapidjson::Value& value)  // NOLINT
-      : fxl::StringView(value.GetString(), value.GetStringLength()) {
-    FXL_DCHECK(value.IsString());
-  }
-  template <size_t N>
-  constexpr ExtendedStringView(const char (&str)[N])  // NOLINT
-      : fxl::StringView(str) {}
-  ExtendedStringView(  // NOLINT
-      const flatbuffers::Vector<uint8_t>* byte_storage)
-      : fxl::StringView(reinterpret_cast<const char*>(byte_storage->data()),
-                        byte_storage->size()) {}
-  ExtendedStringView(  // NOLINT
-      const flatbuffers::FlatBufferBuilder& buffer_builder)
-      : fxl::StringView(
-            reinterpret_cast<char*>(buffer_builder.GetBufferPointer()),
-            buffer_builder.GetSize()) {}
-
-  operator leveldb::Slice() const {  // NOLINT
-    return leveldb::Slice(data(), size());
-  }
-
-  std::vector<uint8_t> ToArray();
-
-  flatbuffers::Offset<flatbuffers::Vector<uint8_t>> ToFlatBufferVector(
-      flatbuffers::FlatBufferBuilder* builder);
-
-  std::string ToHex();
-};
-
-// Returns the ExtendedStringView representation of the given value.
-inline ExtendedStringView ToStringView(ExtendedStringView value) {
-  return value;
-}
-
-// Returns the representation of the given value in LevelDB.
-inline leveldb::Slice ToSlice(ExtendedStringView value) { return value; }
-
-// Returns the std::vector representation of the given value.
-std::vector<uint8_t> ToArray(ExtendedStringView value);
-
-// Returns the fidl::Array representation of the given value.
-template <size_t N>
-void ToArray(ExtendedStringView value, fidl::Array<uint8_t, N>* out) {
-  ZX_ASSERT(value.size() == N);
-  memcpy(out->mutable_data(), value.data(), N);
-}
-
-// Returns the std::string representation of the given value.
-std::string ToString(ExtendedStringView value);
-
-// Returns the hexadecimal representation of the given value.
-std::string ToHex(ExtendedStringView value);
-
-// Store the given value as a FlatBufferVector in the given builder.
-flatbuffers::Offset<flatbuffers::Vector<uint8_t>> ToFlatBufferVector(
-    flatbuffers::FlatBufferBuilder* builder, ExtendedStringView value);
-
-// Comparator that allows heterogeneous lookup by StringView and
-// std::string in a container with the key type of std::string.
-struct StringViewComparator {
-  using is_transparent = std::true_type;
-  bool operator()(const std::string& lhs, const std::string& rhs) const {
-    return lhs < rhs;
-  }
-  bool operator()(ExtendedStringView lhs, const std::string& rhs) const {
-    return lhs < fxl::StringView(rhs);
-  }
-  bool operator()(const std::string& lhs, ExtendedStringView rhs) const {
-    return fxl::StringView(lhs) < rhs;
-  }
-};
-
-}  // namespace convert
-
-#endif  // PERIDOT_LIB_CONVERT_CONVERT_H_
diff --git a/lib/convert/convert_unittest.cc b/lib/convert/convert_unittest.cc
deleted file mode 100644
index d0e8fa0..0000000
--- a/lib/convert/convert_unittest.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/convert/convert.h"
-
-#include "gtest/gtest.h"
-#include "peridot/lib/convert/bytes_test_generated.h"
-
-namespace convert {
-namespace {
-
-std::vector<uint8_t> CreateArray(const char* data, size_t size) {
-  std::vector<uint8_t> result;
-  for (size_t i = 0; i < size; ++i) {
-    result.push_back(data[i]);
-  }
-  return result;
-}
-
-TEST(Convert, ToSlice) {
-  std::string str = "Hello";
-  leveldb::Slice slice = ToSlice(str);
-  EXPECT_EQ(str, std::string(slice.data(), slice.size()));
-
-  std::vector<uint8_t> array = CreateArray(str.data(), str.size());
-  slice = ToSlice(str);
-  EXPECT_EQ(str, std::string(slice.data(), slice.size()));
-}
-
-TEST(Convert, ToArray) {
-  std::string str = "Hello";
-  std::vector<uint8_t> array = ToArray(str);
-  EXPECT_EQ(str,
-            std::string(reinterpret_cast<char*>(array.data()), array.size()));
-
-  leveldb::Slice slice(str.data(), str.size());
-  array = ToArray(slice);
-  EXPECT_EQ(str,
-            std::string(reinterpret_cast<char*>(array.data()), array.size()));
-}
-
-TEST(Convert, ToString) {
-  std::string str = "Hello";
-  leveldb::Slice slice(str.data(), str.size());
-  std::string result = ToString(slice);
-  EXPECT_EQ(str, result);
-
-  std::vector<uint8_t> array = ToArray(str);
-  result = ToString(array);
-  EXPECT_EQ(str, result);
-}
-
-TEST(Convert, ToStringView) {
-  std::string str = "Hello";
-  leveldb::Slice slice(str.data(), str.size());
-  ExtendedStringView result = slice;
-  EXPECT_EQ(str, result.ToString());
-
-  std::vector<uint8_t> array = ToArray(str);
-  result = array;
-  EXPECT_EQ(str, result.ToString());
-}
-
-TEST(Convert, ToFlatBufferVector) {
-  flatbuffers::FlatBufferBuilder builder;
-
-  std::string str = "Hello";
-  ExtendedStringView str_view = str;
-
-  auto bytes = str_view.ToFlatBufferVector(&builder);
-  builder.Finish(CreateBytesTest(builder, bytes));
-
-  ExtendedStringView result =
-      GetBytesTest(builder.GetCurrentBufferPointer())->bytes();
-  EXPECT_EQ(str, result);
-}
-
-TEST(Convert, ImplicitConversion) {
-  std::string str = "Hello";
-  ExtendedStringView esv(str);
-
-  leveldb::Slice slice = esv;
-  EXPECT_EQ(str, ToString(slice));
-
-  // Suppress check warning that |string_view| is never modified so we could use
-  // |esv| instead.
-  fxl::StringView string_view = esv;  // NOLINT
-  EXPECT_EQ(str, ToString(string_view));
-}
-
-TEST(Convert, FromFlatBufferBuilder) {
-  flatbuffers::FlatBufferBuilder builder;
-  auto bytes = convert::ToFlatBufferVector(&builder, "test");
-  builder.Finish(CreateBytesTest(builder, bytes));
-
-  ExtendedStringView result(builder);
-  std::string buffer_bytes(reinterpret_cast<char*>(builder.GetBufferPointer()),
-                           builder.GetSize());
-
-  EXPECT_EQ(buffer_bytes, result);
-}
-
-}  // namespace
-}  // namespace convert
diff --git a/lib/device_info/BUILD.gn b/lib/device_info/BUILD.gn
deleted file mode 100644
index 6c54e2b..0000000
--- a/lib/device_info/BUILD.gn
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("device_info") {
-  sources = [
-    "device_info.cc",
-    "device_info.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/util:filesystem",
-  ]
-}
-
-source_set("device_profile") {
-  sources = [
-    "device_profile.cc",
-    "device_profile.h",
-  ]
-
-  public_deps = [
-    ":device_info",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/rapidjson",
-  ]
-}
diff --git a/lib/device_info/device_info.cc b/lib/device_info/device_info.cc
deleted file mode 100644
index ab44e30..0000000
--- a/lib/device_info/device_info.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/device_info/device_info.h"
-
-#include <limits.h>
-#include <unistd.h>
-
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/random/uuid.h>
-#include <lib/fxl/strings/string_printf.h>
-#include <lib/fxl/strings/trim.h>
-
-#include "peridot/lib/util/filesystem.h"
-
-namespace modular {
-
-constexpr char kDeviceInfoDirectory[] = "/data/device";
-constexpr char kDeviceIDFile[] = "/data/device/%s.syncid";
-constexpr char kDeviceNameFile[] = "/data/device/%s.devicename";
-constexpr char kSyncDeviceProfile[] = "/data/device/profile_config.json";
-
-std::string LoadDeviceProfile() {
-  std::string device_profile;
-
-  if (!files::IsDirectory(kDeviceInfoDirectory)) {
-    files::CreateDirectory(kDeviceInfoDirectory);
-  }
-
-  if (!files::ReadFileToString(kSyncDeviceProfile, &device_profile)) {
-    device_profile = "{}";
-  }
-
-  return device_profile;
-}
-
-// TODO(security): this is a temporary implementation. audit the revocability
-// of this ID for syncing.
-std::string LoadDeviceID(const std::string& user) {
-  std::string device_id;
-
-  if (!files::IsDirectory(kDeviceInfoDirectory)) {
-    files::CreateDirectory(kDeviceInfoDirectory);
-  }
-
-  std::string path = fxl::StringPrintf(kDeviceIDFile, user.c_str());
-
-  if (!files::ReadFileToString(path, &device_id)) {
-    // no existing device id. generate a UUID and store it to disk
-    device_id = fxl::GenerateUUID();
-    bool success = files::WriteFile(path, device_id.data(), device_id.length());
-    FXL_DCHECK(success);
-  }
-
-  FXL_LOG(INFO) << "device_info: syncing device id for user: " << user
-                << "   set to: " << device_id;
-
-  return device_id;
-}
-
-// TODO(zbowling): implement WriteDeviceName
-std::string LoadDeviceName(const std::string& user) {
-  std::string device_name;
-
-  if (!files::IsDirectory(kDeviceInfoDirectory)) {
-    files::CreateDirectory(kDeviceInfoDirectory);
-  }
-
-  std::string path = fxl::StringPrintf(kDeviceNameFile, user.c_str());
-
-  if (files::ReadFileToString(path, &device_name)) {
-    // Remove whitespace because vim and echo like adding a newline.
-    constexpr char ws[] = " \t\n\r";
-    device_name = fxl::TrimString(device_name, ws).ToString();
-  }
-
-  if (device_name.empty()) {
-    // gethostname() will return "fuchsia" if the network stack hasn't started.
-    // Generally by this point we should have used OAuth to auth. This code is
-    // designed to allow a friendly device name, or a fallback to the result
-    // of gethostname() if the user didn't change it. The friendly name is
-    // defined by users, so there appears to be no requirement for uniqueness.
-    char host_name_buffer[HOST_NAME_MAX + 1];
-    // Defense in depth.
-    host_name_buffer[HOST_NAME_MAX] = '\0';
-    int result = gethostname(host_name_buffer, sizeof(host_name_buffer));
-
-    if (result < 0) {
-      FXL_LOG(ERROR) << "unable to get hostname. errno " << errno;
-      device_name = "fuchsia";
-    } else {
-      device_name = host_name_buffer;
-    }
-
-    // Saving this value causes any changes in the return value of gethostname()
-    // to be ignored, but the cached copy helps with the aforementioned problem
-    // that the network stack may not have started.
-    // TODO(jimbe) Don't write the result of gethostname() to this file once
-    // NET-79 is fixed. (Maybe write an empty file so users can find it.)
-    bool success =
-        files::WriteFile(path, device_name.data(), device_name.length());
-    FXL_DCHECK(success);
-  }
-
-  return device_name;
-}
-
-}  // namespace modular
diff --git a/lib/device_info/device_info.h b/lib/device_info/device_info.h
deleted file mode 100644
index fde3c7a..0000000
--- a/lib/device_info/device_info.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_DEVICE_INFO_DEVICE_INFO_H_
-#define PERIDOT_LIB_DEVICE_INFO_DEVICE_INFO_H_
-
-#include <string>
-
-namespace modular {
-
-// Reads the contents of /data/device/profile_config.json and returns the
-// result. If the file cannot be read, returns empty JSON-encoded object, "{}".
-std::string LoadDeviceProfile();
-
-// Reads a device id, scoped to |user|, for this device. Generates and persists
-// one on the first call of LoadDeviceID() on this device for this |user|.
-//
-// Thread-hostile.
-std::string LoadDeviceID(const std::string& user);
-
-// A wrapper around gethostname() which a) translates an error into the string
-// "fuchsia" and b) caches the output to a file scoped by |user| for future
-// calls.
-//
-// Thread-hostile.
-std::string LoadDeviceName(const std::string& user);
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_DEVICE_INFO_DEVICE_INFO_H_
diff --git a/lib/device_info/device_profile.cc b/lib/device_info/device_profile.cc
deleted file mode 100644
index 27b14e0..0000000
--- a/lib/device_info/device_profile.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/device_info/device_profile.h>
-
-#include "peridot/lib/rapidjson/rapidjson.h"
-
-namespace modular {
-
-// TODO(zbowling): this is a hack. we need to later decide how we want to
-// identfiy a devices intent. For now just a flag to say the intends to act
-// "like" a remote display server
-constexpr char kPresentationServer[] = "remote_presentor";
-
-DeviceProfile::DeviceProfile() {}
-
-bool DeviceProfile::Parse(const std::string& jsonProfile) {
-  fuchsia::modular::JsonDoc document;
-  document.Parse(jsonProfile);
-  if (!document.IsObject()) {
-    return false;
-  }
-
-  if (document.HasMember(kPresentationServer) &&
-      document[kPresentationServer].IsBool()) {
-    presentation_server = document[kPresentationServer].GetBool();
-  }
-
-  return true;
-}
-
-bool DeviceProfile::ParseDefaultProfile() { return Parse(LoadDeviceProfile()); }
-
-}  // namespace modular
diff --git a/lib/device_info/device_profile.h b/lib/device_info/device_profile.h
deleted file mode 100644
index d998465..0000000
--- a/lib/device_info/device_profile.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_DEVICE_INFO_DEVICE_PROFILE_H_
-#define PERIDOT_LIB_DEVICE_INFO_DEVICE_PROFILE_H_
-
-#include <string>
-
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/device_info/device_info.h"
-
-namespace modular {
-
-// Parses a device's profile JSON. Can be used to parse the current device or a
-// remote device's profile from the device map.
-class DeviceProfile {
-  DeviceProfile();
-  ~DeviceProfile() = delete;
-
-  bool Parse(const std::string& jsonProfile);
-  bool ParseDefaultProfile();
-
-  // if this device is intended to be a remote presentation device.
-  // HACK(zbowling): TBD: We need a better way deciding a device's idioms.
-  bool presentation_server{false};
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DeviceProfile);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_DEVICE_INFO_DEVICE_PROFILE_H_
diff --git a/lib/entity/BUILD.gn b/lib/entity/BUILD.gn
deleted file mode 100644
index ffbe105..0000000
--- a/lib/entity/BUILD.gn
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("entity_watcher") {
-  sources = [
-    "entity_watcher_impl.cc",
-    "entity_watcher_impl.h",
-  ]
-
-  deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
diff --git a/lib/entity/entity_watcher_impl.cc b/lib/entity/entity_watcher_impl.cc
deleted file mode 100644
index 6f64c5a..0000000
--- a/lib/entity/entity_watcher_impl.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/entity/entity_watcher_impl.h"
-
-namespace modular {
-
-EntityWatcherImpl::EntityWatcherImpl() : binding_(this) {}
-
-EntityWatcherImpl::EntityWatcherImpl(
-    fit::function<void(std::unique_ptr<fuchsia::mem::Buffer> value)> callback)
-    : callback_(std::move(callback)), binding_(this) {}
-
-void EntityWatcherImpl::SetOnUpdated(
-    fit::function<void(std::unique_ptr<fuchsia::mem::Buffer> value)> callback) {
-  callback_ = std::move(callback);
-}
-
-void EntityWatcherImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::EntityWatcher> request) {
-  binding_.Bind(std::move(request));
-}
-
-void EntityWatcherImpl::OnUpdated(std::unique_ptr<fuchsia::mem::Buffer> value) {
-  if (callback_) {
-    callback_(std::move(value));
-  }
-}
-
-}  // namespace modular
diff --git a/lib/entity/entity_watcher_impl.h b/lib/entity/entity_watcher_impl.h
deleted file mode 100644
index 79e62e2..0000000
--- a/lib/entity/entity_watcher_impl.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_ENTITY_ENTITY_WATCHER_IMPL_H_
-#define PERIDOT_LIB_ENTITY_ENTITY_WATCHER_IMPL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-
-#include <memory>
-
-namespace modular {
-
-// An EntityWatcher implementation which calls a callback when the entity data
-// is updated.
-class EntityWatcherImpl : public fuchsia::modular::EntityWatcher {
- public:
-  EntityWatcherImpl();
-  EntityWatcherImpl(
-      fit::function<void(std::unique_ptr<fuchsia::mem::Buffer> value)>
-          callback);
-
-  // Sets the callback which will be called with the updated entity value.
-  void SetOnUpdated(
-      fit::function<void(std::unique_ptr<fuchsia::mem::Buffer> value)>
-          callback);
-
-  // Binds |request| to this EntityWatcher implementation.
-  void Connect(fidl::InterfaceRequest<fuchsia::modular::EntityWatcher> request);
-
- private:
-  // |EntityWatcher|
-  void OnUpdated(std::unique_ptr<fuchsia::mem::Buffer> value);
-
-  // The callback which is called when the entity data update is observed.
-  fit::function<void(std::unique_ptr<fuchsia::mem::Buffer> value)> callback_;
-
-  // The binding which is used by |Connect()| to bind incoming EntityWatcher
-  // requests.
-  fidl::Binding<fuchsia::modular::EntityWatcher> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(EntityWatcherImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_ENTITY_ENTITY_WATCHER_IMPL_H_
diff --git a/lib/environment_host/BUILD.gn b/lib/environment_host/BUILD.gn
deleted file mode 100644
index 89c8548..0000000
--- a/lib/environment_host/BUILD.gn
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("environment_host") {
-  sources = [
-    "maxwell_service_provider_bridge.cc",
-    "maxwell_service_provider_bridge.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/svc/cpp",
-  ]
-}
diff --git a/lib/environment_host/maxwell_service_provider_bridge.cc b/lib/environment_host/maxwell_service_provider_bridge.cc
deleted file mode 100644
index 88df821..0000000
--- a/lib/environment_host/maxwell_service_provider_bridge.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/environment_host/maxwell_service_provider_bridge.h"
-
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/connect.h>
-
-namespace maxwell {
-namespace {
-
-// TODO(abarth): Get this constant from a generated header once netstack uses
-// FIDL.
-constexpr char kNetstack[] = "net.Netstack";
-
-}  // namespace
-
-MaxwellServiceProviderBridge::MaxwellServiceProviderBridge(
-    fuchsia::sys::Environment* parent_env)
-    : vfs_(async_get_default_dispatcher()),
-      services_dir_(fbl::AdoptRef(new fs::PseudoDir)) {
-  AddService<fuchsia::sys::Loader>(
-      [parent_env](fidl::InterfaceRequest<fuchsia::sys::Loader> request) {
-        fuchsia::sys::ServiceProviderPtr services;
-        parent_env->GetServices(services.NewRequest());
-        component::ConnectToService(services.get(), std::move(request));
-      });
-  AddServiceWithName(
-      kNetstack,
-      fbl::AdoptRef(new fs::Service([parent_env](zx::channel request) {
-        fuchsia::sys::ServiceProviderPtr services;
-        parent_env->GetServices(services.NewRequest());
-        services->ConnectToService(kNetstack, std::move(request));
-        return ZX_OK;
-      })));
-}
-
-void MaxwellServiceProviderBridge::AddServiceWithName(
-    const char* name, fbl::RefPtr<fs::Service> service) {
-  service_names_.push_back(name);
-  services_dir_->AddEntry(name, service);
-}
-
-zx::channel MaxwellServiceProviderBridge::OpenAsDirectory() {
-  zx::channel h1, h2;
-  if (zx::channel::create(0, &h1, &h2) != ZX_OK)
-    return zx::channel();
-  if (vfs_.ServeDirectory(services_dir_, std::move(h1)) != ZX_OK)
-    return zx::channel();
-  return h2;
-}
-
-}  // namespace maxwell
diff --git a/lib/environment_host/maxwell_service_provider_bridge.h b/lib/environment_host/maxwell_service_provider_bridge.h
deleted file mode 100644
index 6b095a9..0000000
--- a/lib/environment_host/maxwell_service_provider_bridge.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_ENVIRONMENT_HOST_MAXWELL_SERVICE_PROVIDER_BRIDGE_H_
-#define PERIDOT_LIB_ENVIRONMENT_HOST_MAXWELL_SERVICE_PROVIDER_BRIDGE_H_
-
-#include <fbl/ref_ptr.h>
-#include <fs/pseudo-dir.h>
-#include <fs/service.h>
-#include <fs/synchronous-vfs.h>
-#include <fuchsia/sys/cpp/fidl.h>
-
-namespace maxwell {
-
-// Environment surfacing only explicitly given environment services.
-class MaxwellServiceProviderBridge {
- public:
-  MaxwellServiceProviderBridge(fuchsia::sys::Environment* parent_env);
-
-  zx::channel OpenAsDirectory();
-  const std::vector<std::string>& service_names() {
-    return service_names_;
-  }
-
-  template <typename Interface>
-  void AddService(fidl::InterfaceRequestHandler<Interface> handler) {
-    auto service = fbl::AdoptRef(new fs::Service(
-        [this, handler = std::move(handler)](zx::channel channel) {
-          handler(fidl::InterfaceRequest<Interface>(std::move(channel)));
-          return ZX_OK;
-        }));
-    AddServiceWithName(Interface::Name_, service);
-  }
-
-  void AddServiceWithName(const char* name, fbl::RefPtr<fs::Service> svc);
-
- private:
-  fs::SynchronousVfs vfs_;
-  fbl::RefPtr<fs::PseudoDir> services_dir_;
-  std::vector<std::string> service_names_;
-};
-
-}  // namespace maxwell
-
-#endif  // PERIDOT_LIB_ENVIRONMENT_HOST_MAXWELL_SERVICE_PROVIDER_BRIDGE_H_
diff --git a/lib/fidl/BUILD.gn b/lib/fidl/BUILD.gn
deleted file mode 100644
index cbf3a3a..0000000
--- a/lib/fidl/BUILD.gn
+++ /dev/null
@@ -1,191 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-source_set("app_client") {
-  sources = [
-    "app_client.cc",
-    "app_client.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/svc/cpp",
-    "//peridot/lib/common:async_holder",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("array_to_string") {
-  sources = [
-    "array_to_string.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-  ]
-}
-
-source_set("json_xdr") {
-  sources = [
-    "json_xdr.cc",
-    "json_xdr.h",
-  ]
-
-  # MUST be public so clients pick up the defines from
-  # //third_party/rapidjson:rapidjson_config
-  public_deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/rapidjson",
-    "//third_party/rapidjson",
-  ]
-}
-
-source_set("proxy") {
-  sources = [
-    "proxy.cc",
-    "proxy.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-source_set("clone") {
-  sources = [
-    "clone.h",
-  ]
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-source_set("environment") {
-  sources = [
-    "environment.cc",
-    "environment.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-source_set("single_service_app") {
-  sources = [
-    "single_service_app.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/fidl/fuchsia.ui.app",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1token",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//zircon/public/lib/zx",
-  ]
-}
-
-source_set("view_host") {
-  sources = [
-    "view_host.cc",
-    "view_host.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/ui/base_view/cpp",
-    "//zircon/public/lib/zx",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.ui.app",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1token",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-fidl("app_client_unittest_fidl") {
-  testonly = true
-  cpp_legacy_callbacks = true
-
-  name = "test.peridot.lib.fidl.appclient"
-
-  sources = [
-    "app_client_unittest.fidl",
-  ]
-}
-
-group("unittests") {
-  testonly = true
-
-  deps = [
-    ":app_client_unittest",
-    ":json_xdr_unittest",
-  ]
-}
-
-source_set("app_client_unittest") {
-  testonly = true
-
-  sources = [
-    "app_client_unittest.cc",
-  ]
-
-  deps = [
-    ":app_client",
-    ":app_client_unittest_fidl",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/component/cpp/testing:fake_launcher",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest",
-  ]
-}
-
-fidl("json_xdr_unittest_fidl") {
-  testonly = true
-  cpp_legacy_callbacks = true
-
-  name = "test.peridot.lib.fidl.jsonxdr"
-
-  sources = [
-    "json_xdr_unittest.fidl",
-  ]
-}
-
-source_set("json_xdr_unittest") {
-  testonly = true
-
-  sources = [
-    "json_xdr_unittest.cc",
-  ]
-
-  deps = [
-    ":json_xdr",
-    ":json_xdr_unittest_fidl",
-    "//third_party/googletest:gtest",
-  ]
-}
diff --git a/lib/fidl/README.md b/lib/fidl/README.md
deleted file mode 100644
index c0126dd..0000000
--- a/lib/fidl/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-This directory contains files that make it (slightly) easier to use fidl in the
-modular code base.
diff --git a/lib/fidl/app_client.cc b/lib/fidl/app_client.cc
deleted file mode 100644
index bd0c122..0000000
--- a/lib/fidl/app_client.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/fidl/app_client.h"
-
-#include <fcntl.h>
-
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/fdio/limits.h>
-#include <lib/fdio/util.h>
-#include <lib/fsl/io/fd.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/unique_fd.h>
-#include <zircon/processargs.h>
-
-namespace modular {
-AppClientBase::AppClientBase(fuchsia::sys::Launcher* const launcher,
-                             fuchsia::modular::AppConfig config,
-                             std::string data_origin,
-                             fuchsia::sys::ServiceListPtr additional_services)
-    : AsyncHolderBase(config.url) {
-  fuchsia::sys::LaunchInfo launch_info;
-  launch_info.directory_request = services_.NewRequest();
-  launch_info.url = config.url;
-  std::vector<std::string> args;
-  for (const auto& arg : *config.args) {
-    launch_info.arguments.push_back(arg);
-  }
-
-  if (!data_origin.empty()) {
-    if (!files::CreateDirectory(data_origin)) {
-      FXL_LOG(ERROR) << "Unable to create directory at " << data_origin;
-      return;
-    }
-    launch_info.flat_namespace = fuchsia::sys::FlatNamespace::New();
-    launch_info.flat_namespace->paths.push_back("/data");
-
-    fxl::UniqueFD dir(open(data_origin.c_str(), O_DIRECTORY | O_RDONLY));
-    if (!dir.is_valid()) {
-      FXL_LOG(ERROR) << "Unable to open directory at " << data_origin
-                     << ". errno: " << errno;
-      return;
-    }
-
-    launch_info.flat_namespace->directories.push_back(
-        fsl::CloneChannelFromFileDescriptor(dir.get()));
-    if (!launch_info.flat_namespace->directories.at(0)) {
-      FXL_LOG(ERROR) << "Unable create a handle from  " << data_origin;
-      return;
-    }
-  }
-
-  if (additional_services) {
-    launch_info.additional_services = std::move(additional_services);
-  }
-  launcher->CreateComponent(std::move(launch_info), app_.NewRequest());
-}
-
-AppClientBase::~AppClientBase() = default;
-
-void AppClientBase::ImplTeardown(std::function<void()> done) {
-  ServiceTerminate(std::move(done));
-}
-
-void AppClientBase::ImplReset() {
-  app_.Unbind();
-  ServiceUnbind();
-}
-
-void AppClientBase::SetAppErrorHandler(
-    const std::function<void()>& error_handler) {
-  app_.set_error_handler(
-      [error_handler](zx_status_t status) { error_handler(); });
-}
-
-void AppClientBase::ServiceTerminate(const std::function<void()>& /* done */) {}
-
-void AppClientBase::ServiceUnbind() {}
-
-template <>
-void AppClient<fuchsia::modular::Lifecycle>::ServiceTerminate(
-    const std::function<void()>& done) {
-  SetAppErrorHandler(done);
-  if (primary_service())
-    primary_service()->Terminate();
-}
-
-}  // namespace modular
diff --git a/lib/fidl/app_client.h b/lib/fidl/app_client.h
deleted file mode 100644
index 1e10e77..0000000
--- a/lib/fidl/app_client.h
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIDL_APP_CLIENT_H_
-#define PERIDOT_LIB_FIDL_APP_CLIENT_H_
-
-#include <memory>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/time/time_delta.h>
-#include <lib/svc/cpp/services.h>
-
-#include "peridot/lib/common/async_holder.h"
-
-namespace modular {
-
-// A class that holds a connection to a single service instance in an
-// application instance. The service instance supports life cycle with a
-// Terminate() method. When calling Terminate(), the service is supposed to
-// close its connection, and when that happens, we can kill the application, or
-// it's gone already anyway. If the service connection doesn't close after a
-// timeout, we close it and kill the application anyway.
-//
-// When starting an application instance, the directory pointed to by
-// |data_origin| will be mapped into /data for the newly started application.
-// If left empty, it'll be mapped to the root /data.
-//
-// |additional_services| will allow us to add custom services to an applications
-// namespace.
-//
-// AppClientBase are the non-template parts factored out so they don't need to
-// be inline. It can be used on its own too.
-class AppClientBase : public AsyncHolderBase {
- public:
-  AppClientBase(fuchsia::sys::Launcher* launcher,
-                fuchsia::modular::AppConfig config,
-                std::string data_origin = "",
-                fuchsia::sys::ServiceListPtr additional_services = nullptr);
-  ~AppClientBase() override;
-
-  // Gives access to the services of the started application. Services
-  // obtained from it are not involved in life cycle management provided by
-  // AppClient, however. This is used for example to obtain the ViewProvider.
-  component::Services& services() { return services_; }
-
-  // Registers a handler to receive a notification when this application
-  // connection encounters an error. This typically happens when this
-  // application stops or crashes. |error_handler| will be deregistered when
-  // attempting graceful termination via |AsyncHolderBase::Teardown()|.
-  void SetAppErrorHandler(const std::function<void()>& error_handler);
-
- private:
-  // The termination sequence as prescribed by AsyncHolderBase.
-  void ImplTeardown(std::function<void()> done) override;
-  void ImplReset() override;
-
-  // Service specific parts of the termination sequence.
-  virtual void ServiceTerminate(const std::function<void()>& done);
-  virtual void ServiceUnbind();
-
-  fuchsia::sys::ComponentControllerPtr app_;
-  component::Services services_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(AppClientBase);
-};
-
-// A generic client that does the standard termination sequence. For a service
-// with another termination sequence, another implementation could be created.
-template <class Service>
-class AppClient : public AppClientBase {
- public:
-  AppClient(fuchsia::sys::Launcher* const launcher,
-            fuchsia::modular::AppConfig config, std::string data_origin = "",
-            fuchsia::sys::ServiceListPtr additional_services = nullptr)
-      : AppClientBase(launcher, std::move(config), std::move(data_origin),
-                      std::move(additional_services)) {
-    services().ConnectToService(service_.NewRequest());
-  }
-
-  ~AppClient() override = default;
-
-  fidl::InterfacePtr<Service>& primary_service() { return service_; }
-
- private:
-  void ServiceTerminate(const std::function<void()>& done) override {
-    // The service is expected to acknowledge the Terminate() request by
-    // closing its connection within the timeout set in Teardown().
-    service_.set_error_handler([done](zx_status_t status) { done(); });
-    service_->Terminate();
-  }
-
-  void ServiceUnbind() override { service_.Unbind(); }
-
-  fidl::InterfacePtr<Service> service_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(AppClient);
-};
-
-template <>
-void AppClient<fuchsia::modular::Lifecycle>::ServiceTerminate(
-    const std::function<void()>& done);
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_FIDL_APP_CLIENT_H_
diff --git a/lib/fidl/app_client_unittest.cc b/lib/fidl/app_client_unittest.cc
deleted file mode 100644
index b79ef95..0000000
--- a/lib/fidl/app_client_unittest.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/fidl/app_client.h"
-
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/component/cpp/testing/fake_launcher.h>
-#include <lib/gtest/test_loop_fixture.h>
-#include <test/peridot/lib/fidl/appclient/cpp/fidl.h>
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace testing {
-namespace {
-
-using ::component::testing::FakeLauncher;
-using ::test::peridot::lib::fidl::appclient::TerminateService;
-
-constexpr char kServiceName[] = "service1";
-constexpr char kTestUrl[] = "some/test/url";
-
-fuchsia::modular::AppConfig GetTestAppConfig() {
-  fuchsia::modular::AppConfig app_config;
-  app_config.url = kTestUrl;
-  return app_config;
-}
-
-class TestComponentController : fuchsia::sys::ComponentController {
- public:
-  TestComponentController() : binding_(this) {}
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::sys::ComponentController> request) {
-    binding_.Bind(std::move(request));
-    binding_.set_error_handler([this](zx_status_t status) { Kill(); });
-  }
-
-  bool killed() { return killed_; }
-
- private:
-  void Kill() override { killed_ = true; }
-
-  void Detach() override {}
-
-  fidl::Binding<fuchsia::sys::ComponentController> binding_;
-
-  bool killed_{};
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestComponentController);
-};
-
-class AppClientTest : public gtest::TestLoopFixture {};
-
-TEST_F(AppClientTest, BaseRun_Success) {
-  bool callback_called = false;
-  FakeLauncher launcher;
-  launcher.RegisterComponent(
-      kTestUrl,
-      [&callback_called](
-          fuchsia::sys::LaunchInfo launch_info,
-          fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl) {
-        EXPECT_EQ(kTestUrl, launch_info.url);
-        callback_called = true;
-      });
-  AppClientBase app_client_base(&launcher, GetTestAppConfig());
-
-  EXPECT_TRUE(callback_called);
-}
-
-TEST_F(AppClientTest, BaseTerminate_Success) {
-  FakeLauncher launcher;
-  TestComponentController controller;
-  bool callback_called = false;
-  launcher.RegisterComponent(
-      kTestUrl,
-      [&callback_called, &controller](
-          fuchsia::sys::LaunchInfo launch_info,
-          fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl) {
-        EXPECT_EQ(kTestUrl, launch_info.url);
-        callback_called = true;
-        controller.Connect(std::move(ctrl));
-      });
-
-  AppClientBase app_client_base(&launcher, GetTestAppConfig());
-
-  bool app_terminated_callback_called = false;
-  app_client_base.Teardown(zx::duration(), [&app_terminated_callback_called] {
-    app_terminated_callback_called = true;
-  });
-
-  EXPECT_TRUE(callback_called);
-  RunLoopUntilIdle();
-  EXPECT_TRUE(app_terminated_callback_called);
-  EXPECT_TRUE(controller.killed());
-}
-
-TEST_F(AppClientTest, Run_Success) {
-  bool callback_called = false;
-  FakeLauncher launcher;
-  launcher.RegisterComponent(
-      kTestUrl,
-      [&callback_called](
-          fuchsia::sys::LaunchInfo launch_info,
-          fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl) {
-        EXPECT_EQ(kTestUrl, launch_info.url);
-        callback_called = true;
-      });
-
-  AppClient<TerminateService> app_client(&launcher, GetTestAppConfig());
-
-  EXPECT_TRUE(callback_called);
-}
-
-TEST_F(AppClientTest, RunWithParams_Success) {
-  fuchsia::sys::ServiceListPtr additional_services =
-      fuchsia::sys::ServiceList::New();
-  additional_services->names.push_back(kServiceName);
-  // We just need |provider_request| to stay around till the end of this test.
-  auto provider_request = additional_services->provider.NewRequest();
-
-  bool callback_called = false;
-  FakeLauncher launcher;
-  launcher.RegisterComponent(
-      kTestUrl,
-      [&callback_called](
-          fuchsia::sys::LaunchInfo launch_info,
-          fidl::InterfaceRequest<fuchsia::sys::ComponentController> ctrl) {
-        EXPECT_EQ(kTestUrl, launch_info.url);
-        auto additional_services = std::move(launch_info.additional_services);
-        EXPECT_EQ(kServiceName, additional_services->names.at(0));
-        callback_called = true;
-      });
-
-  AppClient<TerminateService> app_client(&launcher, GetTestAppConfig(), "",
-                                         std::move(additional_services));
-
-  EXPECT_TRUE(callback_called);
-}
-
-}  // namespace
-}  // namespace testing
-}  // namespace modular
diff --git a/lib/fidl/app_client_unittest.fidl b/lib/fidl/app_client_unittest.fidl
deleted file mode 100644
index 6cf7849..0000000
--- a/lib/fidl/app_client_unittest.fidl
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 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.
-
-// Interface(s) used by AppClient's unittest.
-
-library test.peridot.lib.fidl.appclient;
-
-[Discoverable]
-interface TerminateService {
-    1: Terminate();
-};
diff --git a/lib/fidl/array_to_string.h b/lib/fidl/array_to_string.h
deleted file mode 100644
index d87d094..0000000
--- a/lib/fidl/array_to_string.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIDL_ARRAY_TO_STRING_H_
-#define PERIDOT_LIB_FIDL_ARRAY_TO_STRING_H_
-
-#include <string>
-#include <vector>
-
-#include <lib/fidl/cpp/string.h>
-#include <lib/fidl/cpp/vector.h>
-
-namespace modular {
-
-inline std::string to_string(const fidl::Array<uint8_t, 16>& data) {
-  return std::string(reinterpret_cast<const char*>(data.data()), data.count());
-}
-
-inline std::string to_string(const fidl::VectorPtr<uint8_t>& data) {
-  return std::string(reinterpret_cast<const char*>(data->data()), data->size());
-}
-
-inline std::string to_string(const std::vector<uint8_t>& data) {
-  return std::string(reinterpret_cast<const char*>(data.data()), data.size());
-}
-
-inline std::string to_hex_string(const uint8_t* data, size_t size) {
-  constexpr char kHexadecimalCharacters[] = "0123456789abcdef";
-  std::string ret;
-  ret.reserve(size * 2);
-  for (size_t i = 0; i < size; i++) {
-    unsigned char c = data[i];
-    ret.push_back(kHexadecimalCharacters[c >> 4]);
-    ret.push_back(kHexadecimalCharacters[c & 0xf]);
-  }
-  return ret;
-}
-
-template <size_t N>
-inline std::string to_hex_string(const fidl::Array<uint8_t, N>& data) {
-  return to_hex_string(data.data(), N);
-}
-
-template <size_t N>
-inline std::string to_hex_string(const std::array<uint8_t, N>& data) {
-  return to_hex_string(data.data(), N);
-}
-
-inline std::string to_hex_string(const fidl::VectorPtr<uint8_t>& data) {
-  return to_hex_string(data->data(), data->size());
-}
-
-inline std::string to_hex_string(const std::vector<uint8_t>& data) {
-  return to_hex_string(data.data(), data.size());
-}
-
-// If possible use convert::ToArray instead.
-inline fidl::VectorPtr<uint8_t> to_array(const std::string& val) {
-  fidl::VectorPtr<uint8_t> ret = fidl::VectorPtr<uint8_t>::New(0);
-  for (char c : val) {
-    ret.push_back(c);
-  }
-  return ret;
-}
-
-inline fidl::VectorPtr<fidl::StringPtr> to_array(
-    const std::vector<std::string>& val) {
-  fidl::VectorPtr<fidl::StringPtr> ret =
-      fidl::VectorPtr<fidl::StringPtr>::New(0);
-  for (const std::string& s : val) {
-    ret.push_back(s);
-  }
-  return ret;
-}
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_FIDL_ARRAY_TO_STRING_H_
diff --git a/lib/fidl/clone.h b/lib/fidl/clone.h
deleted file mode 100644
index 6836d9f..0000000
--- a/lib/fidl/clone.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIDL_CLONE_H_
-#define PERIDOT_LIB_FIDL_CLONE_H_
-
-#include <memory>
-
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fidl/cpp/vector.h>
-
-namespace modular {
-
-template <typename T>
-T CloneStruct(const T& value) {
-  T new_value;
-  value.Clone(&new_value);
-  return new_value;
-}
-
-template <typename T>
-std::unique_ptr<T> CloneOptional(const T& value) {
-  T new_value;
-  value.Clone(&new_value);
-  return fidl::MakeOptional<T>(std::move(new_value));
-}
-
-template <typename T>
-std::unique_ptr<T> CloneOptional(const std::unique_ptr<T>& value_ptr) {
-  if (value_ptr) {
-    T new_value;
-    value_ptr->Clone(&new_value);
-    return fidl::MakeOptional<T>(std::move(new_value));
-  }
-  return nullptr;
-}
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_FIDL_CLONE_H_
diff --git a/lib/fidl/environment.cc b/lib/fidl/environment.cc
deleted file mode 100644
index ac97109..0000000
--- a/lib/fidl/environment.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/fidl/environment.h"
-
-#include <lib/async/default.h>
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-Environment::Environment(const fuchsia::sys::EnvironmentPtr& parent_env,
-                         const std::string& label,
-                         const std::vector<std::string>& service_names,
-                         bool kill_on_oom)
-    : vfs_(async_get_default_dispatcher()) {
-  InitEnvironment(parent_env, label, service_names, kill_on_oom);
-}
-
-Environment::Environment(const Environment* const parent_scope,
-                         const std::string& label,
-                         const std::vector<std::string>& service_names,
-                         bool kill_on_oom)
-    : vfs_(async_get_default_dispatcher()) {
-  FXL_DCHECK(parent_scope != nullptr);
-  InitEnvironment(parent_scope->environment(), label, service_names,
-                  kill_on_oom);
-}
-
-fuchsia::sys::Launcher* Environment::GetLauncher() {
-  if (!env_launcher_) {
-    env_->GetLauncher(env_launcher_.NewRequest());
-  }
-  return env_launcher_.get();
-}
-
-zx::channel Environment::OpenAsDirectory() {
-  zx::channel h1, h2;
-  if (zx::channel::create(0, &h1, &h2) != ZX_OK)
-    return zx::channel();
-  if (vfs_.ServeDirectory(services_dir_, std::move(h1)) != ZX_OK)
-    return zx::channel();
-  return h2;
-}
-
-void Environment::InitEnvironment(
-    const fuchsia::sys::EnvironmentPtr& parent_env, const std::string& label,
-    const std::vector<std::string>& service_names, bool kill_on_oom) {
-  services_dir_ = fbl::AdoptRef(new fs::PseudoDir);
-  fuchsia::sys::ServiceListPtr service_list(new fuchsia::sys::ServiceList);
-  for (const auto& name : service_names) {
-    service_list->names.push_back(name);
-  }
-  service_list->host_directory = OpenAsDirectory();
-  parent_env->CreateNestedEnvironment(
-      env_.NewRequest(), env_controller_.NewRequest(), label,
-      std::move(service_list),
-      {.inherit_parent_services = true, .kill_on_oom = kill_on_oom});
-}
-
-}  // namespace modular
diff --git a/lib/fidl/environment.h b/lib/fidl/environment.h
deleted file mode 100644
index 570abd6..0000000
--- a/lib/fidl/environment.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIDL_ENVIRONMENT_H_
-#define PERIDOT_LIB_FIDL_ENVIRONMENT_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <fbl/ref_ptr.h>
-#include <fs/pseudo-dir.h>
-#include <fs/service.h>
-#include <fs/synchronous-vfs.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fit/function.h>
-
-namespace modular {
-
-// Provides fate separation of sets of applications run by one application. The
-// environment services are delegated to the parent environment.
-class Environment {
- public:
-  Environment(const fuchsia::sys::EnvironmentPtr& parent_env,
-              const std::string& label,
-              const std::vector<std::string>& service_names, bool kill_on_oom);
-
-  Environment(const Environment* parent_scope, const std::string& label,
-              const std::vector<std::string>& service_names, bool kill_on_oom);
-
-  template <typename Interface>
-  void AddService(fidl::InterfaceRequestHandler<Interface> handler,
-                  const std::string& service_name = Interface::Name_) {
-    auto service = fbl::AdoptRef(new fs::Service(
-        [this, handler = std::move(handler)](zx::channel channel) {
-          handler(fidl::InterfaceRequest<Interface>(std::move(channel)));
-          return ZX_OK;
-        }));
-    services_dir_->AddEntry(service_name, service);
-  }
-
-  fuchsia::sys::Launcher* GetLauncher();
-
-  const fuchsia::sys::EnvironmentPtr& environment() const { return env_; }
-
- private:
-  zx::channel OpenAsDirectory();
-
-  void InitEnvironment(const fuchsia::sys::EnvironmentPtr& parent_env,
-                       const std::string& label,
-                       const std::vector<std::string>& service_names,
-                       bool kill_on_oom);
-
-  fuchsia::sys::EnvironmentPtr env_;
-  fuchsia::sys::LauncherPtr env_launcher_;
-  fuchsia::sys::EnvironmentControllerPtr env_controller_;
-  fs::SynchronousVfs vfs_;
-  fbl::RefPtr<fs::PseudoDir> services_dir_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_FIDL_ENVIRONMENT_H_
diff --git a/lib/fidl/json_xdr.cc b/lib/fidl/json_xdr.cc
deleted file mode 100644
index e9b72b6..0000000
--- a/lib/fidl/json_xdr.cc
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/fidl/json_xdr.h"
-
-#include <string>
-
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/rapidjson/rapidjson.h"
-
-namespace modular {
-
-namespace {
-const char* JsonTypeName(const rapidjson::Type type) {
-  switch (type) {
-    case rapidjson::kNullType:
-      return "null";
-    case rapidjson::kFalseType:
-      return "false";
-    case rapidjson::kTrueType:
-      return "true";
-    case rapidjson::kObjectType:
-      return "object";
-    case rapidjson::kArrayType:
-      return "array";
-    case rapidjson::kStringType:
-      return "string";
-    case rapidjson::kNumberType:
-      return "number";
-  };
-}
-}  // namespace
-
-// HACK(mesch): We should not need this, get rid of it.
-thread_local JsonValue XdrContext::null_ = JsonValue();
-
-XdrContext::XdrContext(const XdrOp op, JsonDoc* const doc,
-                       std::string* const error)
-    : parent_(nullptr),
-      name_(nullptr),
-      error_(error),
-      op_(op),
-      doc_(doc),
-      value_(doc) {
-  FXL_DCHECK(doc_ != nullptr);
-  FXL_DCHECK(error_ != nullptr);
-}
-
-XdrContext::XdrContext(XdrContext* const parent, const char* const name,
-                       const XdrOp op, JsonDoc* const doc,
-                       JsonValue* const value)
-    : parent_(parent),
-      name_(name),
-      error_(nullptr),
-      op_(op),
-      doc_(doc),
-      value_(value) {
-  FXL_DCHECK(parent_ != nullptr);
-  FXL_DCHECK(doc_ != nullptr);
-  FXL_DCHECK(value_ != nullptr);
-}
-
-XdrContext::~XdrContext() = default;
-
-bool XdrContext::Version(uint32_t version) {
-  constexpr char kVersion[] = "@version";
-  switch (op_) {
-    case XdrOp::TO_JSON:
-      Field(kVersion).Value(&version);
-      return true;
-
-    case XdrOp::FROM_JSON: {
-      if (!value_->IsObject()) {
-        AddError("Version(): must be on an Object.");
-        return false;
-      }
-      auto i = value_->FindMember(kVersion);
-      if (i == value_->MemberEnd()) {
-        AddError("Version(): No @version present.");
-        return false;
-      }
-      uint32_t actual_version{};
-      Field(kVersion).Value(&actual_version);
-      if (actual_version != version) {
-        AddError("Version(): Found version " + std::to_string(actual_version) +
-                 " but expected version " + std::to_string(version));
-        return false;
-      }
-      return true;
-    }
-  }
-}
-
-void XdrContext::Value(unsigned char* const data) {
-  switch (op_) {
-    case XdrOp::TO_JSON:
-      value_->Set(static_cast<int>(*data), allocator());
-      break;
-
-    case XdrOp::FROM_JSON:
-      if (!value_->Is<int>()) {
-        AddError("Value() of unsigned char: int expected");
-        return;
-      }
-      *data = static_cast<unsigned char>(value_->Get<int>());
-  }
-}
-
-void XdrContext::Value(int8_t* const data) {
-  switch (op_) {
-    case XdrOp::TO_JSON:
-      value_->Set(static_cast<int>(*data), allocator());
-      break;
-
-    case XdrOp::FROM_JSON:
-      if (!value_->Is<int>()) {
-        AddError("Value() of int8: int expected");
-        return;
-      }
-      *data = static_cast<int8_t>(value_->Get<int>());
-  }
-}
-
-void XdrContext::Value(unsigned short* const data) {
-  switch (op_) {
-    case XdrOp::TO_JSON:
-      value_->Set(static_cast<int>(*data), allocator());
-      break;
-
-    case XdrOp::FROM_JSON:
-      if (!value_->Is<int>()) {
-        AddError("Value() of unsigned short: int expected");
-        return;
-      }
-      *data = static_cast<unsigned short>(value_->Get<int>());
-  }
-}
-
-void XdrContext::Value(short* const data) {
-  switch (op_) {
-    case XdrOp::TO_JSON:
-      value_->Set(static_cast<int>(*data), allocator());
-      break;
-
-    case XdrOp::FROM_JSON:
-      if (!value_->Is<int>()) {
-        AddError("Value() of short: int expected");
-        return;
-      }
-      *data = static_cast<short>(value_->Get<int>());
-  }
-}
-
-void XdrContext::Value(fidl::StringPtr* const data) {
-  switch (op_) {
-    case XdrOp::TO_JSON:
-      if (data->is_null()) {
-        value_->SetNull();
-      } else {
-        value_->SetString(data->get(), allocator());
-      }
-      break;
-
-    case XdrOp::FROM_JSON:
-      if (value_->IsNull()) {
-        data->reset();
-      } else if (value_->IsString()) {
-        *data = value_->GetString();
-      } else {
-        AddError("Value() of fidl::StringPtr: string expected");
-      }
-      break;
-  }
-}
-
-void XdrContext::Value(std::string* const data) {
-  switch (op_) {
-    case XdrOp::TO_JSON:
-      value_->SetString(*data, allocator());
-      break;
-
-    case XdrOp::FROM_JSON:
-      if (value_->IsString()) {
-        *data = value_->GetString();
-      } else {
-        AddError("Value() of std::string: string expected");
-      }
-      break;
-  }
-}
-
-XdrContext XdrContext::Field(const char field[]) {
-  switch (op_) {
-    case XdrOp::TO_JSON:
-      if (!value_->IsObject()) {
-        value_->SetObject();
-      }
-      break;
-
-    case XdrOp::FROM_JSON:
-      if (!value_->IsObject()) {
-        AddError("Object expected for field " + std::string(field));
-        return {this, field, op_, doc_, &null_};
-      }
-  }
-
-  auto i = value_->FindMember(field);
-  if (i != value_->MemberEnd()) {
-    return {this, field, op_, doc_, &i->value};
-  }
-
-  switch (op_) {
-    case XdrOp::TO_JSON: {
-      JsonValue name{field, allocator()};
-      value_->AddMember(name, JsonValue(), allocator());
-      auto i = value_->FindMember(field);
-      FXL_DCHECK(i != value_->MemberEnd());
-      return {this, field, op_, doc_, &i->value};
-    }
-
-    case XdrOp::FROM_JSON:
-      return {this, field, op_, doc_, &null_};
-  }
-}
-
-XdrContext XdrContext::Element(const size_t i) {
-  switch (op_) {
-    case XdrOp::TO_JSON:
-      if (!value_->IsArray()) {
-        value_->SetArray();
-      }
-      break;
-
-    case XdrOp::FROM_JSON:
-      if (!value_->IsArray()) {
-        AddError("Array expected for element " + std::to_string(i));
-        return {this, nullptr, op_, doc_, &null_};
-      }
-  }
-
-  if (i < value_->Size()) {
-    return {this, nullptr, op_, doc_, &value_->operator[](i)};
-  }
-
-  switch (op_) {
-    case XdrOp::TO_JSON:
-      while (i >= value_->Size()) {
-        value_->PushBack(JsonValue(), allocator());
-      }
-      return {this, nullptr, op_, doc_, &value_->operator[](i)};
-
-    case XdrOp::FROM_JSON:
-      return {this, nullptr, op_, doc_, &null_};
-  }
-}
-
-void XdrContext::AddError(const std::string& message) {
-  auto error = AddError();
-  error->append(": " + message + "\n");
-}
-
-std::string* XdrContext::AddError() {
-  std::string* const ret = parent_ ? parent_->AddError() : error_;
-
-  if (parent_) {
-    ret->append("/");
-  }
-
-  ret->append(JsonTypeName(value_->GetType()));
-
-  if (name_) {
-    ret->append(" ");
-    ret->append(name_);
-  }
-
-  return ret;
-}
-
-std::string* XdrContext::GetError() {
-  return parent_ ? parent_->GetError() : error_;
-}
-
-}  // namespace modular
diff --git a/lib/fidl/json_xdr.h b/lib/fidl/json_xdr.h
deleted file mode 100644
index da4d727..0000000
--- a/lib/fidl/json_xdr.h
+++ /dev/null
@@ -1,695 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIDL_JSON_XDR_H_
-#define PERIDOT_LIB_FIDL_JSON_XDR_H_
-
-#include <map>
-#include <string>
-#include <type_traits>
-#include <vector>
-
-#include <lib/fidl/cpp/array.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "rapidjson/document.h"
-
-namespace modular {
-
-// This file provides a tool to serialize arbitrary data structures
-// into JSON, and back. It specifically supports serialization of FIDL
-// data (structs, arrays, maps, and combinations thereof), but FIDL is
-// not a requirement. For example, support for STL containers in
-// addition to FIDL containers is easy to add once we need it.
-//
-// We use JSON as the serialization format to store structured values
-// (and at times also structured keys) in the ledger.
-//
-// The design is inspired by Sun RPC's XDR, specifically the definiton
-// of "filters". A filter function takes an operation and a data
-// pointer, and depending on the operation parameter either serializes
-// or deserializes the data. There is one such filter function for
-// every data type. A filter for a simple data type does different
-// things for serialization and deserialization, so having a single
-// one for both operations instead of two separate functions barely
-// reduces code size. However, the efficiency of this design shows in
-// composition: A filter for a struct can be written by simply calling
-// the filters for each field of the struct and passing the operation
-// parameter down. Thus, a filter function for a struct is half the
-// code size of a pair of serialization/deserialization functions.
-//
-// NOTES:
-//
-// XDR is not sync: Although the XDR operation can be applied to an
-// existing instance of the output end (an existing FIDL struct, or an
-// existing JSON AST), full synchronization of the data structure is
-// not guaranteed. All data that exist in the input are added to the
-// output, but not necessarily all data that don't exist in the input
-// are removed from the output. Also, if an error occurs, the output
-// is left in some intermediate state. The most suitable use for
-// updates as of now is to always create a fresh output instance, and
-// if the transciption succeeds, replace the previous instance by the
-// fresh instance.
-//
-// XDR is not about resolving conflicts: If an existing output
-// instance is updated using XDR, we might improve accuracy of
-// removing data that no longer exist, but it is out of the scope of
-// XDR (at least for now) to note that input data conflict with
-// existing output data, and resolving the conflict. Conflict
-// resolution between different versions of data is most likely
-// handled outside XDR.
-//
-// It may be that we will use XDR to support conflict resolution in a
-// data type agnostic way: Instead of defining a conflict resolution
-// between e.g. STL or FIDL data structures, we might instead define
-// XDR filters for them, translate all values to JSON, apply conflict
-// resolution to JSON, and translate the result back.
-//
-// SCHEMA VERSION BACK COMPATIBILITY:
-//
-// The schema of the persistent data is defined in terms of filter functions. In
-// order to support new versions of the code reading versions of the data
-// written by old versions of the code, filter functions are always defined by
-// the client at the top level entry points as lists, never as single functions.
-//
-// The lists contain the filter for the current version of the schema at the
-// top, and filters for reading previous versions into the current version of
-// the code below.
-//
-// Whenever the storage schema changes, a new version of the filter is created
-// and add it to the version list.
-//
-// If the memory schema changes, filters of all versions are adjusted as
-// necessary.
-//
-// Filters that don't change can be reused between versions. If a filter does
-// not change, but the ones that it uses do change, templates can be used to
-// save on code duplication.
-//
-// TODO(mesch): Right now there is no way to ensure that old versions of the
-// code will never read new versions of the data. Support for this is expected
-// from the Ledger, and partially from an upcoming API for explicit version
-// numbers.
-//
-// See comments on XdrFilterType, XdrRead(), and XdrWrite() for details.
-
-class XdrContext;
-
-// The two operations: reading from JSON or writing to JSON.
-enum class XdrOp {
-  TO_JSON = 0,
-  FROM_JSON = 1,
-};
-
-// Custom types are serialized by passing a function of this type to a method on
-// XdrContext. Note this is a pointer type that points to a const (an existing
-// function). So we will never use a reference or a const of it. However,
-// argument values of such will still be defined const.
-//
-// The top level entry functions used by clients never pass a single filter
-// function alone, but always a list of filters for different versions of the
-// data, such that the reading code can fall back to functions reading
-// previously written versions. Such lists can (and should) be defined
-// statically as constexpr:
-//
-//   void XdrFoo_v1(XdrContext* const xdr, Foo* const data) { ... }
-//   void XdrFoo_v2(XdrContext* const xdr, Foo* const data) { ... }
-//
-//   constexpr XdrFilterType<Foo> XdrFoo[] = {
-//     XdrFoo_v1,
-//     XdrFoo_v2,
-//     nullptr,
-//   };
-//
-//   Foo foo;
-//   XdrRead(json, &foo, XdrFoo);
-//
-// XdrRead and XdrWrite are defined to take an XdrFilterList<> argument, which
-// that constexpr can be passed to. See Definition of XdrRead(), below.
-template <typename T>
-using XdrFilterType = void (*)(XdrContext*, T*);
-
-template <typename T>
-using XdrFilterList = void (*const*)(XdrContext*, T*);
-
-// A generic implementation of such a filter, which works for simple
-// types. (The implementation uses XdrContext, so it's below.)
-template <typename V>
-void XdrFilter(XdrContext* xdr, V* value);
-
-// XdrContext holds on to a JSON document as well as a specific
-// position inside the document on which its methods operate, as well
-// as the operation (writing to JSON, reading from JSON) that is
-// executed when methods are called.
-//
-// There are two kinds of methods: Value() and Field(). Value()
-// affects the current JSON value itself. Field() assumes the current
-// JSON value is an Object, accesses a property on it and affects the
-// value of the property.
-//
-// Clients usually call Value(); filters for custom types usually call
-// Field().
-class XdrContext {
- public:
-  XdrContext(XdrOp op, JsonDoc* doc, std::string* error);
-
-  ~XdrContext();
-
-  // Returns the XdrOp that this XdrContext was created with.
-  //
-  // This is required by some XdrFilters that cannot use the same code to set or
-  // get data from objects. However, in general, try to avoid special-casing
-  // an XdrFilter to change behavior based on whether it's translating to or
-  // from JSON.
-  XdrOp op() const { return op_; }
-
-  // Below are methods to handle values on properties of objects for
-  // handling standalone values. These methods are called by filter
-  // code during a serialization/deserialization operation.
-
-  // The version of a struct. On Write, the version number is written and it
-  // always returns true. On Read, raises an error and returns false if the
-  // version number read doesn't match the version number passed in. Thus it
-  // gives an explicit way to a filter function to force an error.
-  //
-  // The filter should also return early so as to not partially read data.
-  //
-  // This can be applied at any level, but only when it happens as the first
-  // call in the top level filter will it fully prevent partial reads.
-  //
-  // How it should be used:
-  //
-  //   void XdrFoo_v1(XdrContext* const xdr, Foo* const data) { ... }
-  //   void XdrFoo_v2(XdrContext* const xdr, Foo* const data) {
-  //      if (!xdr->Version(2)) {
-  //        return;
-  //      }
-  //      ...
-  //   }
-  //
-  //   constexpr XdrFilterType<Foo> XdrFoo[] = {
-  //     XdrFoo_v2,
-  //     XdrFoo_v1,
-  //     nullptr,
-  //   };
-  //
-  //   Foo foo;
-  //   XdrRead(json, &foo, XdrFoo);
-  //
-  // Notice that _v1 doesn't need to have a Version() call. This is usual when
-  // the first use of the data predates the introduction of the Version()
-  // mechanism.
-  //
-  // This method cannot be used (and returns false and logs an error) in a
-  // context that is not Object.
-  //
-  // It writes the reserved field name "@version" to the current Object context.
-  //
-  // The value passed to the call inside the Xdr filter function should never be
-  // defined as a constant outside of the filter function, because then it
-  // becomes tempting to change it to a new version number without creating a
-  // copy of the filter function for the previous version number.
-  bool Version(uint32_t version);
-
-  // A field of a struct. The value type V is assumed to be one of the
-  // primitive JSON data types. If anything else is passed here and
-  // not to the method below with a custom filter, the rapidjson code
-  // will fail to compile.
-  template <typename V>
-  void Field(const char field[], V* const data) {
-    Field(field).Value(data);
-  }
-
-  // If we supply a custom filter for the value of a field, the data
-  // type of the field very often does not match directly the data
-  // type for which we write a filter, therefore this template has two
-  // type parameters. This happens in several situations:
-  //
-  // 1. Fields with fidl struct types. The field data type, which we pass the
-  //    data for, is a std::unique_ptr<X>, but the filter supplied is for X (and
-  //    thus takes X*).
-  //
-  // 2. Fields with fidl array types. The filter is for an element,
-  //    but the field is the array type.
-  //
-  // 3. Fields with STL container types. The filter is for an element,
-  //    but the field is the container type.
-  //
-  // We could handle this by specialization, it's much simpler to just cover all
-  // possible combinations with a template of higher dimension, at the expense
-  // of covering also a few impossible cases.
-  template <typename D, typename V>
-  void Field(const char field[], D* const data, XdrFilterType<V> const filter) {
-    Field(field).Value(data, filter);
-  }
-
-  // Below are methods analog to those for values on properties of
-  // objects for handling standalone values. These methods are called
-  // by XdrContext client code such as XdrRead() and XdrWrite() to
-  // start a serialization/deserialization operation.
-
-  // A simple value is mapped to the corresponding JSON type (int,
-  // float, bool) directly.
-  template <typename V>
-  typename std::enable_if<!std::is_enum<V>::value>::type Value(V* data) {
-    switch (op_) {
-      case XdrOp::TO_JSON:
-        value_->Set(*data, allocator());
-        break;
-
-      case XdrOp::FROM_JSON:
-        if (!value_->Is<V>()) {
-          AddError("Unexpected type.");
-          return;
-        }
-        *data = value_->Get<V>();
-    }
-  }
-
-  // An enum is mapped to a JSON int.
-  template <typename V>
-  typename std::enable_if<std::is_enum<V>::value>::type Value(V* const data) {
-    switch (op_) {
-      case XdrOp::TO_JSON:
-        value_->Set(static_cast<int>(*data), allocator());
-        break;
-
-      case XdrOp::FROM_JSON:
-        if (!value_->Is<int>()) {
-          AddError("Unexpected type.");
-          return;
-        }
-        *data = static_cast<V>(value_->Get<int>());
-    }
-  }
-
-  // Bytes and shorts, both signed and unsigned, are mapped to JSON int, since
-  // they are not directly supported in the rapidjson API.
-  void Value(unsigned char* data);
-  void Value(int8_t* data);
-  void Value(unsigned short* data);
-  void Value(short* data);
-
-  // A fidl String is mapped to either (i.e., the union type of) JSON
-  // null or JSON string.
-  void Value(fidl::StringPtr* data);
-
-  // An STL string is mapped to a JSON string.
-  void Value(std::string* data);
-
-  // A value of a custom type is mapped using the custom filter. See
-  // the corresponding Field() method for why there are two type
-  // parameters here.
-  template <typename D, typename V>
-  void Value(D* data, XdrFilterType<V> filter) {
-    filter(this, data);
-  }
-
-  // Operator & may be overloaded to return a type that acts like a pointer, but
-  // isn't one, and therefore is not matched by the Value<D,V>(data, filter)
-  // method above. In that case, we need to exercise the operator * of the
-  // pointer type explicitly.
-  //
-  // This is needed for example for std::vector<bool>, where &at(i) is a bit
-  // iterator, not a bool*.
-  template <typename Ptr, typename V>
-  void Value(Ptr data, XdrFilterType<V> filter) {
-    switch (op_) {
-      case XdrOp::TO_JSON: {
-        V value = *data;
-        filter(this, &value);
-        break;
-      }
-
-      case XdrOp::FROM_JSON: {
-        V value;
-        filter(this, &value);
-        *data = std::move(value);
-      }
-    }
-  }
-
-  template <typename S>
-  void Value(std::unique_ptr<S>* data, XdrFilterType<S> filter) {
-    switch (op_) {
-      case XdrOp::TO_JSON:
-        if (!data->get()) {
-          value_->SetNull();
-        } else {
-          value_->SetObject();
-          filter(this, data->get());
-        }
-        break;
-
-      case XdrOp::FROM_JSON:
-        if (value_->IsNull()) {
-          data->reset();
-        } else {
-          if (!value_->IsObject()) {
-            AddError("Object type expected.");
-            return;
-          }
-
-          *data = std::make_unique<S>();
-          filter(this, data->get());
-        }
-    }
-  }
-
-  // A fidl vector is mapped to JSON null and JSON Array with a custom
-  // filter for the elements.
-  template <typename D, typename V>
-  void Value(fidl::VectorPtr<D>* const data, const XdrFilterType<V> filter) {
-    switch (op_) {
-      case XdrOp::TO_JSON:
-        if (data->is_null()) {
-          value_->SetNull();
-
-        } else {
-          value_->SetArray();
-          value_->Reserve((*data)->size(), allocator());
-
-          for (size_t i = 0; i < (*data)->size(); ++i) {
-            Element(i).Value(&(*data)->at(i), filter);
-          }
-        }
-        break;
-
-      case XdrOp::FROM_JSON:
-        if (value_->IsNull()) {
-          data->reset();
-
-        } else {
-          if (!value_->IsArray()) {
-            AddError("Array type expected.");
-            return;
-          }
-
-          // The resize() call has two purposes:
-          //
-          // (1) Setting data to non-null, even if there are only zero
-          //     elements. This is essential, otherwise the FIDL output
-          //     is wrong (i.e., the FIDL output cannot be used in FIDL
-          //     method calls without crashing).
-          //
-          // (2) It saves on allocations for growing the underlying
-          //     vector one by one.
-          data->resize(value_->Size());
-
-          for (size_t i = 0; i < value_->Size(); ++i) {
-            Element(i).Value(&(*data)->at(i), filter);
-          }
-        }
-    }
-  }
-
-  // A fidl array with a simple element type can infer its element
-  // value filter from the type parameters of the array.
-  template <typename V>
-  void Value(fidl::VectorPtr<V>* const data) {
-    Value(data, XdrFilter<V>);
-  }
-
-  // A fidl array is mapped to JSON null and JSON Array with a custom
-  // filter for the elements.
-  template <typename D, size_t N, typename V>
-  void Value(fidl::Array<D, N>* const data, const XdrFilterType<V> filter) {
-    switch (op_) {
-      case XdrOp::TO_JSON: {
-        value_->SetArray();
-        value_->Reserve(N, allocator());
-
-        for (size_t i = 0; i < N; ++i) {
-          Element(i).Value(&data->at(i), filter);
-        }
-        break;
-      }
-
-      case XdrOp::FROM_JSON: {
-        if (!value_->IsArray()) {
-          AddError("Array type expected.");
-          return;
-        }
-
-        if (value_->Size() != N) {
-          AddError(std::string("Array size unexpected: found ") +
-                   std::to_string(value_->Size()) + " expected " +
-                   std::to_string(N));
-          return;
-        }
-
-        for (size_t i = 0; i < N; ++i) {
-          Element(i).Value(&data->at(i), filter);
-        }
-      }
-    }
-  }
-
-  // A fidl array with a simple element type can infer its element
-  // value filter from the type parameters of the array.
-  template <typename V, size_t N>
-  void Value(fidl::Array<V, N>* const data) {
-    Value(data, XdrFilter<V>);
-  }
-
-  // An STL vector is mapped to JSON Array with a custom filter for the
-  // elements.
-  template <typename D, typename V>
-  void Value(std::vector<D>* const data, const XdrFilterType<V> filter) {
-    switch (op_) {
-      case XdrOp::TO_JSON:
-        value_->SetArray();
-        value_->Reserve(data->size(), allocator());
-
-        for (size_t i = 0; i < data->size(); ++i) {
-          Element(i).Value(&data->at(i), filter);
-        }
-        break;
-
-      case XdrOp::FROM_JSON:
-        if (!value_->IsArray()) {
-          AddError("Array type expected.");
-          return;
-        }
-
-        data->resize(value_->Size());
-
-        for (size_t i = 0; i < value_->Size(); ++i) {
-          Element(i).Value(&data->at(i), filter);
-        }
-    }
-  }
-
-  // An STL vector with a simple element type can infer its element value filter
-  // from the type parameters of the array.
-  template <typename V>
-  void Value(std::vector<V>* const data) {
-    Value(data, XdrFilter<V>);
-  }
-
-  // An STL map is mapped to an array of pairs of key and value, because maps
-  // can have non-string keys. There are two filters, for the key type and the
-  // value type.
-  template <typename K, typename V>
-  void Value(std::map<K, V>* const data, XdrFilterType<K> const key_filter,
-             XdrFilterType<V> const value_filter) {
-    switch (op_) {
-      case XdrOp::TO_JSON: {
-        value_->SetArray();
-        value_->Reserve(data->size(), allocator());
-
-        size_t index = 0;
-        for (auto i = data->begin(); i != data->end(); ++i) {
-          XdrContext&& element = Element(index++);
-          element.value_->SetObject();
-
-          K k{i->first};
-          element.Field("@k").Value(&k, key_filter);
-
-          V v{i->second};
-          element.Field("@v").Value(&v, value_filter);
-        }
-        break;
-      }
-
-      case XdrOp::FROM_JSON: {
-        if (!value_->IsArray()) {
-          AddError("Array type expected.");
-          return;
-        }
-
-        // Erase existing data in case there are some left.
-        data->clear();
-
-        size_t index = 0;
-        for (auto i = value_->Begin(); i != value_->End(); ++i) {
-          XdrContext&& element = Element(index++);
-
-          K k;
-          element.Field("@k").Value(&k, key_filter);
-
-          V v;
-          element.Field("@v").Value(&v, value_filter);
-
-          data->emplace(std::move(k), std::move(v));
-        }
-      }
-    }
-  }
-
-  // An STL map with only simple values can infer its key value filters from the
-  // type parameters of the map.
-  template <typename K, typename V>
-  void Value(std::map<K, V>* const data) {
-    Value(data, XdrFilter<K>, XdrFilter<V>);
-  }
-
- private:
-  XdrContext(XdrContext* parent, const char* name, XdrOp op, JsonDoc* doc,
-             JsonValue* value);
-  JsonDoc::AllocatorType& allocator() const { return doc_->GetAllocator(); }
-  XdrContext Field(const char field[]);
-  XdrContext Element(size_t i);
-
-  // Error reporting: Recursively requests the error string from the
-  // parent, and on the way back appends a description of the current
-  // JSON context hierarchy.
-  void AddError(const std::string& message);
-  std::string* AddError();
-
-  // Return the root error string so that IgnoreError() can manipulate it.
-  std::string* GetError();
-
-  // The root of the context tree (where parent_ == nullptr) keeps a
-  // string to write errors to. In an error situation the chain of
-  // parent contexts is traversed up in order to (1) access the error
-  // string to write to, (2) record the current context hierarchy in
-  // an error message. Each level in the context hierarchy is
-  // described using the type of value_ and, if present, name_. name_
-  // is the name of the field for contexts that are values of a field,
-  // otherwise nullptr.
-  XdrContext* const parent_;
-  const char* const name_;
-  std::string* const error_;
-
-  // These three fields represent the context itself: The operation to
-  // perform (read or write), the value it will be performed on, and
-  // the document the value is part of, in order to access the
-  // allocator.
-  const XdrOp op_;
-  JsonDoc* const doc_;
-  JsonValue* const value_;
-
-  // A JSON value to continue processing on when the expected one is
-  // not found in the JSON AST, to avoid value_ becoming null. It
-  // needs to be thread local because it is a global that's modified
-  // potentially by every ongoing XDR invocation.
-  static thread_local JsonValue null_;
-
-  // All Xdr* functions take a XdrContext* and pass it on. We might
-  // want to change this once we support asynchronous input/output
-  // operations, for example directly to/from a Ledger page rather
-  // than just the JSON DOM.
-  FXL_DISALLOW_COPY_AND_ASSIGN(XdrContext);
-};
-
-// This filter function works for all types for which XdrContext has a Value()
-// method defined.
-template <typename V>
-void XdrFilter(XdrContext* const xdr, V* const value) {
-  xdr->Value(value);
-}
-
-// Clients use the following functions as entry points.
-
-// A wrapper function to read data from a JSON document. This may fail if the
-// JSON document doesn't match the structure required by any of the filter
-// versions. In that case it logs an error and returns false. Clients are
-// expected to either crash or recover e.g. by ignoring the value.
-//
-// The items in the filter versions list are tried in turn until one succeeds.
-// The filter versions list must end with a nullptr entry to mark the end.
-template <typename D, typename V>
-bool XdrRead(JsonDoc* const doc, D* const data,
-             XdrFilterList<V> filter_versions) {
-  std::vector<std::string> errors;
-  for (XdrFilterList<V> filter = filter_versions; *filter; ++filter) {
-    std::string error;
-    XdrContext xdr(XdrOp::FROM_JSON, doc, &error);
-    xdr.Value(data, *filter);
-
-    if (error.empty()) {
-      return true;
-    }
-
-    FXL_LOG(INFO) << "Filter failed, trying previous version.";
-    errors.emplace_back(std::move(error));
-  }
-
-  FXL_LOG(ERROR) << "XdrRead: No filter version succeeded"
-                 << " to extract data from JSON: "
-                 << JsonValueToPrettyString(*doc) << std::endl;
-  for (const std::string& error : errors) {
-    FXL_LOG(INFO) << "XdrRead error message: " << error;
-  }
-
-  return false;
-}
-
-// A wrapper function to read data from a JSON string. This may fail if the JSON
-// doesn't parse or doesn't match the structure required by the filter version
-// list. In that case it logs an error and returns false. Clients are expected
-// to either crash or recover e.g. by ignoring the value.
-template <typename D, typename V>
-bool XdrRead(const std::string& json, D* const data,
-             XdrFilterList<V> filter_versions) {
-  JsonDoc doc;
-  doc.Parse(json);
-  if (doc.HasParseError()) {
-    FXL_LOG(ERROR) << "Unable to parse data as JSON: " << json;
-    return false;
-  }
-
-  return XdrRead(&doc, data, filter_versions);
-}
-
-// A wrapper function to write data as JSON doc. This never fails. It always
-// only uses the first version of the filter. It takes a filter version list
-// anyway for symmetry with XdrRead(), so that the same filter version list
-// constant can be passed to both XdrRead and XdrWrite.
-template <typename D, typename V>
-void XdrWrite(JsonDoc* const doc, D* const data,
-              XdrFilterList<V> filter_versions) {
-  std::string error;
-  XdrContext xdr(XdrOp::TO_JSON, doc, &error);
-  xdr.Value(data, filter_versions[0]);
-  FXL_DCHECK(error.empty())
-      << "There are no errors possible in XdrOp::TO_JSON: " << std::endl
-      << error << std::endl
-      << JsonValueToPrettyString(*doc) << std::endl;
-}
-
-// A wrapper function to write data as JSON to a string. This never fails.
-template <typename D, typename V>
-void XdrWrite(std::string* const json, D* const data,
-              XdrFilterList<V> filter_versions) {
-  JsonDoc doc;
-  XdrWrite(&doc, data, filter_versions);
-  *json = JsonValueToString(doc);
-}
-
-// A wrapper function to return data as a JSON string. This never fails.
-template <typename D, typename V>
-std::string XdrWrite(D* const data, XdrFilterList<V> filter_versions) {
-  std::string json;
-  XdrWrite(&json, data, filter_versions);
-  return json;
-}
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_FIDL_JSON_XDR_H_
diff --git a/lib/fidl/json_xdr_unittest.cc b/lib/fidl/json_xdr_unittest.cc
deleted file mode 100644
index 9576ddc..0000000
--- a/lib/fidl/json_xdr_unittest.cc
+++ /dev/null
@@ -1,867 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/fidl/json_xdr.h"
-
-#include <map>
-#include <vector>
-
-#include <test/peridot/lib/fidl/jsonxdr/cpp/fidl.h>
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-namespace json_xdr_unittest = ::test::peridot::lib::fidl::jsonxdr;
-
-struct T {
-  int i;
-  std::string s;
-  bool b;
-
-  std::vector<int> vi;
-  std::vector<std::string> vs;
-  std::vector<bool> vb;
-
-  std::map<int, int> mi;
-  std::map<std::string, int> ms;
-  std::map<bool, bool> mb;
-};
-
-void XdrT_v1(XdrContext* const xdr, T* const data) {
-  xdr->Field("i", &data->i);
-  xdr->Field("s", &data->s);
-  xdr->Field("b", &data->b);
-  xdr->Field("vi", &data->vi);
-  xdr->Field("vs", &data->vs);
-  xdr->Field("vb", &data->vb);
-  xdr->Field("mi", &data->mi);
-  xdr->Field("ms", &data->ms);
-  xdr->Field("mb", &data->mb);
-}
-
-constexpr XdrFilterType<T> XdrT[] = {
-    XdrT_v1,
-    nullptr,
-};
-
-TEST(Xdr, Struct) {
-  std::string json;
-
-  T t0;
-  t0.i = 1;
-  t0.s = "2";
-  t0.b = true;
-  t0.vi.push_back(3);
-  t0.vs.emplace_back("4");
-  t0.vb.push_back(true);
-  t0.mi[5] = 6;
-  t0.ms["7"] = 8;
-  t0.mb[true] = false;
-  XdrWrite(&json, &t0, XdrT);
-
-  T t1;
-  EXPECT_TRUE(XdrRead(json, &t1, XdrT));
-
-  EXPECT_EQ(t1.i, t0.i);
-  EXPECT_EQ(t1.s, t0.s);
-  EXPECT_EQ(t1.b, t0.b);
-  EXPECT_EQ(t1.vi, t0.vi);
-  EXPECT_EQ(t1.vs, t0.vs);
-  EXPECT_EQ(t1.vb, t0.vb);
-  EXPECT_EQ(t1.mi, t0.mi);
-  EXPECT_EQ(t1.ms, t0.ms);
-  EXPECT_EQ(t1.mb, t0.mb);
-}
-
-void XdrT_v2(XdrContext* const xdr, T* const data) {
-  xdr->Field("i", &data->i);
-  xdr->Field("s", &data->s);
-  xdr->Field("b", &data->b);
-  xdr->Field("vi", &data->vi);
-  xdr->Field("vs_v2", &data->vs);
-  xdr->Field("vb", &data->vb);
-  xdr->Field("mi", &data->mi);
-  xdr->Field("ms", &data->ms);
-  xdr->Field("mb", &data->mb);
-}
-
-TEST(Xdr, StructVersions) {
-  // Filter versioning with version lists: Write with an old version of the
-  // filter, then attempt to read with a newer version only, which fails.
-  // Attempt again with a filter verision list that has both the old and the new
-  // version of filter, which succeeds.
-
-  std::string json;
-
-  T t0;
-  t0.i = 1;
-  t0.s = "2";
-  t0.b = true;
-  t0.vi.push_back(3);
-  t0.vs.emplace_back("4");
-  t0.vb.push_back(true);
-  t0.mi[5] = 6;
-  t0.ms["7"] = 8;
-  t0.mb[true] = false;
-  XdrWrite(&json, &t0, XdrT);
-
-  T t1;
-
-  constexpr XdrFilterType<T> filter_versions_v2_only[] = {
-      XdrT_v2,
-      nullptr,
-  };
-
-  EXPECT_FALSE(XdrRead(json, &t1, filter_versions_v2_only));
-
-  constexpr XdrFilterType<T> filter_versions_all[] = {
-      XdrT_v2,
-      XdrT_v1,
-      nullptr,
-  };
-
-  EXPECT_TRUE(XdrRead(json, &t1, filter_versions_all));
-}
-
-void XdrT_v3(XdrContext* const xdr, T* const data) {
-  if (!xdr->Version(3)) {
-    return;
-  }
-
-  xdr->Field("i", &data->i);
-  xdr->Field("s", &data->s);
-  xdr->Field("b", &data->b);
-  xdr->Field("vi", &data->vi);
-  xdr->Field("vs", &data->vs);
-  xdr->Field("vb", &data->vb);
-  xdr->Field("mi", &data->mi);
-  xdr->Field("ms", &data->ms);
-  xdr->Field("mb", &data->mb);
-}
-
-TEST(Xdr, StructVersionsExplicitFallback) {
-  // Filter versioning with explicit version numbers: Write with an old version
-  // of the filter without version number, then attempt to read with a filter
-  // that expects a version number, which fails. Attempt again with a filter
-  // version list that has both the old and the new version of filter, which
-  // succeeds.
-
-  std::string json;
-
-  T t0;
-  t0.i = 1;
-  t0.s = "2";
-  t0.b = true;
-  t0.vi.push_back(3);
-  t0.vs.emplace_back("4");
-  t0.vb.push_back(true);
-  t0.mi[5] = 6;
-  t0.ms["7"] = 8;
-  t0.mb[true] = false;
-  XdrWrite(&json, &t0, XdrT);
-
-  T t1;
-
-  constexpr XdrFilterType<T> filter_versions_v3_only[] = {
-      XdrT_v3,
-      nullptr,
-  };
-
-  EXPECT_FALSE(XdrRead(json, &t1, filter_versions_v3_only));
-
-  constexpr XdrFilterType<T> filter_versions_all[] = {
-      XdrT_v3,
-      XdrT_v1,
-      nullptr,
-  };
-
-  EXPECT_TRUE(XdrRead(json, &t1, filter_versions_all));
-}
-
-void XdrT_v4(XdrContext* const xdr, T* const data) {
-  if (!xdr->Version(4)) {
-    return;
-  }
-
-  xdr->Field("i", &data->i);
-  xdr->Field("s", &data->s);
-  xdr->Field("b", &data->b);
-  xdr->Field("vi", &data->vi);
-  xdr->Field("vs", &data->vs);
-  xdr->Field("vb", &data->vb);
-  xdr->Field("mi", &data->mi);
-  xdr->Field("ms", &data->ms);
-  xdr->Field("mb", &data->mb);
-}
-
-TEST(Xdr, StructVersionsExplicit) {
-  // Filter versioning with explicit version numbers: Write with a version of
-  // the filter with a version number, then attempt to read it back with the
-  // same filter, which succeeds. Attempt to read it with a newer version
-  // filter, which fails.
-
-  std::string json;
-
-  constexpr XdrFilterType<T> filter_versions_v3_only[] = {
-      XdrT_v3,
-      nullptr,
-  };
-
-  T t0;
-  t0.i = 1;
-  t0.s = "2";
-  t0.b = true;
-  t0.vi.push_back(3);
-  t0.vs.emplace_back("4");
-  t0.vb.push_back(true);
-  t0.mi[5] = 6;
-  t0.ms["7"] = 8;
-  t0.mb[true] = false;
-  XdrWrite(&json, &t0, filter_versions_v3_only);
-
-  T t1;
-  EXPECT_TRUE(XdrRead(json, &t1, filter_versions_v3_only));
-
-  constexpr XdrFilterType<T> filter_versions_v4_only[] = {
-      XdrT_v4,
-      nullptr,
-  };
-
-  T t2;
-  EXPECT_FALSE(XdrRead(json, &t2, filter_versions_v4_only));
-
-  constexpr XdrFilterType<T> filter_versions_all[] = {
-      XdrT_v4, XdrT_v3, XdrT_v2, XdrT_v1, nullptr,
-  };
-
-  T t3;
-  EXPECT_TRUE(XdrRead(json, &t3, filter_versions_all));
-}
-
-void XdrStruct(XdrContext* const xdr, json_xdr_unittest::Struct* const data) {
-  xdr->Field("item", &data->item);
-}
-
-void XdrUnion(XdrContext* const xdr, json_xdr_unittest::Union* const data) {
-  // NOTE(mesch): There is no direct support for FIDL unions in XdrContext,
-  // mostly because we cannot point a union field in the same way s we can point
-  // to a struct field.
-  //
-  // The below is the current best way we have figured out to XDR unions. A
-  // lager and more realistic (and slightly different) real life example of
-  // XDRing a FIDL union type is XdrNoun() in story_controller_impl.cc.
-
-  static constexpr char kTag[] = "@tag";
-  static constexpr char kValue[] = "@value";
-  static constexpr char kString[] = "string";
-  static constexpr char kInt32[] = "int32";
-
-  switch (xdr->op()) {
-    case XdrOp::FROM_JSON: {
-      std::string tag;
-      xdr->Field(kTag, &tag);
-
-      if (tag == kString) {
-        std::string value;
-        xdr->Field(kValue, &value);
-        data->set_string(std::move(value));
-
-      } else if (tag == kInt32) {
-        int32_t value;
-        xdr->Field(kValue, &value);
-        data->set_int32(std::move(value));
-
-      } else {
-        ASSERT_TRUE(false) << "XdrUnion FROM_JSON unknown tag: " << tag;
-      }
-      break;
-    }
-
-    case XdrOp::TO_JSON: {
-      std::string tag;
-
-      switch (data->Which()) {
-        case json_xdr_unittest::Union::Tag::kString: {
-          tag = kString;
-          std::string value = data->string();
-          xdr->Field(kValue, &value);
-          break;
-        }
-        case json_xdr_unittest::Union::Tag::kInt32: {
-          tag = kInt32;
-          int32_t value = data->int32();
-          xdr->Field(kValue, &value);
-          break;
-        }
-        case json_xdr_unittest::Union::Tag::Invalid:
-          ASSERT_TRUE(false) << "XdrUnion TO_JSON unknown tag: "
-                             << static_cast<int>(data->Which());
-          break;
-      }
-
-      xdr->Field(kTag, &tag);
-      break;
-    }
-  }
-}
-
-// Data can be any of RequiredData, RequiredRepeatedRequiredData,
-// OptionalRepeatedRequiredData.
-template <typename Data>
-void XdrRequiredData_v1(XdrContext* const xdr, Data* const data) {
-  xdr->Field("string", &data->string);
-  xdr->Field("bool", &data->bool_);
-  xdr->Field("int8", &data->int8);
-  xdr->Field("int16", &data->int16);
-  xdr->Field("int32", &data->int32);
-  xdr->Field("int64", &data->int64);
-  xdr->Field("uint8", &data->uint8);
-  xdr->Field("uint16", &data->uint16);
-  xdr->Field("uint32", &data->uint32);
-  xdr->Field("uint64", &data->uint64);
-  xdr->Field("float32", &data->float32);
-  xdr->Field("float64", &data->float64);
-  xdr->Field("struct", &data->struct_, XdrStruct);
-  xdr->Field("enum", &data->enum_);
-  xdr->Field("union", &data->union_, XdrUnion);
-}
-
-// Data can be any of OptionalData, RequiredRepeatedOptionalData,
-// OptionalRepeatedOptionalData.
-template <typename Data>
-void XdrOptionalData_v1(XdrContext* const xdr, Data* const data) {
-  xdr->Field("string", &data->string);
-  xdr->Field("struct", &data->struct_, XdrStruct);
-  xdr->Field("union", &data->union_, XdrUnion);
-}
-
-constexpr XdrFilterType<json_xdr_unittest::RequiredData> XdrRequiredData[] = {
-    XdrRequiredData_v1<json_xdr_unittest::RequiredData>,
-    nullptr,
-};
-
-TEST(Xdr, FidlRequired) {
-  std::string json;
-
-  json_xdr_unittest::RequiredData t0;
-
-  t0.string = "1";
-  t0.bool_ = true;
-  t0.int8 = 2;
-  t0.int16 = 3;
-  t0.int32 = 4;
-  t0.int64 = 5;
-  t0.uint8 = 6;
-  t0.uint16 = 7;
-  t0.uint32 = 8;
-  t0.uint64 = 9;
-  t0.float32 = 10;
-  t0.float64 = 11;
-  t0.struct_.item = 12;
-  t0.enum_ = json_xdr_unittest::Enum::ONE;
-  t0.union_.set_int32(13);
-
-  XdrWrite(&json, &t0, XdrRequiredData);
-
-  json_xdr_unittest::RequiredData t1;
-  EXPECT_TRUE(XdrRead(json, &t1, XdrRequiredData));
-
-  EXPECT_EQ(t1, t0) << json;
-
-  // Technically not needed because the equality should cover this, but makes it
-  // more transparent what's going on.
-  EXPECT_EQ("1", t1.string);
-  EXPECT_TRUE(t1.bool_);
-  EXPECT_EQ(2, t1.int8);
-  EXPECT_EQ(3, t1.int16);
-  EXPECT_EQ(4, t1.int32);
-  EXPECT_EQ(5, t1.int64);
-  EXPECT_EQ(6u, t1.uint8);
-  EXPECT_EQ(7u, t1.uint16);
-  EXPECT_EQ(8u, t1.uint32);
-  EXPECT_EQ(9u, t1.uint64);
-  EXPECT_EQ(10.0f, t1.float32);
-  EXPECT_EQ(11.0, t1.float64);
-  EXPECT_EQ(12, t1.struct_.item);
-  EXPECT_EQ(json_xdr_unittest::Enum::ONE, t1.enum_);
-  EXPECT_TRUE(t1.union_.is_int32());
-  EXPECT_EQ(13, t1.union_.int32());
-}
-
-constexpr XdrFilterType<json_xdr_unittest::OptionalData> XdrOptionalData[] = {
-    XdrOptionalData_v1<json_xdr_unittest::OptionalData>,
-    nullptr,
-};
-
-TEST(Xdr, FidlOptional) {
-  std::string json;
-
-  json_xdr_unittest::OptionalData t0;
-
-  t0.string = "1";
-  t0.struct_ = json_xdr_unittest::Struct::New();
-  t0.struct_->item = 12;
-  t0.union_ = json_xdr_unittest::Union::New();
-  t0.union_->set_int32(13);
-
-  XdrWrite(&json, &t0, XdrOptionalData);
-
-  json_xdr_unittest::OptionalData t1;
-  EXPECT_TRUE(XdrRead(json, &t1, XdrOptionalData));
-
-  EXPECT_EQ(t1, t0) << json;
-
-  // See comment in FidlRequired.
-  EXPECT_FALSE(t1.string.is_null());
-  EXPECT_EQ("1", t1.string);
-
-  EXPECT_FALSE(nullptr == t1.struct_);
-  EXPECT_EQ(12, t1.struct_->item);
-
-  EXPECT_FALSE(nullptr == t1.union_);
-  EXPECT_TRUE(t1.union_->is_int32());
-  EXPECT_EQ(13, t1.union_->int32());
-
-  t1.string.reset();
-  t1.struct_.reset();
-  t1.union_.reset();
-
-  XdrWrite(&json, &t1, XdrOptionalData);
-
-  json_xdr_unittest::OptionalData t2;
-  EXPECT_TRUE(XdrRead(json, &t2, XdrOptionalData));
-
-  EXPECT_EQ(t2, t1) << json;
-
-  // See comment in FidlRequired.
-  EXPECT_TRUE(t2.string.is_null());
-  EXPECT_TRUE(nullptr == t2.struct_);
-  EXPECT_TRUE(nullptr == t2.union_);
-}
-
-constexpr XdrFilterType<json_xdr_unittest::RequiredRepeatedRequiredData>
-    XdrRequiredRepeatedRequiredData[] = {
-        XdrRequiredData_v1<json_xdr_unittest::RequiredRepeatedRequiredData>,
-        nullptr,
-};
-
-TEST(Xdr, FidlRequiredRepeatedRequired) {
-  std::string json;
-
-  json_xdr_unittest::RequiredRepeatedRequiredData t0;
-
-  t0.string.push_back("1");
-  t0.bool_.push_back(true);
-  t0.int8.push_back(2);
-  t0.int16.push_back(3);
-  t0.int32.push_back(4);
-  t0.int64.push_back(5);
-  t0.uint8.push_back(6);
-  t0.uint16.push_back(7);
-  t0.uint32.push_back(8);
-  t0.uint64.push_back(9);
-  t0.float32.push_back(10);
-  t0.float64.push_back(11);
-  t0.struct_.push_back({12});
-  t0.enum_.push_back(json_xdr_unittest::Enum::ONE);
-
-  json_xdr_unittest::Union u;
-  u.set_int32(13);
-  t0.union_.push_back(std::move(u));
-
-  XdrWrite(&json, &t0, XdrRequiredRepeatedRequiredData);
-
-  json_xdr_unittest::RequiredRepeatedRequiredData t1;
-  EXPECT_TRUE(XdrRead(json, &t1, XdrRequiredRepeatedRequiredData));
-
-  EXPECT_EQ(t1, t0) << json;
-
-  EXPECT_EQ(1u, t1.string.size());
-  EXPECT_EQ(1u, t1.bool_.size());
-  EXPECT_EQ(1u, t1.int8.size());
-  EXPECT_EQ(1u, t1.int16.size());
-  EXPECT_EQ(1u, t1.int32.size());
-  EXPECT_EQ(1u, t1.int64.size());
-  EXPECT_EQ(1u, t1.uint8.size());
-  EXPECT_EQ(1u, t1.uint16.size());
-  EXPECT_EQ(1u, t1.uint32.size());
-  EXPECT_EQ(1u, t1.uint64.size());
-  EXPECT_EQ(1u, t1.float32.size());
-  EXPECT_EQ(1u, t1.float64.size());
-  EXPECT_EQ(1u, t1.struct_.size());
-  EXPECT_EQ(1u, t1.enum_.size());
-  EXPECT_EQ(1u, t1.union_.size());
-
-  EXPECT_EQ("1", t1.string.at(0));
-  EXPECT_TRUE(t1.bool_.at(0));
-  EXPECT_EQ(2, t1.int8.at(0));
-  EXPECT_EQ(3, t1.int16.at(0));
-  EXPECT_EQ(4, t1.int32.at(0));
-  EXPECT_EQ(5, t1.int64.at(0));
-  EXPECT_EQ(6u, t1.uint8.at(0));
-  EXPECT_EQ(7u, t1.uint16.at(0));
-  EXPECT_EQ(8u, t1.uint32.at(0));
-  EXPECT_EQ(9u, t1.uint64.at(0));
-  EXPECT_EQ(10.0f, t1.float32.at(0));
-  EXPECT_EQ(11.0, t1.float64.at(0));
-  EXPECT_EQ(12, t1.struct_.at(0).item);
-  EXPECT_EQ(json_xdr_unittest::Enum::ONE, t1.enum_.at(0));
-  EXPECT_TRUE(t1.union_.at(0).is_int32());
-  EXPECT_EQ(13, t1.union_.at(0).int32());
-}
-
-constexpr XdrFilterType<json_xdr_unittest::RequiredRepeatedOptionalData>
-    XdrRequiredRepeatedOptionalData[] = {
-        XdrOptionalData_v1<json_xdr_unittest::RequiredRepeatedOptionalData>,
-        nullptr,
-};
-
-TEST(Xdr, FidlRequiredRepeatedOptional) {
-  std::string json;
-
-  json_xdr_unittest::RequiredRepeatedOptionalData t0;
-  t0.string.push_back("1");
-
-  json_xdr_unittest::StructPtr s = json_xdr_unittest::Struct::New();
-  s->item = 12;
-  t0.struct_.push_back(std::move(s));
-
-  json_xdr_unittest::UnionPtr u = json_xdr_unittest::Union::New();
-  u->set_int32(13);
-  t0.union_.push_back(std::move(u));
-
-  XdrWrite(&json, &t0, XdrRequiredRepeatedOptionalData);
-
-  json_xdr_unittest::RequiredRepeatedOptionalData t1;
-  EXPECT_TRUE(XdrRead(json, &t1, XdrRequiredRepeatedOptionalData));
-
-  EXPECT_EQ(t1, t0) << json;
-
-  // See comment in FidlRequired.
-  EXPECT_EQ(1u, t1.string.size());
-  EXPECT_EQ(1u, t1.struct_.size());
-  EXPECT_EQ(1u, t1.union_.size());
-
-  EXPECT_FALSE(t1.string.at(0).is_null());
-  EXPECT_EQ("1", t1.string.at(0));
-
-  EXPECT_FALSE(nullptr == t1.struct_.at(0));
-  EXPECT_EQ(12, t1.struct_.at(0)->item);
-
-  EXPECT_FALSE(nullptr == t1.union_.at(0));
-  EXPECT_TRUE(t1.union_.at(0)->is_int32());
-  EXPECT_EQ(13, t1.union_.at(0)->int32());
-
-  t1.string.at(0).reset();
-  t1.struct_.at(0).reset();
-  t1.union_.at(0).reset();
-
-  XdrWrite(&json, &t1, XdrRequiredRepeatedOptionalData);
-
-  json_xdr_unittest::RequiredRepeatedOptionalData t2;
-  EXPECT_TRUE(XdrRead(json, &t2, XdrRequiredRepeatedOptionalData));
-
-  EXPECT_EQ(t2, t1) << json;
-
-  // See comment in FidlRequired.
-  EXPECT_EQ(1u, t2.string.size());
-  EXPECT_EQ(1u, t2.struct_.size());
-  EXPECT_EQ(1u, t2.union_.size());
-
-  EXPECT_TRUE(t2.string.at(0).is_null());
-  EXPECT_TRUE(nullptr == t2.struct_.at(0));
-  EXPECT_TRUE(nullptr == t2.union_.at(0));
-}
-
-constexpr XdrFilterType<json_xdr_unittest::OptionalRepeatedRequiredData>
-    XdrOptionalRepeatedRequiredData[] = {
-        XdrRequiredData_v1<json_xdr_unittest::OptionalRepeatedRequiredData>,
-        nullptr,
-};
-
-TEST(Xdr, FidlOptionalRepeatedRequired) {
-  std::string json;
-
-  json_xdr_unittest::OptionalRepeatedRequiredData t0;
-
-  t0.string.push_back("1");
-  t0.bool_.push_back(true);
-  t0.int8.push_back(2);
-  t0.int16.push_back(3);
-  t0.int32.push_back(4);
-  t0.int64.push_back(5);
-  t0.uint8.push_back(6);
-  t0.uint16.push_back(7);
-  t0.uint32.push_back(8);
-  t0.uint64.push_back(9);
-  t0.float32.push_back(10);
-  t0.float64.push_back(11);
-  t0.struct_.push_back({12});
-  t0.enum_.push_back(json_xdr_unittest::Enum::ONE);
-  json_xdr_unittest::Union u;
-  u.set_int32(13);
-  t0.union_.push_back(std::move(u));
-
-  XdrWrite(&json, &t0, XdrOptionalRepeatedRequiredData);
-
-  json_xdr_unittest::OptionalRepeatedRequiredData t1;
-  EXPECT_TRUE(XdrRead(json, &t1, XdrOptionalRepeatedRequiredData));
-
-  EXPECT_EQ(t1, t0) << json;
-
-  EXPECT_FALSE(t1.string.is_null());
-  EXPECT_FALSE(t1.bool_.is_null());
-  EXPECT_FALSE(t1.int8.is_null());
-  EXPECT_FALSE(t1.int16.is_null());
-  EXPECT_FALSE(t1.int32.is_null());
-  EXPECT_FALSE(t1.int64.is_null());
-  EXPECT_FALSE(t1.uint8.is_null());
-  EXPECT_FALSE(t1.uint16.is_null());
-  EXPECT_FALSE(t1.uint32.is_null());
-  EXPECT_FALSE(t1.uint64.is_null());
-  EXPECT_FALSE(t1.float32.is_null());
-  EXPECT_FALSE(t1.float64.is_null());
-  EXPECT_FALSE(t1.struct_.is_null());
-  EXPECT_FALSE(t1.enum_.is_null());
-  EXPECT_FALSE(t1.union_.is_null());
-
-  EXPECT_EQ(1u, t1.string->size());
-  EXPECT_EQ(1u, t1.bool_->size());
-  EXPECT_EQ(1u, t1.int8->size());
-  EXPECT_EQ(1u, t1.int16->size());
-  EXPECT_EQ(1u, t1.int32->size());
-  EXPECT_EQ(1u, t1.int64->size());
-  EXPECT_EQ(1u, t1.uint8->size());
-  EXPECT_EQ(1u, t1.uint16->size());
-  EXPECT_EQ(1u, t1.uint32->size());
-  EXPECT_EQ(1u, t1.uint64->size());
-  EXPECT_EQ(1u, t1.float32->size());
-  EXPECT_EQ(1u, t1.float64->size());
-  EXPECT_EQ(1u, t1.struct_->size());
-  EXPECT_EQ(1u, t1.enum_->size());
-  EXPECT_EQ(1u, t1.union_->size());
-
-  EXPECT_EQ("1", t1.string->at(0));
-  EXPECT_TRUE(t1.bool_->at(0));
-  EXPECT_EQ(2, t1.int8->at(0));
-  EXPECT_EQ(3, t1.int16->at(0));
-  EXPECT_EQ(4, t1.int32->at(0));
-  EXPECT_EQ(5, t1.int64->at(0));
-  EXPECT_EQ(6u, t1.uint8->at(0));
-  EXPECT_EQ(7u, t1.uint16->at(0));
-  EXPECT_EQ(8u, t1.uint32->at(0));
-  EXPECT_EQ(9u, t1.uint64->at(0));
-  EXPECT_EQ(10.0f, t1.float32->at(0));
-  EXPECT_EQ(11.0, t1.float64->at(0));
-  EXPECT_EQ(12, t1.struct_->at(0).item);
-  EXPECT_EQ(json_xdr_unittest::Enum::ONE, t1.enum_->at(0));
-  EXPECT_TRUE(t1.union_->at(0).is_int32());
-  EXPECT_EQ(13, t1.union_->at(0).int32());
-
-  t1.string.reset();
-  t1.bool_.reset();
-  t1.int8.reset();
-  t1.int16.reset();
-  t1.int32.reset();
-  t1.int64.reset();
-  t1.uint8.reset();
-  t1.uint16.reset();
-  t1.uint32.reset();
-  t1.uint64.reset();
-  t1.float32.reset();
-  t1.float64.reset();
-  t1.struct_.reset();
-  t1.enum_.reset();
-  t1.union_.reset();
-
-  XdrWrite(&json, &t1, XdrOptionalRepeatedRequiredData);
-
-  json_xdr_unittest::OptionalRepeatedRequiredData t2;
-  EXPECT_TRUE(XdrRead(json, &t2, XdrOptionalRepeatedRequiredData));
-
-  EXPECT_EQ(t2, t1) << json;
-
-  EXPECT_TRUE(t2.string.is_null());
-  EXPECT_TRUE(t2.bool_.is_null());
-  EXPECT_TRUE(t2.int8.is_null());
-  EXPECT_TRUE(t2.int16.is_null());
-  EXPECT_TRUE(t2.int32.is_null());
-  EXPECT_TRUE(t2.int64.is_null());
-  EXPECT_TRUE(t2.uint8.is_null());
-  EXPECT_TRUE(t2.uint16.is_null());
-  EXPECT_TRUE(t2.uint32.is_null());
-  EXPECT_TRUE(t2.uint64.is_null());
-  EXPECT_TRUE(t2.float32.is_null());
-  EXPECT_TRUE(t2.float64.is_null());
-  EXPECT_TRUE(t2.struct_.is_null());
-  EXPECT_TRUE(t2.enum_.is_null());
-  EXPECT_TRUE(t2.union_.is_null());
-
-  EXPECT_EQ(0u, t2.string->size());
-  EXPECT_EQ(0u, t2.bool_->size());
-  EXPECT_EQ(0u, t2.int8->size());
-  EXPECT_EQ(0u, t2.int16->size());
-  EXPECT_EQ(0u, t2.int32->size());
-  EXPECT_EQ(0u, t2.int64->size());
-  EXPECT_EQ(0u, t2.uint8->size());
-  EXPECT_EQ(0u, t2.uint16->size());
-  EXPECT_EQ(0u, t2.uint32->size());
-  EXPECT_EQ(0u, t2.uint64->size());
-  EXPECT_EQ(0u, t2.float32->size());
-  EXPECT_EQ(0u, t2.float64->size());
-  EXPECT_EQ(0u, t2.struct_->size());
-  EXPECT_EQ(0u, t2.enum_->size());
-  EXPECT_EQ(0u, t2.union_->size());
-}
-
-constexpr XdrFilterType<json_xdr_unittest::OptionalRepeatedOptionalData>
-    XdrOptionalRepeatedOptionalData[] = {
-        XdrOptionalData_v1<json_xdr_unittest::OptionalRepeatedOptionalData>,
-        nullptr,
-};
-
-TEST(Xdr, FidlOptionalRepeatedOptional) {
-  std::string json;
-
-  json_xdr_unittest::OptionalRepeatedOptionalData t0;
-  t0.string.push_back("1");
-
-  json_xdr_unittest::StructPtr s = json_xdr_unittest::Struct::New();
-  s->item = 12;
-  t0.struct_.push_back(std::move(s));
-
-  json_xdr_unittest::UnionPtr u = json_xdr_unittest::Union::New();
-  u->set_int32(13);
-  t0.union_.push_back(std::move(u));
-
-  XdrWrite(&json, &t0, XdrOptionalRepeatedOptionalData);
-
-  json_xdr_unittest::OptionalRepeatedOptionalData t1;
-  EXPECT_TRUE(XdrRead(json, &t1, XdrOptionalRepeatedOptionalData));
-
-  EXPECT_EQ(t1, t0) << json;
-
-  // See comment in FidlRequired.
-  EXPECT_FALSE(t1.string.is_null());
-  EXPECT_FALSE(t1.struct_.is_null());
-  EXPECT_FALSE(t1.union_.is_null());
-
-  EXPECT_EQ(1u, t1.string->size());
-  EXPECT_EQ(1u, t1.struct_->size());
-  EXPECT_EQ(1u, t1.union_->size());
-
-  EXPECT_FALSE(t1.string->at(0).is_null());
-  EXPECT_EQ("1", t1.string->at(0));
-
-  EXPECT_FALSE(nullptr == t1.struct_->at(0));
-  EXPECT_EQ(12, t1.struct_->at(0)->item);
-
-  EXPECT_FALSE(nullptr == t1.union_->at(0));
-  EXPECT_TRUE(t1.union_->at(0)->is_int32());
-  EXPECT_EQ(13, t1.union_->at(0)->int32());
-
-  t1.string->at(0).reset();
-  t1.struct_->at(0).reset();
-  t1.union_->at(0).reset();
-
-  XdrWrite(&json, &t1, XdrOptionalRepeatedOptionalData);
-
-  json_xdr_unittest::OptionalRepeatedOptionalData t2;
-  EXPECT_TRUE(XdrRead(json, &t2, XdrOptionalRepeatedOptionalData));
-
-  EXPECT_EQ(t2, t1) << json;
-
-  // See comment in FidlRequired.
-  EXPECT_FALSE(t2.string.is_null());
-  EXPECT_FALSE(t2.struct_.is_null());
-  EXPECT_FALSE(t2.union_.is_null());
-
-  EXPECT_EQ(1u, t2.string->size());
-  EXPECT_EQ(1u, t2.struct_->size());
-  EXPECT_EQ(1u, t2.union_->size());
-
-  EXPECT_TRUE(t2.string->at(0).is_null());
-  EXPECT_TRUE(nullptr == t2.struct_->at(0));
-  EXPECT_TRUE(nullptr == t2.union_->at(0));
-
-  t2.string.reset();
-  t2.struct_.reset();
-  t2.union_.reset();
-
-  XdrWrite(&json, &t2, XdrOptionalRepeatedOptionalData);
-
-  json_xdr_unittest::OptionalRepeatedOptionalData t3;
-  EXPECT_TRUE(XdrRead(json, &t3, XdrOptionalRepeatedOptionalData));
-
-  EXPECT_EQ(t3, t2) << json;
-
-  // See comment in FidlRequired.
-  EXPECT_TRUE(t3.string.is_null());
-  EXPECT_TRUE(t3.struct_.is_null());
-  EXPECT_TRUE(t3.union_.is_null());
-
-  EXPECT_EQ(0u, t3.string->size());
-  EXPECT_EQ(0u, t3.struct_->size());
-  EXPECT_EQ(0u, t3.union_->size());
-}
-
-constexpr XdrFilterType<json_xdr_unittest::ArrayData> XdrArrayData[] = {
-    XdrRequiredData_v1<json_xdr_unittest::ArrayData>,
-    nullptr,
-};
-
-TEST(Xdr, FidlArray) {
-  std::string json;
-
-  json_xdr_unittest::ArrayData t0;
-
-  for (size_t i=0; i<t0.string.size(); i++) {
-    t0.string.at(i) = "1";
-    t0.bool_.at(i) = true;
-    t0.int8.at(i) = 2;
-    t0.int16.at(i) = 3;
-    t0.int32.at(i) = 4;
-    t0.int64.at(i) = 5;
-    t0.uint8.at(i) = 6;
-    t0.uint16.at(i) = 7;
-    t0.uint32.at(i) = 8;
-    t0.uint64.at(i) = 9;
-    t0.float32.at(i) = 10;
-    t0.float64.at(i) = 11;
-    t0.struct_.at(i).item = 12;
-    t0.enum_.at(i) = json_xdr_unittest::Enum::ONE;
-    t0.union_.at(i).set_int32(13);
-  }
-
-  XdrWrite(&json, &t0, XdrArrayData);
-
-  json_xdr_unittest::ArrayData t1;
-  EXPECT_TRUE(XdrRead(json, &t1, XdrArrayData));
-
-  EXPECT_EQ(t1, t0) << json;
-
-  // Technically not needed because the equality should cover this, but makes it
-  // more transparent what's going on.
-  EXPECT_EQ("1", t1.string.at(0));
-  EXPECT_TRUE(t1.bool_.at(0));
-  EXPECT_EQ(2, t1.int8.at(0));
-  EXPECT_EQ(3, t1.int16.at(0));
-  EXPECT_EQ(4, t1.int32.at(0));
-  EXPECT_EQ(5, t1.int64.at(0));
-  EXPECT_EQ(6u, t1.uint8.at(0));
-  EXPECT_EQ(7u, t1.uint16.at(0));
-  EXPECT_EQ(8u, t1.uint32.at(0));
-  EXPECT_EQ(9u, t1.uint64.at(0));
-  EXPECT_EQ(10.0f, t1.float32.at(0));
-  EXPECT_EQ(11.0, t1.float64.at(0));
-  EXPECT_EQ(12, t1.struct_.at(0).item);
-  EXPECT_EQ(json_xdr_unittest::Enum::ONE, t1.enum_.at(0));
-  EXPECT_TRUE(t1.union_.at(0).is_int32());
-  EXPECT_EQ(13, t1.union_.at(0).int32());
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/lib/fidl/json_xdr_unittest.fidl b/lib/fidl/json_xdr_unittest.fidl
deleted file mode 100644
index f9d639c..0000000
--- a/lib/fidl/json_xdr_unittest.fidl
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library test.peridot.lib.fidl.jsonxdr;
-
-struct RequiredData {
-    string string;
-    bool bool;
-    int8 int8;
-    int16 int16;
-    int32 int32;
-    int64 int64;
-    uint8 uint8;
-    uint16 uint16;
-    uint32 uint32;
-    uint64 uint64;
-    float32 float32;
-    float64 float64;
-    Struct struct;
-    Enum enum;
-    Union union;
-};
-
-struct OptionalData {
-    string? string;
-    Struct? struct;
-    Union? union;
-};
-
-struct RequiredRepeatedRequiredData {
-    vector<string> string;
-    vector<bool> bool;
-    vector<int8> int8;
-    vector<int16> int16;
-    vector<int32> int32;
-    vector<int64> int64;
-    vector<uint8> uint8;
-    vector<uint16> uint16;
-    vector<uint32> uint32;
-    vector<uint64> uint64;
-    vector<float32> float32;
-    vector<float64> float64;
-    vector<Struct> struct;
-    vector<Enum> enum;
-    vector<Union> union;
-};
-
-struct RequiredRepeatedOptionalData {
-    vector<string?> string;
-    vector<Struct?> struct;
-    vector<Union?> union;
-};
-
-// NOTE(mesch): According to jeffbrown, optional vector typed fields are going
-// away.
-
-struct OptionalRepeatedRequiredData {
-    vector<string>? string;
-    vector<bool>? bool;
-    vector<int8>? int8;
-    vector<int16>? int16;
-    vector<int32>? int32;
-    vector<int64>? int64;
-    vector<uint8>? uint8;
-    vector<uint16>? uint16;
-    vector<uint32>? uint32;
-    vector<uint64>? uint64;
-    vector<float32>? float32;
-    vector<float64>? float64;
-    vector<Struct>? struct;
-    vector<Enum>? enum;
-    vector<Union>? union;
-};
-
-struct OptionalRepeatedOptionalData {
-    vector<string?>? string;
-    vector<Struct?>? struct;
-    vector<Union?>? union;
-};
-
-struct ArrayData {
-    array<string>:10 string;
-    array<bool>:10 bool;
-    array<int8>:10 int8;
-    array<int16>:10 int16;
-    array<int32>:10 int32;
-    array<int64>:10 int64;
-    array<uint8>:10 uint8;
-    array<uint16>:10 uint16;
-    array<uint32>:10 uint32;
-    array<uint64>:10 uint64;
-    array<float32>:10 float32;
-    array<float64>:10 float64;
-    array<Struct>:10 struct;
-    array<Enum>:10 enum;
-    array<Union>:10 union;
-};
-
-// The purpose of this struct is coverage for struct valued fields above. The
-// field exists only so we have something to be checked to be there. Other types
-// of fields of structs are covered above, not here.
-struct Struct {
-    int32 item;
-};
-
-enum Enum {
-    ZERO = 0;
-    ONE = 1;
-    TWO = 2;
-};
-
-// NOTE(mesch): Can't use struct, FIDL-130.
-union Union {
-    int32 int32;
-    string string;
-};
diff --git a/lib/fidl/proxy.cc b/lib/fidl/proxy.cc
deleted file mode 100644
index fa68acd..0000000
--- a/lib/fidl/proxy.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/fidl/proxy.h"
-
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-ProxySet::ProxySet() = default;
-
-ProxySet::~ProxySet() = default;
-
-void ProxySet::Drop(ProxyBase* const proxy) {
-  auto i = std::remove_if(
-      proxies_.begin(), proxies_.end(),
-      [proxy](std::unique_ptr<ProxyBase>& p) { return proxy == p.get(); });
-  FXL_DCHECK(i != proxies_.end());
-  proxies_.erase(i, proxies_.end());
-}
-
-ProxyBase::ProxyBase(ProxySet* const set) : set_(set) {}
-
-ProxyBase::~ProxyBase() = default;
-
-void ProxyBase::Drop() { set_->Drop(this); }
-
-}  // namespace modular
diff --git a/lib/fidl/proxy.h b/lib/fidl/proxy.h
deleted file mode 100644
index 47de223..0000000
--- a/lib/fidl/proxy.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIDL_PROXY_H_
-#define PERIDOT_LIB_FIDL_PROXY_H_
-
-#include <memory>
-#include <vector>
-
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-class ProxyBase;
-
-// A proxy allows to bind a fidl interface request to an existing fidl interface
-// ptr of the same interface type.
-//
-// Proxy instances are held in a proxy set, from which they are automatically
-// removed once one of their connection closes, which then also closes the other
-// connection.
-//
-// A proxy set can polymorphically hold proxies of various interface types.
-class ProxySet {
- public:
-  ProxySet();
-  ~ProxySet();
-
-  template <typename I>
-  void Connect(fidl::InterfacePtr<I> ptr, fidl::InterfaceRequest<I> request);
-
- private:
-  friend class ProxyBase;
-  void Drop(ProxyBase* proxy);
-
-  std::vector<std::unique_ptr<ProxyBase>> proxies_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(ProxySet);
-};
-
-// Used internally by ProxySet, but needs to be here because it supports the
-// Proxy template class below.
-class ProxyBase {
- public:
-  explicit ProxyBase(ProxySet* set);
-  virtual ~ProxyBase();
-
- protected:
-  void Drop();
-
- private:
-  ProxySet* const set_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ProxyBase);
-};
-
-// Used internally by ProxySet, but needs to be here because it is a
-// template.
-template <typename I>
-class Proxy : public ProxyBase {
- public:
-  Proxy(ProxySet* set, fidl::InterfacePtr<I> ptr,
-        fidl::InterfaceRequest<I> request);
-  ~Proxy() override;
-
- private:
-  fidl::InterfacePtr<I> ptr_;
-  fidl::Binding<I> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(Proxy);
-};
-
-template <typename I>
-void ProxySet::Connect(fidl::InterfacePtr<I> ptr,
-                       fidl::InterfaceRequest<I> request) {
-  proxies_.emplace_back(new Proxy<I>(this, std::move(ptr), std::move(request)));
-}
-
-template <typename I>
-Proxy<I>::Proxy(ProxySet* const set, fidl::InterfacePtr<I> ptr,
-                fidl::InterfaceRequest<I> request)
-    : ProxyBase(set),
-      ptr_(std::move(ptr)),
-      binding_(ptr_.get(), std::move(request)) {
-  ptr_.set_error_handler([this](zx_status_t status) { Drop(); });
-  binding_.set_error_handler([this](zx_status_t status) { Drop(); });
-}
-
-template <typename I>
-Proxy<I>::~Proxy() = default;
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_FIDL_PROXY_H_
diff --git a/lib/fidl/single_service_app.h b/lib/fidl/single_service_app.h
deleted file mode 100644
index f28e778..0000000
--- a/lib/fidl/single_service_app.h
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIDL_SINGLE_SERVICE_APP_H_
-#define PERIDOT_LIB_FIDL_SINGLE_SERVICE_APP_H_
-
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/app/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <zx/eventpair.h>
-#include <memory>
-
-namespace modular {
-
-// Base class for a simple application which only provides the ViewProvider
-// service. It also implements a Terminate() method that makes it suitable to be
-// used as an Impl class of AppDriver.
-class ViewApp : private fuchsia::ui::app::ViewProvider,
-                private fuchsia::ui::viewsv1::ViewProvider {
- public:
-  ViewApp(component::StartupContext* const startup_context)
-      : startup_context_(startup_context),
-        old_view_provider_binding_(this),
-        view_provider_binding_(this) {
-    startup_context_->outgoing()
-        .AddPublicService<fuchsia::ui::viewsv1::ViewProvider>(
-            [this](fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-                       request) {
-              FXL_DCHECK(!old_view_provider_binding_.is_bound());
-              old_view_provider_binding_.Bind(std::move(request));
-            });
-
-    startup_context_->outgoing()
-        .AddPublicService<fuchsia::ui::app::ViewProvider>(
-            [this](fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>
-                       request) {
-              FXL_DCHECK(!view_provider_binding_.is_bound());
-              view_provider_binding_.Bind(std::move(request));
-            });
-  }
-
-  ~ViewApp() override = default;
-
-  virtual void Terminate(std::function<void()> done) { done(); }
-
- protected:
-  component::StartupContext* startup_context() const {
-    return startup_context_;
-  }
-
- private:
-  // |ViewProvider|
-  void CreateView(
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner>
-          view_owner_request,
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services) final {
-    // Forward into fuchsia.ui.app.ViewProvider by "casting" the ViewOwner
-    // channel to an eventpair.
-    CreateView(zx::eventpair(view_owner_request.TakeChannel().release()),
-               std::move(services), nullptr);
-  }
-
-  // |ViewProvider| -- Derived classes should override this method.
-  void CreateView(
-      zx::eventpair /*view_token*/,
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
-      fidl::InterfaceHandle<
-          fuchsia::sys::ServiceProvider> /*outgoing_services*/) override {}
-
-  component::StartupContext* const startup_context_;
-  fidl::Binding<fuchsia::ui::viewsv1::ViewProvider> old_view_provider_binding_;
-  fidl::Binding<fuchsia::ui::app::ViewProvider> view_provider_binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ViewApp);
-};
-
-// Base class for a simple application which provides a single instance of a
-// single service and the ViewProvider service.
-template <class Service>
-class SingleServiceApp : public ViewApp, protected Service {
- public:
-  SingleServiceApp(component::StartupContext* const start_context)
-      : ViewApp(start_context), service_binding_(this) {
-    // The 'template' is required here because AddPublicService is a dependent
-    // template name.
-    startup_context()->outgoing().template AddPublicService<Service>(
-        [this](fidl::InterfaceRequest<Service> request) {
-          FXL_DCHECK(!service_binding_.is_bound());
-          service_binding_.Bind(std::move(request));
-        });
-  }
-
-  ~SingleServiceApp() override = default;
-
- private:
-  fidl::Binding<Service> service_binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SingleServiceApp);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_FIDL_SINGLE_SERVICE_APP_H_
diff --git a/lib/fidl/view_host.cc b/lib/fidl/view_host.cc
deleted file mode 100644
index 351ca08..0000000
--- a/lib/fidl/view_host.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/fidl/view_host.h"
-
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-struct ViewHost::ViewData {
-  explicit ViewData(scenic::Session* session) : host_node(session) {}
-
-  scenic::EntityNode host_node;
-};
-
-ViewHost::ViewHost(scenic::ViewContext view_context)
-    : V1BaseView(std::move(view_context), "ViewHost"),
-      container_node_(session()) {
-  parent_node().AddChild(container_node_);
-}
-
-ViewHost::~ViewHost() = default;
-
-void ViewHost::ConnectView(zx::eventpair view_holder_token) {
-  const uint32_t child_key = next_child_key_++;
-
-  auto view_data = std::make_unique<ViewData>(session());
-
-  zx::eventpair host_import_token;
-  view_data->host_node.ExportAsRequest(&host_import_token);
-  container_node_.AddChild(view_data->host_node);
-  views_.emplace(child_key, std::move(view_data));
-
-  GetViewContainer()->AddChild2(child_key, std::move(view_holder_token),
-                                std::move(host_import_token));
-  UpdateScene();
-}
-
-void ViewHost::ConnectView(
-    fidl::InterfaceHandle<fuchsia::ui::viewsv1token::ViewOwner> view_owner) {
-  ConnectView(zx::eventpair(view_owner.TakeChannel().release()));
-}
-
-void ViewHost::OnPropertiesChanged(
-    fuchsia::ui::viewsv1::ViewProperties /*old_properties*/) {
-  UpdateScene();
-}
-
-void ViewHost::OnChildUnavailable(uint32_t child_key) {
-  FXL_LOG(ERROR) << "View died unexpectedly: child_key=" << child_key;
-
-  auto it = views_.find(child_key);
-  FXL_DCHECK(it != views_.end());
-
-  it->second->host_node.Detach();
-  views_.erase(it);
-
-  GetViewContainer()->RemoveChild2(child_key, zx::eventpair());
-  UpdateScene();
-}
-
-void ViewHost::UpdateScene() {
-  if (!properties().view_layout || views_.empty()) {
-    return;
-  }
-
-  // Layout all children in a row.
-  uint32_t index = 0;
-  uint32_t space = logical_size().width;
-  uint32_t base = space / views_.size();
-  uint32_t excess = space % views_.size();
-  uint32_t offset = 0;
-  for (auto it = views_.begin(); it != views_.end(); ++it, ++index) {
-    ViewData* view_data = it->second.get();
-
-    // Distribute any excess width among the leading children.
-    uint32_t extent = base;
-    if (excess) {
-      extent++;
-      excess--;
-    }
-
-    fuchsia::math::RectF layout_bounds;
-    layout_bounds.x = offset;
-    layout_bounds.y = 0;
-    layout_bounds.width = extent;
-    layout_bounds.height = logical_size().height;
-    offset += extent;
-
-    auto view_properties = fuchsia::ui::viewsv1::ViewProperties::New();
-    view_properties->view_layout = fuchsia::ui::viewsv1::ViewLayout::New();
-    view_properties->view_layout->size = fuchsia::math::SizeF();
-    view_properties->view_layout->size.width = layout_bounds.width;
-    view_properties->view_layout->size.height = layout_bounds.height;
-    view_properties->view_layout->inset = fuchsia::math::InsetF();
-    GetViewContainer()->SetChildProperties(it->first,
-                                           std::move(view_properties));
-
-    view_data->host_node.SetTranslation(layout_bounds.x, layout_bounds.y, 0u);
-  }
-
-  InvalidateScene();
-}
-
-}  // namespace modular
diff --git a/lib/fidl/view_host.h b/lib/fidl/view_host.h
deleted file mode 100644
index a4c0155..0000000
--- a/lib/fidl/view_host.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIDL_VIEW_HOST_H_
-#define PERIDOT_LIB_FIDL_VIEW_HOST_H_
-
-#include <map>
-#include <memory>
-
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/fxl/macros.h>
-#include <lib/ui/base_view/cpp/v1_base_view.h>
-#include <zx/eventpair.h>
-
-namespace modular {
-
-// A class that allows modules to display the UI of their child
-// modules, without displaying any UI on their own. Used for modules
-// that play the role of a view controller (aka quarterback, recipe).
-// It supports to embed views of *multiple* children, which are laid
-// out horizontally.
-class ViewHost : public scenic::V1BaseView {
- public:
-  explicit ViewHost(scenic::ViewContext view_context);
-  ~ViewHost() override;
-
-  // Connects one more view. Calling this method multiple times adds
-  // multiple views and lays them out horizontally next to each other.
-  // This is experimental to establish data flow patterns in toy
-  // applications and can be changed or extended as needed.
-  void ConnectView(zx::eventpair view_holder_token);
-  void ConnectView(
-      fidl::InterfaceHandle<fuchsia::ui::viewsv1token::ViewOwner> view_owner);
-
- private:
-  struct ViewData;
-
-  // |scenic::V1BaseView|
-  void OnPropertiesChanged(
-      fuchsia::ui::viewsv1::ViewProperties old_properties) override;
-  void OnChildUnavailable(uint32_t child_key) override;
-
-  void UpdateScene();
-
-  scenic::EntityNode container_node_;
-
-  std::map<uint32_t, std::unique_ptr<ViewData>> views_;
-  uint32_t next_child_key_{1u};
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ViewHost);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_FIDL_VIEW_HOST_H_
diff --git a/lib/firebase/BUILD.gn b/lib/firebase/BUILD.gn
deleted file mode 100644
index 38e3e72..0000000
--- a/lib/firebase/BUILD.gn
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [
-  "//peridot/bin/*",
-  "//peridot/lib/*",
-]
-
-source_set("firebase") {
-  sources = [
-    "encoding.cc",
-    "encoding.h",
-    "event_stream.cc",
-    "event_stream.h",
-    "firebase.h",
-    "firebase_impl.cc",
-    "firebase_impl.h",
-    "status.cc",
-    "status.h",
-    "watch_client.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/network_wrapper",
-    "//peridot/lib/convert",
-    "//third_party/rapidjson",
-  ]
-
-  deps = [
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/base64url",
-    "//peridot/lib/socket",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "encoding_unittest.cc",
-    "event_stream_unittest.cc",
-    "firebase_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":firebase",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//garnet/public/lib/network_wrapper:fake",
-    "//peridot/lib/convert",
-    "//peridot/lib/socket",
-    "//third_party/googletest:gtest",
-  ]
-}
diff --git a/lib/firebase/README.md b/lib/firebase/README.md
deleted file mode 100644
index f9875df..0000000
--- a/lib/firebase/README.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# firebase
-
-Client library for the REST API of the Firebase Realtime Database.
-
-## curl
-
-In order to manually debug potential sync issues, we can use `curl` to interact
-with the database from the command line.
-
-Reading data:
-
-```sh
-curl <host>/<path>.json -X GET
-```
-
-Writing data:
-
-```sh
-curl <host>/<path>.json -X PUT -d <data>
-```
-
-Opening a notification stream:
-
-```sh
-curl -L <host>/<path>.json -X GET -H "Accept: text/event-stream"
-```
diff --git a/lib/firebase/encoding.cc b/lib/firebase/encoding.cc
deleted file mode 100644
index cc70a71..0000000
--- a/lib/firebase/encoding.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase/encoding.h"
-
-#include <lib/fxl/strings/utf_codecs.h>
-
-#include "peridot/lib/base64url/base64url.h"
-
-namespace firebase {
-
-namespace {
-
-// Returns true iff the given value can be put in Firebase without encoding.
-// Firebase requires the values to be valid UTF-8 JSON strings. JSON disallows
-// control characters in strings. We disallow backslash and double quote to
-// avoid reasoning about escaping. Note: this is a stop-gap solution, see
-// LE-118.
-bool CanValueBeVerbatim(fxl::StringView bytes) {
-  // Once encryption is in place this won't be useful. Until then, storing valid
-  // utf8 strings verbatim simplifies debugging.
-  if (!fxl::IsStringUTF8(bytes)) {
-    return false;
-  }
-
-  for (const char& byte : bytes) {
-    if (static_cast<unsigned char>(byte) <= 31 || byte == 127 || byte == '\"' ||
-        byte == '\\') {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-// Characters that are not allowed to appear in a Firebase key (but may appear
-// in a value). See
-// https://firebase.google.com/docs/database/rest/structure-data.
-const char kIllegalKeyChars[] = ".$#[]/+";
-
-// Encodes the given bytes for storage in Firebase. We use the same encoding
-// function for both values and keys for simplicity, yielding values that can be
-// always safely used as either. Note: this is a stop-gap solution, see LE-118.
-std::string Encode(fxl::StringView s, bool verbatim) {
-  if (verbatim) {
-    return s.ToString() + "V";
-  }
-
-  std::string encoded;
-  return base64url::Base64UrlEncode(s) + "B";
-}
-
-}  // namespace
-
-// Returns true if the given value can be used as a Firebase key without
-// encoding.
-bool CanKeyBeVerbatim(fxl::StringView bytes) {
-  if (!CanValueBeVerbatim(bytes)) {
-    return false;
-  }
-
-  if (bytes.find_first_of(std::string(kIllegalKeyChars)) != std::string::npos) {
-    return false;
-  }
-
-  return true;
-}
-
-std::string EncodeKey(convert::ExtendedStringView bytes) {
-  return Encode(bytes, CanKeyBeVerbatim(bytes));
-}
-
-std::string EncodeValue(convert::ExtendedStringView bytes) {
-  return Encode(bytes, CanValueBeVerbatim(bytes));
-}
-
-bool Decode(convert::ExtendedStringView input, std::string* output) {
-  if (input.empty()) {
-    return false;
-  }
-
-  fxl::StringView data = input.substr(0, input.size() - 1);
-
-  if (input.back() == 'V') {
-    *output = data.ToString();
-    return true;
-  }
-
-  if (input.back() == 'B') {
-    return base64url::Base64UrlDecode(data, output);
-  }
-
-  return false;
-}
-
-}  // namespace firebase
diff --git a/lib/firebase/encoding.h b/lib/firebase/encoding.h
deleted file mode 100644
index b4640a3..0000000
--- a/lib/firebase/encoding.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_ENCODING_H_
-#define PERIDOT_LIB_FIREBASE_ENCODING_H_
-
-#include <string>
-
-#include "peridot/lib/convert/convert.h"
-
-namespace firebase {
-
-// Returns true iff the given value can be put in Firebase as a key name without
-// encoding.
-bool CanKeyBeVerbatim(fxl::StringView bytes);
-
-// Warning: this is a naive solution which needs multiple passes and copies of
-// the data each time. To be optimized if we are going to use this in the target
-// implementation - see LE-118.
-
-// These methods encode the given bytes as a valid Firebase key / value.
-//
-// Strings that are already valid Firebase keys / values are encoded as:
-// "<original string>V" ("V" standing for "verbatim". This saves bytes (compared
-// to base64) and allows to make sense of the data upon manual inspection.
-//
-// Strings that are not valid Firebase keys / values are encoded as base64 with
-// slashes replaced with backslashes and "B" added at the end.
-std::string EncodeKey(convert::ExtendedStringView bytes);
-std::string EncodeValue(convert::ExtendedStringView bytes);
-
-// Returns true iff the key or value was correctly decoded and stored in |out|.
-// We don't need separate methods for keys and values, as the decoding algorithm
-// is identical.
-bool Decode(convert::ExtendedStringView input, std::string* output);
-
-}  // namespace firebase
-
-#endif  // PERIDOT_LIB_FIREBASE_ENCODING_H_
diff --git a/lib/firebase/encoding_unittest.cc b/lib/firebase/encoding_unittest.cc
deleted file mode 100644
index f8b397b..0000000
--- a/lib/firebase/encoding_unittest.cc
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase/encoding.h"
-
-#include <string>
-
-#include <lib/fxl/random/rand.h>
-#include <lib/fxl/strings/utf_codecs.h>
-#include <zircon/syscalls.h>
-
-#include "gtest/gtest.h"
-
-namespace firebase {
-namespace {
-
-// Allows to create correct std::strings with \0 bytes inside from C-style
-// string constants.
-std::string operator"" _s(const char* str, size_t size) {
-  return std::string(str, size);
-}
-
-// See
-// https://www.firebase.com/docs/rest/guide/understanding-data.html#section-limitations
-bool IsValidKey(const std::string& s) {
-  if (!fxl::IsStringUTF8(s)) {
-    return false;
-  }
-
-  for (const char& c : s) {
-    if (static_cast<unsigned char>(c) <= 31) {
-      return false;
-    }
-
-    if (c == 127) {
-      return false;
-    }
-
-    if (c == '+' || c == '$' || c == '[' || c == ']' || c == '/' || c == '\"' ||
-        c == '\\') {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool IsValidValue(const std::string s) {
-  if (!fxl::IsStringUTF8(s)) {
-    return false;
-  }
-
-  for (const char& c : s) {
-    if (static_cast<unsigned char>(c) <= 31) {
-      return false;
-    }
-
-    if (c == 127) {
-      return false;
-    }
-
-    if (c == '\"' || c == '\\') {
-      return false;
-    }
-  }
-  return true;
-}
-
-TEST(EncodingTest, BackAndForth) {
-  std::string s;
-  std::string ret_key;
-  std::string ret_value;
-
-  s = "";
-  EXPECT_TRUE(Decode(EncodeKey(s), &ret_key));
-  EXPECT_EQ(s, ret_key);
-  EXPECT_TRUE(Decode(EncodeValue(s), &ret_value));
-  EXPECT_EQ(s, ret_value);
-
-  s = "abcdef";
-  EXPECT_TRUE(Decode(EncodeKey(s), &ret_key));
-  EXPECT_EQ(s, ret_key);
-  EXPECT_TRUE(Decode(EncodeValue(s), &ret_value));
-  EXPECT_EQ(s, ret_value);
-
-  s = "leśna łączka";
-  EXPECT_TRUE(Decode(EncodeKey(s), &ret_key));
-  EXPECT_EQ(s, ret_key);
-  EXPECT_TRUE(Decode(EncodeValue(s), &ret_value));
-  EXPECT_EQ(s, ret_value);
-
-  s = "\x02\x7F";
-  EXPECT_TRUE(Decode(EncodeKey(s), &ret_key));
-  EXPECT_EQ(s, ret_key);
-  EXPECT_TRUE(Decode(EncodeValue(s), &ret_value));
-  EXPECT_EQ(s, ret_value);
-
-  s = "\xFF";
-  EXPECT_TRUE(Decode(EncodeKey(s), &ret_key));
-  EXPECT_EQ(s, ret_key);
-  EXPECT_TRUE(Decode(EncodeValue(s), &ret_value));
-  EXPECT_EQ(s, ret_value);
-
-  s = "\x01";
-  EXPECT_TRUE(Decode(EncodeKey(s), &ret_key));
-  EXPECT_EQ(s, ret_key);
-  EXPECT_TRUE(Decode(EncodeValue(s), &ret_value));
-  EXPECT_EQ(s, ret_value);
-
-  s = "abc\"def\"ghi'jkl'";
-  EXPECT_TRUE(Decode(EncodeKey(s), &ret_key));
-  EXPECT_EQ(s, ret_key);
-  EXPECT_TRUE(Decode(EncodeValue(s), &ret_value));
-  EXPECT_EQ(s, ret_value);
-
-  s = "\0\0\0"_s;
-  EXPECT_TRUE(Decode(EncodeKey(s), &ret_key));
-  EXPECT_EQ(s, ret_key);
-  EXPECT_TRUE(Decode(EncodeValue(s), &ret_value));
-  EXPECT_EQ(s, ret_value);
-
-  s = "bazinga\0\0\0"_s;
-  EXPECT_TRUE(Decode(EncodeKey(s), &ret_key));
-  EXPECT_EQ(s, ret_key);
-  EXPECT_TRUE(Decode(EncodeValue(s), &ret_value));
-  EXPECT_EQ(s, ret_value);
-
-  s = "alice\0bob"_s;
-  EXPECT_TRUE(Decode(EncodeKey(s), &ret_key));
-  EXPECT_EQ(s, ret_key);
-  EXPECT_TRUE(Decode(EncodeValue(s), &ret_value));
-  EXPECT_EQ(s, ret_value);
-
-  // Check random sequence of size less or equals 3.
-  for (size_t i = 0; i < 10000; ++i) {
-    size_t size = fxl::RandUint64() % 4;
-    char buffer[size];
-    fxl::StringView view(buffer, size);
-    zx_cprng_draw(reinterpret_cast<unsigned char*>(buffer), size);
-    EXPECT_TRUE(Decode(EncodeKey(view), &ret_key));
-    EXPECT_EQ(view, ret_key);
-    EXPECT_TRUE(Decode(EncodeValue(view), &ret_value));
-    EXPECT_EQ(view, ret_value);
-  }
-}
-
-TEST(EncodingTest, Keys) {
-  EXPECT_EQ("V", EncodeKey(""));
-  EXPECT_EQ("abcV", EncodeKey("abc"));
-  EXPECT_EQ("qwerty123V", EncodeKey("qwerty123"));
-  EXPECT_EQ("YWJjLw==B", EncodeKey("abc/"));
-  EXPECT_EQ("I1tdIQ==B", EncodeKey("#[]!"));
-  EXPECT_EQ("fw==B", EncodeKey("\x7F"));
-  EXPECT_EQ("_w==B", EncodeKey("\xFF"));
-  EXPECT_EQ("Ig==B", EncodeKey("\""));
-  EXPECT_EQ("Kw==B", EncodeKey("+"));
-}
-
-TEST(EncodingTest, Values) {
-  EXPECT_EQ("V", EncodeValue(""));
-  EXPECT_EQ("abcV", EncodeValue("abc"));
-  EXPECT_EQ("qwerty123V", EncodeValue("qwerty123"));
-  EXPECT_EQ("abc/V", EncodeValue("abc/"));
-  EXPECT_EQ("#[]!V", EncodeValue("#[]!"));
-  EXPECT_EQ("fw==B", EncodeValue("\x7F"));
-  EXPECT_EQ("_w==B", EncodeValue("\xFF"));
-  EXPECT_EQ("Ig==B", EncodeValue("\""));
-  EXPECT_EQ("Iy9cIT9bXQ==B", EncodeValue("#/\\!?[]"));
-  EXPECT_EQ("+V", EncodeValue("+"));
-}
-
-TEST(EncodingTest, ValidKeys) {
-  std::string original;
-  std::string encoded;
-  std::string decoded;
-
-  original = "\x02, \x7F, \x18, \x1D are forbidden, [], $ and / too!";
-  encoded = EncodeKey(original);
-  EXPECT_TRUE(IsValidKey(encoded));
-  EXPECT_TRUE(Decode(encoded, &decoded));
-  EXPECT_EQ(original, decoded);
-
-  original = "\xFF";
-  encoded = EncodeKey(original);
-  EXPECT_TRUE(IsValidKey(encoded));
-  EXPECT_TRUE(Decode(encoded, &decoded));
-  EXPECT_EQ(original, decoded);
-
-  original = "\xFF\x7F\x05\x09\xFF\xFF\x0B";
-  encoded = EncodeKey(original);
-  EXPECT_TRUE(IsValidKey(encoded));
-  EXPECT_TRUE(Decode(encoded, &decoded));
-  EXPECT_EQ(original, decoded);
-
-  original = "zażółć gęślą jaźń\xFF\xFF";
-  encoded = EncodeKey(original);
-  EXPECT_TRUE(IsValidKey(encoded));
-  EXPECT_TRUE(Decode(encoded, &decoded));
-  EXPECT_EQ(original, decoded);
-}
-
-TEST(EncodingTest, ValidValues) {
-  std::string original;
-  std::string encoded;
-  std::string decoded;
-
-  original = "\x02, \x7F, \x18, \x1D are ok, [], $ and / too!";
-  encoded = EncodeValue(original);
-  EXPECT_TRUE(IsValidValue(encoded));
-  EXPECT_TRUE(Decode(encoded, &decoded));
-  EXPECT_EQ(original, decoded);
-
-  original = "\x01\x00\x02"_s;
-  encoded = EncodeValue(original);
-  EXPECT_TRUE(IsValidValue(encoded));
-  EXPECT_TRUE(Decode(encoded, &decoded));
-  EXPECT_EQ(original, decoded);
-
-  original = "\xFF";
-  encoded = EncodeValue(original);
-  EXPECT_TRUE(IsValidValue(encoded));
-  EXPECT_TRUE(Decode(encoded, &decoded));
-  EXPECT_EQ(original, decoded);
-
-  original = "\xFF\x7F\x05\x09\xFF\xFF\x0B";
-  encoded = EncodeValue(original);
-  EXPECT_TRUE(IsValidValue(encoded));
-  EXPECT_TRUE(Decode(encoded, &decoded));
-  EXPECT_EQ(original, decoded);
-
-  original = "zażółć gęślą jaźń\xFF\xFF";
-  encoded = EncodeValue(original);
-  EXPECT_TRUE(IsValidValue(encoded));
-  EXPECT_TRUE(Decode(encoded, &decoded));
-  EXPECT_EQ(original, decoded);
-}
-
-}  // namespace
-}  // namespace firebase
diff --git a/lib/firebase/event_stream.cc b/lib/firebase/event_stream.cc
deleted file mode 100644
index 4d52958..0000000
--- a/lib/firebase/event_stream.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase/event_stream.h"
-
-#include <utility>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/trim.h>
-
-namespace firebase {
-
-EventStream::EventStream() {}
-
-EventStream::~EventStream() {}
-
-void EventStream::Start(zx::socket source,
-                        fit::function<EventCallback> event_callback,
-                        fit::function<CompletionCallback> completion_callback) {
-  event_callback_ = std::move(event_callback);
-  completion_callback_ = std::move(completion_callback);
-  drainer_ = std::make_unique<fsl::SocketDrainer>(this);
-  drainer_->Start(std::move(source));
-}
-
-void EventStream::OnDataAvailable(const void* data, size_t num_bytes) {
-  const char* current = static_cast<const char*>(data);
-  const char* const end = current + num_bytes;
-  while (current < end) {
-    const char* newline = std::find(current, end, '\n');
-    pending_line_.append(current, newline - current);
-    current = newline;
-    if (newline != end) {
-      if (!ProcessLine(pending_line_))
-        return;
-      pending_line_.clear();
-      ++current;
-    }
-  }
-}
-
-void EventStream::OnDataComplete() { completion_callback_(); }
-
-// See https://www.w3.org/TR/eventsource/#event-stream-interpretation.
-bool EventStream::ProcessLine(fxl::StringView line) {
-  // If the line is empty, dispatch the event.
-  if (line.empty()) {
-    // If data is empty, clear event type and abort.
-    if (data_.empty()) {
-      event_type_.clear();
-      return true;
-    }
-
-    // Remove the trailing line break from data.
-    if (*(data_.rbegin()) == '\n') {
-      data_.resize(data_.size() - 1);
-    }
-
-    if (destruction_sentinel_.DestructedWhile(
-            [this] { event_callback_(Status::OK, event_type_, data_); })) {
-      return false;
-    }
-    event_type_.clear();
-    data_.clear();
-    return true;
-  }
-
-  // If the line starts with a colon, ignore the line.
-  if (line[0] == ':') {
-    return true;
-  }
-
-  // If the line contains a colon, process the field.
-  size_t colon_pos = line.find(':');
-  if (colon_pos != std::string::npos) {
-    fxl::StringView field(line.substr(0, colon_pos));
-    fxl::StringView value = line.substr(colon_pos + 1);
-    ProcessField(field, fxl::TrimString(value, " "));
-    return true;
-  }
-
-  // If the line does not contain a colon, process the field using the whole
-  // line as the field name and empty string as field value.
-  ProcessField(line, "");
-  return true;
-}
-
-void EventStream::ProcessField(fxl::StringView field, fxl::StringView value) {
-  if (field == "event") {
-    event_type_ = value.ToString();
-  } else if (field == "data") {
-    data_.append(value.data(), value.size());
-    data_.append("\n");
-  } else if (field == "id" || field == "retry") {
-    // Not implemented.
-    FXL_LOG(WARNING) << "Event stream - field type not implemented: " << field;
-  } else {
-    // The spec says to ignore unknown field names.
-    FXL_LOG(WARNING) << "Event stream - unknown field name: " << field;
-  }
-}
-
-}  // namespace firebase
diff --git a/lib/firebase/event_stream.h b/lib/firebase/event_stream.h
deleted file mode 100644
index 091d485..0000000
--- a/lib/firebase/event_stream.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_EVENT_STREAM_H_
-#define PERIDOT_LIB_FIREBASE_EVENT_STREAM_H_
-
-#include <functional>
-#include <memory>
-#include <string>
-
-#include <lib/callback/destruction_sentinel.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/socket_drainer.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-#include "peridot/lib/firebase/status.h"
-
-namespace firebase {
-
-// TODO(ppi): Use a client interface instead.
-using EventCallback = void(Status status, const std::string& event,
-                           const std::string& data);
-using CompletionCallback = void();
-
-// Socket drainer that parses a stream of Server-Sent Events.
-// Data format of the stream is specified in http://www.w3.org/TR/eventsource/.
-class EventStream : public fsl::SocketDrainer::Client {
- public:
-  EventStream();
-  ~EventStream() override;
-
-  void Start(zx::socket source, fit::function<EventCallback> event_callback,
-             fit::function<CompletionCallback> completion_callback);
-
- private:
-  friend class EventStreamTest;
-
-  // fsl::SocketDrainer::Client:
-  void OnDataAvailable(const void* data, size_t num_bytes) override;
-  void OnDataComplete() override;
-
-  // Returns false if the object has been destroyed within this method.
-  bool ProcessLine(fxl::StringView line);
-
-  void ProcessField(fxl::StringView field, fxl::StringView value);
-
-  fit::function<EventCallback> event_callback_;
-  fit::function<CompletionCallback> completion_callback_;
-
-  // Unprocessed part of the current line.
-  std::string pending_line_;
-  std::string data_;
-  std::string event_type_;
-
-  std::unique_ptr<fsl::SocketDrainer> drainer_;
-
-  callback::DestructionSentinel destruction_sentinel_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(EventStream);
-};
-
-}  // namespace firebase
-
-#endif  // PERIDOT_LIB_FIREBASE_EVENT_STREAM_H_
diff --git a/lib/firebase/event_stream_unittest.cc b/lib/firebase/event_stream_unittest.cc
deleted file mode 100644
index 8aa0723..0000000
--- a/lib/firebase/event_stream_unittest.cc
+++ /dev/null
@@ -1,192 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase/event_stream.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include <lib/async/cpp/task.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/lib/socket/socket_pair.h"
-
-namespace firebase {
-
-class EventStreamTest : public ::gtest::TestLoopFixture {
- public:
-  EventStreamTest() {}
-  ~EventStreamTest() override {}
-
- protected:
-  // ApplicationTestBase:
-  void SetUp() override {
-    ::testing::Test::SetUp();
-    socket::SocketPair socket;
-    producer_socket_ = std::move(socket.socket1);
-    event_stream_ = std::make_unique<EventStream>();
-    event_stream_->Start(std::move(socket.socket2),
-                         [this](Status status, const std::string& event,
-                                const std::string& data) {
-                           status_.push_back(status);
-                           events_.push_back(event);
-                           data_.push_back(data);
-                           if (delete_on_event_) {
-                             event_stream_.reset();
-                           }
-                         },
-                         []() {});
-  }
-
-  void TearDown() override {
-    producer_socket_.reset();
-    ::testing::Test::TearDown();
-  }
-
-  void Feed(const std::string& data) {
-    event_stream_->OnDataAvailable(data.data(), data.size());
-  }
-
-  void Done() { event_stream_->OnDataComplete(); }
-
-  zx::socket producer_socket_;
-  std::unique_ptr<EventStream> event_stream_;
-  std::vector<Status> status_;
-  std::vector<std::string> events_;
-  std::vector<std::string> data_;
-  bool delete_on_event_ = false;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(EventStreamTest);
-};
-
-namespace {
-
-TEST_F(EventStreamTest, OneEvent) {
-  Feed("event: abc\ndata: bazinga\n\n");
-  Done();
-
-  EXPECT_EQ(1u, status_.size());
-  EXPECT_EQ(Status::OK, status_[0]);
-  EXPECT_EQ("abc", events_[0]);
-  EXPECT_EQ("bazinga", data_[0]);
-}
-
-TEST_F(EventStreamTest, CutAtLineBreaks) {
-  Feed("event: abc\n");
-  Feed("data: bazinga\n");
-  Feed("\n");
-  Done();
-
-  EXPECT_EQ(1u, status_.size());
-  EXPECT_EQ(Status::OK, status_[0]);
-  EXPECT_EQ("abc", events_[0]);
-  EXPECT_EQ("bazinga", data_[0]);
-}
-
-TEST_F(EventStreamTest, CutInsideTag) {
-  Feed("eve");
-  Feed("nt: abc\n");
-  Feed("da");
-  Feed("ta: bazinga\n\n");
-  Done();
-
-  EXPECT_EQ(1u, status_.size());
-  EXPECT_EQ(Status::OK, status_[0]);
-  EXPECT_EQ("abc", events_[0]);
-  EXPECT_EQ("bazinga", data_[0]);
-}
-
-TEST_F(EventStreamTest, CutInsideData) {
-  Feed("event: abc\n");
-  Feed("data: baz");
-  Feed("inga\n\n");
-  Done();
-
-  EXPECT_EQ(1u, status_.size());
-  EXPECT_EQ(Status::OK, status_[0]);
-  EXPECT_EQ("abc", events_[0]);
-  EXPECT_EQ("bazinga", data_[0]);
-}
-
-TEST_F(EventStreamTest, DataInMultipleLines) {
-  Feed("event: abc\n");
-  Feed("data: baz\n");
-  Feed("data: in\ndata: ga\n");
-  Feed("\n");
-  Done();
-
-  EXPECT_EQ(1u, status_.size());
-  EXPECT_EQ(Status::OK, status_[0]);
-  EXPECT_EQ("abc", events_[0]);
-  EXPECT_EQ("baz\nin\nga", data_[0]);
-}
-
-TEST_F(EventStreamTest, IgnoreUnknownFieldNames) {
-  Feed("event: abc\n");
-  Feed("data: baz\n");
-  Feed("trololo: trololo\n");  // Unknown field name.
-  Feed("data: in\ndata: ga\n");
-  Feed("\n");
-  Done();
-
-  EXPECT_EQ(1u, status_.size());
-  EXPECT_EQ(Status::OK, status_[0]);
-  EXPECT_EQ("abc", events_[0]);
-  EXPECT_EQ("baz\nin\nga", data_[0]);
-}
-
-TEST_F(EventStreamTest, IgnoreLinesStartingWithColon) {
-  Feed("event: abc\n");
-  Feed(":ignore me, trololo\n");
-  Feed("data: bazinga\n\n");
-  Done();
-
-  EXPECT_EQ(1u, status_.size());
-  EXPECT_EQ(Status::OK, status_[0]);
-  EXPECT_EQ("abc", events_[0]);
-  EXPECT_EQ("bazinga", data_[0]);
-}
-
-TEST_F(EventStreamTest, MultipleEvents) {
-  Feed("event: abc\n");
-  Feed("data: bazinga\n\n");
-  Feed("event: cde\n");
-  Feed("data: 42\n\n");
-  Feed("event: fgh\n");
-  Feed("data: 50\n\n");
-  Done();
-
-  EXPECT_EQ(3u, status_.size());
-  EXPECT_EQ(Status::OK, status_[0]);
-  EXPECT_EQ("abc", events_[0]);
-  EXPECT_EQ("bazinga", data_[0]);
-
-  EXPECT_EQ(Status::OK, status_[1]);
-  EXPECT_EQ("cde", events_[1]);
-  EXPECT_EQ("42", data_[1]);
-
-  EXPECT_EQ(Status::OK, status_[2]);
-  EXPECT_EQ("fgh", events_[2]);
-  EXPECT_EQ("50", data_[2]);
-}
-
-TEST_F(EventStreamTest, DeleteOnEvent) {
-  delete_on_event_ = true;
-  fsl::BlockingCopyFromString("event: abc\ndata: bazinga\n\n",
-                              producer_socket_);
-
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(1u, status_.size());
-  EXPECT_EQ(Status::OK, status_[0]);
-  EXPECT_EQ("abc", events_[0]);
-  EXPECT_EQ("bazinga", data_[0]);
-}
-
-}  // namespace
-}  // namespace firebase
diff --git a/lib/firebase/firebase.h b/lib/firebase/firebase.h
deleted file mode 100644
index abcce08..0000000
--- a/lib/firebase/firebase.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_FIREBASE_H_
-#define PERIDOT_LIB_FIREBASE_FIREBASE_H_
-
-#include <functional>
-#include <string>
-#include <vector>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <rapidjson/document.h>
-
-#include "peridot/lib/firebase/status.h"
-#include "peridot/lib/firebase/watch_client.h"
-
-namespace firebase {
-
-class Firebase {
- public:
-  Firebase() {}
-  virtual ~Firebase() {}
-
-  // Common parameters:
-  //   |query_params| - array of params that are joined using the "&" separator
-  //       passed verbatim as the query parameter of the request. Can be empty.
-
-  // Retrieves the JSON representation of the data under the given path. See
-  // https://firebase.google.com/docs/database/rest/retrieve-data.
-  //
-  // TODO(ppi): support response Content-Length header, see LE-210.
-  virtual void Get(const std::string& key,
-                   const std::vector<std::string>& query_params,
-                   fit::function<void(Status status,
-                                      std::unique_ptr<rapidjson::Value> value)>
-                       callback) = 0;
-
-  // Overwrites the data under the given path. Data needs to be a valid JSON
-  // object or JSON primitive value.
-  // https://firebase.google.com/docs/database/rest/save-data
-  virtual void Put(const std::string& key,
-                   const std::vector<std::string>& query_params,
-                   const std::string& data,
-                   fit::function<void(Status status)> callback) = 0;
-
-  // Adds or updates multiple keys under the given path. Data needs to be a
-  // JSON dictionary.
-  // https://firebase.google.com/docs/database/rest/save-data
-  virtual void Patch(const std::string& key,
-                     const std::vector<std::string>& query_params,
-                     const std::string& data,
-                     fit::function<void(Status status)> callback) = 0;
-
-  // Deletes the data under the given path.
-  virtual void Delete(const std::string& key,
-                      const std::vector<std::string>& query_params,
-                      fit::function<void(Status status)> callback) = 0;
-
-  // Registers the given |watch_client| to receive notifications about changes
-  // under the given |key|. See
-  // https://firebase.google.com/docs/database/rest/retrieve-data.
-  virtual void Watch(const std::string& key,
-                     const std::vector<std::string>& query_params,
-                     WatchClient* watch_client) = 0;
-
-  // Unregisters the given |watch_client|. No calls on the client will be made
-  // after this method returns.
-  virtual void UnWatch(WatchClient* watch_client) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(Firebase);
-};
-
-}  // namespace firebase
-
-#endif  // PERIDOT_LIB_FIREBASE_FIREBASE_H_
diff --git a/lib/firebase/firebase_impl.cc b/lib/firebase/firebase_impl.cc
deleted file mode 100644
index 862cbdd..0000000
--- a/lib/firebase/firebase_impl.cc
+++ /dev/null
@@ -1,348 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase/firebase_impl.h"
-
-#include <memory>
-#include <sstream>
-#include <utility>
-
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/ascii.h>
-#include <lib/fxl/strings/join_strings.h>
-
-#include "peridot/lib/socket/socket_drainer_client.h"
-
-namespace firebase {
-
-namespace http = ::fuchsia::net::oldhttp;
-
-namespace {
-
-fit::function<http::URLRequest()> MakeRequest(const std::string& url,
-                                              const std::string& method,
-                                              const std::string& message,
-                                              bool stream_request = false) {
-  fsl::SizedVmo body;
-  if (!message.empty()) {
-    if (!fsl::VmoFromString(message, &body)) {
-      FXL_LOG(ERROR) << "Unable to create VMO from string.";
-      return nullptr;
-    }
-  }
-
-  return fxl::MakeCopyable(
-      [url, method, body = std::move(body), stream_request]() {
-        http::URLRequest request;
-        request.url = url;
-        request.method = method;
-        request.auto_follow_redirects = true;
-        if (body) {
-          fsl::SizedVmo duplicated_body;
-          zx_status_t status =
-              body.Duplicate(ZX_RIGHTS_BASIC | ZX_RIGHT_READ, &duplicated_body);
-          if (status != ZX_OK) {
-            FXL_LOG(WARNING) << "Unable to duplicate a vmo. Status: " << status;
-            return http::URLRequest();
-          }
-          request.body = http::URLBody::New();
-          request.body->set_buffer(std::move(duplicated_body).ToTransport());
-        }
-        if (stream_request) {
-          http::HttpHeader accept_header;
-          accept_header.name = "Accept";
-          accept_header.value = "text/event-stream";
-          request.headers.push_back(std::move(accept_header));
-        }
-        return request;
-      });
-}
-
-}  // namespace
-
-struct FirebaseImpl::WatchData {
-  WatchData();
-  ~WatchData();
-
-  callback::AutoCancel request;
-  std::unique_ptr<EventStream> event_stream;
-  std::unique_ptr<socket::SocketDrainerClient> drainer;
-};
-
-FirebaseImpl::WatchData::WatchData() {}
-FirebaseImpl::WatchData::~WatchData() {}
-
-FirebaseImpl::FirebaseImpl(network_wrapper::NetworkWrapper* network_wrapper,
-                           const std::string& db_id, const std::string& prefix)
-    : network_wrapper_(network_wrapper), api_url_(BuildApiUrl(db_id, prefix)) {
-  FXL_DCHECK(network_wrapper_);
-}
-
-FirebaseImpl::~FirebaseImpl() {}
-
-void FirebaseImpl::Get(
-    const std::string& key, const std::vector<std::string>& query_params,
-    fit::function<void(Status status, std::unique_ptr<rapidjson::Value> value)>
-        callback) {
-  auto request_callback = [callback = std::move(callback)](
-                              Status status, const std::string& response) {
-    if (status != Status::OK) {
-      callback(status, std::make_unique<rapidjson::Value>());
-      return;
-    }
-
-    auto document = std::make_unique<rapidjson::Document>();
-    document->Parse(response.c_str(), response.size());
-    if (document->HasParseError()) {
-      callback(Status::PARSE_ERROR, std::make_unique<rapidjson::Value>());
-      return;
-    }
-
-    callback(Status::OK, std::move(document));
-  };
-
-  Request(BuildRequestUrl(key, query_params), "GET", "",
-          std::move(request_callback));
-}
-
-void FirebaseImpl::Put(const std::string& key,
-                       const std::vector<std::string>& query_params,
-                       const std::string& data,
-                       fit::function<void(Status status)> callback) {
-  Request(BuildRequestUrl(key, query_params), "PUT", data,
-          [callback = std::move(callback)](Status status,
-                                           const std::string& response) {
-            // Ignore the response body, which is the same data we sent to the
-            // server.
-            callback(status);
-          });
-}
-
-void FirebaseImpl::Patch(const std::string& key,
-                         const std::vector<std::string>& query_params,
-                         const std::string& data,
-                         fit::function<void(Status status)> callback) {
-  Request(BuildRequestUrl(key, query_params), "PATCH", data,
-          [callback = std::move(callback)](Status status,
-                                           const std::string& response) {
-            // Ignore the response body, which is the same data we sent to the
-            // server.
-            callback(status);
-          });
-}
-
-void FirebaseImpl::Delete(const std::string& key,
-                          const std::vector<std::string>& query_params,
-                          fit::function<void(Status status)> callback) {
-  Request(
-      BuildRequestUrl(key, query_params), "DELETE", "",
-      [callback = std::move(callback)](
-          Status status, const std::string& response) { callback(status); });
-}
-
-void FirebaseImpl::Watch(const std::string& key,
-                         const std::vector<std::string>& query_params,
-                         WatchClient* watch_client) {
-  watch_data_[watch_client] = std::make_unique<WatchData>();
-  watch_data_[watch_client]->request.Reset(network_wrapper_->Request(
-      MakeRequest(BuildRequestUrl(key, query_params), "GET", "", true),
-      [this, watch_client](http::URLResponse response) {
-        OnStream(watch_client, std::move(response));
-      }));
-}
-
-void FirebaseImpl::UnWatch(WatchClient* watch_client) {
-  watch_data_.erase(watch_client);
-}
-
-std::string FirebaseImpl::BuildApiUrl(const std::string& db_id,
-                                      const std::string& prefix) {
-  std::string api_url = "https://" + db_id + ".firebaseio.com";
-
-  if (!prefix.empty()) {
-    FXL_DCHECK(prefix.front() != '/');
-    FXL_DCHECK(prefix.back() != '/');
-    api_url.append("/");
-    api_url.append(prefix);
-  }
-
-  FXL_DCHECK(api_url.back() != '/');
-  return api_url;
-}
-
-std::string FirebaseImpl::BuildRequestUrl(
-    const std::string& key,
-    const std::vector<std::string>& query_params) const {
-  std::ostringstream result;
-  result << api_url_;
-  result << "/" << key << ".json";
-  if (query_params.empty()) {
-    return result.str();
-  }
-  result << "?" << fxl::JoinStrings(query_params, "&");
-  return result.str();
-}
-
-void FirebaseImpl::Request(
-    const std::string& url, const std::string& method,
-    const std::string& message,
-    fit::function<void(Status status, std::string response)> callback) {
-  requests_.emplace(network_wrapper_->Request(
-      MakeRequest(url, method, message),
-      [this,
-       callback = std::move(callback)](http::URLResponse response) mutable {
-        OnResponse(std::move(callback), std::move(response));
-      }));
-}
-
-void FirebaseImpl::OnResponse(
-    fit::function<void(Status status, std::string response)> callback,
-    http::URLResponse response) {
-  if (response.error) {
-    FXL_LOG(ERROR) << response.url << " error " << response.error->description;
-    callback(Status::NETWORK_ERROR, "");
-    return;
-  }
-
-  if (response.status_code != 200 && response.status_code != 204) {
-    const std::string& url = response.url;
-    const std::string& status_line = response.status_line;
-    FXL_DCHECK(response.body->is_stream());
-    auto& drainer = drainers_.emplace();
-    drainer.Start(std::move(response.body->stream()),
-                  [callback = std::move(callback), url,
-                   status_line](const std::string& body) {
-                    FXL_LOG(ERROR)
-                        << url << " error " << status_line << ":" << std::endl
-                        << body;
-                    callback(Status::SERVER_ERROR, "");
-                  });
-    return;
-  }
-
-  FXL_DCHECK(response.body->is_stream());
-  auto& drainer = drainers_.emplace();
-  drainer.Start(std::move(response.body->stream()),
-                [callback = std::move(callback)](const std::string& body) {
-                  callback(Status::OK, body);
-                });
-}
-
-void FirebaseImpl::OnStream(WatchClient* watch_client,
-                            http::URLResponse response) {
-  if (response.error) {
-    FXL_LOG(ERROR) << response.url << " error " << response.error->description;
-    watch_client->OnConnectionError();
-    watch_data_.erase(watch_client);
-    return;
-  }
-
-  FXL_DCHECK(response.body->is_stream());
-
-  if (response.status_code != 200 && response.status_code != 204) {
-    const std::string& url = response.url;
-    const std::string& status_line = response.status_line;
-    watch_data_[watch_client]->drainer =
-        std::make_unique<socket::SocketDrainerClient>();
-    watch_data_[watch_client]->drainer->Start(
-        std::move(response.body->stream()),
-        [this, watch_client, url, status_line](const std::string& body) {
-          FXL_LOG(ERROR) << url << " error " << status_line << ":" << std::endl
-                         << body;
-          watch_client->OnConnectionError();
-          watch_data_.erase(watch_client);
-        });
-    return;
-  }
-
-  watch_data_[watch_client]->event_stream = std::make_unique<EventStream>();
-  watch_data_[watch_client]->event_stream->Start(
-      std::move(response.body->stream()),
-      [this, watch_client](Status status, const std::string& event,
-                           const std::string& data) {
-        OnStreamEvent(watch_client, status, event, data);
-      },
-      [this, watch_client]() { OnStreamComplete(watch_client); });
-}
-
-void FirebaseImpl::OnStreamComplete(WatchClient* watch_client) {
-  watch_data_[watch_client]->event_stream.reset();
-  watch_client->OnConnectionError();
-  watch_data_.erase(watch_client);
-}
-
-void FirebaseImpl::OnStreamEvent(WatchClient* watch_client, Status /*status*/,
-                                 const std::string& event,
-                                 const std::string& payload) {
-  if (event == "put" || event == "patch") {
-    rapidjson::Document parsed_payload;
-    parsed_payload.Parse(payload.c_str(), payload.size());
-    if (parsed_payload.HasParseError()) {
-      HandleMalformedEvent(watch_client, event, payload,
-                           "failed to parse the event payload");
-      return;
-    }
-
-    // Both 'put' and 'patch' events must carry a dictionary of "path" and
-    // "data".
-    if (!parsed_payload.IsObject()) {
-      HandleMalformedEvent(watch_client, event, payload,
-                           "event payload doesn't appear to be an object");
-      return;
-    }
-    if (!parsed_payload.HasMember("path") ||
-        !parsed_payload["path"].IsString()) {
-      HandleMalformedEvent(watch_client, event, payload,
-                           "event payload doesn't contain the `path` string");
-      return;
-    }
-    if (!parsed_payload.HasMember("data")) {
-      HandleMalformedEvent(watch_client, event, payload,
-                           "event payload doesn't contain the `data` member");
-      return;
-    }
-
-    if (event == "put") {
-      watch_client->OnPut(parsed_payload["path"].GetString(),
-                          parsed_payload["data"]);
-    } else if (event == "patch") {
-      // In case of patch, data must be a dictionary itself.
-      if (!parsed_payload["data"].IsObject()) {
-        HandleMalformedEvent(
-            watch_client, event, payload,
-            "event payload `data` member doesn't appear to be an object");
-        return;
-      }
-
-      watch_client->OnPatch(parsed_payload["path"].GetString(),
-                            parsed_payload["data"]);
-    } else {
-      FXL_NOTREACHED();
-    }
-  } else if (event == "keep-alive") {
-    // Do nothing.
-  } else if (event == "cancel") {
-    watch_client->OnCancel();
-  } else if (event == "auth_revoked") {
-    watch_client->OnAuthRevoked(payload);
-  } else {
-    HandleMalformedEvent(watch_client, event, payload,
-                         "unrecognized event type");
-  }
-}
-
-void FirebaseImpl::HandleMalformedEvent(WatchClient* watch_client,
-                                        const std::string& event,
-                                        const std::string& payload,
-                                        const char error_description[]) {
-  FXL_LOG(ERROR) << "Error processing a Firebase event: " << error_description;
-  FXL_LOG(ERROR) << "Event: " << event;
-  FXL_LOG(ERROR) << "Data: " << payload;
-  watch_client->OnMalformedEvent();
-}
-
-}  // namespace firebase
diff --git a/lib/firebase/firebase_impl.h b/lib/firebase/firebase_impl.h
deleted file mode 100644
index d44612a..0000000
--- a/lib/firebase/firebase_impl.h
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_FIREBASE_IMPL_H_
-#define PERIDOT_LIB_FIREBASE_FIREBASE_IMPL_H_
-
-#include <functional>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <lib/callback/auto_cleanable.h>
-#include <lib/callback/cancellable.h>
-#include <lib/fit/function.h>
-#include <lib/network_wrapper/network_wrapper.h>
-#include <rapidjson/document.h>
-
-#include "peridot/lib/firebase/event_stream.h"
-#include "peridot/lib/firebase/firebase.h"
-#include "peridot/lib/firebase/status.h"
-#include "peridot/lib/firebase/watch_client.h"
-#include "peridot/lib/socket/socket_drainer_client.h"
-
-namespace firebase {
-
-class FirebaseImpl : public Firebase {
- public:
-  // |db_id| is the identifier of the Firebase Realtime Database instance. E.g.,
-  // if the database is hosted at https://example.firebaseio.com/, its
-  // identifier is "example".
-  //
-  // |prefix| is a url prefix against which all requests will be made, without a
-  // leading or trailing slash. (possible with slashes inside) If empty,
-  // requests will be made against root of the database.
-  FirebaseImpl(network_wrapper::NetworkWrapper* network_wrapper,
-               const std::string& db_id, const std::string& prefix);
-  ~FirebaseImpl() override;
-
-  // Firebase:
-  void Get(const std::string& key, const std::vector<std::string>& query_params,
-           fit::function<void(Status status,
-                              std::unique_ptr<rapidjson::Value> value)>
-               callback) override;
-  void Put(const std::string& key, const std::vector<std::string>& query_params,
-           const std::string& data,
-           fit::function<void(Status status)> callback) override;
-  void Patch(const std::string& key,
-             const std::vector<std::string>& query_params,
-             const std::string& data,
-             fit::function<void(Status status)> callback) override;
-  void Delete(const std::string& key,
-              const std::vector<std::string>& query_params,
-              fit::function<void(Status status)> callback) override;
-  void Watch(const std::string& key,
-             const std::vector<std::string>& query_params,
-             WatchClient* watch_client) override;
-  void UnWatch(WatchClient* watch_client) override;
-
-  const std::string& api_url() { return api_url_; }
-
- private:
-  std::string BuildApiUrl(const std::string& db_id, const std::string& prefix);
-
-  std::string BuildRequestUrl(
-      const std::string& key,
-      const std::vector<std::string>& query_params) const;
-
-  void Request(
-      const std::string& url, const std::string& method,
-      const std::string& message,
-      fit::function<void(Status status, std::string response)> callback);
-
-  void OnResponse(
-      fit::function<void(Status status, std::string response)> callback,
-      ::fuchsia::net::oldhttp::URLResponse response);
-
-  void OnStream(WatchClient* watch_client,
-                ::fuchsia::net::oldhttp::URLResponse response);
-
-  void OnStreamComplete(WatchClient* watch_client);
-
-  void OnStreamEvent(WatchClient* watch_client, Status status,
-                     const std::string& event, const std::string& payload);
-
-  void HandleMalformedEvent(WatchClient* watch_client, const std::string& event,
-                            const std::string& payload,
-                            const char error_description[]);
-
-  network_wrapper::NetworkWrapper* const network_wrapper_;
-  // Api url against which requests are made, without a trailing slash.
-  const std::string api_url_;
-
-  callback::CancellableContainer requests_;
-  callback::AutoCleanableSet<socket::SocketDrainerClient> drainers_;
-
-  struct WatchData;
-  std::map<WatchClient*, std::unique_ptr<WatchData>> watch_data_;
-};
-
-}  // namespace firebase
-
-#endif  // PERIDOT_LIB_FIREBASE_FIREBASE_IMPL_H_
diff --git a/lib/firebase/firebase_impl_unittest.cc b/lib/firebase/firebase_impl_unittest.cc
deleted file mode 100644
index 7811484..0000000
--- a/lib/firebase/firebase_impl_unittest.cc
+++ /dev/null
@@ -1,440 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase/firebase_impl.h"
-
-#include <memory>
-#include <utility>
-
-#include <lib/async/cpp/task.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fsl/socket/strings.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/gtest/test_loop_fixture.h>
-#include <lib/network_wrapper/fake_network_wrapper.h>
-#include <lib/network_wrapper/network_wrapper_impl.h>
-#include <rapidjson/document.h>
-
-#include "peridot/lib/socket/socket_pair.h"
-
-namespace firebase {
-namespace {
-
-class FirebaseImplTest : public gtest::TestLoopFixture, public WatchClient {
- public:
-  FirebaseImplTest()
-      : fake_network_wrapper_(dispatcher()),
-        firebase_(&fake_network_wrapper_, "example", "pre/fix") {}
-  ~FirebaseImplTest() override {}
-
- protected:
-  // WatchClient:
-  void OnPut(const std::string& path, const rapidjson::Value& value) override {
-    put_count_++;
-    put_paths_.push_back(path);
-    put_data_.emplace_back(value, document_.GetAllocator());
-  }
-
-  void OnPatch(const std::string& path,
-               const rapidjson::Value& value) override {
-    patch_count_++;
-    patch_paths_.push_back(path);
-    patch_data_.emplace_back(value, document_.GetAllocator());
-  }
-
-  void OnCancel() override { cancel_count_++; }
-
-  void OnAuthRevoked(const std::string& reason) override {
-    auth_revoked_count_++;
-    auth_revoked_reasons_.push_back(reason);
-  }
-
-  void OnMalformedEvent() override { malformed_event_count_++; }
-
-  void OnConnectionError() override { connection_error_count_++; }
-
-  std::vector<std::string> put_paths_;
-  std::vector<rapidjson::Value> put_data_;
-  unsigned int put_count_ = 0u;
-
-  std::vector<std::string> patch_paths_;
-  std::vector<rapidjson::Value> patch_data_;
-  unsigned int patch_count_ = 0u;
-
-  unsigned int cancel_count_ = 0u;
-
-  std::vector<std::string> auth_revoked_reasons_;
-  unsigned int auth_revoked_count_ = 0u;
-
-  unsigned int malformed_event_count_ = 0u;
-
-  unsigned int connection_error_count_ = 0u;
-
-  network_wrapper::FakeNetworkWrapper fake_network_wrapper_;
-  FirebaseImpl firebase_;
-
- private:
-  // Used for its allocator which we use to make copies of rapidjson Values.
-  rapidjson::Document document_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(FirebaseImplTest);
-};
-
-// Verifies that GET requests are handled correctly.
-TEST_F(FirebaseImplTest, Get) {
-  fake_network_wrapper_.SetStringResponse("\"content\"", 200);
-
-  bool called;
-  Status status;
-  std::unique_ptr<rapidjson::Value> value;
-  firebase_.Get(
-      "bazinga", {},
-      callback::Capture(callback::SetWhenCalled(&called), &status, &value));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  ASSERT_TRUE(value);
-  EXPECT_TRUE(value->IsString());
-  EXPECT_EQ("content", *value);
-  EXPECT_EQ("https://example.firebaseio.com/pre/fix/bazinga.json",
-            fake_network_wrapper_.GetRequest()->url);
-  EXPECT_EQ("GET", fake_network_wrapper_.GetRequest()->method);
-}
-
-TEST_F(FirebaseImplTest, GetError) {
-  fake_network_wrapper_.SetStringResponse("\"content\"", 404);
-  bool called;
-  Status status;
-  std::unique_ptr<rapidjson::Value> value;
-  firebase_.Get(
-      "bazinga", {},
-      callback::Capture(callback::SetWhenCalled(&called), &status, &value));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_NE(Status::OK, status);
-  ASSERT_TRUE(value);
-  EXPECT_TRUE(value->IsNull());
-}
-
-TEST_F(FirebaseImplTest, GetWithSingleQueryParam) {
-  fake_network_wrapper_.SetStringResponse("content", 200);
-  bool called;
-  Status status;
-  firebase_.Get("bazinga", {"orderBy=\"timestamp\""},
-                callback::Capture(callback::SetWhenCalled(&called), &status,
-                                  &std::ignore));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::PARSE_ERROR, status);
-  EXPECT_EQ(
-      "https://example.firebaseio.com/pre/fix/"
-      "bazinga.json?orderBy=\"timestamp\"",
-      fake_network_wrapper_.GetRequest()->url);
-  EXPECT_EQ("GET", fake_network_wrapper_.GetRequest()->method);
-}
-
-TEST_F(FirebaseImplTest, GetWithTwoQueryParams) {
-  fake_network_wrapper_.SetStringResponse("content", 200);
-  bool called;
-  Status status;
-  firebase_.Get("bazinga", {"one_param", "other_param=bla"},
-                callback::Capture(callback::SetWhenCalled(&called), &status,
-                                  &std::ignore));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::PARSE_ERROR, status);
-  EXPECT_EQ(
-      "https://example.firebaseio.com/pre/fix/"
-      "bazinga.json?one_param&other_param=bla",
-      fake_network_wrapper_.GetRequest()->url);
-  EXPECT_EQ("GET", fake_network_wrapper_.GetRequest()->method);
-}
-
-// Verifies that request urls for root of the db are correctly formed.
-TEST_F(FirebaseImplTest, Root) {
-  fake_network_wrapper_.SetStringResponse("42", 200);
-  bool called;
-  Status status;
-  firebase_.Get("", {},
-                callback::Capture(callback::SetWhenCalled(&called), &status,
-                                  &std::ignore));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ("https://example.firebaseio.com/pre/fix/.json",
-            fake_network_wrapper_.GetRequest()->url);
-}
-
-// Verifies that PUT requests are handled correctly.
-TEST_F(FirebaseImplTest, Put) {
-  // Firebase server seems to respond with the data we sent to it. This is not
-  // useful for the client so our API doesn't expose it to the client.
-  fake_network_wrapper_.SetStringResponse("\"Alice\"", 200);
-  bool called;
-  Status status;
-  firebase_.Put("name", {}, "\"Alice\"",
-                callback::Capture(callback::SetWhenCalled(&called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ("https://example.firebaseio.com/pre/fix/name.json",
-            fake_network_wrapper_.GetRequest()->url);
-  EXPECT_EQ("PUT", fake_network_wrapper_.GetRequest()->method);
-}
-
-// Verifies that PATCH requests are handled correctly.
-TEST_F(FirebaseImplTest, Patch) {
-  fake_network_wrapper_.SetStringResponse("\"ok\"", 200);
-  bool called;
-  Status status;
-  std::string data = R"({"name":"Alice"})";
-  firebase_.Patch("person", {}, data,
-                  callback::Capture(callback::SetWhenCalled(&called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ("https://example.firebaseio.com/pre/fix/person.json",
-            fake_network_wrapper_.GetRequest()->url);
-  EXPECT_EQ("PATCH", fake_network_wrapper_.GetRequest()->method);
-}
-
-// Verifies that DELETE requests are made correctly.
-TEST_F(FirebaseImplTest, Delete) {
-  fake_network_wrapper_.SetStringResponse("", 200);
-  bool called;
-  Status status;
-  firebase_.Delete(
-      "name", {}, callback::Capture(callback::SetWhenCalled(&called), &status));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(Status::OK, status);
-  EXPECT_EQ("https://example.firebaseio.com/pre/fix/name.json",
-            fake_network_wrapper_.GetRequest()->url);
-  EXPECT_EQ("DELETE", fake_network_wrapper_.GetRequest()->method);
-}
-
-// Verifies that event-stream requests are correctly formed.
-TEST_F(FirebaseImplTest, WatchRequest) {
-  fake_network_wrapper_.SetStringResponse("", 200);
-
-  firebase_.Watch("some/path", {}, this);
-  RunLoopUntilIdle();
-
-  EXPECT_EQ("https://example.firebaseio.com/pre/fix/some/path.json",
-            fake_network_wrapper_.GetRequest()->url);
-  EXPECT_EQ("GET", fake_network_wrapper_.GetRequest()->method);
-  EXPECT_EQ(1u, fake_network_wrapper_.GetRequest()->headers->size());
-  EXPECT_EQ("Accept", fake_network_wrapper_.GetRequest()->headers->at(0).name);
-  EXPECT_EQ("text/event-stream",
-            fake_network_wrapper_.GetRequest()->headers->at(0).value);
-}
-
-TEST_F(FirebaseImplTest, WatchRequestWithQuery) {
-  fake_network_wrapper_.SetStringResponse("", 200);
-
-  firebase_.Watch("some/path", {"orderBy=\"timestamp\""}, this);
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(
-      "https://example.firebaseio.com/pre/fix/some/path.json"
-      "?orderBy=\"timestamp\"",
-      fake_network_wrapper_.GetRequest()->url);
-  EXPECT_EQ("GET", fake_network_wrapper_.GetRequest()->method);
-  EXPECT_EQ(1u, fake_network_wrapper_.GetRequest()->headers->size());
-  EXPECT_EQ("Accept", fake_network_wrapper_.GetRequest()->headers->at(0).name);
-  EXPECT_EQ("text/event-stream",
-            fake_network_wrapper_.GetRequest()->headers->at(0).value);
-}
-
-TEST_F(FirebaseImplTest, WatchPut) {
-  std::string stream_body = std::string(
-      "event: put\n"
-      "data: {\"path\":\"/\",\"data\":\"Alice\"}\n"
-      "\n"
-      "event: put\n"
-      "data: {\"path\":\"/bla/\",\"data\":{\"name\":\"Bob\"}}\n"
-      "\n"
-      "event: put\n"
-      "data: {\"path\":\"/\",\"data\":42.5}\n"
-      "\n");
-  fake_network_wrapper_.SetStringResponse(stream_body, 200);
-
-  firebase_.Watch("/", {}, this);
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(3u, put_count_);
-  EXPECT_EQ(0u, patch_count_);
-  EXPECT_EQ(0u, cancel_count_);
-  EXPECT_EQ(0u, auth_revoked_count_);
-  EXPECT_EQ(0u, malformed_event_count_);
-
-  EXPECT_EQ("/", put_paths_[0]);
-  EXPECT_EQ("Alice", put_data_[0]);
-
-  EXPECT_EQ("/bla/", put_paths_[1]);
-  EXPECT_EQ("Bob", put_data_[1]["name"]);
-
-  EXPECT_EQ("/", put_paths_[2]);
-  EXPECT_EQ(42.5, put_data_[2]);
-}
-
-TEST_F(FirebaseImplTest, WatchPatch) {
-  std::string stream_body = std::string(
-      "event: patch\n"
-      "data: "
-      "{\"path\":\"/bla/\",\"data\":{\"name1\":\"Alice\",\"name2\":\"Bob\"}}\n"
-      "\n");
-  fake_network_wrapper_.SetStringResponse(stream_body, 200);
-
-  firebase_.Watch("/", {}, this);
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(0u, put_count_);
-  EXPECT_EQ(1u, patch_count_);
-  EXPECT_EQ(0u, cancel_count_);
-  EXPECT_EQ(0u, auth_revoked_count_);
-  EXPECT_EQ(0u, malformed_event_count_);
-
-  EXPECT_EQ("/bla/", patch_paths_[0]);
-  EXPECT_EQ("Alice", patch_data_[0]["name1"]);
-  EXPECT_EQ("Bob", patch_data_[0]["name2"]);
-}
-
-TEST_F(FirebaseImplTest, WatchKeepAlive) {
-  std::string stream_body = std::string(
-      "event: keep-alive\n"
-      "data: null\n"
-      "\n");
-  fake_network_wrapper_.SetStringResponse(stream_body, 200);
-
-  firebase_.Watch("name", {}, this);
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(0u, put_count_);
-  EXPECT_EQ(0u, patch_count_);
-  EXPECT_EQ(0u, cancel_count_);
-  EXPECT_EQ(0u, auth_revoked_count_);
-  EXPECT_EQ(0u, malformed_event_count_);
-}
-
-TEST_F(FirebaseImplTest, WatchCancel) {
-  std::string stream_body = std::string(
-      "event: cancel\n"
-      "data: null\n"
-      "\n");
-  fake_network_wrapper_.SetStringResponse(stream_body, 200);
-
-  firebase_.Watch("/", {}, this);
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(0u, put_count_);
-  EXPECT_EQ(0u, patch_count_);
-  EXPECT_EQ(1u, cancel_count_);
-  EXPECT_EQ(0u, auth_revoked_count_);
-  EXPECT_EQ(0u, malformed_event_count_);
-}
-
-TEST_F(FirebaseImplTest, WatchAuthRevoked) {
-  std::string stream_body = std::string(
-      "event: auth_revoked\n"
-      "data: credential is no longer valid\n"
-      "\n");
-  fake_network_wrapper_.SetStringResponse(stream_body, 200);
-
-  firebase_.Watch("/", {}, this);
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(0u, put_count_);
-  EXPECT_EQ(0u, patch_count_);
-  EXPECT_EQ(0u, cancel_count_);
-  EXPECT_EQ(1u, auth_revoked_count_);
-  EXPECT_EQ(0u, malformed_event_count_);
-
-  EXPECT_EQ("credential is no longer valid", auth_revoked_reasons_[0]);
-}
-
-TEST_F(FirebaseImplTest, WatchErrorUnknownEvent) {
-  std::string stream_body = std::string(
-      "event: wild-animal-appears\n"
-      "data: null\n"
-      "\n");
-  fake_network_wrapper_.SetStringResponse(stream_body, 200);
-
-  firebase_.Watch("/", {}, this);
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(0u, put_count_);
-  EXPECT_EQ(0u, patch_count_);
-  EXPECT_EQ(0u, cancel_count_);
-  EXPECT_EQ(0u, auth_revoked_count_);
-  EXPECT_EQ(1u, malformed_event_count_);
-}
-
-TEST_F(FirebaseImplTest, WatchHttpError) {
-  fake_network_wrapper_.SetStringResponse("", 404);
-
-  firebase_.Watch("/", {}, this);
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(0u, put_count_);
-  EXPECT_EQ(0u, patch_count_);
-  EXPECT_EQ(0u, cancel_count_);
-  EXPECT_EQ(0u, auth_revoked_count_);
-  EXPECT_EQ(0u, malformed_event_count_);
-  EXPECT_EQ(1u, connection_error_count_);
-}
-
-TEST_F(FirebaseImplTest, UnWatch) {
-  std::string event = std::string(
-      "event: put\n"
-      "data: {\"path\":\"/\",\"data\":\"Alice\"}\n"
-      "\n");
-  socket::SocketPair socket;
-  fake_network_wrapper_.SetSocketResponse(std::move(socket.socket1), 200);
-  firebase_.Watch("/", {}, this);
-
-  EXPECT_TRUE(fsl::BlockingCopyFromString(event, socket.socket2));
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(1u, put_count_);
-  EXPECT_EQ(0u, patch_count_);
-  EXPECT_EQ(0u, cancel_count_);
-  EXPECT_EQ(0u, auth_revoked_count_);
-  EXPECT_EQ(0u, malformed_event_count_);
-  EXPECT_EQ(0u, connection_error_count_);
-
-  EXPECT_TRUE(fsl::BlockingCopyFromString(event, socket.socket2));
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(2u, put_count_);
-  EXPECT_EQ(0u, patch_count_);
-  EXPECT_EQ(0u, cancel_count_);
-  EXPECT_EQ(0u, auth_revoked_count_);
-  EXPECT_EQ(0u, malformed_event_count_);
-  EXPECT_EQ(0u, connection_error_count_);
-
-  // Unregister the watch client and make sure that we are *not* notified about
-  // the next event.
-  firebase_.UnWatch(this);
-  EXPECT_TRUE(fsl::BlockingCopyFromString(event, socket.socket2));
-  RunLoopUntilIdle();
-
-  EXPECT_EQ(2u, put_count_);
-  EXPECT_EQ(0u, patch_count_);
-  EXPECT_EQ(0u, cancel_count_);
-  EXPECT_EQ(0u, auth_revoked_count_);
-  EXPECT_EQ(0u, malformed_event_count_);
-  EXPECT_EQ(0u, connection_error_count_);
-}
-
-}  // namespace
-}  // namespace firebase
diff --git a/lib/firebase/status.cc b/lib/firebase/status.cc
deleted file mode 100644
index 09521f9..0000000
--- a/lib/firebase/status.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase/status.h"
-
-namespace firebase {
-
-fxl::StringView StatusToString(Status status) {
-  switch (status) {
-    case Status::OK:
-      return "OK";
-    case Status::NETWORK_ERROR:
-      return "NETWORK_ERROR";
-    case Status::PARSE_ERROR:
-      return "PARSE_ERROR";
-    case Status::SERVER_ERROR:
-      return "SERVER_ERROR";
-  }
-}
-
-std::ostream& operator<<(std::ostream& os, Status status) {
-  return os << StatusToString(status);
-}
-
-}  // namespace firebase
diff --git a/lib/firebase/status.h b/lib/firebase/status.h
deleted file mode 100644
index 7457290..0000000
--- a/lib/firebase/status.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_STATUS_H_
-#define PERIDOT_LIB_FIREBASE_STATUS_H_
-
-#include <iostream>
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace firebase {
-
-enum class Status { OK, NETWORK_ERROR, PARSE_ERROR, SERVER_ERROR };
-
-fxl::StringView StatusToString(Status status);
-
-std::ostream& operator<<(std::ostream& os, Status status);
-
-}  // namespace firebase
-
-#endif  // PERIDOT_LIB_FIREBASE_STATUS_H_
diff --git a/lib/firebase/watch_client.h b/lib/firebase/watch_client.h
deleted file mode 100644
index c15670a..0000000
--- a/lib/firebase/watch_client.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_WATCH_CLIENT_H_
-#define PERIDOT_LIB_FIREBASE_WATCH_CLIENT_H_
-
-#include <rapidjson/document.h>
-
-namespace firebase {
-
-class WatchClient {
- public:
-  virtual ~WatchClient() {}
-
-  // See
-  // https://firebase.google.com/docs/database/rest/retrieve-data#section-rest-streaming
-  virtual void OnPut(const std::string& path,
-                     const rapidjson::Value& value) = 0;
-  virtual void OnPatch(const std::string& path,
-                       const rapidjson::Value& value) = 0;
-  virtual void OnCancel() = 0;
-  virtual void OnAuthRevoked(const std::string& reason) = 0;
-
-  // Called when a Firebase event of incorrect format is received. Such
-  // notification is ignored, further events continue to be processed after this
-  // call (but clients might choose to close the stream themselves).
-  virtual void OnMalformedEvent() = 0;
-
-  // Called when the stream of events can't be established, or is interrupted,
-  // or the server closes the connection. No further calls will be made on this
-  // WatchClient.
-  virtual void OnConnectionError() = 0;
-};
-
-}  // namespace firebase
-
-#endif  // PERIDOT_LIB_FIREBASE_WATCH_CLIENT_H_
diff --git a/lib/firebase_auth/BUILD.gn b/lib/firebase_auth/BUILD.gn
deleted file mode 100644
index 4e847f0..0000000
--- a/lib/firebase_auth/BUILD.gn
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [
-  "//peridot/bin/*",
-  "//peridot/lib/*",
-]
-
-# TODO(prathyushk): Refactor this once the GN feature discussed below
-# is available.
-# https://groups.google.com/a/chromium.org/d/msg/gn-dev/zoVnBgjLgnQ/9yzGr7r3BAAJ
-#
-# This source_set depends on including the generated ledger Cobalt
-# config as a resource. See peridot/bin/ledger/BUILD.gn for an example.
-source_set("firebase_auth") {
-  sources = [
-    "firebase_auth.h",
-    "firebase_auth_impl.cc",
-    "firebase_auth_impl.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/fidl/fuchsia.auth",
-    "//garnet/public/lib/backoff",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/cobalt/cpp:cobalt_logger",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/rng",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//zircon/public/lib/fit",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "firebase_auth_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":firebase_auth",
-    "//garnet/public/lib/backoff/testing",
-    "//garnet/public/lib/gtest",
-    "//peridot/lib/firebase_auth/testing",
-  ]
-}
diff --git a/lib/firebase_auth/firebase_auth.h b/lib/firebase_auth/firebase_auth.h
deleted file mode 100644
index 2c87c86..0000000
--- a/lib/firebase_auth/firebase_auth.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_AUTH_FIREBASE_AUTH_H_
-#define PERIDOT_LIB_FIREBASE_AUTH_FIREBASE_AUTH_H_
-
-#include <functional>
-#include <string>
-
-#include <lib/callback/cancellable.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/functional/closure.h>
-#include <lib/fxl/macros.h>
-
-namespace firebase_auth {
-
-enum class AuthStatus {
-  OK,
-  // Failed to retrieve the auth token.
-  ERROR
-};
-
-// Source of Firebase Auth tokens that can be used to authenticate with Firebase
-// services such as Firebase Real-Time Database, Firebase Storage or Firestore.
-//
-// Each instance of this class is tied to exactly one user.
-class FirebaseAuth {
- public:
-  FirebaseAuth() {}
-  virtual ~FirebaseAuth() {}
-
-  virtual void set_error_handler(fit::closure /*on_error*/) {}
-
-  // Retrieves the Firebase ID token suitable to use with Firebase Real-time
-  // Database and Firebase Storage.
-  virtual fxl::RefPtr<callback::Cancellable> GetFirebaseToken(
-      fit::function<void(AuthStatus, std::string)> callback) = 0;
-
-  // Retrieves the Firebase user ID of the user.
-  virtual fxl::RefPtr<callback::Cancellable> GetFirebaseUserId(
-      fit::function<void(AuthStatus, std::string)> callback) = 0;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(FirebaseAuth);
-};
-
-}  // namespace firebase_auth
-
-#endif  // PERIDOT_LIB_FIREBASE_AUTH_FIREBASE_AUTH_H_
diff --git a/lib/firebase_auth/firebase_auth_impl.cc b/lib/firebase_auth/firebase_auth_impl.cc
deleted file mode 100644
index f5de43b..0000000
--- a/lib/firebase_auth/firebase_auth_impl.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/firebase_auth_impl.h"
-
-#include <utility>
-
-#include <lib/backoff/exponential_backoff.h>
-#include <lib/callback/cancellable_helper.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/vmo/file.h>
-#include <lib/fxl/functional/closure.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-namespace firebase_auth {
-namespace {
-
-constexpr char kConfigBinProtoPath[] =
-    "/pkg/data/firebase_auth_cobalt_config.pb";
-constexpr int32_t kCobaltAuthFailureMetricId = 4;
-
-// Returns true if the authentication failure may be transient.
-bool IsRetriableError(fuchsia::auth::Status status) {
-  switch (status) {
-    case fuchsia::auth::Status::OK:  // This should never happen.
-    case fuchsia::auth::Status::AUTH_PROVIDER_SERVER_ERROR:
-    case fuchsia::auth::Status::AUTH_PROVIDER_SERVICE_UNAVAILABLE:
-    case fuchsia::auth::Status::INVALID_AUTH_CONTEXT:
-    case fuchsia::auth::Status::INVALID_REQUEST:
-    case fuchsia::auth::Status::USER_NOT_FOUND:
-    case fuchsia::auth::Status::USER_CANCELLED:
-    case fuchsia::auth::Status::REAUTH_REQUIRED:
-      return false;
-    case fuchsia::auth::Status::UNKNOWN_ERROR:
-    case fuchsia::auth::Status::NETWORK_ERROR:
-    case fuchsia::auth::Status::INTERNAL_ERROR:
-    case fuchsia::auth::Status::IO_ERROR:
-      return true;
-  }
-  // In case of unexpected status, retry just in case.
-  return true;
-}
-}  // namespace
-
-FirebaseAuthImpl::FirebaseAuthImpl(
-    Config config, async_dispatcher_t* dispatcher, rng::Random* random,
-    fuchsia::auth::TokenManagerPtr token_manager,
-    component::StartupContext* startup_context)
-    : config_(std::move(config)),
-      token_manager_(std::move(token_manager)),
-      backoff_(std::make_unique<backoff::ExponentialBackoff>(
-          random->NewBitGenerator<uint64_t>())),
-      max_retries_(config_.max_retries),
-      cobalt_client_name_(config_.cobalt_client_name),
-      task_runner_(dispatcher) {
-  if (startup_context) {
-    cobalt_logger_ = cobalt::NewCobaltLogger(dispatcher, startup_context,
-                                             kConfigBinProtoPath);
-  } else {
-    cobalt_logger_ = nullptr;
-  }
-}
-
-FirebaseAuthImpl::FirebaseAuthImpl(
-    Config config, async_dispatcher_t* dispatcher,
-    fuchsia::auth::TokenManagerPtr token_manager,
-    std::unique_ptr<backoff::Backoff> backoff,
-    std::unique_ptr<cobalt::CobaltLogger> cobalt_logger)
-    : config_(std::move(config)),
-      token_manager_(std::move(token_manager)),
-      backoff_(std::move(backoff)),
-      max_retries_(config_.max_retries),
-      cobalt_client_name_(config_.cobalt_client_name),
-      cobalt_logger_(std::move(cobalt_logger)),
-      task_runner_(dispatcher) {}
-
-void FirebaseAuthImpl::set_error_handler(fit::closure on_error) {
-  token_manager_.set_error_handler(
-      [on_error = std::move(on_error)](zx_status_t status) { on_error(); });
-}
-
-fxl::RefPtr<callback::Cancellable> FirebaseAuthImpl::GetFirebaseToken(
-    fit::function<void(AuthStatus, std::string)> callback) {
-  if (config_.api_key.empty()) {
-    FXL_LOG(WARNING) << "No Firebase API key provided. Connection to Firebase "
-                        "may be unauthenticated.";
-  }
-  auto cancellable = callback::CancellableImpl::Create([] {});
-  GetToken(max_retries_, [callback = cancellable->WrapCallback(
-                              std::move(callback))](auto status, auto token) {
-    callback(status, token ? token->id_token : "");
-  });
-  return cancellable;
-}
-
-fxl::RefPtr<callback::Cancellable> FirebaseAuthImpl::GetFirebaseUserId(
-    fit::function<void(AuthStatus, std::string)> callback) {
-  auto cancellable = callback::CancellableImpl::Create([] {});
-  GetToken(max_retries_, [callback = cancellable->WrapCallback(
-                              std::move(callback))](auto status, auto token) {
-    callback(status, token ? token->local_id : "");
-  });
-  return cancellable;
-}
-
-void FirebaseAuthImpl::GetToken(
-    int max_retries,
-    fit::function<void(AuthStatus, fuchsia::auth::FirebaseTokenPtr)> callback) {
-  fuchsia::auth::AppConfig oauth_config;
-  oauth_config.auth_provider_type = "google";
-
-  token_manager_->GetFirebaseToken(
-      std::move(oauth_config), "", /*user_profile_id*/
-      "",                          /*audience*/
-      config_.api_key,
-      fxl::MakeCopyable([this, max_retries, callback = std::move(callback)](
-                            fuchsia::auth::Status status,
-                            fuchsia::auth::FirebaseTokenPtr token) mutable {
-        if (!token || status != fuchsia::auth::Status::OK) {
-          if (!token && status == fuchsia::auth::Status::OK) {
-            FXL_LOG(ERROR)
-                << "null Firebase token returned from token provider with no "
-                << "error reported. This should never happen. Retrying.";
-            status = fuchsia::auth::Status::UNKNOWN_ERROR;
-          } else {
-            FXL_LOG(ERROR)
-                << "Error retrieving the Firebase token from token provider: "
-                << fidl::ToUnderlying(status) << "', retrying.";
-          }
-
-          if (max_retries > 0 && IsRetriableError(status)) {
-            task_runner_.PostDelayedTask(
-                [this, max_retries, callback = std::move(callback)]() mutable {
-                  GetToken(max_retries - 1, std::move(callback));
-                },
-                backoff_->GetNext());
-            return;
-          }
-        }
-
-        backoff_->Reset();
-        if (status == fuchsia::auth::Status::OK) {
-          callback(AuthStatus::OK, std::move(token));
-        } else {
-          ReportError(kCobaltAuthFailureMetricId,
-                      static_cast<uint32_t>(status));
-          callback(AuthStatus::ERROR, std::move(token));
-        }
-      }));
-}
-
-void FirebaseAuthImpl::ReportError(int32_t metric_id, uint32_t status) {
-  if (cobalt_client_name_.empty() || cobalt_logger_ == nullptr) {
-    return;
-  }
-
-  cobalt_logger_->LogEventCount(metric_id, status, cobalt_client_name_,
-                                zx::duration(0), 1);
-}
-}  // namespace firebase_auth
diff --git a/lib/firebase_auth/firebase_auth_impl.h b/lib/firebase_auth/firebase_auth_impl.h
deleted file mode 100644
index 3e74c2d..0000000
--- a/lib/firebase_auth/firebase_auth_impl.h
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_AUTH_FIREBASE_AUTH_IMPL_H_
-#define PERIDOT_LIB_FIREBASE_AUTH_FIREBASE_AUTH_IMPL_H_
-
-#include <functional>
-#include <memory>
-#include <string>
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <lib/async/dispatcher.h>
-#include <lib/backoff/backoff.h>
-#include <lib/callback/cancellable.h>
-#include <lib/callback/scoped_task_runner.h>
-#include <lib/cobalt/cpp/cobalt_logger.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fit/function.h>
-
-#include "peridot/lib/firebase_auth/firebase_auth.h"
-#include "peridot/lib/rng/random.h"
-
-namespace firebase_auth {
-
-// Source of the auth information for cloud sync to use, implemented using the
-// system token provider.
-//
-// If configured with an empty |api_key|, doesn't attempt to use
-// |token_manager| and yields empty Firebase tokens and user ids. This allows
-// the code to work without auth against public instances (e.g. for running
-// benchmarks).
-//
-// If configured with an empty |cobalt_client_name| or null |startup_context|,
-// disables statistics collection about failures.
-//
-// *Warning*: if |token_manager| disconnects, all requests in progress are
-// dropped on the floor. TODO(ppi): keep track of pending requests and call the
-// callbacks with status TOKEN_MANAGER_DISCONNECTED when this happens.
-class FirebaseAuthImpl : public FirebaseAuth {
- public:
-  struct Config {
-    // Value of the Firebase api key.
-    std::string api_key;
-    // Name of the client to record during Cobalt error reporting.
-    std::string cobalt_client_name;
-    // Maximum number of retries on non-fatal errors.
-    int max_retries = 5;
-  };
-
-  FirebaseAuthImpl(Config config, async_dispatcher_t* dispatcher,
-                   rng::Random* random,
-                   fuchsia::auth::TokenManagerPtr token_manager,
-                   component::StartupContext* startup_context);
-  // For tests.
-  FirebaseAuthImpl(Config config, async_dispatcher_t* dispatcher,
-                   fuchsia::auth::TokenManagerPtr token_manager,
-                   std::unique_ptr<backoff::Backoff> backoff,
-                   std::unique_ptr<cobalt::CobaltLogger> cobalt_logger);
-
-  // FirebaseAuth:
-  void set_error_handler(fit::closure on_error) override;
-
-  fxl::RefPtr<callback::Cancellable> GetFirebaseToken(
-      fit::function<void(firebase_auth::AuthStatus, std::string)> callback)
-      override;
-
-  fxl::RefPtr<callback::Cancellable> GetFirebaseUserId(
-      fit::function<void(firebase_auth::AuthStatus, std::string)> callback)
-      override;
-
- private:
-  // Retrieves the Firebase token from the fuchsia::auth::TokenManager,
-  // transparently retrying the request up to |max_retries| times in case of
-  // non-fatal errors.
-  void GetToken(int max_retries,
-                fit::function<void(firebase_auth::AuthStatus,
-                                   fuchsia::auth::FirebaseTokenPtr)>
-                    callback);
-
-  // Sends a Cobalt event for metric |metric_id| counting the error code
-  // |status|, unless |cobalt_client_name_| is empty.
-  void ReportError(int32_t metric_id, uint32_t status);
-
-  const Config config_;
-  fuchsia::auth::TokenManagerPtr token_manager_;
-  const std::unique_ptr<backoff::Backoff> backoff_;
-  const int max_retries_;
-
-  // Members for Cobalt reporting.
-  const std::string cobalt_client_name_;
-  std::unique_ptr<cobalt::CobaltLogger> cobalt_logger_;
-
-  // Must be the last member field.
-  callback::ScopedTaskRunner task_runner_;
-};
-
-}  // namespace firebase_auth
-
-#endif  // PERIDOT_LIB_FIREBASE_AUTH_FIREBASE_AUTH_IMPL_H_
diff --git a/lib/firebase_auth/firebase_auth_impl_unittest.cc b/lib/firebase_auth/firebase_auth_impl_unittest.cc
deleted file mode 100644
index 58df55c..0000000
--- a/lib/firebase_auth/firebase_auth_impl_unittest.cc
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/firebase_auth_impl.h"
-
-#include <utility>
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <lib/backoff/testing/test_backoff.h>
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/lib/firebase_auth/testing/test_token_manager.h"
-
-namespace firebase_auth {
-
-namespace {
-
-class MockCobaltLogger : public cobalt::CobaltLogger {
- public:
-  ~MockCobaltLogger() override = default;
-
-  MockCobaltLogger(int* called) : called_(called) {}
-
-  void LogEvent(uint32_t metric_id, uint32_t event_code) override {}
-  void LogEventCount(uint32_t metric_id, uint32_t event_code,
-                     const std::string& component, zx::duration period_duration,
-                     int64_t count) override {
-    EXPECT_EQ(4u, metric_id);
-    // The value should contain the client name.
-    EXPECT_TRUE(component.find("firebase-test") != std::string::npos);
-    *called_ += 1;
-  }
-  void LogElapsedTime(uint32_t metric_id, uint32_t event_code,
-                      const std::string& component,
-                      zx::duration elapsed_time) override {}
-  void LogFrameRate(uint32_t metric_id, uint32_t event_code,
-                    const std::string& component, float fps) override {}
-  void LogMemoryUsage(uint32_t metric_id, uint32_t event_code,
-                      const std::string& component, int64_t bytes) override {}
-  void LogString(uint32_t metric_id, const std::string& s) override {}
-  void StartTimer(uint32_t metric_id, uint32_t event_code,
-                  const std::string& component, const std::string& timer_id,
-                  zx::time timestamp, zx::duration timeout) override {}
-  void EndTimer(const std::string& timer_id, zx::time timestamp,
-                zx::duration timeout) override {}
-  void LogIntHistogram(
-      uint32_t metric_id, uint32_t event_code, const std::string& component,
-      std::vector<fuchsia::cobalt::HistogramBucket> histogram) override {}
-  void LogCustomEvent(
-      uint32_t metric_id,
-      std::vector<fuchsia::cobalt::CustomEventValue> event_values) override {}
-
- private:
-  int* called_;
-};
-
-class FirebaseAuthImplTest : public gtest::TestLoopFixture {
- public:
-  FirebaseAuthImplTest()
-      : token_manager_(dispatcher()),
-        token_manager_binding_(&token_manager_),
-        firebase_auth_(
-            {"api_key", "firebase-test", 1}, dispatcher(),
-            token_manager_binding_.NewBinding().Bind(), InitBackoff(),
-            std::make_unique<MockCobaltLogger>(&report_observation_count_)) {}
-
-  ~FirebaseAuthImplTest() override {}
-
- protected:
-  std::unique_ptr<backoff::Backoff> InitBackoff() {
-    // TODO(LE-630): Don't use a backoff duration of 0.
-    auto backoff = std::make_unique<backoff::TestBackoff>(zx::sec(0));
-    backoff_ = backoff.get();
-    return backoff;
-  }
-
-  TestTokenManager token_manager_;
-  fidl::Binding<fuchsia::auth::TokenManager> token_manager_binding_;
-  FirebaseAuthImpl firebase_auth_;
-  int report_observation_count_ = 0;
-  backoff::TestBackoff* backoff_;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(FirebaseAuthImplTest);
-};
-
-TEST_F(FirebaseAuthImplTest, GetFirebaseToken) {
-  token_manager_.Set("this is a token", "some id", "me@example.com");
-
-  bool called;
-  AuthStatus auth_status;
-  std::string firebase_token;
-  firebase_auth_.GetFirebaseToken(callback::Capture(
-      callback::SetWhenCalled(&called), &auth_status, &firebase_token));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(AuthStatus::OK, auth_status);
-  EXPECT_EQ("this is a token", firebase_token);
-  EXPECT_EQ(0, report_observation_count_);
-}
-
-TEST_F(FirebaseAuthImplTest, GetFirebaseTokenRetryOnError) {
-  bool called;
-  AuthStatus auth_status;
-  std::string firebase_token;
-  token_manager_.SetError(fuchsia::auth::Status::NETWORK_ERROR);
-  backoff_->SetOnGetNext(QuitLoopClosure());
-  firebase_auth_.GetFirebaseToken(callback::Capture(
-      callback::SetWhenCalled(&called), &auth_status, &firebase_token));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-  EXPECT_EQ(1, backoff_->get_next_count);
-  EXPECT_EQ(0, backoff_->reset_count);
-  EXPECT_EQ(0, report_observation_count_);
-
-  token_manager_.Set("this is a token", "some id", "me@example.com");
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(AuthStatus::OK, auth_status);
-  EXPECT_EQ("this is a token", firebase_token);
-  EXPECT_EQ(1, backoff_->get_next_count);
-  EXPECT_EQ(1, backoff_->reset_count);
-  EXPECT_EQ(0, report_observation_count_);
-}
-
-TEST_F(FirebaseAuthImplTest, GetFirebaseUserId) {
-  token_manager_.Set("this is a token", "some id", "me@example.com");
-
-  bool called;
-  AuthStatus auth_status;
-  std::string firebase_user_id;
-  firebase_auth_.GetFirebaseUserId(callback::Capture(
-      callback::SetWhenCalled(&called), &auth_status, &firebase_user_id));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(AuthStatus::OK, auth_status);
-  EXPECT_EQ("some id", firebase_user_id);
-  EXPECT_EQ(0, report_observation_count_);
-}
-
-TEST_F(FirebaseAuthImplTest, GetFirebaseUserIdRetryOnError) {
-  bool called;
-  AuthStatus auth_status;
-  std::string firebase_id;
-  token_manager_.SetError(fuchsia::auth::Status::NETWORK_ERROR);
-  backoff_->SetOnGetNext(QuitLoopClosure());
-  firebase_auth_.GetFirebaseUserId(callback::Capture(
-      callback::SetWhenCalled(&called), &auth_status, &firebase_id));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-  EXPECT_EQ(1, backoff_->get_next_count);
-  EXPECT_EQ(0, backoff_->reset_count);
-  EXPECT_EQ(0, report_observation_count_);
-
-  token_manager_.Set("this is a token", "some id", "me@example.com");
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(AuthStatus::OK, auth_status);
-  EXPECT_EQ("some id", firebase_id);
-  EXPECT_EQ(1, backoff_->get_next_count);
-  EXPECT_EQ(1, backoff_->reset_count);
-  EXPECT_EQ(0, report_observation_count_);
-}
-
-TEST_F(FirebaseAuthImplTest, GetFirebaseUserIdMaxRetry) {
-  bool called;
-  AuthStatus auth_status;
-  token_manager_.SetError(fuchsia::auth::Status::NETWORK_ERROR);
-  backoff_->SetOnGetNext(QuitLoopClosure());
-  firebase_auth_.GetFirebaseUserId(callback::Capture(
-      callback::SetWhenCalled(&called), &auth_status, &std::ignore));
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-  EXPECT_EQ(1, backoff_->get_next_count);
-  EXPECT_EQ(0, backoff_->reset_count);
-  EXPECT_EQ(0, report_observation_count_);
-
-  // Exceeding the maximum number of retriable errors returns an error.
-  token_manager_.SetError(fuchsia::auth::Status::INTERNAL_ERROR);
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(AuthStatus::ERROR, auth_status);
-  EXPECT_EQ(1, backoff_->get_next_count);
-  EXPECT_EQ(1, backoff_->reset_count);
-  EXPECT_EQ(1, report_observation_count_);
-}
-
-TEST_F(FirebaseAuthImplTest, GetFirebaseUserIdNonRetriableError) {
-  bool called;
-  AuthStatus auth_status;
-  token_manager_.SetError(fuchsia::auth::Status::INVALID_REQUEST);
-  backoff_->SetOnGetNext(QuitLoopClosure());
-  firebase_auth_.GetFirebaseUserId(callback::Capture(
-      callback::SetWhenCalled(&called), &auth_status, &std::ignore));
-  RunLoopUntilIdle();
-  EXPECT_TRUE(called);
-  EXPECT_EQ(AuthStatus::ERROR, auth_status);
-  EXPECT_EQ(0, backoff_->get_next_count);
-  EXPECT_EQ(1, backoff_->reset_count);
-  EXPECT_EQ(1, report_observation_count_);
-}
-
-}  // namespace
-
-}  // namespace firebase_auth
diff --git a/lib/firebase_auth/testing/BUILD.gn b/lib/firebase_auth/testing/BUILD.gn
deleted file mode 100644
index b72396c..0000000
--- a/lib/firebase_auth/testing/BUILD.gn
+++ /dev/null
@@ -1,130 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [
-  "//peridot/bin/*",
-  "//peridot/lib/*",
-]
-
-source_set("testing") {
-  testonly = true
-
-  sources = [
-    "fake_token_manager.cc",
-    "fake_token_manager.h",
-    "test_firebase_auth.cc",
-    "test_firebase_auth.h",
-    "test_token_manager.cc",
-    "test_token_manager.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/fidl/fuchsia.auth",
-    "//peridot/lib/firebase_auth",
-    "//peridot/lib/rng",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/convert",
-  ]
-
-  configs += [ "//peridot/bin/ledger:ledger_config" ]
-}
-
-source_set("service_account_provider") {
-  testonly = true
-
-  sources = [
-    "service_account_token_manager.cc",
-    "service_account_token_manager.h",
-    "service_account_token_minter.cc",
-    "service_account_token_minter.h",
-  ]
-
-  public_deps = [
-    ":service_account",
-    "//garnet/public/fidl/fuchsia.auth",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/network_wrapper",
-  ]
-
-  deps = [
-    ":json_schema",
-    "//garnet/public/lib/fsl",
-    "//peridot/lib/base64url",
-    "//peridot/lib/convert",
-    "//third_party/boringssl",
-    "//third_party/rapidjson",
-  ]
-}
-
-source_set("json_schema") {
-  sources = [
-    "json_schema.cc",
-    "json_schema.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fsl",
-    "//third_party/rapidjson",
-  ]
-}
-
-source_set("service_account") {
-  testonly = true
-
-  sources = [
-    "credentials.cc",
-    "credentials.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//third_party/boringssl",
-    "//third_party/rapidjson",
-  ]
-
-  deps = [
-    ":json_schema",
-  ]
-}
-
-source_set("service_account_test_constants") {
-  testonly = true
-
-  sources = [
-    "service_account_test_constants.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "credentials_unittest.cc",
-    "json_schema_unittest.cc",
-    "service_account_test_util.cc",
-    "service_account_test_util.h",
-    "service_account_token_manager_unittest.cc",
-    "service_account_token_minter_unittest.cc",
-  ]
-
-  deps = [
-    ":json_schema",
-    ":service_account",
-    ":service_account_provider",
-    ":service_account_test_constants",
-    "//garnet/public/lib/gtest",
-    "//garnet/public/lib/network_wrapper:fake",
-    "//third_party/googletest:gtest",
-    "//third_party/rapidjson",
-  ]
-}
diff --git a/lib/firebase_auth/testing/credentials.cc b/lib/firebase_auth/testing/credentials.cc
deleted file mode 100644
index 0ebf1c1..0000000
--- a/lib/firebase_auth/testing/credentials.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/testing/credentials.h"
-
-#include <rapidjson/document.h>
-#include <rapidjson/schema.h>
-
-#include "peridot/lib/firebase_auth/testing/json_schema.h"
-
-namespace service_account {
-
-namespace {
-constexpr fxl::StringView kServiceAccountConfigurationSchema = R"({
-  "type": "object",
-  "additionalProperties": true,
-  "properties": {
-    "project_id": {
-      "type": "string"
-    },
-    "private_key": {
-      "type": "string"
-    },
-    "client_email": {
-      "type": "string"
-    },
-    "client_id": {
-      "type": "string"
-    }
-  },
-  "required": ["project_id", "private_key", "client_email", "client_id"]
-})";
-}  // namespace
-
-Credentials::Credentials(std::string project_id, std::string client_email,
-                         std::string client_id,
-                         bssl::UniquePtr<EVP_PKEY> private_key)
-    : project_id_(std::move(project_id)),
-      client_email_(std::move(client_email)),
-      client_id_(std::move(client_id)),
-      private_key_(std::move(private_key)) {}
-
-std::unique_ptr<Credentials> Credentials::Parse(fxl::StringView json) {
-  rapidjson::Document document;
-  document.Parse(json.data(), json.size());
-
-  if (document.HasParseError() || !document.IsObject()) {
-    FXL_LOG(ERROR) << "Json file is incorrect: " << json;
-    return nullptr;
-  }
-
-  return Parse(document);
-}
-
-std::unique_ptr<Credentials> Credentials::Parse(const rapidjson::Value& json) {
-  static auto service_account_schema =
-      json_schema::InitSchema(kServiceAccountConfigurationSchema);
-
-  FXL_DCHECK(json.IsObject());
-  if (!json_schema::ValidateSchema(json, *service_account_schema)) {
-    return nullptr;
-  }
-
-  auto project_id = json["project_id"].GetString();
-  auto client_email = json["client_email"].GetString();
-  auto client_id = json["client_id"].GetString();
-
-  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(
-      json["private_key"].GetString(), json["private_key"].GetStringLength()));
-  bssl::UniquePtr<EVP_PKEY> private_key(
-      PEM_read_bio_PrivateKey(bio.get(), nullptr, nullptr, nullptr));
-
-  if (EVP_PKEY_id(private_key.get()) != EVP_PKEY_RSA) {
-    FXL_LOG(ERROR) << "Provided key is not a RSA key.";
-    return nullptr;
-  }
-
-  return std::make_unique<Credentials>(
-      std::move(project_id), std::move(client_email), std::move(client_id),
-      std::move(private_key));
-}
-
-std::unique_ptr<Credentials> Credentials::Clone() {
-  if (!EVP_PKEY_up_ref(private_key_.get())) {
-    FXL_LOG(ERROR) << "Unable to increment the private key ref count.";
-    return nullptr;
-  }
-  bssl::UniquePtr<EVP_PKEY> private_key(private_key_.get());
-  return std::make_unique<Credentials>(project_id_, client_email_, client_id_,
-                                       std::move(private_key));
-}
-
-}  // namespace service_account
diff --git a/lib/firebase_auth/testing/credentials.h b/lib/firebase_auth/testing/credentials.h
deleted file mode 100644
index 9f5c5ec..0000000
--- a/lib/firebase_auth/testing/credentials.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_AUTH_TESTING_CREDENTIALS_H_
-#define PERIDOT_LIB_FIREBASE_AUTH_TESTING_CREDENTIALS_H_
-
-#include <string>
-
-#include <lib/fxl/strings/string_view.h>
-#include <openssl/pem.h>
-#include <rapidjson/document.h>
-
-namespace service_account {
-
-// Credentials to access a Google cloud service.
-//
-// A Firebase service account with admin access to the project is automatically
-// created for every Firebase project.
-//
-// In order to download the JSON credential file corresponding to this account,
-// visit `Settings > Service accounts > Firebase admin SDK` in the Firebase
-// Console and click on the 'Generate new private key' button. The content of
-// this JSON file must be pass to the |Parse| method of this class.
-class Credentials {
- public:
-  Credentials(std::string project_id, std::string client_email,
-              std::string client_id, bssl::UniquePtr<EVP_PKEY> private_key);
-
-  const std::string& project_id() { return project_id_; }
-  const std::string& client_email() { return client_email_; }
-  const std::string& client_id() { return client_id_; }
-  const bssl::UniquePtr<EVP_PKEY>& private_key() { return private_key_; }
-
-  // Clone the current credentials.
-  std::unique_ptr<Credentials> Clone();
-
-  // Loads the service account credentials.
-  //
-  // This method must be called before this class is usable. |json| must be the
-  // content of the service account configuration file that can be retrieved
-  // from the firebase admin console (see the class-level comment).
-  //
-  // These methods will return an empty unique_ptr if the json content is
-  // invalid.
-  static std::unique_ptr<Credentials> Parse(fxl::StringView json);
-  static std::unique_ptr<Credentials> Parse(const rapidjson::Value& json);
-
- private:
-  std::string project_id_;
-  std::string client_email_;
-  std::string client_id_;
-  bssl::UniquePtr<EVP_PKEY> private_key_;
-};
-
-}  // namespace service_account
-
-#endif  // PERIDOT_LIB_FIREBASE_AUTH_TESTING_CREDENTIALS_H_
diff --git a/lib/firebase_auth/testing/credentials_unittest.cc b/lib/firebase_auth/testing/credentials_unittest.cc
deleted file mode 100644
index c17a9f5..0000000
--- a/lib/firebase_auth/testing/credentials_unittest.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/testing/credentials.h"
-
-#include "gtest/gtest.h"
-#include "peridot/lib/firebase_auth/testing/service_account_test_constants.h"
-
-namespace service_account {
-namespace {
-
-TEST(CredentialsTest, CorrectConfig) {
-  auto config = Credentials::Parse(kTestServiceAccountConfig);
-  EXPECT_TRUE(config);
-
-  EXPECT_EQ(kTestServiceAccountProjectId, config->project_id());
-  EXPECT_EQ(kTestServiceAccountClientEmail, config->client_email());
-  EXPECT_EQ(kTestServiceAccountClientId, config->client_id());
-}
-
-TEST(CredentialsTest, IncorrectConfig) {
-  EXPECT_FALSE(Credentials::Parse(""));
-  EXPECT_FALSE(Credentials::Parse("{}"));
-  EXPECT_FALSE(Credentials::Parse(kWrongKeyTestServiceAccountConfig));
-}
-
-TEST(CredentialsTest, Clone) {
-  auto config = Credentials::Parse(kTestServiceAccountConfig);
-  ASSERT_TRUE(config);
-
-  auto cloned_config = config->Clone();
-  EXPECT_EQ(config->project_id(), cloned_config->project_id());
-  EXPECT_EQ(config->client_email(), cloned_config->client_email());
-  EXPECT_EQ(config->client_id(), cloned_config->client_id());
-
-  EXPECT_EQ(1, EVP_PKEY_cmp(config->private_key().get(),
-                            cloned_config->private_key().get()));
-}
-
-}  // namespace
-}  // namespace service_account
diff --git a/lib/firebase_auth/testing/fake_token_manager.cc b/lib/firebase_auth/testing/fake_token_manager.cc
deleted file mode 100644
index 19666b9..0000000
--- a/lib/firebase_auth/testing/fake_token_manager.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/testing/fake_token_manager.h"
-
-#include <lib/fxl/logging.h>
-
-#include "peridot/lib/convert/convert.h"
-
-namespace firebase_auth {
-
-FakeTokenManager::FakeTokenManager(rng::Random* random)
-    : firebase_id_token_(""),
-      firebase_local_id_(convert::ToHex(random->RandomUniqueBytes())),
-      email_("dummy@example.com") {}
-
-void FakeTokenManager::Authorize(
-    AppConfig app_config,
-    fidl::InterfaceHandle<AuthenticationUIContext> auth_ui_context,
-    std::vector<std::string> /*app_scopes*/,
-    fidl::StringPtr /*user_profile_id*/, fidl::StringPtr /*auth_code*/,
-    AuthorizeCallback callback /*callback*/) {
-  FXL_NOTIMPLEMENTED() << "FakeTokenManager::Authorize not implemented";
-  callback(fuchsia::auth::Status::INTERNAL_ERROR, nullptr);
-}
-
-void FakeTokenManager::GetAccessToken(
-    AppConfig app_config, std::string /*user_profile_id*/,
-    std::vector<std::string> /*app_scopes*/,
-    GetAccessTokenCallback callback /*callback*/) {
-  FXL_NOTIMPLEMENTED() << "FakeTokenManager::GetAccessToken not implemented";
-  callback(fuchsia::auth::Status::INTERNAL_ERROR, nullptr);
-}
-
-void FakeTokenManager::GetIdToken(AppConfig app_config,
-                                  std::string /*user_profile_id*/,
-                                  fidl::StringPtr /*audience*/,
-                                  GetIdTokenCallback callback /*callback*/) {
-  FXL_NOTIMPLEMENTED() << "FakeTokenManager::GetIdToken not implemented";
-  callback(fuchsia::auth::Status::INTERNAL_ERROR, {});
-}
-
-void FakeTokenManager::GetFirebaseToken(AppConfig /*app_config*/,
-                                        std::string /*user_profile_id*/,
-                                        std::string /*audience*/,
-                                        std::string /*firebase_api_key*/,
-                                        GetFirebaseTokenCallback callback) {
-  if (firebase_local_id_.empty()) {
-    callback(fuchsia::auth::Status::OK, nullptr);
-    return;
-  }
-  fuchsia::auth::FirebaseTokenPtr token = fuchsia::auth::FirebaseToken::New();
-  token->id_token = firebase_id_token_;
-  token->local_id = firebase_local_id_;
-  token->email = email_;
-  callback(fuchsia::auth::Status::OK, std::move(token));
-}
-
-void FakeTokenManager::DeleteAllTokens(AppConfig /*app_config*/,
-                                       std::string /*user_profile_id*/,
-                                       DeleteAllTokensCallback callback) {
-  FXL_NOTIMPLEMENTED() << "FakeTokenManager::DeleteAllTokens not implemented";
-  callback(fuchsia::auth::Status::INTERNAL_ERROR);
-}
-
-void FakeTokenManager::ListProfileIds(AppConfig app_config,
-                                      ListProfileIdsCallback callback) {
-  FXL_NOTIMPLEMENTED() << "FakeTokenManager::ListProifleIds not implemented";
-  callback(fuchsia::auth::Status::INTERNAL_ERROR, {});
-}
-
-}  // namespace firebase_auth
diff --git a/lib/firebase_auth/testing/fake_token_manager.h b/lib/firebase_auth/testing/fake_token_manager.h
deleted file mode 100644
index 01394a0..0000000
--- a/lib/firebase_auth/testing/fake_token_manager.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_AUTH_TESTING_FAKE_TOKEN_MANAGER_H_
-#define PERIDOT_LIB_FIREBASE_AUTH_TESTING_FAKE_TOKEN_MANAGER_H_
-
-#include <functional>
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/rng/random.h"
-
-namespace firebase_auth {
-
-using fuchsia::auth::AppConfig;
-using fuchsia::auth::AuthenticationUIContext;
-
-// FakeTokenManager is a dummy implementation of a TokenManager intended to be
-// used to connect to unauthenticated firebase instances.
-//
-// The local ID Firebase token are set to a random UUID fixed at the
-// construction time.
-//
-// Other token values are set to dummy const values.
-class FakeTokenManager : public fuchsia::auth::TokenManager {
- public:
-  FakeTokenManager(rng::Random* random);
-  ~FakeTokenManager() override {}
-
- private:
-  // fuchsia::auth::TokenManager:
-  void Authorize(AppConfig app_config,
-                 fidl::InterfaceHandle<AuthenticationUIContext> auth_ui_context,
-                 std::vector<std::string> app_scopes,
-                 fidl::StringPtr user_profile_id, fidl::StringPtr auth_code,
-                 AuthorizeCallback callback) override;
-
-  void GetAccessToken(AppConfig app_config, std::string user_profile_id,
-                      std::vector<std::string> app_scopes,
-                      GetAccessTokenCallback callback) override;
-
-  void GetIdToken(AppConfig app_config, std::string user_profile_id,
-                  fidl::StringPtr audience,
-                  GetIdTokenCallback callback) override;
-
-  void GetFirebaseToken(AppConfig app_config, std::string user_profile_id,
-                        std::string audience,
-                        std::string firebase_api_key,
-                        GetFirebaseTokenCallback callback) override;
-
-  void DeleteAllTokens(AppConfig app_config, std::string user_profile_id,
-                       DeleteAllTokensCallback callback) override;
-
-  void ListProfileIds(AppConfig app_config,
-                      ListProfileIdsCallback callback) override;
-
-  // Sets the token to return to null, and status to |status|.
-  std::string firebase_id_token_;
-  std::string firebase_local_id_;
-  std::string email_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeTokenManager);
-};
-
-}  // namespace firebase_auth
-
-#endif  // PERIDOT_LIB_FIREBASE_AUTH_TESTING_FAKE_TOKEN_MANAGER_H_
diff --git a/lib/firebase_auth/testing/json_schema.cc b/lib/firebase_auth/testing/json_schema.cc
deleted file mode 100644
index a2d387e..0000000
--- a/lib/firebase_auth/testing/json_schema.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/testing/json_schema.h"
-
-#include <lib/fxl/logging.h>
-
-namespace json_schema {
-
-std::unique_ptr<rapidjson::SchemaDocument> InitSchema(fxl::StringView json) {
-  rapidjson::Document schema_document;
-  if (schema_document.Parse(json.data(), json.size()).HasParseError()) {
-    FXL_LOG(ERROR) << "Schema validation spec itself is not valid JSON.";
-    return nullptr;
-  }
-  auto schema = std::make_unique<rapidjson::SchemaDocument>(schema_document);
-  rapidjson::SchemaValidator validator(*schema);
-  if (!validator.IsValid()) {
-    FXL_LOG(ERROR) << "Schema validation spec itself is not a valid schema.";
-    return nullptr;
-  }
-  return schema;
-}
-
-bool ValidateSchema(const rapidjson::Value& value,
-                    const rapidjson::SchemaDocument& schema) {
-  rapidjson::SchemaValidator validator(schema);
-  if (!value.Accept(validator)) {
-    rapidjson::StringBuffer uri_buffer;
-    validator.GetInvalidSchemaPointer().StringifyUriFragment(uri_buffer);
-    FXL_LOG(ERROR) << "Incorrect schema at " << uri_buffer.GetString()
-                   << " , schema violation: "
-                   << validator.GetInvalidSchemaKeyword();
-    return false;
-  }
-  return true;
-}
-
-}  // namespace json_schema
diff --git a/lib/firebase_auth/testing/json_schema.h b/lib/firebase_auth/testing/json_schema.h
deleted file mode 100644
index 1bdb1c3..0000000
--- a/lib/firebase_auth/testing/json_schema.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_AUTH_TESTING_JSON_SCHEMA_H_
-#define PERIDOT_LIB_FIREBASE_AUTH_TESTING_JSON_SCHEMA_H_
-
-#include <memory>
-
-#include <lib/fxl/strings/string_view.h>
-#include <rapidjson/document.h>
-#include <rapidjson/schema.h>
-
-namespace json_schema {
-
-// Build a SchemaDocument from a json encoded string.
-std::unique_ptr<rapidjson::SchemaDocument> InitSchema(fxl::StringView json);
-
-// Validate that the given json value match the given schema.
-bool ValidateSchema(const rapidjson::Value& value,
-                    const rapidjson::SchemaDocument& schema);
-
-};  // namespace json_schema
-
-#endif  // PERIDOT_LIB_FIREBASE_AUTH_TESTING_JSON_SCHEMA_H_
diff --git a/lib/firebase_auth/testing/json_schema_unittest.cc b/lib/firebase_auth/testing/json_schema_unittest.cc
deleted file mode 100644
index 3b6d591..0000000
--- a/lib/firebase_auth/testing/json_schema_unittest.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/testing/json_schema.h"
-
-#include "gtest/gtest.h"
-
-namespace json_schema {
-namespace {
-
-constexpr fxl::StringView kInvalidSchema = "Hello";
-
-constexpr fxl::StringView kValidSchema = R"({
-  "type": "object",
-  "additionalProperties": true,
-  "properties": {
-    "foo": {
-      "type": "string"
-    }
-  },
-  "required": ["foo"]
-})";
-
-constexpr fxl::StringView kInvalidJson = R"({
-  "hello": "world"
-})";
-
-constexpr fxl::StringView kValidJson = R"({
-  "foo": "bar",
-  "hello": "world"
-})";
-
-bool ParseJson(fxl::StringView json, rapidjson::Document* document) {
-  document->Parse(json.data(), json.size());
-  return !document->HasParseError();
-}
-
-TEST(JsonSchemaTest, InvalidSchema) {
-  EXPECT_FALSE(InitSchema(kInvalidSchema));
-}
-
-TEST(JsonSchemaTest, ValidSchema) { EXPECT_TRUE(InitSchema(kValidSchema)); }
-
-TEST(JsonSchemaTest, ValidJson) {
-  auto schema = InitSchema(kValidSchema);
-  ASSERT_TRUE(schema);
-
-  rapidjson::Document document;
-  ASSERT_TRUE(ParseJson(kValidJson, &document));
-
-  EXPECT_TRUE(ValidateSchema(document, *schema));
-}
-
-TEST(JsonSchemaTest, InvalidJson) {
-  auto schema = InitSchema(kValidSchema);
-  ASSERT_TRUE(schema);
-
-  rapidjson::Document document;
-  ASSERT_TRUE(ParseJson(kInvalidJson, &document));
-
-  EXPECT_FALSE(ValidateSchema(document, *schema));
-}
-
-}  // namespace
-}  // namespace json_schema
diff --git a/lib/firebase_auth/testing/service_account_test_constants.h b/lib/firebase_auth/testing/service_account_test_constants.h
deleted file mode 100644
index 1b57d68..0000000
--- a/lib/firebase_auth/testing/service_account_test_constants.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_AUTH_TESTING_SERVICE_ACCOUNT_TEST_CONSTANTS_H_
-#define PERIDOT_LIB_FIREBASE_AUTH_TESTING_SERVICE_ACCOUNT_TEST_CONSTANTS_H_
-
-#include <lib/fxl/strings/string_view.h>
-
-// This file contains constant strings used to test code that needs a
-// Credentials.
-namespace service_account {
-
-// Expected value for the Credentials members.
-constexpr fxl::StringView kTestServiceAccountProjectId = "fake_project_id";
-constexpr fxl::StringView kTestServiceAccountClientEmail =
-    "fake_email@example.com";
-constexpr fxl::StringView kTestServiceAccountClientId = "fake_client_id";
-
-// Correct test json configuration file for Credentials.
-constexpr fxl::StringView kTestServiceAccountConfig =
-    "{"
-    "\"project_id\": \"fake_project_id\","
-    "\"private_key\": \""
-    "-----BEGIN RSA PRIVATE KEY-----\\n"
-    "MIIBOQIBAAJBALTlyNACX5j/oFWdgy/KvAZL9qj+eNuhXGBSvQM9noaPKqVhOXFH\\n"
-    "hycW+TBzlHzj4Ga5uGtVJNzZaxdpfbqxV1cCAwEAAQJAZDJShESMRuZwHHveSf51\\n"
-    "Hte8i+ZHcv9xdzjc0Iq037pGGmHh/TiNNZPtqgVbxQuGGdGQqJ54DMpz3Ja2ck1V\\n"
-    "wQIhAOMyXwq0Se8+hCXFFFIo6QSVpDn5ZnXTyz+GBdiwkVXZAiEAy9TIRCCUd9j+\\n"
-    "cy77lTCx6k6Pw5lY1LM5jTUR7dAD6K8CIBie1snUK8bvYWauartUj5vdk4Rs0Huo\\n"
-    "Tfg+T9fhmn5RAiB5nfEL7SCIzbksgqjroE1Xjx5qR5Hf/zvki/ixmz7p0wIgdxLS\\n"
-    "T/hN67jcu9a+/2geGTnk1ku2nhVlxS7UPCTq0os=\\n"
-    "-----END RSA PRIVATE KEY-----"
-    "\","
-    "\"client_email\": \"fake_email@example.com\","
-    "\"client_id\": \"fake_client_id\""
-    "}";
-
-// Incorrect test json configuration file.
-constexpr fxl::StringView kWrongKeyTestServiceAccountConfig =
-    "{"
-    "\"project_id\": \"fake_project_id\","
-    "\"private_key\": \""
-    "-----BEGIN DSA PRIVATE KEY-----\\n"
-    "MIH4AgEAAkEAteW2IBzioOu0aNGrQFv5RZ6VxS8NAyuNwvOrmjq8pxJSzTyrwD52\\n"
-    "9XJmNVVXv/UWKvyPtr0rzrsJVpSzCEwaewIVAJT9/8i3lQrQEeACuO9bwzaG28Lh\\n"
-    "AkAnvmU9Ogz6eTof5V58Lv1f8uKF6ZujgVb+Wc1gudx8wKIexKUBhE7rsnJUfLYw\\n"
-    "HMXC8xZ5XJTEYog2U0vLKke7AkEApEq8XBO8qwEzP3VicpC/Huxa/zNZ2lveNgWm\\n"
-    "tr089fvp3PSf4DwKTOKGZyg9NYsOSCfaCSvkWMeFCW4Y7XTpTAIUV9YTY3SlInIv\\n"
-    "Ho2twE3HuzNZpLQ=\\n"
-    "-----END DSA PRIVATE KEY-----\\n"
-    "\","
-    "\"client_email\": \"fake_email@example.com\","
-    "\"client_id\": \"fake_id\""
-    "}";
-
-}  // namespace service_account
-
-#endif  // PERIDOT_LIB_FIREBASE_AUTH_TESTING_SERVICE_ACCOUNT_TEST_CONSTANTS_H_
diff --git a/lib/firebase_auth/testing/service_account_test_util.cc b/lib/firebase_auth/testing/service_account_test_util.cc
deleted file mode 100644
index 5ef89e9..0000000
--- a/lib/firebase_auth/testing/service_account_test_util.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/gtest/test_loop_fixture.h>
-#include <lib/network_wrapper/fake_network_wrapper.h>
-#include <rapidjson/stringbuffer.h>
-#include <rapidjson/writer.h>
-
-namespace service_account {
-
-namespace http = ::fuchsia::net::oldhttp;
-
-std::string GetSuccessResponseBodyForTest(std::string token,
-                                          size_t expiration) {
-  rapidjson::StringBuffer string_buffer;
-  rapidjson::Writer<rapidjson::StringBuffer> writer(string_buffer);
-
-  writer.StartObject();
-
-  writer.Key("idToken");
-  writer.String(token);
-
-  writer.Key("expiresIn");
-  writer.String(fxl::NumberToString(expiration));
-
-  writer.EndObject();
-
-  return std::string(string_buffer.GetString(), string_buffer.GetSize());
-}
-
-http::URLResponse GetResponseForTest(http::HttpErrorPtr error, uint32_t status,
-                                     std::string body) {
-  http::URLResponse response;
-  response.error = std::move(error);
-  response.status_code = status;
-  fsl::SizedVmo buffer;
-  if (!fsl::VmoFromString(body, &buffer)) {
-    ADD_FAILURE() << "Unable to convert string to Vmo.";
-  }
-  response.body = http::URLBody::New();
-  response.body->set_buffer(std::move(buffer).ToTransport());
-  return response;
-}
-
-}  // namespace service_account
diff --git a/lib/firebase_auth/testing/service_account_test_util.h b/lib/firebase_auth/testing/service_account_test_util.h
deleted file mode 100644
index a873cca..0000000
--- a/lib/firebase_auth/testing/service_account_test_util.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/network_wrapper/fake_network_wrapper.h>
-
-namespace service_account {
-
-namespace http = ::fuchsia::net::oldhttp;
-
-std::string GetSuccessResponseBodyForTest(std::string token, size_t expiration);
-
-http::URLResponse GetResponseForTest(http::HttpErrorPtr error, uint32_t status,
-                                     std::string body);
-
-}  // namespace service_account
diff --git a/lib/firebase_auth/testing/service_account_token_manager.cc b/lib/firebase_auth/testing/service_account_token_manager.cc
deleted file mode 100644
index 425c6af..0000000
--- a/lib/firebase_auth/testing/service_account_token_manager.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/testing/service_account_token_manager.h"
-
-#include <lib/fxl/logging.h>
-
-namespace service_account {
-namespace {
-
-fuchsia::auth::Status ConvertStatus(ServiceAccountTokenMinter::Status status) {
-  switch (status) {
-    case ServiceAccountTokenMinter::Status::OK:
-      return fuchsia::auth::Status::OK;
-    case ServiceAccountTokenMinter::Status::AUTH_SERVER_ERROR:
-      return fuchsia::auth::Status::AUTH_PROVIDER_SERVER_ERROR;
-    case ServiceAccountTokenMinter::Status::BAD_RESPONSE:
-      return fuchsia::auth::Status::AUTH_PROVIDER_SERVER_ERROR;
-    case ServiceAccountTokenMinter::Status::NETWORK_ERROR:
-      return fuchsia::auth::Status::NETWORK_ERROR;
-    case ServiceAccountTokenMinter::Status::INTERNAL_ERROR:
-    default:
-      return fuchsia::auth::Status::INTERNAL_ERROR;
-  }
-}
-
-}  // namespace
-
-ServiceAccountTokenManager::ServiceAccountTokenManager(
-    network_wrapper::NetworkWrapper* network_wrapper,
-    std::unique_ptr<Credentials> credentials, std::string user_id)
-    : service_account_token_minter_(network_wrapper, std::move(credentials),
-                                    std::move(user_id)) {}
-
-ServiceAccountTokenManager::~ServiceAccountTokenManager() {}
-
-void ServiceAccountTokenManager::Authorize(
-    AppConfig app_config,
-    fidl::InterfaceHandle<AuthenticationUIContext> auth_ui_context,
-    std::vector<std::string> /*app_scopes*/,
-    fidl::StringPtr /*user_profile_id*/, fidl::StringPtr /*auth_code*/,
-    AuthorizeCallback callback /*callback*/) {
-  FXL_NOTIMPLEMENTED();
-  callback(fuchsia::auth::Status::INTERNAL_ERROR /*Not implemented*/, nullptr);
-}
-
-void ServiceAccountTokenManager::GetAccessToken(
-    AppConfig app_config, std::string /*user_profile_id*/,
-    std::vector<std::string> /*app_scopes*/,
-    GetAccessTokenCallback callback) {
-  FXL_NOTIMPLEMENTED();
-  callback(fuchsia::auth::Status::INTERNAL_ERROR /*Not implemented*/, nullptr);
-}
-
-void ServiceAccountTokenManager::GetIdToken(
-    AppConfig app_config, std::string /*user_profile_id*/,
-    fidl::StringPtr /*audience*/, GetIdTokenCallback callback /*callback*/) {
-  FXL_NOTIMPLEMENTED();
-  callback(fuchsia::auth::Status::INTERNAL_ERROR /*Not implemented*/, nullptr);
-}
-
-void ServiceAccountTokenManager::GetFirebaseToken(
-    AppConfig /*app_config*/, std::string /*user_profile_id*/,
-    std::string /*audience*/, std::string firebase_api_key,
-    GetFirebaseTokenCallback callback) {
-  service_account_token_minter_.GetFirebaseToken(
-      std::move(firebase_api_key),
-      [this, callback = std::move(callback)](
-          const ServiceAccountTokenMinter::GetTokenResponse& response) {
-        auto status = ConvertStatus(response.status);
-
-        if (response.status == ServiceAccountTokenMinter::Status::OK) {
-          auto fb_token = fuchsia::auth::FirebaseToken::New();
-          fb_token->id_token = response.id_token;
-          fb_token->local_id = response.local_id;
-          fb_token->email = response.email;
-          callback(status, std::move(fb_token));
-        } else {
-          FXL_LOG(ERROR) << "Encountered error in GetToken(): "
-                         << response.error_msg;
-          callback(status, nullptr);
-        }
-      });
-}
-
-void ServiceAccountTokenManager::DeleteAllTokens(
-    AppConfig app_config, std::string /*user_profile_id*/,
-    DeleteAllTokensCallback callback /*callback*/) {
-  FXL_NOTIMPLEMENTED();
-  callback(fuchsia::auth::Status::INTERNAL_ERROR /*Not implemented*/);
-}
-
-void ServiceAccountTokenManager::ListProfileIds(
-    AppConfig app_config, ListProfileIdsCallback callback /*callback*/) {
-  FXL_NOTIMPLEMENTED();
-  callback(fuchsia::auth::Status::INTERNAL_ERROR /*Not implemented*/, {});
-}
-
-}  // namespace service_account
diff --git a/lib/firebase_auth/testing/service_account_token_manager.h b/lib/firebase_auth/testing/service_account_token_manager.h
deleted file mode 100644
index 1d7fcfc..0000000
--- a/lib/firebase_auth/testing/service_account_token_manager.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_AUTH_TESTING_SERVICE_ACCOUNT_TOKEN_MANAGER_H_
-#define PERIDOT_LIB_FIREBASE_AUTH_TESTING_SERVICE_ACCOUNT_TOKEN_MANAGER_H_
-
-#include <map>
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/firebase_auth/testing/service_account_token_minter.h"
-
-namespace service_account {
-
-using fuchsia::auth::AppConfig;
-using fuchsia::auth::AuthenticationUIContext;
-
-// An implementation of |TokenManager| that uses a Firebase service account to
-// register a new user of the given id and mint tokens for it.
-//
-// A Firebase service account with admin access to the project is automatically
-// created for every Firebase project.
-//
-// In order to download the JSON credential file corresponding to this account,
-// visit `Settings > Service accounts > Firebase admin SDK` in the Firebase
-// Console and click on the 'Generate new private key' button. This JSON file
-// must be available on the device, and its path must be passed to the
-// LoadCredentials() method to initialize this class.
-class ServiceAccountTokenManager : public fuchsia::auth::TokenManager {
- public:
-  ServiceAccountTokenManager(network_wrapper::NetworkWrapper* network_wrapper,
-                             std::unique_ptr<Credentials> credentials,
-                             std::string user_id);
-  ~ServiceAccountTokenManager() override;
-
-  // fuchsia::auth::TokenManager:
-  void Authorize(AppConfig app_config,
-                 fidl::InterfaceHandle<AuthenticationUIContext> auth_ui_context,
-                 std::vector<std::string> app_scopes,
-                 fidl::StringPtr user_profile_id, fidl::StringPtr auth_code,
-                 AuthorizeCallback callback) override;
-
-  void GetAccessToken(AppConfig app_config, std::string user_profile_id,
-                      std::vector<std::string> app_scopes,
-                      GetAccessTokenCallback callback) override;
-
-  void GetIdToken(AppConfig app_config, std::string user_profile_id,
-                  fidl::StringPtr audience,
-                  GetIdTokenCallback callback) override;
-
-  void GetFirebaseToken(AppConfig app_config, std::string user_profile_id,
-                        std::string audience,
-                        std::string firebase_api_key,
-                        GetFirebaseTokenCallback callback) override;
-
-  void DeleteAllTokens(AppConfig app_config, std::string user_profile_id,
-                       DeleteAllTokensCallback callback) override;
-
-  void ListProfileIds(AppConfig app_config,
-                      ListProfileIdsCallback callback) override;
-
- private:
-  ServiceAccountTokenMinter service_account_token_minter_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ServiceAccountTokenManager);
-};
-
-};  // namespace service_account
-
-#endif  // PERIDOT_LIB_FIREBASE_AUTH_TESTING_SERVICE_ACCOUNT_TOKEN_MANAGER_H_
diff --git a/lib/firebase_auth/testing/service_account_token_manager_unittest.cc b/lib/firebase_auth/testing/service_account_token_manager_unittest.cc
deleted file mode 100644
index 0cd4037..0000000
--- a/lib/firebase_auth/testing/service_account_token_manager_unittest.cc
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/testing/service_account_token_manager.h"
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/gtest/test_loop_fixture.h>
-#include <lib/network_wrapper/fake_network_wrapper.h>
-#include <rapidjson/stringbuffer.h>
-#include <rapidjson/writer.h>
-
-#include "peridot/lib/firebase_auth/testing/service_account_test_constants.h"
-#include "peridot/lib/firebase_auth/testing/service_account_test_util.h"
-
-namespace service_account {
-
-namespace http = ::fuchsia::net::oldhttp;
-
-namespace {
-
-class ServiceAccountTokenManagerTest : public gtest::TestLoopFixture {
- public:
-  ServiceAccountTokenManagerTest()
-      : network_wrapper_(dispatcher()),
-        token_manager_(&network_wrapper_,
-                       Credentials::Parse(kTestServiceAccountConfig),
-                       "user_id") {}
-
- protected:
-  bool GetToken(std::string api_key, fuchsia::auth::FirebaseTokenPtr* token,
-                fuchsia::auth::Status* status) {
-    bool called;
-    token_manager_.GetFirebaseToken(
-        {"google", "", ""}, /*app_config*/
-        "",                 /*user_profile_id*/
-        "",                 /*audience*/
-        api_key,
-        callback::Capture(callback::SetWhenCalled(&called), status, token));
-    RunLoopUntilIdle();
-    return called;
-  }
-
-  network_wrapper::FakeNetworkWrapper network_wrapper_;
-  ServiceAccountTokenManager token_manager_;
-};
-
-TEST_F(ServiceAccountTokenManagerTest, GetToken) {
-  network_wrapper_.SetResponse(GetResponseForTest(
-      nullptr, 200, GetSuccessResponseBodyForTest("token", 3600)));
-
-  fuchsia::auth::FirebaseTokenPtr token;
-  fuchsia::auth::Status status;
-  ASSERT_TRUE(GetToken("api_key", &token, &status));
-  ASSERT_EQ(fuchsia::auth::Status::OK, status);
-  ASSERT_EQ("token", token->id_token);
-}
-
-TEST_F(ServiceAccountTokenManagerTest, GetTokenFromCache) {
-  network_wrapper_.SetResponse(GetResponseForTest(
-      nullptr, 200, GetSuccessResponseBodyForTest("token", 3600)));
-
-  fuchsia::auth::FirebaseTokenPtr token;
-  fuchsia::auth::Status status;
-
-  ASSERT_TRUE(GetToken("api_key", &token, &status));
-  EXPECT_EQ(fuchsia::auth::Status::OK, status);
-  EXPECT_EQ("token", token->id_token);
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-
-  network_wrapper_.ResetRequest();
-  network_wrapper_.SetResponse(GetResponseForTest(
-      nullptr, 200, GetSuccessResponseBodyForTest("token2", 3600)));
-
-  ASSERT_TRUE(GetToken("api_key", &token, &status));
-  EXPECT_EQ(fuchsia::auth::Status::OK, status);
-  EXPECT_EQ("token", token->id_token);
-  EXPECT_FALSE(network_wrapper_.GetRequest());
-}
-
-TEST_F(ServiceAccountTokenManagerTest, GetTokenNoCacheCache) {
-  network_wrapper_.SetResponse(GetResponseForTest(
-      nullptr, 200, GetSuccessResponseBodyForTest("token", 0)));
-
-  fuchsia::auth::FirebaseTokenPtr token;
-  fuchsia::auth::Status status;
-
-  ASSERT_TRUE(GetToken("api_key", &token, &status));
-  EXPECT_EQ(fuchsia::auth::Status::OK, status);
-  EXPECT_EQ("token", token->id_token);
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-
-  network_wrapper_.SetResponse(GetResponseForTest(
-      nullptr, 200, GetSuccessResponseBodyForTest("token2", 0)));
-
-  ASSERT_TRUE(GetToken("api_key", &token, &status));
-  EXPECT_EQ(fuchsia::auth::Status::OK, status);
-  EXPECT_EQ("token2", token->id_token);
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-}
-
-TEST_F(ServiceAccountTokenManagerTest, NetworkError) {
-  auto network_status = http::HttpError::New();
-  network_status->description = "Error";
-
-  network_wrapper_.SetResponse(
-      GetResponseForTest(std::move(network_status), 0, ""));
-
-  fuchsia::auth::FirebaseTokenPtr token;
-  fuchsia::auth::Status status;
-
-  ASSERT_TRUE(GetToken("api_key", &token, &status));
-  EXPECT_EQ(fuchsia::auth::Status::NETWORK_ERROR, status);
-  EXPECT_FALSE(token);
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-}
-
-TEST_F(ServiceAccountTokenManagerTest, AuthenticationError) {
-  network_wrapper_.SetResponse(
-      GetResponseForTest(nullptr, 401, "Unauthorized"));
-
-  fuchsia::auth::FirebaseTokenPtr token;
-  fuchsia::auth::Status status;
-
-  ASSERT_TRUE(GetToken("api_key", &token, &status));
-  EXPECT_EQ(fuchsia::auth::Status::AUTH_PROVIDER_SERVER_ERROR, status);
-  EXPECT_FALSE(token);
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-}
-
-TEST_F(ServiceAccountTokenManagerTest, ResponseFormatError) {
-  network_wrapper_.SetResponse(GetResponseForTest(nullptr, 200, ""));
-
-  fuchsia::auth::FirebaseTokenPtr token;
-  fuchsia::auth::Status status;
-
-  ASSERT_TRUE(GetToken("api_key", &token, &status));
-  EXPECT_EQ(fuchsia::auth::Status::AUTH_PROVIDER_SERVER_ERROR, status);
-  EXPECT_FALSE(token);
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-}
-
-}  // namespace
-}  // namespace service_account
diff --git a/lib/firebase_auth/testing/service_account_token_minter.cc b/lib/firebase_auth/testing/service_account_token_minter.cc
deleted file mode 100644
index 6186693..0000000
--- a/lib/firebase_auth/testing/service_account_token_minter.cc
+++ /dev/null
@@ -1,346 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/testing/service_account_token_minter.h"
-
-#include <time.h>
-
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/arraysize.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/fxl/strings/string_view.h>
-#include <openssl/bio.h>
-#include <openssl/digest.h>
-#include <openssl/hmac.h>
-#include <openssl/pem.h>
-#include <rapidjson/document.h>
-#include <rapidjson/schema.h>
-#include <rapidjson/stringbuffer.h>
-#include <rapidjson/writer.h>
-
-#include "peridot/lib/base64url/base64url.h"
-#include "peridot/lib/convert/convert.h"
-#include "peridot/lib/firebase_auth/testing/json_schema.h"
-
-namespace service_account {
-
-namespace http = ::fuchsia::net::oldhttp;
-
-namespace {
-constexpr fxl::StringView kIdentityResponseSchema = R"({
-  "type": "object",
-  "additionalProperties": true,
-  "properties": {
-    "idToken": {
-      "type": "string"
-    },
-    "expiresIn": {
-      "type": "string"
-    }
-  },
-  "required": ["idToken", "expiresIn"]
-})";
-
-rapidjson::SchemaDocument& GetResponseSchema() {
-  static auto schema = json_schema::InitSchema(kIdentityResponseSchema);
-  FXL_DCHECK(schema);
-  return *schema;
-}
-
-std::string GetHeader() {
-  rapidjson::StringBuffer string_buffer;
-  rapidjson::Writer<rapidjson::StringBuffer> writer(string_buffer);
-
-  writer.StartObject();
-
-  writer.Key("typ");
-  writer.String("JWT");
-
-  writer.Key("alg");
-  writer.String("RS256");
-
-  writer.EndObject();
-
-  return base64url::Base64UrlEncode(
-      fxl::StringView(string_buffer.GetString(), string_buffer.GetSize()));
-}
-
-}  // namespace
-
-struct ServiceAccountTokenMinter::CachedToken {
-  std::string id_token;
-  // TODO: Use zx::time for expiration_time.
-  time_t expiration_time;
-};
-
-ServiceAccountTokenMinter::GetTokenResponse
-ServiceAccountTokenMinter::GetErrorResponse(Status status,
-                                            const std::string& error_msg) {
-  GetTokenResponse response = {status, /* response status */
-                               "",     /* id_token */
-                               "",     /* local_id */
-                               "",     /* email */
-                               error_msg /* detailed error msg */};
-  return response;
-}
-
-ServiceAccountTokenMinter::GetTokenResponse
-ServiceAccountTokenMinter::GetSuccessResponse(const std::string& id_token) {
-  GetTokenResponse response = {Status::OK,                /* success status */
-                               id_token,                  /* token */
-                               user_id_,                  /* local_id */
-                               user_id_ + "@example.com", /* email */
-                               "OK" /* success msg */};
-  return response;
-}
-
-ServiceAccountTokenMinter::ServiceAccountTokenMinter(
-    network_wrapper::NetworkWrapper* network_wrapper,
-    std::unique_ptr<Credentials> credentials, std::string user_id)
-    : network_wrapper_(network_wrapper),
-      credentials_(std::move(credentials)),
-      user_id_(std::move(user_id)) {}
-
-ServiceAccountTokenMinter::~ServiceAccountTokenMinter() {
-  for (const auto& pair : in_progress_callbacks_) {
-    ResolveCallbacks(
-        pair.first,
-        GetErrorResponse(Status::INTERNAL_ERROR,
-                         "Account provider deleted with requests in flight."));
-  }
-}
-
-void ServiceAccountTokenMinter::GetFirebaseToken(
-    fidl::StringPtr firebase_api_key, GetFirebaseTokenCallback callback) {
-  // A request is in progress to get a token. Registers the callback that will
-  // be called when the request ends.
-  if (!in_progress_callbacks_[firebase_api_key].empty()) {
-    in_progress_callbacks_[firebase_api_key].push_back(std::move(callback));
-    return;
-  }
-
-  // Check if a token is currently cached.
-  if (cached_tokens_[firebase_api_key]) {
-    auto& cached_token = cached_tokens_[firebase_api_key];
-    if (time(nullptr) < cached_token->expiration_time) {
-      callback(GetSuccessResponse(cached_token->id_token));
-      return;
-    }
-
-    // The token expired. Falls back to fetch a new one.
-    cached_tokens_.erase(firebase_api_key);
-  }
-
-  // Build the custom token to exchange for an id token.
-  std::string custom_token;
-  if (!GetCustomToken(&custom_token)) {
-    callback(
-        GetErrorResponse(Status::INTERNAL_ERROR,
-                         "Unable to compute custom authentication token."));
-    return;
-  }
-
-  in_progress_callbacks_[firebase_api_key].push_back(std::move(callback));
-
-  in_progress_requests_.emplace(network_wrapper_->Request(
-      [this, firebase_api_key = firebase_api_key.get(),
-       custom_token = std::move(custom_token)] {
-        return GetIdentityRequest(firebase_api_key, custom_token);
-      },
-      [this,
-       firebase_api_key = firebase_api_key.get()](http::URLResponse response) {
-        HandleIdentityResponse(firebase_api_key, std::move(response));
-      }));
-}
-
-std::string ServiceAccountTokenMinter::GetClientId() {
-  return credentials_->client_id();
-}
-
-std::string ServiceAccountTokenMinter::GetClaims() {
-  rapidjson::StringBuffer string_buffer;
-  rapidjson::Writer<rapidjson::StringBuffer> writer(string_buffer);
-
-  writer.StartObject();
-
-  writer.Key("iss");
-  writer.String(credentials_->client_email());
-
-  writer.Key("sub");
-  writer.String(credentials_->client_email());
-
-  writer.Key("aud");
-  writer.String(
-      "https://identitytoolkit.googleapis.com/"
-      "google.identity.identitytoolkit.v1.IdentityToolkit");
-
-  time_t current_time = time(nullptr);
-  writer.Key("iat");
-  writer.Int(current_time);
-
-  writer.Key("exp");
-  writer.Int(current_time + 3600);
-
-  writer.Key("uid");
-  writer.String(user_id_);
-
-  writer.EndObject();
-
-  return base64url::Base64UrlEncode(
-      fxl::StringView(string_buffer.GetString(), string_buffer.GetSize()));
-}
-
-bool ServiceAccountTokenMinter::GetCustomToken(std::string* custom_token) {
-  std::string message = GetHeader() + "." + GetClaims();
-
-  bssl::ScopedEVP_MD_CTX md_ctx;
-  if (EVP_DigestSignInit(md_ctx.get(), nullptr, EVP_sha256(), nullptr,
-                         credentials_->private_key().get()) != 1) {
-    FXL_LOG(ERROR) << ERR_reason_error_string(ERR_get_error());
-    return false;
-  }
-
-  if (EVP_DigestSignUpdate(md_ctx.get(), message.c_str(), message.size()) !=
-      1) {
-    FXL_LOG(ERROR) << ERR_reason_error_string(ERR_get_error());
-    return false;
-  }
-
-  size_t result_length;
-  if (EVP_DigestSignFinal(md_ctx.get(), nullptr, &result_length) != 1) {
-    FXL_LOG(ERROR) << ERR_reason_error_string(ERR_get_error());
-    return false;
-  }
-
-  char result[result_length];
-  if (EVP_DigestSignFinal(md_ctx.get(), reinterpret_cast<uint8_t*>(result),
-                          &result_length) != 1) {
-    FXL_LOG(ERROR) << ERR_reason_error_string(ERR_get_error());
-    return false;
-  }
-
-  std::string signature =
-      base64url::Base64UrlEncode(fxl::StringView(result, result_length));
-
-  *custom_token = message + "." + signature;
-  return true;
-}
-
-http::URLRequest ServiceAccountTokenMinter::GetIdentityRequest(
-    const std::string& api_key, const std::string& custom_token) {
-  http::URLRequest request;
-  request.url =
-      "https://www.googleapis.com/identitytoolkit/v3/relyingparty/"
-      "verifyCustomToken?key=" +
-      api_key;
-  request.method = "POST";
-  request.auto_follow_redirects = true;
-  request.response_body_mode = http::ResponseBodyMode::BUFFER;
-
-  // content-type header.
-  http::HttpHeader content_type_header;
-  content_type_header.name = "content-type";
-  content_type_header.value = "application/json";
-  request.headers.push_back(std::move(content_type_header));
-
-  // set accept header
-  http::HttpHeader accept_header;
-  accept_header.name = "accept";
-  accept_header.value = "application/json";
-  request.headers.push_back(std::move(accept_header));
-
-  fsl::SizedVmo data;
-  bool result = fsl::VmoFromString(GetIdentityRequestBody(custom_token), &data);
-  FXL_DCHECK(result);
-
-  request.body = http::URLBody::New();
-  request.body->set_buffer(std::move(data).ToTransport());
-
-  return request;
-}
-
-std::string ServiceAccountTokenMinter::GetIdentityRequestBody(
-    const std::string& custom_token) {
-  rapidjson::StringBuffer string_buffer;
-  rapidjson::Writer<rapidjson::StringBuffer> writer(string_buffer);
-
-  writer.StartObject();
-
-  writer.Key("token");
-  writer.String(custom_token);
-
-  writer.Key("returnSecureToken");
-  writer.Bool(true);
-
-  writer.EndObject();
-
-  return std::string(string_buffer.GetString(), string_buffer.GetSize());
-}
-
-void ServiceAccountTokenMinter::HandleIdentityResponse(
-    const std::string& api_key, http::URLResponse response) {
-  if (response.error) {
-    ResolveCallbacks(api_key, GetErrorResponse(Status::NETWORK_ERROR,
-                                               response.error->description));
-    return;
-  }
-
-  std::string response_body;
-  if (response.body) {
-    FXL_DCHECK(response.body->is_buffer());
-    if (!fsl::StringFromVmo(response.body->buffer(), &response_body)) {
-      ResolveCallbacks(api_key, GetErrorResponse(Status::INTERNAL_ERROR,
-                                                 "Unable to read from VMO."));
-      return;
-    }
-  }
-
-  if (response.status_code != 200) {
-    ResolveCallbacks(
-        api_key, GetErrorResponse(Status::AUTH_SERVER_ERROR, response_body));
-    return;
-  }
-
-  rapidjson::Document document;
-  document.Parse(response_body.c_str(), response_body.size());
-  if (document.HasParseError() || !document.IsObject()) {
-    ResolveCallbacks(api_key, GetErrorResponse(Status::BAD_RESPONSE,
-                                               "Unable to parse response: " +
-                                                   response_body));
-    return;
-  }
-
-  if (!json_schema::ValidateSchema(document, GetResponseSchema())) {
-    ResolveCallbacks(api_key,
-                     GetErrorResponse(Status::BAD_RESPONSE,
-                                      "Malformed response: " + response_body));
-    return;
-  }
-
-  auto cached_token = std::make_unique<CachedToken>();
-  cached_token->id_token = convert::ToString(document["idToken"]);
-  cached_token->expiration_time =
-      time(nullptr) + (9u *
-                       fxl::StringToNumber<time_t>(
-                           convert::ToStringView(document["expiresIn"])) /
-                       10u);
-  const auto& id_token = cached_token->id_token;
-  cached_tokens_[api_key] = std::move(cached_token);
-  ResolveCallbacks(api_key, GetSuccessResponse(id_token));
-}
-
-void ServiceAccountTokenMinter::ResolveCallbacks(const std::string& api_key,
-                                                 GetTokenResponse response) {
-  auto callbacks = std::move(in_progress_callbacks_[api_key]);
-  in_progress_callbacks_[api_key].clear();
-  for (const auto& callback : callbacks) {
-    callback(std::move(response));
-  }
-}
-
-}  // namespace service_account
diff --git a/lib/firebase_auth/testing/service_account_token_minter.h b/lib/firebase_auth/testing/service_account_token_minter.h
deleted file mode 100644
index 69fec31..0000000
--- a/lib/firebase_auth/testing/service_account_token_minter.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_AUTH_TESTING_SERVICE_ACCOUNT_TOKEN_MINTER_H_
-#define PERIDOT_LIB_FIREBASE_AUTH_TESTING_SERVICE_ACCOUNT_TOKEN_MINTER_H_
-
-#include <map>
-
-#include <lib/callback/cancellable.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/network_wrapper/network_wrapper.h>
-
-#include "peridot/lib/firebase_auth/testing/credentials.h"
-
-namespace service_account {
-
-// An implementation of |fuchsia::auth::TokenManager| that uses a Firebase
-// service account to register a new user of the given id and mint tokens for
-// it.
-class ServiceAccountTokenMinter {
- public:
-  enum Status {
-    OK,
-    NETWORK_ERROR,
-    BAD_RESPONSE,
-    AUTH_SERVER_ERROR,
-    INTERNAL_ERROR
-  };
-
-  struct GetTokenResponse {
-    Status status;
-    std::string id_token;
-    std::string local_id;
-    std::string email;
-    std::string error_msg;
-  };
-  ServiceAccountTokenMinter(network_wrapper::NetworkWrapper* network_wrapper,
-                            std::unique_ptr<Credentials> credentials,
-                            std::string user_id);
-
-  ~ServiceAccountTokenMinter();
-
-  using GetFirebaseTokenCallback =
-      fit::function<void(const GetTokenResponse& response)>;
-
-  void GetFirebaseToken(fidl::StringPtr firebase_api_key,
-                        GetFirebaseTokenCallback callback);
-
-  std::string GetClientId();
-
- private:
-  struct CachedToken;
-
-  std::string GetClaims();
-  bool GetCustomToken(std::string* custom_token);
-  GetTokenResponse GetCachedToken(fidl::StringPtr firebase_api_key);
-  GetTokenResponse GetSuccessResponse(const std::string& id_token);
-  GetTokenResponse GetErrorResponse(Status status,
-                                    const std::string& error_msg);
-  ::fuchsia::net::oldhttp::URLRequest GetIdentityRequest(
-      const std::string& api_key, const std::string& custom_token);
-  std::string GetIdentityRequestBody(const std::string& custom_token);
-  void HandleIdentityResponse(const std::string& api_key,
-                              ::fuchsia::net::oldhttp::URLResponse response);
-  void ResolveCallbacks(const std::string& api_key, GetTokenResponse response);
-
-  network_wrapper::NetworkWrapper* network_wrapper_;
-  std::unique_ptr<Credentials> credentials_;
-  const std::string user_id_;
-  std::map<std::string, std::unique_ptr<CachedToken>> cached_tokens_;
-  std::map<std::string, std::vector<GetFirebaseTokenCallback>>
-      in_progress_callbacks_;
-  callback::CancellableContainer in_progress_requests_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ServiceAccountTokenMinter);
-};
-
-};  // namespace service_account
-
-#endif  // PERIDOT_LIB_FIREBASE_AUTH_TESTING_SERVICE_ACCOUNT_TOKEN_MINTER_H_
diff --git a/lib/firebase_auth/testing/service_account_token_minter_unittest.cc b/lib/firebase_auth/testing/service_account_token_minter_unittest.cc
deleted file mode 100644
index 149c76e..0000000
--- a/lib/firebase_auth/testing/service_account_token_minter_unittest.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/testing/service_account_token_minter.h"
-
-#include <lib/callback/capture.h>
-#include <lib/callback/set_when_called.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <lib/gtest/test_loop_fixture.h>
-#include <lib/network_wrapper/fake_network_wrapper.h>
-#include <rapidjson/stringbuffer.h>
-#include <rapidjson/writer.h>
-
-#include "peridot/lib/firebase_auth/testing/service_account_test_constants.h"
-#include "peridot/lib/firebase_auth/testing/service_account_test_util.h"
-
-namespace service_account {
-
-namespace http = ::fuchsia::net::oldhttp;
-
-namespace {
-
-class ServiceAccountTokenMinterTest : public gtest::TestLoopFixture {
- public:
-  ServiceAccountTokenMinterTest()
-      : network_wrapper_(dispatcher()),
-        token_minter_(&network_wrapper_,
-                      Credentials::Parse(kTestServiceAccountConfig),
-                      "user_id") {}
-
- protected:
-  bool GetFirebaseToken(std::string api_key,
-                        ServiceAccountTokenMinter::GetTokenResponse* response) {
-    bool called;
-    token_minter_.GetFirebaseToken(
-        "api_key",
-        callback::Capture(callback::SetWhenCalled(&called), response));
-    RunLoopUntilIdle();
-    return called;
-  }
-
-  std::string GetClientId() { return token_minter_.GetClientId(); }
-
-  network_wrapper::FakeNetworkWrapper network_wrapper_;
-  ServiceAccountTokenMinter token_minter_;
-};
-
-TEST_F(ServiceAccountTokenMinterTest, GetClientId) {
-  EXPECT_FALSE(GetClientId().empty());
-}
-
-TEST_F(ServiceAccountTokenMinterTest, GetFirebaseToken) {
-  network_wrapper_.SetResponse(GetResponseForTest(
-      nullptr, 200, GetSuccessResponseBodyForTest("token", 3600)));
-
-  ServiceAccountTokenMinter::GetTokenResponse resp;
-  ASSERT_TRUE(GetFirebaseToken("api_key", &resp));
-  ASSERT_EQ(ServiceAccountTokenMinter::Status::OK, resp.status);
-  ASSERT_EQ("token", resp.id_token);
-}
-
-TEST_F(ServiceAccountTokenMinterTest, GetFirebaseTokenFromCache) {
-  network_wrapper_.SetResponse(GetResponseForTest(
-      nullptr, 200, GetSuccessResponseBodyForTest("token", 3600)));
-
-  ServiceAccountTokenMinter::GetTokenResponse resp;
-
-  ASSERT_TRUE(GetFirebaseToken("api_key", &resp));
-  ASSERT_EQ(ServiceAccountTokenMinter::Status::OK, resp.status);
-  ASSERT_EQ("token", resp.id_token);
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-
-  network_wrapper_.ResetRequest();
-  network_wrapper_.SetResponse(GetResponseForTest(
-      nullptr, 200, GetSuccessResponseBodyForTest("token2", 3600)));
-
-  ASSERT_TRUE(GetFirebaseToken("api_key", &resp));
-  ASSERT_EQ(ServiceAccountTokenMinter::Status::OK, resp.status);
-  ASSERT_EQ("token", resp.id_token);
-  EXPECT_FALSE(network_wrapper_.GetRequest());
-}
-
-TEST_F(ServiceAccountTokenMinterTest, GetFirebaseTokenNoCacheCache) {
-  network_wrapper_.SetResponse(GetResponseForTest(
-      nullptr, 200, GetSuccessResponseBodyForTest("token", 0)));
-
-  ServiceAccountTokenMinter::GetTokenResponse resp;
-
-  ASSERT_TRUE(GetFirebaseToken("api_key", &resp));
-  ASSERT_EQ(ServiceAccountTokenMinter::Status::OK, resp.status);
-  ASSERT_EQ("token", resp.id_token);
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-
-  network_wrapper_.ResetRequest();
-  network_wrapper_.SetResponse(GetResponseForTest(
-      nullptr, 200, GetSuccessResponseBodyForTest("token2", 3600)));
-
-  ASSERT_TRUE(GetFirebaseToken("api_key", &resp));
-  ASSERT_EQ(ServiceAccountTokenMinter::Status::OK, resp.status);
-  ASSERT_EQ("token2", resp.id_token);
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-}
-
-TEST_F(ServiceAccountTokenMinterTest, NetworkError) {
-  auto network_status = http::HttpError::New();
-  network_status->description = "Error";
-
-  network_wrapper_.SetResponse(
-      GetResponseForTest(std::move(network_status), 0, ""));
-
-  ServiceAccountTokenMinter::GetTokenResponse resp;
-
-  ASSERT_TRUE(GetFirebaseToken("api_key", &resp));
-  ASSERT_EQ(ServiceAccountTokenMinter::Status::NETWORK_ERROR, resp.status);
-  EXPECT_TRUE(resp.id_token.empty());
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-}
-
-TEST_F(ServiceAccountTokenMinterTest, AuthenticationError) {
-  network_wrapper_.SetResponse(
-      GetResponseForTest(nullptr, 401, "Unauthorized"));
-
-  ServiceAccountTokenMinter::GetTokenResponse resp;
-
-  ASSERT_TRUE(GetFirebaseToken("api_key", &resp));
-  ASSERT_EQ(ServiceAccountTokenMinter::Status::AUTH_SERVER_ERROR, resp.status);
-  EXPECT_TRUE(resp.id_token.empty());
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-}
-
-TEST_F(ServiceAccountTokenMinterTest, ResponseFormatError) {
-  network_wrapper_.SetResponse(GetResponseForTest(nullptr, 200, ""));
-
-  ServiceAccountTokenMinter::GetTokenResponse resp;
-
-  ASSERT_TRUE(GetFirebaseToken("api_key", &resp));
-  ASSERT_EQ(ServiceAccountTokenMinter::Status::BAD_RESPONSE, resp.status);
-  EXPECT_TRUE(resp.id_token.empty());
-  EXPECT_TRUE(network_wrapper_.GetRequest());
-}
-
-}  // namespace
-}  // namespace service_account
diff --git a/lib/firebase_auth/testing/test_firebase_auth.cc b/lib/firebase_auth/testing/test_firebase_auth.cc
deleted file mode 100644
index 374ccc3..0000000
--- a/lib/firebase_auth/testing/test_firebase_auth.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/testing/test_firebase_auth.h"
-
-#include <utility>
-
-#include <lib/async/cpp/task.h>
-#include <lib/callback/cancellable_helper.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/functional/closure.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-namespace firebase_auth {
-
-TestFirebaseAuth::TestFirebaseAuth(async_dispatcher_t* dispatcher)
-    : dispatcher_(dispatcher) {}
-
-void TestFirebaseAuth::set_error_handler(fit::closure on_error) {
-  error_handler_ = std::move(on_error);
-}
-
-fxl::RefPtr<callback::Cancellable> TestFirebaseAuth::GetFirebaseToken(
-    fit::function<void(AuthStatus, std::string)> callback) {
-  auto cancellable = callback::CancellableImpl::Create([] {});
-
-  async::PostTask(dispatcher_, [this, callback = cancellable->WrapCallback(
-                                          std::move(callback))]() mutable {
-    callback(status_to_return, token_to_return);
-  });
-  return cancellable;
-}
-
-fxl::RefPtr<callback::Cancellable> TestFirebaseAuth::GetFirebaseUserId(
-    fit::function<void(AuthStatus, std::string)> callback) {
-  auto cancellable = callback::CancellableImpl::Create([] {});
-
-  async::PostTask(dispatcher_, [this, callback = cancellable->WrapCallback(
-                                          std::move(callback))]() mutable {
-    callback(status_to_return, user_id_to_return);
-  });
-  return cancellable;
-}
-
-void TestFirebaseAuth::TriggerConnectionErrorHandler() { error_handler_(); }
-
-}  // namespace firebase_auth
diff --git a/lib/firebase_auth/testing/test_firebase_auth.h b/lib/firebase_auth/testing/test_firebase_auth.h
deleted file mode 100644
index 2b5bbe2..0000000
--- a/lib/firebase_auth/testing/test_firebase_auth.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_AUTH_TESTING_TEST_FIREBASE_AUTH_H_
-#define PERIDOT_LIB_FIREBASE_AUTH_TESTING_TEST_FIREBASE_AUTH_H_
-
-#include <lib/async/dispatcher.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/functional/closure.h>
-
-#include "peridot/lib/firebase_auth/firebase_auth.h"
-
-namespace firebase_auth {
-
-class TestFirebaseAuth : public FirebaseAuth {
- public:
-  explicit TestFirebaseAuth(async_dispatcher_t* dispatcher);
-
-  // FirebaseAuth:
-  void set_error_handler(fit::closure on_error) override;
-
-  fxl::RefPtr<callback::Cancellable> GetFirebaseToken(
-      fit::function<void(AuthStatus, std::string)> callback) override;
-
-  fxl::RefPtr<callback::Cancellable> GetFirebaseUserId(
-      fit::function<void(AuthStatus, std::string)> callback) override;
-
-  void TriggerConnectionErrorHandler();
-
-  std::string token_to_return;
-
-  AuthStatus status_to_return = AuthStatus::OK;
-
-  std::string user_id_to_return;
-
- private:
-  async_dispatcher_t* const dispatcher_;
-
-  fit::closure error_handler_;
-};
-
-}  // namespace firebase_auth
-
-#endif  // PERIDOT_LIB_FIREBASE_AUTH_TESTING_TEST_FIREBASE_AUTH_H_
diff --git a/lib/firebase_auth/testing/test_token_manager.cc b/lib/firebase_auth/testing/test_token_manager.cc
deleted file mode 100644
index dfbc4e4..0000000
--- a/lib/firebase_auth/testing/test_token_manager.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/firebase_auth/testing/test_token_manager.h"
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fxl/logging.h>
-
-namespace firebase_auth {
-TestTokenManager::TestTokenManager(async_dispatcher_t* dispatcher)
-    : dispatcher_(dispatcher) {
-  status_to_return_ = fuchsia::auth::Status::OK;
-}
-
-TestTokenManager::~TestTokenManager() {}
-
-void TestTokenManager::Authorize(
-    AppConfig app_config,
-    fidl::InterfaceHandle<AuthenticationUIContext> auth_ui_context,
-    std::vector<std::string> /*app_scopes*/,
-    fidl::StringPtr /*user_profile_id*/, fidl::StringPtr /*auth_code*/,
-    AuthorizeCallback callback /*callback*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void TestTokenManager::GetAccessToken(
-    AppConfig app_config, std::string /*user_profile_id*/,
-    std::vector<std::string> /*app_scopes*/,
-    GetAccessTokenCallback callback /*callback*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void TestTokenManager::GetIdToken(AppConfig app_config,
-                                  std::string /*user_profile_id*/,
-                                  fidl::StringPtr /*audience*/,
-                                  GetIdTokenCallback callback /*callback*/) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void TestTokenManager::GetFirebaseToken(AppConfig /*app_config*/,
-                                        std::string /*user_profile_id*/,
-                                        std::string /*audience*/,
-                                        std::string /*firebase_api_key*/,
-                                        GetFirebaseTokenCallback callback) {
-  fuchsia::auth::FirebaseTokenPtr token_to_return_copy;
-  fidl::Clone(token_to_return_, &token_to_return_copy);
-  fuchsia::auth::Status status_to_return_copy;
-  status_to_return_copy = status_to_return_;
-  async::PostTask(dispatcher_,
-                  [status_to_return = status_to_return_copy,
-                   token_to_return = std::move(token_to_return_copy),
-                   callback = std::move(callback)]() mutable {
-                    callback(status_to_return, std::move(token_to_return));
-                  });
-}
-
-void TestTokenManager::DeleteAllTokens(AppConfig /*app_config*/,
-                                       std::string /*user_profile_id*/,
-                                       DeleteAllTokensCallback callback) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void TestTokenManager::ListProfileIds(AppConfig app_config,
-                                      ListProfileIdsCallback callback) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void TestTokenManager::Set(std::string id_token, std::string local_id,
-                           std::string email) {
-  token_to_return_ = fuchsia::auth::FirebaseToken::New();
-  token_to_return_->id_token = id_token;
-  token_to_return_->local_id = local_id;
-  token_to_return_->email = email;
-  status_to_return_ = fuchsia::auth::Status::OK;
-}
-
-void TestTokenManager::SetError(fuchsia::auth::Status status) {
-  FXL_CHECK(status != fuchsia::auth::Status::OK);
-  token_to_return_ = nullptr;
-  status_to_return_ = status;
-}
-}  // namespace firebase_auth
diff --git a/lib/firebase_auth/testing/test_token_manager.h b/lib/firebase_auth/testing/test_token_manager.h
deleted file mode 100644
index da9b975..0000000
--- a/lib/firebase_auth/testing/test_token_manager.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_FIREBASE_AUTH_TESTING_TEST_TOKEN_MANAGER_H_
-#define PERIDOT_LIB_FIREBASE_AUTH_TESTING_TEST_TOKEN_MANAGER_H_
-
-#include <string>
-
-#include <fuchsia/auth/cpp/fidl.h>
-#include <lib/async/dispatcher.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/memory/ref_ptr.h>
-
-using fuchsia::auth::AppConfig;
-using fuchsia::auth::AuthenticationUIContext;
-
-namespace firebase_auth {
-
-class TestTokenManager : public fuchsia::auth::TokenManager {
- public:
-  explicit TestTokenManager(async_dispatcher_t* dispatcher);
-
-  ~TestTokenManager() override;
-
-  // fuchsia::auth::TokenManager:
-  void Authorize(AppConfig app_config,
-                 fidl::InterfaceHandle<AuthenticationUIContext> auth_ui_context,
-                 std::vector<std::string> app_scopes,
-                 fidl::StringPtr user_profile_id, fidl::StringPtr auth_code,
-                 AuthorizeCallback callback) override;
-
-  void GetAccessToken(AppConfig app_config, std::string user_profile_id,
-                      std::vector<std::string> app_scopes,
-                      GetAccessTokenCallback callback) override;
-
-  void GetIdToken(AppConfig app_config, std::string user_profile_id,
-                  fidl::StringPtr audience,
-                  GetIdTokenCallback callback) override;
-
-  void GetFirebaseToken(AppConfig app_config, std::string user_profile_id,
-                        std::string audience,
-                        std::string firebase_api_key,
-                        GetFirebaseTokenCallback callback) override;
-
-  void DeleteAllTokens(AppConfig app_config, std::string user_profile_id,
-                       DeleteAllTokensCallback callback) override;
-
-  void ListProfileIds(AppConfig app_config,
-                      ListProfileIdsCallback callback) override;
-
-  // Sets the token to return with the provided parameters, and status to OK.
-  void Set(std::string id_token, std::string local_id, std::string email);
-
-  // Sets the token to return to null, and status to |status|.
-  // |status| must not be OK.
-  void SetError(fuchsia::auth::Status status);
-
- private:
-  async_dispatcher_t* const dispatcher_;
-  fuchsia::auth::FirebaseTokenPtr token_to_return_;
-  fuchsia::auth::Status status_to_return_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestTokenManager);
-};
-
-}  // namespace firebase_auth
-
-#endif  // PERIDOT_LIB_FIREBASE_AUTH_TESTING_TEST_TOKEN_MANAGER_H_
diff --git a/lib/ledger_client/BUILD.gn b/lib/ledger_client/BUILD.gn
deleted file mode 100644
index b23fdd6..0000000
--- a/lib/ledger_client/BUILD.gn
+++ /dev/null
@@ -1,118 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-group("ledger_client") {
-  deps = [
-    ":constants",
-    ":operations",
-    ":page_client",
-    ":promise",
-    ":types",
-  ]
-}
-
-source_set("constants") {
-  sources = [
-    "constants.h",
-  ]
-}
-
-source_set("operations") {
-  sources = [
-    "operations.h",
-  ]
-
-  public_deps = [
-    ":page_client",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-source_set("page_client") {
-  sources = [
-    "ledger_client.cc",
-    "ledger_client.h",
-    "page_client.cc",
-    "page_client.h",
-    "page_id.cc",
-    "page_id.h",
-  ]
-
-  deps = [
-    ":status",
-    ":types",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:clone",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/lib/async/cpp:operation",
-  ]
-}
-
-source_set("promise") {
-  sources = [
-    "promise.h",
-  ]
-
-  public_deps = [
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/public/fidl/fuchsia.ledger",
-  ]
-}
-
-source_set("status") {
-  sources = [
-    "status.cc",
-    "status.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.ledger",
-  ]
-}
-
-source_set("types") {
-  sources = [
-    "types.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-  ]
-}
-
-group("unittests") {
-  testonly = true
-
-  deps = [
-    ":page_client_unittest",
-  ]
-}
-
-source_set("page_client_unittest") {
-  testonly = true
-
-  sources = [
-    "page_client_unittest.cc",
-  ]
-
-  deps = [
-    ":page_client",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/testing:test_with_ledger",
-    "//peridot/public/lib/async/cpp:operation",
-    "//third_party/googletest:gtest",
-  ]
-}
diff --git a/lib/ledger_client/MAINTAINERS b/lib/ledger_client/MAINTAINERS
deleted file mode 100644
index 5402e1d..0000000
--- a/lib/ledger_client/MAINTAINERS
+++ /dev/null
@@ -1 +0,0 @@
-qsr@google.com
diff --git a/lib/ledger_client/constants.h b/lib/ledger_client/constants.h
deleted file mode 100644
index 18b7f47..0000000
--- a/lib/ledger_client/constants.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_LEDGER_CLIENT_CONSTANTS_H_
-#define PERIDOT_LIB_LEDGER_CLIENT_CONSTANTS_H_
-
-namespace modular {
-
-inline constexpr char kCloudProviderFirestoreAppUrl[] =
-    "fuchsia-pkg://fuchsia.com/cloud_provider_firestore#meta/cloud_provider_firestore.cmx";
-inline constexpr char kLedgerAppUrl[] =
-    "fuchsia-pkg://fuchsia.com/ledger#meta/ledger.cmx";
-
-// Hard-coded communal Ledger instance.
-inline constexpr char kFirebaseProjectId[] = "fuchsia-ledger";
-inline constexpr char kFirebaseApiKey[] =
-    "AIzaSyDzzuJILOn6riFPTXC36HlH6CEdliLapDA";
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_LEDGER_CLIENT_CONSTANTS_H_
diff --git a/lib/ledger_client/ledger_client.cc b/lib/ledger_client/ledger_client.cc
deleted file mode 100644
index 1e902d7..0000000
--- a/lib/ledger_client/ledger_client.cc
+++ /dev/null
@@ -1,418 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LtICENSE file.
-
-#include "peridot/lib/ledger_client/ledger_client.h"
-
-#include <algorithm>
-
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/ledger_client/page_client.h"
-#include "peridot/lib/ledger_client/status.h"
-#include "peridot/lib/ledger_client/types.h"
-
-namespace modular {
-
-struct LedgerClient::PageEntry {
-  LedgerPageId page_id;
-  fuchsia::ledger::PagePtr page;
-  std::vector<PageClient*> clients;
-};
-
-namespace {
-
-PageClient::Conflict ToConflict(const fuchsia::ledger::DiffEntry* entry) {
-  PageClient::Conflict conflict;
-  conflict.key = entry->key;
-  if (entry->left) {
-    conflict.has_left = true;
-    std::string value;
-    if (!fsl::StringFromVmo(*entry->left->value, &value)) {
-      FXL_LOG(ERROR) << "Unable to read vmo for left entry of "
-                     << to_hex_string(conflict.key) << ".";
-      return conflict;
-    }
-    conflict.left = std::move(value);
-  } else {
-    conflict.left_is_deleted = true;
-  }
-  if (entry->right) {
-    conflict.has_right = true;
-    std::string value;
-    if (!fsl::StringFromVmo(*entry->right->value, &value)) {
-      FXL_LOG(ERROR) << "Unable to read vmo for right entry of "
-                     << to_hex_string(conflict.key) << ".";
-      return conflict;
-    }
-    conflict.right = std::move(value);
-  } else {
-    conflict.right_is_deleted = true;
-  }
-  return conflict;
-}
-
-void GetDiffRecursive(
-    fuchsia::ledger::MergeResultProvider* const result_provider,
-    std::map<std::string, PageClient::Conflict>* conflicts, LedgerToken token,
-    fit::closure callback) {
-  auto cont = [result_provider, conflicts, callback = std::move(callback)](
-                  fuchsia::ledger::IterationStatus status,
-                  std::vector<fuchsia::ledger::DiffEntry> change_delta,
-                  LedgerToken token) mutable {
-    for (auto& diff_entry : change_delta) {
-      (*conflicts)[to_string(diff_entry.key)] = ToConflict(&diff_entry);
-    }
-
-    if (status == fuchsia::ledger::IterationStatus::OK) {
-      callback();
-      return;
-    }
-
-    GetDiffRecursive(result_provider, conflicts, std::move(token),
-                     std::move(callback));
-  };
-
-  result_provider->GetConflictingDiffNew(std::move(token), std::move(cont));
-}
-
-void GetDiff(fuchsia::ledger::MergeResultProvider* const result_provider,
-             std::map<std::string, PageClient::Conflict>* conflicts,
-             fit::closure callback) {
-  GetDiffRecursive(result_provider, conflicts, nullptr /* token */,
-                   std::move(callback));
-}
-
-bool HasPrefix(const std::string& value, const std::string& prefix) {
-  if (value.size() < prefix.size()) {
-    return false;
-  }
-
-  for (size_t i = 0; i < prefix.size(); ++i) {
-    if (value[i] != prefix[i]) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-}  // namespace
-
-class LedgerClient::ConflictResolverImpl::ResolveCall : public Operation<> {
- public:
-  ResolveCall(ConflictResolverImpl* const impl,
-              fuchsia::ledger::MergeResultProviderPtr result_provider,
-              fuchsia::ledger::PageSnapshotPtr left_version,
-              fuchsia::ledger::PageSnapshotPtr right_version,
-              fuchsia::ledger::PageSnapshotPtr common_version)
-      : Operation("LedgerClient::ResolveCall", [] {}),
-        impl_(impl),
-        result_provider_(std::move(result_provider)),
-        left_version_(std::move(left_version)),
-        right_version_(std::move(right_version)),
-        common_version_(std::move(common_version)) {
-    result_provider_.set_error_handler([](zx_status_t status) {
-      if (status != ZX_OK && status != ZX_ERR_PEER_CLOSED) {
-        FXL_LOG(ERROR) << "ResultProvider error: "
-                       << LedgerEpitaphToString(status);
-      } else {
-        FXL_LOG(INFO) << "ResultProvider disconnected: "
-                      << LedgerEpitaphToString(status);
-      }
-    });
-  }
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    result_provider_->MergeNonConflictingEntriesNew();
-
-    GetDiff(result_provider_.get(), &conflicts_,
-            [this, flow] { WithDiff(flow); });
-
-    GetEntries(left_version_.get(), &left_entries_,
-               [this, flow](fuchsia::ledger::Status) {
-                 LogEntries("left", left_entries_);
-               });
-
-    GetEntries(right_version_.get(), &right_entries_,
-               [this, flow](fuchsia::ledger::Status) {
-                 LogEntries("right", right_entries_);
-               });
-
-    GetEntries(common_version_.get(), &common_entries_,
-               [this, flow](fuchsia::ledger::Status) {
-                 LogEntries("common", common_entries_);
-               });
-  }
-
-  void WithDiff(FlowToken flow) {
-    std::vector<PageClient*> page_clients;
-    impl_->GetPageClients(&page_clients);
-
-    for (auto& pair : conflicts_) {
-      const PageClient::Conflict& conflict = pair.second;
-      std::vector<fuchsia::ledger::MergedValue> merge_changes;
-
-      if (conflict.has_left && conflict.has_right) {
-        for (PageClient* const page_client : page_clients) {
-          if (HasPrefix(pair.first, page_client->prefix())) {
-            page_client->OnPageConflict(&pair.second);
-
-            if (pair.second.resolution != PageClient::LEFT) {
-              fuchsia::ledger::MergedValue merged_value;
-              merged_value.key = conflict.key;
-              if (pair.second.resolution == PageClient::RIGHT) {
-                merged_value.source = fuchsia::ledger::ValueSource::RIGHT;
-              } else {
-                if (pair.second.merged_is_deleted) {
-                  merged_value.source = fuchsia::ledger::ValueSource::DELETE;
-                } else {
-                  merged_value.source = fuchsia::ledger::ValueSource::NEW;
-                  merged_value.new_value =
-                      fuchsia::ledger::BytesOrReference::New();
-                  merged_value.new_value->set_bytes(
-                      to_array(pair.second.merged));
-                }
-              }
-              merge_changes.push_back(std::move(merged_value));
-            }
-
-            // First client handles the conflict.
-            //
-            // TODO(mesch): We should order clients reverse-lexicographically by
-            // prefix, so that longer prefixes are checked first.
-            //
-            // TODO(mesch): Default resolution could then be PASS, which would
-            // pass to the next matching client. Too easy to abuse though.
-            //
-            // TODO(mesch): Best would be if overlapping prefixes are
-            // prohibited.
-            break;
-          }
-        }
-      }
-
-      if (!merge_changes.empty()) {
-        result_provider_->MergeNew(std::move(merge_changes));
-      }
-    }
-
-    result_provider_->DoneNew();
-    result_provider_->Sync([this, flow] { impl_->NotifyWatchers(); });
-  }
-
-  void LogEntries(const std::string& headline,
-                  const std::vector<fuchsia::ledger::Entry>& entries) {
-    FXL_VLOG(4) << "Entries " << headline;
-    for (const fuchsia::ledger::Entry& entry : entries) {
-      FXL_VLOG(4) << " - " << to_string(entry.key);
-    }
-  }
-
-  ConflictResolverImpl* const impl_;
-  fuchsia::ledger::MergeResultProviderPtr result_provider_;
-
-  fuchsia::ledger::PageSnapshotPtr left_version_;
-  fuchsia::ledger::PageSnapshotPtr right_version_;
-  fuchsia::ledger::PageSnapshotPtr common_version_;
-
-  std::vector<fuchsia::ledger::Entry> left_entries_;
-  std::vector<fuchsia::ledger::Entry> right_entries_;
-  std::vector<fuchsia::ledger::Entry> common_entries_;
-
-  std::map<std::string, PageClient::Conflict> conflicts_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ResolveCall);
-};
-
-LedgerClient::LedgerClient(fuchsia::ledger::LedgerPtr ledger)
-    : ledger_(std::move(ledger)) {
-  ledger_->SetConflictResolverFactory(
-      bindings_.AddBinding(this), [](fuchsia::ledger::Status status) {
-        if (status != fuchsia::ledger::Status::OK) {
-          FXL_LOG(ERROR) << "Ledger.SetConflictResolverFactory() failed: "
-                         << LedgerStatusToString(status);
-        }
-      });
-}
-
-LedgerClient::LedgerClient(
-    fuchsia::ledger::internal::LedgerRepository* const ledger_repository,
-    const std::string& name, std::function<void()> error) {
-  ledger_.set_error_handler([](zx_status_t status) {
-    if (status != ZX_OK && status != ZX_ERR_PEER_CLOSED) {
-      FXL_LOG(ERROR) << "Ledger error: " << LedgerEpitaphToString(status);
-    } else {
-      FXL_LOG(INFO) << "Ledger disconnected: "
-                       << LedgerEpitaphToString(status);
-    }
-  });
-  // Open Ledger.
-  ledger_repository->GetLedger(to_array(name), ledger_.NewRequest());
-
-  // This must be the first call after GetLedger, otherwise the Ledger
-  // starts with one reconciliation strategy, then switches to another.
-  ledger_->SetConflictResolverFactory(
-      bindings_.AddBinding(this), [error](fuchsia::ledger::Status status) {
-        if (status != fuchsia::ledger::Status::OK) {
-          FXL_LOG(ERROR) << "Ledger.SetConflictResolverFactory() failed: "
-                         << LedgerStatusToString(status);
-          error();
-        }
-      });
-}
-
-LedgerClient::~LedgerClient() = default;
-
-fuchsia::ledger::Page* LedgerClient::GetPage(
-    PageClient* const page_client, const std::string& context,
-    const fuchsia::ledger::PageId& page_id) {
-  auto i = std::find_if(pages_.begin(), pages_.end(), [&page_id](auto& entry) {
-    return PageIdsEqual(entry->page_id, page_id);
-  });
-
-  if (i != pages_.end()) {
-    (*i)->clients.push_back(page_client);
-    return (*i)->page.get();
-  }
-
-  fuchsia::ledger::PagePtr page;
-  fuchsia::ledger::PageIdPtr page_id_copy = fuchsia::ledger::PageId::New();
-
-  page_id_copy->id = page_id.id;
-  ledger_->GetPage(std::move(page_id_copy), page.NewRequest(),
-                   [context](fuchsia::ledger::Status status) {
-                     if (status != fuchsia::ledger::Status::OK) {
-                       FXL_LOG(ERROR) << "Ledger.GetPage() " << context << " "
-                                      << fidl::ToUnderlying(status);
-                     }
-                   });
-
-  auto entry = std::make_unique<PageEntry>();
-  entry->page_id = CloneStruct(page_id);
-  entry->clients.push_back(page_client);
-
-  entry->page = std::move(page);
-  entry->page.set_error_handler([context](zx_status_t status) {
-    // TODO(mesch): If this happens, larger things are wrong. This should
-    // probably be signalled up, or at least must be signalled to the page
-    // client.
-    FXL_LOG(ERROR) << context << ": "
-                   << "Page connection unexpectedly closed.";
-  });
-
-  pages_.emplace_back(std::move(entry));
-  return pages_.back()->page.get();
-}
-
-void LedgerClient::DropPageClient(PageClient* const page_client) {
-  for (auto i = pages_.begin(); i < pages_.end(); ++i) {
-    std::vector<PageClient*>* const page_clients = &(*i)->clients;
-
-    auto ii = std::remove_if(
-        page_clients->begin(), page_clients->end(),
-        [page_client](PageClient* item) { return item == page_client; });
-
-    if (ii != page_clients->end()) {
-      page_clients->erase(ii, page_clients->end());
-
-      if (page_clients->empty()) {
-        ClearConflictResolver((*i)->page_id);
-        pages_.erase(i);
-        break;  // Loop variable now invalid; must not continue loop.
-      }
-    }
-  }
-}
-
-void LedgerClient::GetPolicy(LedgerPageId page_id, GetPolicyCallback callback) {
-  auto i = std::find_if(pages_.begin(), pages_.end(), [&page_id](auto& entry) {
-    return PageIdsEqual(entry->page_id, page_id);
-  });
-
-  // This is wrong if GetPolicy() is called for a page before its page client
-  // has registered. Therefore, if an app keeps multiple connections to a page,
-  // the ones kept by page clients must be created first.
-  //
-  // TODO(mesch): Maybe AUTOMATIC_WITH_FALLBACK should always be used anyway,
-  // and the resolver should deal with conflicts on pages that don't have a page
-  // client.
-  if (i != pages_.end()) {
-    callback(fuchsia::ledger::MergePolicy::AUTOMATIC_WITH_FALLBACK);
-    return;
-  }
-
-  callback(fuchsia::ledger::MergePolicy::LAST_ONE_WINS);
-}
-
-void LedgerClient::NewConflictResolver(
-    LedgerPageId page_id,
-    fidl::InterfaceRequest<fuchsia::ledger::ConflictResolver> request) {
-  for (auto& i : resolvers_) {
-    if (PageIdsEqual(i->page_id(), page_id)) {
-      i->Connect(std::move(request));
-      return;
-    }
-  }
-
-  resolvers_.emplace_back(
-      std::make_unique<ConflictResolverImpl>(this, std::move(page_id)));
-  resolvers_.back()->Connect(std::move(request));
-}
-
-void LedgerClient::ClearConflictResolver(const LedgerPageId& page_id) {
-  auto i = std::remove_if(resolvers_.begin(), resolvers_.end(),
-                          [&page_id](auto& item) {
-                            return PageIdsEqual(item->page_id(), page_id);
-                          });
-
-  if (i != resolvers_.end()) {
-    resolvers_.erase(i, resolvers_.end());
-  }
-}
-
-LedgerClient::ConflictResolverImpl::ConflictResolverImpl(
-    LedgerClient* const ledger_client, const LedgerPageId& page_id)
-    : ledger_client_(ledger_client), page_id_(CloneStruct(page_id)) {}
-
-LedgerClient::ConflictResolverImpl::~ConflictResolverImpl() = default;
-
-void LedgerClient::ConflictResolverImpl::Connect(
-    fidl::InterfaceRequest<fuchsia::ledger::ConflictResolver> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void LedgerClient::ConflictResolverImpl::Resolve(
-    fidl::InterfaceHandle<fuchsia::ledger::PageSnapshot> left_version,
-    fidl::InterfaceHandle<fuchsia::ledger::PageSnapshot> right_version,
-    fidl::InterfaceHandle<fuchsia::ledger::PageSnapshot> common_version,
-    fidl::InterfaceHandle<fuchsia::ledger::MergeResultProvider>
-        result_provider) {
-  operation_queue_.Add(
-      new ResolveCall(this, result_provider.Bind(), left_version.Bind(),
-                      right_version.Bind(), common_version.Bind()));
-}
-
-void LedgerClient::ConflictResolverImpl::GetPageClients(
-    std::vector<PageClient*>* page_clients) {
-  auto i = std::find_if(
-      ledger_client_->pages_.begin(), ledger_client_->pages_.end(),
-      [this](auto& item) { return PageIdsEqual(item->page_id, page_id_); });
-
-  FXL_CHECK(i != ledger_client_->pages_.end());
-  *page_clients = (*i)->clients;
-}
-
-void LedgerClient::ConflictResolverImpl::NotifyWatchers() const {
-  for (auto& watcher : ledger_client_->watchers_) {
-    watcher();
-  }
-}
-
-}  // namespace modular
diff --git a/lib/ledger_client/ledger_client.h b/lib/ledger_client/ledger_client.h
deleted file mode 100644
index b6ed4c8..0000000
--- a/lib/ledger_client/ledger_client.h
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_LEDGER_CLIENT_LEDGER_CLIENT_H_
-#define PERIDOT_LIB_LEDGER_CLIENT_LEDGER_CLIENT_H_
-
-#include <functional>
-#include <memory>
-#include <vector>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_ptr.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/ledger_client/types.h"
-
-namespace modular {
-
-class PageClient;
-
-// The primary purpose of the ledger client is to act as conflict resolver
-// factory which is able to dispatch conflicts to the page clients based on
-// their page and key prefix.
-class LedgerClient : fuchsia::ledger::ConflictResolverFactory {
- public:
-  LedgerClient(fuchsia::ledger::internal::LedgerRepository* ledger_repository,
-               const std::string& name, std::function<void()> error);
-  LedgerClient(fuchsia::ledger::LedgerPtr ledger);
-  ~LedgerClient() override;
-
-  fuchsia::ledger::Ledger* ledger() const { return ledger_.get(); }
-
-  // A callback that is invoked every time one conflict resolution completes.
-  // Used only for testing so far.
-  void add_watcher(std::function<void()> watcher) {
-    watchers_.emplace_back(std::move(watcher));
-  }
-
- private:
-  friend class PageClient;
-  class ConflictResolverImpl;
-  struct PageEntry;
-
-  // Used by PageClient to access a new page on creation. Two page clients of
-  // the same page share the same ledger::Page connection.
-  fuchsia::ledger::Page* GetPage(PageClient* page_client,
-                                 const std::string& context,
-                                 const fuchsia::ledger::PageId& page_id);
-
-  // PageClient deregisters itself on destrution.
-  void DropPageClient(PageClient* page_client);
-
-  // |ConflictResolverFactory|
-  void GetPolicy(LedgerPageId page_id, GetPolicyCallback callback) override;
-
-  // |ConflictResolverFactory|
-  void NewConflictResolver(
-      LedgerPageId page_id,
-      fidl::InterfaceRequest<fuchsia::ledger::ConflictResolver> request)
-      override;
-
-  void ClearConflictResolver(const LedgerPageId& page_id);
-
-  // The ledger this is a client of.
-  fuchsia::ledger::LedgerPtr ledger_;
-
-  fidl::BindingSet<fuchsia::ledger::ConflictResolverFactory> bindings_;
-  std::vector<std::unique_ptr<ConflictResolverImpl>> resolvers_;
-
-  // ledger::Page connections are owned by LedgerClient, and only handed to
-  // PageClient as naked pointers. This allows multiple clients of the same page
-  // to share a page connection.
-  std::vector<std::unique_ptr<PageEntry>> pages_;
-
-  // Notified whenever a conflict resolution cycle finishes.
-  std::vector<std::function<void()>> watchers_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerClient);
-};
-
-// A conflict resolver for one page that delegates the diff for a key to the
-// appropriate page client that handles that key.
-class LedgerClient::ConflictResolverImpl : fuchsia::ledger::ConflictResolver {
- public:
-  ConflictResolverImpl(LedgerClient* ledger_client,
-                       const LedgerPageId& page_id);
-  ~ConflictResolverImpl() override;
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::ledger::ConflictResolver> request);
-
-  const LedgerPageId& page_id() const { return page_id_; }
-
- private:
-  // |ConflictResolver|
-  void Resolve(
-      fidl::InterfaceHandle<fuchsia::ledger::PageSnapshot> left_version,
-      fidl::InterfaceHandle<fuchsia::ledger::PageSnapshot> right_version,
-      fidl::InterfaceHandle<fuchsia::ledger::PageSnapshot> common_version,
-      fidl::InterfaceHandle<fuchsia::ledger::MergeResultProvider>
-          result_provider) override;
-
-  void GetPageClients(std::vector<PageClient*>* page_clients);
-
-  void NotifyWatchers() const;
-
-  LedgerClient* const ledger_client_;
-  LedgerPageId page_id_;
-
-  fidl::BindingSet<fuchsia::ledger::ConflictResolver> bindings_;
-
-  OperationQueue operation_queue_;
-  class ResolveCall;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ConflictResolverImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_LEDGER_CLIENT_LEDGER_CLIENT_H_
diff --git a/lib/ledger_client/operations.h b/lib/ledger_client/operations.h
deleted file mode 100644
index 2af0227..0000000
--- a/lib/ledger_client/operations.h
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// The file defines Operations commonly executed on Ledger pages.
-
-#ifndef PERIDOT_LIB_LEDGER_CLIENT_OPERATIONS_H_
-#define PERIDOT_LIB_LEDGER_CLIENT_OPERATIONS_H_
-
-#include <string>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <lib/async/cpp/operation.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/fidl/json_xdr.h"
-#include "peridot/lib/ledger_client/page_client.h"
-
-namespace modular {
-
-// Common base class for all Operation classes that operate on a ledger Page.
-//
-// The ledger page is always passed as a naked pointer fuchsia::ledger::Page*
-// rather than as a FIDL pointer fuchsia::ledger::PagePtr to the Operation
-// instance, because the connection to the page is shared between different
-// Operation instances executed by different actors in the framework. The
-// PagePtr is held by LedgerClient and handed out as Page* to PageClient, which
-// passes it on to the respective Operations.
-//
-// As a result, callbacks for methods invoked on the Page* are not cancelled
-// when the Operation instance is deleted, as they would be if the FIDL pointer
-// were owned by the Operation instance. Therefore, such callbacks must be
-// explicitly guarded using a weak pointer to the Operation instance against
-// execution after their Operation instance was destroyed.
-//
-// This base class provides the method Protect() for the purpose.
-//
-// In derived class that are themselves template classes, the method must be
-// invoked by explicit qualification with this-> (or alternatively with the base
-// class name), because of template name lookup rules.
-//
-// Also, it is not possible to pass a PageSnapshotPtr to the Operation instead,
-// because the snapshot must be taken at the time the Operation is executed, not
-// at the time the Operation is enqueued, because it must reflect the effect of
-// the execution of preceding operations.
-template <typename... Args>
-class PageOperation : public Operation<Args...> {
- public:
-  using ResultCall = std::function<void(Args...)>;
-
-  PageOperation(const char* const trace_name, fuchsia::ledger::Page* const page,
-                ResultCall result_call, const std::string& trace_info = "")
-      : Operation<Args...>(trace_name, std::move(result_call), trace_info),
-        page_(page) {}
-
- protected:
-  fuchsia::ledger::Page* page() const { return page_; }
-
-  using PageCallback = std::function<void(fuchsia::ledger::Status)>;
-
-  PageCallback Protect(PageCallback callback) {
-    return [weak_this = this->GetWeakPtr(),
-            callback = std::move(callback)](fuchsia::ledger::Status status) {
-      if (weak_this) {
-        callback(status);
-      }
-    };
-  }
-
- private:
-  fuchsia::ledger::Page* const page_;
-};
-
-// Like PageOperation, but also takes a naked Ledger pointer, which has the same
-// problems.
-//
-// This could be unified more with PageOperation, but only worthwhile once there
-// are more situations to support. For now, it's very nice to label Operation
-// classes explicitly with their base classes.
-template <typename... Args>
-class LedgerOperation : public Operation<Args...> {
- public:
-  using ResultCall = std::function<void(Args...)>;
-
-  LedgerOperation(const char* const trace_name, fuchsia::ledger::Ledger* ledger,
-                  fuchsia::ledger::Page* const page, ResultCall result_call,
-                  const std::string& trace_info = "")
-      : Operation<Args...>(trace_name, std::move(result_call), trace_info),
-        ledger_(ledger),
-        page_(page) {}
-
- protected:
-  fuchsia::ledger::Ledger* ledger() const { return ledger_; }
-  fuchsia::ledger::Page* page() const { return page_; }
-
-  using LedgerCallback = std::function<void(fuchsia::ledger::Status)>;
-
-  LedgerCallback Protect(LedgerCallback callback) {
-    return [weak_this = this->GetWeakPtr(),
-            callback = std::move(callback)](fuchsia::ledger::Status status) {
-      if (weak_this) {
-        callback(status);
-      }
-    };
-  }
-
- private:
-  fuchsia::ledger::Ledger* const ledger_;
-  fuchsia::ledger::Page* const page_;
-};
-
-template <typename Data, typename DataPtr = std::unique_ptr<Data>,
-          typename DataFilter = XdrFilterList<Data>>
-class ReadDataCall : public PageOperation<DataPtr> {
- public:
-  using ResultCall = std::function<void(DataPtr)>;
-  using FlowToken = typename Operation<DataPtr>::FlowToken;
-
-  ReadDataCall(fuchsia::ledger::Page* const page, const std::string& key,
-               const bool not_found_is_ok, DataFilter filter,
-               ResultCall result_call)
-      : PageOperation<DataPtr>("ReadDataCall", page, std::move(result_call),
-                               key),
-        key_(key),
-        not_found_is_ok_(not_found_is_ok),
-        filter_(filter) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &result_};
-
-    this->page()->GetSnapshot(
-        page_snapshot_.NewRequest(), fidl::VectorPtr<uint8_t>::New(0), nullptr,
-        this->Protect([this, flow](fuchsia::ledger::Status status) {
-          if (status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << this->trace_name() << " " << key_ << " "
-                           << "Page.GetSnapshot() "
-                           << fidl::ToUnderlying(status);
-            return;
-          }
-
-          Cont(flow);
-        }));
-  }
-
-  void Cont(FlowToken flow) {
-    page_snapshot_->Get(to_array(key_), [this, flow](
-                                            fuchsia::ledger::Status status,
-                                            fuchsia::mem::BufferPtr value) {
-      if (status != fuchsia::ledger::Status::OK) {
-        if (status != fuchsia::ledger::Status::KEY_NOT_FOUND ||
-            !not_found_is_ok_) {
-          FXL_LOG(ERROR) << this->trace_name() << " " << key_ << " "
-                         << "PageSnapshot.Get() " << fidl::ToUnderlying(status);
-        }
-        return;
-      }
-
-      if (!value) {
-        FXL_LOG(ERROR) << this->trace_name() << " " << key_ << " "
-                       << "PageSnapshot.Get() null vmo";
-      }
-
-      std::string value_as_string;
-      if (!fsl::StringFromVmo(*value, &value_as_string)) {
-        FXL_LOG(ERROR) << this->trace_name() << " " << key_
-                       << " Unable to extract data.";
-        return;
-      }
-
-      if (!XdrRead(value_as_string, &result_, filter_)) {
-        result_.reset();
-        return;
-      }
-
-      FXL_DCHECK(result_);
-    });
-  }
-
-  const std::string key_;
-  const bool not_found_is_ok_;
-  DataFilter const filter_;
-  fuchsia::ledger::PageSnapshotPtr page_snapshot_;
-  DataPtr result_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ReadDataCall);
-};
-
-template <typename Data, typename DataArray = std::vector<Data>,
-          typename DataFilter = XdrFilterList<Data>>
-class ReadAllDataCall : public PageOperation<DataArray> {
- public:
-  using ResultCall = std::function<void(DataArray)>;
-  using FlowToken = typename Operation<DataArray>::FlowToken;
-
-  ReadAllDataCall(fuchsia::ledger::Page* const page, std::string prefix,
-                  DataFilter const filter, ResultCall result_call)
-      : PageOperation<DataArray>("ReadAllDataCall", page,
-                                 std::move(result_call), prefix),
-        prefix_(std::move(prefix)),
-        filter_(filter) {
-    data_.resize(0);
-  }
-
- private:
-  void Run() override {
-    FlowToken flow{this, &data_};
-
-    this->page()->GetSnapshot(
-        page_snapshot_.NewRequest(), to_array(prefix_), nullptr,
-        this->Protect([this, flow](fuchsia::ledger::Status status) {
-          if (status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << this->trace_name() << " "
-                           << "Page.GetSnapshot() "
-                           << fidl::ToUnderlying(status);
-            return;
-          }
-
-          Cont1(flow);
-        }));
-  }
-
-  void Cont1(FlowToken flow) {
-    GetEntries(page_snapshot_.get(), &entries_,
-               [this, flow](fuchsia::ledger::Status status) {
-                 if (status != fuchsia::ledger::Status::OK) {
-                   FXL_LOG(ERROR)
-                       << this->trace_name() << " "
-                       << "GetEntries() " << fidl::ToUnderlying(status);
-                   return;
-                 }
-
-                 Cont2(flow);
-               });
-  }
-
-  void Cont2(FlowToken /*flow*/) {
-    for (auto& entry : entries_) {
-      std::string value_as_string;
-      if (!fsl::StringFromVmo(*entry.value, &value_as_string)) {
-        FXL_LOG(ERROR) << this->trace_name() << " "
-                       << "Unable to extract data.";
-        continue;
-      }
-
-      Data data;
-      if (!XdrRead(value_as_string, &data, filter_)) {
-        continue;
-      }
-
-      data_.push_back(std::move(data));
-    }
-  }
-
-  fuchsia::ledger::PageSnapshotPtr page_snapshot_;
-  const std::string prefix_;
-  DataFilter const filter_;
-  std::vector<fuchsia::ledger::Entry> entries_;
-  DataArray data_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ReadAllDataCall);
-};
-
-template <typename Data, typename DataPtr = std::unique_ptr<Data>,
-          typename DataFilter = XdrFilterList<Data>>
-class WriteDataCall : public PageOperation<> {
- public:
-  WriteDataCall(fuchsia::ledger::Page* const page, const std::string& key,
-                DataFilter filter, DataPtr data, ResultCall result_call)
-      : PageOperation("WriteDataCall", page, std::move(result_call), key),
-        key_(key),
-        filter_(filter),
-        data_(std::move(data)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this};
-
-    std::string json;
-    XdrWrite(&json, &data_, filter_);
-
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(json, &vmo));
-    page()->CreateReferenceFromBuffer(
-        std::move(vmo).ToTransport(),
-        [this, weak_ptr = GetWeakPtr(), flow](
-            fuchsia::ledger::Status status,
-            std::unique_ptr<fuchsia::ledger::Reference> reference) {
-          if (!weak_ptr) {
-            return;
-          }
-          PutReference(std::move(reference), flow);
-        });
-  }
-
-  void PutReference(std::unique_ptr<fuchsia::ledger::Reference> reference,
-                    FlowToken flow) {
-    if (!reference) {
-      FXL_LOG(ERROR) << trace_name() << " " << key_ << " "
-                     << "Page.Put() could not construct reference.";
-      return;
-    }
-
-    page()->PutReference(
-        to_array(key_), std::move(*reference), fuchsia::ledger::Priority::EAGER,
-        Protect([this, flow](fuchsia::ledger::Status status) {
-          if (status != fuchsia::ledger::Status::OK) {
-            FXL_LOG(ERROR) << trace_name() << " " << key_ << " "
-                           << "Page.Put() " << fidl::ToUnderlying(status);
-          }
-        }));
-  }
-
-  const std::string key_;
-  DataFilter const filter_;
-  DataPtr data_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(WriteDataCall);
-};
-
-class DumpPageSnapshotCall : public PageOperation<std::string> {
- public:
-  DumpPageSnapshotCall(fuchsia::ledger::Page* const page,
-                       ResultCall result_call)
-      : PageOperation("DumpPageSnapshotCall", page, std::move(result_call)) {}
-
- private:
-  void Run() override {
-    FlowToken flow{this, &dump_};
-
-    page()->GetSnapshot(page_snapshot_.NewRequest(),
-                        fidl::VectorPtr<uint8_t>::New(0), nullptr,
-                        Protect([this, flow](fuchsia::ledger::Status status) {
-                          if (status != fuchsia::ledger::Status::OK) {
-                            FXL_LOG(ERROR) << this->trace_name() << " "
-                                           << "Page.GetSnapshot() "
-                                           << fidl::ToUnderlying(status);
-                            return;
-                          }
-
-                          Cont1(flow);
-                        }));
-  }
-
-  void Cont1(FlowToken flow) {
-    GetEntries(page_snapshot_.get(), &entries_,
-               [this, flow](fuchsia::ledger::Status status) {
-                 if (status != fuchsia::ledger::Status::OK) {
-                   FXL_LOG(ERROR)
-                       << this->trace_name() << " "
-                       << "GetEntries() " << fidl::ToUnderlying(status);
-                   return;
-                 }
-
-                 Cont2(flow);
-               });
-  }
-
-  void Cont2(FlowToken /*flow*/) {
-    std::ostringstream stream;
-    for (auto& entry : entries_) {
-      stream << "key: " << to_hex_string(entry.key) << std::endl;
-
-      std::string value_as_string;
-      if (!fsl::StringFromVmo(*entry.value, &value_as_string)) {
-        FXL_LOG(ERROR) << this->trace_name() << " "
-                       << "Unable to extract data.";
-        continue;
-      }
-      stream << "value: " << value_as_string << std::endl;
-    }
-    dump_ = stream.str();
-  }
-
-  fuchsia::ledger::PageSnapshotPtr page_snapshot_;
-  std::vector<fuchsia::ledger::Entry> entries_;
-  std::string dump_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(DumpPageSnapshotCall);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_LEDGER_CLIENT_OPERATIONS_H_
diff --git a/lib/ledger_client/page_client.cc b/lib/ledger_client/page_client.cc
deleted file mode 100644
index e75ae85..0000000
--- a/lib/ledger_client/page_client.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/ledger_client/page_client.h"
-
-#include <memory>
-#include <utility>
-
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-
-namespace modular {
-
-PageClient::PageClient(std::string context, LedgerClient* ledger_client,
-                       LedgerPageId page_id, std::string prefix)
-    : binding_(this),
-      context_(std::move(context)),
-      ledger_client_(ledger_client),
-      page_id_(std::move(page_id)),
-      page_(ledger_client_->GetPage(this, context_, page_id_)),
-      prefix_(std::move(prefix)) {
-  fuchsia::ledger::PageSnapshotPtr snapshot;
-  page_->GetSnapshot(snapshot.NewRequest(), to_array(prefix_),
-                     binding_.NewBinding(),
-                     [this](fuchsia::ledger::Status status) {
-                       if (status != fuchsia::ledger::Status::OK) {
-                         FXL_LOG(ERROR) << context_ << " Page.GetSnapshot() "
-                                        << fidl::ToUnderlying(status);
-                       }
-                     });
-}
-
-PageClient::~PageClient() {
-  // We assume ledger client always outlives page client.
-  ledger_client_->DropPageClient(this);
-}
-
-fuchsia::ledger::PageSnapshotPtr PageClient::NewSnapshot(
-    std::function<void()> on_error) {
-  fuchsia::ledger::PageSnapshotPtr ptr;
-  page_->GetSnapshot(
-      ptr.NewRequest(), to_array(prefix_), nullptr /* page_watcher */,
-      [this, on_error = std::move(on_error)](fuchsia::ledger::Status status) {
-        if (status != fuchsia::ledger::Status::OK) {
-          FXL_LOG(ERROR) << context_ << " Page.GetSnapshot() "
-                         << fidl::ToUnderlying(status);
-          on_error();
-        }
-      });
-  return ptr;
-}
-
-// |PageWatcher|
-void PageClient::OnChange(fuchsia::ledger::PageChange page,
-                          fuchsia::ledger::ResultState result_state,
-                          OnChangeCallback callback) {
-  for (auto& entry : page.changed_entries) {
-    // Remove key prefix maybe?
-    OnPageChange(to_string(entry.key), std::move(entry.value));
-  }
-
-  for (auto& key : page.deleted_keys) {
-    OnPageDelete(to_string(key));
-  }
-
-  callback(nullptr);
-}
-
-void PageClient::OnPageChange(const std::string& key,
-                              fuchsia::mem::BufferPtr value) {
-  std::string value_string;
-  if (fsl::StringFromVmo(*value, &value_string)) {
-    OnPageChange(key, value_string);
-  } else {
-    FXL_LOG(ERROR) << "PageClient::OnChange() " << context_ << ": "
-                   << "Unable to read/copy data.";
-  }
-}
-
-void PageClient::OnPageChange(const std::string& /*key*/,
-                              const std::string& /*value*/) {}
-
-void PageClient::OnPageDelete(const std::string& /*key*/) {}
-
-void PageClient::OnPageConflict(Conflict* const conflict) {
-  FXL_LOG(INFO) << "PageClient::OnPageConflict() " << context_ << " "
-                << to_hex_string(conflict->key) << " " << conflict->left << " "
-                << conflict->right;
-};
-
-namespace {
-
-void GetEntriesRecursive(fuchsia::ledger::PageSnapshot* const snapshot,
-                         std::vector<fuchsia::ledger::Entry>* const entries,
-                         std::unique_ptr<fuchsia::ledger::Token> next_token,
-                         std::function<void(fuchsia::ledger::Status)> done) {
-  snapshot->GetEntries(
-      std::vector<uint8_t>{} /* key_start */, std::move(next_token),
-      fxl::MakeCopyable([snapshot, entries, done = std::move(done)](
-                            fuchsia::ledger::Status status, auto new_entries,
-                            auto next_token) mutable {
-        if (status != fuchsia::ledger::Status::OK &&
-            status != fuchsia::ledger::Status::PARTIAL_RESULT) {
-          done(status);
-          return;
-        }
-
-        for (size_t i = 0; i < new_entries.size(); ++i) {
-          entries->push_back(std::move(new_entries.at(i)));
-        }
-
-        if (status == fuchsia::ledger::Status::OK) {
-          done(fuchsia::ledger::Status::OK);
-          return;
-        }
-
-        GetEntriesRecursive(snapshot, entries, std::move(next_token),
-                            std::move(done));
-      }));
-}
-
-}  // namespace
-
-void GetEntries(fuchsia::ledger::PageSnapshot* const snapshot,
-                std::vector<fuchsia::ledger::Entry>* const entries,
-                std::function<void(fuchsia::ledger::Status)> done) {
-  GetEntriesRecursive(snapshot, entries, nullptr /* next_token */,
-                      std::move(done));
-}
-
-}  // namespace modular
diff --git a/lib/ledger_client/page_client.h b/lib/ledger_client/page_client.h
deleted file mode 100644
index 33cd36b..0000000
--- a/lib/ledger_client/page_client.h
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_LEDGER_CLIENT_PAGE_CLIENT_H_
-#define PERIDOT_LIB_LEDGER_CLIENT_PAGE_CLIENT_H_
-
-#include <array>
-#include <string>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/ledger_client/types.h"
-
-namespace modular {
-
-class LedgerClient;
-
-// A helper class that aids in interfacing with a fuchsia.ledger.Page by:
-//
-// 1) Forwarding requests for conflict resolution from the
-// fuchsia.ledger.Ledger connection to a PageClient's OnPageConflict() which is
-// constructed with an associated key prefix of the Page.
-// 2) Providing a convenient method to acquire a PageSnapshot from the Page.
-// 3) Providing an optional and convenient per-key
-// fuchsia.ledger.PageWatcher.OnChange() implementation that calls into
-// OnPageChange(). Clients that care about the notification semantics of >1 key
-// at a time may wish to implement OnChange() directly.
-//
-// NOTE: The conflict resolution API is currently implemented on a per-key
-// basis.  Conflict resolution may be difficult for some clients to implement
-// if a multiple-key update has semantic meaning. MF-157
-class PageClient : fuchsia::ledger::PageWatcher {
- public:
-  // |context| is used as a string prefix on log messages.  |ledger_client| is
-  // used to retrieve a handle to the page specified in |page_id|, and to
-  // listen for conflicts from the ledger. If |prefix| is provided, the
-  // resulting page snapshot and change notifications are limited to only keys
-  // with that prefix. However, OnPageChange()'s |key| will include the full
-  // key, including the prefix.
-  //
-  // |ledger_client| must outlive *this.
-  PageClient(std::string context, LedgerClient* ledger_client,
-             LedgerPageId page_id, std::string prefix = "");
-  ~PageClient() override;
-
-  // Returns a snapshot of the Ledger page under |prefix| at the most recent
-  // timepoint.
-  //
-  // If |on_error| is provided, it will be called if there was a Ledger error
-  // trying to get the snapshot.
-  //
-  // NOTE: There is no guaranteed timing for writes made to the returned
-  // PageSnapshot and notifications of changes through OnPageChange(). The
-  // ordering is guaranteed to be the same, ignoring changes to the writes
-  // caused by conflict resolution which can cause some writes to disappear.
-  fuchsia::ledger::PageSnapshotPtr NewSnapshot(
-      std::function<void()> on_error = nullptr);
-
-  const fuchsia::ledger::PageId& page_id() const { return page_id_; }
-  const std::string& prefix() const { return prefix_; }
-  fuchsia::ledger::Page* page() { return page_; }
-
-  // Computed by implementations of OnPageConflict() in derived classes.
-  enum ConflictResolution { LEFT, RIGHT, MERGE };
-
-  // The argument to OnPageConflict(). It's mutated in place so it's easier to
-  // extend without having to alter clients.
-  struct Conflict {
-    std::vector<uint8_t> key;
-
-    bool has_left{};
-    std::string left;
-    bool left_is_deleted{};
-
-    bool has_right{};
-    std::string right;
-    bool right_is_deleted{};
-
-    ConflictResolution resolution{LEFT};
-    std::string merged;
-    bool merged_is_deleted{};
-  };
-
- protected:
-  // Derived classes may implement this method as needed. The default
-  // implementation copies the VMO to a string and forwards to
-  // |OnPageChange(const std::string&, const std::string&)|.
-  virtual void OnPageChange(const std::string& key,
-                            fuchsia::mem::BufferPtr value);
-
-  using PageWatcher::OnChangeCallback;
-  // |PageWatcher|
-  //
-  // Derived classes may implement this method as needed. The default
-  // implementation forwards individual changed keys to OnPageChange() and
-  // OnPageDelete().
-  void OnChange(fuchsia::ledger::PageChange page,
-                fuchsia::ledger::ResultState result_state,
-                OnChangeCallback callback) override;
-
- private:
-  // Derived classes implement this method as needed. The default implementation
-  // does nothing. This method is only called if forwarded from
-  // |OnPageChange(const std::string&, fuchsia::mem::BufferPtr)|.
-  virtual void OnPageChange(const std::string& key, const std::string& value);
-  // Derived classes implement this method as needed. The default implementation
-  // does nothing.
-  virtual void OnPageDelete(const std::string& key);
-
-  // Derived classes implement this method as needed. The default implementation
-  // selects left and logs an INFO about the unresolved conflict.
-  //
-  // For now, only per-key conflict resolution is supported by page client. If
-  // we need more coherency for conflict resolution, this can be changed.
-  //
-  // For now, conflict resolution is synchronous. Can be changed too, for
-  // example to go on an OperationQueue to wait for ongoing changes to reconcile
-  // with.
-  //
-  // If ConflictResolution is MERGE, the result is returned in merged*. It is
-  // possible that the merge of two undeleted values is to the delete the key.
-  //
-  // This is invoked from the conflict resolver in LedgerClient.
-  friend class LedgerClient;
-  virtual void OnPageConflict(Conflict* conflict);
-
-
-  fidl::Binding<fuchsia::ledger::PageWatcher> binding_;
-  const std::string context_;
-
-  LedgerClient* const ledger_client_;
-  const fuchsia::ledger::PageId page_id_;
-  fuchsia::ledger::Page* const page_;
-  const std::string prefix_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageClient);
-};
-
-// Retrieves all entries from the given snapshot and calls the given callback
-// with the final status.
-//
-// The FIDL pointer backing |snapshot| must have the same life time as
-// |entries|, so that callbacks are cancelled when |entries| are deleted before
-// |callback| is invoked.
-void GetEntries(fuchsia::ledger::PageSnapshot* snapshot,
-                std::vector<fuchsia::ledger::Entry>* entries,
-                std::function<void(fuchsia::ledger::Status)> done);
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_LEDGER_CLIENT_PAGE_CLIENT_H_
diff --git a/lib/ledger_client/page_client_unittest.cc b/lib/ledger_client/page_client_unittest.cc
deleted file mode 100644
index 43ac830..0000000
--- a/lib/ledger_client/page_client_unittest.cc
+++ /dev/null
@@ -1,344 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/ledger_client/page_client.h"
-
-#include <memory>
-
-#include <lib/fxl/macros.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-#include "peridot/lib/ledger_client/page_id.h"
-#include "peridot/lib/testing/test_with_ledger.h"
-
-namespace modular {
-namespace testing {
-namespace {
-
-// NOTE(mesch): Test cases here take about 300ms when running in CI.
-// Occasionally they take much longer, presumably because of load on
-// shared machines. With the default timeout, we see flakiness. Cf.
-// FW-287.
-constexpr zx::duration kTimeout = zx::sec(10);
-
-class PageClientImpl : public PageClient {
- public:
-  PageClientImpl(LedgerClient* ledger_client, LedgerPageId page_id,
-                 std::string prefix = "")
-      : PageClient("PageClientImpl", ledger_client, std::move(page_id),
-                   std::move(prefix)) {}
-
-  ~PageClientImpl() override = default;
-
-  void OnPageChange(const std::string& key, const std::string& value) override {
-    ++change_count_;
-
-    values_[key] = value;
-
-    FXL_LOG(INFO) << "OnPageChange \"" << prefix() << "\""
-                  << " " << change_count_ << " " << key << " " << value;
-  }
-
-  void SetConflictResolver(std::function<void(Conflict*)> conflict_resolver) {
-    conflict_resolver_ = std::move(conflict_resolver);
-  }
-
-  void OnPageConflict(Conflict* const conflict) override {
-    ++conflict_count_;
-
-    FXL_LOG(INFO) << "OnPageConflict " << prefix() << " " << conflict_count_
-                  << " " << to_string(conflict->key) << " " << conflict->left
-                  << " " << conflict->right;
-
-    conflict_resolver_(conflict);
-  }
-
-  int change_count() const { return change_count_; }
-  int conflict_count() const { return conflict_count_; }
-
-  bool has_value(const std::string& key) { return values_.count(key) > 0; }
-  const std::string& value(const std::string& key) { return values_[key]; }
-
- private:
-  std::map<std::string, std::string> values_;
-  int change_count_{};
-  int conflict_count_{};
-
-  std::function<void(Conflict*)> conflict_resolver_;
-};
-
-class PageClientTest : public TestWithLedger {
- protected:
-  PageClientTest() {}
-
-  ~PageClientTest() = default;
-
-  void SetUp() override {
-    TestWithLedger::SetUp();
-    // We only handle one conflict resolution per test case for now.
-    ledger_client()->add_watcher([this] { resolved_ = true; });
-  }
-
-  void TearDown() override {
-    page_clients_.clear();
-    TestWithLedger::TearDown();
-  }
-
-  PageClientImpl* CreatePageClient(const std::string& page_id,
-                                   const std::string& prefix = "") {
-    auto page_client = std::make_unique<PageClientImpl>(
-        ledger_client(), MakePageId(page_id), prefix);
-    auto* ptr = page_client.get();
-    page_clients_.emplace_back(std::move(page_client));
-    return ptr;
-  }
-
-  fuchsia::ledger::PagePtr CreatePagePtr(const std::string& page_id) {
-    fuchsia::ledger::PagePtr page;
-    ledger_client()->ledger()->GetPage(
-        std::make_unique<fuchsia::ledger::PageId>(MakePageId(page_id)),
-        page.NewRequest(), [](fuchsia::ledger::Status status) {
-          ASSERT_EQ(fuchsia::ledger::Status::OK, status);
-        });
-    return page;
-  }
-
-  // Factory for a ledger callback function that just logs errors.
-  std::function<void(fuchsia::ledger::Status)> log(std::string context) {
-    return [context](fuchsia::ledger::Status status) {
-      EXPECT_EQ(fuchsia::ledger::Status::OK, status) << context;
-    };
-  }
-
-  bool resolved() const { return resolved_; }
-
- private:
-  // Storage for page clients created with CreatePageClient(). All will use the
-  // same page connection since they are created with the same LedgerClient.
-  std::vector<std::unique_ptr<PageClientImpl>> page_clients_;
-
-  // Set to true when LedgerClient sees a change. This happens to co-occur with
-  // when conflict resolution is done.
-  bool resolved_{};
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(PageClientTest);
-};
-
-// This test is flaky. https://fuchsia.atlassian.net/browse/MI4-797
-TEST_F(PageClientTest, DISABLED_SimpleWriteObserve) {
-  // Create a PageClient for a page, and write directly to it. We expect to see
-  // the resulting change in the PageClient.
-  auto client = CreatePageClient("page");
-
-  client->page()->Put(to_array("key"), to_array("value"), log("Put"));
-
-  RunLoopWithTimeoutOrUntil([&] { return client->value("key") == "value"; },
-                            kTimeout);
-
-  EXPECT_EQ(0, client->conflict_count());
-  EXPECT_EQ("value", client->value("key"));
-}
-
-TEST_F(PageClientTest, PrefixWriteObserve) {
-  // Put two values, one for each of two prefixes. The two PageClients, being
-  // configured to only look for each of those two prefixes, respectively,
-  // should only be notified of the relevant keys when the values change.
-  auto client_a = CreatePageClient("page", "a/");
-  auto client_b = CreatePageClient("page", "b/");
-
-  auto page = CreatePagePtr("page");
-  page->Put(to_array("a/key"), to_array("value"), log("Put"));
-  page->Put(to_array("b/key"), to_array("value"), log("Put"));
-
-  RunLoopWithTimeoutOrUntil(
-      [&] {
-        return client_a->value("a/key") == "value" &&
-               client_b->value("b/key") == "value";
-      },
-      kTimeout);
-
-  EXPECT_EQ(0, client_a->conflict_count());
-  EXPECT_EQ(0, client_b->conflict_count());
-  EXPECT_EQ("value", client_a->value("a/key"));
-  EXPECT_FALSE(client_a->has_value("b/key"));
-  EXPECT_EQ("value", client_b->value("b/key"));
-  EXPECT_FALSE(client_b->has_value("a/key"));
-}
-
-TEST_F(PageClientTest, ConcurrentWrite) {
-  // Put two different values using two different PagePtr connections. We
-  // should still see both of them in a PageClient looking at the same page.
-  auto client = CreatePageClient("page");
-
-  auto page1 = CreatePagePtr("page");
-  auto page2 = CreatePagePtr("page");
-  page1->Put(to_array("key1"), to_array("value1"), log("Put key1"));
-  page2->Put(to_array("key2"), to_array("value2"), log("Put key2"));
-
-  RunLoopWithTimeoutOrUntil(
-      [&] {
-        return client->value("key1") == "value1" &&
-               client->value("key2") == "value2";
-      },
-      kTimeout);
-
-  EXPECT_EQ(0, client->conflict_count());
-  EXPECT_EQ("value1", client->value("key1"));
-  EXPECT_EQ("value2", client->value("key2"));
-}
-
-TEST_F(PageClientTest, ConflictWrite) {
-  // Write to the same key on two different PagePtrs, and set our PageClient to
-  // resolve conflict by setting yet a third value.
-  auto client = CreatePageClient("page");
-  client->SetConflictResolver([](PageClient::Conflict* const conflict) {
-    conflict->resolution = PageClient::MERGE;
-    conflict->merged = "value3";
-  });
-
-  auto page1 = client->page();
-  auto page2 = CreatePagePtr("page");
-
-  bool finished{};
-
-  page2->StartTransaction([&](fuchsia::ledger::Status status) {
-    EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-    page2->Put(to_array("key"), to_array("value2"),
-               [&](fuchsia::ledger::Status status) {
-                 EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                 page1->StartTransaction([&](fuchsia::ledger::Status status) {
-                   EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                   page1->Put(
-                       to_array("key"), to_array("value1"),
-                       [&](fuchsia::ledger::Status status) {
-                         EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                         page2->Commit([&](fuchsia::ledger::Status status) {
-                           EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                           page1->Commit([&](fuchsia::ledger::Status status) {
-                             EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                             finished = true;
-                           });
-                         });
-                       });
-                 });
-               });
-  });
-
-  RunLoopWithTimeoutOrUntil(
-      [&] {
-        return finished && resolved() && client->value("key") == "value3";
-      },
-      kTimeout);
-
-  EXPECT_EQ(1, client->conflict_count());
-  EXPECT_EQ("value3", client->value("key"));
-}
-
-TEST_F(PageClientTest, ConflictPrefixWrite) {
-  // Same as above, but this time have two PageClients, each configured for a
-  // different key prefix.  Show that the correct one is used for conflict
-  // resolution, and the other is not consulted at all.
-  auto client_a = CreatePageClient("page", "a/");
-  auto client_b = CreatePageClient("page", "b/");
-  client_a->SetConflictResolver([](PageClient::Conflict* const conflict) {
-    conflict->resolution = PageClient::MERGE;
-    conflict->merged = "value3";
-  });
-
-  auto page1 = client_a->page();
-  auto page2 = CreatePagePtr("page");
-
-  bool finished{};
-  page2->StartTransaction([&](fuchsia::ledger::Status status) {
-    EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-    page2->Put(to_array("a/key"), to_array("value2"),
-               [&](fuchsia::ledger::Status status) {
-                 EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                 page1->StartTransaction([&](fuchsia::ledger::Status status) {
-                   EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                   page1->Put(
-                       to_array("a/key"), to_array("value1"),
-                       [&](fuchsia::ledger::Status status) {
-                         EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                         page2->Commit([&](fuchsia::ledger::Status status) {
-                           EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                           page1->Commit([&](fuchsia::ledger::Status status) {
-                             EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                             finished = true;
-                           });
-                         });
-                       });
-                 });
-               });
-  });
-
-  RunLoopWithTimeoutOrUntil(
-      [&] {
-        return finished && resolved() && client_a->value("a/key") == "value3";
-      },
-      kTimeout);
-
-  EXPECT_EQ(1, client_a->conflict_count());
-  EXPECT_EQ(0, client_b->conflict_count());
-  EXPECT_EQ("value3", client_a->value("a/key"));
-  EXPECT_FALSE(client_b->has_value("a/key"));
-}
-
-TEST_F(PageClientTest, ConcurrentConflictWrite) {
-  // Explicitly cause a conflict on one key, but not on other keys. We should
-  // see the conflict resolve, but it should not affect the other keys at all.
-  auto client = CreatePageClient("page");
-  client->SetConflictResolver([](PageClient::Conflict* const conflict) {
-    conflict->resolution = PageClient::MERGE;
-    conflict->merged = "value3";
-  });
-
-  auto page1 = client->page();
-  auto page2 = CreatePagePtr("page");
-
-  bool finished{};
-  page2->StartTransaction([&](fuchsia::ledger::Status status) {
-    EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-    page2->Put(to_array("key2"), to_array("value2"), log("Put 2 key2"));
-    page2->Put(
-        to_array("key"), to_array("value2"),
-        [&](fuchsia::ledger::Status status) {
-          EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-          page1->StartTransaction([&](fuchsia::ledger::Status status) {
-            EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-            page1->Put(to_array("key1"), to_array("value1"), log("Put 1 key1"));
-            page1->Put(to_array("key"), to_array("value1"),
-                       [&](fuchsia::ledger::Status status) {
-                         EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                         page2->Commit([&](fuchsia::ledger::Status status) {
-                           EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                           page1->Commit([&](fuchsia::ledger::Status status) {
-                             EXPECT_EQ(fuchsia::ledger::Status::OK, status);
-                             finished = true;
-                           });
-                         });
-                       });
-          });
-        });
-  });
-
-  RunLoopWithTimeoutOrUntil(
-      [&] {
-        return finished && resolved() && client->value("key") == "value3" &&
-               client->value("key1") == "value1" &&
-               client->value("key2") == "value2";
-      },
-      kTimeout);
-
-  EXPECT_EQ(1, client->conflict_count());
-  EXPECT_EQ("value1", client->value("key1"));
-  EXPECT_EQ("value2", client->value("key2"));
-  EXPECT_EQ("value3", client->value("key"));
-}
-
-}  // namespace
-}  // namespace testing
-}  // namespace modular
diff --git a/lib/ledger_client/page_id.cc b/lib/ledger_client/page_id.cc
deleted file mode 100644
index c103263..0000000
--- a/lib/ledger_client/page_id.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/ledger_client/page_id.h"
-
-namespace modular {
-
-fuchsia::ledger::PageId MakePageId(const std::string& value) {
-  fuchsia::ledger::PageId page_id;
-  memset(page_id.id.mutable_data(), 0, page_id.id.count());
-  size_t size = std::min(value.length(), page_id.id.count());
-  memcpy(page_id.id.mutable_data(), value.data(), size);
-  return page_id;
-}
-
-}  // namespace modular
diff --git a/lib/ledger_client/page_id.h b/lib/ledger_client/page_id.h
deleted file mode 100644
index 43cd5ea..0000000
--- a/lib/ledger_client/page_id.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_LEDGER_CLIENT_PAGE_ID_H_
-#define PERIDOT_LIB_LEDGER_CLIENT_PAGE_ID_H_
-
-#include <string>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-
-namespace modular {
-
-// Creates a page ID from an equivalent |std::string|.
-//
-// Caveat: This along with |fuchsia::modular::to_string| should not be used for
-// JSON serialization of arbitrary page IDs as JSON string encoding involves a
-// potentially non-invertible UTF-8 encoding. Instead, use |PageIdFromBase64|
-// and |PageIdToBase64|.
-fuchsia::ledger::PageId MakePageId(const std::string& value);
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_LEDGER_CLIENT_PAGE_ID_H_
diff --git a/lib/ledger_client/promise.h b/lib/ledger_client/promise.h
deleted file mode 100644
index 6cf14d6..0000000
--- a/lib/ledger_client/promise.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#pragma once
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <lib/fit/bridge.h>
-#include <lib/fit/promise.h>
-
-#include "peridot/lib/fidl/array_to_string.h"  // for to_string(), to_array()
-
-namespace modular {
-
-// These wrapper functions wrap fuchsia.ledger APIs such that they return
-// a fit::promise<> representing the result of the call. They are useful to
-// incorporate into tasks themselves expressed as fit::promises.
-//
-// The wrapper classes act as namespaces for static methods. For a given api
-// (such as fuchsia.ledger.Page), the wrapper class is called PagePromise, and
-// each method has the same signature as that in fuchsia::ledger::Page, with the
-// addition that the first parameter is always a fuchsia::ledger::Page* and the
-// last parameter (the result callback) is omitted.
-//
-// Note that these wrapper methods IMMEDIATELY call the underlying FIDL
-// function (meaning that a message is dispatched immediately on the underlying
-// channel). The returned promise will block until a response message is
-// received.
-//
-// EXAMPLE
-//
-//   auto p = fit::make_promise([snapshot = page_snapshot_ptr.get()] () {
-//     return PageSnapshotPromise::GetInline(snapshot, key);
-//   }).and_then([] (const std::vector<uint8_t> bytes) {
-//     // Decode and use |bytes|.
-//   });
-
-// fit::promise wrapper functions for fuchsia.ledger.Page.
-class PagePromise {
- public:
-  static fit::promise<> StartTransaction(fuchsia::ledger::Page* page) {
-    fit::bridge<> bridge;
-    page->StartTransaction([completer = std::move(bridge.completer)](
-                               fuchsia::ledger::Status status) mutable {
-      if (status == fuchsia::ledger::Status::OK) {
-        completer.complete_ok();
-      } else {
-        completer.complete_error();
-      }
-    });
-    return bridge.consumer.promise();
-  }
-
-  static fit::promise<> Commit(fuchsia::ledger::Page* page) {
-    fit::bridge<> bridge;
-    page->Commit([completer = std::move(bridge.completer)](
-                     fuchsia::ledger::Status status) mutable {
-      if (status == fuchsia::ledger::Status::OK) {
-        completer.complete_ok();
-      } else {
-        completer.complete_error();
-      }
-    });
-    return bridge.consumer.promise();
-  }
-
-  static fit::promise<> Rollback(fuchsia::ledger::Page* page) {
-    fit::bridge<> bridge;
-    page->Commit([completer = std::move(bridge.completer)](
-                     fuchsia::ledger::Status status) mutable {
-      if (status == fuchsia::ledger::Status::OK) {
-        completer.complete_ok();
-      } else {
-        completer.complete_error();
-      }
-    });
-    return bridge.consumer.promise();
-  }
-
-  static fit::promise<> GetSnapshot(
-      fuchsia::ledger::Page* page,
-      fidl::InterfaceRequest<fuchsia::ledger::PageSnapshot> request) {
-    fit::bridge<> bridge;
-    page->GetSnapshot(std::move(request),
-                      fidl::VectorPtr<uint8_t>::New(0) /* key_prefix */,
-                      nullptr /* watcher */,
-                      [completer = std::move(bridge.completer)](
-                          fuchsia::ledger::Status status) mutable {
-                        if (status == fuchsia::ledger::Status::OK) {
-                          completer.complete_ok();
-                        } else {
-                          completer.complete_error();
-                        }
-                      });
-    return bridge.consumer.promise();
-  }
-
-  static fit::promise<> Put(fuchsia::ledger::Page* page, std::string key,
-                            std::vector<uint8_t> value) {
-    fit::bridge<> bridge;
-    page->Put(to_array(key), fidl::VectorPtr<uint8_t>(std::move(value)),
-              [completer = std::move(bridge.completer)](
-                  fuchsia::ledger::Status status) mutable {
-                if (status == fuchsia::ledger::Status::OK) {
-                  completer.complete_ok();
-                } else {
-                  completer.complete_error();
-                }
-              });
-    return bridge.consumer.promise();
-  }
-};
-
-// fit::promise wrapper functions for fuchsia.ledger.Page.
-//
-// These methods match the signatures in fuchsia.ledger.Page with the exception
-// that the first parameter is always a fuchsia::ledger::Page*.
-class PageSnapshotPromise {
- public:
-  // fit::promise wrapper function for PageSnapshot.GetInline().
-  //
-  // Falls back to PageSnapshot::Get() if the value is too large.
-  // TODO(thatguy): Implement the fallback.
-  static fit::promise<std::unique_ptr<std::vector<uint8_t>>> GetInline(
-      fuchsia::ledger::PageSnapshot* snapshot, std::string key) {
-    fit::bridge<std::unique_ptr<std::vector<uint8_t>>> bridge;
-    snapshot->GetInline(
-        to_array(key), [completer = std::move(bridge.completer)](
-                           fuchsia::ledger::Status status,
-                           fuchsia::ledger::InlinedValuePtr value) mutable {
-          switch (status) {
-            case fuchsia::ledger::Status::OK:
-            case fuchsia::ledger::Status::KEY_NOT_FOUND:
-              if (value) {
-                // Convert the result to a unique_ptr instead of a VectorPtr.
-                auto ret =
-                    std::make_unique<std::vector<uint8_t>>(value->value);
-                completer.complete_ok(std::move(ret));
-              } else {
-                completer.complete_ok(nullptr);
-              }
-              break;
-            case fuchsia::ledger::Status::VALUE_TOO_LARGE:
-              // TODO(thatguy): Handle a too-large value.
-              FXL_LOG(FATAL) << "TODO: fallback to PageSnapshot_Get().";
-            default:
-              FXL_LOG(ERROR) << "PageSnapshotPromise::GetInline() failed with "
-                             << fidl::ToUnderlying(status);
-              completer.complete_error();
-          }
-        });
-    return bridge.consumer.promise();
-  }
-};
-
-}  // namespace modular
diff --git a/lib/ledger_client/status.cc b/lib/ledger_client/status.cc
deleted file mode 100644
index b79f223..0000000
--- a/lib/ledger_client/status.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/ledger_client/status.h"
-
-#include <string>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <lib/fxl/logging.h>
-#include <zircon/status.h>
-
-namespace modular {
-
-std::string LedgerStatusToString(fuchsia::ledger::Status status) {
-  switch (status) {
-    case fuchsia::ledger::Status::OK:
-      return "OK";
-    case fuchsia::ledger::Status::PARTIAL_RESULT:
-      return "PARTIAL_RESULT";
-    case fuchsia::ledger::Status::INVALID_TOKEN:
-      return "INVALID_TOKEN";
-    case fuchsia::ledger::Status::INVALID_ARGUMENT:
-      return "INVALID_ARGUMENT";
-    case fuchsia::ledger::Status::PAGE_NOT_FOUND:
-      return "PAGE_NOT_FOUND";
-    case fuchsia::ledger::Status::KEY_NOT_FOUND:
-      return "KEY_NOT_FOUND";
-    case fuchsia::ledger::Status::REFERENCE_NOT_FOUND:
-      return "REFERENCE_NOT_FOUND";
-    case fuchsia::ledger::Status::NEEDS_FETCH:
-      return "NEEDS_FETCH";
-    case fuchsia::ledger::Status::IO_ERROR:
-      return "IO_ERROR";
-    case fuchsia::ledger::Status::NETWORK_ERROR:
-      return "NETWORK_ERROR";
-    case fuchsia::ledger::Status::TRANSACTION_ALREADY_IN_PROGRESS:
-      return "TRANSACTION_ALREADY_IN_PROGRESS";
-    case fuchsia::ledger::Status::NO_TRANSACTION_IN_PROGRESS:
-      return "NO_TRANSACTION_IN_PROGRESS";
-    case fuchsia::ledger::Status::INTERNAL_ERROR:
-      return "INTERNAL_ERROR";
-    case fuchsia::ledger::Status::VALUE_TOO_LARGE:
-      return "VALUE_TOO_LARGE";
-    case fuchsia::ledger::Status::ILLEGAL_STATE:
-      return "ILLEGAL_STATE";
-    case fuchsia::ledger::Status::UNKNOWN_ERROR:
-      return "UNKNOWN_ERROR";
-  }
-};
-
-std::string LedgerEpitaphToString(zx_status_t status) {
-  if (status > 0) {
-    return LedgerStatusToString(static_cast<fuchsia::ledger::Status>(status));
-  }
-  return zx_status_get_string(status);
-}
-
-}  // namespace modular
diff --git a/lib/ledger_client/status.h b/lib/ledger_client/status.h
deleted file mode 100644
index 8b4dbe1..0000000
--- a/lib/ledger_client/status.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_LEDGER_CLIENT_STATUS_H_
-#define PERIDOT_LIB_LEDGER_CLIENT_STATUS_H_
-
-#include <string>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-
-namespace modular {
-
-std::string LedgerStatusToString(fuchsia::ledger::Status status);
-std::string LedgerEpitaphToString(zx_status_t status);
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_LEDGER_CLIENT_STATUS_H_
diff --git a/lib/ledger_client/types.h b/lib/ledger_client/types.h
deleted file mode 100644
index e5919df..0000000
--- a/lib/ledger_client/types.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_LEDGER_CLIENT_TYPES_H_
-#define PERIDOT_LIB_LEDGER_CLIENT_TYPES_H_
-
-#include <algorithm>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <lib/fidl/cpp/array.h>
-#include <lib/fidl/cpp/vector.h>
-
-namespace modular {
-
-using LedgerPageId = fuchsia::ledger::PageId;
-using LedgerPageKey = fidl::VectorPtr<uint8_t>;
-using LedgerToken = std::unique_ptr<fuchsia::ledger::Token>;
-
-inline bool PageIdsEqual(const LedgerPageId& a, const LedgerPageId& b) {
-  return a.id == b.id;
-}
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_LEDGER_CLIENT_TYPES_H_
diff --git a/lib/module_manifest/BUILD.gn b/lib/module_manifest/BUILD.gn
deleted file mode 100644
index 8f6f701..0000000
--- a/lib/module_manifest/BUILD.gn
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-group("module_manifest") {
-  public_deps = [
-    ":json_xdr",
-  ]
-}
-
-group("unittests") {
-  testonly = true
-
-  deps = [
-    ":module_facet_reader_impl_unittest",
-    ":module_manifest_xdr_unittest",
-  ]
-}
-
-source_set("module_facet_reader") {
-  sources = [
-    "module_facet_reader.h",
-  ]
-
-  deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("module_facet_reader_impl") {
-  sources = [
-    "module_facet_reader_impl.cc",
-    "module_facet_reader_impl.h",
-  ]
-
-  deps = [
-    ":json_xdr",
-    ":module_facet_reader",
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/lib/cmx_facet_parser",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/json",
-    "//garnet/public/lib/pkg_url",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("module_facet_reader_impl_unittest") {
-  testonly = true
-
-  sources = [
-    "module_facet_reader_impl_unittest.cc",
-  ]
-
-  deps = [
-    ":module_facet_reader_impl",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//peridot/lib/scoped_tmpfs",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//third_party/googletest:gtest",
-  ]
-}
-
-source_set("json_xdr") {
-  sources = [
-    "module_manifest_xdr.cc",
-    "module_manifest_xdr.h",
-  ]
-
-  deps = [
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("module_manifest_xdr_unittest") {
-  testonly = true
-
-  sources = [
-    "module_manifest_xdr_unittest.cc",
-  ]
-
-  deps = [
-    ":json_xdr",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//third_party/googletest:gtest",
-  ]
-}
diff --git a/lib/module_manifest/module_facet_reader.h b/lib/module_manifest/module_facet_reader.h
deleted file mode 100644
index 0e99672..0000000
--- a/lib/module_manifest/module_facet_reader.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_MODULE_MANIFEST_MODULE_FACET_READER_H_
-#define PERIDOT_LIB_MODULE_MANIFEST_MODULE_FACET_READER_H_
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-namespace modular {
-
-// |ModuleFacetReader| provides a way to read the the module facet declared in
-// a module's component manifest.
-class ModuleFacetReader {
- public:
-  // Given a module URL, returns the |fuchsia.modular.ModuleManifestPtr|
-  // declared in the module's component manifest. A null |manifest| is returned
-  // if the module does not have a module facet declared.
-  using GetModuleManifestCallback =
-      std::function<void(fuchsia::modular::ModuleManifestPtr manifest)>;
-  virtual void GetModuleManifest(const std::string& module_url,
-                                 GetModuleManifestCallback callback) = 0;
-
-  virtual ~ModuleFacetReader() = default;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_MODULE_MANIFEST_MODULE_FACET_READER_H_
diff --git a/lib/module_manifest/module_facet_reader_impl.cc b/lib/module_manifest/module_facet_reader_impl.cc
deleted file mode 100644
index 8732c03..0000000
--- a/lib/module_manifest/module_facet_reader_impl.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/module_manifest/module_facet_reader_impl.h"
-
-#include "lib/cmx_facet_parser/cmx_facet_parser.h"
-#include "lib/component/cpp/startup_context.h"
-#include "lib/fsl/io/fd.h"
-#include "lib/json/json_parser.h"
-#include "lib/pkg_url/fuchsia_pkg_url.h"
-#include "lib/pkg_url/url_resolver.h"
-#include "peridot/lib/fidl/json_xdr.h"
-#include "peridot/lib/module_manifest/module_manifest_xdr.h"
-
-namespace modular {
-namespace {
-
-constexpr char kModuleFacetName[] = "fuchsia.module";
-
-}  // namespace
-
-ModuleFacetReaderImpl::ModuleFacetReaderImpl(fuchsia::sys::LoaderPtr loader)
-    : loader_(std::move(loader)) {}
-
-ModuleFacetReaderImpl::~ModuleFacetReaderImpl() {}
-
-void ModuleFacetReaderImpl::GetModuleManifest(
-    const std::string& module_url, GetModuleManifestCallback callback) {
-  auto canonical_url = component::CanonicalizeURL(module_url);
-  loader_->LoadUrl(canonical_url, [canonical_url,
-                                   callback](fuchsia::sys::PackagePtr package) {
-    if (!package) {
-      FXL_LOG(ERROR) << "Could not resolve URL: " << canonical_url;
-      callback({});
-      return;
-    }
-    fxl::UniqueFD fd =
-        fsl::OpenChannelAsFileDescriptor(std::move(package->directory));
-
-    component::FuchsiaPkgUrl pkg_url;
-    std::string cmx_path;
-    if (pkg_url.Parse(package->resolved_url)) {
-      if (!pkg_url.resource_path().empty()) {
-        // If the url has a resource, assume that's the cmx.
-        cmx_path = pkg_url.resource_path();
-      } else {
-        // It's possible the url does not have a resource, in which case either
-        // the cmx exists at meta/<package_name.cmx> or it does not exist.
-        cmx_path = pkg_url.GetDefaultComponentCmxPath();
-      }
-    } else {
-      FXL_LOG(ERROR) << "Could not parse package URL: "
-                     << package->resolved_url;
-      callback({});
-    }
-
-    component::CmxFacetParser facet_parser;
-    json::JSONParser json_parser;
-    if (!facet_parser.ParseFromFileAt(fd.get(), cmx_path, &json_parser)) {
-      FXL_LOG(ERROR) << "Could not parse CMX manifest " << cmx_path << ": "
-                     << json_parser.error_str();
-      callback({});
-      return;
-    }
-
-    const auto& mod_facet = facet_parser.GetSection(kModuleFacetName);
-    if (mod_facet.IsNull()) {
-      FXL_LOG(INFO) << "No module facet declared for module="
-                    << package->resolved_url;
-      callback({});
-      return;
-    }
-
-    fuchsia::modular::ModuleManifestPtr module_manifest;
-    auto mod_facet_str = JsonValueToString(mod_facet);
-    if (!XdrRead(mod_facet_str, &module_manifest, XdrModuleManifest)) {
-      FXL_LOG(WARNING) << "Unable to parse manifest module facet for "
-                       << package->resolved_url << ": " << mod_facet_str;
-      callback({});
-      return;
-    }
-    // TODO(MF-94): Deprecate ModuleManfiest.binary in favour of getting it from
-    // the cmx manifest.
-    module_manifest->binary = canonical_url;
-    callback(std::move(module_manifest));
-  });
-}
-
-}  // namespace modular
diff --git a/lib/module_manifest/module_facet_reader_impl.h b/lib/module_manifest/module_facet_reader_impl.h
deleted file mode 100644
index 23d8faa..0000000
--- a/lib/module_manifest/module_facet_reader_impl.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_MODULE_MANIFEST_MODULE_FACET_READER_IMPL_H_
-#define PERIDOT_LIB_MODULE_MANIFEST_MODULE_FACET_READER_IMPL_H_
-
-#include <fuchsia/sys/cpp/fidl.h>
-
-#include "lib/fxl/macros.h"
-#include "peridot/lib/module_manifest/module_facet_reader.h"
-
-namespace modular {
-
-class ModuleFacetReaderImpl : public ModuleFacetReader {
- public:
-  // This ModuleFacetReader implementation uses the fuchsia.sys.Loader interface
-  // to retreive information for where the module facet is located.
-  explicit ModuleFacetReaderImpl(fuchsia::sys::LoaderPtr loader);
-  ~ModuleFacetReaderImpl() override;
-
- private:
-  void GetModuleManifest(const std::string& module_url,
-                         GetModuleManifestCallback callback) override;
-
-  fuchsia::sys::LoaderPtr loader_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ModuleFacetReaderImpl);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_MODULE_MANIFEST_MODULE_FACET_READER_IMPL_H_
diff --git a/lib/module_manifest/module_facet_reader_impl_unittest.cc b/lib/module_manifest/module_facet_reader_impl_unittest.cc
deleted file mode 100644
index 840bcd5..0000000
--- a/lib/module_manifest/module_facet_reader_impl_unittest.cc
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/module_manifest/module_facet_reader_impl.h"
-
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <map>
-#include <string>
-
-#include "gtest/gtest.h"
-#include "lib/fidl/cpp/binding.h"
-#include "lib/fsl/io/fd.h"
-#include "lib/fxl/files/directory.h"
-#include "lib/fxl/files/file.h"
-#include "lib/fxl/files/path.h"
-#include "lib/fxl/files/unique_fd.h"
-#include "lib/fxl/strings/substitute.h"
-#include "lib/gtest/real_loop_fixture.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace {
-
-// A utility class for making a static filesystem. Use |AddFile| to populate the
-// file system with (file path, file content)s.
-class FilesystemForTest {
- public:
-  // Returns an opened file descriptor for |dir|. |dir| must be an absolute
-  // path.
-  zx::channel GetChannelForDir(fxl::StringView dir) {
-    std::string dir_str = ToRelativePath(dir);
-    FXL_CHECK(files::IsDirectoryAt(tmpfs_.root_fd(), dir_str));
-
-    int fd = openat(tmpfs_.root_fd(), dir_str.data(), O_DIRECTORY);
-    FXL_CHECK(fd != -1);
-
-    auto ch = fsl::CloneChannelFromFileDescriptor(fd);
-    close(fd);
-    return ch;
-  }
-
-  // Adds a file to the filesystem. |path| must be an absolute path representing
-  // a file. |data| contains the file contents. Intermediate directories
-  // required for |path| exist are created as needed.
-  void AddFile(fxl::StringView path, const std::string& data) {
-    std::string path_str = ToRelativePath(path);
-    FXL_CHECK(files::CreateDirectoryAt(tmpfs_.root_fd(),
-                                       files::GetDirectoryName(path_str)));
-    FXL_CHECK(files::WriteFileAt(tmpfs_.root_fd(), path_str, data.data(),
-                                 data.size()));
-  }
-
- private:
-  std::string ToRelativePath(fxl::StringView path) {
-    if (path[0] == '/') {
-      return path.substr(1).ToString();
-    }
-    return path.ToString();
-  }
-
-  // In-memory file system.
-  scoped_tmpfs::ScopedTmpFS tmpfs_;
-};
-
-// A Loader used for testing. Use |AddLoadInfo()| to pre-populate answers to
-// |fuchsia.sys.Loader.LoadUrl()| requests. Because directories are not
-// trivially clonable, |AddLoadInfo(url,..)| is only able to serve one
-// |fuchsia.sys.Loader.LoadUrl(url)|.
-class SysLoaderForTest : fuchsia::sys::Loader {
- public:
-  SysLoaderForTest() : binding_(this) {}
-
-  // Returns a fuchsia::sys::LoaderPtr that returns one-shot answers that were
-  // added from |AddLoadInfo|.
-  fuchsia::sys::LoaderPtr NewEndpoint() {
-    fuchsia::sys::LoaderPtr loader;
-    binding_.Bind(loader.NewRequest());
-    return loader;
-  }
-
-  // Populate a one-shot answer to |fuchsia.sys.Loader.LoadUrl|; that is,
-  // LoadUrl() will not be able to answer for |url| a second time unless
-  // |AddLoadInfo| is called again.
-  void AddLoadInfo(fidl::StringPtr url, fuchsia::sys::PackagePtr pkg) {
-    if (url->find("//") == std::string::npos) {
-      url = fxl::Substitute("file://$0", url.get());
-    }
-    load_info_[url.get()] = std::move(pkg);
-  }
-
- private:
-  // |fuchsia::sys::Loader|
-  void LoadUrl(std::string url, LoadUrlCallback cb) {
-    if (load_info_.find(url) != load_info_.end()) {
-      auto retval = std::move(load_info_[url]);
-      load_info_.erase(url);
-
-      cb(std::move(retval));
-    } else {
-      cb({});
-    }
-  }
-
-  std::map<std::string, fuchsia::sys::PackagePtr> load_info_;
-  fidl::Binding<fuchsia::sys::Loader> binding_;
-};
-
-}  // namespace
-
-class ModuleFacetReaderImplTest : public gtest::RealLoopFixture {
- protected:
-  ModuleFacetReaderImplTest()
-      : module_facet_reader_impl_(sys_loader_.NewEndpoint()) {}
-
-  static constexpr char kNoFacet[] = R"({})";
-  static constexpr char kBasicFacet[] = R"(
-    {
-      "facets": {
-        "fuchsia.module":{
-          "@version":2,
-          "binary":"binary",
-          "suggestion_headline":"suggestion_headline",
-          "intent_filters":[
-            {
-              "action":"action",
-              "parameters":[
-                {
-                  "name":"name",
-                  "type":"type"
-                }
-              ]
-            }
-          ]
-        }
-      }
-    }
-  )";
-
-  modular::ModuleFacetReader* module_facet_reader() {
-    return &module_facet_reader_impl_;
-  }
-
-  // Populates a one-shot answer for fuchsia::sys::Loader used by
-  // ModuleFacetReaderImpl::GetModuleFacet()
-  void PopulateModFacetFromPkgUrl(fxl::StringView mod_pkg_name,
-                                  fxl::StringView mod_cmx_data) {
-    fs_.AddFile(fxl::Substitute("/$0/meta/$0.cmx", mod_pkg_name),
-                mod_cmx_data.data());
-    auto pkg = fuchsia::sys::Package::New();
-    pkg->resolved_url = fxl::Substitute(
-        "fuchsia-pkg://fuchsia.com/$0#meta/$0.cmx", mod_pkg_name);
-    pkg->directory = fs_.GetChannelForDir(mod_pkg_name);
-    sys_loader_.AddLoadInfo(mod_pkg_name.ToString(), std::move(pkg));
-  }
-
-  // Populates a one-shot answer for fuchsia::sys::Loader used by
-  // ModuleFacetReaderImpl::GetModuleFacet()
-  void PopulateModFacetFromComponentUrl(fxl::StringView mod_pkg_name,
-                                        fxl::StringView mod_component_name,
-                                        fxl::StringView mod_cmx_data) {
-    fs_.AddFile(
-        fxl::Substitute("/$0/meta/$1.cmx", mod_pkg_name, mod_component_name),
-        mod_cmx_data.data());
-    auto pkg = fuchsia::sys::Package::New();
-    pkg->resolved_url =
-        fxl::Substitute("fuchsia-pkg://fuchsia.com/$0#meta/$1.cmx",
-                        mod_pkg_name, mod_component_name);
-    pkg->directory = fs_.GetChannelForDir(mod_pkg_name);
-    sys_loader_.AddLoadInfo(
-        fxl::Substitute("fuchsia-pkg://fuchsia.com/$0#meta/$1.cmx",
-                        mod_pkg_name, mod_component_name),
-        std::move(pkg));
-  }
-
- private:
-  FilesystemForTest fs_;
-  SysLoaderForTest sys_loader_;
-  modular::ModuleFacetReaderImpl module_facet_reader_impl_;
-};
-
-TEST_F(ModuleFacetReaderImplTest, ModFacetFoundFromPkgUrl) {
-  constexpr char kModName[] = "my_mod_url";
-  PopulateModFacetFromPkgUrl(kModName, kBasicFacet);
-
-  bool done = false;
-  module_facet_reader()->GetModuleManifest(
-      kModName, [&done](fuchsia::modular::ModuleManifestPtr manifest) {
-        EXPECT_TRUE(manifest);
-        EXPECT_EQ("file://my_mod_url", manifest->binary);
-        EXPECT_EQ("suggestion_headline", manifest->suggestion_headline);
-        EXPECT_EQ(1u, manifest->intent_filters->size());
-        done = true;
-      });
-  RunLoopUntil([&done] { return done; });
-  EXPECT_TRUE(done);
-}
-
-TEST_F(ModuleFacetReaderImplTest, ModFacetFoundFromComponentUrl) {
-  constexpr char kPkgName[] = "my_pkg_name";
-  constexpr char kModName[] = "my_mod_name";
-  PopulateModFacetFromComponentUrl(kPkgName, kModName, kBasicFacet);
-
-  bool done = false;
-  module_facet_reader()->GetModuleManifest(
-      fxl::Substitute("fuchsia-pkg://fuchsia.com/$0#meta/$1.cmx", kPkgName,
-                      kModName),
-      [&done](fuchsia::modular::ModuleManifestPtr manifest) {
-        EXPECT_TRUE(manifest);
-        EXPECT_EQ("fuchsia-pkg://fuchsia.com/my_pkg_name#meta/my_mod_name.cmx",
-                  manifest->binary);
-        EXPECT_EQ("suggestion_headline", manifest->suggestion_headline);
-        EXPECT_EQ(1u, manifest->intent_filters->size());
-        done = true;
-      });
-  RunLoopUntil([&done] { return done; });
-  EXPECT_TRUE(done);
-}
-
-TEST_F(ModuleFacetReaderImplTest, ModHasNoFacet) {
-  constexpr char kModName[] = "my_mod_url";
-  PopulateModFacetFromPkgUrl(kModName, kNoFacet);
-  bool done = false;
-  module_facet_reader()->GetModuleManifest(
-      kModName, [&done](fuchsia::modular::ModuleManifestPtr manifest) {
-        EXPECT_FALSE(manifest);
-        done = true;
-      });
-  RunLoopUntil([&done] { return done; });
-  EXPECT_TRUE(done);
-}
-
-TEST_F(ModuleFacetReaderImplTest, ModDoesntExist) {
-  bool done = false;
-  module_facet_reader()->GetModuleManifest(
-      "kajsdhf", [&done](fuchsia::modular::ModuleManifestPtr manifest) {
-        EXPECT_FALSE(manifest);
-        done = true;
-      });
-  RunLoopUntil([&done] { return done; });
-  EXPECT_TRUE(done);
-}
diff --git a/lib/module_manifest/module_manifest_xdr.cc b/lib/module_manifest/module_manifest_xdr.cc
deleted file mode 100644
index ad67166..0000000
--- a/lib/module_manifest/module_manifest_xdr.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/module_manifest/module_manifest_xdr.h"
-
-namespace modular {
-namespace {
-
-void XdrParameterConstraint(XdrContext* const xdr,
-                            fuchsia::modular::ParameterConstraint* const data) {
-  xdr->Field("name", &data->name);
-  xdr->Field("type", &data->type);
-}
-
-void XdrModuleManifestIntentFilters(
-    XdrContext* const xdr, fuchsia::modular::IntentFilter* const data) {
-  xdr->Field("action", &data->action);
-  xdr->Field("parameters", &data->parameter_constraints,
-             XdrParameterConstraint);
-}
-
-}  // namespace
-
-void XdrModuleManifest_v1(XdrContext* const xdr,
-                          fuchsia::modular::ModuleManifest* const data) {
-  xdr->Field("binary", &data->binary);
-  xdr->Field("suggestion_headline", &data->suggestion_headline);
-  xdr->Field("composition_pattern", &data->composition_pattern);
-
-  // Version 2 supports multiple actions using the "intent_filters" field. This
-  // version supports just one with "action" and "parameters" fields, so we
-  // put those in "IntentFilter[0]".
-  data->intent_filters->resize(1);
-  xdr->Field("action", &data->intent_filters->at(0).action);
-  xdr->Field("parameters", &data->intent_filters->at(0).parameter_constraints,
-             XdrParameterConstraint);
-}
-
-void XdrModuleManifest_v2(XdrContext* const xdr,
-                          fuchsia::modular::ModuleManifest* const data) {
-  if (!xdr->Version(2)) {
-    return;
-  }
-  xdr->Field("binary", &data->binary);
-  xdr->Field("suggestion_headline", &data->suggestion_headline);
-  xdr->Field("composition_pattern", &data->composition_pattern);
-  xdr->Field("intent_filters", &data->intent_filters,
-             XdrModuleManifestIntentFilters);
-  xdr->Field("placeholder_color", &data->placeholder_color);
-}
-
-// New nullable fields may be added to latest version (i.e., no need to do a
-// version bump). Removing old fields needs a new version, in which case all xdr
-// filter for previous versions should be updated to provide a polyfill.
-extern const XdrFilterType<fuchsia::modular::ModuleManifest>
-    XdrModuleManifest[] = {
-        XdrModuleManifest_v2,
-        XdrModuleManifest_v1,
-        nullptr,
-};
-
-}  // namespace modular
diff --git a/lib/module_manifest/module_manifest_xdr.h b/lib/module_manifest/module_manifest_xdr.h
deleted file mode 100644
index 019e1a7..0000000
--- a/lib/module_manifest/module_manifest_xdr.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_MODULE_MANIFEST_MODULE_MANIFEST_XDR_H_
-#define PERIDOT_LIB_MODULE_MANIFEST_MODULE_MANIFEST_XDR_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/lib/fidl/json_xdr.h"
-
-namespace modular {
-
-extern const XdrFilterType<fuchsia::modular::ModuleManifest>
-    XdrModuleManifest[];
-
-void XdrModuleManifest_v1(XdrContext* const xdr,
-                          fuchsia::modular::ModuleManifest* const data);
-
-void XdrModuleManifest_v2(XdrContext* const xdr,
-                          fuchsia::modular::ModuleManifest* const data);
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_MODULE_MANIFEST_MODULE_MANIFEST_XDR_H_
diff --git a/lib/module_manifest/module_manifest_xdr_unittest.cc b/lib/module_manifest/module_manifest_xdr_unittest.cc
deleted file mode 100644
index 3566c76..0000000
--- a/lib/module_manifest/module_manifest_xdr_unittest.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/module_manifest/module_manifest_xdr.h"
-
-#include "gtest/gtest.h"
-#include "peridot/lib/fidl/json_xdr.h"
-
-void ExpectBasicManifest(const char manifest_str[]) {
-  fuchsia::modular::ModuleManifest m;
-  EXPECT_TRUE(XdrRead(manifest_str, &m, modular::XdrModuleManifest));
-  EXPECT_EQ("binary", m.binary);
-  EXPECT_EQ("suggestion_headline", m.suggestion_headline);
-
-  EXPECT_EQ(1u, m.intent_filters->size());
-  EXPECT_EQ(1u, m.intent_filters->at(0).parameter_constraints.size());
-  EXPECT_EQ("name", m.intent_filters->at(0).parameter_constraints.at(0).name);
-  EXPECT_EQ("type", m.intent_filters->at(0).parameter_constraints.at(0).type);
-}
-
-// Tests version 4 of the manifest
-TEST(XdrModuleManifestTest, BasicVersion2) {
-  ExpectBasicManifest(R"(
-    {
-      "@version": 2,
-      "binary": "binary",
-      "suggestion_headline": "suggestion_headline",
-      "intent_filters": [
-        {
-          "action": "action",
-          "parameters": [{
-            "name": "name",
-            "type": "type"
-          }]
-        }
-      ]
-    }
-  )");
-}
-
-TEST(XdrModuleManifestTest, BasicVersion1) {
-  ExpectBasicManifest(R"(
-    {
-      "binary": "binary",
-      "suggestion_headline": "suggestion_headline",
-      "action": "action",
-      "parameters": [{
-        "name": "name",
-        "type": "type"
-      }]
-    }
-  )");
-}
diff --git a/lib/module_manifest_source/BUILD.gn b/lib/module_manifest_source/BUILD.gn
deleted file mode 100644
index d055c93..0000000
--- a/lib/module_manifest_source/BUILD.gn
+++ /dev/null
@@ -1,76 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("module_manifest_source") {
-  sources = [
-    "module_manifest_source.cc",
-    "module_manifest_source.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("json") {
-  sources = [
-    "json.cc",
-    "json.h",
-  ]
-
-  deps = [
-    ":module_manifest_source",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/module_manifest:json_xdr",
-    "//peridot/lib/rapidjson",
-    "//third_party/rapidjson",
-  ]
-}
-
-source_set("firebase_source") {
-  sources = [
-    "firebase_source.cc",
-    "firebase_source.h",
-  ]
-
-  public_deps = [
-    ":module_manifest_source",
-    "//garnet/public/fidl/fuchsia.net.oldhttp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:json_xdr",
-    "//peridot/lib/firebase",
-    "//peridot/lib/module_manifest:json_xdr",
-    "//third_party/rapidjson",
-  ]
-}
-
-source_set("package_util") {
-  sources = [
-    "package_util.cc",
-    "package_util.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-source_set("module_package_source") {
-  sources = [
-    "module_package_source.cc",
-    "module_package_source.h",
-  ]
-
-  public_deps = [
-    ":json",
-    ":module_manifest_source",
-    ":package_util",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib:maxwell_internal",
-  ]
-}
diff --git a/lib/module_manifest_source/fidl/module_package_indexer.fidl b/lib/module_manifest_source/fidl/module_package_indexer.fidl
deleted file mode 100644
index 0c8bad6..0000000
--- a/lib/module_manifest_source/fidl/module_package_indexer.fidl
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.maxwell.internal;
-
-[Discoverable]
-interface ModulePackageIndexer {
-    1: IndexManifest(string package_name, string module_manifest_path);
-};
diff --git a/lib/module_manifest_source/firebase_source.cc b/lib/module_manifest_source/firebase_source.cc
deleted file mode 100644
index fe8510c..0000000
--- a/lib/module_manifest_source/firebase_source.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/module_manifest_source/firebase_source.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <thread>
-
-#include <lib/async/cpp/task.h>
-#include <lib/backoff/exponential_backoff.h>
-#include <lib/fdio/watcher.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <lib/network_wrapper/network_wrapper_impl.h>
-
-#include "peridot/lib/fidl/json_xdr.h"
-#include "peridot/lib/firebase/firebase_impl.h"
-#include "peridot/lib/module_manifest/module_manifest_xdr.h"
-#include "rapidjson/document.h"
-
-namespace modular {
-
-namespace http = ::fuchsia::net::oldhttp;
-
-class FirebaseModuleManifestSource::Watcher : public firebase::WatchClient {
- public:
-  Watcher(async_dispatcher_t* dispatcher, ModuleManifestSource::IdleFn idle_fn,
-          ModuleManifestSource::NewEntryFn new_fn,
-          ModuleManifestSource::RemovedEntryFn removed_fn,
-          fxl::WeakPtr<FirebaseModuleManifestSource> owner)
-      : dispatcher_(dispatcher),
-        idle_fn_(idle_fn),
-        new_fn_(new_fn),
-        removed_fn_(removed_fn),
-        reconnect_wait_seconds_(0),
-        owner_(owner) {}
-  ~Watcher() override = default;
-
- private:
-  void OnPut(const std::string& path, const rapidjson::Value& value) override {
-    // Successful connection established. Reset our reconnect counter.
-    reconnect_wait_seconds_ = 0;
-
-    // The first time we're called, we get a dump of all existing values as a
-    // JSON object at path "/".
-    //
-    // From then on, we get notifications of individual values changing with
-    // paths like "/module-id".
-    if (path == "/") {
-      if (value.IsNull()) {
-        idle_fn_();
-        return;
-      }
-
-      if (!value.IsObject()) {
-        FXL_LOG(ERROR) << "Got update at /, but it's not a JSON object??";
-        idle_fn_();
-        return;
-      }
-
-      for (rapidjson::Value::ConstMemberIterator it = value.MemberBegin();
-           it != value.MemberEnd(); ++it) {
-        // When we get updates, the path is "/<module id>", so we add "/" here
-        // to the member name.
-        ProcessEntry(path + it->name.GetString(), it->value);
-      }
-
-      // We've read all existing entries.
-      idle_fn_();
-    } else {
-      if (value.IsNull()) {
-        removed_fn_(path);
-      } else {
-        ProcessEntry(path, value);
-      }
-    }
-  }
-  void OnPatch(const std::string& path,
-               const rapidjson::Value& value) override {}
-  void OnCancel() override {}
-  void OnAuthRevoked(const std::string& reason) override {}
-
-  void OnMalformedEvent() override {}
-
-  void OnConnectionError() override {
-    idle_fn_();
-
-    // Simple exponential backoff counter.
-    if (reconnect_wait_seconds_ == 0) {
-      reconnect_wait_seconds_ = 1;
-    } else {
-      reconnect_wait_seconds_ *= 2;
-      if (reconnect_wait_seconds_ > 60)
-        reconnect_wait_seconds_ = 60;
-    }
-
-    // Try to reconnect.
-    FXL_LOG(INFO) << "Reconnecting to Firebase in " << reconnect_wait_seconds_
-                  << " seconds.";
-    async::PostDelayedTask(dispatcher_,
-                           [owner = owner_, this]() {
-                             if (!owner)
-                               return;
-                             owner->StartWatching(this);
-                           },
-                           zx::sec(reconnect_wait_seconds_));
-  }
-
-  void ProcessEntry(const std::string& name, const rapidjson::Value& value) {
-    // We have to deep-copy |it->value| because XdrRead() must have a
-    // rapidjson::Document.
-    rapidjson::Document doc;
-    doc.CopyFrom(value, doc.GetAllocator());
-
-    // Handle bad manifests, including older files expressed as an array.
-    // Any mismatch causes XdrRead to DCHECK.
-    if (!doc.IsObject()) {
-      FXL_LOG(WARNING) << "Ignored invalid manifest: " << name;
-      return;
-    }
-
-    fuchsia::modular::ModuleManifest entry;
-    if (!XdrRead(&doc, &entry, XdrModuleManifest)) {
-      FXL_LOG(WARNING) << "Could not parse Module manifest from: " << name;
-      return;
-    }
-
-    new_fn_(name, std::move(entry));
-  }
-
-  async_dispatcher_t* const dispatcher_;
-
-  ModuleManifestSource::IdleFn idle_fn_;
-  ModuleManifestSource::NewEntryFn new_fn_;
-  ModuleManifestSource::RemovedEntryFn removed_fn_;
-
-  int reconnect_wait_seconds_;
-
-  fxl::WeakPtr<FirebaseModuleManifestSource> owner_;
-};
-
-FirebaseModuleManifestSource::FirebaseModuleManifestSource(
-    async_dispatcher_t* dispatcher,
-    std::function<http::HttpServicePtr()> network_service_factory,
-    std::string db_id, std::string prefix)
-    : db_id_(db_id),
-      prefix_(prefix),
-      network_wrapper_(new network_wrapper::NetworkWrapperImpl(
-          dispatcher, std::make_unique<backoff::ExponentialBackoff>(),
-          std::move(network_service_factory))),
-      client_(
-          new firebase::FirebaseImpl(network_wrapper_.get(), db_id, prefix)),
-      weak_factory_(this) {}
-
-FirebaseModuleManifestSource::~FirebaseModuleManifestSource() {
-  for (auto& watcher : watchers_) {
-    client_->UnWatch(watcher.get());
-  }
-}
-
-void FirebaseModuleManifestSource::Watch(async_dispatcher_t* dispatcher,
-                                         IdleFn idle_fn, NewEntryFn new_fn,
-                                         RemovedEntryFn removed_fn) {
-  auto watcher = std::make_unique<Watcher>(
-      dispatcher, std::move(idle_fn), std::move(new_fn), std::move(removed_fn),
-      weak_factory_.GetWeakPtr());
-
-  StartWatching(watcher.get());
-  watchers_.push_back(std::move(watcher));
-}
-
-void FirebaseModuleManifestSource::StartWatching(Watcher* watcher) {
-  client_->Watch("/manifests", {}, watcher);
-}
-
-}  // namespace modular
diff --git a/lib/module_manifest_source/firebase_source.h b/lib/module_manifest_source/firebase_source.h
deleted file mode 100644
index a5d9b88..0000000
--- a/lib/module_manifest_source/firebase_source.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_MODULE_MANIFEST_SOURCE_FIREBASE_SOURCE_H_
-#define PERIDOT_LIB_MODULE_MANIFEST_SOURCE_FIREBASE_SOURCE_H_
-
-#include <functional>
-#include <map>
-#include <string>
-#include <vector>
-
-#include <fuchsia/net/oldhttp/cpp/fidl.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/lib/module_manifest_source/module_manifest_source.h"
-
-namespace firebase {
-class Firebase;
-}
-
-namespace network_wrapper {
-class NetworkWrapper;
-}
-
-namespace modular {
-
-// Watches a Manifest repository stored in Firebase.
-// Expects the database to be constructed like so:
-// {
-//   "manifests": {
-//     "module id 1": [ manifest entry, manifest entry, ... ],
-//     "module id 2": ...
-//   }
-// }
-class FirebaseModuleManifestSource : public ModuleManifestSource {
- public:
-  FirebaseModuleManifestSource(
-      async_dispatcher_t* dispatcher,
-      std::function<::fuchsia::net::oldhttp::HttpServicePtr()>
-          network_service_factory,
-      std::string db_id, std::string prefix);
-  ~FirebaseModuleManifestSource() override;
-
-  void Watch(async_dispatcher_t* dispatcher, IdleFn idle_fn, NewEntryFn new_fn,
-             RemovedEntryFn removed_fn) override;
-
- private:
-  class Watcher;
-
-  void StartWatching(Watcher* watcher);
-
-  // Only used for logging.
-  const std::string db_id_;
-  const std::string prefix_;
-
-  std::unique_ptr<network_wrapper::NetworkWrapper> network_wrapper_;
-  std::unique_ptr<firebase::Firebase> client_;
-
-  std::vector<std::unique_ptr<Watcher>> watchers_;
-
-  fxl::WeakPtrFactory<FirebaseModuleManifestSource> weak_factory_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_MODULE_MANIFEST_SOURCE_FIREBASE_SOURCE_H_
diff --git a/lib/module_manifest_source/json.cc b/lib/module_manifest_source/json.cc
deleted file mode 100644
index b70d049..0000000
--- a/lib/module_manifest_source/json.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/module_manifest_source/json.h"
-
-#include "peridot/lib/fidl/json_xdr.h"
-#include "peridot/lib/module_manifest/module_manifest_xdr.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "rapidjson/document.h"
-
-namespace modular {
-
-bool ModuleManifestEntryFromJson(const std::string& json,
-                                 fuchsia::modular::ModuleManifest* entry) {
-  rapidjson::Document doc;
-  // Schema validation of the JSON is happening at publish time. By the time we
-  // get here, we assume it's valid manifest JSON.
-  doc.Parse(json.c_str());
-
-  // Handle bad manifests, including older files expressed as an array.
-  // Any mismatch causes XdrRead to DCHECK.
-  if (!doc.IsObject()) {
-    return false;
-  }
-
-  // Our tooling validates |doc|'s JSON schema so that we don't have to here.
-  // It may be good to do this, though.
-  // TODO(thatguy): Do this if it becomes a problem.
-  if (!XdrRead(&doc, entry, XdrModuleManifest)) {
-    return false;
-  }
-  return true;
-}
-
-void ModuleManifestEntryToJson(const fuchsia::modular::ModuleManifest& entry,
-                               std::string* json) {
-  rapidjson::Document doc;
-  fuchsia::modular::ModuleManifest local_entry;
-  fidl::Clone(entry, &local_entry);
-  XdrWrite(&doc, &local_entry, XdrModuleManifest);
-
-  *json = JsonValueToPrettyString(doc);
-}
-
-}  // namespace modular
diff --git a/lib/module_manifest_source/json.h b/lib/module_manifest_source/json.h
deleted file mode 100644
index 82adfd7..0000000
--- a/lib/module_manifest_source/json.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_MODULE_MANIFEST_SOURCE_JSON_H_
-#define PERIDOT_LIB_MODULE_MANIFEST_SOURCE_JSON_H_
-
-#include "peridot/lib/module_manifest_source/module_manifest_source.h"
-
-namespace modular {
-
-bool ModuleManifestEntryFromJson(const std::string& json,
-                                 fuchsia::modular::ModuleManifest* entry);
-void ModuleManifestEntryToJson(const fuchsia::modular::ModuleManifest& entry,
-                               std::string* json);
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_MODULE_MANIFEST_SOURCE_JSON_H_
diff --git a/lib/module_manifest_source/module_manifest_source.cc b/lib/module_manifest_source/module_manifest_source.cc
deleted file mode 100644
index b65ec68..0000000
--- a/lib/module_manifest_source/module_manifest_source.cc
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/module_manifest_source/module_manifest_source.h"
-
-namespace modular {
-
-ModuleManifestSource::~ModuleManifestSource() = default;
-
-}  // namespace modular
diff --git a/lib/module_manifest_source/module_manifest_source.h b/lib/module_manifest_source/module_manifest_source.h
deleted file mode 100644
index 9730305..0000000
--- a/lib/module_manifest_source/module_manifest_source.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_MODULE_MANIFEST_SOURCE_MODULE_MANIFEST_SOURCE_H_
-#define PERIDOT_LIB_MODULE_MANIFEST_SOURCE_MODULE_MANIFEST_SOURCE_H_
-
-#include <functional>
-#include <string>
-#include <vector>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/dispatcher.h>
-
-namespace modular {
-
-// Abstract base class for all Module Manifest Source implementations.
-class ModuleManifestSource {
- public:
-  using NewEntryFn = std::function<void(std::string /* source name*/,
-                                        fuchsia::modular::ModuleManifest)>;
-  using RemovedEntryFn = std::function<void(std::string /* module uri */)>;
-  using IdleFn = std::function<void()>;
-
-  virtual ~ModuleManifestSource() = 0;
-
-  // Watches the source for new or removed Module manifest entries.  Posts
-  // tasks to |dispatcher| calling |new_fn| for each entry in new files and
-  // |removed_fn| for entries that have been removed. Calls |idle_fn| once all
-  // existing entries at the time of calling Watch() have been read and sent to
-  // |new_fn|.
-  //
-  // Destroying |this| stops watching and guarantees neither |new_fn| or
-  // |removed_fn| will be called. Caller is responsible for ensuring
-  // |dispatcher| remains alive as long as |this| is alive.
-  //
-  // |new_fn| takes a string Entry id and the Entry itself.
-  //
-  // |removed_fn| takes only the string Entry id.
-  virtual void Watch(async_dispatcher_t* dispatcher, IdleFn idle_fn,
-                     NewEntryFn new_fn, RemovedEntryFn removed_fn) = 0;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_MODULE_MANIFEST_SOURCE_MODULE_MANIFEST_SOURCE_H_
diff --git a/lib/module_manifest_source/module_package_source.cc b/lib/module_manifest_source/module_package_source.cc
deleted file mode 100644
index d848c64..0000000
--- a/lib/module_manifest_source/module_package_source.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/module_manifest_source/module_package_source.h"
-
-#include <dirent.h>
-#include <sys/types.h>
-
-#include <fs/service.h>
-#include <lib/async/cpp/task.h>
-#include <lib/fxl/files/directory.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <lib/fxl/strings/split_string.h>
-#include <lib/fxl/strings/string_printf.h>
-
-#include "peridot/lib/module_manifest_source/json.h"
-#include "peridot/lib/module_manifest_source/package_util.h"
-
-namespace modular {
-namespace {
-// NOTE: This must match the path specified in
-// //peridot/build/module_manifest.gni
-constexpr char kInitialModulePackagesIndexDir[] =
-    "/system/data/initial_module_packages";
-}  // namespace
-
-using ::fuchsia::maxwell::internal::ModulePackageIndexer;
-
-ModulePackageSource::ModulePackageSource(
-    component::StartupContext* const context)
-    : weak_factory_(this) {
-  context->outgoing().debug_dir()->AddEntry(
-      ModulePackageIndexer::Name_,
-      fbl::AdoptRef(new fs::Service([this](zx::channel channel) {
-        indexer_bindings_.AddBinding(
-            this,
-            fidl::InterfaceRequest<ModulePackageIndexer>(std::move(channel)));
-        return ZX_OK;
-      })));
-}
-
-ModulePackageSource::~ModulePackageSource() {}
-
-void ModulePackageSource::IndexManifest(std::string package_name,
-                                        std::string module_manifest_path) {
-  FXL_DCHECK(dispatcher_);
-  FXL_DCHECK(new_entry_fn_);
-
-  std::string data;
-  if (!files::ReadFileToString(module_manifest_path, &data)) {
-    FXL_LOG(ERROR) << "Couldn't read module manifest from: "
-                   << module_manifest_path;
-    return;
-  }
-
-  fuchsia::modular::ModuleManifest entry;
-  if (!ModuleManifestEntryFromJson(data, &entry)) {
-    FXL_LOG(WARNING) << "Couldn't parse module manifest from: "
-                     << module_manifest_path;
-    return;
-  }
-
-  async::PostTask(
-      dispatcher_,
-      fxl::MakeCopyable([weak_this = weak_factory_.GetWeakPtr(), package_name,
-                         entry = std::move(entry)]() mutable {
-        if (!weak_this) {
-          return;
-        }
-
-        weak_this->new_entry_fn_(entry.binary, std::move(entry));
-      }));
-}
-
-// TODO(vardhan): Move this into garnet's fxl.
-void IterateDirectory(fxl::StringView dirname,
-                      std::function<void(fxl::StringView)> callback) {
-  DIR* fd = opendir(dirname.data());
-  if (fd == nullptr) {
-    perror("Could not open module package index directory: ");
-    return;
-  }
-  struct dirent* dp = nullptr;
-  while ((dp = readdir(fd)) != nullptr) {
-    if (dp->d_name[0] != '.') {
-      callback(dp->d_name);
-    }
-  }
-  closedir(fd);
-}
-
-void ModulePackageSource::Watch(async_dispatcher_t* dispatcher, IdleFn idle_fn,
-                                NewEntryFn new_fn, RemovedEntryFn removed_fn) {
-  dispatcher_ = dispatcher;
-  new_entry_fn_ = new_fn;
-
-  IterateDirectory(
-      kInitialModulePackagesIndexDir, [this](fxl::StringView filename) {
-        std::string contents;
-        if (!files::ReadFileToString(
-                fxl::StringPrintf("%s/%s", kInitialModulePackagesIndexDir,
-                                  filename.data()),
-                &contents)) {
-          FXL_LOG(ERROR) << "Could not read module package index: "
-                         << filename.data();
-        }
-        auto module_pkgs = fxl::SplitString(
-            contents, "\n", fxl::kTrimWhitespace, fxl::kSplitWantNonEmpty);
-        for (auto module_pkg_view : module_pkgs) {
-          auto module_pkg = module_pkg_view.ToString();
-          // TODO(vardhan): We only index module package with version=0. Do
-          // better.
-          IndexManifest(module_pkg,
-                        GetModuleManifestPathFromPackage(module_pkg, "0"));
-        }
-      });
-
-  idle_fn();
-}
-
-}  // namespace modular
diff --git a/lib/module_manifest_source/module_package_source.h b/lib/module_manifest_source/module_package_source.h
deleted file mode 100644
index 5e1f6a5..0000000
--- a/lib/module_manifest_source/module_package_source.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_MODULE_MANIFEST_SOURCE_MODULE_PACKAGE_SOURCE_H_
-#define PERIDOT_LIB_MODULE_MANIFEST_SOURCE_MODULE_PACKAGE_SOURCE_H_
-
-#include <functional>
-#include <map>
-#include <string>
-#include <vector>
-
-#include <fuchsia/maxwell/internal/cpp/fidl.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/lib/module_manifest_source/module_manifest_source.h"
-
-namespace modular {
-
-// This source exposes a |ModuleManifestIndexer| service to this application's
-// debug service. New manifests are published using that interfaces. When this
-// source starts up, it gets its initial set of module packages to index by
-// reading the module package index directory located under /system/data/.
-class ModulePackageSource : public ModuleManifestSource,
-                            ::fuchsia::maxwell::internal::ModulePackageIndexer {
- public:
-  ModulePackageSource(component::StartupContext* context);
-  ~ModulePackageSource() override;
-
-  // |ModuleManifestSource|
-  void Watch(async_dispatcher_t* dispatcher, IdleFn idle_fn, NewEntryFn new_fn,
-             RemovedEntryFn removed_fn) override;
-
- private:
-  // |ModulePackageIndexer|
-  void IndexManifest(std::string package_name,
-                     std::string module_manifest_path) override;
-
-  const std::string dir_;
-  NewEntryFn new_entry_fn_;
-  fidl::BindingSet<::fuchsia::maxwell::internal::ModulePackageIndexer>
-      indexer_bindings_;
-  async_dispatcher_t* dispatcher_;
-
-  fxl::WeakPtrFactory<ModulePackageSource> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ModulePackageSource);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_MODULE_MANIFEST_SOURCE_MODULE_PACKAGE_SOURCE_H_
diff --git a/lib/module_manifest_source/package_util.cc b/lib/module_manifest_source/package_util.cc
deleted file mode 100644
index 59cbc0a..0000000
--- a/lib/module_manifest_source/package_util.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/module_manifest_source/package_util.h"
-
-#include <lib/fxl/strings/string_printf.h>
-
-namespace modular {
-
-std::string GetModuleManifestPathFromPackage(fxl::StringView package_name,
-                                             fxl::StringView package_version) {
-  return fxl::StringPrintf("/pkgfs/packages/%s/%s/meta/module.json",
-                           package_name.data(), package_version.data());
-}
-
-}  // namespace modular
diff --git a/lib/module_manifest_source/package_util.h b/lib/module_manifest_source/package_util.h
deleted file mode 100644
index 2829f71..0000000
--- a/lib/module_manifest_source/package_util.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_MODULE_MANIFEST_SOURCE_PACKAGE_UTIL_H_
-#define PERIDOT_LIB_MODULE_MANIFEST_SOURCE_PACKAGE_UTIL_H_
-
-#include <string>
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace modular {
-
-std::string GetModuleManifestPathFromPackage(fxl::StringView package_name,
-                                             fxl::StringView package_version);
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_MODULE_MANIFEST_SOURCE_PACKAGE_UTIL_H_
diff --git a/lib/rapidjson/BUILD.gn b/lib/rapidjson/BUILD.gn
deleted file mode 100644
index c13aebb..0000000
--- a/lib/rapidjson/BUILD.gn
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("rapidjson") {
-  sources = [
-    "rapidjson.h",
-  ]
-
-  public_deps = [
-    "//third_party/rapidjson",
-  ]
-}
diff --git a/lib/rapidjson/rapidjson.h b/lib/rapidjson/rapidjson.h
deleted file mode 100644
index dd4e9e6..0000000
--- a/lib/rapidjson/rapidjson.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_RAPIDJSON_RAPIDJSON_H_
-#define PERIDOT_LIB_RAPIDJSON_RAPIDJSON_H_
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "rapidjson/document.h"
-#include "rapidjson/pointer.h"
-#include "rapidjson/prettywriter.h"
-#include "rapidjson/stringbuffer.h"
-#include "rapidjson/writer.h"
-
-namespace modular {
-
-using JsonDoc = ::rapidjson::Document;
-using JsonValue = JsonDoc::ValueType;
-using JsonPointer = ::rapidjson::GenericPointer<JsonValue>;
-
-// Helper function to convert the given JsonValue to a string. Note that a
-// JsonDoc is also a JsonValue.
-template <typename T>
-inline std::string JsonValueToString(const T& v) {
-  rapidjson::StringBuffer buffer;
-  rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
-  v.Accept(writer);
-  return buffer.GetString();
-}
-
-// Like above, but pretty prints the string.
-template <typename T>
-inline std::string JsonValueToPrettyString(const T& v) {
-  rapidjson::StringBuffer buffer;
-  rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);
-  v.Accept(writer);
-  return buffer.GetString();
-}
-
-// Take a vector of std::string and convert it to "/a/b/c" form for display.
-// For debugging/logging purposes only
-inline std::string PrettyPrintPath(const std::vector<std::string>& path) {
-  std::string result;
-  for (const auto& str : path) {
-    result += '/' + str;
-  }
-  return result;
-}
-
-// Take an array of strings representing the segments in a JSON Path
-// and construct a rapidjson::GenericPointer() object.
-template <typename Doc>
-inline rapidjson::GenericPointer<typename Doc::ValueType> CreatePointer(
-    const Doc& /*doc*/, std::vector<std::string>::iterator begin,
-    std::vector<std::string>::iterator end) {
-  rapidjson::GenericPointer<typename Doc::ValueType> pointer;
-  for (auto it = begin; it != end; ++it) {
-    pointer = pointer.Append(*it, nullptr);
-  }
-  return pointer;
-}
-
-template <typename Doc, typename Collection>
-inline rapidjson::GenericPointer<typename Doc::ValueType> CreatePointer(
-    const Doc& doc, const Collection& path) {
-  rapidjson::GenericPointer<typename Doc::ValueType> pointer;
-  for (const auto& it : path) {
-    pointer = pointer.Append(it, nullptr);
-  }
-  return pointer;
-}
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_RAPIDJSON_RAPIDJSON_H_
diff --git a/lib/rng/BUILD.gn b/lib/rng/BUILD.gn
deleted file mode 100644
index 4b6f2f9..0000000
--- a/lib/rng/BUILD.gn
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("rng") {
-  sources = [
-    "random.h",
-  ]
-}
-
-source_set("system") {
-  sources = [
-    "system_random.h",
-  ]
-
-  public_deps = [
-    ":rng",
-    "//zircon/public/lib/zx",
-  ]
-}
-
-source_set("testing") {
-  testonly = true
-
-  sources = [
-    "test_random.cc",
-    "test_random.h",
-  ]
-
-  public_deps = [
-    ":rng",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-  sources = [
-    "system_random_unittest.cc",
-    "test_random_unittest.cc",
-  ]
-
-  deps = [
-    ":system",
-    ":testing",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gmock",
-    "//third_party/googletest:gtest",
-  ]
-}
diff --git a/lib/rng/random.h b/lib/rng/random.h
deleted file mode 100644
index cfbc853..0000000
--- a/lib/rng/random.h
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_RNG_RANDOM_H_
-#define PERIDOT_LIB_RNG_RANDOM_H_
-
-#include <limits>
-#include <string>
-#include <type_traits>
-
-namespace rng {
-
-// Abstraction over the random number generator.
-//
-// This class allows to get random values. It can generate random bytes on a
-// given buffer, fill a mutable string-like object, or return a POD like
-// object.
-//
-// Using this class allows to control the randomness when running tests by
-// injecting a seedable PRNG and reseeding it with the same value to re-run the
-// same test.
-class Random {
- public:
-  // An object satifying the |UniformRandomBitGenerator| requirements. See:
-  // https://en.cppreference.com/w/cpp/named_req/UniformRandomBitGenerator
-  template <typename I>
-  class BitGenerator {
-   public:
-    static_assert(std::is_unsigned<I>::value,
-                  "RandomBitGenerator only valid for unsigned integers");
-    using result_type = I;
-
-    BitGenerator(Random* random) : random_(random) {}
-    ~BitGenerator() = default;
-    BitGenerator(const BitGenerator&) = default;
-    BitGenerator& operator=(const BitGenerator&) = default;
-
-    static constexpr result_type min() {
-      return std::numeric_limits<result_type>::min();
-    }
-    static constexpr result_type max() {
-      return std::numeric_limits<result_type>::max();
-    }
-    constexpr double entropy() const noexcept {
-      return std::numeric_limits<result_type>::digits;
-    };
-    result_type operator()() { return random_->Draw<I>(); }
-
-   private:
-    Random* const random_;
-  };
-
-  Random() = default;
-  Random(const Random&) = delete;
-  Random& operator=(const Random&) = delete;
-  virtual ~Random() = default;
-
-  // Fill |buffer| with |buffer_size| random bytes.
-  void Draw(void* buffer, size_t buffer_size) {
-    InternalDraw(buffer, buffer_size);
-  }
-
-  // Fills |*string_like| with random bytes. |string_like| must have a random
-  // access operator returning a non-const reference. |string_like must have a
-  // |size| method. &(*string_like)[0] must be the start of writable memory
-  // range of at least |string_like->size()| bytes. Usual datatype that support
-  // this schema are std::string and std::vector<uint8_t>.
-  template <typename S>
-  S& Draw(S* string_like) {
-    Draw(&(*string_like)[0], string_like->size());
-    return *string_like;
-  }
-
-  // Returns an instance of |I| where the content has been filled with randomly
-  // generated bytes. |I| must be trivially copyable.
-  template <typename I>
-  I Draw() {
-    static_assert(std::is_trivially_copyable<I>::value,
-                  "The return type must be trivially copyable.");
-    I result;
-    Draw(&result, sizeof(I));
-    return result;
-  }
-
-  // Returns a random string that is statistically certain to be unique.
-  std::string RandomUniqueBytes() {
-    constexpr size_t kBitsCountForUnicity = 128;
-    char bytes[kBitsCountForUnicity / 8];
-    Draw(bytes, sizeof(bytes));
-    return std::string(bytes, sizeof(bytes));
-  }
-
-  // Returns an object satifying the |UniformRandomBitGenerator| requirements.
-  // See: https://en.cppreference.com/w/cpp/named_req/UniformRandomBitGenerator
-  template <typename I>
-  BitGenerator<I> NewBitGenerator() {
-    return BitGenerator<I>(this);
-  }
-
- protected:
-  // Fills |buffer| with |buffer_size| random bytes.
-  virtual void InternalDraw(void* buffer, size_t buffer_size) = 0;
-};
-
-};  // namespace rng
-
-#endif  // PERIDOT_LIB_RNG_RANDOM_H_
diff --git a/lib/rng/system_random.h b/lib/rng/system_random.h
deleted file mode 100644
index 311f45f..0000000
--- a/lib/rng/system_random.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_RNG_SYSTEM_RANDOM_H_
-#define PERIDOT_LIB_RNG_SYSTEM_RANDOM_H_
-
-#include "peridot/lib/rng/random.h"
-
-#include <zircon/syscalls.h>
-
-namespace rng {
-
-// Implementation of |Random| that uses the system RNG.
-class SystemRandom final : public Random {
- private:
-  void InternalDraw(void* buffer, size_t buffer_size) override {
-    zx_cprng_draw(buffer, buffer_size);
-  }
-};
-
-}  // namespace rng
-
-#endif  // PERIDOT_LIB_RNG_SYSTEM_RANDOM_H_
diff --git a/lib/rng/system_random_unittest.cc b/lib/rng/system_random_unittest.cc
deleted file mode 100644
index 9a33610..0000000
--- a/lib/rng/system_random_unittest.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/rng/system_random.h"
-
-#include <algorithm>
-#include <random>
-#include <vector>
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-
-namespace rng {
-namespace {
-
-using ::testing::ElementsAre;
-using ::testing::Ge;
-using ::testing::Le;
-using ::testing::SizeIs;
-
-TEST(TestRandomTest, InUniquePtr) {
-  auto test_random = std::make_unique<SystemRandom>();
-  std::unique_ptr<Random> random = std::move(test_random);
-  EXPECT_TRUE(random);
-}
-
-TEST(SystemRandomTest, MiscRandomTest) {
-  constexpr size_t kNbElement = 20;
-
-  SystemRandom random;
-
-  std::vector<uint32_t> v1;
-  for (size_t i = 0; i < kNbElement; ++i) {
-    v1.push_back(random.Draw<uint32_t>());
-  }
-  EXPECT_TRUE(std::any_of(v1.begin(), v1.end(),
-                          [](const uint8_t& v) { return v != 0; }));
-
-  std::vector<uint8_t> v2(kNbElement, 0);
-  random.Draw(&v2);
-  EXPECT_TRUE(std::any_of(v2.begin(), v2.end(),
-                          [](const uint8_t& v) { return v != 0; }));
-
-  uint8_t bytes[kNbElement];
-  random.Draw(bytes, kNbElement);
-  EXPECT_TRUE(std::any_of(bytes, bytes + kNbElement,
-                          [](const uint8_t& v) { return v != 0; }));
-}
-
-TEST(SystemRandomTest, BitGeneratorTest) {
-  constexpr size_t kNbElement = 100;
-  SystemRandom random;
-
-  auto engine = random.NewBitGenerator<uint32_t>();
-  std::discrete_distribution<> d({1, 1, 1, 1});
-  std::set<uint32_t> s;
-  for (size_t i = 0; i < kNbElement; ++i) {
-    s.insert(d(engine));
-  }
-  EXPECT_THAT(s, ElementsAre(0, 1, 2, 3));
-}
-
-TEST(SystemRandomTest, RandomStructTest) {
-  constexpr size_t kNbElement = 64;
-  struct S {
-    uint64_t array[kNbElement];
-  };
-  SystemRandom random;
-
-  auto s1 = random.Draw<S>();
-  std::set<uint64_t> v1(s1.array, s1.array + kNbElement);
-
-  EXPECT_THAT(v1, SizeIs(Ge(kNbElement - 2)));
-
-  auto s2 = random.Draw<S>();
-  std::set<uint64_t> v2(s2.array, s2.array + kNbElement);
-
-  std::vector<uint64_t> common_data;
-  set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),
-                   std::back_inserter(common_data));
-  EXPECT_THAT(common_data, SizeIs(Le(2u)));
-}
-
-TEST(SystemRandomTest, IndependantDraws) {
-  constexpr size_t kNbElement = 20;
-
-  SystemRandom random1;
-  SystemRandom random2;
-
-  std::vector<uint8_t> v1(kNbElement, 0);
-  std::vector<uint8_t> v2(kNbElement, 0);
-
-  random1.Draw(&v1);
-  random2.Draw(&v2);
-
-  EXPECT_NE(v1, v2);
-}
-
-}  // namespace
-}  // namespace rng
diff --git a/lib/rng/test_random.cc b/lib/rng/test_random.cc
deleted file mode 100644
index 23f9288..0000000
--- a/lib/rng/test_random.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/rng/test_random.h"
-
-#include <algorithm>
-
-namespace rng {
-
-TestRandom::TestRandom(std::uint_fast64_t seed) : char_engine_(seed) {}
-
-void TestRandom::InternalDraw(void* buffer, size_t buffer_size) {
-  uint8_t* char_buffer = static_cast<uint8_t*>(buffer);
-  std::generate(char_buffer, char_buffer + buffer_size, std::ref(char_engine_));
-}
-
-}  // namespace rng
diff --git a/lib/rng/test_random.h b/lib/rng/test_random.h
deleted file mode 100644
index a28e59d..0000000
--- a/lib/rng/test_random.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_RNG_TEST_RANDOM_H_
-#define PERIDOT_LIB_RNG_TEST_RANDOM_H_
-
-#include <random>
-
-#include "peridot/lib/rng/random.h"
-
-namespace rng {
-
-// Implementation of |Random| that uses a PRNG.
-class TestRandom final : public Random {
- public:
-  TestRandom(std::uint_fast64_t seed);
-
- private:
-  void InternalDraw(void* buffer, size_t buffer_size) override;
-
-  std::independent_bits_engine<std::mt19937_64, 8, uint8_t> char_engine_;
-};
-
-}  // namespace rng
-
-#endif  // PERIDOT_LIB_RNG_TEST_RANDOM_H_
diff --git a/lib/rng/test_random_unittest.cc b/lib/rng/test_random_unittest.cc
deleted file mode 100644
index 91e7411..0000000
--- a/lib/rng/test_random_unittest.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/rng/test_random.h"
-
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-
-namespace rng {
-namespace {
-
-using ::testing::ElementsAreArray;
-using ::testing::Not;
-
-TEST(TestRandomTest, InUniquePtr) {
-  auto test_random = std::make_unique<TestRandom>(0);
-  std::unique_ptr<Random> random = std::move(test_random);
-  EXPECT_TRUE(random);
-}
-
-TEST(TestRandomTest, DependantDraws) {
-  constexpr size_t kNbElement = 20;
-
-  TestRandom random1(0);
-  TestRandom random2(0);
-
-  std::vector<uint8_t> v1(kNbElement, 0);
-  std::vector<uint8_t> v2(kNbElement, 0);
-
-  random1.Draw(&v1);
-  random2.Draw(&v2);
-
-  EXPECT_THAT(v1, ElementsAreArray(v2));
-}
-
-TEST(TestRandomTest, ConsequentDraws) {
-  constexpr size_t kNbElement = 20;
-
-  TestRandom random1(0);
-
-  std::vector<uint8_t> v1(kNbElement, 0);
-  std::vector<uint8_t> v2(kNbElement, 0);
-
-  random1.Draw(&v1);
-  random1.Draw(&v2);
-
-  EXPECT_THAT(v1, Not(ElementsAreArray(v2)));
-}
-
-TEST(TestRandomTest, IndependantDraws) {
-  constexpr size_t kNbElement = 20;
-
-  TestRandom random1(0);
-  TestRandom random2(1);
-
-  std::vector<uint8_t> v1(kNbElement, 0);
-  std::vector<uint8_t> v2(kNbElement, 0);
-
-  random1.Draw(&v1);
-  random2.Draw(&v2);
-
-  EXPECT_THAT(v1, Not(ElementsAreArray(v2)));
-}
-
-}  // namespace
-}  // namespace rng
diff --git a/lib/scoped_tmpfs/BUILD.gn b/lib/scoped_tmpfs/BUILD.gn
deleted file mode 100644
index eaa14f2..0000000
--- a/lib/scoped_tmpfs/BUILD.gn
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [
-  "//peridot/bin/*",
-  "//peridot/lib/*",
-]
-
-source_set("scoped_tmpfs") {
-  sources = [
-    "scoped_tmpfs.cc",
-    "scoped_tmpfs.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//zircon/public/lib/async-loop-cpp",
-    "//zircon/public/lib/memfs",
-    "//zircon/public/lib/sync",
-  ]
-
-  deps = [
-    "//zircon/public/lib/fdio",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "scoped_tmpfs_unittest.cc",
-  ]
-
-  deps = [
-    ":scoped_tmpfs",
-    "//garnet/public/lib/fxl",
-    "//third_party/googletest:gtest",
-  ]
-}
diff --git a/lib/scoped_tmpfs/scoped_tmpfs.cc b/lib/scoped_tmpfs/scoped_tmpfs.cc
deleted file mode 100644
index 33a5f0f..0000000
--- a/lib/scoped_tmpfs/scoped_tmpfs.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-#include <lib/fdio/util.h>
-#include <lib/fsl/io/fd.h>
-#include <lib/fxl/logging.h>
-#include <lib/sync/completion.h>
-#include <zircon/processargs.h>
-
-namespace scoped_tmpfs {
-
-namespace {
-async_loop_config_t MakeConfig() {
-  async_loop_config_t result = kAsyncLoopConfigAttachToThread;
-  result.make_default_for_current_thread = false;
-  return result;
-}
-}  // namespace
-
-ScopedTmpFS::ScopedTmpFS() : config_(MakeConfig()), loop_(&config_) {
-  zx_status_t status = loop_.StartThread("tmpfs_thread");
-  FXL_CHECK(status == ZX_OK);
-  zx_handle_t root_handle;
-  status = memfs_create_filesystem(loop_.dispatcher(), &memfs_, &root_handle);
-  FXL_CHECK(status == ZX_OK);
-  root_fd_ = fsl::OpenChannelAsFileDescriptor(zx::channel(root_handle));
-  FXL_CHECK(root_fd_.is_valid());
-}
-
-ScopedTmpFS::~ScopedTmpFS() {
-  root_fd_.reset();
-  sync_completion_t unmounted;
-  memfs_free_filesystem(memfs_, &unmounted);
-  zx_status_t status = sync_completion_wait(&unmounted, ZX_SEC(3));
-  FXL_DCHECK(status == ZX_OK);
-}
-
-}  // namespace scoped_tmpfs
diff --git a/lib/scoped_tmpfs/scoped_tmpfs.h b/lib/scoped_tmpfs/scoped_tmpfs.h
deleted file mode 100644
index eb8fee1..0000000
--- a/lib/scoped_tmpfs/scoped_tmpfs.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_SCOPED_TMPFS_SCOPED_TMPFS_H_
-#define PERIDOT_LIB_SCOPED_TMPFS_SCOPED_TMPFS_H_
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fxl/files/unique_fd.h>
-#include <lib/memfs/memfs.h>
-
-namespace scoped_tmpfs {
-
-// Scoped temporary filesystem that will be destroyed when this class is
-// deleted. The filesystem is not mounted on the process namespace and should be
-// accessed via the root file descriptor.
-class ScopedTmpFS {
- public:
-  ScopedTmpFS();
-  ScopedTmpFS(const ScopedTmpFS&) = delete;
-  ScopedTmpFS& operator=(const ScopedTmpFS&) = delete;
-  ~ScopedTmpFS();
-
-  int root_fd() { return root_fd_.get(); }
-
- private:
-  async_loop_config_t config_;
-  async::Loop loop_;
-  memfs_filesystem_t* memfs_;
-  fxl::UniqueFD root_fd_;
-};
-
-}  // namespace scoped_tmpfs
-
-#endif  // PERIDOT_LIB_SCOPED_TMPFS_SCOPED_TMPFS_H_
diff --git a/lib/scoped_tmpfs/scoped_tmpfs_unittest.cc b/lib/scoped_tmpfs/scoped_tmpfs_unittest.cc
deleted file mode 100644
index b6816c0..0000000
--- a/lib/scoped_tmpfs/scoped_tmpfs_unittest.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-#include <fcntl.h>
-#include <unistd.h>
-
-#include <lib/fxl/files/unique_fd.h>
-
-#include "gtest/gtest.h"
-
-namespace scoped_tmpfs {
-namespace {
-
-TEST(ScopedTmpFsTest, ScopedTmpFs) {
-  ScopedTmpFS scoped_tmpfs;
-
-  EXPECT_GE(scoped_tmpfs.root_fd(), 0);
-
-  fxl::UniqueFD fd(
-      openat(scoped_tmpfs.root_fd(), "foo", O_WRONLY | O_CREAT | O_EXCL));
-  ASSERT_TRUE(fd.is_valid());
-  EXPECT_GT(write(fd.get(), "Hello", 6), 0);
-  fd.reset(openat(scoped_tmpfs.root_fd(), "foo", O_RDONLY));
-  ASSERT_TRUE(fd.is_valid());
-  char b;
-  EXPECT_EQ(1, read(fd.get(), &b, 1));
-  EXPECT_EQ('H', b);
-}
-
-}  // namespace
-}  // namespace scoped_tmpfs
diff --git a/lib/session_shell_settings/BUILD.gn b/lib/session_shell_settings/BUILD.gn
deleted file mode 100644
index 4607a53..0000000
--- a/lib/session_shell_settings/BUILD.gn
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-group("unittests") {
-  testonly = true
-
-  deps = [
-    ":session_shell_settings_unittest",
-  ]
-}
-
-source_set("session_shell_settings") {
-  sources = [
-    "session_shell_settings.cc",
-    "session_shell_settings.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/fidl/fuchsia.ui.policy",
-    "//peridot/lib/rapidjson:rapidjson",
-  ]
-}
-
-source_set("session_shell_settings_unittest") {
-  testonly = true
-
-  sources = [
-    "session_shell_settings_test.cc",
-  ]
-
-  deps = [
-    ":session_shell_settings",
-    "//garnet/public/lib/fxl",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/lib/session_shell_settings/session_shell_settings.cc b/lib/session_shell_settings/session_shell_settings.cc
deleted file mode 100644
index 4118697..0000000
--- a/lib/session_shell_settings/session_shell_settings.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/session_shell_settings/session_shell_settings.h"
-
-#include <cmath>
-
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-
-#include "rapidjson/document.h"
-
-namespace modular {
-
-namespace {
-
-constexpr char kBaseShellConfigJsonPath[] =
-    "/system/data/sysui/base_shell_config.json";
-std::vector<SessionShellSettings>* g_system_settings;
-
-}  // namespace
-
-namespace internal {
-
-// Given a rapidjson::Value that is an object (i.e. a key-value map), look up
-// |key| in the object and return the value associated with it.
-template <typename T>
-T GetObjectValue(const rapidjson::Value& object, const std::string& key);
-
-// Specializes |GetObjectValue|, expecting the type of object[key] to be an JSON
-// string. Returns "" if the key doesn't exist or isn't a JSON string.
-template <>
-std::string GetObjectValue(const rapidjson::Value& object,
-                           const std::string& key) {
-  if (!object.IsObject())
-    return "";
-
-  if (!object.HasMember(key))
-    return "";
-
-  const auto& field = object[key];
-
-  if (!field.IsString())
-    return "";
-
-  return field.GetString();
-}
-
-// Specializes |GetObjectValue|, expecting the type of object[key] to be a _JSON
-// string that represents a float_. (Note that the type is not expected to be a
-// raw JSON number!).  Returns std::numeric_limits<float>::signaling_NaN() if
-// the float couldn't be parsed from the string.
-template <>
-float GetObjectValue(const rapidjson::Value& object, const std::string& key) {
-  auto str = GetObjectValue<std::string>(object, key);
-
-  if (str.empty())
-    return std::numeric_limits<float>::signaling_NaN();
-
-  const char* const c_str = str.c_str();
-  char* c_str_end;
-
-  const float f = std::strtof(c_str, &c_str_end);
-  if (f == HUGE_VAL || (f == 0.0f && c_str_end == c_str))
-    return std::numeric_limits<float>::signaling_NaN();
-
-  return f;
-}
-
-// Specializes |GetObjectValue|, expecting the type of object[key] to be a JSON
-// string that represents a fuchsia::ui::policy::DisplayUsage. Returns kUnknown
-// if the string couldn't be parsed.
-template <>
-fuchsia::ui::policy::DisplayUsage GetObjectValue(const rapidjson::Value& object,
-                                                 const std::string& key) {
-  auto str = GetObjectValue<std::string>(object, key);
-  if (str.empty()) {
-    return fuchsia::ui::policy::DisplayUsage::kUnknown;
-  }
-
-  // Keep in sync with
-  // <https://fuchsia.googlesource.com/topaz/+/master/lib/base_shell/lib/session_shell_chooser.dart#64>.
-  if (str == "handheld") {
-    return fuchsia::ui::policy::DisplayUsage::kHandheld;
-  } else if (str == "close") {
-    return fuchsia::ui::policy::DisplayUsage::kClose;
-  } else if (str == "near") {
-    return fuchsia::ui::policy::DisplayUsage::kNear;
-  } else if (str == "midrange") {
-    return fuchsia::ui::policy::DisplayUsage::kMidrange;
-  } else if (str == "far") {
-    return fuchsia::ui::policy::DisplayUsage::kFar;
-  } else {
-    FXL_LOG(WARNING) << "unknown display usage string: " << str;
-    return fuchsia::ui::policy::DisplayUsage::kUnknown;
-  }
-};
-
-// Given a |json| string, parses it into list of session shell settings.
-std::vector<SessionShellSettings> ParseSessionShellSettings(
-    const std::string& json) {
-  std::vector<SessionShellSettings> settings;
-
-  rapidjson::Document document;
-  document.Parse(json.c_str());
-  if (document.HasParseError()) {
-    FXL_LOG(ERROR) << "ParseSessionShellSettings(): parse error "
-                   << document.GetParseError();
-    return settings;
-  }
-
-  if (!document.IsArray()) {
-    FXL_LOG(ERROR) << "ParseSessionShellSettings(): root item isn't an array";
-    return settings;
-  }
-
-  if (document.Empty()) {
-    FXL_LOG(ERROR) << "ParseSessionShellSettings(): root array is empty";
-    return settings;
-  }
-
-  settings.reserve(document.Size());
-
-  for (rapidjson::SizeType i = 0; i < document.Size(); i++) {
-    using modular::internal::GetObjectValue;
-
-    const auto& session_shell = document[i];
-
-    const auto& name = GetObjectValue<std::string>(session_shell, "name");
-    if (name.empty())
-      continue;
-
-    settings.push_back({
-        .name = GetObjectValue<std::string>(session_shell, "name"),
-        .screen_width = GetObjectValue<float>(session_shell, "screen_width"),
-        .screen_height = GetObjectValue<float>(session_shell, "screen_height"),
-        .display_usage = GetObjectValue<fuchsia::ui::policy::DisplayUsage>(
-            session_shell, "display_usage"),
-    });
-  }
-
-  return settings;
-}
-
-}  // namespace internal
-
-const std::vector<SessionShellSettings>&
-SessionShellSettings::GetSystemSettings() {
-  // This method is intentionally thread-hostile to keep things simple, and
-  // needs modification to be thread-safe or thread-compatible.
-
-  if (g_system_settings) {
-    return *g_system_settings;
-  }
-
-  g_system_settings = new std::vector<SessionShellSettings>;
-
-  std::string json;
-  if (!files::ReadFileToString(kBaseShellConfigJsonPath, &json)) {
-    FXL_LOG(ERROR) << kBaseShellConfigJsonPath << ": read failed";
-
-    return *g_system_settings;
-  }
-
-  *g_system_settings = internal::ParseSessionShellSettings(json);
-  return *g_system_settings;
-}
-
-bool operator==(const SessionShellSettings& lhs,
-                const SessionShellSettings& rhs) {
-  auto float_eq = [](float f, float g) {
-    // OK to do direct float comparison here, since we want bitwise value
-    // equality.
-    if (f == g)
-      return true;
-
-    if (std::isnan(f) && std::isnan(g))
-      return true;
-
-    return false;
-  };
-
-  return lhs.name == rhs.name && float_eq(lhs.screen_width, rhs.screen_width) &&
-         float_eq(lhs.screen_height, rhs.screen_height) &&
-         lhs.display_usage == rhs.display_usage;
-}
-
-}  // namespace modular
diff --git a/lib/session_shell_settings/session_shell_settings.h b/lib/session_shell_settings/session_shell_settings.h
deleted file mode 100644
index 2b7fce4..0000000
--- a/lib/session_shell_settings/session_shell_settings.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_SESSION_SHELL_SETTINGS_SESSION_SHELL_SETTINGS_H_
-#define PERIDOT_LIB_SESSION_SHELL_SETTINGS_SESSION_SHELL_SETTINGS_H_
-
-#include <vector>
-
-#include <fuchsia/ui/policy/cpp/fidl.h>
-
-namespace modular {
-
-// A data structure representing Session Shell Settings. See
-// |kBaseShellConfigJsonPath| in session_shell_settings.cc for the path name and
-// JSON that this is intended to represent.
-struct SessionShellSettings {
-  // Returns the session shell settings for the system. This is guaranteed to be
-  // O(1). This is thread-unsafe; callers can safely call this method if callers
-  // synchronize access.
-  static const std::vector<SessionShellSettings>& GetSystemSettings();
-
-  // The name of the session shell, e.g. "ermine".
-  const std::string name;
-
-  // The screen width & height in millimeters for the session shell's display.
-  // Defaults to a signaling NaN so that any attempts to use it without checking
-  // for NaN will trap.
-  const float screen_width = std::numeric_limits<float>::signaling_NaN();
-  const float screen_height = std::numeric_limits<float>::signaling_NaN();
-
-  // The display usage policy for this session shell.
-  const fuchsia::ui::policy::DisplayUsage display_usage =
-      fuchsia::ui::policy::DisplayUsage::kUnknown;
-};
-
-bool operator==(const SessionShellSettings& lhs,
-                const SessionShellSettings& rhs);
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_SESSION_SHELL_SETTINGS_SESSION_SHELL_SETTINGS_H_
diff --git a/lib/session_shell_settings/session_shell_settings_test.cc b/lib/session_shell_settings/session_shell_settings_test.cc
deleted file mode 100644
index 3c5923f..0000000
--- a/lib/session_shell_settings/session_shell_settings_test.cc
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/session_shell_settings/session_shell_settings.h"
-
-#include <cmath>
-
-#include "gtest/gtest.h"
-#include "rapidjson/document.h"
-
-namespace modular {
-
-namespace internal {
-
-// Expose some functions in modular::internal for testing.
-
-template <typename T>
-T GetObjectValue(const rapidjson::Value& object, const std::string& field_name);
-
-extern template std::string GetObjectValue<std::string>(
-    const rapidjson::Value& object, const std::string& field_name);
-
-extern template float GetObjectValue<float>(const rapidjson::Value& object,
-                                            const std::string& field_name);
-
-extern template fuchsia::ui::policy::DisplayUsage
-GetObjectValue<fuchsia::ui::policy::DisplayUsage>(
-    const rapidjson::Value& object, const std::string& field_name);
-
-std::vector<SessionShellSettings> ParseSessionShellSettings(const std::string& json);
-
-}  // namespace internal
-
-namespace {
-
-using modular::internal::GetObjectValue;
-
-TEST(SessionShellSettingsTest,
-     GetObjectValue_String_ReturnsEmptyStringOnNonStringType) {
-  rapidjson::Document doc;
-  std::string s;
-
-  doc.Parse("5");
-  s = GetObjectValue<std::string>(doc, "foo");
-  EXPECT_EQ(s, "");
-
-  doc.Parse("[]");
-  s = GetObjectValue<std::string>(doc, "foo");
-  EXPECT_EQ(s, "");
-
-  doc.Parse("\"hi\"");
-  s = GetObjectValue<std::string>(doc, "foo");
-  EXPECT_EQ(s, "");
-}
-
-TEST(SessionShellSettingsTest, GetObjectValue_String) {
-  rapidjson::Document doc;
-  doc.Parse("{ \"foo\": \"bar\" }");
-
-  const std::string& s = GetObjectValue<std::string>(doc, "foo");
-  EXPECT_EQ(s, "bar");
-}
-
-TEST(SessionShellSettingsTest, GetObjectValue_Float_FailedParse) {
-  rapidjson::Document doc;
-  doc.Parse("{ \"foo\": \"bar\" }");
-
-  const float f = GetObjectValue<float>(doc, "foo");
-  EXPECT_TRUE(std::isnan(f));
-}
-
-TEST(SessionShellSettingsTest, GetObjectValue_Float_SuccessfulParse) {
-  rapidjson::Document doc;
-  doc.Parse("{ \"foo\": \"3.141\" }");
-
-  const float f = GetObjectValue<float>(doc, "foo");
-  EXPECT_FLOAT_EQ(f, 3.141f);
-}
-
-TEST(SessionShellSettingsTest, GetObjectValue_DisplayUsage_FailedParse) {
-  using DisplayUsage = fuchsia::ui::policy::DisplayUsage;
-
-  rapidjson::Document doc;
-  doc.Parse("{ \"foo\": \"bar\" }");
-
-  const DisplayUsage e = GetObjectValue<DisplayUsage>(doc, "foo");
-  EXPECT_EQ(e, DisplayUsage::kUnknown);
-}
-
-TEST(SessionShellSettingsTest, GetObjectValue_DisplayUsage_SuccessfulParse) {
-  using DisplayUsage = fuchsia::ui::policy::DisplayUsage;
-
-  rapidjson::Document doc;
-  doc.Parse("{ \"foo\": \"midrange\" }");
-
-  const DisplayUsage e = GetObjectValue<DisplayUsage>(doc, "foo");
-  EXPECT_EQ(e, DisplayUsage::kMidrange);
-}
-
-TEST(SessionShellSettingsTest, ParseSessionShellSettings_ParseError) {
-  EXPECT_EQ(internal::ParseSessionShellSettings("a"),
-            std::vector<SessionShellSettings>());
-  EXPECT_EQ(internal::ParseSessionShellSettings("{}"),
-            std::vector<SessionShellSettings>());
-}
-
-TEST(SessionShellSettingsTest, ParseSessionShellSettings_ParseEmptyList) {
-  EXPECT_EQ(internal::ParseSessionShellSettings("[]"),
-            std::vector<SessionShellSettings>());
-}
-
-TEST(SessionShellSettingsTest, ParseSessionShellSettings_ParseNameOnly) {
-  using DisplayUsage = fuchsia::ui::policy::DisplayUsage;
-
-  const auto& settings =
-      internal::ParseSessionShellSettings(R"( [{ "name": "example_name" }] )")
-          .at(0);
-
-  EXPECT_EQ(settings.name, "example_name");
-  EXPECT_TRUE(std::isnan(settings.screen_width));
-  EXPECT_TRUE(std::isnan(settings.screen_height));
-  EXPECT_EQ(settings.display_usage, DisplayUsage::kUnknown);
-}
-
-TEST(SessionShellSettingsTest, ParseSessionShellSettings_ParseCompleteEntry) {
-  using DisplayUsage = fuchsia::ui::policy::DisplayUsage;
-
-  const auto& settings = internal::ParseSessionShellSettings(
-                             R"( [{ "name": "example_name",
-                                    "screen_width": "3.14",
-                                    "screen_height": "2.718",
-                                    "display_usage": "close" }] )")
-                             .at(0);
-
-  EXPECT_EQ(settings.name, "example_name");
-  EXPECT_FLOAT_EQ(settings.screen_width, 3.14f);
-  EXPECT_FLOAT_EQ(settings.screen_height, 2.718f);
-  EXPECT_EQ(settings.display_usage, DisplayUsage::kClose);
-}
-
-TEST(SessionShellSettingsTest, ParseSessionShellSettings_ParseThreeEntries) {
-  const auto& vector = internal::ParseSessionShellSettings(
-      R"( [{ "name": "example_name1" },
-           { "name": "example_name2" },
-           { "name": "example_name3" }] )");
-
-  EXPECT_EQ(vector.size(), 3u);
-}
-
-}  // namespace
-
-}  // namespace modular
diff --git a/lib/socket/BUILD.gn b/lib/socket/BUILD.gn
deleted file mode 100644
index 92ac9c8..0000000
--- a/lib/socket/BUILD.gn
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-visibility = [
-  "//peridot/bin/*",
-  "//peridot/lib/*",
-]
-
-source_set("socket") {
-  sources = [
-    "socket_drainer_client.cc",
-    "socket_drainer_client.h",
-    "socket_pair.h",
-    "socket_writer.cc",
-    "socket_writer.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/callback",
-    "//zircon/public/lib/zx",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "socket_drainer_client_unittest.cc",
-    "socket_writer_unittest.cc",
-  ]
-
-  deps = [
-    ":socket",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest",
-  ]
-}
diff --git a/lib/socket/socket_drainer_client.cc b/lib/socket/socket_drainer_client.cc
deleted file mode 100644
index 619e820..0000000
--- a/lib/socket/socket_drainer_client.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/socket/socket_drainer_client.h"
-
-#include <utility>
-
-#include <lib/fit/function.h>
-
-namespace socket {
-
-SocketDrainerClient::SocketDrainerClient() : drainer_(this) {}
-
-SocketDrainerClient::~SocketDrainerClient() {}
-
-void SocketDrainerClient::Start(zx::socket source,
-                                fit::function<void(std::string)> callback) {
-  callback_ = std::move(callback);
-  drainer_.Start(std::move(source));
-}
-
-void SocketDrainerClient::OnDataAvailable(const void* data, size_t num_bytes) {
-  data_.append(static_cast<const char*>(data), num_bytes);
-}
-
-void SocketDrainerClient::OnDataComplete() {
-  if (destruction_sentinel_.DestructedWhile([this] { callback_(data_); })) {
-    return;
-  }
-  if (on_empty_callback_) {
-    on_empty_callback_();
-  }
-}
-
-}  // namespace socket
diff --git a/lib/socket/socket_drainer_client.h b/lib/socket/socket_drainer_client.h
deleted file mode 100644
index 6153779..0000000
--- a/lib/socket/socket_drainer_client.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_SOCKET_SOCKET_DRAINER_CLIENT_H_
-#define PERIDOT_LIB_SOCKET_SOCKET_DRAINER_CLIENT_H_
-
-#include <functional>
-#include <memory>
-#include <string>
-
-#include <lib/callback/destruction_sentinel.h>
-#include <lib/fit/function.h>
-#include <lib/fsl/socket/socket_drainer.h>
-#include <lib/fxl/macros.h>
-
-namespace socket {
-
-class SocketDrainerClient : public fsl::SocketDrainer::Client {
- public:
-  SocketDrainerClient();
-
-  ~SocketDrainerClient() override;
-
-  void Start(zx::socket source, fit::function<void(std::string)> callback);
-
-  void set_on_empty(fit::closure on_empty_callback) {
-    on_empty_callback_ = std::move(on_empty_callback);
-  }
-
- private:
-  void OnDataAvailable(const void* data, size_t num_bytes) override;
-
-  void OnDataComplete() override;
-
-  fit::function<void(std::string)> callback_;
-  std::string data_;
-  fsl::SocketDrainer drainer_;
-  fit::closure on_empty_callback_;
-  callback::DestructionSentinel destruction_sentinel_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SocketDrainerClient);
-};
-
-}  // namespace socket
-
-#endif  // PERIDOT_LIB_SOCKET_SOCKET_DRAINER_CLIENT_H_
diff --git a/lib/socket/socket_drainer_client_unittest.cc b/lib/socket/socket_drainer_client_unittest.cc
deleted file mode 100644
index cbd1c08..0000000
--- a/lib/socket/socket_drainer_client_unittest.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/socket/socket_drainer_client.h"
-
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/lib/socket/socket_pair.h"
-
-namespace socket {
-namespace {
-
-using SocketDrainerClientTest = gtest::TestLoopFixture;
-
-// Regression test for LE-229.
-TEST_F(SocketDrainerClientTest, DoNotCallOnDelete) {
-  socket::SocketPair socket;
-  socket.socket1.reset();
-
-  auto drainer = std::make_unique<SocketDrainerClient>();
-  bool called = false;
-  drainer->set_on_empty([&called] { called = true; });
-  drainer->Start(std::move(socket.socket2),
-                 [&drainer](const std::string& v) { drainer.reset(); });
-  RunLoopUntilIdle();
-  EXPECT_FALSE(called);
-}
-
-}  // namespace
-}  // namespace socket
diff --git a/lib/socket/socket_pair.h b/lib/socket/socket_pair.h
deleted file mode 100644
index bddf2ca..0000000
--- a/lib/socket/socket_pair.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_SOCKET_SOCKET_PAIR_H_
-#define PERIDOT_LIB_SOCKET_SOCKET_PAIR_H_
-
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <lib/zx/socket.h>
-
-namespace socket {
-
-// SocketPair produces a pair of connected sockets.
-class SocketPair {
- public:
-  SocketPair();
-  ~SocketPair();
-
-  zx::socket socket1;
-  zx::socket socket2;
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(SocketPair);
-};
-
-inline SocketPair::SocketPair() {
-  FXL_CHECK(zx::socket::create(0u, &socket1, &socket2) == ZX_OK);
-}
-
-inline SocketPair::~SocketPair() {}
-
-}  // namespace socket
-
-#endif  // PERIDOT_LIB_SOCKET_SOCKET_PAIR_H_
diff --git a/lib/socket/socket_writer.cc b/lib/socket/socket_writer.cc
deleted file mode 100644
index 10f5991..0000000
--- a/lib/socket/socket_writer.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/socket/socket_writer.h"
-
-#include <string.h>
-#include <algorithm>
-#include <utility>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/logging.h>
-
-namespace socket {
-
-// TODO(qsr): Remove this, and retrieve the buffer size from the socket when
-// available.
-constexpr size_t kDefaultSocketBufferSize = 256 * 1024u;
-
-SocketWriter::SocketWriter(Client* client, async_dispatcher_t* dispatcher)
-    : client_(client), dispatcher_(dispatcher) {
-  wait_.set_trigger(ZX_SOCKET_WRITABLE | ZX_SOCKET_PEER_CLOSED);
-  wait_.set_handler(
-      [this](async_dispatcher_t* dispatcher, async::Wait* wait,
-             zx_status_t status,
-             const zx_packet_signal_t* signal) { WriteData(data_view_); });
-}
-
-SocketWriter::~SocketWriter() = default;
-
-void SocketWriter::Start(zx::socket destination) {
-  destination_ = std::move(destination);
-  wait_.Cancel();
-  wait_.set_object(destination_.get());
-  GetData();
-}
-
-void SocketWriter::GetData() {
-  FXL_DCHECK(data_.empty());
-  wait_.Cancel();
-  client_->GetNext(offset_, kDefaultSocketBufferSize,
-                   [this](fxl::StringView data) {
-                     if (data.empty()) {
-                       Done();
-                       return;
-                     }
-                     offset_ += data.size();
-                     WriteData(data);
-                   });
-}
-
-void SocketWriter::WriteData(fxl::StringView data) {
-  zx_status_t status = ZX_OK;
-  while (status == ZX_OK && !data.empty()) {
-    size_t written;
-    status = destination_.write(0u, data.data(), data.size(), &written);
-    if (status == ZX_OK) {
-      data = data.substr(written);
-    }
-  }
-
-  if (status == ZX_OK) {
-    FXL_DCHECK(data.empty());
-    data_.clear();
-    data_view_ = "";
-    GetData();
-    return;
-  }
-
-  FXL_DCHECK(!data.empty());
-
-  if (status == ZX_ERR_PEER_CLOSED) {
-    Done();
-    return;
-  }
-
-  if (status == ZX_ERR_SHOULD_WAIT) {
-    if (data_.empty()) {
-      data_ = data.ToString();
-      data_view_ = data_;
-    } else {
-      data_view_ = data;
-    }
-    if (!wait_.is_pending())
-      wait_.Begin(dispatcher_);
-    return;
-  }
-  FXL_DCHECK(false) << "Unhandled zx_status_t: " << status;
-}
-
-void SocketWriter::Done() {
-  wait_.Cancel();
-  destination_.reset();
-  client_->OnDataComplete();
-}
-
-StringSocketWriter::StringSocketWriter(async_dispatcher_t* dispatcher)
-    : socket_writer_(this, dispatcher) {}
-
-void StringSocketWriter::Start(std::string data, zx::socket destination) {
-  data_ = std::move(data);
-  socket_writer_.Start(std::move(destination));
-}
-
-void StringSocketWriter::GetNext(
-    size_t offset, size_t max_size,
-    fit::function<void(fxl::StringView)> callback) {
-  fxl::StringView data = data_;
-  callback(data.substr(offset, max_size));
-}
-
-void StringSocketWriter::OnDataComplete() { delete this; }
-
-}  // namespace socket
diff --git a/lib/socket/socket_writer.h b/lib/socket/socket_writer.h
deleted file mode 100644
index 411c836..0000000
--- a/lib/socket/socket_writer.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_SOCKET_SOCKET_WRITER_H_
-#define PERIDOT_LIB_SOCKET_SOCKET_WRITER_H_
-
-#include <functional>
-#include <memory>
-#include <string>
-
-#include <lib/async/cpp/wait.h>
-#include <lib/async/default.h>
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-#include <lib/zx/socket.h>
-
-namespace socket {
-
-// Requests data to write from its client. Interrupts itself and closes the
-// socket when deleted.
-class SocketWriter {
- public:
-  class Client {
-   public:
-    virtual void GetNext(size_t offset, size_t max_size,
-                         fit::function<void(fxl::StringView)> callback) = 0;
-    virtual void OnDataComplete() = 0;
-
-   protected:
-    virtual ~Client() {}
-  };
-
-  explicit SocketWriter(Client* client, async_dispatcher_t* dispatcher =
-                                            async_get_default_dispatcher());
-  ~SocketWriter();
-
-  void Start(zx::socket destination);
-
- private:
-  void GetData();
-  void WriteData(fxl::StringView data);
-  void Done();
-
-  Client* const client_;
-  async_dispatcher_t* const dispatcher_;
-  // Position of the next byte to request.
-  size_t offset_ = 0u;
-  // Data left to send from last call to |GetNext|.
-  std::string data_;
-  // Data left to send.
-  fxl::StringView data_view_;
-  zx::socket destination_;
-  async::Wait wait_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SocketWriter);
-};
-
-// Writes the content of a string to a socket. Deletes itself when done.
-class StringSocketWriter : public SocketWriter::Client {
- public:
-  explicit StringSocketWriter(
-      async_dispatcher_t* dispatcher = async_get_default_dispatcher());
-
-  void Start(std::string data, zx::socket destination);
-
- private:
-  void GetNext(size_t offset, size_t max_size,
-               fit::function<void(fxl::StringView)> callback) override;
-  void OnDataComplete() override;
-
-  SocketWriter socket_writer_;
-  std::string data_;
-};
-
-}  // namespace socket
-
-#endif  // PERIDOT_LIB_SOCKET_SOCKET_WRITER_H_
diff --git a/lib/socket/socket_writer_unittest.cc b/lib/socket/socket_writer_unittest.cc
deleted file mode 100644
index 1f8acdd..0000000
--- a/lib/socket/socket_writer_unittest.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/socket/socket_writer.h"
-
-#include <utility>
-
-#include <lib/fit/function.h>
-#include <lib/fxl/macros.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "peridot/lib/socket/socket_drainer_client.h"
-#include "peridot/lib/socket/socket_pair.h"
-
-namespace socket {
-namespace {
-
-using SocketWriterTest = gtest::TestLoopFixture;
-
-class StringClient : public SocketWriter::Client {
- public:
-  explicit StringClient(std::string value) : value_(std::move(value)) {}
-
-  void GetNext(size_t offset, size_t max_size,
-               fit::function<void(fxl::StringView)> callback) override {
-    fxl::StringView data = value_;
-    callback(data.substr(offset, max_size));
-  }
-
-  void OnDataComplete() override { completed_ = true; }
-
-  bool completed() { return completed_; }
-
- private:
-  std::string value_;
-  bool completed_ = false;
-};
-
-TEST_F(SocketWriterTest, WriteAndRead) {
-  SocketPair socket;
-  StringClient client("bazinga\n");
-  SocketWriter writer(&client);
-  writer.Start(std::move(socket.socket1));
-
-  std::string value;
-  auto drainer = std::make_unique<SocketDrainerClient>();
-  drainer->Start(std::move(socket.socket2),
-                 [&value](const std::string& v) { value = v; });
-  RunLoopUntilIdle();
-
-  EXPECT_EQ("bazinga\n", value);
-  EXPECT_TRUE(client.completed());
-}
-
-TEST_F(SocketWriterTest, ClientClosedTheirEnd) {
-  SocketPair socket;
-  StringClient client("bazinga\n");
-  SocketWriter writer(&client);
-  socket.socket2.reset();
-  writer.Start(std::move(socket.socket1));
-  EXPECT_TRUE(client.completed());
-}
-
-TEST_F(SocketWriterTest, StringSocketWriter) {
-  SocketPair socket;
-  StringSocketWriter* writer = new StringSocketWriter();
-  writer->Start("bazinga\n", std::move(socket.socket1));
-
-  std::string value;
-  auto drainer = std::make_unique<SocketDrainerClient>();
-  drainer->Start(std::move(socket.socket2),
-                 [&value](const std::string& v) { value = v; });
-  RunLoopUntilIdle();
-
-  EXPECT_EQ("bazinga\n", value);
-}
-
-}  // namespace
-}  // namespace socket
diff --git a/lib/testing/BUILD.gn b/lib/testing/BUILD.gn
deleted file mode 100644
index 0b9ddba..0000000
--- a/lib/testing/BUILD.gn
+++ /dev/null
@@ -1,286 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("component_base") {
-  testonly = true
-
-  sources = [
-    "component_base.h",
-  ]
-
-  public_deps = [
-    ":component_main",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:single_service_app",
-    "//peridot/public/lib/integration_testing/cpp",
-  ]
-}
-
-source_set("component_main") {
-  testonly = true
-
-  sources = [
-    "component_main.h",
-  ]
-
-  public_deps = [
-    "//peridot/public/lib/app_driver/cpp:app_driver",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-source_set("component_context_fake") {
-  testonly = true
-
-  sources = [
-    "component_context_fake.cc",
-    "component_context_fake.h",
-  ]
-
-  public_deps = [
-    ":entity_resolver_fake",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("entity_resolver_fake") {
-  testonly = true
-
-  sources = [
-    "entity_resolver_fake.cc",
-    "entity_resolver_fake.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("module_resolver_fake") {
-  testonly = true
-
-  sources = [
-    "module_resolver_fake.cc",
-    "module_resolver_fake.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("module_facet_reader_fake") {
-  testonly = true
-
-  sources = [
-    "module_facet_reader_fake.cc",
-    "module_facet_reader_fake.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/module_manifest:module_facet_reader",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("session_shell_base") {
-  testonly = true
-
-  sources = [
-    "session_shell_base.h",
-  ]
-
-  public_deps = [
-    ":component_base",
-    ":session_shell_impl",
-  ]
-}
-
-source_set("session_shell_impl") {
-  testonly = true
-
-  sources = [
-    "session_shell_impl.cc",
-    "session_shell_impl.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-source_set("story_controller_mock") {
-  testonly = true
-
-  sources = [
-    "story_controller_mock.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-  ]
-}
-
-source_set("story_provider_mock") {
-  testonly = true
-
-  sources = [
-    "story_provider_mock.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-
-  deps = [
-    ":story_controller_mock",
-    "//garnet/public/lib/fidl/cpp",
-  ]
-}
-
-source_set("test_story_command_executor") {
-  testonly = true
-
-  sources = [
-    "test_story_command_executor.cc",
-    "test_story_command_executor.h",
-  ]
-
-  deps = [
-    "//peridot/bin/sessionmgr/puppet_master:story_command_executor",
-    "//peridot/lib/fidl:clone",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("test_with_ledger") {
-  testonly = true
-
-  sources = [
-    "test_with_ledger.cc",
-    "test_with_ledger.h",
-  ]
-
-  public_deps = [
-    ":ledger_repository_for_testing",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//peridot/lib/ledger_client:page_client",
-    "//third_party/googletest:gtest",
-  ]
-}
-
-source_set("test_with_session_storage") {
-  testonly = true
-
-  sources = [
-    "test_with_session_storage.cc",
-    "test_with_session_storage.h",
-  ]
-
-  public_deps = [
-    ":test_with_ledger",
-    "//peridot/bin/sessionmgr/storage",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("fake_agent_runner_storage") {
-  testonly = true
-
-  sources = [
-    "fake_agent_runner_storage.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/sessionmgr/agent_runner:public",
-  ]
-}
-
-source_set("ledger_repository_for_testing") {
-  testonly = true
-
-  sources = [
-    "ledger_repository_for_testing.cc",
-    "ledger_repository_for_testing.h",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/bin/ledger/fidl",
-    "//peridot/lib/common:teardown",
-    "//peridot/lib/fidl:app_client",
-    "//peridot/lib/ledger_client:constants",
-    "//peridot/lib/ledger_client:status",
-    "//peridot/public/fidl/fuchsia.ledger",
-  ]
-
-  public_deps = [
-    "//peridot/lib/scoped_tmpfs",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("mock_base") {
-  testonly = true
-
-  sources = [
-    "mock_base.cc",
-    "mock_base.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//third_party/googletest:gtest",
-  ]
-}
-
-source_set("wait_until_idle") {
-  testonly = true
-
-  sources = [
-    "wait_until_idle.h",
-  ]
-
-  public_deps = [
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//third_party/googletest:gtest",
-  ]
-}
-
-source_set("test_driver") {
-  sources = [
-    "test_driver.h",
-  ]
-}
diff --git a/lib/testing/README.md b/lib/testing/README.md
deleted file mode 100644
index 0110c2f..0000000
--- a/lib/testing/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-Here is code that helps clients of modular with testing.
-
-When linked against the `//peridot/lib/testing` library target, a test
-application can use the functions in `lib/testing/testing.h` to interact with
-the `TestRunner` service in its environment. This is the standard way to test
-multi-process modular applications; these functions allow a test to declare
-failure, and signal tear down of tests to the TestRunner service.
-
-See [//peridot/tests](/peridot/tests) for more details on running
-tests.
diff --git a/lib/testing/component_base.h b/lib/testing/component_base.h
deleted file mode 100644
index cec380d..0000000
--- a/lib/testing/component_base.h
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_COMPONENT_BASE_H_
-#define PERIDOT_LIB_TESTING_COMPONENT_BASE_H_
-
-#include <lib/component/cpp/connect.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/lib/fidl/single_service_app.h"
-#include "peridot/lib/testing/component_main.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-
-namespace modular {
-namespace testing {
-
-// A base class for components used in tests. It helps them to exit the
-// application at the end of the life cycle while properly posting test points
-// and calling TestRunner::Done().
-//
-// Component is fuchsia::modular::Module, fuchsia::modular::Agent,
-// fuchsia::modular::SessionShell, etc.
-template <typename Component>
-class ComponentBase : protected SingleServiceApp<Component> {
- public:
-  void Terminate(std::function<void()> done) override {
-    modular::testing::Done(done);
-  }
-
- protected:
-  // Invocations of methods of the base class must be unambiguously recognizable
-  // by the compiler as method invocations at the point of template definition,
-  // because the base class depends on the template parameter. This can be
-  // accomplished either by class name prefix or by prepending this->. Without
-  // either, the calls are assumed to be function calls that are unresolved (and
-  // marked as error by the compiler) at template definition. Essentially, the
-  // class name prefix turns the independent name into a dependent
-  // name. Cf. http://en.cppreference.com/w/cpp/language/dependent_name.
-  using Base = SingleServiceApp<Component>;
-
-  ComponentBase(component::StartupContext* const startup_context)
-      : Base(startup_context), weak_factory_(this) {}
-
-  ~ComponentBase() override = default;
-
-  // We must not call testing::Init() in the base class
-  // constructor, because that's before the test points are initialized. It's
-  // fine to call this from the derived class constructor.
-  void TestInit(const char* const file) {
-    testing::Init(Base::startup_context(), file);
-  }
-
-  // Wraps the callback function into a layer that protects executing the
-  // callback in the argument against execution after this instance is deleted,
-  // using the weak pointer factory.
-  std::function<void()> Protect(std::function<void()> callback) {
-    return [ptr = weak_factory_.GetWeakPtr(), callback = std::move(callback)] {
-      if (ptr) {
-        callback();
-      }
-    };
-  }
-
- private:
-  // This weak ptr factory is not the last member in the derived class, so it
-  // cannot be used to protect code executed in member destructors against
-  // accessing this. But it is enough to protect callbacks sent to the runloop
-  // against execution after the instance is deleted.
-  fxl::WeakPtrFactory<ComponentBase> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ComponentBase);
-};
-
-template <>
-class ComponentBase<void> : protected ViewApp {
- public:
-  void Terminate(std::function<void()> done) override {
-    modular::testing::Done(done);
-  }
-
- protected:
-  ComponentBase(component::StartupContext* const startup_context)
-      : ViewApp(startup_context), weak_factory_(this) {}
-
-  ~ComponentBase() override = default;
-
-  // We must not call testing::Init() in the base class
-  // constructor, because that's before the test points are initialized. It's
-  // fine to call this from the derived class constructor.
-  void TestInit(const char* const file) {
-    testing::Init(ViewApp::startup_context(), file);
-  }
-
-  // Wraps the callback function into a layer that protects executing the
-  // callback in the argument against execution after this instance is deleted,
-  // using the weak pointer factory.
-  std::function<void()> Protect(std::function<void()> callback) {
-    return [ptr = weak_factory_.GetWeakPtr(), callback = std::move(callback)] {
-      if (ptr) {
-        callback();
-      }
-    };
-  }
-
- private:
-  // This weak ptr factory is not the last member in the derived class, so it
-  // cannot be used to protect code executed in member destructors against
-  // accessing this. But it is enough to protect callbacks sent to the runloop
-  // against execution after the instance is deleted.
-  fxl::WeakPtrFactory<ComponentBase> weak_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ComponentBase);
-};
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_COMPONENT_BASE_H_
diff --git a/lib/testing/component_context_fake.cc b/lib/testing/component_context_fake.cc
deleted file mode 100644
index ed15150..0000000
--- a/lib/testing/component_context_fake.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/testing/component_context_fake.h"
-
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-ComponentContextFake::ComponentContextFake() {}
-
-ComponentContextFake::~ComponentContextFake() = default;
-
-void ComponentContextFake::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void ComponentContextFake::GetLedger(
-    fidl::InterfaceRequest<fuchsia::ledger::Ledger> request) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void ComponentContextFake::ConnectToAgent(
-    std::string url,
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-        incoming_services_request,
-    fidl::InterfaceRequest<fuchsia::modular::AgentController>
-        agent_controller_request) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void ComponentContextFake::ObtainMessageQueue(
-    std::string name,
-    fidl::InterfaceRequest<fuchsia::modular::MessageQueue> request) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void ComponentContextFake::DeleteMessageQueue(std::string name) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void ComponentContextFake::GetMessageSender(
-    std::string queue_token,
-    fidl::InterfaceRequest<fuchsia::modular::MessageSender> request) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void ComponentContextFake::GetEntityResolver(
-    fidl::InterfaceRequest<fuchsia::modular::EntityResolver> request) {
-  entity_resolver_.Connect(std::move(request));
-}
-
-void ComponentContextFake::CreateEntityWithData(
-    std::vector<fuchsia::modular::TypeToDataEntry> type_to_data,
-    CreateEntityWithDataCallback result) {
-  FXL_NOTIMPLEMENTED();
-}
-
-void ComponentContextFake::GetPackageName(GetPackageNameCallback result) {
-  FXL_NOTIMPLEMENTED();
-}
-
-}  // namespace modular
diff --git a/lib/testing/component_context_fake.h b/lib/testing/component_context_fake.h
deleted file mode 100644
index 6cad271..0000000
--- a/lib/testing/component_context_fake.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_COMPONENT_CONTEXT_FAKE_H_
-#define PERIDOT_LIB_TESTING_COMPONENT_CONTEXT_FAKE_H_
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/testing/entity_resolver_fake.h"
-
-namespace modular {
-
-// A fake implementation of fuchsia::modular::ComponentContext for tests.
-// fuchsia::modular::ComponentContext gives clients access to further services.
-// This implementation returns fake versions of the various services in
-// question.
-//
-// Implemented:
-//
-//  * GetEntityResolver() -> returns a FakeEntityResolver (see
-//    lib/entity/cpp/testing/fake_entity_resolver.h).
-//  * CreateEntityWithData() -> returns a reference that the FakeEntityResolver
-//    will resolve.
-class ComponentContextFake : public fuchsia::modular::ComponentContext {
- public:
-  ComponentContextFake();
-  ~ComponentContextFake() override;
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request);
-
-  EntityResolverFake& entity_resolver_fake() { return entity_resolver_; }
-
- private:
-  // |fuchsia::modular::ComponentContext|
-  void GetLedger(
-      fidl::InterfaceRequest<fuchsia::ledger::Ledger> request) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void ConnectToAgent(std::string url,
-                      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-                          incoming_services_request,
-                      fidl::InterfaceRequest<fuchsia::modular::AgentController>
-                          agent_controller_request) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void ObtainMessageQueue(
-      std::string name,
-      fidl::InterfaceRequest<fuchsia::modular::MessageQueue> request) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void DeleteMessageQueue(std::string name) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void GetMessageSender(
-      std::string queue_token,
-      fidl::InterfaceRequest<fuchsia::modular::MessageSender> request) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void GetEntityResolver(
-      fidl::InterfaceRequest<fuchsia::modular::EntityResolver> request)
-      override;
-
-  // |fuchsia::modular::ComponentContext|
-  void CreateEntityWithData(
-      std::vector<fuchsia::modular::TypeToDataEntry> type_to_data,
-      CreateEntityWithDataCallback result) override;
-
-  // |fuchsia::modular::ComponentContext|
-  void GetPackageName(GetPackageNameCallback result) override;
-
-  EntityResolverFake entity_resolver_;
-
-  fidl::BindingSet<fuchsia::modular::ComponentContext> bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ComponentContextFake);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_COMPONENT_CONTEXT_FAKE_H_
diff --git a/lib/testing/component_main.h b/lib/testing/component_main.h
deleted file mode 100644
index 6f69368..0000000
--- a/lib/testing/component_main.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_COMPONENT_MAIN_H_
-#define PERIDOT_LIB_TESTING_COMPONENT_MAIN_H_
-
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-
-namespace modular {
-namespace testing {
-
-// A main function for an application that only runs the implementation of a
-// single component used for integration testing. The component implementation
-// Impl usually derives from ComponentBase.
-//
-// Args are meant to be either nothing or the instance of a Settings class
-// initialized from the command line arguments. They are just passed as
-// additional constructor arguments to Impl.
-//
-// Example use with settings (TestApp and Settings are locally defined classes):
-//
-//   int main(int argc, const char** argv) {
-//     auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-//     Settings settings(command_line);
-//     modular::testing::ComponentMain<TestApp, Settings>(std::move(settings));
-//     return 0;
-//   }
-//
-// Example use without settings (TestApp is a locally defined class):
-//
-//   int main(int, const char**) {
-//     modular::testing::ComponentMain<TestApp>();
-//     return 0;
-//   }
-//
-// The classes ComponentBase and SessionShellBase defined in this directory are
-// meant to be used as base classes for Impl.
-template <typename Impl, typename... Args>
-void ComponentMain(Args... args) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AppDriver<Impl> driver(
-      context->outgoing().deprecated_services(),
-      std::make_unique<Impl>(context.get(), std::move(args)...),
-      [&loop] { loop.Quit(); });
-
-  loop.Run();
-}
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_COMPONENT_MAIN_H_
diff --git a/lib/testing/entity_resolver_fake.cc b/lib/testing/entity_resolver_fake.cc
deleted file mode 100644
index a8bc2af..0000000
--- a/lib/testing/entity_resolver_fake.cc
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/testing/entity_resolver_fake.h"
-
-#include <lib/fsl/vmo/strings.h>
-
-namespace modular {
-
-class EntityResolverFake::EntityImpl : fuchsia::modular::Entity {
- public:
-  EntityImpl(std::map<std::string, std::string> types_and_data)
-      : types_and_data_(types_and_data) {}
-
-  void Connect(fidl::InterfaceRequest<fuchsia::modular::Entity> request) {
-    bindings_.AddBinding(this, std::move(request));
-  }
-
- private:
-  // |fuchsia::modular::Entity|
-  void GetTypes(GetTypesCallback callback) override {
-    std::vector<std::string> types;
-    for (const auto& entry : types_and_data_) {
-      types.push_back(entry.first);
-    }
-    callback(std::move(types));
-  }
-
-  // |fuchsia::modular::Entity|
-  void GetData(std::string type, GetDataCallback callback) override {
-    auto it = types_and_data_.find(type);
-    if (it == types_and_data_.end()) {
-      callback(nullptr);
-      return;
-    }
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(it->second, &vmo));
-    auto vmo_ptr =
-        std::make_unique<fuchsia::mem::Buffer>(std::move(vmo).ToTransport());
-
-    callback(std::move(vmo_ptr));
-  }
-
-  // |fuchsia::modular::Entity|
-  void WriteData(std::string type, fuchsia::mem::Buffer data,
-                 WriteDataCallback callback) override {
-    // TODO(rosswang)
-    callback(fuchsia::modular::EntityWriteStatus::READ_ONLY);
-  }
-
-  // |fuchsia::modular::Entity|
-  void GetReference(GetReferenceCallback callback) override {
-    // TODO(rosswang)
-    FXL_NOTIMPLEMENTED();
-  }
-
-  // |fuchsia::modular::Entity|
-  void Watch(
-      std::string type,
-      fidl::InterfaceHandle<fuchsia::modular::EntityWatcher> watcher) override {
-    // TODO(MI4-1301)
-    FXL_NOTIMPLEMENTED();
-  }
-
-  std::map<std::string, std::string> types_and_data_;
-
-  fidl::BindingSet<fuchsia::modular::Entity> bindings_;
-};
-
-EntityResolverFake::EntityResolverFake() = default;
-EntityResolverFake::~EntityResolverFake() = default;
-
-void EntityResolverFake::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::EntityResolver> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-// Returns an fuchsia::modular::Entity reference that will resolve to an
-// fuchsia::modular::Entity. |types_and_data| is a map of data type to data
-// bytes.
-fidl::StringPtr EntityResolverFake::AddEntity(
-    std::map<std::string, std::string> types_and_data) {
-  const std::string id = std::to_string(next_entity_id_++);
-
-  auto entity = std::make_unique<EntityImpl>(std::move(types_and_data));
-  entities_.emplace(id, std::move(entity));
-  return id;
-}
-
-void EntityResolverFake::ResolveEntity(
-    std::string entity_reference,
-    fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request) {
-  auto it = entities_.find(entity_reference);
-  if (it == entities_.end()) {
-    return;  // |entity_request| is reset here.
-  }
-
-  it->second->Connect(std::move(entity_request));
-}
-
-}  // namespace modular
diff --git a/lib/testing/entity_resolver_fake.h b/lib/testing/entity_resolver_fake.h
deleted file mode 100644
index 82e353c..0000000
--- a/lib/testing/entity_resolver_fake.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_ENTITY_RESOLVER_FAKE_H_
-#define PERIDOT_LIB_TESTING_ENTITY_RESOLVER_FAKE_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fidl/cpp/string.h>
-#include <lib/fxl/macros.h>
-
-namespace modular {
-
-class EntityResolverFake : public fuchsia::modular::EntityResolver {
- public:
-  EntityResolverFake();
-  ~EntityResolverFake() override;
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::EntityResolver> request);
-
-  // Returns an fuchsia::modular::Entity reference that will resolve to an
-  // fuchsia::modular::Entity. |types_and_data| is a map of data type to data
-  // bytes.
-  fidl::StringPtr AddEntity(std::map<std::string, std::string> types_and_data);
-
- private:
-  class EntityImpl;
-
-  void ResolveEntity(
-      std::string entity_reference,
-      fidl::InterfaceRequest<fuchsia::modular::Entity> entity_request) override;
-
-  int next_entity_id_{0};
-  std::map<std::string, std::unique_ptr<EntityImpl>> entities_;
-  fidl::BindingSet<fuchsia::modular::EntityResolver> bindings_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_ENTITY_RESOLVER_FAKE_H_
diff --git a/lib/testing/fake_agent_runner_storage.h b/lib/testing/fake_agent_runner_storage.h
deleted file mode 100644
index 224f110..0000000
--- a/lib/testing/fake_agent_runner_storage.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_FAKE_AGENT_RUNNER_STORAGE_H_
-#define PERIDOT_LIB_TESTING_FAKE_AGENT_RUNNER_STORAGE_H_
-
-#include <functional>
-#include <string>
-
-#include <lib/fxl/macros.h>
-
-#include "peridot/bin/sessionmgr/agent_runner/agent_runner_storage.h"
-
-namespace modular {
-namespace testing {
-
-class FakeAgentRunnerStorage : public AgentRunnerStorage {
- public:
-  FakeAgentRunnerStorage() = default;
-
-  // |AgentRunnerStorage|
-  void Initialize(NotificationDelegate* /*delegate*/,
-                  const std::function<void()> done) override {
-    done();
-  }
-
-  // |AgentRunnerStorage|
-  void WriteTask(const std::string& /*agent_url*/, TriggerInfo /*info*/,
-                 const std::function<void(bool)> done) override {
-    done(true);
-  }
-
-  // |AgentRunnerStorage|
-  void DeleteTask(const std::string& /*agent_url*/,
-                  const std::string& /*task_id*/,
-                  const std::function<void(bool)> done) override {
-    done(true);
-  }
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FakeAgentRunnerStorage);
-};
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_FAKE_AGENT_RUNNER_STORAGE_H_
diff --git a/lib/testing/ledger_repository_for_testing.cc b/lib/testing/ledger_repository_for_testing.cc
deleted file mode 100644
index 9fd148c..0000000
--- a/lib/testing/ledger_repository_for_testing.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/testing/ledger_repository_for_testing.h"
-
-#include <utility>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fsl/io/fd.h>
-
-#include "peridot/lib/common/teardown.h"
-#include "peridot/lib/fidl/app_client.h"
-#include "peridot/lib/ledger_client/constants.h"
-#include "peridot/lib/ledger_client/status.h"
-
-namespace modular {
-
-namespace testing {
-
-LedgerRepositoryForTesting::LedgerRepositoryForTesting()
-    : startup_context_(component::StartupContext::CreateFromStartupInfo()) {
-  fuchsia::modular::AppConfig ledger_config;
-  ledger_config.url = kLedgerAppUrl;
-
-  auto& launcher = startup_context_->launcher();
-  ledger_app_client_ =
-      std::make_unique<AppClient<fuchsia::ledger::internal::LedgerController>>(
-          launcher.get(), std::move(ledger_config));
-
-  ledger_repo_factory_.set_error_handler([](zx_status_t status) {
-    FXL_CHECK(false) << "LedgerRepositoryFactory returned an error. Status: "
-                     << LedgerEpitaphToString(status);
-  });
-  ledger_app_client_->services().ConnectToService(
-      ledger_repo_factory_.NewRequest());
-}
-
-LedgerRepositoryForTesting::~LedgerRepositoryForTesting() = default;
-
-fuchsia::ledger::internal::LedgerRepository*
-LedgerRepositoryForTesting::ledger_repository() {
-  if (!ledger_repo_) {
-    ledger_repo_factory_->GetRepository(
-        fsl::CloneChannelFromFileDescriptor(tmp_fs_.root_fd()), nullptr, "",
-        ledger_repo_.NewRequest());
-  }
-
-  return ledger_repo_.get();
-}
-
-void LedgerRepositoryForTesting::Terminate(std::function<void()> done) {
-  if (ledger_app_client_) {
-    ledger_app_client_->Teardown(kBasicTimeout, [this, done] {
-      ledger_repo_factory_.Unbind();
-      ledger_app_client_.reset();
-      done();
-    });
-
-  } else {
-    done();
-  }
-}
-
-}  // namespace testing
-}  // namespace modular
diff --git a/lib/testing/ledger_repository_for_testing.h b/lib/testing/ledger_repository_for_testing.h
deleted file mode 100644
index 5f1bfc9..0000000
--- a/lib/testing/ledger_repository_for_testing.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_LEDGER_REPOSITORY_FOR_TESTING_H_
-#define PERIDOT_LIB_TESTING_LEDGER_REPOSITORY_FOR_TESTING_H_
-
-#include <string>
-
-#include <fuchsia/ledger/cpp/fidl.h>
-#include <fuchsia/ledger/internal/cpp/fidl.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/fidl/app_client.h"
-#include "peridot/lib/scoped_tmpfs/scoped_tmpfs.h"
-
-namespace modular {
-namespace testing {
-
-// LedgerRepositoryForTesting spins up a ledger instance and acquires a ledger
-// repository meant to be used for testing, particularly in gtest unittests.
-class LedgerRepositoryForTesting {
- public:
-  LedgerRepositoryForTesting();
-  ~LedgerRepositoryForTesting();
-
-  fuchsia::ledger::internal::LedgerRepository* ledger_repository();
-
-  // Terminates the ledger repository app.
-  void Terminate(std::function<void()> done);
-
- private:
-  std::unique_ptr<component::StartupContext> startup_context_;
-  scoped_tmpfs::ScopedTmpFS tmp_fs_;
-  std::unique_ptr<AppClient<fuchsia::ledger::internal::LedgerController>>
-      ledger_app_client_;
-  fuchsia::ledger::internal::LedgerRepositoryFactoryPtr ledger_repo_factory_;
-  fuchsia::ledger::internal::LedgerRepositoryPtr ledger_repo_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LedgerRepositoryForTesting);
-};
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_LEDGER_REPOSITORY_FOR_TESTING_H_
diff --git a/lib/testing/mock_base.cc b/lib/testing/mock_base.cc
deleted file mode 100644
index c12cf90..0000000
--- a/lib/testing/mock_base.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/testing/mock_base.h"
-
-#include <lib/fxl/logging.h>
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace testing {
-
-MockBase::MockBase() = default;
-MockBase::~MockBase() = default;
-
-void MockBase::ExpectCalledOnce(const std::string& func) {
-  EXPECT_EQ(1U, counts.count(func)) << "Expected 1 invocation of '" << func
-                                    << "' but got " << counts.count(func);
-  if (counts.count(func) > 0) {
-    EXPECT_EQ(1U, counts[func]);
-    counts.erase(func);
-  }
-}
-
-void MockBase::ClearCalls() { counts.clear(); }
-
-void MockBase::ExpectNoOtherCalls() {
-  EXPECT_TRUE(counts.empty());
-  for (const auto& c : counts) {
-    FXL_LOG(INFO) << "    Unexpected call: " << c.first;
-  }
-}
-
-}  // namespace testing
-}  // namespace modular
diff --git a/lib/testing/mock_base.h b/lib/testing/mock_base.h
deleted file mode 100644
index 7adb6fc..0000000
--- a/lib/testing/mock_base.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_MOCK_BASE_H_
-#define PERIDOT_LIB_TESTING_MOCK_BASE_H_
-
-#include <map>
-#include <string>
-
-namespace modular {
-namespace testing {
-
-// Helper class for unit testing that provides a collection to track the number
-// of times each function is called, then provides functions to validate those
-// calls.
-class MockBase {
- public:
-  MockBase();
-  virtual ~MockBase();
-
-  // Validates that the given function was called once and removes that
-  // information from the call history
-  void ExpectCalledOnce(const std::string& func);
-
-  // Removes the entire history of functions called
-  void ClearCalls();
-
-  // Validates that the call history is empty
-  void ExpectNoOtherCalls();
-
- protected:
-  std::map<std::string, unsigned int> counts;
-};
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_MOCK_BASE_H_
diff --git a/lib/testing/module_facet_reader_fake.cc b/lib/testing/module_facet_reader_fake.cc
deleted file mode 100644
index 3174225..0000000
--- a/lib/testing/module_facet_reader_fake.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/testing/module_facet_reader_fake.h"
-
-#include <lib/fxl/logging.h>
-
-namespace modular {
-
-void ModuleFacetReaderFake::SetGetModuleManifestSink(
-    std::function<void(const std::string&, GetModuleManifestCallback)> sink) {
-  sink_ = sink;
-}
-
-void ModuleFacetReaderFake::GetModuleManifest(
-    const std::string& module_url, GetModuleManifestCallback callback) {
-  if (sink_) {
-    sink_(module_url, callback);
-  } else {
-    callback({});
-  }
-}
-
-}  // namespace modular
diff --git a/lib/testing/module_facet_reader_fake.h b/lib/testing/module_facet_reader_fake.h
deleted file mode 100644
index 7774b23..0000000
--- a/lib/testing/module_facet_reader_fake.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_MODULE_FACET_READER_FAKE_H_
-#define PERIDOT_LIB_TESTING_MODULE_FACET_READER_FAKE_H_
-
-#include "peridot/lib/module_manifest/module_facet_reader.h"
-
-#include <functional>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-namespace modular {
-
-// A fake implementation of ModuleFacetReader used for testing. Use |set_sink()|
-// to capture GetModuleManifest calls.
-class ModuleFacetReaderFake : public ModuleFacetReader {
- public:
-  // Call this method to supply a sink for
-  // ModuleFacetReader.GetModuleManifest().
-  void SetGetModuleManifestSink(
-      std::function<void(const std::string&, GetModuleManifestCallback)> sink);
-
- private:
-  // |modular::ModuleFacetReader|
-  void GetModuleManifest(const std::string& module_url,
-                         GetModuleManifestCallback) override;
-
-  std::function<void(const std::string&, GetModuleManifestCallback)> sink_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_MODULE_FACET_READER_FAKE_H_
diff --git a/lib/testing/module_resolver_fake.cc b/lib/testing/module_resolver_fake.cc
deleted file mode 100644
index 12125f4..0000000
--- a/lib/testing/module_resolver_fake.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/testing/module_resolver_fake.h"
-
-namespace modular {
-
-ModuleResolverFake::ModuleResolverFake() {
-  find_modules_response_.results.resize(0);
-}
-
-ModuleResolverFake::~ModuleResolverFake() = default;
-
-void ModuleResolverFake::SetStatus(fuchsia::modular::FindModulesStatus status) {
-  find_modules_response_.status = status;
-}
-
-void ModuleResolverFake::FindModules(fuchsia::modular::FindModulesQuery query,
-                                     FindModulesCallback callback) {
-  if (find_modules_validate_fn_) {
-    find_modules_validate_fn_(query);
-  }
-  callback(std::move(find_modules_response_));
-}
-
-void ModuleResolverFake::GetModuleManifest(std::string module_id,
-                                           GetModuleManifestCallback callback) {
-  if (get_module_manifest_validate_fn_) {
-    get_module_manifest_validate_fn_(module_id);
-  }
-  callback(std::move(manifest_));
-}
-
-void ModuleResolverFake::FindModulesByTypes(
-    fuchsia::modular::FindModulesByTypesQuery query,
-    FindModulesByTypesCallback callback) {}
-
-void ModuleResolverFake::Connect(
-    fidl::InterfaceRequest<fuchsia::modular::ModuleResolver> request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void ModuleResolverFake::SetManifest(
-    fuchsia::modular::ModuleManifestPtr manifest) {
-  manifest_ = std::move(manifest);
-}
-
-void ModuleResolverFake::AddFindModulesResult(
-    fuchsia::modular::FindModulesResult result) {
-  find_modules_response_.results.push_back(std::move(result));
-}
-
-void ModuleResolverFake::SetFindModulesValidation(
-    std::function<void(const fuchsia::modular::FindModulesQuery&)> fn) {
-  find_modules_validate_fn_ = std::move(fn);
-}
-
-void ModuleResolverFake::SetGetModuleManifestValidation(
-    std::function<void(const fidl::StringPtr&)> fn) {
-  get_module_manifest_validate_fn_ = std::move(fn);
-}
-
-}  // namespace modular
diff --git a/lib/testing/module_resolver_fake.h b/lib/testing/module_resolver_fake.h
deleted file mode 100644
index 73b967e..0000000
--- a/lib/testing/module_resolver_fake.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_MODULE_RESOLVER_FAKE_H_
-#define PERIDOT_LIB_TESTING_MODULE_RESOLVER_FAKE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-
-namespace modular {
-
-class ModuleResolverFake : fuchsia::modular::ModuleResolver {
- public:
-  ModuleResolverFake();
-  ~ModuleResolverFake() override;
-
-  // |ModuleResolver|
-  void FindModules(fuchsia::modular::FindModulesQuery query,
-                   FindModulesCallback callback) override;
-
-  // |ModuleResolver|
-  void GetModuleManifest(std::string module_id,
-                         GetModuleManifestCallback callback) override;
-
-  // |ModuleResolver|
-  void FindModulesByTypes(fuchsia::modular::FindModulesByTypesQuery query,
-                          FindModulesByTypesCallback callback) override;
-
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::modular::ModuleResolver> request);
-
-  // Sets the manifest for GetModuleManifest.
-  void SetManifest(fuchsia::modular::ModuleManifestPtr manifest);
-
-  // Sets the status for FindModules response.
-  void SetStatus(fuchsia::modular::FindModulesStatus status);
-
-  // Adds a result to the FindModules response.
-  void AddFindModulesResult(fuchsia::modular::FindModulesResult result);
-
-  // Sets a function for validation of the query when calling FindModules. This
-  // is useful to intercept the query and ensure it was built as expected.
-  void SetFindModulesValidation(
-      std::function<void(const fuchsia::modular::FindModulesQuery&)> fn);
-
-  // Sets a function for validation of the query when calling GetModuleManifest.
-  // This is useful to intercept the query and ensure it was built as expected.
-  void SetGetModuleManifestValidation(
-      std::function<void(const fidl::StringPtr&)> fn);
-
- private:
-  fidl::BindingSet<fuchsia::modular::ModuleResolver> bindings_;
-  std::function<void(const fuchsia::modular::FindModulesQuery&)>
-      find_modules_validate_fn_;
-  std::function<void(const fidl::StringPtr&)> get_module_manifest_validate_fn_;
-  fuchsia::modular::ModuleManifestPtr manifest_;
-  fuchsia::modular::FindModulesResponse find_modules_response_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_MODULE_RESOLVER_FAKE_H_
diff --git a/lib/testing/session_shell_base.h b/lib/testing/session_shell_base.h
deleted file mode 100644
index f800523..0000000
--- a/lib/testing/session_shell_base.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_SESSION_SHELL_BASE_H_
-#define PERIDOT_LIB_TESTING_SESSION_SHELL_BASE_H_
-
-#include "peridot/lib/testing/component_base.h"
-#include "peridot/lib/testing/session_shell_impl.h"
-
-namespace modular {
-namespace testing {
-
-class SessionShellBase : public ComponentBase<void> {
- public:
-  SessionShellBase(component::StartupContext* const startup_context) :
-      ComponentBase(startup_context) {
-    startup_context->ConnectToEnvironmentService(
-        session_shell_context_.NewRequest());
-
-    session_shell_context_->GetStoryProvider(
-        story_provider_.NewRequest());
-
-    startup_context->outgoing().AddPublicService(
-        session_shell_impl_.GetHandler());
-  }
-
- protected:
-  modular::testing::SessionShellImpl* session_shell_impl() {
-    return &session_shell_impl_;
-  }
-
-  fuchsia::modular::SessionShellContext* session_shell_context() {
-    return session_shell_context_.get();
-  }
-
-  fuchsia::modular::StoryProvider* story_provider() {
-    return story_provider_.get();
-  }
-
- private:
-  modular::testing::SessionShellImpl session_shell_impl_;
-  fuchsia::modular::SessionShellContextPtr session_shell_context_;
-  fuchsia::modular::StoryProviderPtr story_provider_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SessionShellBase);
-};
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_SESSION_SHELL_BASE_H_
diff --git a/lib/testing/session_shell_impl.cc b/lib/testing/session_shell_impl.cc
deleted file mode 100644
index ac09240..0000000
--- a/lib/testing/session_shell_impl.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/testing/session_shell_impl.h"
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-
-namespace modular {
-namespace testing {
-
-SessionShellImpl::SessionShellImpl() = default;
-SessionShellImpl::~SessionShellImpl() = default;
-
-fidl::InterfaceRequestHandler<fuchsia::modular::SessionShell> SessionShellImpl::GetHandler() {
-  return bindings_.GetHandler(this);
-}
-
-// |SessionShell|
-void SessionShellImpl::AttachView(fuchsia::modular::ViewIdentifier view_id,
-                                  fidl::InterfaceHandle<fuchsia::ui::viewsv1token::ViewOwner>
-                                  view_owner) {
-  on_attach_view_(std::move(view_id));
-}
-
-// |SessionShell|
-void SessionShellImpl::DetachView(fuchsia::modular::ViewIdentifier view_id,
-                                  std::function<void()> done) {
-  on_detach_view_(std::move(view_id));
-
-  // Used to simulate a sluggish shell that hits the timeout.
-  async::PostDelayedTask(async_get_default_dispatcher(),
-                         std::move(done), detach_delay_);
-}
-
-}  // namespace testing
-}  // namespace modular
diff --git a/lib/testing/session_shell_impl.h b/lib/testing/session_shell_impl.h
deleted file mode 100644
index 1a1a51f..0000000
--- a/lib/testing/session_shell_impl.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_SESSION_SHELL_IMPL_H_
-#define PERIDOT_LIB_TESTING_SESSION_SHELL_IMPL_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/time/time_delta.h>
-
-namespace modular {
-namespace testing {
-
-// An implementation of the fuchsia.modular.SessionShell FIDL service, to be
-// used in session shell components in integration tests. Usually used through
-// SessionShellBase.
-class SessionShellImpl : fuchsia::modular::SessionShell {
- public:
-  SessionShellImpl();
-  ~SessionShellImpl() override;
-
-  using ViewId = fuchsia::modular::ViewIdentifier;
-
-  // Produces a handler function that can be used in the outgoing service
-  // provider.
-  fidl::InterfaceRequestHandler<fuchsia::modular::SessionShell> GetHandler();
-
-  // Whenever SessionShell.AttachView() is called, the supplied callback is
-  // invoked with the view ID. The ViewOwner is dropped.
-  void set_on_attach_view(std::function<void(ViewId view_id)> callback) {
-    on_attach_view_ = std::move(callback);
-  }
-
-  // Whenever SessionShell.DetachView() is called, the supplied callback is
-  // invoked with the view ID. The return callback of DetachView() is invoked
-  // asynchronously after a delay that can be configured by the client with
-  // set_detach_delay().
-  void set_on_detach_view(std::function<void(ViewId view_id)> callback) {
-    on_detach_view_ = std::move(callback);
-  }
-
-  // Configures the delay after which the return callback of DetachView() is
-  // invoked. Used to test the timeout behavior of sessionmgr.
-  void set_detach_delay(zx::duration detach_delay) {
-    detach_delay_ = std::move(detach_delay);
-  }
-
- private:
-  // |SessionShell|
-  void AttachView(fuchsia::modular::ViewIdentifier view_id,
-                  fidl::InterfaceHandle<fuchsia::ui::viewsv1token::ViewOwner>
-                  view_owner) override;
-
-  // |SessionShell|
-  void DetachView(fuchsia::modular::ViewIdentifier view_id,
-                  std::function<void()> done) override;
-
-  fidl::BindingSet<fuchsia::modular::SessionShell> bindings_;
-  std::function<void(ViewId view_id)> on_attach_view_{[](ViewId) {}};
-  std::function<void(ViewId view_id)> on_detach_view_{[](ViewId) {}};
-  zx::duration detach_delay_{};
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(SessionShellImpl);
-};
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_SESSION_SHELL_IMPL_H_
diff --git a/lib/testing/story_controller_mock.h b/lib/testing/story_controller_mock.h
deleted file mode 100644
index 0230aa8..0000000
--- a/lib/testing/story_controller_mock.h
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_STORY_CONTROLLER_MOCK_H_
-#define PERIDOT_LIB_TESTING_STORY_CONTROLLER_MOCK_H_
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-
-namespace modular {
-
-class StoryControllerMock : public fuchsia::modular::StoryController {
- public:
-  StoryControllerMock() {}
-
-  struct GetLinkCall {
-    fuchsia::modular::LinkPath link_path;
-  };
-  std::vector<GetLinkCall> get_link_calls;
-
- private:
-  // |fuchsia::modular::StoryController|
-  void GetInfo(GetInfoCallback callback) override {
-    fuchsia::modular::StoryInfo info;
-    info.id = "wow";
-    info.url = "wow";
-    callback(std::move(info), fuchsia::modular::StoryState::STOPPED);
-  }
-
-  // |fuchsia::modular::StoryController|
-  void RequestStart() override {
-    FXL_NOTIMPLEMENTED();
-  }
-
-  // |fuchsia::modular::StoryController|
-  void Stop(StopCallback done) override {
-    FXL_NOTIMPLEMENTED();
-  }
-
-  // |fuchsia::modular::StoryController|
-  void TakeAndLoadSnapshot(
-      fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> request,
-      TakeAndLoadSnapshotCallback done) override {
-    FXL_NOTIMPLEMENTED();
-  }
-
-  // |fuchsia::modular::StoryController|
-  void Watch(
-      fidl::InterfaceHandle<fuchsia::modular::StoryWatcher> watcher) override {
-    FXL_NOTIMPLEMENTED();
-  }
-
-  // |fuchsia::modular::StoryController|
-  void GetActiveModules(GetActiveModulesCallback callback) override {
-    FXL_NOTIMPLEMENTED();
-  }
-
-  // |fuchsia::modular::StoryController|
-  void GetModules(GetModulesCallback callback) override {
-    FXL_NOTIMPLEMENTED();
-  }
-
-  // |fuchsia::modular::StoryController|
-  void GetModuleController(
-      std::vector<std::string> module_path,
-      fidl::InterfaceRequest<fuchsia::modular::ModuleController> request)
-      override {
-    FXL_NOTIMPLEMENTED();
-  }
-
-  // |fuchsia::modular::StoryController|
-  void GetActiveLinks(
-      fidl::InterfaceHandle<fuchsia::modular::StoryLinksWatcher> watcher,
-      GetActiveLinksCallback callback) override {
-    FXL_NOTIMPLEMENTED();
-  }
-
-  // |fuchsia::modular::StoryController|
-  void GetLink(
-      fuchsia::modular::LinkPath link_path,
-      fidl::InterfaceRequest<fuchsia::modular::Link> request) override {
-    GetLinkCall call{std::move(link_path)};
-    get_link_calls.push_back(std::move(call));
-  }
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryControllerMock);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_STORY_CONTROLLER_MOCK_H_
diff --git a/lib/testing/story_provider_mock.h b/lib/testing/story_provider_mock.h
deleted file mode 100644
index b799712..0000000
--- a/lib/testing/story_provider_mock.h
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_STORY_PROVIDER_MOCK_H_
-#define PERIDOT_LIB_TESTING_STORY_PROVIDER_MOCK_H_
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/interface_ptr_set.h>
-
-#include "peridot/lib/testing/story_controller_mock.h"
-
-namespace modular {
-
-class StoryProviderMock : public fuchsia::modular::StoryProvider {
- public:
-  // Allows notification of watchers.
-  void NotifyStoryChanged(
-      fuchsia::modular::StoryInfo story_info,
-      fuchsia::modular::StoryState story_state,
-      fuchsia::modular::StoryVisibilityState story_visibility_state) {
-    for (const auto& watcher : watchers_.ptrs()) {
-      fuchsia::modular::StoryInfo story_info_clone;
-      fidl::Clone(story_info, &story_info_clone);
-      (*watcher)->OnChange(std::move(story_info_clone), story_state,
-                           story_visibility_state);
-    }
-  }
-
-  const StoryControllerMock& story_controller() const {
-    return controller_mock_;
-  }
-
-  const std::string& last_created_story() const { return last_created_story_; }
-
-  const std::string& last_created_kind_of_story() const {
-    return last_created_kind_of_proto_story_;
-  }
-
-  const std::string& deleted_story() const { return deleted_story_; }
-
- private:
-  // |fuchsia::modular::StoryProvider|
-  void GetStories(
-      fidl::InterfaceHandle<fuchsia::modular::StoryProviderWatcher> watcher,
-      GetStoriesCallback callback) override {
-    std::vector<fuchsia::modular::StoryInfo> stories;
-    callback(std::move(stories));
-  }
-
-  // |fuchsia::modular::StoryProvider|
-  void Watch(fidl::InterfaceHandle<fuchsia::modular::StoryProviderWatcher>
-                 watcher) override {
-    watchers_.AddInterfacePtr(watcher.Bind());
-  }
-
-  // |fuchsia::modular::StoryProvider|
-  void WatchActivity(
-      fidl::InterfaceHandle<fuchsia::modular::StoryActivityWatcher> watcher)
-      override {
-    activity_watchers_.AddInterfacePtr(watcher.Bind());
-  }
-
-  // |fuchsia::modular::StoryProvider|
-  void GetStoryInfo(std::string story_id,
-                    GetStoryInfoCallback callback) override {
-    callback(nullptr);
-  }
-
-  // |fuchsia::modular::StoryProvider|
-  void GetController(std::string story_id,
-                     fidl::InterfaceRequest<fuchsia::modular::StoryController>
-                         story) override {
-    binding_set_.AddBinding(&controller_mock_, std::move(story));
-  }
-
-  // |fuchsia::modular::StoryProvider|
-  void PreviousStories(PreviousStoriesCallback callback) override {
-    callback(std::vector<fuchsia::modular::StoryInfo>());
-  }
-
-  std::string last_created_story_;
-  std::string last_created_kind_of_proto_story_;
-  std::string deleted_story_;
-  StoryControllerMock controller_mock_;
-  fidl::BindingSet<fuchsia::modular::StoryController> binding_set_;
-  fidl::InterfacePtrSet<fuchsia::modular::StoryProviderWatcher> watchers_;
-  fidl::InterfacePtrSet<fuchsia::modular::StoryActivityWatcher>
-      activity_watchers_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_STORY_PROVIDER_MOCK_H_
diff --git a/lib/testing/test_driver.h b/lib/testing/test_driver.h
deleted file mode 100644
index b805886..0000000
--- a/lib/testing/test_driver.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_TEST_DRIVER_H_
-#define PERIDOT_LIB_TESTING_TEST_DRIVER_H_
-
-// Header for definitions for Link communication with a test driver module.
-namespace modular {
-namespace testing {
-
-// This URL is used in a test driver module as the path in a link. Its value is
-// used to determine the URL for a sub-module to launch for integration testing.
-constexpr char kModuleUnderTestPath[] = "module_under_test";
-
-// This URL is used in a test driver module as the path in a link.  Its value is
-// used to determine the URL for a test driver script that will be used for
-// integration testing against the mod run in |kModuleUnderTestPath|
-constexpr char kTestDriverPath[] = "test_driver_url";
-
-constexpr char kTestDriverLinkName[] = "test_driver_module";
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_TEST_DRIVER_H_
diff --git a/lib/testing/test_story_command_executor.cc b/lib/testing/test_story_command_executor.cc
deleted file mode 100644
index 68b5509..0000000
--- a/lib/testing/test_story_command_executor.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#include "peridot/lib/testing/test_story_command_executor.h"
-
-namespace modular {
-namespace testing {
-
-void TestStoryCommandExecutor::SetExecuteReturnResult(
-    fuchsia::modular::ExecuteStatus status, fidl::StringPtr error_message) {
-  result_.status = status;
-  result_.error_message = error_message;
-}
-
-void TestStoryCommandExecutor::Reset() {
-  last_story_id_.reset();
-  last_commands_.clear();
-  execute_count_ = 0;
-}
-
-void TestStoryCommandExecutor::ExecuteCommandsInternal(
-    fidl::StringPtr story_id,
-    std::vector<fuchsia::modular::StoryCommand> commands,
-    std::function<void(fuchsia::modular::ExecuteResult)> done) {
-  ++execute_count_;
-  last_story_id_ = story_id;
-  last_commands_ = std::move(commands);
-  fuchsia::modular::ExecuteResult result;
-  fidl::Clone(result_, &result);
-  result.story_id = story_id;
-  done(std::move(result));
-}
-
-}  // namespace testing
-}  // namespace modular
diff --git a/lib/testing/test_story_command_executor.h b/lib/testing/test_story_command_executor.h
deleted file mode 100644
index acf44e0..0000000
--- a/lib/testing/test_story_command_executor.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_TEST_STORY_COMMAND_EXECUTOR_H_
-#define PERIDOT_LIB_TESTING_TEST_STORY_COMMAND_EXECUTOR_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <vector>
-#include "peridot/bin/sessionmgr/puppet_master/story_command_executor.h"
-
-namespace modular {
-namespace testing {
-
-class TestStoryCommandExecutor : public StoryCommandExecutor {
- public:
-  void SetExecuteReturnResult(fuchsia::modular::ExecuteStatus status,
-                              fidl::StringPtr error_message);
-
-  void Reset();
-
-  int execute_count() const { return execute_count_; }
-  fidl::StringPtr last_story_id() const { return last_story_id_; }
-  const std::vector<fuchsia::modular::StoryCommand>& last_commands() const {
-    return last_commands_;
-  }
-
- private:
-  // |StoryCommandExecutor|
-  void ExecuteCommandsInternal(
-      fidl::StringPtr story_id,
-      std::vector<fuchsia::modular::StoryCommand> commands,
-      std::function<void(fuchsia::modular::ExecuteResult)> done) override;
-
-  int execute_count_{0};
-  fidl::StringPtr last_story_id_;
-  std::vector<fuchsia::modular::StoryCommand> last_commands_;
-  fuchsia::modular::ExecuteResult result_;
-};
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_TEST_STORY_COMMAND_EXECUTOR_H_
diff --git a/lib/testing/test_with_ledger.cc b/lib/testing/test_with_ledger.cc
deleted file mode 100644
index ce56393..0000000
--- a/lib/testing/test_with_ledger.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/testing/test_with_ledger.h"
-
-#include <lib/fit/function.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/ledger_client/ledger_client.h"
-
-namespace modular {
-namespace testing {
-
-TestWithLedger::TestWithLedger() = default;
-TestWithLedger::~TestWithLedger() = default;
-
-void TestWithLedger::SetUp() {
-  RealLoopFixture::SetUp();
-
-  ledger_app_ = std::make_unique<testing::LedgerRepositoryForTesting>();
-
-  ledger_client_ = std::make_unique<LedgerClient>(
-      ledger_app_->ledger_repository(), __FILE__, [] { ASSERT_TRUE(false); });
-}
-
-void TestWithLedger::TearDown() {
-  ledger_client_.reset();
-
-  bool terminated = false;
-  ledger_app_->Terminate([&terminated] { terminated = true; });
-  if (!terminated) {
-    RunLoopWithTimeoutOrUntil([&terminated] { return terminated; });
-  }
-
-  ledger_app_.reset();
-
-  RealLoopFixture::TearDown();
-}
-
-bool TestWithLedger::RunLoopWithTimeout(zx::duration timeout) {
-  return RealLoopFixture::RunLoopWithTimeout(timeout);
-}
-
-bool TestWithLedger::RunLoopWithTimeoutOrUntil(fit::function<bool()> condition,
-                                               zx::duration timeout) {
-  return RealLoopFixture::RunLoopWithTimeoutOrUntil(std::move(condition),
-                                                    timeout);
-}
-
-}  // namespace testing
-}  // namespace modular
diff --git a/lib/testing/test_with_ledger.h b/lib/testing/test_with_ledger.h
deleted file mode 100644
index 0c91a48..0000000
--- a/lib/testing/test_with_ledger.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_TEST_WITH_LEDGER_H_
-#define PERIDOT_LIB_TESTING_TEST_WITH_LEDGER_H_
-
-#include <memory>
-
-#include <lib/fit/function.h>
-#include <lib/gtest/real_loop_fixture.h>
-
-#include "peridot/lib/testing/ledger_repository_for_testing.h"
-
-namespace modular {
-class LedgerClient;
-
-namespace testing {
-
-// A test fixture class for a test case that needs a ledger repository, ledger,
-// ledger client, or ledger page. This fixture sets up a ledger repository and a
-// ledger client in SetUp() and erases the repository and stops the ledger in
-// TearDown(). This also runs a message loop, which is required to interact with
-// the ledger through fidl calls.
-//
-// The ledger client is available to the test case and its fixture through the
-// ledger_client() getter, the ledger repository through ledger_repository().
-//
-// A fixture class that extends this fixture and has its own SetUp() and
-// TearDown() must call this fixture's SetUp() and TearDown().
-class TestWithLedger : public gtest::RealLoopFixture {
- public:
-  TestWithLedger();
-  ~TestWithLedger() override;
-
-  void SetUp() override;
-  void TearDown() override;
-
- protected:
-  fuchsia::ledger::internal::LedgerRepository* ledger_repository() {
-    return ledger_app_->ledger_repository();
-  }
-  LedgerClient* ledger_client() { return ledger_client_.get(); }
-
-  // Increases default timeout over plain test with message loop, because
-  // methods executing on the message loop are real fidl calls.
-  //
-  // Test cases involving ledger calls take about 300ms when running in CI.
-  // Occasionally, however, they take much longer, presumably because of load on
-  // shared machines. With the default timeout of RealLoopFixture of 1s, we
-  // see flakiness. Cf. FW-287.
-  bool RunLoopWithTimeout(zx::duration timeout = zx::sec(10));
-  bool RunLoopWithTimeoutOrUntil(fit::function<bool()> condition,
-                                 zx::duration timeout = zx::sec(10));
-
- private:
-  std::unique_ptr<testing::LedgerRepositoryForTesting> ledger_app_;
-  std::unique_ptr<LedgerClient> ledger_client_;
-};
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_TEST_WITH_LEDGER_H_
diff --git a/lib/testing/test_with_session_storage.cc b/lib/testing/test_with_session_storage.cc
deleted file mode 100644
index 67a0d25..0000000
--- a/lib/testing/test_with_session_storage.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/testing/test_with_session_storage.h"
-
-namespace modular {
-namespace testing {
-
-TestWithSessionStorage::TestWithSessionStorage() = default;
-TestWithSessionStorage::~TestWithSessionStorage() = default;
-
-std::unique_ptr<SessionStorage> TestWithSessionStorage::MakeSessionStorage(
-    std::string ledger_page) {
-  auto page_id = MakePageId(ledger_page);
-  return std::make_unique<SessionStorage>(ledger_client(), page_id);
-}
-
-std::unique_ptr<StoryStorage> TestWithSessionStorage::GetStoryStorage(
-    SessionStorage* const storage, std::string story_id) {
-  std::unique_ptr<StoryStorage> story_storage;
-  bool done{};
-  storage->GetStoryStorage(story_id)->Then(
-      [&](std::unique_ptr<StoryStorage> result) {
-        FXL_DCHECK(result);
-        story_storage = std::move(result);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-
-  return story_storage;
-}
-
-fidl::StringPtr TestWithSessionStorage::CreateStory(
-    SessionStorage* const storage) {
-  auto future_story =
-      storage->CreateStory(nullptr /* extra */, {} /* story_options */);
-  bool done{};
-  fidl::StringPtr story_id;
-  future_story->Then([&](fidl::StringPtr id, fuchsia::ledger::PageId) {
-    done = true;
-    story_id = std::move(id);
-  });
-  RunLoopUntil([&] { return done; });
-
-  return story_id;
-}
-
-void TestWithSessionStorage::SetLinkValue(StoryStorage* const story_storage,
-                                          const std::string& link_name,
-                                          const std::string& link_value) {
-  SetLinkValue(story_storage, MakeLinkPath(link_name), link_value);
-}
-
-void TestWithSessionStorage::SetLinkValue(
-    StoryStorage* const story_storage,
-    const fuchsia::modular::LinkPath& link_path,
-    const std::string& link_value) {
-  bool done{};
-  int context;
-  story_storage
-      ->UpdateLinkValue(link_path,
-                        [&](fidl::StringPtr* value) { *value = link_value; },
-                        &context)
-      ->Then([&](StoryStorage::Status status) {
-        ASSERT_EQ(status, StoryStorage::Status::OK);
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-}
-
-void TestWithSessionStorage::WriteModuleData(
-    StoryStorage* const story_storage,
-    fuchsia::modular::ModuleData module_data) {
-  bool done{};
-  story_storage->WriteModuleData(std::move(module_data))->Then([&] {
-    done = true;
-  });
-  RunLoopUntil([&] { return done; });
-}
-
-std::string TestWithSessionStorage::GetLinkValue(
-    StoryStorage* const story_storage, const std::string& link_name) {
-  return GetLinkValue(story_storage, MakeLinkPath(link_name));
-}
-
-std::string TestWithSessionStorage::GetLinkValue(
-    StoryStorage* const story_storage, const fuchsia::modular::LinkPath& path) {
-  bool done{};
-  std::string value;
-  story_storage->GetLinkValue(path)->Then(
-      [&](StoryStorage::Status status, fidl::StringPtr v) {
-        value = *v;
-        done = true;
-      });
-  RunLoopUntil([&] { return done; });
-  return value;
-}
-
-fuchsia::modular::LinkPath TestWithSessionStorage::MakeLinkPath(
-    const std::string& name) {
-  fuchsia::modular::LinkPath path;
-  path.link_name = name;
-  return path;
-}
-
-}  // namespace testing
-}  // namespace modular
diff --git a/lib/testing/test_with_session_storage.h b/lib/testing/test_with_session_storage.h
deleted file mode 100644
index 53f20fa..0000000
--- a/lib/testing/test_with_session_storage.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_TEST_WITH_SESSION_STORAGE_H_
-#define PERIDOT_LIB_TESTING_TEST_WITH_SESSION_STORAGE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/bin/sessionmgr/storage/session_storage.h"
-#include "peridot/bin/sessionmgr/storage/story_storage.h"
-#include "peridot/lib/ledger_client/page_id.h"
-#include "peridot/lib/testing/test_with_ledger.h"
-
-namespace modular {
-namespace testing {
-
-class TestWithSessionStorage : public testing::TestWithLedger {
- public:
-  TestWithSessionStorage();
-  ~TestWithSessionStorage() override;
-
- protected:
-  std::unique_ptr<SessionStorage> MakeSessionStorage(std::string ledger_page);
-
-  std::unique_ptr<StoryStorage> GetStoryStorage(SessionStorage* const storage,
-                                                std::string story_id);
-
-  fidl::StringPtr CreateStory(SessionStorage* const storage);
-
-  void SetLinkValue(StoryStorage* const story_storage,
-                    const std::string& link_name,
-                    const std::string& link_value);
-
-  void SetLinkValue(StoryStorage* const story_storage,
-                    const fuchsia::modular::LinkPath& link_path,
-                    const std::string& link_value);
-
-  void WriteModuleData(StoryStorage* const story_storage,
-                       fuchsia::modular::ModuleData module_data);
-
-  std::string GetLinkValue(StoryStorage* const story_storage,
-                           const fuchsia::modular::LinkPath& path);
-
-  std::string GetLinkValue(StoryStorage* const story_storage,
-                           const std::string& link_name);
-
-  fuchsia::modular::LinkPath MakeLinkPath(const std::string& name);
-};
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_TESTING_TEST_WITH_SESSION_STORAGE_H_
diff --git a/lib/testing/wait_until_idle.h b/lib/testing/wait_until_idle.h
deleted file mode 100644
index 6c0c770..0000000
--- a/lib/testing/wait_until_idle.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_TESTING_WAIT_UNTIL_IDLE_H_
-#define PERIDOT_LIB_TESTING_WAIT_UNTIL_IDLE_H_
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/fidl/cpp/interface_ptr.h>
-
-#include "gtest/gtest.h"
-
-namespace util {
-
-// Convenience invocation of a debug FIDL interface's |WaitUntilIdle() => ()|
-// function. This wrapper includes the necessary logic to run the message loop
-// while waiting and drain any coincident messages afterwards. It also adds an
-// error handler on the debug interface pointer provided, and clears it
-// afterwards.
-template <class Interface>
-void WaitUntilIdle(fidl::InterfacePtr<Interface>* debug_interface_ptr,
-                   async::Loop* loop) {
-  debug_interface_ptr->set_error_handler([loop](zx_status_t status) {
-    loop->Quit();
-    ADD_FAILURE() << Interface::Name_
-                  << " disconnected (check app logs for crash)";
-  });
-
-  // We can't just use a synchronous ptr or
-  // |fidl::InterfacePtr::WaitForResponse| because those don't run the message
-  // loop while they wait.
-  (*debug_interface_ptr)->WaitUntilIdle([loop] { loop->Quit(); });
-  loop->Run();
-  loop->ResetQuit();
-  // Finish processing any remaining messages.
-  loop->RunUntilIdle();
-  loop->ResetQuit();
-
-  debug_interface_ptr->set_error_handler(nullptr);
-}
-
-}  // namespace util
-
-#endif  // PERIDOT_LIB_TESTING_WAIT_UNTIL_IDLE_H_
diff --git a/lib/util/BUILD.gn b/lib/util/BUILD.gn
deleted file mode 100644
index 23748fe..0000000
--- a/lib/util/BUILD.gn
+++ /dev/null
@@ -1,76 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("debug") {
-  sources = [
-    "debug.h",
-  ]
-}
-
-source_set("filesystem") {
-  sources = [
-    "filesystem.cc",
-    "filesystem.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-source_set("rate_limited_retry") {
-  sources = [
-    "rate_limited_retry.cc",
-    "rate_limited_retry.h",
-  ]
-
-  public_deps = [
-    "//zircon/public/lib/zx",
-  ]
-}
-
-source_set("util") {
-  sources = [
-    "string_escape.cc",
-    "string_escape.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-source_set("ptr") {
-  sources = [
-    "ptr.h",
-  ]
-}
-
-source_set("unittests") {
-  testonly = true
-
-  sources = [
-    "string_escape_unittest.cc",
-  ]
-
-  public_deps = [
-    ":util",
-    "//garnet/public/lib/fxl",
-    "//third_party/googletest:gtest",
-  ]
-}
-
-source_set("idle_waiter") {
-  sources = [
-    "idle_waiter.cc",
-    "idle_waiter.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//zircon/public/lib/async-cpp",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
diff --git a/lib/util/debug.h b/lib/util/debug.h
deleted file mode 100644
index 866b524..0000000
--- a/lib/util/debug.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_UTIL_DEBUG_H_
-#define PERIDOT_LIB_UTIL_DEBUG_H_
-
-#include <ostream>
-#include <string>
-
-namespace modular {
-
-// When debugging multiple copies of an object (such as Links), this creates a
-// printable id to disambiguate them
-inline std::string GetDebugId(void* p) {
-  std::ostringstream stream;
-  stream << std::hex << ((uint64_t)p & 0x0fff) << " ";
-  return stream.str();
-}
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_UTIL_DEBUG_H_
diff --git a/lib/util/filesystem.cc b/lib/util/filesystem.cc
deleted file mode 100644
index 295df85..0000000
--- a/lib/util/filesystem.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/util/filesystem.h"
-
-#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
-#include <memory>
-#include <utility>
-
-#include <fbl/unique_fd.h>
-#include <fuchsia/io/c/fidl.h>
-#include <lib/fxl/files/file.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_printf.h>
-#include <lib/fxl/strings/string_view.h>
-#include <lib/fzl/fdio.h>
-#include <lib/zx/time.h>
-#include <zircon/device/vfs.h>
-#include <zircon/syscalls.h>
-
-namespace modular {
-
-// For polling minfs.
-constexpr fxl::StringView kPersistentFileSystem = "/data";
-constexpr fxl::StringView kMinFsName = "minfs";
-constexpr zx::duration kMaxPollingDelay = zx::sec(10);
-
-void WaitForMinfs() {
-  auto delay = zx::msec(10);
-  zx::time now = zx::clock::get_monotonic();
-  while (zx::clock::get_monotonic() - now < kMaxPollingDelay) {
-    fbl::unique_fd fd(open(kPersistentFileSystem.data(), O_RDONLY));
-    if (fd.is_valid()) {
-      fuchsia_io_FilesystemInfo info;
-      zx_status_t status, io_status;
-      fzl::FdioCaller caller{std::move(fd)};
-      io_status = fuchsia_io_DirectoryAdminQueryFilesystem(
-          caller.borrow_channel(), &status, &info);
-      if (io_status == ZX_OK && status == ZX_OK) {
-        const char* name = reinterpret_cast<const char*>(info.name);
-        fxl::StringView fs_name(name,
-                                strnlen(name, fuchsia_io_MAX_FS_NAME_BUFFER));
-        if (fs_name == kMinFsName) {
-          return;
-        }
-      }
-    }
-
-    usleep(delay.to_usecs());
-    delay = delay * 2;
-  }
-
-  FXL_LOG(WARNING) << kPersistentFileSystem
-                   << " is not persistent. Did you forget to configure it?";
-}
-
-}  // namespace modular
diff --git a/lib/util/filesystem.h b/lib/util/filesystem.h
deleted file mode 100644
index 1e0407e..0000000
--- a/lib/util/filesystem.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_UTIL_FILESYSTEM_H_
-#define PERIDOT_LIB_UTIL_FILESYSTEM_H_
-
-namespace modular {
-
-// Sleep until Minfs is mounted.
-void WaitForMinfs();
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_UTIL_FILESYSTEM_H_
diff --git a/lib/util/idle_waiter.cc b/lib/util/idle_waiter.cc
deleted file mode 100644
index e77f5c5..0000000
--- a/lib/util/idle_waiter.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/util/idle_waiter.h"
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/fxl/functional/closure.h>
-
-namespace util {
-
-IdleWaiter::Activity::Activity(fxl::WeakPtr<IdleWaiter> tracker)
-    : tracker_(tracker) {
-  tracker_->activity_ = this;
-}
-
-IdleWaiter::Activity::~Activity() {
-  if (tracker_) {
-    tracker_->activity_ = nullptr;
-    if (tracker_->loop_) {
-      tracker_->PostIdleCheck();
-    }
-  }
-}
-
-IdleWaiter::IdleWaiter() : weak_ptr_factory_(this) {}
-
-IdleWaiter::~IdleWaiter() = default;
-
-void IdleWaiter::SetLoop(async::Loop* loop) {
-  FXL_DCHECK(!loop_);
-  loop_ = loop;
-}
-
-IdleWaiter::ActivityToken IdleWaiter::RegisterOngoingActivity() {
-  // !loop_ for unit tests
-  FXL_DCHECK(!loop_ || loop_->dispatcher() == async_get_default_dispatcher());
-
-  if (activity_) {
-    return ActivityToken(activity_);
-  } else {
-    // |activity_| is set in the |Activity| constructor and cleared in
-    // the destructor
-    return fxl::MakeRefCounted<Activity>(weak_ptr_factory_.GetWeakPtr());
-  }
-}
-
-void IdleWaiter::WaitUntilIdle(fxl::Closure callback) {
-  callbacks_.push_back(std::move(callback));
-  PostIdleCheck();
-}
-
-void IdleWaiter::PostIdleCheck() {
-  FXL_DCHECK(loop_) << "No message loop set for debug features. If this is a "
-                       "unit test rather than an integration test, consider "
-                       "using //garnet/public/lib/gtest gtest::TestLoopFixture "
-                       "features instead.";
-
-  if (!(callbacks_.empty() || activity_ || idle_check_pending_)) {
-    FXL_DCHECK(loop_->dispatcher() == async_get_default_dispatcher());
-    loop_->Quit();
-    idle_check_pending_ = true;
-  }
-}
-
-bool IdleWaiter::FinishIdleCheck() {
-  if (idle_check_pending_) {
-    FXL_DCHECK(loop_ && loop_->dispatcher() == async_get_default_dispatcher());
-    loop_->RunUntilIdle();
-    loop_->ResetQuit();
-    if (!activity_) {
-      for (const auto& callback : callbacks_) {
-        callback();
-      }
-      callbacks_.clear();
-    }
-    // Otherwise, |PostIdleCheck| will be invoked again when |activity_| is
-    // released.
-
-    idle_check_pending_ = false;
-    return true;
-  } else {
-    return false;
-  }
-}
-
-}  // namespace util
diff --git a/lib/util/idle_waiter.h b/lib/util/idle_waiter.h
deleted file mode 100644
index 025bb88..0000000
--- a/lib/util/idle_waiter.h
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_UTIL_IDLE_WAITER_H_
-#define PERIDOT_LIB_UTIL_IDLE_WAITER_H_
-
-#include <vector>
-
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fxl/functional/closure.h>
-#include <lib/fxl/memory/ref_ptr.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-namespace util {
-
-// A utility class that exposes the |WaitUntilIdle| function, which invokes a
-// callback after all outstanding tasks (not including delayed tasks) have been
-// processed on a task queue and all user-instrumented asynchronous activities
-// have completed. This function is typically exposed on a service's debug FIDL
-// interface and used for test synchronization.
-//
-// This class is bound to a message loop using SetLoop(). Unbound
-// instances of this class may exist in unit tests.
-class IdleWaiter final {
- public:
-  class Activity : public fxl::RefCountedThreadSafe<Activity> {
-   public:
-    Activity(fxl::WeakPtr<IdleWaiter> tracker);
-    ~Activity();
-
-   private:
-    fxl::WeakPtr<IdleWaiter> tracker_;
-  };
-
-  using ActivityToken = fxl::RefPtr<Activity>;
-
-  IdleWaiter();
-  ~IdleWaiter();
-
-  void SetLoop(async::Loop* loop);
-  async::Loop* loop() const { return loop_; }
-
-  // Registers an ongoing activity which prevents this app from being
-  // considered idle. When the last copy of |ActivityToken| is destroyed, the
-  // activity is considered complete.
-  //
-  // |ActivityToken| should typically be captured in any lambda triggered while
-  // handling a call. It is not necessary to register an activity that completes
-  // synchronously.
-  //
-  // This method must be invoked on the thread that constructed |IdleWaiter|,
-  // and |ActivityToken| must be released on the same thread.
-  ActivityToken RegisterOngoingActivity();
-
-  // Checking for inactivity involves draining the message loop of ready tasks.
-  // Doing so must happen outside of the main message loop, so when the time
-  // comes for an idle check, this class escapes the main message loop with a
-  // quit task. When this happens, app main should call |FinishIdleCheck| and
-  // then resume the main message loop if it returns |true|.
-  //
-  // TODO(rosswang): Remove this requirement if |RunUntilIdle| is ever supported
-  //  from within an outer message loop.
-  bool FinishIdleCheck();
-
-  // Waits until the app has reached a steady state such that no further
-  // activity will occur unless acted upon from the outside:
-  // * when there are no ready tasks in the message loop; delayed tasks are not
-  //   included
-  // * when no outstanding copies of |ActivityToken|s created by
-  //   |RegisterOngoingActivity| are held by the instrumented app
-  void WaitUntilIdle(fxl::Closure callback);
-
- private:
-  // Idle checks must be performed outside of the main message loop, so
-  // |PostIdleCheck| escapes the main message loop with a quit task. See
-  // |FinishIdleCheck| for more information.
-  void PostIdleCheck();
-
-  async::Loop* loop_{};
-  std::vector<fxl::Closure> callbacks_;
-
-  Activity* activity_ = nullptr;
-  bool idle_check_pending_ = false;
-
-  fxl::WeakPtrFactory<IdleWaiter> weak_ptr_factory_;
-};
-
-}  // namespace util
-
-#endif  // PERIDOT_LIB_UTIL_IDLE_WAITER_H_
diff --git a/lib/util/ptr.h b/lib/util/ptr.h
deleted file mode 100644
index 6657314..0000000
--- a/lib/util/ptr.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_UTIL_PTR_H_
-#define PERIDOT_LIB_UTIL_PTR_H_
-
-#include <memory>
-
-namespace util {
-
-// Returns true if the provided std::unique_ptrs are both empty, or point to
-// equal objects. Returns false otherwise.
-template <typename T>
-bool EqualPtr(const std::unique_ptr<T>& lhs, const std::unique_ptr<T>& rhs) {
-  if (bool(lhs) != bool(rhs)) {
-    return false;
-  }
-  if (!lhs && !rhs) {
-    return true;
-  }
-  return *lhs == *rhs;
-}
-
-}  // namespace util
-
-#endif  // PERIDOT_LIB_UTIL_PTR_H_
diff --git a/lib/util/rate_limited_retry.cc b/lib/util/rate_limited_retry.cc
deleted file mode 100644
index 6866b5b..0000000
--- a/lib/util/rate_limited_retry.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/util/rate_limited_retry.h"
-
-namespace modular {
-
-RateLimitedRetry::RateLimitedRetry(const Threshold& threshold)
-    : threshold_(threshold), failure_series_count_(0) {}
-
-bool RateLimitedRetry::ShouldRetry() {
-  zx::time now = zx::clock::get_monotonic();
-  if (failure_series_count_ == 0 ||
-      now - failure_series_start_ >= threshold_.period) {
-    failure_series_start_ = now;
-    failure_series_count_ = 0;
-  }
-
-  if (failure_series_count_ >= threshold_.count) {
-    return false;
-  } else {
-    ++failure_series_count_;
-    return true;
-  }
-}
-
-}  // namespace modular
diff --git a/lib/util/rate_limited_retry.h b/lib/util/rate_limited_retry.h
deleted file mode 100644
index 0a44014..0000000
--- a/lib/util/rate_limited_retry.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_UTIL_RATE_LIMITED_RETRY_H_
-#define PERIDOT_LIB_UTIL_RATE_LIMITED_RETRY_H_
-
-#include <lib/zx/time.h>
-
-namespace modular {
-
-// Keeps track of a retry scheme where infinite retries are allowed unless an
-// operation fails many times in a short interval. This can be used to enable a
-// decent user experience in the face of a flaky dependency without undue churn
-// or log spamming if an unrecoverable failure has occurred.
-class RateLimitedRetry {
- public:
-  struct Threshold {
-    unsigned int count;
-    zx::duration period;
-  };
-
-  // Constructs a retry tracker where retry should occur as long as no more than
-  // |count| failures have occurred within a |period|.
-  //
-  // As an example, an allowance of 1 failure per second will allow retries if
-  // failures occur no more frequently than exactly once every second.
-  RateLimitedRetry(const Threshold& threshold);
-
-  // Call |ShouldRetry()| when the operation you are tracking fails, to
-  // determine whether a retry should be attempted. Returns |false| if
-  // |ShouldRetry()| has been called more than |count| times within a |period|.
-  bool ShouldRetry();
-
- private:
-  const Threshold threshold_;
-
-  unsigned int failure_series_count_;
-  zx::time failure_series_start_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_UTIL_RATE_LIMITED_RETRY_H_
diff --git a/lib/util/string_escape.cc b/lib/util/string_escape.cc
deleted file mode 100644
index 3c6f85b..0000000
--- a/lib/util/string_escape.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/util/string_escape.h"
-
-using fxl::StringView;
-
-namespace modular {
-
-std::string StringEscape(StringView input, StringView chars_to_escape,
-                         char escape_char) {
-  std::string output;
-  output.reserve(input.size());
-
-  for (const auto& c : input) {
-    if (chars_to_escape.find(c) != StringView::npos || c == escape_char) {
-      output.push_back(escape_char);
-    }
-    output.push_back(c);
-  }
-
-  return output;
-}
-
-std::string StringUnescape(StringView input, char escape_char) {
-  std::string output;
-
-  for (size_t i = 0; i < input.size(); i++) {
-    if (input[i] == escape_char) {
-      FXL_DCHECK(i != input.size() - 1)
-          << "StringUnescape: unescapable string: " << input;
-      if (i != input.size() - 1) {
-        i++;
-      }
-    }
-    output.push_back(input[i]);
-  }
-
-  return output;
-}
-
-std::vector<StringView> SplitEscapedString(StringView input, char split_char,
-                                           char escape_char) {
-  std::vector<StringView> output;
-  size_t last_pos = 0;
-  for (size_t i = 0; i < input.size(); i++) {
-    if (input[i] == escape_char) {
-      i++;
-      // skips a 2nd time:
-      continue;
-    }
-
-    if (input[i] == split_char) {
-      output.push_back(input.substr(last_pos, i - last_pos));
-      last_pos = i + 1;
-      continue;
-    }
-  }
-
-  if (last_pos < input.size()) {
-    output.push_back(input.substr(last_pos, input.size() - last_pos));
-  }
-
-  return output;
-}
-
-}  // namespace modular
diff --git a/lib/util/string_escape.h b/lib/util/string_escape.h
deleted file mode 100644
index 5c77058..0000000
--- a/lib/util/string_escape.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_LIB_UTIL_STRING_ESCAPE_H_
-#define PERIDOT_LIB_UTIL_STRING_ESCAPE_H_
-
-#include <vector>
-
-#include <lib/fxl/strings/string_view.h>
-
-namespace modular {
-
-constexpr char kDefaultEscapeChar = '\\';
-
-// Escape the set of chars in |chars_to_escape| in |input||. Use |escape_char|
-// to escape. All params are expected to be in ASCII.
-std::string StringEscape(fxl::StringView input, fxl::StringView chars_to_escape,
-                         char escape_char = kDefaultEscapeChar);
-
-// Unescape all escape sequences in |input|, where the escape sequence begins
-// with |escape_char|. All input params are expected to be in ASCII. In debug
-// mode, crashes if |input| cannot be unescaped.
-std::string StringUnescape(fxl::StringView input,
-                           char escape_char = kDefaultEscapeChar);
-
-// Splits an escaped string |input| by |split_char|; this splitter skips over
-// any characters escaped using |escape_char|s. All params are expected to be in
-// ASCII.
-//
-// Example:
-//  SplitEscapedString("a_b\\_c_d", '_', '\\')
-//    => std::vector<StringView>{"a", "b\\_c", "d"}
-std::vector<fxl::StringView> SplitEscapedString(
-    fxl::StringView input, char split_char,
-    char escape_char = kDefaultEscapeChar);
-
-}  // namespace modular
-
-#endif  // PERIDOT_LIB_UTIL_STRING_ESCAPE_H_
diff --git a/lib/util/string_escape_unittest.cc b/lib/util/string_escape_unittest.cc
deleted file mode 100644
index b4fe266..0000000
--- a/lib/util/string_escape_unittest.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/lib/util/string_escape.h"
-
-#include "gtest/gtest.h"
-
-using fxl::StringView;
-
-namespace modular {
-namespace {
-
-TEST(EscapeStringTest, EscapeUnescape) {
-  StringView original = "ABCDEFGHIJKLMNOPQRST";
-  std::string expected = "ABCD|EFGHI|JKLMNOPQRST";
-
-  EXPECT_EQ(expected, StringEscape(original, "EJ", '|'));
-  EXPECT_EQ(original, StringUnescape(expected, '|'));
-
-  EXPECT_EQ("a", StringUnescape("|a", '|'));
-}
-
-TEST(EscapeStringTest, SplitSimple) {
-  auto result = SplitEscapedString("a_b|_c_d", '_', '|');
-  EXPECT_EQ(3u, result.size());
-  EXPECT_EQ("a", result[0]);
-  EXPECT_EQ("b|_c", result[1]);
-  EXPECT_EQ("d", result[2]);
-}
-
-TEST(EscapeStringTest, SplitEdge) {
-  auto result = SplitEscapedString("a_", '_', '|');
-  EXPECT_EQ(1u, result.size());
-  EXPECT_EQ("a", result[0]);
-}
-
-TEST(EscapeStringTest, SplitWithEmpties) {
-  auto result = SplitEscapedString("a___b", '_', '|');
-  EXPECT_EQ(4u, result.size());
-  EXPECT_EQ("a", result[0]);
-  EXPECT_EQ("", result[1]);
-  EXPECT_EQ("", result[2]);
-  EXPECT_EQ("b", result[3]);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/navbar.md b/navbar.md
deleted file mode 100644
index d8b034b..0000000
--- a/navbar.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Peridot
-
-* [Home][home]
-* [Modular](/docs/modular/getting_started.md)
-* [Ledger](/docs/ledger/README.md)
-* [fuchsia::modular::Intent](/docs/modular/intent.md)
-* [fuchsia::modular::Entity](/docs/modular/entity.md)
-* [Examples](/examples)
-* [Tests](/tests)
-
-[home]: /README.md
-[logo]: /docs/images/fuchsia-logo-32x32.png
diff --git a/packages/README.md b/packages/README.md
deleted file mode 100644
index a5050b3..0000000
--- a/packages/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Build packages
-
-This directory contains build packages used to customize the content of a build.
-Its structure follows [a strict format][package-layout], enforced by continuous
-builds.
-
-[package-layout]: https://fuchsia.googlesource.com/docs/+/master/development/build/package_layout.md
diff --git a/packages/all b/packages/all
deleted file mode 100644
index 65ec31c..0000000
--- a/packages/all
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "imports": [
-        "peridot/packages/benchmarks/all",
-        "peridot/packages/examples/all",
-        "peridot/packages/prod/all",
-        "peridot/packages/tests/all"
-    ]
-}
diff --git a/packages/benchmarks/all b/packages/benchmarks/all
deleted file mode 100644
index ddca20b5..0000000
--- a/packages/benchmarks/all
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-    "imports": [
-        "peridot/packages/benchmarks/ledger",
-        "peridot/packages/benchmarks/modular",
-        "peridot/packages/benchmarks/peridot"
-    ]
-}
diff --git a/packages/benchmarks/ledger b/packages/benchmarks/ledger
deleted file mode 100644
index 299f1b7..0000000
--- a/packages/benchmarks/ledger
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "imports": [
-        "peridot/packages/prod/ledger"
-    ],
-    "packages": [
-        "//peridot/bin/ledger/tests/benchmark:ledger_benchmarks"
-    ]
-}
diff --git a/packages/benchmarks/modular b/packages/benchmarks/modular
deleted file mode 100644
index fd6830b..0000000
--- a/packages/benchmarks/modular
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "imports": [
-        "garnet/packages/benchmarks/buildbot",
-        "peridot/packages/prod/modular"
-    ],
-    "packages": [
-        "//peridot/tests/benchmarks:modular_benchmarks",
-        "//peridot/tests/benchmarks/story:modular_benchmark_story_module",
-        "//peridot/tests/benchmarks/story:modular_benchmark_story_session_shell"
-    ]
-}
diff --git a/packages/benchmarks/peridot b/packages/benchmarks/peridot
deleted file mode 100644
index c47981a..0000000
--- a/packages/benchmarks/peridot
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "imports": [
-        "garnet/packages/benchmarks/buildbot",
-        "peridot/packages/benchmarks/ledger"
-    ],
-    "packages": [
-        "//peridot/tests/benchmarks:peridot_benchmarks"
-    ]
-}
diff --git a/packages/buildbot b/packages/buildbot
deleted file mode 100644
index 044c8ca..0000000
--- a/packages/buildbot
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "imports": [
-        "garnet/packages/garnet",
-        "peridot/packages/all"
-    ]
-}
diff --git a/packages/default b/packages/default
deleted file mode 100644
index 9fec4ea..0000000
--- a/packages/default
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-    "imports": [
-        "garnet/packages/garnet",
-        "garnet/packages/tools/all",
-        "peridot/packages/all"
-    ]
-}
diff --git a/packages/examples/all b/packages/examples/all
deleted file mode 100644
index 1ca35d6..0000000
--- a/packages/examples/all
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "imports": [
-        "peridot/packages/examples/modular"
-    ]
-}
diff --git a/packages/examples/modular b/packages/examples/modular
deleted file mode 100644
index bbc8dcf..0000000
--- a/packages/examples/modular
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "packages": [
-        "//peridot/examples/simple:simple_agent",
-        "//peridot/examples/simple:simple_module",
-        "//peridot/examples/swap_cpp:swap_module1",
-        "//peridot/examples/swap_cpp:swap_module2",
-        "//peridot/examples/swap_cpp:swap_recipe",
-        "//peridot/examples/todo_cpp:todo_cpp"
-    ]
-}
diff --git a/packages/kitchen_sink b/packages/kitchen_sink
deleted file mode 100644
index 54a70ff..0000000
--- a/packages/kitchen_sink
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "imports": [
-        "garnet/packages/kitchen_sink",
-        "peridot/packages/all"
-    ]
-}
diff --git a/packages/peridot b/packages/peridot
deleted file mode 100644
index a2c0ddf..0000000
--- a/packages/peridot
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "imports": [
-        "garnet/packages/garnet",
-        "peridot/packages/prod/all"
-    ]
-}
diff --git a/packages/prod/all b/packages/prod/all
deleted file mode 100644
index 3aab919..0000000
--- a/packages/prod/all
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "imports": [
-        "peridot/packages/prod/clipboard_agent",
-        "peridot/packages/prod/cloud_provider_firestore",
-        "peridot/packages/prod/integration_testing",
-        "peridot/packages/prod/ledger",
-        "peridot/packages/prod/maxwell",
-        "peridot/packages/prod/modular",
-        "peridot/packages/prod/module_resolver",
-        "peridot/packages/prod/sessionctl",
-        "peridot/packages/prod/story_info"
-    ]
-}
diff --git a/packages/prod/clipboard_agent b/packages/prod/clipboard_agent
deleted file mode 100644
index cd95768..0000000
--- a/packages/prod/clipboard_agent
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "packages": [
-        "//peridot/bin/agents/clipboard:clipboard_agent"
-    ]
-}
diff --git a/packages/prod/cloud_provider_firestore b/packages/prod/cloud_provider_firestore
deleted file mode 100644
index 942ebde..0000000
--- a/packages/prod/cloud_provider_firestore
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "packages": [
-        "//peridot/bin/cloud_provider_firestore"
-    ]
-}
diff --git a/packages/prod/integration_testing b/packages/prod/integration_testing
deleted file mode 100644
index 1ca2a33..0000000
--- a/packages/prod/integration_testing
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "imports": [
-        "garnet/packages/prod/test_runner",
-        "peridot/packages/prod/modular"
-    ],
-    "packages": [
-        "//peridot/bin/basemgr:dev_base_shell",
-        "//peridot/bin/sessionmgr/story_runner:dev_story_shell",
-        "//peridot/bin/test_driver:test_driver_module",
-        "//peridot/bin/token_manager:dev_token_manager",
-        "//peridot/bin/sessionmgr:dev_session_shell"
-    ]
-}
diff --git a/packages/prod/ledger b/packages/prod/ledger
deleted file mode 100644
index 3567043..0000000
--- a/packages/prod/ledger
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "packages": [
-        "//peridot/bin/ledger"
-    ]
-}
diff --git a/packages/prod/maxwell b/packages/prod/maxwell
deleted file mode 100644
index a931631..0000000
--- a/packages/prod/maxwell
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "packages": [
-        "//peridot/bin/context_engine",
-        "//peridot/bin/suggestion_engine"
-    ]
-}
diff --git a/packages/prod/modular b/packages/prod/modular
deleted file mode 100644
index c45c455..0000000
--- a/packages/prod/modular
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "packages": [
-        "//peridot/bin/basemgr",
-        "//peridot/bin/sessionmgr"
-    ],
-    "labels": [
-      "//peridot/cloud/go/src/remote_module_resolver:host"
-    ]
-}
diff --git a/packages/prod/module_resolver b/packages/prod/module_resolver
deleted file mode 100644
index 0098af6..0000000
--- a/packages/prod/module_resolver
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "packages": [
-        "//peridot/bin/module_resolver",
-        "//peridot/bin/module_resolver/module_package_indexer"
-    ]
-}
diff --git a/packages/prod/sessionctl b/packages/prod/sessionctl
deleted file mode 100644
index 72ca949..0000000
--- a/packages/prod/sessionctl
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "packages": [
-        "//peridot/bin/sessionctl"
-    ]
-}
diff --git a/packages/prod/story_info b/packages/prod/story_info
deleted file mode 100644
index fbee17b..0000000
--- a/packages/prod/story_info
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "packages": [
-        "//peridot/bin/acquirers/story_info"
-    ]
-}
diff --git a/packages/products/framework b/packages/products/framework
deleted file mode 100644
index 75f37d6..0000000
--- a/packages/products/framework
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "imports": [
-        "garnet/packages/config/mdns",
-        "garnet/packages/config/netconnector",
-        "garnet/packages/prod/cobalt_client",
-        "garnet/packages/prod/mdns",
-        "garnet/packages/prod/mdns-util",
-        "garnet/packages/prod/netconnector",
-        "peridot/packages/prod/clipboard_agent",
-        "peridot/packages/prod/cloud_provider_firestore",
-        "peridot/packages/prod/ledger",
-        "peridot/packages/prod/maxwell",
-        "peridot/packages/prod/modular",
-        "peridot/packages/prod/module_resolver",
-        "peridot/packages/prod/sessionctl",
-        "peridot/packages/prod/story_info"
-    ]
-}
diff --git a/packages/products/framework_minimal b/packages/products/framework_minimal
deleted file mode 100644
index c44cd3f..0000000
--- a/packages/products/framework_minimal
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "imports": [
-        "peridot/packages/prod/ledger",
-        "peridot/packages/prod/maxwell",
-        "peridot/packages/prod/modular",
-        "peridot/packages/prod/module_resolver",
-        "peridot/packages/prod/story_info"
-    ]
-}
diff --git a/packages/products/test_modular b/packages/products/test_modular
deleted file mode 100644
index 044c8ca..0000000
--- a/packages/products/test_modular
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "imports": [
-        "garnet/packages/garnet",
-        "peridot/packages/all"
-    ]
-}
diff --git a/packages/tests/all b/packages/tests/all
deleted file mode 100644
index bcb8834..0000000
--- a/packages/tests/all
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "imports": [
-        "garnet/packages/testing/run_test_component",
-        "peridot/packages/tests/bup",
-        "peridot/packages/tests/ledger",
-        "peridot/packages/tests/leveldb",
-        "peridot/packages/tests/maxwell_integration_tests",
-        "peridot/packages/tests/maxwell_unittests",
-        "peridot/packages/tests/modular_integration_tests",
-        "peridot/packages/tests/modular_unittests",
-        "peridot/packages/tests/peridot_tests",
-        "peridot/packages/tests/re2"
-    ]
-}
diff --git a/packages/tests/bup b/packages/tests/bup
deleted file mode 100644
index 8c0133f..0000000
--- a/packages/tests/bup
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "packages": [
-        "//peridot/third_party/bup:bup_tests"
-    ]
-}
diff --git a/packages/tests/ledger b/packages/tests/ledger
deleted file mode 100644
index dbf807b..0000000
--- a/packages/tests/ledger
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "imports": [
-        "peridot/packages/prod/cloud_provider_firestore",
-        "peridot/packages/prod/ledger"
-    ],
-    "packages": [
-        "//peridot/bin/ledger:ledger_tests",
-        "//peridot/bin/ledger:ledger_fuzzers",
-        "//peridot/bin/ledger/testing/ledger_test_instance_provider:ledger_test_instance_provider"
-    ]
-}
diff --git a/packages/tests/leveldb b/packages/tests/leveldb
deleted file mode 100644
index db6195f..0000000
--- a/packages/tests/leveldb
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "packages": [
-        "//third_party/leveldb:leveldb_tests",
-	"//third_party/leveldb:leveldb_benchmarks"
-    ]
-}
diff --git a/packages/tests/maxwell_integration_tests b/packages/tests/maxwell_integration_tests
deleted file mode 100644
index eca1213..0000000
--- a/packages/tests/maxwell_integration_tests
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "packages": [
-        "//peridot/tests/maxwell_integration:maxwell_integration_tests"
-    ]
-}
diff --git a/packages/tests/maxwell_unittests b/packages/tests/maxwell_unittests
deleted file mode 100644
index a72fdbc..0000000
--- a/packages/tests/maxwell_unittests
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-    "packages": [
-        "//peridot/bin/context_engine:context_engine_unittests",
-        "//peridot/bin/module_resolver:module_resolver_unittests",
-        "//peridot/bin/suggestion_engine:suggestion_engine_unittests"
-    ]
-}
diff --git a/packages/tests/modular_integration_tests b/packages/tests/modular_integration_tests
deleted file mode 100644
index a18cf17..0000000
--- a/packages/tests/modular_integration_tests
+++ /dev/null
@@ -1,43 +0,0 @@
-{
-    "imports": [
-        "garnet/packages/prod/test_runner",
-        "peridot/packages/prod/integration_testing"
-    ],
-    "packages": [
-        "//peridot/tests/clipboard:clipboard_test_module",
-        "//peridot/tests/common:common_active_module",
-        "//peridot/tests/common:common_module_index",
-        "//peridot/tests/common:common_null_module",
-        "//peridot/tests/component_context:component_context_test_module",
-        "//peridot/tests/component_context:component_context_test_one_agent",
-        "//peridot/tests/component_context:component_context_test_two_agent",
-        "//peridot/tests/component_context:component_context_test_unstoppable_agent",
-        "//peridot/tests/embed_shell:embed_shell_test_child_module",
-        "//peridot/tests/embed_shell:embed_shell_test_parent_module",
-        "//peridot/tests/embed_shell:embed_shell_test_session_shell",
-        "//peridot/tests/embed_shell:embed_shell_test_story_shell",
-        "//peridot/tests/intents:intent_test_parent_module",
-        "//peridot/tests/intents:intent_test_child_module",
-        "//peridot/tests/last_focus_time:last_focus_time_test_session_shell",
-        "//peridot/tests/link_context_entities:link_context_entities_test_module",
-        "//peridot/tests/link_context_entities:link_context_entities_test_session_shell",
-        "//peridot/tests:modular_tests",
-        "//peridot/tests/module_context:module_context_test_session_shell",
-        "//peridot/tests/module_context:module_context_test_module",
-        "//peridot/tests/module_context:module_context_test_entity_module",
-        "//peridot/tests/parent_child:parent_child_test_child_module1",
-        "//peridot/tests/parent_child:parent_child_test_child_module2",
-        "//peridot/tests/parent_child:parent_child_test_parent_module",
-        "//peridot/tests/queue_persistence:queue_persistence_test_agent",
-        "//peridot/tests/queue_persistence:queue_persistence_test_module",
-        "//peridot/tests/story_shell:story_shell_test_story_shell",
-        "//peridot/tests/story_shell:story_shell_test_session_shell",
-        "//peridot/tests/suggestion:suggestion_test_module",
-        "//peridot/tests/suggestion:suggestion_test_session_shell",
-        "//peridot/tests/trigger:trigger_test_agent",
-        "//peridot/tests/trigger:trigger_test_module",
-        "//peridot/tests/trigger:trigger_test_session_shell",
-        "//peridot/tests/session_shell:session_shell_test_session_shell",
-        "//peridot/tests/sessionctl:sessionctl_integration_tests"
-    ]
-}
diff --git a/packages/tests/modular_unittests b/packages/tests/modular_unittests
deleted file mode 100644
index 2b18fdb..0000000
--- a/packages/tests/modular_unittests
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-    "packages": [
-        "//peridot/bin/agents/clipboard:clipboard_unittests",
-        "//peridot/bin/basemgr:basemgr_unittests",
-        "//peridot/bin/sessionctl:sessionctl_unittests",
-        "//peridot/bin/sessionmgr/agent_runner:agent_runner_unittests",
-        "//peridot/bin/sessionmgr/entity_provider_runner:entity_provider_runner_unittests",
-        "//peridot/bin/sessionmgr/story/model:story_model_unittests",
-        "//peridot/bin/sessionmgr/story/systems:story_systems_unittests",
-        "//peridot/bin/sessionmgr/puppet_master:puppet_master_unittests",
-        "//peridot/bin/sessionmgr/storage:storage_unittests",
-        "//peridot/bin/sessionmgr/story_runner:story_runner_unittests"
-    ]
-}
diff --git a/packages/tests/peridot_tests b/packages/tests/peridot_tests
deleted file mode 100644
index 676573d..0000000
--- a/packages/tests/peridot_tests
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "packages": [
-        "//peridot:peridot_tests"
-    ]
-}
diff --git a/packages/tests/re2 b/packages/tests/re2
deleted file mode 100644
index 301cc1e..0000000
--- a/packages/tests/re2
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "packages": [
-        "//third_party/re2:re2_tests"
-    ]
-}
diff --git a/products/default.gni b/products/default.gni
deleted file mode 100644
index ade663d..0000000
--- a/products/default.gni
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-monolith = [ "peridot/packages/default" ]
-
-preinstall = []
-
-available = [ "peridot/packages/all" ]
diff --git a/products/framework.gni b/products/framework.gni
deleted file mode 100644
index 47dde09..0000000
--- a/products/framework.gni
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-monolith = [ "peridot/packages/products/framework" ]
-
-preinstall = []
-
-available = []
diff --git a/products/kitchen_sink.gni b/products/kitchen_sink.gni
deleted file mode 100644
index 142ff00..0000000
--- a/products/kitchen_sink.gni
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-monolith = [ "peridot/packages/kitchen_sink" ]
-
-preinstall = []
-
-available = []
diff --git a/products/test_modular.gni b/products/test_modular.gni
deleted file mode 100644
index f37efcc..0000000
--- a/products/test_modular.gni
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-monolith = [ "peridot/packages/products/test_modular" ]
-
-preinstall = []
-
-available = []
diff --git a/public/BUILD.gn b/public/BUILD.gn
deleted file mode 100644
index 8d80dff..0000000
--- a/public/BUILD.gn
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-config("config") {
-  include_dirs = [
-    ".",
-    "$root_gen_dir/peridot/public",
-  ]
-}
diff --git a/public/fidl/fuchsia.ledger.cloud/BUILD.gn b/public/fidl/fuchsia.ledger.cloud/BUILD.gn
deleted file mode 100644
index be62ab0..0000000
--- a/public/fidl/fuchsia.ledger.cloud/BUILD.gn
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-fidl("fuchsia.ledger.cloud") {
-  sources = [
-    "cloud_provider.fidl",
-  ]
-
-  public_deps = [
-    "//zircon/public/fidl/fuchsia-mem",
-  ]
-}
diff --git a/public/fidl/fuchsia.ledger.cloud/cloud_provider.fidl b/public/fidl/fuchsia.ledger.cloud/cloud_provider.fidl
deleted file mode 100644
index 15483db..0000000
--- a/public/fidl/fuchsia.ledger.cloud/cloud_provider.fidl
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.ledger.cloud;
-
-using fuchsia.mem;
-
-// This file defines a cloud service that can be used by Ledger to power cloud
-// sync.
-
-/// Response status for cloud provider operations.
-enum Status : int32 {
-    OK = 0;
-    AUTH_ERROR = 1;
-    ARGUMENT_ERROR = 2;
-    INTERNAL_ERROR = 3;
-    NETWORK_ERROR = 4;
-    NOT_FOUND = 5;
-    PARSE_ERROR = 6;
-    SERVER_ERROR = 7;
-    UNKNOWN_ERROR = -1;
-};
-
-/// Cloud service that powers cloud sync for a single user. Top-level interface
-/// of this file.
-///
-/// Closing the client connection to CloudProvider shuts down all controllers
-/// (DeviceSets, PageClouds) that were produced by it.
-[Discoverable]
-interface CloudProvider {
-    /// Retrieves the controller for the user device set.
-    1: GetDeviceSet(request<DeviceSet> device_set) -> (Status status);
-
-    /// Retrieves the controller for cloud sync of a particular page.
-    2: GetPageCloud(vector<uint8> app_id, vector<uint8> page_id, request<PageCloud> page_cloud)
-           -> (Status status);
-};
-
-/// Cloud registry of devices participating in cloud sync.
-///
-/// Closing the client connection to DeviceSet disconnects all watchers set on
-/// it.
-interface DeviceSet {
-    /// Verifies that the device fingerprint in the cloud is still in the list of
-    /// devices, ensuring that the cloud was not erased since the last sync.
-    1: CheckFingerprint(vector<uint8> fingerprint) -> (Status status);
-
-    /// Adds the device fingerprint to the list of devices in the cloud.
-    2: SetFingerprint(vector<uint8> fingerprint) -> (Status status);
-
-    /// Watches the given |fingerprint| in the cloud so that |watcher| is notified
-    /// when the fingerprint is erased.
-    ///
-    /// At most one watcher can be set at any given time. If more than one watcher
-    /// is set, only the one set most recently receives notifications.
-    ///
-    /// The returned status is:
-    ///
-    ///   - OK, if setting the watcher succeeded,
-    ///   - NOT_FOUND, if the fingerprint was not found in the cloud
-    ///   - NETWORK_ERROR, if the watcher couldn't be set due to a network error
-    ///
-    /// If the returned status is not OK, the corresponding error call is also made
-    /// on the watcher.
-    3: SetWatcher(vector<uint8> fingerprint, DeviceSetWatcher watcher)
-           -> (Status status);
-
-    /// Erases the entire registry of devices. This makes all devices detect that
-    /// cloud has been erased.
-    4: Erase() -> (Status status);
-};
-
-/// Watcher for push notifications from the cloud registry of devices
-/// participating in cloud sync.
-interface DeviceSetWatcher {
-    /// Called when cloud provider detects that the cloud storage was erased. No
-    /// further calls are made on the watcher after this is called.
-    1: OnCloudErased();
-
-    /// Called when the network connection is lost. No further calls are made on
-    /// the watcher after this is called.
-    2: OnNetworkError();
-};
-
-// TODO(ppi): switch to a format defined in a FIDL table, so that the protocol
-// is fully described by the FIDL file.
-/// Contains an ordered list of commits serialized using the SerializedCommits
-/// schema defined in serialized_commits.fbs.
-struct CommitPack {
-    fuchsia.mem.Buffer buffer;
-};
-
-/// A continuation token for paginated requests.
-struct Token {
-    vector<uint8> opaque_id;
-};
-
-/// Handler for cloud sync of a single page.
-///
-/// Implementation of this class manages a *commit log*, which is an append-only
-/// list of commits produced by all devices that participate in syncing this
-/// page. Position of commits within the log are references using position
-/// tokens, allowing the caller to retrieve the commits added to the cloud since
-/// the previous read. (plus possibly more - see comments for GetCommits() and
-/// SetWatcher().)
-///
-/// Closing the client connection to PageCloud disconnects all watchers set on
-/// it.
-interface PageCloud {
-    /// Adds the given commits to the commit log in the cloud.
-    ///
-    /// The commits are added in one batch, on the receiving side they are
-    /// delivered in the same order in a single OnNewCommits() call.
-    1: AddCommits(CommitPack commits) -> (Status status);
-
-    /// Retrieves commits from the cloud.
-    ///
-    /// All commits newer than |min_position_token| are guaranteed to be returned.
-    /// In addition to that, the response may include additional commits older
-    /// than or at |min_position_token|. Passing null |min_position_token|
-    /// retrieves all commits.
-    ///
-    /// If the resulting |status| is |OK|, |commits| contains all matching commits
-    /// (might be empty) and |position_token| contains the position token of the
-    /// most recent of the |commits| (equivalent to |min_position_token| if
-    /// |commits| is empty).
-    2: GetCommits(Token? min_position_token)
-           -> (Status status, CommitPack? commits, Token? position_token);
-
-    /// Uploads the given object to the cloud under the given id.
-    ///
-    /// If the object already exists in the cloud this method returns OK.
-    3: AddObject(vector<uint8> id, fuchsia.mem.Buffer buffer) -> (Status status);
-
-    /// Retrieves the object of the given id from the cloud.
-    ///
-    /// If the resulting |status| is |OK|, |buffer| will contain the object
-    /// content. If the resulting |status| is not |OK|, |buffer| will be null.
-    4: GetObject(vector<uint8> id)
-           -> (Status status, fuchsia.mem.Buffer? buffer);
-
-    /// Watches the cloud for push notifications.
-    ///
-    /// At most one watcher can be set at any given time. If more than one watcher
-    /// is set, only the one set most recently receives notifications.
-    ///
-    /// All commits newer than |min_position_token| added to the cloud before or
-    /// after making this call are guaranteed to be delivered to |watcher|. In
-    /// addition to that, additional commits older than or at |min_position_token|
-    /// may be delivered to. If |min_position_token| is null, notifications for
-    /// all commits are delivered.
-    5: SetWatcher(Token? min_position_token, PageCloudWatcher watcher)
-           -> (Status status);
-};
-
-/// Watcher for push notifications from cloud sync of a single page.
-interface PageCloudWatcher {
-    /// Called when new commits are added to the commit log in the cloud.
-    ///
-    /// The method takes the list of new |commits| along with the |position_token|
-    /// of the most recent of them.
-    ///
-    /// No subsequent calls are made until the client calls the callback of the
-    /// previous one.
-    1: OnNewCommits(CommitPack commits, Token position_token) -> ();
-
-    /// Called when a new object is added to the cloud.
-    ///
-    /// The method takes the |id| and the content of the new object.
-    ///
-    /// No subsequent calls are made until the client calls the callback of the
-    /// previous one.
-    2: OnNewObject(vector<uint8> id, fuchsia.mem.Buffer buffer) -> ();
-
-    /// Called when an error occurs.
-    ///
-    /// No further calls are made on the watcher after this is called. The client
-    /// can then re-establish the watcher by calling SetWatcher() again.
-    ///
-    /// The status is one of:
-    ///
-    ///   - AUTH_ERROR, if the auth token needs a refresh
-    ///   - NETWORK_ERROR, if the connection was dropped
-    ///   - PARSE_ERROR, if an invalid server notification was received
-    3: OnError(Status status);
-};
diff --git a/public/fidl/fuchsia.ledger.cloud/serialized_commits.fbs b/public/fidl/fuchsia.ledger.cloud/serialized_commits.fbs
deleted file mode 100644
index f38ba5b..0000000
--- a/public/fidl/fuchsia.ledger.cloud/serialized_commits.fbs
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-namespace cloud_provider;
-
-table SerializedCommit {
-  id: [ubyte];
-  data: [ubyte];
-}
-
-table SerializedCommits {
-  commits: [SerializedCommit];
-}
-
-root_type SerializedCommits;
diff --git a/public/fidl/fuchsia.ledger/BUILD.gn b/public/fidl/fuchsia.ledger/BUILD.gn
deleted file mode 100644
index 74c8b12..0000000
--- a/public/fidl/fuchsia.ledger/BUILD.gn
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-fidl("fuchsia.ledger") {
-  sdk_category = "partner"
-
-  sources = [
-    "ledger.fidl",
-  ]
-
-  public_deps = [
-    "//zircon/public/fidl/fuchsia-mem",
-  ]
-}
diff --git a/public/fidl/fuchsia.ledger/MAINTAINERS b/public/fidl/fuchsia.ledger/MAINTAINERS
deleted file mode 100644
index d0e7ba7..0000000
--- a/public/fidl/fuchsia.ledger/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-etiennej@google.com
-qsr@google.com
diff --git a/public/fidl/fuchsia.ledger/ledger.fidl b/public/fidl/fuchsia.ledger/ledger.fidl
deleted file mode 100644
index e393885..0000000
--- a/public/fidl/fuchsia.ledger/ledger.fidl
+++ /dev/null
@@ -1,570 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.ledger;
-
-using fuchsia.mem;
-using zx;
-
-// This file contains definitions of interfaces and data structures to access
-// the Fuchsia Ledger.
-
-/// Response code for ledger operations.
-enum Status : int32 {
-    OK = 0;
-    PARTIAL_RESULT = 1;
-    INVALID_TOKEN = 2;
-    INVALID_ARGUMENT = 3;
-    PAGE_NOT_FOUND = 4;
-    KEY_NOT_FOUND = 5;
-    REFERENCE_NOT_FOUND = 6;
-    NEEDS_FETCH = 7;
-    IO_ERROR = 8;
-    NETWORK_ERROR = 9;
-    TRANSACTION_ALREADY_IN_PROGRESS = 10;
-    NO_TRANSACTION_IN_PROGRESS = 11;
-    INTERNAL_ERROR = 12;
-    VALUE_TOO_LARGE = 13;
-    ILLEGAL_STATE = 14;
-    UNKNOWN_ERROR = -1;
-};
-
-/// Size in bytes of Page IDs.
-const uint32 kPageIdSize = 16;
-
-struct PageId {
-    array<uint8>:kPageIdSize id;
-};
-
-/// Base interface for all services offered by the Ledger.
-//
-/// In case of an unexpected error on one of the service offered by the Ledger,
-/// the service will close the connected channel, sending a |ledger.Status| as an epitaph.
-///
-/// If a client needs to ensure a sequence of operation has been processed by
-/// the service, it can issue a |Sync| command. The response will be send once
-/// all request started before the |Sync| request has been processed by the
-/// service.
-[FragileBase]
-interface ErrorNotifier {
-    1000: Sync() -> ();
-};
-
-[Discoverable]
-interface Ledger {
-    /// Retrieves the page with the given identifier, creating it if needed. A
-    /// |null| identifier can be passed to create a new page with a random unique
-    /// identifier. It is allowed to connect to the same page concurrently
-    /// multiple times.
-
-    /// Parameters:
-    /// |id| the identifier of the page, or |null| to create a new page with a random identifier.
-    ///
-    /// Returns OK and binds |page_request| to the page on success.
-    1: GetPage(PageId? id, request<Page> page_request) -> (Status status);
-
-    /// Gets the page with identifier
-    /// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].
-    /// This is a convenience method equivalent to:
-    /// GetPage([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], page_request).
-    2: GetRootPage(request<Page> page_request) -> (Status status);
-
-    /// Sets the |ConflictResolverFactory| to use for resolving conflicts on pages.
-    /// If this method has never been called, a last-one-wins policy will be used
-    /// for every page. If this method is called multiple times, the factories are
-    /// kept and conflict resolver requests are sent to one of the connected
-    /// factories. If all factories are later disconnected, pages that already have
-    /// a conflict resolution strategy (because they were opened before the factory
-    /// disconnected) will continue using their current strategy. The pages for
-    /// which no conflict resolution is set up will not get their conflicts
-    /// resolved until this method is called again.
-    3: SetConflictResolverFactory(ConflictResolverFactory factory)
-           -> (Status status);
-};
-
-/// A reference to a value.
-struct Reference {
-    vector<uint8> opaque_id;
-};
-
-/// A continuation token for paginated requests.
-struct Token {
-    vector<uint8> opaque_id;
-};
-
-/// The result of a wait for conflict resolution. See
-/// |Page.WaitForConflictResolution| for details.
-enum ConflictResolutionWaitStatus {
-    /// No conflict was observed when the callback was registered.
-    NO_CONFLICTS = 0;
-    /// Some conflicts were observed when the callback was registered, and all
-    /// have been resolved.
-    CONFLICTS_RESOLVED = 1;
-};
-
-/// A page is the smallest unit of syncable data.
-interface Page {
-    /// Returns the identifier for the page.
-    1: GetId() -> (PageId id);
-
-    /// Creates a snapshot of the page, allowing the client app to read a
-    /// consistent view of the content of the page. If |key_prefix| is provided,
-    /// the resulting snapshot includes only the entries with matching keys.
-    ///
-    /// If |watcher| is provided, it will receive notifications for changes of the
-    /// page state on this page connection newer than the resulting snapshot.
-    /// Change notifications will only contain the entries matching |key_prefix|.
-    /// To receive all changes, use an empty |key_prefix|.
-    2: GetSnapshot(request<PageSnapshot> snapshot_request,
-                   vector<uint8>:256 key_prefix, PageWatcher? watcher) -> (Status status);
-
-    // Mutation operations.
-
-    // Key level operations.
-    /// Mutations are bundled together into atomic commits. If a transaction is in
-    /// progress, the list of mutations bundled together is tied to the current
-    /// transaction. If no transaction is in progress, mutations will be bundled
-    /// with the following rules:
-    /// - A call to either |GetSnapshot()| or |StartTransaction()| will
-    ///   commit any pending mutations.
-    /// - All pending mutations will regularly be bundled together and committed.
-    ///   They are guaranteed to be persisted as soon as the client receives a
-    ///   successful status.
-    /// |Put()| and |PutWithPriority()| can be used for small values that
-    /// fit inside a FIDL message. If the value is bigger, a reference must be
-    /// first created using |CreateReferenceFromSocket()| or
-    /// |CreateReferenceFromBuffer()| and then |PutReference()| can be used.
-    /// |PutWithPriority()| and |PutReference()| have an additional |priority|
-    /// parameter managing the synchronization policy for this value. |Put()| uses
-    /// a default priority of |Priority.EAGER|. For the list of available
-    /// priorities and their definition, see |Priority|.
-    3: Put(vector<uint8>:256 key, vector<uint8> value) -> (Status status);
-    4: PutWithPriority(vector<uint8>:256 key, vector<uint8> value,
-                       Priority priority) -> (Status status);
-    5: PutReference(vector<uint8>:256 key, Reference reference, Priority priority)
-           -> (Status status);
-    6: Delete(vector<uint8>:256 key) -> (Status status);
-
-    // Page level operations.
-
-    /// Deletes all entries in the page.
-    /// Outside of a transaction, this operation is equivalent to deleting every
-    /// key currently present on the page in a single transaction.
-    /// In a transaction, this operation is equivalent to deleting every key
-    /// present in the page before the transaction, as well as any new key added
-    /// since the transaction started.
-    7: Clear() -> (Status status);
-
-    // References.
-    /// Creates a new reference. The object is not part of any commit. It must be
-    /// associated with a key using |PutReference()|. The content of the reference
-    /// will be the content of the socket. The content size must be equal to
-    /// |size|, otherwise the call will fail.
-    8: CreateReferenceFromSocket(uint64 size, handle<socket> data)
-           -> (Status status, Reference? reference);
-    /// Creates a new reference. The object is not part of any commit. It must be
-    /// associated with a key using |PutReference()|. The content of the reference
-    /// will be the content of the buffer.
-    9: CreateReferenceFromBuffer(fuchsia.mem.Buffer buffer)
-           -> (Status status, Reference? reference);
-
-    // Transactions.
-
-    /// Transactions allow the client to ensures changes are seen atomically by
-    /// observers of this page. Once a transaction is started with
-    /// |StartTransaction()|, every call to |Put(...)| and |Delete(...)| will not
-    /// be visible until either |Commit()| is called, and all changes are applied
-    /// in a single commit, or |Rollback()| is called and all changes are
-    /// discarded.
-    ///
-    /// Parallel transactions on the same *page connection* are not allowed, and
-    /// calling |StartTransaction()| when a transaction is already in progress
-    /// returns an error. However, a client is free to connect to the same page
-    /// multiple times, and run parallel transactions on the same page using
-    /// separate connections. In this case, commiting each transaction creates
-    /// divergent commits, which are later subject to conflict resolution.
-    ///
-    /// When a transaction is in progress, the page content visible *on this page
-    /// connection* is pinned to the state from when |StartTransaction()| was
-    /// called. In particular, no watch notifications are delivered, and the
-    /// conflict resolution is not invoked while the transaction is in progress. If
-    /// conflicting changes are made or synced while the transaction is in
-    /// progress, conflict resolution is invoked after the transaction is
-    /// committed.
-    ///
-    /// Starting a transaction will block until all watchers registered on this
-    /// page connection have received the current page state, ie. the one that
-    /// will be used as the base of the transaction. Put (with all its variants)
-    /// and Delete calls may be pipelined while StartTransaction() is pending and
-    /// will be taken into account in the transaction while it is pending.
-    10: StartTransaction() -> (Status status);
-    11: Commit() -> (Status status);
-    12: Rollback() -> (Status status);
-
-    /// Sets a watcher to track the synchronisation state of this page. The
-    /// current state is immediately sent to the watcher when this method is
-    /// called.
-    13: SetSyncStateWatcher(SyncWatcher watcher) -> (Status status);
-
-    // Conflict resolution.
-
-    /// Waits until all conflicts are resolved before calling the callback.
-    /// The client can call this method multiple times, even before the previous
-    /// calls are completed. Callbacks will be executed in the order they were
-    /// added and indicate whether a merge happened between the callback
-    /// registration and its execution.
-    /// If there are no pending conflicts at the time this is called, the callback
-    /// gets executed right away.
-    14: WaitForConflictResolution() -> (ConflictResolutionWaitStatus wait_status);
-};
-
-/// The synchronization priority of a reference.
-enum Priority {
-    /// EAGER values will be downloaded with the commit and have the same
-    /// availability.
-    EAGER = 0;
-    /// LAZY values will not be downloaded with their commit, but only on demand.
-    /// A LAZY value thus may not be available when requested, for example if the
-    /// device has no internet connection at request time.
-    LAZY = 1;
-};
-
-/// A pair of key and value.
-struct Entry {
-    vector<uint8>:256 key;
-    /// |value| is null and |size| is 0 if the value requested has the LAZY
-    /// priority and is not present on the device. Clients must use a Fetch call
-    /// to retrieve the contents.
-    fuchsia.mem.Buffer? value;
-    Priority priority;
-};
-
-/// A value inlined in a message.
-struct InlinedValue {
-    vector<uint8> value;
-};
-
-/// A pair of key and an inlined value.
-struct InlinedEntry {
-    vector<uint8>:256 key;
-    /// |value| is null if the value requested has the LAZY priority and is not
-    /// present on the device. Clients must use a Fetch call to retrieve the
-    /// contents.
-    InlinedValue? inlined_value;
-    Priority priority;
-};
-
-/// The content of a page at a given time. Closing the connection to a |Page|
-/// interface closes all |PageSnapshot| interfaces it created. The contents
-/// provided by this interface are limited to the prefix provided to the
-/// Page.GetSnapshot() call.
-interface PageSnapshot {
-    /// Returns the entries in the page with keys greater or equal to |key_start|
-    /// using the lexicographic order. If |key_start| is empty, all entries are
-    /// returned. If the result fits in a single fidl message, |status| will be
-    /// |OK| and |next_token| equal to NULL. Otherwise, |status| will be
-    /// |PARTIAL_RESULT| and |next_token| will have a non-NULL value. To retrieve
-    /// the remaining results, another call to |GetEntries| should be made,
-    /// initializing the optional |token| argument with the value of |next_token|
-    /// returned in the previous call. |status| will be |PARTIAL_RESULT| as long
-    /// as there are more results and |OK| once finished.
-    /// Only |EAGER| values are guaranteed to be returned inside |entries|.
-    /// Missing |LAZY| values can be retrieved over the network using Fetch().
-    /// The returned |entries| are sorted by |key|.
-    1: GetEntries(vector<uint8>:256 key_start, Token? token)
-           -> (Status status, vector<Entry> entries, Token? next_token);
-
-    /// Same as |GetEntries()|. |VALUE_TOO_LARGE| is returned if a value does not
-    /// fit in a FIDL message.
-    2: GetEntriesInline(vector<uint8>:256 key_start, Token? token)
-           -> (Status status, vector<InlinedEntry> entries,
-               Token? next_token);
-
-    /// Returns the keys of all entries in the page which are greater or equal to
-    /// |key_start| using the lexicographic order. If |key_start| is empty, all
-    /// keys are returned. If the result fits in a single FIDL message, |status|
-    /// will be |OK| and |next_token| equal to NULL. Otherwise, |status| will be
-    /// |PARTIAL_RESULT| and |next_token| will have a non-NULL value. To retrieve
-    /// the remaining results, another call to |GetKeys| should be made,
-    /// initializing the optional |token| argument with the value of |next_token|
-    /// returned in the previous call.
-    /// The returned |keys| are sorted. |status| will be |PARTIAL_RESULT| as long
-    /// as there are more results and |OK| once finished.
-    3: GetKeys(vector<uint8>:256 key_start, Token? token)
-           -> (Status status, vector<vector<uint8>:256> keys,
-               Token? next_token);
-
-    /// Returns the value of a given key.
-    /// Only |EAGER| values are guaranteed to be returned. Calls when the value is
-    /// |LAZY| and not available will return a |NEEDS_FETCH| status. The value can
-    /// be retrieved over the network using a Fetch() call.
-    4: Get(vector<uint8>:256 key) -> (Status status, fuchsia.mem.Buffer? buffer);
-
-    /// Returns the value of a given key if it fits in a FIDL message.
-    /// |VALUE_TOO_LARGE| is returned if the value does not fit in a FIDL message.
-    /// See |Get()| for additional information.
-    5: GetInline(vector<uint8>:256 key) -> (Status status, InlinedValue? value);
-
-    /// Fetches the value of a given key, over the network if not already present
-    /// locally. |NETWORK_ERROR| is returned if the download fails (e.g.: network
-    /// is not available).
-    6: Fetch(vector<uint8>:256 key) -> (Status status, fuchsia.mem.Buffer? buffer);
-
-    /// Fetches the value of a given key, over the network if not already present
-    /// locally, and returns a shared handle of a part of the value of a given
-    /// key, starting at the position that is specified by |offset|. If |offset|
-    /// is less than 0, starts at |-offset| from the end of the value.
-    /// Returns at most |max_size| bytes. If |max_size| is less than 0, returns
-    /// everything.
-    7: FetchPartial(vector<uint8>:256 key, int64 offset, int64 max_size)
-           -> (Status status, fuchsia.mem.Buffer? buffer);
-};
-
-enum ResultState {
-    COMPLETED = 0;
-    PARTIAL_STARTED = 1;
-    PARTIAL_CONTINUED = 2;
-    PARTIAL_COMPLETED = 3;
-};
-
-struct PageChange {
-    /// The timestamp of this change. This represents the number of nanoseconds
-    /// since Unix epoch (i.e., since "1970-01-01 00:00 UTC", ignoring leap
-    /// seconds). This value is set by the device that created the change and is
-    /// not synchronized across devices. In particular, there is no guarantee that
-    /// the |timestamp| of a follow up change is greater than this one's.
-    zx.time timestamp;
-    /// List of new and modified entries. |changed_entries| are sorted by |key|.
-    vector<Entry> changed_entries;
-    /// List of deleted keys, in sorted order.
-    vector<vector<uint8>:256> deleted_keys;
-};
-
-/// Interface to watch changes to a page. The client will receive changes made by
-/// itself, as well as other clients or synced from other devices. The contents
-/// of a transaction will never be split across multiple OnChange() calls, but
-/// the contents of multiple transactions may be merged into one OnChange() call.
-interface PageWatcher {
-    /// Called for changes made on the page. If the result fits in a single fidl
-    /// message, |result_state| will be |COMPLETED|. Otherwise, OnChange will be
-    /// called multiple times and |result_state| will be |PARTIAL_STARTED| the
-    /// first time, |PARTIAL_CONTINUED| the following ones and finally
-    /// |PARTIAL_COMPLETED| on the last call. No new OnChange() call will be made
-    /// while the previous one is still active. If clients are interested in the
-    /// full content of the page at the time of the change, they can request a
-    /// PageSnapshot in the callback. This request is optional and can be requested
-    /// in any partial (started, continued or completed) and/or COMPLETED OnChange
-    /// call. In any case, all requests made on a sequence of OnChange calls for
-    /// the same page change, will always return the same snapshot: the one
-    /// including all changes.
-    ///
-    /// Note that calls to Page.StartTransaction() on the page connection on which
-    /// the watcher was registered will block until all OnChange() calls have
-    /// finished.
-    1: OnChange(PageChange page_change, ResultState result_state)
-           -> (request<PageSnapshot>? snapshot);
-};
-
-/// This interface lets clients control the conflict resolution policy of the
-/// ledger. It allows them to either use pre-defined policies, or provide their
-/// own implementation. This can be decided on a page-by-page basis.
-interface ConflictResolverFactory {
-    /// Returns the conflict resolution policy for the given page.
-    1: GetPolicy(PageId page_id) -> (MergePolicy policy);
-    /// Returns a |ConflictResolver| to use for the given page. This will only be
-    /// called if |GetPolicy| for the same page returned |AUTOMATIC_WITH_FALLBACK|
-    /// or |CUSTOM|.
-    2: NewConflictResolver(PageId page_id, request<ConflictResolver> resolver);
-};
-
-/// Strategy to be used when resolving conflicts.
-enum MergePolicy {
-    /// Last one wins. When 2 commits are merged, the resulting commit contains:
-    ///  - all keys/values that do not conflict
-    ///  - all keys/values of the commit with the biggest timestamp (or biggest
-    ///    id, if the timestamps are the same)
-    LAST_ONE_WINS = 0;
-    /// Commits are automatically merged when no key has been modified on both
-    /// sides. When a key has been modified by both commits, conflict resolution is
-    /// delegated to a user-provided |ConflictResolver| that is created by calling
-    /// |ConflictResolverFactory.NewConflictResolver|. A single |ConflictResolver|
-    /// is created for each page. When the |ConflictResolver| is disconnected, a
-    /// new one is requested.
-    AUTOMATIC_WITH_FALLBACK = 1;
-    /// All merges are resolved by a user-provided |ConflictResolver| as described
-    /// above, even when commits to be merged change a disjoined set of keys.
-    CUSTOM = 2;
-};
-
-/// A value that is either small enough to be directly embedded in |bytes| or
-/// that is referenced by |reference|.
-union BytesOrReference {
-    vector<uint8> bytes;
-    Reference reference;
-};
-
-/// Source of the value used to resolve a conflict.
-///
-/// |DELETE| deletes the key; |NEW| creates a new value; |RIGHT|
-/// selects the value from the right branch. If no value is sent, the left
-/// branch is selected.
-/// Used by |MergedValue|.
-enum ValueSource {
-    RIGHT = 0;
-    NEW = 1;
-    DELETE = 2;
-};
-
-/// A change in the page. If |source| is set to |NEW|, |new_value| must be set
-/// to the new value. If |source| is not |NEW|, |new_value| and |priority| are
-/// ignored.
-struct MergedValue {
-    vector<uint8>:256 key;
-    ValueSource source;
-    BytesOrReference? new_value;
-    Priority priority;
-};
-
-/// An entry in a diff, as returned by |MergeResultProvider|.
-///
-/// If |base|, |left| or |right| are NULL, this means that the corresponding key
-/// was not present in the base, left or right (respectively) branch of the
-/// page.
-struct DiffEntry {
-    vector<uint8>:256 key;
-
-    Value? base;
-    Value? left;
-    Value? right;
-};
-
-/// A value in a DiffEntry.
-///
-/// If the value is LAZY and is not present locally, |value| will be NULL. The
-/// value can be retrieved using a |Fetch()| call on a corresponding snapshot.
-struct Value {
-    fuchsia.mem.Buffer? value;
-    Priority priority;
-};
-
-/// Status for methods that return a sequence of values.
-enum IterationStatus : int8 {
-    /// The iteration has finished.
-    OK = 0;
-    /// The iteration has not finished. The method must be called again to
-    /// retrieve the next batch of responses.
-    PARTIAL_RESULT = 1;
-};
-
-/// A merge result provider, obtained from |ConflictResolver.Resolve()|. Can be
-/// used to retrieve data about the conflict, and provide the merge result. When
-/// all changes have been sent, |Done()| should be called to mark the end of
-/// incoming merge changes.
-interface MergeResultProvider : ErrorNotifier {
-    /// |GetFullDiff| returns the set of all key/value pairs (entries) that
-    /// have been modified between the common ancestor (see
-    /// |ConflictResolver.Resolve()|) and the left and right branches.
-    ///
-    /// Values of |LAZY| keys may not be present on the device. In that case, the
-    /// corresponding Value objects within DiffEntry will have a NULL |value|
-    /// field. If needed, |left| and |right|, provided by the
-    /// |ConflictResolver.Resolve()| method can be used by clients to Fetch these
-    /// values. If a key is not present at all in one of the branches, its
-    /// corresponding Value object will be NULL.
-    ///
-    /// The first call to get the |DiffEntry|s should be done using a NULL
-    /// token. If the result does not fit in a single fidl message, |status| will
-    /// be |PARTIAL_RESULT| and |next_token| will have a non-NULL value, which can
-    /// be used to retrieve the rest of the results by calling |GetFullDiff()|
-    /// with that token.
-    1: GetFullDiff(Token? token)
-           -> (Status status, vector<DiffEntry> changes, Token? next_token);
-    1001: GetFullDiffNew(Token? token)
-              -> (IterationStatus status, vector<DiffEntry> changes, Token? next_token);
-
-    /// |GetConflictingDiff| returns the set of all key/value pairs that were
-    /// modified on both sides to different values, or deleted on one side and
-    /// modified on the other.
-    ///
-    /// It behaves like |GetFullDiff| otherwise.
-    2: GetConflictingDiff(Token? token)
-           -> (Status status, vector<DiffEntry> changes, Token? next_token);
-    1002: GetConflictingDiffNew(Token? token)
-              -> (IterationStatus status, vector<DiffEntry> changes, Token? next_token);
-
-    /// Once the result of the merge has been computed |Merge()| can be called with
-    /// all changes that resolve this conflict. If the result does not fit in a
-    /// single fidl message, |Merge()| can be called multiple times. If any of the
-    /// |Merge()| calls fails, i.e. |status| is not |OK|, all following calls will
-    /// fail with the same error.
-    ///
-    /// If a key/value pair is sent multiple times in one or several |Merge()|
-    /// call, only the last pair is taken into account.
-    ///
-    /// For all keys for which no merged value has been set (either here or
-    /// through |MergeNonConflictingEntries()| below), the left value will be
-    /// used. It is thus not necessary to send a MergedValue with a |LEFT| value
-    /// source, unless to overwrite a previous MergedValue.
-    3: Merge(vector<MergedValue> merge_changes) -> (Status status);
-    1003: MergeNew(vector<MergedValue> merge_changes);
-
-    /// Automatically merges all non conflicting entries (entries that are
-    /// modified on one side only or identical on both sides). This is equivalent
-    /// to sending, through |Merge()|, a MergedValue with a |RIGHT| ValueSource
-    /// for all non-conflicting keys modified on the right side. Conflicting
-    /// entries can still be merged using the |Merge()| method.
-    4: MergeNonConflictingEntries() -> (Status status);
-    1004: MergeNonConflictingEntriesNew();
-
-    /// Marks the end of merge changes to resolve this conflict. After |Done()| is
-    /// called |MergeResultProvider| interface cannot be used any more.
-    5: Done() -> (Status status);
-    1005: DoneNew();
-};
-
-/// Custom conflict resolver. If a |ConflictResolverFactory| is registered, and
-/// |ConflictResolverFactory.GetPolicy()| returns |AUTOMATIC_WITH_FALLBACK| or
-/// |CUSTOM| when called for a given page, the |NewConflictResolver| method will
-/// be called and will provide a |ConflictResolver|. Each time a custom conflict
-/// resolution is needed according to the chosen policy, the method
-/// |ConflictResolver.Resolve()| will be called, and the client will resolve the
-/// conflict by returning the final value for all conflicting keys as well as
-/// values for any other key that the client wants to change.
-interface ConflictResolver {
-    /// Method called when a conflict needs to be resolved. |left| and |right|
-    /// contain the snapshots of the two branches and |common_version| that of the
-    /// lowest common ancestor. |common_version| can be NULL if this version is no
-    /// longer available. The result of the merge can be given through the
-    /// |result_provider|, using the left branch as the base of the merge commit,
-    /// i.e. only key/value pairs that are different from the left version of the
-    /// page should be sent. |result_provider| can also be used to retrieve the set
-    /// of differences, i.e. conflicting keys, between the two versions.
-    1: Resolve(PageSnapshot left, PageSnapshot right, PageSnapshot? common_version,
-               MergeResultProvider new_result_provider);
-};
-
-/// Synchronization state.
-enum SyncState {
-    /// There are no pending operations.
-    IDLE = 0;
-    /// There are pending operations, but there is no syncing in progress. This
-    /// could be because of (possibly a combination of):
-    ///  - waiting for better connectivity
-    ///  - waiting due to internal policies (e.g. batching network requests,
-    ///      waiting for a merge to happen before uploading)
-    ///  - waiting to determine if synchronization is needed (e.g. during initial
-    ///      setup)
-    PENDING = 1;
-    /// Synchronization is in progress.
-    IN_PROGRESS = 2;
-    /// An internal error occurred while trying to sync.
-    ERROR = 3;
-};
-
-/// Watcher interface to be implemented by clients who wish to follow the
-/// synchronization status of their ledger. SyncStateChanged callback must be
-/// called for new state change calls to be sent.
-interface SyncWatcher {
-    1: SyncStateChanged(SyncState download_status, SyncState upload_status) -> ();
-};
diff --git a/public/fidl/fuchsia.modular.auth/BUILD.gn b/public/fidl/fuchsia.modular.auth/BUILD.gn
deleted file mode 100644
index f5bbc15..0000000
--- a/public/fidl/fuchsia.modular.auth/BUILD.gn
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-# TODO(alhaad/ukode): Also move these services to a separate repository.
-fidl("fuchsia.modular.auth") {
-  sdk_category = "partner"
-
-  sources = [
-    "account/account.fidl",
-    "account_provider.fidl",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.ui.viewsv1token",
-  ]
-}
diff --git a/public/fidl/fuchsia.modular.auth/account/account.fidl b/public/fidl/fuchsia.modular.auth/account/account.fidl
deleted file mode 100644
index de52e9d..0000000
--- a/public/fidl/fuchsia.modular.auth/account/account.fidl
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular.auth;
-
-// Stores attributes related to an account that is exposed to base shell.
-// A list of existing account(s) can be obtained via
-// UserProvider.PreviousUsers() and a new account can be added via
-// UserProvider.AddAccount().
-struct Account {
-    // A randomly generated identifier that is used to identify this
-    // account on this device. This is meant to be used by base shell when it
-    // wants to login as a user who has previously logged in.
-    string id;
-
-    // The identity provider that was used to authenticate the user on this
-    // device.
-    IdentityProvider identity_provider;
-
-    // Unique identifier configured for the given user at the Identity provider.
-    // Profile id is fetched from user profile attributes as configured by the
-    // user at the given identity provider.
-    string profile_id;
-
-    // The name that is displayed on the base shell while logging in. Display
-    // name is fetched from user profile attributes as configured by the user at
-    // the given identity provider.
-    string display_name;
-
-    // User's profile url that is used by the base shell while logging in.
-    // Profile url is fetched from user profile attributes as configured by the
-    // user at the given identity provider.
-    string url;
-
-    // User's profile image url that is used by the base shell while logging in.
-    // Profile image url is fetched from user profile attributes as configured by
-    // the user at the given identity provider.
-    string image_url;
-};
-
-// The currently supported identity providers. An identity provider provides
-// identifiers for users to interact with the system and may provide information
-// about the user that is known to the provider.
-enum IdentityProvider {
-    // An identity provider that's used for development and testing. If this
-    // identity provider is chosen, the Framework will continue as if it has
-    // identified the user. Note that the users that use this id provider would
-    // not get cloud ledger access (unless done via a side channel).
-    DEV = 0;
-
-    // Uses Google as the identity provider. Doing this requires a working network
-    // connection and a web view.
-    GOOGLE = 1;
-};
diff --git a/public/fidl/fuchsia.modular.auth/account_provider.fidl b/public/fidl/fuchsia.modular.auth/account_provider.fidl
deleted file mode 100644
index e32a85c..0000000
--- a/public/fidl/fuchsia.modular.auth/account_provider.fidl
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular.auth;
-
-using fuchsia.ui.viewsv1token;
-
-// Authentication errors returned by AccountProvider. It contains error status
-// code along with a detailed error message.
-struct AuthErr {
-    Status status;
-    string message;
-};
-
-// Specifies the success/failure status.
-enum Status {
-    // Success
-    OK = 0;
-    // A problem with client configuration such as invalid_client, missing params
-    // etc. This should happen only in development not at run-time, unless
-    // user/developer changes any of this config. No retry is required.
-    BAD_REQUEST = 1;
-    // Unable to parse the server side response. Retry is optional, this error
-    // should be extremely rare.
-    BAD_RESPONSE = 2;
-    // Server is reachable and propagated an error returned by OAuth Server
-    // backends.  That kind of error cannot be fixed on retries, and has some
-    // root cause that needs to be addressed either in the client's configuration
-    // or because the user explicitly revoked access to the client app.  For
-    // instance: invalid_token, expired_token, invalid_client_id, invalid_user,
-    // invalid_args, etc.
-    OAUTH_SERVER_ERROR = 3;
-    // User cancelled the flow, no need to retry.
-    USER_CANCELLED = 4;
-    // Network error, eg. unreachable. This may be temporary, a retry is
-    // recommended.
-    NETWORK_ERROR = 5;
-    // Internal error. Retry is optional, this error should be rare.
-    INTERNAL_ERROR = 6;
-};
-
-// An interface that allows the Framework to talk to the token manager service
-// to add new accounts and be able to mint the corresponding |TokenManager|
-// specialized instances for thid party agents and first party ledger client.
-//
-// This is only meant to be used by the Framework and will be replaced with
-// |AccountManager| in the near future.
-[Discoverable]
-interface AccountProvider {
-    // Adds a new user account. This involves talking to the identity provider and
-    // fetching profile attributes.
-    2: AddAccount(IdentityProvider identity_provider)
-           -> (Account? account, string? error_code);
-
-    // Removes an existing user account. This involves talking to account's
-    // identity provider and revoking user credentials both locally and remotely.
-    // This operation also deletes cached tokens for the given account.
-    //
-    // TODO(ukode): Modify this api to take account_id and IDP as input once the
-    // Account struct is cleaned up.
-    //
-    // If |revoke_all| is set to true, then all device credentials are revoked
-    // both locally and remotely on the backend server and user is logged out from
-    // all devices. If |revoke_all| is set to false, then credentials stored
-    // locally are wiped. This includes cached tokens such as access/id and
-    // firebase tokens and the locally persisted refresh token. By default,
-    // |revoke_all| is set to false and deletes account only from that given
-    // device.
-    3: RemoveAccount(Account account, bool revoke_all) -> (AuthErr status);
-
-    // This signals |AccountProvider| to teardown itself. After the
-    // AccountProvider responds by closing its handle, the caller may terminate
-    // the |AccountProvider| application if it hasn't already exited.
-    5: Terminate();
-};
diff --git a/public/fidl/fuchsia.modular.internal/BUILD.gn b/public/fidl/fuchsia.modular.internal/BUILD.gn
deleted file mode 100644
index 2a0645f..0000000
--- a/public/fidl/fuchsia.modular.internal/BUILD.gn
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-fidl("fuchsia.modular.internal") {
-  cpp_legacy_callbacks = true
-
-  sources = [
-    "basemgr_debug.fidl",
-    "sessionmgr.fidl",
-    "story_data.fidl",
-  ]
-  deps = [
-    "//garnet/public/fidl/fuchsia.auth",
-    "//garnet/public/fidl/fuchsia.ui.policy",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1token",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-  ]
-}
diff --git a/public/fidl/fuchsia.modular.internal/basemgr_debug.fidl b/public/fidl/fuchsia.modular.internal/basemgr_debug.fidl
deleted file mode 100644
index 44e6527..0000000
--- a/public/fidl/fuchsia.modular.internal/basemgr_debug.fidl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular.internal;
-
-// A debug interface exposed by `basemgr` to allow developer tools to control
-// state within the `basemgr` process.
-[Discoverable]
-interface BasemgrDebug {
-    // Restarts the current session.
-    RestartSession();
-
-    // Logs in as a guest user.
-    LoginAsGuest();
-};
diff --git a/public/fidl/fuchsia.modular.internal/sessionmgr.fidl b/public/fidl/fuchsia.modular.internal/sessionmgr.fidl
deleted file mode 100644
index 5a9f440..0000000
--- a/public/fidl/fuchsia.modular.internal/sessionmgr.fidl
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular.internal;
-
-using fuchsia.auth;
-using fuchsia.modular;
-using fuchsia.modular.auth;
-using fuchsia.ui.policy;
-using fuchsia.ui.viewsv1token;
-
-// The basemgr application (there is no |Basemgr| service) requests
-// an instance of this service in order to launch and display a |Sessionmgr| per
-// user.
-// TODO(alexmin): Re-word this bit once the Sessionmgr implementation is landed.
-[Discoverable] // Created by sessionmgr application.
-interface Sessionmgr {
-    // Launches a sessionmgr instance for a user identified by |user_id| and
-    // specific TokenManager handles for ledger and agent_runner.
-    // TODO(alhaad): Fold paramters into |UserContext|.
-    1: Initialize(fuchsia.modular.auth.Account? account,
-                  fuchsia.modular.AppConfig session_shell,
-                  fuchsia.modular.AppConfig story_shell,
-                  fuchsia.auth.TokenManager? ledger_token_manager,
-                  fuchsia.auth.TokenManager? agent_token_manager,
-                  UserContext user_context,
-                  request<fuchsia.ui.viewsv1token.ViewOwner>? view_owner);
-
-    2: SwapSessionShell(fuchsia.modular.AppConfig session_shell) -> ();
-};
-
-// This interface is provided by basemgr to |Sessionmgr|.
-interface UserContext {
-    // See detailed comments in SessionShellContext.Logout().
-    1: Logout();
-
-    2: GetPresentation(request<fuchsia.ui.policy.Presentation> presentation);
-};
diff --git a/public/fidl/fuchsia.modular.internal/story_data.fidl b/public/fidl/fuchsia.modular.internal/story_data.fidl
deleted file mode 100644
index ed1f50f..0000000
--- a/public/fidl/fuchsia.modular.internal/story_data.fidl
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular.internal;
-
-using fuchsia.ledger;
-using fuchsia.modular;
-
-// Metadata and summary information about a single story.  Does not contain the
-// data necessary to run a story: see story_model.fidl for that.
-struct StoryData {
-    // Metadata available to the SessionShell.
-    fuchsia.modular.StoryInfo story_info;
-
-    // An optional client-supplied name for this story.
-    string? story_name;
-
-    // Story metadata and configuration.
-    fuchsia.modular.StoryOptions story_options;
-
-    // Page id on the user's ledger which stores story information. It
-    // might be NULL until the story is being started.
-    fuchsia.ledger.PageId? story_page_id;
-};
diff --git a/public/fidl/fuchsia.modular.storymodel/BUILD.gn b/public/fidl/fuchsia.modular.storymodel/BUILD.gn
deleted file mode 100644
index 0cbb358..0000000
--- a/public/fidl/fuchsia.modular.storymodel/BUILD.gn
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-fidl("fuchsia.modular.storymodel") {
-  sources = [
-    "constants.fidl",
-    "story_model.fidl",
-    "story_model_mutation.fidl",
-  ]
-  deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
diff --git a/public/fidl/fuchsia.modular.storymodel/constants.fidl b/public/fidl/fuchsia.modular.storymodel/constants.fidl
deleted file mode 100644
index 5630ec1..0000000
--- a/public/fidl/fuchsia.modular.storymodel/constants.fidl
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular.storymodel;
-
-const uint32 MAX_STORY_NAME_LENGTH = 1024;
-
-const uint32 MAX_MODULES_PER_STORY = 128;
-const uint32 MAX_MODULE_NAME_LENGTH = 1024;
diff --git a/public/fidl/fuchsia.modular.storymodel/story_model.fidl b/public/fidl/fuchsia.modular.storymodel/story_model.fidl
deleted file mode 100644
index a496a22..0000000
--- a/public/fidl/fuchsia.modular.storymodel/story_model.fidl
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular.storymodel;
-
-using fuchsia.modular;
-
-// IMPORTANT: StoryModel must only contain field types that are cloneable.
-//
-// The `StoryModel` FIDL table is used to represent the state of a story.
-// `sessionmgr` keeps a separate `StoryModel` in memory for each running story,
-// and also persists changes to it onto storage.
-table StoryModel {
-  // The name of the story, set at story create time.
-  //
-  // Always set. Immutable.
-  1: string:MAX_STORY_NAME_LENGTH name;
-
-  // An enum describing if the story is RUNNING, STOPPING, STOPPED.
-  //
-  // Always set. Defaults to StoryState::STOPPED.
-  2: fuchsia.modular.StoryState runtime_state;
-
-  // An enum describing how the story should be displayed, when focused,
-  // in the StoryShell.
-  //
-  // Always set. Defaults to StoryVisibilityState::DEFAULT.
-  3: fuchsia.modular.StoryVisibilityState visibility_state;
-
-  // A list of modules present in the story.
-  //
-  // Always set. Defaults to an empty list.
-  4: vector<ModuleModel>:MAX_MODULES_PER_STORY modules;
-};
-
-table ModuleModel {
-  // The name of the module, set by the client that requested creation
-  // of the module. The name uniquely identifies this module within
-  // the story.
-  //
-  // Always set. Immutable.
-  1: string:MAX_MODULE_NAME_LENGTH name;
-};
\ No newline at end of file
diff --git a/public/fidl/fuchsia.modular.storymodel/story_model_mutation.fidl b/public/fidl/fuchsia.modular.storymodel/story_model_mutation.fidl
deleted file mode 100644
index 9d096e6..0000000
--- a/public/fidl/fuchsia.modular.storymodel/story_model_mutation.fidl
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular.storymodel;
-
-using fuchsia.modular;
-
-// The `StoryModelMutation` union represents the set of all possible low-level mutations to data
-// for a single story. A vector of mutations represent mutations that are to be applied to the
-// model in a single transaction.
-//
-// This structured is used internally in `sessionmgr` and is not exposed to any clients outside
-// that process. Clients will typically construct these indirectly using convenience methods on the
-// `StoryMutator` class.
-union StoryModelMutation {
-  // Sets the value of |StoryModel.visibility_state|.
-  fuchsia.modular.StoryVisibilityState set_visibility_state;
-
-  // Sets the value of |StoryModel.runtime_state|.
-  fuchsia.modular.StoryState set_runtime_state;
-};
diff --git a/public/fidl/fuchsia.modular/BUILD.gn b/public/fidl/fuchsia.modular/BUILD.gn
deleted file mode 100644
index e2f1cb8..0000000
--- a/public/fidl/fuchsia.modular/BUILD.gn
+++ /dev/null
@@ -1,86 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-fidl("fuchsia.modular") {
-  cpp_legacy_callbacks = true
-
-  sdk_category = "partner"
-
-  sources = [
-    "agent/agent.fidl",
-    "agent/agent_context.fidl",
-    "agent/agent_controller/agent_controller.fidl",
-    "agent/agent_provider.fidl",
-    "basemgr/base_shell.fidl",
-    "basemgr/user_provider.fidl",
-    "clipboard/clipboard.fidl",
-    "component/component_context.fidl",
-    "component/message_queue.fidl",
-    "config/config.fidl",
-    "context/context_engine.fidl",
-    "context/context_reader.fidl",
-    "context/context_writer.fidl",
-    "context/debug.fidl",
-    "context/metadata.fidl",
-    "context/value.fidl",
-    "context/value_type.fidl",
-    "entity/entity.fidl",
-    "entity/entity_provider.fidl",
-    "entity/entity_reference_factory.fidl",
-    "entity/entity_resolver.fidl",
-    "intent/intent.fidl",
-    "intent/intent_handler.fidl",
-    "lifecycle/lifecycle.fidl",
-    "module/link_path.fidl",
-    "module/module_context.fidl",
-    "module/module_controller.fidl",
-    "module/module_data.fidl",
-    "module/module_manifest.fidl",
-    "module/module_state.fidl",
-    "module_resolver/module_resolver.fidl",
-    "session/device_map.fidl",
-    "session/focus.fidl",
-    "session/session_shell.fidl",
-    "story/create_link.fidl",
-    "story/create_module_parameter_map.fidl",
-    "story/link.fidl",
-    "story/puppet_master.fidl",
-    "story/story_command.fidl",
-    "story/story_controller.fidl",
-    "story/story_info.fidl",
-    "story/story_options.fidl",
-    "story/story_provider.fidl",
-    "story/story_shell.fidl",
-    "story/story_state.fidl",
-    "story/story_visibility_state.fidl",
-    "suggestion/debug.fidl",
-    "suggestion/proposal.fidl",
-    "suggestion/proposal_publisher.fidl",
-    "suggestion/query_handler.fidl",
-    "suggestion/suggestion_display.fidl",
-    "suggestion/suggestion_engine.fidl",
-    "suggestion/suggestion_provider.fidl",
-    "suggestion/user_input.fidl",
-    "surface/container.fidl",
-    "surface/surface.fidl",
-    "user_intelligence/intelligence_services.fidl",
-    "user_intelligence/scope.fidl",
-    "user_intelligence/user_intelligence_provider.fidl",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.auth",
-    "//garnet/public/fidl/fuchsia.images",
-    "//garnet/public/fidl/fuchsia.media",
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/fidl/fuchsia.ui.policy",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1token",
-    "//peridot/public/fidl/fuchsia.ledger",
-    "//peridot/public/fidl/fuchsia.modular.auth",
-    "//peridot/public/fidl/fuchsia.speech",
-    "//zircon/public/fidl/fuchsia-mem",
-  ]
-}
diff --git a/public/fidl/fuchsia.modular/README.md b/public/fidl/fuchsia.modular/README.md
deleted file mode 100644
index b91e29d..0000000
--- a/public/fidl/fuchsia.modular/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Modular FIDL API
-
-## Public SDK Approved APIs
-
-Modular has a large surface area which is undergoing significant change.
-For this reason, not all FIDL services are approved for external use.
-Here are the currently approved APIs:
-
-* fuchsia.modular.Agent
-* fuchsia.modular.PuppetMaster (with the exception of method `PuppetMaster.WatchSession()`).
-* fuchsia.modular.StoryPuppetMaster
-
-> NOTE: All `struct`s and `table`s assocated with the services above are
-> implicitly included.
\ No newline at end of file
diff --git a/public/fidl/fuchsia.modular/agent/agent.fidl b/public/fidl/fuchsia.modular/agent/agent.fidl
deleted file mode 100644
index 8e05225..0000000
--- a/public/fidl/fuchsia.modular/agent/agent.fidl
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.sys;
-
-/// An agent is a component whose lifecycle is not tied to any Story.
-///
-/// - An agent is a singleton instance.
-/// - Components can connect to an Agent using the
-///   fuchsia.modular.ComponentContext capability.
-/// - An agent vends services to components that connect to it over a
-///   ServiceProvider.
-/// - An agent is started when someone wants to connect to it, or when a task it
-///   has scheduled has triggered.
-///
-/// This FIDL interface should be implemented by a component that is meant to be
-/// run as an Agent.
-///
-/// When an agent application implements the |Lifecycle| interface, it can
-/// receive a signal for when it should stop. An agent may be stopped for the
-/// following reasons:
-///
-/// (1) All |AgentController| connections associated with this agent are closed.
-///
-/// (2) The system wants to optimize for resources.
-///
-/// Once the framework delivers a |Lifecycle.Terminate()|, the agent application
-/// may exit itself, or is killed by framework after a timeout.
-///
-/// For more info see:
-/// - fuchsia.modular.AgentContext and fuchsia.modular.ComponentContext for
-///   capabilities an agent has.
-/// - fuchsia.modular.Lifecycle for how Components get lifecycle events.
-[Discoverable] // Created by each agent.
-interface Agent {
-    /// Called when some component tries to connect to this agent. |requestor_url|
-    /// is the identifier for the component which called
-    /// |ComponentContext.ConnectToAgent()|. The |services| are provided to that
-    /// component.
-    1: Connect(string requestor_url, request<fuchsia.sys.ServiceProvider> services);
-
-    /// Called when some task identified by |task_id| is scheduled to run. The task
-    /// was first posted by this Agent using |AgentContext.ScheduleTask()|. The
-    /// return callback is called by this Agent when all work related to this task
-    /// is completed. Note that the framework may call |Lifecycle.Terminate()|
-    /// before RunTask returns.
-    ///
-    /// TODO(alhaad): The current implementation allows the Agent to run a task
-    /// until its callback returns. If the task takes a long time to finish, the
-    /// framework has no way to signal a request for termination other than to shut
-    /// down the entire Agent instance. Instead, we should cap task length with
-    /// strategies like budgets. Also, the Task should likely have its own
-    /// connection that allows for more signalling.
-    2: RunTask(string task_id) -> ();
-};
diff --git a/public/fidl/fuchsia.modular/agent/agent_context.fidl b/public/fidl/fuchsia.modular/agent/agent_context.fidl
deleted file mode 100644
index c0f0b6d..0000000
--- a/public/fidl/fuchsia.modular/agent/agent_context.fidl
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.auth;
-
-/// An instance of this service is exposed to agents in their namespace.
-/// |AgentContext| allows an agent to schedule tasks which run in response to
-/// triggers. Triggers are conditions such as a message arriving on a
-/// MessageQueue.
-[Discoverable]
-interface AgentContext {
-    /// DEPRECATED: ComponentContext is now available in the
-    /// namespace/environment for Modules.
-    1: GetComponentContext(request<ComponentContext> request);
-
-    /// Connects to an EntityReferenceFactory for this Agent. Entity references
-    /// obtained from this EntityReferenceFactory will be resolved back to this
-    /// Agent.
-    4: GetEntityReferenceFactory(request<EntityReferenceFactory> request);
-
-    /// Schedules a task described in |task_info|. When this task is scheduled to
-    /// run, Agent.RunTask() is called.
-    ///
-    /// TODO(MI4-962): Add a callback to task scheduling.
-    5: ScheduleTask(TaskInfo task_info);
-
-    /// No new runs of this task will be scheduled.
-    6: DeleteTask(string task_id);
-
-    /// The auth token manager this Agent may use for accessing external services.
-    7: GetTokenManager(request<fuchsia.auth.TokenManager> request);
-};
-
-/// Used to describe a task to the framework.
-struct TaskInfo {
-    /// An agent provided task id that can be used later to refer to this task.
-    string task_id;
-
-    /// The condition that would cause this task to get scheduled.
-    TriggerCondition trigger_condition;
-
-    /// If set to true, the trigger condition will be persisted on the user's
-    /// ledger and will be available across reboots and devices.
-    bool persistent;
-};
-
-/// Describes the condition that needs to be met for a task to become scheduled.
-/// This is not yet complete and will be extended or changed.
-union TriggerCondition {
-    /// Triggers when there is a new message on a message queue.
-    ///
-    /// |message_on_queue| is the name of the message queue to be watched. This
-    /// means that only the component that originally obtained the message queue
-    /// will be able to observe new message events.
-    string message_on_queue;
-
-    /// Triggers when a message queue is deleted.
-    ///
-    /// |queue_deleted| is the token for the message queue that is to be watched.
-    /// This allows both message queue readers and writers to watch for queue
-    /// deletions.
-    string queue_deleted;
-
-    /// Fires an inexact repeating alarm every |alarm_in_seconds| seconds that'll
-    /// satisfy this trigger condition. The first alarm fires in
-    /// |alarm_in_seconds| seconds.
-    uint32 alarm_in_seconds;
-};
diff --git a/public/fidl/fuchsia.modular/agent/agent_controller/agent_controller.fidl b/public/fidl/fuchsia.modular/agent/agent_controller/agent_controller.fidl
deleted file mode 100644
index 5f587a4..0000000
--- a/public/fidl/fuchsia.modular/agent/agent_controller/agent_controller.fidl
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// This interface is used by the caller of ComponentContext::ConnectToAgent() to
-// tell the framework that it is still interested in keeping this Agent running.
-//
-// The system counts AgentController connections and terminates this Agent if
-// the count goes to zero.
-interface AgentController {
-};
diff --git a/public/fidl/fuchsia.modular/agent/agent_provider.fidl b/public/fidl/fuchsia.modular/agent/agent_provider.fidl
deleted file mode 100644
index 03d17c3..0000000
--- a/public/fidl/fuchsia.modular/agent/agent_provider.fidl
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Sessionmgr creates an instance of this service and passes it to the
-// SessionShell so it can observe Agents for the user.
-//
-// TODO(alhaad): Add interfaces for modifying Agents for the user.
-interface AgentProvider {
-    // Registers a listener for changes in the list of agents.
-    1: Watch(AgentProviderWatcher watcher);
-};
-
-// This interface is implemented by clients of AgentProvider and is updated
-// whenever there is a change to the list of users.
-interface AgentProviderWatcher {
-    // Gives a full list of all agents that are running or scheduled to run.
-    // TODO(alhaad): This currently only contains the URL of the agents. It should
-    // contain more state information.
-    1: OnUpdate(vector<string> agent_urls);
-};
diff --git a/public/fidl/fuchsia.modular/basemgr/base_shell.fidl b/public/fidl/fuchsia.modular/basemgr/base_shell.fidl
deleted file mode 100644
index ff27c45..0000000
--- a/public/fidl/fuchsia.modular/basemgr/base_shell.fidl
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.auth;
-using fuchsia.ui.policy;
-
-// This interface is implemented by a base shell. Dependencies and parameters
-// are passed to it in Initialize() on startup. The base shell is also
-// expected to implement Lifecycle in order to receive a Terminate() call on
-// teardown.
-//
-// In one component instance there can only be one BaseShell service instance.
-// The ViewOwner request is sent to the separate ViewProvider service. This way,
-// the base shell may be implemented as a flutter component.
-//
-// Teardown may be initiated by the base shell calling
-// BaseShellContext.Shutdown(), or by the system shutting down.
-[Discoverable]
-interface BaseShell {
-    1: Initialize(BaseShellContext base_shell_context,
-                  BaseShellParams base_shell_params);
-
-    // This method may be invoked by the basemgr to request an
-    // AuthenticationUIContext. |request| will then be used to request the base
-    // shell to show login screen during a UserProvider.AddUser() or if a token
-    // needs to be refreshed.
-    3: GetAuthenticationUIContext(request<fuchsia.auth.AuthenticationUIContext> request);
-};
-
-// This interface allows the |BaseShell| to request capabilities from the
-// |Basemgr| in a way that is more explicit about the services that are
-// offered than a generic |ServiceProvider|.
-interface BaseShellContext {
-    1: GetUserProvider(request<UserProvider> request);
-
-    // This requests the shutdown of the basemgr.
-    2: Shutdown();
-};
-
-// These params are passed to |BaseShell.Initialize|.
-struct BaseShellParams {
-    // TODO(jjosh): make this non-optional, if feasible.
-    fuchsia.ui.policy.Presentation? presentation;
-};
diff --git a/public/fidl/fuchsia.modular/basemgr/user_provider.fidl b/public/fidl/fuchsia.modular/basemgr/user_provider.fidl
deleted file mode 100644
index 45aeca7..0000000
--- a/public/fidl/fuchsia.modular/basemgr/user_provider.fidl
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.modular.auth;
-using fuchsia.ui.viewsv1token;
-using fuchsia.sys;
-
-// Given by the |Basemgr| to the |BaseShell| at Initialize() so the
-// |BaseShell| can get information about the users of this device from the
-// |Basemgr|, and act on the provided information (including extending the
-// user database).
-interface UserProvider {
-    // Adds information of a user that can be used to authenticate her/him to this
-    // device. Once successfully added, the user can login to the same device via
-    // Login().
-    //
-    // |identity_provider| is the identity provider to use for identification.
-    //
-    // |device_name| is what the user wants to name the device. If null or empty
-    // the device's current hostname will be used.
-    //
-    // |account| is NULL if there was an error during identification and
-    // |error_code| is set.
-    1: AddUser(fuchsia.modular.auth.IdentityProvider identity_provider)
-           -> (fuchsia.modular.auth.Account? account, string? error_code);
-
-    // Removes information of a user from the local user database.
-    //
-    // |account_id| is received from either AddUser() or PreviousUsers().
-    2: RemoveUser(string account_id) -> (string? error_code);
-
-    // Uses the credentials provided in AddUser() to start a user session. This
-    // would mean syncing with the user's ledger instance and displaying a user
-    // shell with all of the user's stories.
-    // TODO(alhaad): In the future, we want to protect Login() with a password,
-    // Android lock pattern, etc.
-    3: Login(UserLoginParams user_login_params);
-
-    // List of all users who have authenticated to this device in the past.
-    4: PreviousUsers() -> (vector<fuchsia.modular.auth.Account> accounts);
-};
-
-// Used to specify arguments to log into a user session.
-struct UserLoginParams {
-    // |account_id| is received from either AddUser() or PreviousUsers(). It
-    // can be NULL which means logging-in in an incognito mode.
-    string? account_id;
-
-    // |view_owner| is the view given to the |SessionShell| started for the newly
-    // logged-in user.
-    request<fuchsia.ui.viewsv1token.ViewOwner> view_owner;
-
-    // Services provided by the |BaseShell| that can be offered to the
-    // |SessionShell| that is being logged into.
-    fuchsia.sys.ServiceProvider? services;
-
-    // If login fails, |user_controller| is closed.
-    request<UserController> user_controller;
-};
-
-// Provided by the |Basemgr| to the |BaseShell| when it authenticates a
-// new user. This interface provides control to a logged-in user's life cycle,
-// and the life of this interface is bound to a user being logged in.
-//
-// An interface similar to this one, |UserContext|, is provided to the user
-// shell. It also contains a method to request logout. The difference is of
-// level of ownership and control:
-//
-// - A controller interface to one component instance is given to a component
-//   instance which has control over the life cycle of the first component
-//   instance. As such, the controller interface can be used by the controlling
-//   component to change the life cycle of the controlled component.
-//
-// - A context interface to one component instance is given to a component
-//   instance whose life cycle is controlled by the first component instance. As
-//   such, the context interface can be used by the controlled component to
-//   request a change to its life cycle (among other functions).
-//
-// In general, the separation of a service |Foo| implemented by a component, and
-// the service |FooController| given to the client of that component (rather
-// than |Foo| directly) is a hallmark of inversion of control that pervades the
-// design of our services.
-interface UserController {
-    // Logs out a user by tearing down its sessionmgr. Returns once the
-    // Sessionmgr has been torn down. This also triggers OnLogout() for
-    // |UserWatcher|s.
-    1: Logout() -> ();
-
-    // Registers a watcher for the user's life cycle events.
-    2: Watch(UserWatcher watcher);
-
-    // Stops the currently running session shell and starts the one specified by
-    // |session_shell_config|. This operation stops all stories before starting
-    // the new shell.
-    3: SwapSessionShell(AppConfig session_shell_config) -> ();
-};
-
-// Implemented by a |BaseShell| implementation in order to receive
-// notification about life cycle changes of a logged in user.
-interface UserWatcher {
-    // Called when a user has logged out, either by UserController.Logout() or by
-    // UserContext.Logout(). By the time this event is processed by a watcher, the
-    // Sessionmgr may already be torn down.
-    //
-    // TODO(vardhan): Make a guarantee that once OnLogout() is invoked, it is
-    // possible to UserProvider.Login() the same user.
-    1: OnLogout();
-};
diff --git a/public/fidl/fuchsia.modular/clipboard/clipboard.fidl b/public/fidl/fuchsia.modular/clipboard/clipboard.fidl
deleted file mode 100644
index 903b57d..0000000
--- a/public/fidl/fuchsia.modular/clipboard/clipboard.fidl
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// An interface that provides clients with the ability to store and
-// retrieve text.
-[Discoverable]
-interface Clipboard {
-    // Pushes |text| onto the clipboard.
-    1: Push(string text);
-
-    // Peeks at the current topmost item on the clipboard and returns
-    // it, or null if no such item exists.
-    2: Peek() -> (string? text);
-};
diff --git a/public/fidl/fuchsia.modular/component/component_context.fidl b/public/fidl/fuchsia.modular/component/component_context.fidl
deleted file mode 100644
index 853b120..0000000
--- a/public/fidl/fuchsia.modular/component/component_context.fidl
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.ledger;
-using fuchsia.sys;
-
-// Provided to all component instances in their respective initialization
-// information by the framework. For example, a Module gets it from its
-// ModuleContext and an Agent gets it from its AgentContext.
-[Discoverable]
-interface ComponentContext {
-    // Gets the Ledger associated with this component. This ledger instance is
-    // unique to this component (nb. not the component instance) under this user.
-    1: GetLedger(request<fuchsia.ledger.Ledger> request);
-
-    // Used to start an agent in the user scope if it isn't already running, and
-    // connect to it.
-    2: ConnectToAgent(string url,
-                      request<fuchsia.sys.ServiceProvider> incoming_services,
-                      request<AgentController> controller);
-
-    // Used to create or delete a message queue or retrieve an existing queue
-    // identified by |name|. |name| is local to the calling component instance.
-    3: ObtainMessageQueue(string name, request<MessageQueue> queue);
-    4: DeleteMessageQueue(string name);
-
-    // Gets a MessageSender service that can be used to send a message to a queue
-    // identified by |queue_token|. Token for a MessageQueue is obtained from its
-    // GetToken() method. The token is unique within the scope of the user, i.e.
-    // it can be used by other component instances than the one that created the
-    // message queue.
-    5: GetMessageSender(string queue_token, request<MessageSender> sender);
-
-    // Gets the EntityResolver service, which can be used to resolve an entity
-    // reference to an Entity interface.
-    6: GetEntityResolver(request<EntityResolver> request);
-
-    // Creates a new entity from |type_to_data| such that duplicate types are
-    // overriden by subsequent entries.
-    //
-    // This is a useful way to represent small immutable entities without having
-    // to provide the entity using an Agent. The types and data together must be
-    // within 16KB in size.
-    7: CreateEntityWithData(vector<TypeToDataEntry> type_to_data)
-           -> (string? entity_reference);
-
-    // Gets the package name of this component.
-    //
-    // TODO(vardhan): MI4-939. This information should likely be exposed by a
-    // lower level (component-level, or application level). This information is
-    // most meant for a component to identify itself automatically when publishing
-    // metrics.
-    8: GetPackageName() -> (string package_name);
-};
-
-// Used by ComponentContext.CreateEntityWithData().
-struct TypeToDataEntry {
-    string type;
-    string data;
-};
diff --git a/public/fidl/fuchsia.modular/component/message_queue.fidl b/public/fidl/fuchsia.modular/component/message_queue.fidl
deleted file mode 100644
index 27c2af0..0000000
--- a/public/fidl/fuchsia.modular/component/message_queue.fidl
+++ /dev/null
@@ -1,64 +0,0 @@
-// Use of this source code is governed by a BSD-style license that can be
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.mem;
-
-// A message queue is a named, locally persistent FIFO data structure. Message
-// queues are created, read from, and deleted by component instances through
-// their ComponentContext service.
-//
-// A message queue is created by a component instance from its component context
-// in order to receive messages in it.
-//
-// A sender token that identifies the queue can be obtained from the message
-// queue connection and passed to other components. This enables the other
-// component to send messages to the queue. A sender token does not allow a
-// component to read messages from a queue.
-//
-// The name of a queue is local to the component instance, i.e. it can only be
-// used by the component instance that created the queue to access it. The name
-// can specifically be used to obtain a MessageReader connection for the message
-// queue.
-//
-// The existence of message queues and their tokens is synchronized across
-// devices, allowing components with instances on multiple devices to route
-// messages within each device. For example, modules can use sender tokens on
-// different devices and see those messages delivered to the agent instance on
-// the same device. However, individual messages are local to a device.
-interface MessageQueue {
-    // Gets a sender token associated with this queue. It can be used by other
-    // components to send messages to this queue.
-    1: GetToken() -> (string queue_token);
-
-    // Registers a receiver for this MessageQueue. MessageReader.OnReceive() is
-    // called when there is an unread message. There can be at most one receiver
-    // registered for a message queue at any time. Registering a new receiver
-    // replaces the previous one.
-    2: RegisterReceiver(MessageReader receiver);
-};
-
-// Used to send a message to a message queue. The MessageSender connection is
-// obtained from ComponentContext.GetMessageSender() using a queue token of the
-// MessageQueue. The queue token is obtained by the component that created the
-// message queue and is then passed to the other component through services
-// specific to either component.
-interface MessageSender {
-    1: Send(fuchsia.mem.Buffer message);
-};
-
-// A component instance may implement and register a MessageReader interface
-// using MessageQueue.RegisterReceiver(). When there are new unread messages,
-// they are sent to MessageReader.OnReceive(). TODO(vardhan): There is a
-// conflict with C++ fidl bindings for 'MessageReceiver'. After that is fixed,
-// rename this interface to MessageReceiver.
-interface MessageReader {
-    // Called when there is a new message to be received. Once an OnReceive()
-    // responds back, the message is acknowledged as having been received and the
-    // next one is sent when available. If a client's OnReceive() does not respond
-    // before the MessageReader interface is closed, then a future MessageReader
-    // for this message queue will receive the unacknowledged message again.
-    1: OnReceive(fuchsia.mem.Buffer message) -> ();
-};
diff --git a/public/fidl/fuchsia.modular/config/config.fidl b/public/fidl/fuchsia.modular/config/config.fidl
deleted file mode 100644
index f3f29fd..0000000
--- a/public/fidl/fuchsia.modular/config/config.fidl
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Used to pass around configuration references to apps such as user
-// shell, base shell, story shell.
-struct AppConfig {
-    string url;
-    vector<string>? args;
-};
diff --git a/public/fidl/fuchsia.modular/context/README.md b/public/fidl/fuchsia.modular/context/README.md
deleted file mode 100644
index a56f72b..0000000
--- a/public/fidl/fuchsia.modular/context/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-The files in this directory are undergoing a refactoring. Please reference MW-52
-for progress and more information.
\ No newline at end of file
diff --git a/public/fidl/fuchsia.modular/context/context_engine.fidl b/public/fidl/fuchsia.modular/context/context_engine.fidl
deleted file mode 100644
index 4839c2d..0000000
--- a/public/fidl/fuchsia.modular/context/context_engine.fidl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Top-level service provider interface that vends services to read and write
-// context data.
-[Discoverable]
-interface ContextEngine {
-    1: GetReader(ComponentScope client_info, request<ContextReader> request);
-
-    2: GetWriter(ComponentScope client_info, request<ContextWriter> request);
-
-    3: GetContextDebug(request<ContextDebug> request);
-};
diff --git a/public/fidl/fuchsia.modular/context/context_reader.fidl b/public/fidl/fuchsia.modular/context/context_reader.fidl
deleted file mode 100644
index 8f4d48b..0000000
--- a/public/fidl/fuchsia.modular/context/context_reader.fidl
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Exposes access to Context values, each of which are explicitly named by a
-// 'topic'. Each topic has a known/pre-defined value representation.
-//
-// This interface is meant to be used in the scope of a single Fuchsia
-// component.
-[Discoverable]
-interface ContextReader {
-    // When any conditions that would cause the resulting set of context values
-    // selected by |query| to change, a ContextUpdate is sent to |listener|.
-    //
-    // The current state of values selected by |query| are sent to |listener|
-    // immediately.
-    //
-    // The subscription will continue to stay active as long as the |listener|
-    // handle is not closed.
-    1: Subscribe(ContextQuery query, ContextListener listener);
-
-    // Returns the current context state matching |query|.
-    2: Get(ContextQuery query) -> (ContextUpdate update);
-};
-
-struct ContextQuery {
-    // A map of ContextSelector structs. The keys are specified by the client.
-    // Each key gets a corresponding entry in |ContextUpdate.values| when it is
-    // generated in response to this query.
-    vector<ContextQueryEntry> selector;
-};
-
-struct ContextQueryEntry {
-    string key;
-    ContextSelector value;
-};
-
-struct ContextSelector {
-    // A partial metadata struct. Any metadata value given in |meta| restricts
-    // the set of values in the eventual ContextUpdate to include only those
-    // whose metadata match values given.
-    //
-    // A null |meta| will match any value of the given |type|. Use this sparingly
-    // as a full update could become quite large.
-    // TODO(thatguy): Find users of this and eliminate them if it becomes a
-    // scaling problem.
-    //
-    // For example, to select all context values in a given story, one would
-    // specify:
-    //    meta.value["story"]["id"] = "..."
-    ContextMetadata? meta;
-
-    // A string specifying the type of context object to return.
-    ContextValueType type;
-};
-
-interface ContextListener {
-    // Receives a full snapshot of context state every time context is updated
-    // in such a way that results in a changed set of values for the ContextQuery
-    // used in the subscription for this listener.
-    //
-    // TODO(thatguy): A broad ContextQuery will result in a large
-    // |ContextUpdate|, which may exceed the FIDL max message size. In this case
-    // updates would not be propagated. If this becomes an issue, allowing
-    // clients to opt for delta-updates instead of state snapshots would suffice,
-    // albeit also add some complexity to client implementations.
-    1: OnContextUpdate(ContextUpdate update);
-};
-
-struct ContextUpdate {
-    // A list of ContextValue for each key in |ContextQuery.selector|. An empty
-    // list means no values matched the given ContextSelector.
-    vector<ContextUpdateEntry> values;
-};
-
-struct ContextUpdateEntry {
-    string key;
-    vector<ContextValue> value;
-};
diff --git a/public/fidl/fuchsia.modular/context/context_writer.fidl b/public/fidl/fuchsia.modular/context/context_writer.fidl
deleted file mode 100644
index 48406a5..0000000
--- a/public/fidl/fuchsia.modular/context/context_writer.fidl
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-[Discoverable]
-interface ContextWriter {
-    // Creates and returns a ContextValueWriter for a future value of |type|,
-    // allowing the client to set and update the contents at a later time.  The
-    // value is removed from the Context service when |value_writer| is closed or
-    // a connection error occurs.
-    1: CreateValue(request<ContextValueWriter> value_writer, ContextValueType type);
-
-    // This method is here to make transitioning from topic-based context
-    // publishing to CreateValue() easier and will be removed eventually.
-    // Internally, calls CreateValue() with type = ContextValueType.ENTITY,
-    // and sets metadata.entity.topic = topic, unless WriteEntityTopic() was
-    // called already on this instance with the same |topic| value. In that case,
-    // performs an upate instead of adding a new value.
-    //
-    // Leaving |value| null removes the topic value from the Context service.
-    //
-    // TODO(thatguy): Remove this method and replace its behavior with
-    // client-side library methods.
-    2: WriteEntityTopic(string topic, string? value);
-};
-
-interface ContextValueWriter {
-    // Like ContextWriter.CreateValue(), but creates the new value as a child to
-    // this value.
-    //
-    // TODO(thatguy): What is the lifetime relationship between these two values?
-    // Ie, does removing the parent remove all its children?
-    1: CreateChildValue(request<ContextValueWriter> value_writer, ContextValueType type);
-
-    // Updates the content and/or metadata of this value. If either |content| or
-    // |metadata| are left null, the existing values will remain.
-    2: Set(string? content, ContextMetadata? metadata);
-};
diff --git a/public/fidl/fuchsia.modular/context/debug.fidl b/public/fidl/fuchsia.modular/context/debug.fidl
deleted file mode 100644
index c1bb3d0..0000000
--- a/public/fidl/fuchsia.modular/context/debug.fidl
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-[Discoverable]
-interface ContextDebug {
-    // The watch will stay active until the |listener| handle is closed.
-    1: Watch(ContextDebugListener listener);
-
-    // Waits until Context Engine has reached a steady state such that no further
-    // activity will occur unless acted upon from the outside.
-    2: WaitUntilIdle() -> ();
-};
-
-interface ContextDebugListener {
-    // Called any time a value is added, updated or removed. Each element in
-    // |values| represents a single add, update or remove operation.  Values are
-    // guaranteed to appear before their children in the case that a parent and
-    // its child are included in the same update.
-    1: OnValuesChanged(vector<ContextDebugValue> values);
-
-    2: OnSubscriptionsChanged(vector<ContextDebugSubscription> subscription);
-};
-
-// Represents a single update to a value. If |value| is omitted, the value with
-// |id| was deleted.
-struct ContextDebugValue {
-    vector<string> parent_ids;
-    string id;
-    ContextValue? value;
-};
-
-struct ContextDebugSubscription {
-    string id;
-
-    // These are null when describing a subscription that was removed, although
-    // it's safe to condition only on |query|.
-    SubscriptionDebugInfo? debug_info;
-    ContextQuery? query;
-};
-
-struct SubscriptionDebugInfo {
-    ComponentScope client_info;
-};
diff --git a/public/fidl/fuchsia.modular/context/metadata.fidl b/public/fidl/fuchsia.modular/context/metadata.fidl
deleted file mode 100644
index 1f160b6..0000000
--- a/public/fidl/fuchsia.modular/context/metadata.fidl
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// This struct serves two purposes. It is:
-//
-// 1) Used to expose metadata along with each context node when interfacing
-// with clients either publishing, or retieving, context values.
-//
-// 2) Used while getting or querying for context values from a ContextReader to
-// restrict the set of values returned by partially specifying a
-// ContextMetadata struct.
-//
-// TODO(thatguy): Consider splitting these two purposes into their own structs
-// if the dual-responsibility becomes difficult to manage.
-struct ContextMetadata {
-    StoryMetadata? story;
-    ModuleMetadata? mod; // Annoyingly, "module" is a reserved word in FIDL.
-    EntityMetadata? entity;
-    LinkMetadata? link;
-
-    // TODO(thatguy): Add Agent metadata.
-};
-
-struct StoryMetadata {
-    string? id;
-    FocusedState? focused;
-    // TODO(thatguy): Add modular.StoryState
-    // TODO(thatguy): Add visible state.
-};
-
-struct ModuleMetadata {
-    string? url;
-    vector<string>? path;
-    FocusedState? focused;
-};
-
-struct EntityMetadata {
-    string? topic;
-    vector<string>? type;
-};
-
-struct LinkMetadata {
-    // These fields are identical to those in modular.LinkPath. Can't use
-    // modular.LinkPath directly because depending on lib/modular/fidl:link_path
-    // causes issues with Dart bindings (they try to import the file from the
-    // wrong package name), and depending on lib/modular/fidl causes a dependency
-    // cycle (lib/context -> lib/module -> lib/user_intelligence -> lib/context).
-    //
-    // TODO(thatguy): Once we have FIDL2 (which will apparently fix the Dart
-    // bindings problem), use LinkPath.
-    vector<string>? module_path;
-    string? name;
-};
-
-// bool type cannot be made optional (in StoryMetadata above), so we cannot
-// differentiate between an unspecified value and false. So we have to create a
-// struct with an enum in it to represent the boolean states, so that we can
-// allow it to be null.
-struct FocusedState {
-    FocusedStateState state;
-};
-
-enum FocusedStateState {
-    FOCUSED = 1;
-    NOT_FOCUSED = 2;
-};
diff --git a/public/fidl/fuchsia.modular/context/value.fidl b/public/fidl/fuchsia.modular/context/value.fidl
deleted file mode 100644
index 5aa206e..0000000
--- a/public/fidl/fuchsia.modular/context/value.fidl
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-struct ContextValue {
-    // The type of value this describes.
-    ContextValueType type;
-
-    // If |type| == ContextType.ENTITY, contains the JSON encoded representation
-    // of the Entity's content.
-    // TODO(thatguy): When Entities are handles we can pass around, make this
-    // a FIDL handle to the entity.
-    string? content;
-
-    // All metadata for the node. When this ContextValue is included in a
-    // ContextUpdate, |meta| will contain a merged view of metadata that is
-    // inclusive of all of this value node's ancestors.
-    ContextMetadata meta;
-};
diff --git a/public/fidl/fuchsia.modular/context/value_type.fidl b/public/fidl/fuchsia.modular/context/value_type.fidl
deleted file mode 100644
index c8463c7..0000000
--- a/public/fidl/fuchsia.modular/context/value_type.fidl
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-enum ContextValueType {
-    STORY = 1;
-    MODULE = 2;
-    AGENT = 3;
-    ENTITY = 4;
-    LINK = 5;
-};
diff --git a/public/fidl/fuchsia.modular/entity/entity.fidl b/public/fidl/fuchsia.modular/entity/entity.fidl
deleted file mode 100644
index fdf1abf..0000000
--- a/public/fidl/fuchsia.modular/entity/entity.fidl
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.mem;
-
-/// A multi-typed data entity.
-interface Entity {
-    /// Returns the types associated with this entity. Each entry in |types|
-    /// references a well-known content type.
-    1: GetTypes() -> (vector<string> types);
-
-    /// Given one of the types returned from |GetTypes()| above, returns
-    /// associated short-form data, or null if the type is absent from
-    /// |GetTypes()|.
-    2: GetData(string type) -> (fuchsia.mem.Buffer? data);
-
-    /// Sets the data for a particular type. This will precipitate an |OnUpdated|
-    /// event with the associated type.
-    3: WriteData(string type, fuchsia.mem.Buffer data)
-           -> (EntityWriteStatus status);
-
-    /// Gets the entity reference for this entity, which can be persisted and
-    /// then later used to locate this entity. These references are weak
-    /// references and are not sufficient to keep the entity alive.
-    4: GetReference() -> (string entity_reference);
-
-    /// Begins watching for data changes on a particular type. The watcher
-    /// immediately fires |OnUpdated| with the current value for the requested
-    /// type (or null if the type is not present). Closing the |Entity| interface
-    /// does not close the watcher.
-    5: Watch(string type, EntityWatcher watcher);
-};
-
-interface EntityWatcher {
-    /// Fires on data updates for a particular type. If the type is initially not
-    /// present, a null |data| pointer is produced. The type may only transition
-    /// from absent to present at most once, as there is no deletion.
-    ///
-    /// No deduplication is performed.
-    1: OnUpdated(fuchsia.mem.Buffer? data);
-};
-
-enum EntityWriteStatus {
-    OK = 0;
-    /// Indicates a failure of the entity provider to write the update.
-    ERROR = 1;
-    /// Entity providers are not necessarily required to support entity mutation.
-    READ_ONLY = 2;
-};
diff --git a/public/fidl/fuchsia.modular/entity/entity_provider.fidl b/public/fidl/fuchsia.modular/entity/entity_provider.fidl
deleted file mode 100644
index 28ac9c1..0000000
--- a/public/fidl/fuchsia.modular/entity/entity_provider.fidl
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.mem;
-
-/// EntityProviders (agents) must implement and provide the |EntityProvider|
-/// service if they create entity references (using |EntityReferenceFactory|).
-/// This service is used by the framework to provide data for an |Entity|
-/// interface for an entity. This interface is requested by the framework in
-/// the agent's *application* outgoing services, and is closed by the framework
-/// when there are no more |Entity|s that need to be provided.
-///
-/// In the below methods, |cookie| will have been previously passed to
-/// |EntityReferenceFactory.CreateReference()|, though this may have been in an
-/// earlier or remote app instance. Entity providers should attempt to resolve
-/// unfamiliar cookies or else treat the entities as empty and read-only.
-[Discoverable]
-interface EntityProvider {
-    /// Returns the types associated with the requested entity. Each entry in
-    /// |type| references a well-known content type.
-    ///
-    /// If the cookie cannot be resolved, the provider should produce an empty
-    /// vector.
-    1: GetTypes(string cookie) -> (vector<string> types);
-
-    /// Given one of the types returned from |GetTypes()| above, returns
-    /// associated short-form data, or null if the type is absent from
-    /// |GetTypes()|.
-    ///
-    /// If the cookie cannot be resolved, the provider should return null.
-    2: GetData(string cookie, string type) -> (fuchsia.mem.Buffer? data);
-
-    /// Sets the data for a particular type. This must precipitate an |OnUpdate|
-    /// event with the associated type.
-    ///
-    /// If the cookie cannot be resolved, the provider should no-op with
-    /// |EntityWriteStatus::READ_ONLY|.
-    3: WriteData(string cookie, string type, fuchsia.mem.Buffer data)
-           -> (EntityWriteStatus status);
-
-    /// Begins watching for data changes on a particular type. The watcher must
-    /// immediately fire |OnUpdated| with the current value for the requested
-    /// type (or null if the type is not present).
-    ///
-    /// No deduplication of events should be performed.
-    ///
-    /// At most one update may be in-flight at a time on a particular watcher;
-    /// once a client is ready for another update, it will call the callback. At
-    /// most one update should be queued for dispatch for a particular watcher;
-    /// older updates should be dropped.
-    ///
-    /// If the cookie cannot be resolved, the provider should emit a single event
-    /// with null data.
-    5: Watch(string cookie, string type, EntityWatcher watcher);
-};
diff --git a/public/fidl/fuchsia.modular/entity/entity_reference_factory.fidl b/public/fidl/fuchsia.modular/entity/entity_reference_factory.fidl
deleted file mode 100644
index 2396eae..0000000
--- a/public/fidl/fuchsia.modular/entity/entity_reference_factory.fidl
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Agents use this interface to create Entity references that can subsequently
-// be dereferenced into an |Entity| interface using |EntityResolver|.
-// Agents that create entity references must also expose an |EntityProvider|
-// service in their application's outgoing services, so that agents can provide
-// data for |Entity|s that they create. This interface is available through an
-// agent's |AgentContext|.
-interface EntityReferenceFactory {
-    // Agents call this to manufacture a reference for an Entity they will
-    // provide. Returns an opaque, persistable |entity_reference| that components
-    // can resolve into an |Entity| interface using |EntityResolver|. When data is
-    // requested from an |Entity| interface resolved from this |entity_reference|,
-    // the |cookie| associated with this |entity_reference| will be passed back to
-    // the |EntityProvider| of the Agent that originally created this reference.
-    //
-    // |cookie| should uniquely identify the |Entity| within the scope of the
-    // calling entity provider. For example, it may be used as the primary key
-    // value for a database.
-    1: CreateReference(string cookie) -> (string entity_reference);
-};
diff --git a/public/fidl/fuchsia.modular/entity/entity_resolver.fidl b/public/fidl/fuchsia.modular/entity/entity_resolver.fidl
deleted file mode 100644
index 50614cb..0000000
--- a/public/fidl/fuchsia.modular/entity/entity_resolver.fidl
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// This interface is given to all components in their |ComponentContext|. Any
-// component can resolve an entity reference into an |Entity|.
-interface EntityResolver {
-    // Finds and binds |entity_request| to an Entity handle for the Entity
-    // referenced by |entity_reference|. If an error occurs, |entity_request|
-    // will be closed.
-    //
-    // This method is called by any component who wants to use an Entity using an
-    // entity reference. A component has to get an entity reference (directly or
-    // indirectly) from an agent, for example through some fidl interface. The
-    // agent will create an entity reference using EntityReferenceFactory. During
-    // entity resolution, that agent then provides data for the Entity
-    // through an EntityProvider service it exposes. Thus, any Agent that wishes
-    // to use EntityReferenceFactory to dispense entity references through its
-    // agent services MUST also implement the EntityProvider service.
-    1: ResolveEntity(string entity_reference, request<Entity> entity_request);
-};
diff --git a/public/fidl/fuchsia.modular/intent/intent.fidl b/public/fidl/fuchsia.modular/intent/intent.fidl
deleted file mode 100644
index 09fb8ef..0000000
--- a/public/fidl/fuchsia.modular/intent/intent.fidl
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.mem;
-
-// The Intent struct is a runtime descriptor for an abstract action to be initiated
-// in Fuchsia. For details please see docs/intent.md.
-struct Intent {
-    // The name of the action represented by this Intent.
-    //
-    // This is nullable for backwards compatibility.
-    // TODO(MI4-1100): Make action non-nullable.
-    string? action;
-
-    // An explicit handler for the Intent. Specified as the component URL of the
-    // module.
-    string? handler;
-
-    // The parameters that will be passed to the handler of |action|.
-    vector<IntentParameter>? parameters;
-};
-
-// A struct representing a parameter that is passed to the handler of an Intent's
-// Action.
-struct IntentParameter {
-    // The name of the parameter. The handler (i.e. selected mod) will be provided
-    // with the data for this parameter under a link called |name|.
-    string? name;
-
-    // The data that will be passed to the intent handler.
-    IntentParameterData data;
-};
-
-union IntentParameterData {
-    // Set this if you already have an Entity reference at runtime.
-    // Entity.getTypes() will be used to set the constraints for this noun during
-    // resolution.
-    string entity_reference;
-
-    // Set this if you have structured JSON data. Values typically are a JSON
-    // object with a "@type" attribute and other associated data.  TODO(thatguy):
-    // We need to decide if we want to keep this in place, or deprecate this
-    // eventually and move entirely to using Entity references.
-    //
-    // DEPRECATED: Use |entity_reference|.
-    fuchsia.mem.Buffer json;
-
-    // Set this if you want to explicitly define this noun's allowed types. This
-    // is also useful in the cases where the noun has a 'direction' of type
-    // 'output', and you wish to set the allowable output types from the Module
-    // (see docs/modular/manifests/action_template.md for a definition of
-    // 'direction').
-    //
-    // Only one entry in |entity_type| must match the constraint specified by
-    // the Module for the constraint to be considered satisfied.
-    vector<string> entity_type;
-};
diff --git a/public/fidl/fuchsia.modular/intent/intent_handler.fidl b/public/fidl/fuchsia.modular/intent/intent_handler.fidl
deleted file mode 100644
index ee8c8a6..0000000
--- a/public/fidl/fuchsia.modular/intent/intent_handler.fidl
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// The IntentHandler interface is exposed by modules which wish to handle
-// intents on the behalf of other modules or agents.
-//
-// The modular framework expects any module which declares support for intent
-// handling in its module manifest to expose IntentHandler in its outgoing
-// services.
-//
-// Any time the framework receives an intent which is to be handled by a specific
-// module its |IntentHandler| will be called with the intent it is meant to handle.
-[Discoverable]
-interface IntentHandler {
-    // Handles the provided intent. Any links referenced in the intent parameters
-    // will be in the namespace of the handling component, and can be retrieved via
-    // |ModuleContext.GetLink|.
-    1: HandleIntent(Intent intent);
-};
diff --git a/public/fidl/fuchsia.modular/lifecycle/lifecycle.fidl b/public/fidl/fuchsia.modular/lifecycle/lifecycle.fidl
deleted file mode 100644
index 483420a..0000000
--- a/public/fidl/fuchsia.modular/lifecycle/lifecycle.fidl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// An interface implemented by applications that wish to terminate gracefully.
-[Discoverable]
-interface Lifecycle {
-    // The client of this application has requested that this application
-    // terminate gracefully.
-    //
-    // If the application does not terminate itself in a timely manner, the client
-    // may forcibly terminate the application.
-    1: Terminate();
-};
diff --git a/public/fidl/fuchsia.modular/module/link_path.fidl b/public/fidl/fuchsia.modular/module/link_path.fidl
deleted file mode 100644
index e5c575c..0000000
--- a/public/fidl/fuchsia.modular/module/link_path.fidl
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-/// Addresses a Link within a story. A LinkPath struct should be treated as an
-/// opaque unique identifier of a link instance.  The |module_path| and
-/// |link_name| components are leftovers from legacy code and have no external
-/// meaning.
-/// TODO(thatguy,lindkvist): Replace this structure with a vector<>. MI4-1021
-struct LinkPath {
-    vector<string> module_path;
-    string? link_name;
-};
diff --git a/public/fidl/fuchsia.modular/module/module_context.fidl b/public/fidl/fuchsia.modular/module/module_context.fidl
deleted file mode 100644
index 286f3c9..0000000
--- a/public/fidl/fuchsia.modular/module/module_context.fidl
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.ui.viewsv1token;
-using fuchsia.mem;
-
-/// This interface is exposed to all Module instances in a story. It allows to
-/// create Link instances and run more Module instances.
-[Discoverable]
-interface ModuleContext {
-    /// Gets a Link instance with the given name.
-    ///
-    /// The Link instance has a name so that it can be recognized when the story
-    /// is resumed. The name is unique in the scope of the Module instance. If
-    /// the method is called again with the same argument by the same Module
-    /// instance, a new connection to the same Link instance is obtained. It's
-    /// up to the Module instance to ensure the name is unique within the scope
-    /// of itself.
-    ///
-    /// TODO(thatguy): When no modules use null link names any more, make name
-    /// required.
-    1: GetLink(string? name, request<Link> link);
-
-    /// Starts a new Module instance and adds it to the story. The Module to
-    /// execute is identified by the contents of [intent] and the Module instance
-    /// is given a [name] in the scope of the starting Module instance. The view
-    /// for the Module is given to the story shell for display.
-    ///
-    /// Providing a [surface_relation] advises the StoryShell how to layout
-    /// surfaces that the new module creates. If [surface_relation] is null then
-    /// a default relation is used.
-    ///
-    /// If the method is called again with the same [name] by the same Module
-    /// instance, but with different arguments, the existing Module instance is
-    /// restarted with the changed arguments. If the other arguments don't
-    /// change, just an additional ModuleController connection is made.
-    15: AddModuleToStory(string name, Intent intent,
-                         request<ModuleController> module_controller,
-                         SurfaceRelation? surface_relation)
-            -> (StartModuleStatus status);
-
-    /// Like AddModuleToStory(), but requests a [view_owner] explicitly to embed
-    /// the view of the requested Module instance in the view of the requesting
-    /// Module instance, instead of relying on the story shell for display. If a
-    /// Module instance with the same [name] and [intent] is already running,
-    /// [view_owner] is closed.
-    3: EmbedModule(string name, Intent intent,
-                   request<ModuleController> module_controller,
-                   request<fuchsia.ui.viewsv1token.ViewOwner> view_owner)
-           -> (StartModuleStatus status);
-
-    /// DEPRECATED: no longer implemented.
-    6: StartContainerInShell(string container_name,
-                             SurfaceRelation parent_relation,
-                             vector<ContainerLayout> layout,
-                             vector<ContainerRelationEntry> relationships,
-                             vector<ContainerNode> nodes);
-
-    /// DEPRECATED: ComponentContext is now available in the
-    /// namespace/environment for Modules.
-    7: GetComponentContext(request<ComponentContext> request);
-
-    /// Gets the id for this story which may be used to create a suggestion
-    /// proposal to resume this story, especially by agents.
-    9: GetStoryId() -> (string story_id);
-
-    /// Requests that the current story and module gain focus. It's up to the story
-    /// shell and session shell to honor that request.
-    10: RequestFocus();
-
-    /// DEPRECATED in favor of using StartOngoingActivity().
-    11: Active();
-
-    /// When a module calls [RemoveSelfFromStory()] the framework will stop the
-    /// module and remove it from the story. If there are no more running modules
-    /// in the story the story will be deleted.
-    16: RemoveSelfFromStory();
-
-    /// Requests to update the visibility state of the current story within the
-    /// session shell. The framework will decide whether to honor this request, then
-    /// forward it to the session shell.
-    ///
-    /// Modules should not have any knowledge of the story's visibility state, nor
-    /// should it ever operate with any assumption of the visibility state.
-    ///
-    /// Note that the framework keeps this state only in memory, which means that
-    /// across reboots, the story visibility state will revert back to DEFAULT.
-    /// This makes it unsafe for any component outside the framework to make
-    /// assumptions about the story visibility state. Also, this differs from other
-    /// UI states such as focus state, which is persisted across reboots.
-    13: RequestStoryVisibilityState(StoryVisibilityState visibility_state);
-
-    /// Declares that activity of the given [type] is ongoing in this module.
-    /// This information is forwarded to the session shell
-    /// (cf. StoryProvider.WatchActivity() and StoryActivityWatcher).
-    ///
-    /// Modules should close [request] when the ongoing activity has stopped, and
-    /// this will also signal to the session shell that the ongoing activity has
-    /// stopped. For now, pausing media should count as a stopped ongoing activity,
-    /// and when it is resumed it should be started as a new ongoing activity.
-    /// Conversely, media playing in a continuous playlist (i.e playing the next
-    /// video or song) should be treated as the same ongoing activity.
-    /// Modules must request a connection per ongoing activity; a single connection
-    /// may not be re-used for multiple ongoing activities.
-    14: StartOngoingActivity(OngoingActivityType type,
-                             request<OngoingActivity> request);
-
-    /// Creates a [fuchsia.modular.Entity] with the given [type] and [data]. The
-    /// lifetime of the created entity is tied to the lifetime of the current story,
-    /// but can be dereferenced by modules and agents outside the scope of the story.
-    ///
-    /// [entity_request] will be connected to the created entity, or closed if the
-    /// creation fails.
-    ///
-    /// The returned [reference] is the entity reference for the created entity, or
-    /// null if the entity creation failed.
-    17: CreateEntity(string type, fuchsia.mem.Buffer data, request<Entity> entity_request)
-      -> (string? entity_reference);
-};
-
-/// Communicates the status of an Intent to a Module.
-enum StartModuleStatus {
-    SUCCESS = 0;
-    NO_MODULES_FOUND = 1;
-};
-
-/// This interface defines the protocol over which a Module can communicate about
-/// an ongoing activity to the framework. It is provided to Modules via
-/// ModuleContext.StartOngoingActivity().
-interface OngoingActivity {
-};
-
-enum OngoingActivityType {
-    UNSPECIFIED = 0;
-    VIDEO = 1;
-    AUDIO = 2;
-};
diff --git a/public/fidl/fuchsia.modular/module/module_controller.fidl b/public/fidl/fuchsia.modular/module/module_controller.fidl
deleted file mode 100644
index ade34ec..0000000
--- a/public/fidl/fuchsia.modular/module/module_controller.fidl
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-/// This interface is used by the caller of ModuleContext.StartModule() to
-/// control the started Module instance.
-///
-/// Closing this connection doesn't affect its Module instance; it just
-/// relinquishes the ability of the caller to control the Module instance.
-interface ModuleController {
-    /// Requests that this module become the focused module in the story.
-    2: Focus();
-
-    /// Requests that this module be hidden in the story.
-    3: Defocus();
-
-    /// Requests the Module instance to stop. The running Module component's
-    /// Lifecycle::Terminate() method is called, the instance is shut down and
-    /// state within the framework is cleaned up.
-
-    /// The result callback is called once the Module's runtime has been torn down.
-    4: Stop() -> ();
-
-    /// Called with the current state when it changes.
-    /// DEPRECATED: Do not use this. ModuleState is a framework-internal concept
-    /// and should not be exposed outside.
-    5: -> OnStateChange(ModuleState new_state);
-};
diff --git a/public/fidl/fuchsia.modular/module/module_data.fidl b/public/fidl/fuchsia.modular/module/module_data.fidl
deleted file mode 100644
index b55eafe..0000000
--- a/public/fidl/fuchsia.modular/module/module_data.fidl
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-/// Information about a Module instance in a story.
-struct ModuleData {
-    /// The URL of the Module binary.
-    string module_url;
-
-    /// The named path leading up to this Module instance. The last name in this
-    /// array is the name by which the Module was started by the parent Module
-    /// instance calling StartModule().
-    vector<string> module_path;
-
-    /// Contains the mapping of Mod parameter name to Link instances for this mod.
-    ModuleParameterMap parameter_map;
-
-    /// The way in which this Module instance was first started in the story,
-    /// either by request from another Module instance (INTERNAL) or by request
-    /// from outside the story (i.e. by suggestion from an agent - EXTERNAL).
-    ModuleSource module_source;
-
-    /// The |surface_relation| that was used to start this Module instance with.
-    /// The same is used when re-inflating the Module instance when the story is
-    /// resumed. A SurfaceRelation value of null represents an embedded Module
-    /// instance (started by EmbedModule()) that is not managed by the story shell.
-    SurfaceRelation? surface_relation;
-
-    /// True if this module was removed from its story either through
-    /// ModuleController.Stop() or ModuleContext.RemoveSelfFromStory().
-    bool module_deleted;
-
-    /// The intent that was issued to start add this Module instance to the story.
-    /// Some Module instances may have been added not by an Intent, for example as
-    /// the initial module of a story. For those the field may be null.
-    ///
-    /// TODO(thatguy,mesch): This field should now always be set, so make it
-    /// required once the framework is cleaned up enough to guarantee this
-    /// statement.
-    Intent? intent;
-
-    /// If true, this module was started by a parent module using
-    /// ModuleContext.EmbedModule(), and its view is not managed by the
-    /// StoryShell.
-    bool is_embedded = false;
-};
-
-enum ModuleSource {
-    /// Module that was added to the story from within the story by another
-    /// module using ModuleContext.AddModuleToStory() or
-    /// ModuleContext.EmbedModule().
-    INTERNAL = 0;
-
-    /// Module that was added to the story from outside the story using
-    /// PuppetMaster.
-    EXTERNAL = 1;
-};
-
-struct ModuleParameterMap {
-    vector<ModuleParameterMapEntry> entries;
-};
-
-struct ModuleParameterMapEntry {
-    /// A null [name] is allowed for backwards compatibility with default links.
-    /// TODO(thatguy); When no modules use null link names any more, make this
-    /// required.
-    string? name;
-    LinkPath link_path;
-};
diff --git a/public/fidl/fuchsia.modular/module/module_manifest.fidl b/public/fidl/fuchsia.modular/module/module_manifest.fidl
deleted file mode 100644
index c74f241..0000000
--- a/public/fidl/fuchsia.modular/module/module_manifest.fidl
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-/// Metadata that define the runtime properties of a Module.
-struct ModuleManifest {
-    /// The relative path from the root of the package where the Module executable
-    /// file can be found.
-    /// TODO(MF-94): Extract a module's URL from its cmx manifest instead of
-    /// here.
-    string binary;
-
-    /// A human-readable string that can be used when suggesting this Module.
-    string? suggestion_headline;
-
-    /// A list of intents that this module is able to handle.
-    vector<IntentFilter>? intent_filters;
-
-    /// Identifies the pattern with which to compose this module with others.
-    string? composition_pattern;
-
-    /// Defines the color of the placeholder widget used while the module loads.
-    string? placeholder_color;
-};
-
-/// This struct is used to describe an intent that a module is able to handle.
-struct IntentFilter {
-    /// The action this module is able to handle.
-    string action;
-
-    /// Includes the name and types of entities for the parameters required to
-    /// execute specified [action].
-    vector<ParameterConstraint> parameter_constraints;
-};
-
-struct ParameterConstraint {
-    string name;
-    /// The entity type that is valid for this parameter.
-    string type;
-};
diff --git a/public/fidl/fuchsia.modular/module/module_state.fidl b/public/fidl/fuchsia.modular/module/module_state.fidl
deleted file mode 100644
index f2934c9..0000000
--- a/public/fidl/fuchsia.modular/module/module_state.fidl
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-/// State used to notify about state transitions of a Module
-/// instance. This is very similar to the StoryState, however it's not entirely
-/// the same and hence a separate type. A module cannot have an INITIAL state,
-/// because it's started as soon as it is created, and it gets deleted as soon as
-/// it reaches the STOPPED state, whileas a story can be restarted.
-///
-/// Currently possible state transitions (and the events that cause
-/// them) are:
-///
-///            -> RUNNING     ModuleContext.AddModuleToStory() or
-///                           ModuleContext.EmbedModule() or
-///                           StoryController.AddModule()
-///   RUNNING  -> STOPPED     ModuleController.Stop() or StoryController.Stop()
-///   RUNNING  -> ERROR       application exits
-enum ModuleState {
-    /// Module instance was created.
-    RUNNING = 2;
-    /// Module instance is stopped after Module.Stop(). No further transitions are
-    /// to be expected.
-    STOPPED = 4;
-    /// Connection to the Module instance was closed without Stop() request. No
-    /// further transitions are to be expected.
-    ERROR = 5;
-};
diff --git a/public/fidl/fuchsia.modular/module_resolver/module_resolver.fidl b/public/fidl/fuchsia.modular/module_resolver/module_resolver.fidl
deleted file mode 100644
index dfe056b..0000000
--- a/public/fidl/fuchsia.modular/module_resolver/module_resolver.fidl
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-[Discoverable]
-interface ModuleResolver {
-    // Finds Modules (contained in Fuchsia packages) that satisfy the constraints
-    // specified in |query|. Module resolution is done by matching the requested
-    // |query.action| and |query.parameter_constraints| (with both names and
-    // types) against actions and constraints specified in module manifests.
-    //
-    // If no results could be found, |response.results| will be empty.
-    //
-    // For detailed information on the resolution process, see
-    // docs/modular/module_resolution.md.
-    //
-    // TODO(thatguy): Offer some kind of fallback instruction/option to clients
-    // in the case of no results.
-    1: FindModules(FindModulesQuery query) -> (FindModulesResponse response);
-
-    // Find modules that satisfy the constraints specified in |query|. Module
-    // resolution for this method is done by matching only the requested types
-    // specified in |query.parameter_constriants|. This type of query is useful
-    // for finding possible actions that satisfy a set of parameter types.
-    //
-    // Each module result in the response will provide a mapping from the
-    // constraint names in |query| to the parameter names of a module result. If
-    // no results could be found, |response.results| will be empty.
-    2: FindModulesByTypes(FindModulesByTypesQuery query)
-           -> (FindModulesByTypesResponse response);
-
-    // If |module_id| could not be found or does not have a manifest, returns a
-    // null |contents|.
-    3: GetModuleManifest(string module_id) -> (ModuleManifest? contents);
-};
-
-// Mirrors the information present in a Intent. Where a Intent is meant to
-// interface between Modules and the Framework, this structure is specific to
-// the interface between the Framework and the ModuleResolver.
-//
-// In that role, it has references to structures and concepts that are only
-// visible within the abstraction layer of the Framework.
-// TODO(thatguy): Add scoring info here.
-struct FindModulesQuery {
-    // The handler is a module URL; if the handler is specified, the search for
-    // (action, parameter_constraints) is scoped within the specified handler.
-    string? handler;
-    string action;
-    vector<FindModulesParameterConstraint> parameter_constraints;
-};
-
-struct FindModulesParameterConstraint {
-    string param_name;
-    vector<string> param_types;
-};
-
-enum FindModulesStatus {
-    // A search was successfully conducted.
-    SUCCESS = 0;
-    // |FindModulesQuery.handler| was specified but the resolver doesn't know
-    // about it.
-    UNKNOWN_HANDLER = 1;
-};
-
-struct FindModulesResponse {
-    FindModulesStatus status;
-    vector<FindModulesResult> results;
-};
-
-struct FindModulesResult {
-    // The ID of the Module. For now, this is the URL of the Module binary.
-    string module_id;
-
-    // The Module's manifest file (see docs/manifests/module.md).
-    ModuleManifest? manifest;
-    // TODO(thatguy): Add debug info.
-};
-
-struct FindModulesByTypesQuery {
-    // Even though only |param_types| are used to search for possible modules,
-    // each module result comes with a mapping from constraint_name =>
-    // param_name.
-    vector<FindModulesByTypesParameterConstraint> parameter_constraints;
-};
-
-struct FindModulesByTypesParameterConstraint {
-    // This |constraint_name| is associated with a module result's |param_name|;
-    string constraint_name;
-    vector<string> param_types;
-};
-
-struct FindModulesByTypesResponse {
-    // One result per (module_id, action, param mapping) tuple.
-    // TODO(vardhan): For efficiency, consider grouping the results differently so
-    // there aren't repeated transmissions of a manifest.
-    vector<FindModulesByTypesResult> results;
-};
-
-struct FindModulesByTypesResult {
-    float64 score;
-
-    // The ID of the Module. For now, this is the URL of the Module package.
-    string module_id;
-    string action;
-
-    // The Module's manifest file (see docs/manifests/module.md)
-    ModuleManifest? manifest;
-
-    // A list of mappings from query_constraint_name => result_param_name
-    vector<FindModulesByTypesParameterMapping> parameter_mappings;
-};
-
-// Defines a single mapping entry from a specified constraint name to a module
-// result's parameter name.
-struct FindModulesByTypesParameterMapping {
-    // This is the constraint name as specified in
-    // |FindModulesByTypesParameterConstraint.constraint_name|.
-    string query_constraint_name;
-    // This is the associated parameter name from a module result.
-    string result_param_name;
-};
diff --git a/public/fidl/fuchsia.modular/session/device_map.fidl b/public/fidl/fuchsia.modular/session/device_map.fidl
deleted file mode 100644
index a324d15..0000000
--- a/public/fidl/fuchsia.modular/session/device_map.fidl
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Gives access to the device map of the logged in user.
-[Discoverable] // Exposed in user environment.
-interface DeviceMap {
-    // HACK(mesch): Just exposes all Device/* entries in the ledger.
-    // We'll need something better, possibly with access policy.
-    1: Query() -> (vector<DeviceMapEntry> devices);
-
-    // Returns the current device from the device map.
-    2: GetCurrentDevice() -> (DeviceMapEntry device);
-
-    // Sets the profile string for the current device.
-    // HACK(jimbe) This is a quick-and-dirty solution for FW-316. It needs to be
-    // completely redesigned once the Framework has a concept of profile (such
-    // as landscape/portrait.)
-    3: SetCurrentDeviceProfile(string profile);
-
-    // Requests a notification for each change to the DeviceMap. The given
-    // watcher will receive an initial notification for each existing device.
-    4: WatchDeviceMap(DeviceMapWatcher watcher);
-};
-
-struct DeviceMapEntry {
-    // The device's name. This name is user editable and may be the same between
-    // any of the user's devices.
-    string name;
-
-    // Semi-sticky device ID usable for syncing. Guarantees a unique device id
-    // that no another hardware will be using while this device is syncing.
-    // WARNING: This ID is persisted for an arbitrary amount of time and MAY be
-    // revoked or changed between launches of this service on this hardware.
-    string? device_id;
-
-    // The device's intended usage profile (stored as JSON)
-    string? profile;
-
-    // The last known hostname of this device.
-    // HACK(zbowling): this is temporary to assist with matching devices in
-    // netconnector RPC discovery.
-    string hostname;
-
-    // The time that this DeviceMapEntry was last changed. Will never be zero.
-    // Measured in Unix time, seconds since the epoch. This is not a heartbeat.
-    // Intended to allow detection of stale device entries.
-    uint64 last_change_timestamp;
-};
-
-// Implemented by the client calling DeviceMap.Watch().
-interface DeviceMapWatcher {
-    // Called with the current state right after registration, and subsequently
-    // when the state changes.
-    1: OnDeviceMapChange(DeviceMapEntry entry);
-};
diff --git a/public/fidl/fuchsia.modular/session/focus.fidl b/public/fidl/fuchsia.modular/session/focus.fidl
deleted file mode 100644
index 5edd1b9..0000000
--- a/public/fidl/fuchsia.modular/session/focus.fidl
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// This file has interfaces for 2 pieces of information: (1) The story
-// that is currently in focus and (2) stories that are visible to the
-// user. Names of interfaces follow the usual patterns:
-//
-// {Focus,VisibleStories}Controller is used by session shell to update
-// information whenever changes take place.
-//
-// {Focus,VisibleStories}Provider is used by maxwell and session shell to
-// query and get updates on which story is in focus on which device
-// and visible stories on this device.
-//
-// NOTE(alhaad): The information about visible stories can be used by
-// sessionmgr to stop / pause stories that are not visible to the
-// user.
-
-// Implemented by sessionmgr. Given to session shell through its namespace.
-interface FocusController {
-    // Sets the focus on this device.
-    1: Set(string? focused_story_id);
-    2: WatchRequest(FocusRequestWatcher watcher);
-};
-
-// Implemented by session shell. OnFocusRequest() gets called whenever there
-// is a new request to change focus on this device. Requests can be
-// made via FocusProvider.Request().
-interface FocusRequestWatcher {
-    1: OnFocusRequest(string story_id);
-};
-
-// Implemented by sessionmgr. Given to session shell and session agents through
-// their namespace. Focus is persisted on the ledger.
-[Discoverable]
-interface FocusProvider {
-    // Returns the stories that are focused across all devices.
-    1: Query() -> (vector<FocusInfo> focused_stories);
-
-    // Watches for change in focus on any of the user's devices.
-    2: Watch(FocusWatcher watcher);
-
-    // Requests session shell to change focus on this device. If session shell
-    // responds to this request, focus shall be taken away from
-    // previously focused story and an update will be sent on
-    // FocusWatcher.OnFocusChange(). If |story_id| is NULL, the timeline
-    // is brought back into focus.
-    //
-    // TODO(alhaad): Consider making this available for remote devices as
-    // well.
-    3: Request(string? story_id);
-};
-
-// Implemented by anyone who is interested in getting updates when focus
-// changes.
-interface FocusWatcher {
-    1: OnFocusChange(FocusInfo? focus_info);
-};
-
-// Specifies the focused story of a device.
-struct FocusInfo {
-    // The id of the device.
-    string device_id;
-
-    // The id of the focused story.  If null, no stories are focused.
-    string? focused_story_id;
-
-    // The time the focused story on the device |device_id| was last
-    // changed. 0 if no focus has ever been set for device |device_id|.
-    uint64 last_focus_change_timestamp;
-};
-
-// Implemented by sessionmgr. Given to session shell through its namespace.
-interface VisibleStoriesController {
-    1: Set(vector<string>? visible_story_ids);
-};
-
-// Implemented by sessionmgr. Given to story info through its namespace.
-// Visible stories are NOT stored on the ledger.
-[Discoverable] // Maxwell apps request this from environment.
-interface VisibleStoriesProvider {
-    // Returns the |story_ids| that are currently visible.
-    1: Query() -> (vector<string> story_id);
-
-    // Watches for change in visible stories on this device.
-    2: Watch(VisibleStoriesWatcher watcher);
-};
-
-// Implemented by anyone (maxwell) who is interested in getting updates when
-// stories that are currently visible change.
-interface VisibleStoriesWatcher {
-    1: OnVisibleStoriesChange(vector<string>? visible_story_ids);
-};
diff --git a/public/fidl/fuchsia.modular/session/session_shell.fidl b/public/fidl/fuchsia.modular/session/session_shell.fidl
deleted file mode 100644
index b1a421e..0000000
--- a/public/fidl/fuchsia.modular/session/session_shell.fidl
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.modular.auth;
-using fuchsia.speech;
-using fuchsia.ui.policy;
-using fuchsia.ui.viewsv1token;
-
-
-// This interface is implemented by a session shell and is used by the
-// sessionmgr to hand to the session shell views of stories, or to notify that
-// the view of a story is about to be closed.
-[Discoverable]
-interface SessionShell {
-    // Displays the given story view. The story this view belongs to is
-    // identified by |view_id.story_id|.
-    AttachView(ViewIdentifier view_id, fuchsia.ui.viewsv1token.ViewOwner view_owner);
-
-    // Instructs the session shell to detach the view identified by |view_id|
-    // that was previously provided by AttachView() from the UI of the session
-    // shell. The view will be closed soon after DetachView() returns, or when a
-    // timeout is reached.
-    //
-    // It is customary for the session shell to display a placeholder before a
-    // view is attached for a given view identifier, or after it was detached.
-    //
-    // If the story identified by |view_id.story_id| is about to be deleted, the
-    // Shell will observe a call to StoryProviderWatcher.OnDelete() sometime
-    // after DetachView() returns.
-    //
-    // If the session for which this session shell is responsible for is being
-    // terminated, or the session shell is stopped because it's replaced by
-    // another session shell, DetachView() will *not* be called at all, and the
-    // shell will rather observe a call to Lifecycle.Terminate().
-    DetachView(ViewIdentifier view_id) -> ();
-};
-
-// Identifies a view provided to a session shell. The values of the |story_id|
-// field match those used in the |StoryProvider| interface, allowing
-// identification of the same story across interfaces.
-//
-// This is a struct rather than a naked string to allow for future evolution of
-// the identifier without changing the |SessionShell| API itself.
-struct ViewIdentifier {
-  string story_id;
-};
-
-// This interface allows a |SessionShell| to request capabilities from its
-// creator in a way that is more explicit about the services that are
-// offered than a generic |ServiceProvider|.
-[Discoverable]
-interface SessionShellContext {
-    // The account associated with the currently logged-in user. It's NULL if
-    // logged into GUEST mode.
-    1: GetAccount() -> (fuchsia.modular.auth.Account? account);
-    2: GetAgentProvider(request<AgentProvider> request);
-    3: GetComponentContext(request<ComponentContext> request);
-    4: GetDeviceName() -> (string device_name);
-    5: GetFocusController(request<FocusController> request);
-    6: GetFocusProvider(request<FocusProvider> request);
-    8: GetLink(request<Link> request);
-    9: GetPresentation(request<fuchsia.ui.policy.Presentation> request);
-    10: GetSpeechToText(request<fuchsia.speech.SpeechToText> request);
-    11: GetStoryProvider(request<StoryProvider> request);
-    12: GetSuggestionProvider(request<SuggestionProvider> request);
-    13: GetVisibleStoriesController(request<VisibleStoriesController> request);
-
-    // Requests logout of the user. This causes the basemgr to tear down the
-    // |Sessionmgr| instance of the user.
-    16: Logout();
-};
-
-// Session shell provides this service to the framework which may plumb it to
-// different subscribers, such as story shell and intelligence provider.
-//
-// EXPERIMENTAL Service that allows consumers of a given story to get a
-// connection to a Presentation, and visual state services provided by the user
-// shell. This allows story shell implementations to coordinate event and focus
-// handling. An analog mechanism exists between BaseShell and SessionShell.
-[Discoverable] // Created by session shell components.
-interface SessionShellPresentationProvider {
-    // When a StoryShell calls StoryShellContext.GetPresentation(), this request
-    // arrives here.
-    1: GetPresentation(string story_id, request<fuchsia.ui.policy.Presentation> request);
-
-    // When a StoryShell calls StoryShellContext.WatchVisualState(), this request
-    // arrives here.
-    2: WatchVisualState(string story_id, StoryVisualStateWatcher watcher);
-};
diff --git a/public/fidl/fuchsia.modular/story/create_link.fidl b/public/fidl/fuchsia.modular/story/create_link.fidl
deleted file mode 100644
index eec40ae..0000000
--- a/public/fidl/fuchsia.modular/story/create_link.fidl
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.mem;
-
-// Defines the attributes for a Link when the Link is created.
-struct CreateLinkInfo {
-    // Passed as root_json argument to StoryProvider.CreateStoryWithInfo()
-    // Link.Set() to set the value in the root link of the new Story's primary
-    // module.
-    fuchsia.mem.Buffer initial_data;
-
-    // If |allowed_types| is null, the Link contains JSON. No schema validation
-    // is performed.
-    LinkAllowedTypes? allowed_types;
-};
-
-struct LinkAllowedTypes {
-    // The Link must contain an Entity (see Link.SetEntity()) that has at least
-    // one of |allowed_entity_types| in its |Entity.GetTypes()| return value.
-    //
-    // If empty, allows any Entity type.
-    vector<string> allowed_entity_types;
-};
diff --git a/public/fidl/fuchsia.modular/story/create_module_parameter_map.fidl b/public/fidl/fuchsia.modular/story/create_module_parameter_map.fidl
deleted file mode 100644
index 0023acc..0000000
--- a/public/fidl/fuchsia.modular/story/create_module_parameter_map.fidl
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Module parameters are named pointers to link instances.
-struct CreateModuleParameterMapInfo {
-    // Contains instructions to create each name in the parameter map.
-    vector<CreateModuleParameterMapEntry>? property_info;
-};
-
-struct CreateModuleParameterMapEntry {
-    string? key;
-    CreateModuleParameterInfo value;
-};
-
-union CreateModuleParameterInfo {
-    // Instructs parameter map initialization to either use an existing Link
-    // (|link_path| is set) or create a new Link (|create_link| is set).
-    LinkPath link_path;
-    CreateLinkInfo create_link;
-};
diff --git a/public/fidl/fuchsia.modular/story/link.fidl b/public/fidl/fuchsia.modular/story/link.fidl
deleted file mode 100644
index eee4a63..0000000
--- a/public/fidl/fuchsia.modular/story/link.fidl
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains the definition of Link as well as the structure
-// of the data it holds.
-
-library fuchsia.modular;
-
-using fuchsia.mem;
-
-// This interface is implemented by the story runner. The ModuleContext service
-// acts as a factory for it.
-//
-// An instance of Link holds one of two types of values:
-//
-// (1) A JSON string that can be modified incrementally or completely
-//     overwritten, depending on the use of Set() and Update(). The JSON string
-//     is set to "null" when the Link is created.
-//
-// (2) An entity reference that can be set or retrieved with SetEntity() and
-//     GetEntity().
-//
-// Each Module instance receives one Link instance for each parameter of its
-// action template in its ModuleContext. It receives its ModuleContext in
-// Module.Initialize() or in its service namespace. The Module can access its
-// Links by calling ModuleContext.GetLink() with the intent parameter name as
-// the link name. These instances are shared with the parent Module if there is
-// any, or with the StoryController client if the Module is a top level Module
-// of a Story. A Module can create additional Link instances by calling
-// ModuleContext.GetLink() with any other link name. Why would it do that? To
-// share the new Link instance with Modules it requests to start in turn, or to
-// record its own state in the story record, so that it is transferred to other
-// devices that run the same story, or to persist it for later resumption of the
-// story.
-//
-// A client may obtain another handle to the same Link instance by calling
-// GetLink() with the same name again.
-//
-// A client of Link can set the JSON string stored in the instance and register
-// a handler (an implementation of the LinkWatcher interface) to be notified of
-// changes to the JSON string in the Link. A client may or may not be notified
-// of changes it itself makes to the Link value, depending on whether it
-// registers with WatchAll() or Watch(), respectively. If the client registers
-// with Watch(), then it will not be notified of changes made through the same
-// Link connection.
-//
-// No service name: returned from ModuleContext.GetLink().
-interface Link {
-    // Gets the value at the given |path|, which is represented using the JSON
-    // Pointer specification (https://tools.ietf.org/html/rfc6901).
-    //
-    // |json_data| is a UTF8 encoded string representing valid JSON.
-    //
-    // Returns null if |path| does not exist. Returns the entire JSON object
-    // if |path| is either null or an empty array. Returns the string "null" if
-    // the link is empty.
-    2: Get(vector<string>? path) -> (fuchsia.mem.Buffer? json_data);
-
-    // Set() overwrites the value/object/array at the given |path|. Set also
-    // overwrites any values or arrays as necessary to ensure that |path| exists.
-    // The |json_data| parameter must be a UTF8 encoded JSON string.
-    // Either pass "null" to set the value to null, or use Erase to
-    // completely remove a member of an object. To replace the root, pass null for
-    // |path|.
-    //
-    // This call notifies Watchers, although this may be skipped if nothing
-    // changed.
-    3: Set(vector<string>? path, fuchsia.mem.Buffer json_data);
-
-    // Erases the object member at the given |path|. If the path is not found or
-    // does not match the current structure of the JSON, the path will not be
-    // created and the call is ignored. The |path| parameter cannot be null or
-    // zero length because the root is a value, not a key. This call notifies
-    // Watchers, although this may be skipped if nothing changed.
-    5: Erase(vector<string> path);
-
-    // Returns the entity reference in this link. If no entity reference is
-    // present, returns a null fidl string.
-    9: GetEntity() -> (string? entity_reference);
-
-    // Sets this to be an Entity Link with the given |entity_reference|. The
-    // existing value of the link is overwritten. If |entity_reference| is null,
-    // then any existing value in the link is overwritten with the JSON string
-    // "null".
-    10: SetEntity(string? entity_reference);
-
-    // Registers a watcher, which is notified whenever the document changes. This
-    // watcher will not be invoked for changes caused by calls made on this
-    // handle. The Notify() callback method will be immediately invoked with the
-    // value in the Link, even if it's empty.
-    //
-    // The LinkWatcher connection will be closed if the owning Link handle closed.
-
-    // All connections to a Link and LinkWatcher are closed once the story the
-    // link belongs to is stopped.
-    6: Watch(LinkWatcher watcher);
-
-    // Like Watch(), but the watcher is notified also of changes made through the
-    // same handle as the watcher is registered on.
-    7: WatchAll(LinkWatcher watcher);
-
-    // Waits for the completion of methods previously invoked on the same
-    // connection. Allows to create sequentiality across service instances without
-    // giving every method an empty return value. Nb. this makes no guarantees
-    // about sequentiality with methods invoked on different connections, even to
-    // the same Link instance.
-    8: Sync() -> ();
-};
-
-// This interface is implemented by a client of Link.
-//
-// The Notify() method is invoked whenever the Link changes. The entire JSON
-// string in the Link will be sent. In other words, this isn't an incremental
-// notification. |json| cannot be null because an empty Link is the valid JSON
-// document "null".
-//
-// No service name: created by Module.
-interface LinkWatcher {
-    1: Notify(fuchsia.mem.Buffer json);
-};
diff --git a/public/fidl/fuchsia.modular/story/puppet_master.fidl b/public/fidl/fuchsia.modular/story/puppet_master.fidl
deleted file mode 100644
index 23587b9..0000000
--- a/public/fidl/fuchsia.modular/story/puppet_master.fidl
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-enum ExecuteStatus {
-    OK = 0;
-
-    // Encountered an invalid command.
-    INVALID_COMMAND = 1;
-
-    // The |story_id| provided does not exist or is not visible
-    // to this client.
-    INVALID_STORY_ID = 2;
-
-    // A story must contain at least one mod, and the commands given
-    // either don't add one, or remove the last one.
-    STORY_MUST_HAVE_MODS = 3;
-
-    // The mod name specified in AddMod, RemoveMod or SendModCommand
-    // was not found, or is invalid.
-    INVALID_MOD = 4;
-
-    // Resolution of the intent provided in AddMod returned zero results.
-    NO_MODULES_FOUND = 5;
-
-    // Some error happened while executing the command.
-    INTERNAL_ERROR = 6;
-};
-
-struct ExecuteResult {
-    ExecuteStatus status;
-    string? story_id;
-    string? error_message;
-};
-
-// Enables control of a session. A session, conceptually, is a single
-// full-screen experience of a Fuchsia device. A device can run multiple
-// sessions (ie, when one device powers multiple kiosks); that said, sessions
-// are siloed from each other.
-//
-// A session, concretely, is a collection of stories, their state, the modules
-// within them, any agents that run to support the mods and the various UI
-// shells (session and story shells).
-[Discoverable]
-interface PuppetMaster {
-    // Requests a capability to control a story by name. The name acts as the
-    // story's unique ID.  Calling ControlStory() for the same story name will
-    // control the same story.
-    //
-    // The story name, as well as modification to the story, are durable and
-    // persist across device reboots. This allows the client to assign its own
-    // identifiers to stories. Clients wishing to guarantee a new story is
-    // created should generate a UUIDv4 or similar.
-    //
-    // |request| is closed if control cannot be granted.
-    //
-    // TODO(thatguy): We want story names to be scoped to the client's namespace.
-    ControlStory(string story_name, request<StoryPuppetMaster> request);
-
-    // Deletes a story associated to |story_name|.
-    DeleteStory(string story_name) -> ();
-
-    // Returns a list of all the names of stories in the session.
-    GetStories() -> (vector<string> story_names);
-};
-
-struct WatchSessionOptions {
-    // FIDL doens't allow empty structs. We want this struct to exist in the API
-    // for future session watching options.
-    int32 placeholder;
-};
-
-interface StoryPuppetMaster {
-    // Enqueues the given |commands| in the order they are given.
-    // Can be called as many times as necessary to specify the full
-    // set of changes to the story.
-    //
-    // To execute all enqueued commands, call Execute().
-    Enqueue(vector<StoryCommand> commands);
-
-    // Executes the commands enqueued so far by Enqueue() in order and as
-    // a batch: no other commands from other clients will be interleaved.
-    //
-    // If an error occurs, execution is stopped and an error code
-    // and message are returned in |result|.
-    Execute() -> (ExecuteResult result);
-
-    // If this story is new, sets the options for its creation. Must be called
-    // before the first call to Execute(). Any subsequent calls (either on the
-    // same channel or on a new StoryPuppetMaster for an existing story) are
-    // ignored. Some StoryOptions can be changed through specific story commands.
-    // See story_command.fidl for details.
-    SetCreateOptions(StoryOptions story_options);
-};
diff --git a/public/fidl/fuchsia.modular/story/story_command.fidl b/public/fidl/fuchsia.modular/story/story_command.fidl
deleted file mode 100644
index c0ca8fb..0000000
--- a/public/fidl/fuchsia.modular/story/story_command.fidl
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.mem;
-
-// StoryCommands are POD structures that describe the set of operations that
-// can be performed on a story by components outside the modular framework. All commands are:
-//
-//   (1) Scoped to a single story
-//   (2) Idempotent: issuing the same command twice yields the same result
-//   (3) Symmetrical with observation: the same structures are used to describe
-//       operations to watchers of a story (through SessionWatcher) as are used
-//       to control a story.
-union StoryCommand {
-    // Sets the focus state of the story to |set_focus_state.focused|.
-    SetFocusState set_focus_state;
-
-    // Adds a Mod.
-    AddMod add_mod;
-
-    // Removes an existing Mod.
-    RemoveMod remove_mod;
-
-    // Sets the value of a Link.
-    SetLinkValue set_link_value;
-
-    // Brings focus to a mod.
-    FocusMod focus_mod;
-
-    // Updates the kind_of_proto_story option in a story.
-    SetKindOfProtoStoryOption set_kind_of_proto_story_option;
-};
-
-struct SetFocusState {
-    bool focused;
-};
-
-// Adds a mod described by |intent| to the story with name |mod_name|. If
-// |mod_name| already exists in the story, the mod is updated.
-struct AddMod {
-    // The name of the mod within the story. The mod's name acts as the unique
-    // ID of the mod, scoped to the story in which it is contained. Since
-    // AddMod is reused for observation and mod names are vector<string>
-    // inside the framework, they are vector<string> here as well.
-    //
-    // Clients should treat the full vector as a single opaque value.
-    vector<string> mod_name;
-    Intent intent;
-
-    // |surface_relation| defines the visual relationship between this mod and the
-    // mod at |surface_parent_mod_name|.
-    SurfaceRelation surface_relation;
-    vector<string>? surface_parent_mod_name;
-};
-
-// Removes the mod under |mod_name| from the story.
-struct RemoveMod {
-    vector<string> mod_name;
-};
-
-// Sets the value of link at |path| to |value|.
-struct SetLinkValue {
-    LinkPath path;
-    fuchsia.mem.Buffer? value;
-};
-
-// Instructs the session shell to focus the mod under |mod_name|.
-struct FocusMod {
-    vector<string> mod_name;
-};
-
-// Updates the kind_of_proto_story option in a story.
-struct SetKindOfProtoStoryOption {
-    bool value;
-};
diff --git a/public/fidl/fuchsia.modular/story/story_controller.fidl b/public/fidl/fuchsia.modular/story/story_controller.fidl
deleted file mode 100644
index 15648e2..0000000
--- a/public/fidl/fuchsia.modular/story/story_controller.fidl
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.ui.viewsv1token;
-
-// Used by the clients of StoryProvider (SessionShell) to interact with a single
-// story. Created by StoryProvider.
-//
-// If |StoryController| is closed, the |StoryState| associated with this story
-// does not change.
-interface StoryController {
-    // Gets information associated with the story.
-    1: GetInfo() -> (StoryInfo info, StoryState state);
-
-    // Requests to run the story controlled by this |StoryController| instance.
-    // When the story starts, if not yet running, the view of the newly started
-    // story shell will be passed in a call to SessionShell.AttachView().
-    14: RequestStart();
-
-    // Requests to stop the story controlled by this |StoryController|. If Start()
-    // requests are pending when this request is issued, the request is queued
-    // until the Start() requests complete. Before stopping the story, a snapshot
-    // of the story will be taken and saved. Returns when the story is stopped.
-    4: Stop() -> ();
-
-    // Creates a new view with the given |view_owner| request to display
-    // snapshots. Takes a snapshot for the story controlled by this
-    // |StoryController| and then loads the snapshot to the created view such that
-    // it is rendered. The callback will be invoked once the view has been created
-    // and the snapshot has been loaded.
-    13: TakeAndLoadSnapshot(request<fuchsia.ui.viewsv1token.ViewOwner> view_owner) -> ();
-
-    // Registers a watcher for changes of the story state.
-    //
-    // Note that stories can stop themselves at any time and it is advisable
-    // for the holder of a StoryController to provide a watcher.
-    5: Watch(StoryWatcher watcher);
-
-    // DEPRECATED
-    7: GetActiveModules() -> (vector<ModuleData> module_data);
-
-    // DEPRECATED
-    8: GetModules() -> (vector<ModuleData> module_data);
-
-    // DEPRECATED
-    // (metadata about, and requesting changes to runtime state).
-    9: GetModuleController(vector<string> module_path, request<ModuleController> request);
-
-    // DEPRECATED: MI4-1084
-    10: GetActiveLinks(StoryLinksWatcher? watcher) -> (vector<LinkPath> link_data);
-
-    // DEPRECATED
-    11: GetLink(LinkPath link_path, request<Link> link);
-};
-
-// Implemented by the client calling StoryController.Watch().
-interface StoryWatcher {
-    // Called with the current state right after registration, and subsequently
-    // when the state changes.
-    1: OnStateChange(StoryState new_state);
-
-    // DEPRECATED
-    2: OnModuleAdded(ModuleData module_data);
-
-    // DEPRECATED
-    3: OnModuleFocused(vector<string> module_path);
-};
-
-// Implemented by the client calling StoryController.GetActiveLinks().
-//
-// DEPRECATED: StoryController is only to be used for Story concepts
-// (metadata about, and requesting changes to runtime state).
-interface StoryLinksWatcher {
-    // Called when a link becomes active in the story, i.e. when it is loaded into
-    // memory and connected with modules and watchers. After this notification,
-    // the Link can be obtained with GetLink() and further notifications can be
-    // obtained from watchers on the Link and connection error handlers on the
-    // LinkWatcher.
-    //
-    // Note that the Link remains active until there are no connections to it
-    // left. Hence in order to obtain a notification when the Link becomes
-    // inactive, a client must give up the Link connection after registering a
-    // LinkWatcher, and listen for the LinkWatcher connection to go down.
-    //
-    // This is EXPERIMENTAL. We certainly can make this simpler once we know it is
-    // what we need.
-    1: OnNewLink(LinkPath link_path);
-};
diff --git a/public/fidl/fuchsia.modular/story/story_info.fidl b/public/fidl/fuchsia.modular/story/story_info.fidl
deleted file mode 100644
index 519a589..0000000
--- a/public/fidl/fuchsia.modular/story/story_info.fidl
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Information about a story as provided to the SessionShell.
-struct StoryInfo {
-    // URL of the first module run in this story. This module is free to
-    // run more modules in the story. Used for display purposes only.
-    // TODO(thatguy): Remove this. It is not being set any more.
-    string? url;
-
-    // The ID of the Story, used to reference it in method arguments.
-    string id;
-
-    // Wallclock time when the story was last focused. From
-    // zx_clock_get(ZX_CLOCK_UTC), thus nanoseconds since UNIX epoch (1970-01-01
-    // 00:00 UTC).
-    //
-    // A value of zero means the story has never been focused.
-    int64 last_focus_time;
-
-    // Data the SessionShell wants to keep associated with this Story, like
-    // title, a color, or a display rank.
-    vector<StoryInfoExtraEntry>? extra;
-};
-
-struct StoryInfoExtraEntry {
-    string key;
-    string value;
-};
diff --git a/public/fidl/fuchsia.modular/story/story_options.fidl b/public/fidl/fuchsia.modular/story/story_options.fidl
deleted file mode 100644
index 045b646..0000000
--- a/public/fidl/fuchsia.modular/story/story_options.fidl
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-struct StoryOptions {
-    // Whether or not the story will be hidden on a call to
-    // StoryProvider#GetStories.
-    bool kind_of_proto_story;
-};
diff --git a/public/fidl/fuchsia.modular/story/story_provider.fidl b/public/fidl/fuchsia.modular/story/story_provider.fidl
deleted file mode 100644
index eeecfa1..0000000
--- a/public/fidl/fuchsia.modular/story/story_provider.fidl
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Sessionmgr passes a connection to this service to the SessionShell so it can
-// operate on stories for the user. It is also passed to other services that
-// monitor or manipulate stories, specifically the maxwell services.
-//
-// Closing a |StoryProvider| connection has no effect on the state of the
-// framework.
-[Discoverable]
-interface StoryProvider {
-    // Returns a list of existing stories. If |watcher| is provided, the client will
-    // be notified of story changes (new stories, deleted stories, runtime
-    // state changes).
-    4: GetStories(StoryProviderWatcher? watcher) -> (vector<StoryInfo> story_infos);
-
-    // Requests detailed information about the given story. If the story doesn't
-    // exist, returns null.
-    5: GetStoryInfo(string story_id) -> (StoryInfo? story_info);
-
-    // Obtains a controller for a previously created story identified by its story
-    // ID. Obtaining the controller doesn't run it yet. If the story doesn't
-    // exist, the interface request is closed.
-    6: GetController(string story_id, request<StoryController> request);
-
-    // Returns info of known stories.
-    // DEPRECATED: In favor of GetStories().
-    7: PreviousStories() -> (vector<StoryInfo> story_infos);
-
-    // Registers a watcher for changes in the story collection.
-    // DEPRECATED: In favor of GetStories().
-    9: Watch(StoryProviderWatcher watcher);
-
-    // Registers a watcher for ongoing story activity. Upon registration,
-    // StoryActivityWatcher.OnStoryActivity() will be called to update clients
-    // with the initial data. See StoryActivityWatcher for motivations.
-    10: WatchActivity(StoryActivityWatcher watcher);
-};
-
-// Implemented by clients of StoryProvider.
-interface StoryProviderWatcher {
-    // Called in three different situations:
-    //
-    //  * Immediately when a new watcher is registered with one OnChange()
-    //    invocation with the current infor and state of each story known on the
-    //    current device.
-    //
-    //  * Every time a change to StoryInfo is applied to the record of the story
-    //    kept on the current device, including a new story created on another
-    //    device becoming known on this device for the first time.
-    //
-    //  * Every time the StoryState of the story changes on this device. The
-    //    StoryState on another device of a story known on this device is not made
-    //    known on this device.
-    //
-    //  * Every time the StoryVisibilityState of the story changes on this device.
-    //    The StoryVisibilityState on another device of a story known on this
-    //    device is not made known on this device.
-    //
-    //    I.e. if the story is started or stopped on *another* device, it does
-    //    *not* cause an OnChange() call on *this* device. Cf. OnDelete() below.
-    //
-    // The ID of the story the notifications are about are part of StoryInfo.
-    //
-    // |story_state| is STOPPED if the story was just created or just became known
-    // on this device and was not yet started on the current device. It's RUNNING
-    // when the story is started on the current device.
-    //
-    // |story_visibility_state| is DEFAULT until a mod on the current device
-    // requests for the visibility state to be changed.
-    1: OnChange(StoryInfo story_info, StoryState story_state,
-                StoryVisibilityState story_visibility_state);
-
-    // Called when a story record is permanently deleted. The deletion could
-    // have originated on this or on another device.
-    //
-    // If the story is running on this device at the time it is deleted,
-    // OnChange() will not be called first.
-    2: OnDelete(string story_id);
-};
-
-// Implemented by clients of StoryProvider in order to inform them about ongoing
-// activities in stories. |activities| is the entire list of ongoing activities
-// (represented by its type) within the story by the given |story_id|. If
-// |activities| is empty, it means that there is no ongoing activity within the
-// story.
-//
-// Clients can expect this event whenever there is a newly started/stopped
-// ongoing activity, as well as when the client first registers for updates
-// via StoryProvider.WatchActivity(). |activities| can contain duplicate
-// OngoingActivityType's, ex. if a story is playing 2 videos at once.
-interface StoryActivityWatcher {
-    1: OnStoryActivityChange(string story_id,
-                             vector<OngoingActivityType> activities);
-};
diff --git a/public/fidl/fuchsia.modular/story/story_shell.fidl b/public/fidl/fuchsia.modular/story/story_shell.fidl
deleted file mode 100644
index 966465d..0000000
--- a/public/fidl/fuchsia.modular/story/story_shell.fidl
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.ui.policy;
-using fuchsia.ui.viewsv1token;
-
-// This interface is implemented by a story shell. Dependencies are passed to it
-// in Initialize() on startup. The story shell is also expected to implement
-// Lifecycle in order to receive a Terminate() call on teardown.
-//
-// In one component instance there can only be one StoryShell service instance.
-// The ViewOwner request is sent to the separate ViewProvider service. This way,
-// the story shell may be implemented as a flutter component.
-//
-// Teardown may be initiated by the session shell calling StoryController.Stop(),
-// by the sessionmgr being terminated, or by the system shutting down.
-[Discoverable] // Created by story shell applications.
-interface StoryShell {
-    1: Initialize(StoryShellContext story_shell_context);
-
-    // Adds a new Surface and its corresponding view to be displayed by the
-    // StoryShell. More context that allows the story shell to decide how
-    // to layout will be added later. Also, interface to influence life cycle and
-    // focus is obviously missing.
-    // |view_connection| the new view and the associated Surface ID.
-    // |surface_info| metadata relating to the Surface.
-    2: AddSurface(ViewConnection view_connection, SurfaceInfo surface_info);
-
-    // Focuses the surface with surface_id, bringing it to the foreground.
-    3: FocusSurface(string surface_id);
-
-    // Defocuses the surface with surface_id, dismissing it to the background.
-    4: DefocusSurface(string surface_id) -> ();
-
-    // Adds a container, with corresponding container layouts to the story.
-    // Optionally provide a parent_id to connect to, if omitted adds the
-    // Container node as the root of a new tree in the Story
-    // DEPRECATED
-    5: AddContainer(string containerName, string? parentId,
-                    SurfaceRelation relation, // relation of container to parent
-                    vector<ContainerLayout> layout,
-                    vector<ContainerRelationEntry> relationships,
-                    vector<ContainerView> views);
-
-    // Notify when a Surface is focused in the story. The focus could be from
-    // a user interaction or requested by the framework through
-    // StoryController#FocusModule.
-    // EXPERIMENTAL
-    6: -> OnSurfaceFocused(string surface_id);
-
-    // Remove the Surface with surface_id from the StoryShell entirely. This is
-    // final. The Surface is removed from the graph. If necessary, the
-    // associated Surface is defocused. There is no expectation that
-    // DefocusSurface is called before this.
-    7: RemoveSurface(string surface_id);
-
-    // Reconnect the view in viewConnection.
-    //
-    // Called to reconnect views that have previously been added
-    // to the StoryShell via addSurface, and then disconnected. a ViewOwner
-    // connects to a child view and is notified if the view is available. If
-    // it becomes unavailable it's disconnected. If a surface with a
-    // disconnected view is to be shown again, ReconnectView is called.
-    //
-    // E.g. called in response to StoryShell calling RequestView().
-    8: ReconnectView(ViewConnection view_connection);
-
-    // Update the surface
-    // This is called when the intent is to update the surface metadata in the
-    // story graph in place. Any fields, except for the surface_id can be
-    // updated. If no value or null is passed for a field it remains unchanged.
-    // This includes the ViewOwner inside the connection.
-    //
-    // E.g called when an intent resolves to a module that is known by the
-    // caller to already be running, to update associated metadata.
-    9: UpdateSurface(ViewConnection view_connection, SurfaceInfo surface_info);
-};
-
-// A pair mapping the view owner to surface ID
-struct ViewConnection {
-    // The new view corresponding to the surface.
-    fuchsia.ui.viewsv1token.ViewOwner owner;
-
-    // The ID for the surface
-    string surface_id;
-};
-
-// Contain metadata for a Surface
-struct SurfaceInfo {
-    // ID of the view that is parent of this Surface.
-    string parent_id;
-
-    // The relationship between the parent Surface and this new Surface. Used
-    // for layout optimization
-    SurfaceRelation? surface_relation;
-
-    // Information about the module populates the view.
-    ModuleManifest? module_manifest;
-
-    // How the Surface was generated. By an action internal to the story or by
-    // an external action.
-    ModuleSource module_source;
-};
-
-// Maps the node_name to the specific mozart view resulting from resolving and
-// launching the intent specified in a Container node
-struct ContainerView {
-    // Name by which this container node is referenced in container layout and
-    // surface relationship specifications (cf. container.fidl)
-    string node_name;
-
-    // The new view resolved from the intent corresponding to node_name
-    fuchsia.ui.viewsv1token.ViewOwner owner;
-};
-
-// This interface provides the StoryShell instance with everything it needs to
-// know or be able to do about the Story. Not much right now, but we expect this
-// to increase.
-interface StoryShellContext {
-    // Requests a Presentation connection from the SessionShell. See
-    // SessionShellPresenationProvider in session_shell.fidl.
-    1: GetPresentation(request<fuchsia.ui.policy.Presentation> request);
-
-    // Starts watching Story shell's visual state.
-    2: WatchVisualState(StoryVisualStateWatcher watcher);
-
-    // Gets a Link instance that the story shell can use for persisting metadata.
-    3: GetLink(request<Link> request);
-
-    // Requests a view for a Surface.
-    // Requests that a view for |surface_id| is provided through
-    // StoryShell.ReconnectView().
-    4: RequestView(string surface_id);
-
-    // Notification that the Surface is no longer on screen.
-    5: OnSurfaceOffScreen(string surface_id);
-};
-
-// Implemented by StoryShell to get notified about visual state changes.
-interface StoryVisualStateWatcher {
-    1: OnVisualStateChange(StoryVisualState visual_state);
-};
-
-// Defines the visual state of the Story shell.
-enum StoryVisualState {
-    MINIMIZED = 0;
-    MAXIMIZED = 1;
-    MAXIMIZED_OVERLAYED = 2;
-};
diff --git a/public/fidl/fuchsia.modular/story/story_state.fidl b/public/fidl/fuchsia.modular/story/story_state.fidl
deleted file mode 100644
index 797435a..0000000
--- a/public/fidl/fuchsia.modular/story/story_state.fidl
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// State of a Story. A story is either running, stopping, or stopped, separately
-// on every device of the user. If it's running, it can also be focused, but
-// that's tracked in a separate service, cf. FocusProvider in focus.fidl.
-//
-// Possible state transitions are:
-//
-//   STOPPED  -> RUNNING
-//   RUNNING  -> STOPPING
-//   STOPPING -> STOPPED
-enum StoryState {
-    // Story was started using StoryController.Start().
-    RUNNING = 1;
-    // Story is in the middle of stopping after StoryController.Stop() was
-    // called.
-    STOPPING = 2;
-    // Story was not yet run, or Story was stopped after StoryController.Stop()
-    // was called.
-    STOPPED = 3;
-};
diff --git a/public/fidl/fuchsia.modular/story/story_visibility_state.fidl b/public/fidl/fuchsia.modular/story/story_visibility_state.fidl
deleted file mode 100644
index 1afbef1..0000000
--- a/public/fidl/fuchsia.modular/story/story_visibility_state.fidl
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Visibility state of a Story within the session shell.
-// This state describes how a story should be displayed within the session shell,
-// regardless of whether the story is in focus or not. Focus state and
-// visibility state are orthogonal concepts.
-// E.g A story can be out-of-focus and be in IMMERSIVE state at the same time
-// if a user was playing a video, exits, then re-enters the story. The
-// expectation in this scenario is that the story is in IMMERSIVE state upon
-// re-enter.
-//
-// All state transitions are possible.
-enum StoryVisibilityState {
-    // Default state for a story.
-    DEFAULT = 1;
-    // Full-screen user experience, e.g. playing a video.
-    IMMERSIVE = 2;
-};
diff --git a/public/fidl/fuchsia.modular/suggestion/debug.fidl b/public/fidl/fuchsia.modular/suggestion/debug.fidl
deleted file mode 100644
index 8b04dab..0000000
--- a/public/fidl/fuchsia.modular/suggestion/debug.fidl
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Debug service provider interface that provides the ability to listen to
-// the internal state of the suggestion service.
-[Discoverable]
-interface SuggestionDebug {
-    1: WatchAskProposals(AskProposalListener listener);
-    2: WatchInterruptionProposals(InterruptionProposalListener listener);
-    3: WatchNextProposals(NextProposalListener listener);
-
-    // Waits until Suggestion Engine has reached a steady state such that no
-    // further activity will occur unless acted upon from the outside.
-    4: WaitUntilIdle() -> ();
-    // Calls |async::Loop::RunUntilIdle()|, which processes all immediately
-    // available messages. Unlike |WaitUntilIdle|, this does not wait for
-    // long-running delayed tasks.
-    5: RunUntilIdle() -> ();
-};
-
-interface AskProposalListener {
-    // Receives the current ask query and ranked proposals
-    1: OnAskStart(string query, vector<ProposalSummary> proposals);
-    // Receives notification of query completion or dismissal.
-    // |selected_proposal| is null if query was dismissed
-    2: OnProposalSelected(ProposalSummary? selected_proposal);
-};
-
-interface InterruptionProposalListener {
-    // Receives updates to the current proposal list and rankings
-    1: OnInterrupt(ProposalSummary interruption_proposal);
-};
-
-interface NextProposalListener {
-    // Receives updates to the current proposal list and rankings
-    1: OnNextUpdate(vector<ProposalSummary> proposals);
-};
-
-// This is necessary because a Proposal is not Clone-able, as CustomAction
-// can contain an InterfaceHandle.
-struct ProposalSummary {
-    string id;
-    string publisher_url;
-    SuggestionDisplay display;
-};
diff --git a/public/fidl/fuchsia.modular/suggestion/proposal.fidl b/public/fidl/fuchsia.modular/suggestion/proposal.fidl
deleted file mode 100644
index c7c811a..0000000
--- a/public/fidl/fuchsia.modular/suggestion/proposal.fidl
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.mem;
-
-struct Proposal {
-    // Identifies a proposal, namespaced internally to the proposing component and
-    // proposal channel (Query or Next/Interruption).
-    string id;
-
-    // A client-assigned name for the story to which the actions in |on_selected|
-    // apply. If a story with the given name already exists (ie, because a past
-    // Proposal with the same |story_name| was executed), the actions in
-    // |on_selected| will apply to the existing story. Otherwise, a new story is
-    // created.
-    // If |story_name| is null, a new story is always created.
-    // This name is namespaced to the agent that submitted the proposal.
-    string? story_name;
-
-    // Used to restrict the proposal potential appearance as a suggestion only
-    // when certain story or mod is focused.
-    vector<ProposalAffinity> affinity;
-
-    // The list of actions to take when the user selects the associated
-    // Suggestion.
-    vector<StoryCommand> on_selected;
-
-    // An optional hint about the probability that this proposal would be chosen
-    // if it were the only proposal presented to the user. A confidence of 0.0
-    // indicates no hint. The confidence assigned by the system may be subject to
-    // other considerations such as performance metrics.
-    float32 confidence = 0.0;
-
-    // True iff the proposal would like to make use of a rich suggestion. Only
-    // certain components are allowed to use rich suggestions.
-    bool wants_rich_suggestion = false;
-
-    SuggestionDisplay display;
-
-    // A listener interface that is notified when the proposal is accepted by
-    // the system.
-    //
-    // The listener is currently notified once when a proposal is accepted. Thus
-    // the |story_id| provided will be of the first create story action in
-    // |on_selected|, and subsequent create story actions will not notify the
-    // listener.
-    ProposalListener? listener;
-};
-
-// Restricts the proposal potential apparance as a suggestion only when
-// a story or a mod within a story are focused.
-union ProposalAffinity {
-    StoryAffinity story_affinity;
-    ModuleAffinity module_affinity;
-};
-
-// Restricts the proposal to appear only when the story identified by
-// |story_name| is focused.
-// The name is namespace to the agent that submitted the proposal.
-struct StoryAffinity {
-    string story_name;
-};
-
-// Restricts the proposal to appear only when the module identified by
-// |module_name| within the story identified by |story_name| is focused.
-// The name is namespace to the agent that submitted the proposal.
-struct ModuleAffinity {
-    string story_name;
-    vector<string> module_name;
-};
-
-// An interface that allows Proposal creators to be notified when a proposal
-// is accepted by the system.
-interface ProposalListener {
-    // Indicates that a proposal was accepted by the system.
-    //
-    // |proposal_id| The identifier of the accepted proposal.
-    // |story_id| The identifier of the created story, if a story was created.
-    1: OnProposalAccepted(string proposal_id, string? story_id);
-};
diff --git a/public/fidl/fuchsia.modular/suggestion/proposal_publisher.fidl b/public/fidl/fuchsia.modular/suggestion/proposal_publisher.fidl
deleted file mode 100644
index b7afa0a..0000000
--- a/public/fidl/fuchsia.modular/suggestion/proposal_publisher.fidl
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// A service enabling Agents and Modules to contribute Proposals proactively to
-// the Suggestion engine.
-[Discoverable]
-interface ProposalPublisher {
-    // Includes the given |proposal| in the Next/Interruption channel from this
-    // publisher. Proposals are identified by |proposal.id|, and are namespaced by
-    // the component's ID and proposal channel (Query vs. Next/Interruption).
-    //
-    // If a Next/Interruption Proposal with the same id is already present, it is
-    // overwritten.
-    1: Propose(Proposal proposal);
-
-    // Removes the Proposal with the given ID from the Next/Interruption channel
-    // produced by this component.
-    2: Remove(string proposal_id);
-
-    // Includes the navigation request in the Navigation channel from this
-    // publisher. Navigation events are immediate and not tracked by any id.
-    // TODO(ejia): Replace with puppetmaster.
-    // EXPERIMENTAL
-    3: ProposeNavigation(NavigationAction navigation);
-};
diff --git a/public/fidl/fuchsia.modular/suggestion/query_handler.fidl b/public/fidl/fuchsia.modular/suggestion/query_handler.fidl
deleted file mode 100644
index 84e6457..0000000
--- a/public/fidl/fuchsia.modular/suggestion/query_handler.fidl
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.media;
-
-struct QueryResponse {
-    vector<Proposal> proposals;
-};
-
-// An interface enabling Agents and Modules to contribute Proposals reactively
-// to the Suggestion engine based on a user query.
-interface QueryHandler {
-    // Produces a list of Proposals in response to a query. The query may be empty
-    // in the case of an initial ask, and this method is called every time the
-    // query changes.
-    //
-    // Proposals given in the callback have their lifecycle tied to this query.
-    // After the query has completed, the proposals are dismissed. When the query
-    // changes, any proposals missing from the subsequent callback are likewise
-    // dismissed. These Proposals are distinct from Next/Interruption proposals,
-    // even if they may share IDs.
-    //
-    // Alternately, the client is free to call Propose on its
-    // ProposalPublisher to make persistent Proposals. However, these
-    // proposals may be subject to more stringent filtering by the Suggestion
-    // Engine. TODO(rosswang): spec/revisit.
-    1: OnQuery(UserInput query) -> (QueryResponse response);
-};
diff --git a/public/fidl/fuchsia.modular/suggestion/suggestion_display.fidl b/public/fidl/fuchsia.modular/suggestion/suggestion_display.fidl
deleted file mode 100644
index 601a554..0000000
--- a/public/fidl/fuchsia.modular/suggestion/suggestion_display.fidl
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.images;
-
-enum SuggestionImageType {
-    PERSON = 0;
-    OTHER = 1;
-};
-
-enum AnnoyanceType {
-    NONE = 0;
-
-    // Tiny interruptions meant to be displayed and hidden quickly without user
-    // interaction. Analogous to toasts. They won't reach the next space when
-    // ignored or missed.
-    PEEK = 1;
-
-    // Interruptions meant to be displayed to the user. The user could accept or
-    // dismiss them. They are placed in the Next space when ignored or missed.
-    // Analogous to notifications.
-    INTERRUPT = 2;
-
-    // Meant to show system errors or other extremely urgent alerts. It would
-    // block the rest of the interface and force the user to interact with it.
-    BLOCKING = 3;
-};
-
-// Information for the main image of the Suggestion.
-struct SuggestionDisplayImage {
-    // The image as a vmo.
-    fuchsia.images.EncodedImage image;
-
-    // Information about the content contained in the image
-    SuggestionImageType image_type;
-};
-
-// TODO(thatguy): This will likely be a union eventually, with different
-// display descriptions for different kinds of Suggestions.
-struct SuggestionDisplay {
-    // Title text for this Suggestion
-    string headline;
-
-    // Sub-headline text to be optionally displayed with this Suggestion
-    string? subheadline;
-
-    // A longer details string to be optionally displayed with this Suggestion
-    string? details;
-
-    // Color in which the Suggestion should be displayed
-    // Format is 0xaarrggbb
-    uint32 color;
-
-    // Optional list of icons that can be displayed with the Suggestion
-    vector<SuggestionDisplayImage>? icons;
-
-    // Optional image to display as part of the Suggestion
-    SuggestionDisplayImage? image;
-
-    // How annoying should this suggestion be?
-    AnnoyanceType annoyance;
-};
diff --git a/public/fidl/fuchsia.modular/suggestion/suggestion_engine.fidl b/public/fidl/fuchsia.modular/suggestion/suggestion_engine.fidl
deleted file mode 100644
index 0b568ac..0000000
--- a/public/fidl/fuchsia.modular/suggestion/suggestion_engine.fidl
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Administrative interface for Suggestion Engine.
-[Discoverable]
-interface SuggestionEngine {
-    // Registers a component that produces suggestions.
-    1: RegisterProposalPublisher(string url, request<ProposalPublisher> publisher);
-
-    // Registers a component that produces suggestions based on a query.
-    2: RegisterQueryHandler(string url, QueryHandler query_handler);
-};
diff --git a/public/fidl/fuchsia.modular/suggestion/suggestion_provider.fidl b/public/fidl/fuchsia.modular/suggestion/suggestion_provider.fidl
deleted file mode 100644
index 19ccfa5..0000000
--- a/public/fidl/fuchsia.modular/suggestion/suggestion_provider.fidl
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Allows clients to subscribe to different Suggestion "channels" and iterate
-// through the results. Supports both passive consumption of Suggestions based
-// on contextual changes, as well as Suggestions derived from user-driven
-// "Asks".
-[Discoverable]
-interface SuggestionProvider {
-    // Creates a subscription to the "interruptions" category of Suggestions.
-    // Interruptions are delivered immediately once they become available, and are
-    // potentially unlimited in number.
-    //
-    // Closing the |listener| pipe terminates the subscription.
-    //
-    // Any user interactions received by the client should be forwarded to the
-    // SuggestionService by calling NotifyInteraction().
-    1: SubscribeToInterruptions(InterruptionListener listener);
-
-    // Creates a subscription to "Next" Suggestions, with changes sent to
-    // |listener|. A maximum of |count| suggestions will be returned. To
-    // change the count, call this method again with a new count.
-    //
-    // Closing the the |listener| pipe terminates the subscription.
-    2: SubscribeToNext(NextListener listener, int32 count);
-
-    // Must be called when the user initiates a query for suggestions, perhaps
-    // as an “Ask” or a scoped suggestion. Results are sent to |listener|. Changes
-    // to the query should be communicated by closing the previous |listener| and
-    // calling the method again with the new query.
-    //
-    // Closing the |listener| pipe signals to the SuggestionService that the query
-    // has been completed or canceled.
-    3: Query(QueryListener listener, UserInput query, int32 count);
-
-    // Notifies the suggestion engine that the user has interacted with the given
-    // Suggestion in the manner described in |interaction|.
-    4: NotifyInteraction(string suggestion_uuid, Interaction interaction);
-
-    // Creates a subscription to a "navigation" suggestion.
-    // Like an interruption, the navigation based suggestion will be provided as
-    // soon as it's available.
-    6: SubscribeToNavigation(NavigationListener listener);
-};
-
-// The navigation action requested to be performed
-enum NavigationAction {
-    UNKNOWN = 0;
-
-    // Navigate to the overview or home screen
-    HOME = 1;
-
-    // Navigate to the cover story
-    SCREENSAVER = 2;
-
-    // Launch the full settings
-    SETTINGS = 3;
-};
-
-interface NavigationListener {
-    // Notifies the user interface to perform the navigation requested
-    1: OnNavigation(NavigationAction action);
-};
-
-interface InterruptionListener {
-    // Notifies the user interface to interrupt the user
-    1: OnInterrupt(Suggestion suggestion);
-};
-
-interface NextListener {
-    // Notifies the user interface that the passive suggestion results have been
-    // updated. This is called every time the suggestion results change.
-    1: OnNextResults(vector<Suggestion> suggestions);
-
-    // Notifies the user interface when processing is occurring on the passive
-    // suggestions, which may result in additions or re-ranking.  The UI may
-    // wish to show a spinner during this time.
-    2: OnProcessingChange(bool processing);
-};
-
-interface QueryListener {
-    // Notifies the user interface that new suggestion results are available.
-    // This may be called multiple times if the suggestion results are updated.
-    1: OnQueryResults(vector<Suggestion> suggestions);
-
-    // Notifies the user interface that query processing is completed.
-    2: OnQueryComplete();
-};
-
-enum InteractionType {
-    // Set when a suggestion was accepted by the user. In the case of an
-    // interruption, it won't be placed in the next suggestions.
-    SELECTED = 0;
-
-    // Set when a suggestion was removed by the user. In the case of an
-    // interruption, it won't be placed in the next suggestions and in the case of
-    // a non-interruptive suggestion it will be removed from it.
-    DISMISSED = 1;
-
-    // Set when a suggestion was hidden by the user. An interruption that is
-    // snoozed will be placed in next.
-    // Note: as of 08/03/2018 this interaction is only defined for interruptions.
-    // TODO(miguelfrde): define for regular suggestions.
-    SNOOZED = 2;
-
-    // Set when a suggestion is hidden by the session shell with no user interaction.
-    // An interruption that is expired is placed in the next space.
-    // This has no effect on regular suggestions, only on interruptions.
-    EXPIRED = 3;
-};
-
-struct Interaction {
-    InteractionType type;
-
-    // TODO(thatguy): Include parameters for each type of interaction where
-    // applicable. Consider making this a union in lieu of the struct/enum combo.
-};
-
-struct Suggestion {
-    // Uniquely and globally identifies this Suggestion.
-    string uuid;
-
-    // The probability that a given suggestion would be selected if it were the
-    // only suggestion shown to the user.
-    float32 confidence;
-
-    // Story id for a rich suggestion. Session shell may opt to start and compose the
-    // story's UI as the suggestion display, instead of making use of the properties
-    // in |display|.
-    string? preloaded_story_id;
-
-    // Display properties of the Suggestion
-    SuggestionDisplay display;
-};
-
-// *** Speech Section ***
-// TODO(jwnichols): Move these into a separate speech service.  It is
-// convenient to have them here now, but this is not a good long term
-// solution.
-
-// Encodes the valid states of an Ask, including spoken phases. States include
-// those used for interpreting speech to text as well as for when the system is
-// querying handlers or generating audio output.
-//
-// All state transitions are valid.
-//
-// TODO(rosswang): These states might be pertinent to non-speech flows as well.
-// TODO(rosswang): |IDLE| vs. |PROCESSING| is going to become the
-// |OnProcessingChanged| state event on |SuggestionHandler| soon.
-enum SpeechStatus {
-    // Exchange complete or not started
-    IDLE = 0;
-    // Query sent, awaiting results
-    PROCESSING = 1;
-    // System speaking
-    RESPONDING = 2;
-};
-
-// TODO(rosswang): This is very temporary. Probably next week, OnStatusChanged
-// will be split between the |TranscriptionListener| lifecycle and
-// |SuggestionListener|'s |onProcessingChanged|. |OnTextResponse will probably
-// be part of the callback on |Query|.
-interface FeedbackListener {
-    // Called every time the internal |SpeechStatus| changes.
-    1: OnStatusChanged(SpeechStatus status);
-
-    // TODO(rosswang): OnAudioResponse method (or fold it into OnTextResponse),
-    // once it becomes trivial for SysUI to implement it. This would allow SysUI
-    // to make a determination as to whether playback is warranted. For now, let
-    // Suggestion Engine handle the playback. A possible next step could be to add
-    // OnAudioResponse with a method to start playback.
-
-    // Receives a text representation of the spoken response. This method is
-    // called at the beginning of the |RESPONDING| phase.
-    2: OnTextResponse(string response_text);
-};
diff --git a/public/fidl/fuchsia.modular/suggestion/user_input.fidl b/public/fidl/fuchsia.modular/suggestion/user_input.fidl
deleted file mode 100644
index 233cc84..0000000
--- a/public/fidl/fuchsia.modular/suggestion/user_input.fidl
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-enum InputType {
-    TEXT = 0;
-    SPEECH = 1;
-};
-
-struct UserInput {
-    InputType type = TEXT;
-    string text;
-    // Future evolutions of this struct may include alternate data formats, at
-    // which point I'd like to rename text to string_value and make it optional.
-};
diff --git a/public/fidl/fuchsia.modular/surface/container.fidl b/public/fidl/fuchsia.modular/surface/container.fidl
deleted file mode 100644
index 3d8b420..0000000
--- a/public/fidl/fuchsia.modular/surface/container.fidl
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains the definition of module container layouts.
-
-library fuchsia.modular;
-
-// Specification of the layout of multiple surfaces in a module container. The
-// surfaces are referenced by name in ContainerRelationEntry.
-struct ContainerLayout {
-    vector<LayoutEntry> surfaces;
-};
-
-// Specification of the postion of one surface within a container layout,
-// specified by a rectangle.
-struct LayoutEntry {
-    // Surface name, referenced by container relation entry.
-    string node_name;
-
-    // Layout, as rectangle in Dart conventions(left, top, width, height), as a
-    // proportion of the size of the container
-    array<float32>:4 rectangle;
-};
-
-// Specifies the surface relationship between modules started together in module
-// container.
-//
-// TODO(djmurphy): this allows arbitrary graphs including cyclical ones, which
-// makes no sense. We could consider a nested data structure that makes cycles
-// impossible to specify.
-struct ContainerRelationEntry {
-    // Surface name, referenced by layout.
-    string node_name;
-
-    // Surface name of the layout parent. This could be the container itself,
-    // rather than a module in it.
-    string parent_node_name;
-
-    // This surface relation between the surface identified by node_name and by
-    // parent_node_name.
-    //
-    // It is possible to specify a surface relationship of a module in a container
-    // to the container itself, as opposed to another module in the container.
-    // This expresses for example that a module can be dismissed individually, as
-    // opposed to dismissing the module dismisses the container as a whole.
-    //
-    // TODO(djmurphy,mesch): The case above is not really a surface relationship,
-    // because the container is not a surface as such. We could adjust the name
-    // accordingly, or use a different type here. Depends on whether all surface
-    // relationship types make sense between a module and its container or not,
-    // etc.
-    SurfaceRelation relationship;
-};
-
-// Specifies one module to start inside a container. The module is specified by
-// a intent as usual. The node_name of the surface is referenced by container
-// layout and by container relation entry.
-struct ContainerNode {
-    // Name by which this module is references in layout and surface relationship
-    // specifications (cf. above).
-    string node_name;
-
-    // The intent to resolve to a module.
-    Intent intent;
-};
diff --git a/public/fidl/fuchsia.modular/surface/surface.fidl b/public/fidl/fuchsia.modular/surface/surface.fidl
deleted file mode 100644
index 3d10413..0000000
--- a/public/fidl/fuchsia.modular/surface/surface.fidl
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains the definition of SurfaceRelation and its properties.
-
-library fuchsia.modular;
-
-// Describes the relationship between two Surfaces.
-// Provides information to the StoryShell for layout optimization.
-struct SurfaceRelation {
-    // Advice on arranging these surfaces on the screen together.
-    SurfaceArrangement arrangement = NONE;
-
-    // Advice for dismissal of surfaces to be linked.
-    SurfaceDependency dependency = NONE;
-
-    // Relative emphasis of the child surface, relative to the parent.
-    // Influences relative areas of surfaces on screen.
-    float32 emphasis = 1.0;
-};
-
-// Expresses arrangement type.
-enum SurfaceArrangement {
-    // No arrangement specified.
-    NONE = 0;
-
-    // Desire to present simultaneously.
-    COPRESENT = 1;
-
-    // The parent prefers to not be presented simultaneously with its child.
-    // (The child may still become part of a simultaneous presentation depending
-    // on the relationships between it and subsequently added surfaces).
-    SEQUENTIAL = 2;
-
-    // Place this surface on top of and obscuring the parent surface. This is a
-    // complete replacement, not a modal or inset presentation.
-    ONTOP = 3;
-};
-
-// Links surface dismissal.
-enum SurfaceDependency {
-    // No dependency specified.
-    NONE = 0;
-
-    // Child is dependent on parent.
-    // If parent is dismissed, child is dismissed as well.
-    DEPENDENT = 1;
-};
diff --git a/public/fidl/fuchsia.modular/user_intelligence/intelligence_services.fidl b/public/fidl/fuchsia.modular/user_intelligence/intelligence_services.fidl
deleted file mode 100644
index 4f21fe6..0000000
--- a/public/fidl/fuchsia.modular/user_intelligence/intelligence_services.fidl
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// A container for component-scoped services. This contains any and all
-// services needed by any sort of Module/Agent.
-[Discoverable]
-interface IntelligenceServices {
-    // These are just here for illustrative purposes, and are not a complete
-    // list.
-    1: GetContextReader(request<ContextReader> context_reader);
-    2: GetContextWriter(request<ContextWriter> context_writer);
-
-    3: GetProposalPublisher(request<ProposalPublisher> proposal_publisher);
-
-    4: RegisterQueryHandler(QueryHandler query_handler);
-};
diff --git a/public/fidl/fuchsia.modular/user_intelligence/scope.fidl b/public/fidl/fuchsia.modular/user_intelligence/scope.fidl
deleted file mode 100644
index 0e4e5b2..0000000
--- a/public/fidl/fuchsia.modular/user_intelligence/scope.fidl
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-// Specifies the access scope a given component has to services within Maxwell.
-//
-// TODO(thatguy): Eventually, replace this with a Fuchsia-level access scope.
-union ComponentScope {
-    // Reserved for system-level services.
-    GlobalScope global_scope;
-    // Scope for a specific Module instance within a specific Story.
-    ModuleScope module_scope; // Annoying: can't use "module" (it's reserved)
-    // Scope for a specific Agent. Agents are not tied to a specific story.
-    AgentScope agent_scope;
-    // Scope for a specific Story, potentially containing several Module instances.
-    StoryScope story_scope;
-};
-
-struct GlobalScope {
-    uint32 dummy; // FIDL does not allow empty structs
-};
-
-struct ModuleScope {
-    string url;
-    string story_id;
-    vector<string> module_path;
-};
-
-struct AgentScope {
-    string url;
-};
-
-struct StoryScope {
-    string story_id;
-};
diff --git a/public/fidl/fuchsia.modular/user_intelligence/user_intelligence_provider.fidl b/public/fidl/fuchsia.modular/user_intelligence/user_intelligence_provider.fidl
deleted file mode 100644
index 42742f5..0000000
--- a/public/fidl/fuchsia.modular/user_intelligence/user_intelligence_provider.fidl
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.modular;
-
-using fuchsia.speech;
-using fuchsia.sys;
-
-interface UserIntelligenceProvider {
-    // Creates an |IntelligenceServices| scoped to a specific Component,
-    // identified by |scope|.
-    //
-    // NOTE: Eventually |component_id| will become more complex, specifying
-    // information needed to evaluate access-control policies for downstream
-    // services.
-    //
-    // ANOTHER NOTE: |IntelligenceServices| is a short-term "big bucket" in which
-    // to put any and all services that are to be exposed to Agents and Modules.
-    // Once our understanding of the needs of Agents/Modules is clearer, we
-    // should break the bucket apart.
-    1: GetComponentIntelligenceServices(ComponentScope scope,
-                                        request<IntelligenceServices> services);
-
-    2: GetSuggestionProvider(request<SuggestionProvider> suggestion_provider);
-
-    3: GetSpeechToText(request<fuchsia.speech.SpeechToText> speech_to_text);
-
-    // The |ComponentContext| is used to create agents and use message queues.
-    5: StartAgents(ComponentContext user_intelligence_context,
-                   vector<string> session_agents,
-                   vector<string> startup_agents);
-
-    // A standard set of services provided to all agents at startup,
-    // along with services particuarly for this agent.
-    6: GetServicesForAgent(string agent_url)
-           -> (fuchsia.sys.ServiceList service_list);
-};
diff --git a/public/fidl/fuchsia.speech/BUILD.gn b/public/fidl/fuchsia.speech/BUILD.gn
deleted file mode 100644
index 93ba134..0000000
--- a/public/fidl/fuchsia.speech/BUILD.gn
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-fidl("fuchsia.speech") {
-  cpp_legacy_callbacks = true
-
-  sdk_category = "partner"
-
-  sources = [
-    "speech_to_text.fidl",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.media",
-  ]
-}
diff --git a/public/fidl/fuchsia.speech/speech_to_text.fidl b/public/fidl/fuchsia.speech/speech_to_text.fidl
deleted file mode 100644
index 1509261..0000000
--- a/public/fidl/fuchsia.speech/speech_to_text.fidl
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library fuchsia.speech;
-
-[Discoverable]
-interface SpeechToText {
-    // Starts capturing speech from the microphone.
-    1: BeginCapture(TranscriptionListener transcription_listener);
-
-    // Begins hotword detection. Detected hotword utterances are reported on the
-    // given listener.
-    2: ListenForHotword(HotwordListener hotword_listener);
-};
-
-// Represents an active transcription session. Either side may close this
-// interface to indicate that transcription should stop. If the transcription is
-// unexpectedly closed before |OnReady| is called, the implementer should treat
-// it as an error (in such cases, |OnError| is called).
-interface TranscriptionListener {
-    // Indicates that capture has begun. Prior to this, parts of the system may
-    // not have been initialized and audio may have been dropped. No calls to
-    // |OnTranscriptUpdate| will occur before |OnReady| is called.
-    1: OnReady();
-
-    // Receives updated transcripts. Each call receives the most likely
-    // transcription of the entire utterance at that time. Previously transcribed
-    // text may mutate in response to later input.
-    2: OnTranscriptUpdate(string spoken_text);
-
-    // Provides periodic updates on the user's speech signal power, when the
-    // microphone is open and streaming to the backend.
-    // |speech_level| is instantaneous speech power, in decibels (negative).
-    4: OnSpeechLevelUpdate(float32 speech_level);
-
-    // An error occurred before or during transcription. Depending on the nature
-    // of the error, this may occur before |OnReady| is called, and |OnReady| may
-    // never be called. This binding will be closed immediately after sending this
-    // message.
-    3: OnError();
-};
-
-// Listens for hotwords. Each detected hotword utterance triggers |OnHotword|.
-// Closure of this handle by the speech service indicates an error.
-interface HotwordListener {
-    // Indicates that capture has begun. Prior to this, parts of the system may
-    // not have been initialized and audio may have been dropped. No calls to
-    // |OnHotword| will occur before |OnReady| is called.
-    1: OnReady();
-
-    // Called for each detected hotword utterance.
-    2: OnHotword();
-};
diff --git a/public/lib/BUILD.gn b/public/lib/BUILD.gn
deleted file mode 100644
index 5359c80..0000000
--- a/public/lib/BUILD.gn
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/toolchain.gni")
-
-group("services") {
-  deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-group("just_fidl") {
-  deps = [
-    "//peridot/public/fidl/fuchsia.modular($fidl_toolchain)",
-  ]
-}
-
-executable("peridot_public_lib_unittests") {
-  testonly = true
-
-  deps = [
-    "async/cpp:unittests",
-    "entity/cpp:unittests",
-    "//third_party/googletest:gtest_main",
-  ]
-}
diff --git a/public/lib/MAINTAINERS b/public/lib/MAINTAINERS
deleted file mode 100644
index e68679b..0000000
--- a/public/lib/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-mesch@google.com
-thatguy@google.com
diff --git a/public/lib/agent/cpp/BUILD.gn b/public/lib/agent/cpp/BUILD.gn
deleted file mode 100644
index 17a555b..0000000
--- a/public/lib/agent/cpp/BUILD.gn
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-group("cpp") {
-  public_deps = [
-    ":agent_impl",
-  ]
-}
-
-source_set("agent_impl") {
-  sources = [
-    "agent_impl.cc",
-    "agent_impl.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/svc/cpp",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
diff --git a/public/lib/agent/cpp/agent_impl.cc b/public/lib/agent/cpp/agent_impl.cc
deleted file mode 100644
index 5fbd0e1..0000000
--- a/public/lib/agent/cpp/agent_impl.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/agent/cpp/agent_impl.h>
-
-#include <fs/service.h>
-
-namespace modular {
-
-AgentImpl::AgentImpl(component::ServiceNamespace* const service_namespace,
-                     Delegate* const delegate)
-    : delegate_(delegate), binding_(this) {
-  service_namespace->AddService<fuchsia::modular::Agent>(
-      [this](fidl::InterfaceRequest<fuchsia::modular::Agent> request) {
-        binding_.Bind(std::move(request));
-      });
-}
-
-AgentImpl::AgentImpl(fbl::RefPtr<fs::PseudoDir> directory,
-                     Delegate* const delegate)
-    : delegate_(delegate), binding_(this) {
-  directory->AddEntry(
-      fuchsia::modular::Agent::Name_,
-      fbl::AdoptRef(new fs::Service([this](zx::channel channel) {
-        binding_.Bind(std::move(channel));
-        return ZX_OK;
-      })));
-}
-
-// |fuchsia::modular::Agent|
-void AgentImpl::Connect(
-    std::string requestor_url,
-    fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services_request) {
-  delegate_->Connect(std::move(services_request));
-}
-
-// |fuchsia::modular::Agent|
-void AgentImpl::RunTask(std::string task_id, RunTaskCallback callback) {
-  delegate_->RunTask(task_id, callback);
-}
-
-}  // namespace modular
diff --git a/public/lib/agent/cpp/agent_impl.h b/public/lib/agent/cpp/agent_impl.h
deleted file mode 100644
index 93bc403..0000000
--- a/public/lib/agent/cpp/agent_impl.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_AGENT_CPP_AGENT_IMPL_H_
-#define LIB_AGENT_CPP_AGENT_IMPL_H_
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/macros.h>
-#include <lib/svc/cpp/service_namespace.h>
-
-namespace modular {
-
-// Use this class to talk to the modular framework as an
-// fuchsia::modular::Agent.
-class AgentImpl : public fuchsia::modular::Agent {
- public:
-  // Users of AgentImpl register a delegate to receive messages from the
-  // framework.
-  class Delegate {
-   public:
-    virtual void Connect(fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-                             outgoing_services) = 0;
-    virtual void RunTask(const fidl::StringPtr& task_id,
-                         const std::function<void()>& done) = 0;
-  };
-
-  AgentImpl(component::ServiceNamespace* service_namespace, Delegate* delegate);
-
-  AgentImpl(fbl::RefPtr<fs::PseudoDir> directory, Delegate* delegate);
-
- private:
-  // |fuchsia::modular::Agent|
-  void Connect(std::string requestor_url,
-               fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-                   services_request) override;
-  // |fuchsia::modular::Agent|
-  void RunTask(std::string task_id, RunTaskCallback callback) override;
-
-  Delegate* const delegate_;
-  fidl::Binding<fuchsia::modular::Agent> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AgentImpl);
-};
-
-}  // namespace modular
-
-#endif  // LIB_AGENT_CPP_AGENT_IMPL_H_
diff --git a/public/lib/app_driver/cpp/BUILD.gn b/public/lib/app_driver/cpp/BUILD.gn
deleted file mode 100644
index f52561e..0000000
--- a/public/lib/app_driver/cpp/BUILD.gn
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-group("cpp") {
-  public_deps = [
-    ":agent_driver",
-    ":app_driver",
-    ":module_driver",
-  ]
-}
-
-source_set("agent_driver") {
-  sources = [
-    "agent_driver.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/agent/cpp",
-    "//peridot/public/lib/lifecycle/cpp",
-  ]
-}
-
-source_set("app_driver") {
-  sources = [
-    "app_driver.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/lib/lifecycle/cpp",
-  ]
-}
-
-source_set("module_driver") {
-  sources = [
-    "module_driver.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/fidl/fuchsia.ui.app",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/lifecycle/cpp",
-  ]
-}
diff --git a/public/lib/app_driver/cpp/README.md b/public/lib/app_driver/cpp/README.md
deleted file mode 100644
index 74a53cd..0000000
--- a/public/lib/app_driver/cpp/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# AppDriver
-
-App driver is a small framework that supports life cycle management of fidl
-components by implementing the fuchsia::modular::Lifecycle FIDL service.
-
-There are three flavors of app driver: for generic components (AppDriver), for
-components that are run as Modules (ModuleDriver), and for components that are
-run as Agents (AgentDriver). Agents and Modules have additional facets at
-initialization in addition to the asynchronous teardown sequence that fuchsia::modular::Lifecycle
-imposes. See the .h files for details.
-
-
-
diff --git a/public/lib/app_driver/cpp/agent_driver.h b/public/lib/app_driver/cpp/agent_driver.h
deleted file mode 100644
index 884e23e..0000000
--- a/public/lib/app_driver/cpp/agent_driver.h
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_APP_DRIVER_CPP_AGENT_DRIVER_H_
-#define LIB_APP_DRIVER_CPP_AGENT_DRIVER_H_
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/agent/cpp/agent_impl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/logging.h>
-#include <lib/lifecycle/cpp/lifecycle_impl.h>
-
-namespace modular {
-
-// This interface is passed to the Impl object that AgentDriver initializes.
-class AgentHost {
- public:
-  virtual component::StartupContext* startup_context() = 0;
-  virtual fuchsia::modular::AgentContext* agent_context() = 0;
-};
-
-// AgentDriver provides a way to write agents and participate in application
-// lifecycle.
-//
-// class HelloAgent {
-//  public:
-//   HelloAgent(AgentHost* host) {}
-//
-//   // Called by AgentDriver.
-//   void Connect(fidl::InterfaceRequest<ServiceProvider> outgoing_services) {}
-//
-//   // Called by AgentDriver.
-//   void RunTask(const fidl::StringPtr& task_id,
-//                const std::function<void()>& done) { done(); }
-//
-//   // Called by AgentDriver.
-//   void Terminate(const std::function<void()>& done) { done(); }
-// };
-//
-// int main(int argc, const char** argv) {
-//   async::Loop loop(&kAsyncLoopConfigAttachToThread);
-//   auto context = component::StartupContext::CreateFromStartupInfo();
-//   modular::AgentDriver<HelloAgent> driver(context.get(),
-//                                               [&loop] { loop.Quit(); });
-//   loop.Run();
-//   return 0;
-// }
-template <typename Impl>
-class AgentDriver : LifecycleImpl::Delegate, AgentImpl::Delegate, AgentHost {
- public:
-  AgentDriver(component::StartupContext* const context,
-              std::function<void()> on_terminated)
-      : context_(context),
-        lifecycle_impl_(context->outgoing().deprecated_services(), this),
-        agent_impl_(std::make_unique<AgentImpl>(
-            context->outgoing().deprecated_services(),
-            static_cast<AgentImpl::Delegate*>(this))),
-        on_terminated_(std::move(on_terminated)),
-        agent_context_(context_->ConnectToEnvironmentService<
-                       fuchsia::modular::AgentContext>()),
-        impl_(std::make_unique<Impl>(static_cast<AgentHost*>(this))) {}
-
- private:
-  // |AgentHost|
-  component::StartupContext* startup_context() override { return context_; }
-
-  // |AgentHost|
-  fuchsia::modular::AgentContext* agent_context() override {
-    FXL_DCHECK(agent_context_);
-    return agent_context_.get();
-  }
-
-  // |AgentImpl::Delegate|
-  void Connect(fidl::InterfaceRequest<fuchsia::sys::ServiceProvider>
-                   outgoing_services_request) override {
-    impl_->Connect(std::move(outgoing_services_request));
-  };
-  // |AgentImpl::Delegate|
-  void RunTask(const fidl::StringPtr& task_id,
-               const std::function<void()>& done) override {
-    impl_->RunTask(task_id, done);
-  };
-
-  // |LifecycleImpl::Delegate|
-  void Terminate() override {
-    agent_impl_.reset();
-    if (impl_) {
-      impl_->Terminate([this] {
-        // Cf. AppDriver::Terminate().
-        async::PostTask(async_get_default_dispatcher(), [this] {
-          impl_.reset();
-          on_terminated_();
-        });
-      });
-    } else {
-      on_terminated_();
-    }
-  }
-
-  component::StartupContext* const context_;
-  LifecycleImpl lifecycle_impl_;
-  std::unique_ptr<AgentImpl> agent_impl_;
-  std::function<void()> on_terminated_;
-  fuchsia::modular::AgentContextPtr agent_context_;
-  std::unique_ptr<Impl> impl_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AgentDriver);
-};
-
-}  // namespace modular
-
-#endif  // LIB_APP_DRIVER_CPP_AGENT_DRIVER_H_
diff --git a/public/lib/app_driver/cpp/app_driver.h b/public/lib/app_driver/cpp/app_driver.h
deleted file mode 100644
index 32b6927..0000000
--- a/public/lib/app_driver/cpp/app_driver.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_APP_DRIVER_CPP_APP_DRIVER_H_
-#define LIB_APP_DRIVER_CPP_APP_DRIVER_H_
-
-#include <functional>
-#include <memory>
-#include <utility>
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <lib/lifecycle/cpp/lifecycle_impl.h>
-
-namespace modular {
-
-// AppDriver is a wrapper that simplifies participating in lifecycle management
-// by the application's parent. It does this by exposing the
-// fuchsia::modular::Lifecycle service in
-// component::StartupContext::outgoing().deprecated_services() and proxies
-// the Terminate() call of fuchsia::modular::Lifecycle to the Terminate() method
-// on your application's class instance.
-//
-// Usage:
-//
-// NOTE: Your application's class must implement:
-//
-//     // Called by AppDriver. Call |done| once shutdown sequence is complete
-//     // and |this| will be scheduled for deletion on the current MessageLoop.
-//     void Terminate(const std::function<void()>& done);
-//
-// Example:
-//
-// class HelloWorldApp {
-//  public:
-//   HelloWorldApp(component::StartupContext* context) {
-//     context->outgoing().AddPublicService<..>(...);
-//   }
-//
-//   void Terminate(const std::function<void()>& done) {
-//     done();
-//   }
-// };
-//
-// int main(int argc, const char** argv) {
-//   async::Loop loop(&kAsyncLoopConfigAttachToThread);
-//   auto context = component::StartupContext::CreateFromStartupInfo();
-//   modular::AppDriver<HelloWorldApp> driver(
-//       context->outgoing().deprecated_services(),
-//       std::make_unique<HelloWorldApp>(context.get()),
-//       [&loop] { loop.Quit(); });
-//   loop.Run();
-//   return 0;
-// }
-template <typename Impl>
-class AppDriver : LifecycleImpl::Delegate {
- public:
-  AppDriver(component::ServiceNamespace* const outgoing_services,
-            std::unique_ptr<Impl> impl, std::function<void()> on_terminated)
-      : lifecycle_impl_(outgoing_services, this),
-        impl_(std::move(impl)),
-        on_terminated_(std::move(on_terminated)) {}
-
- private:
-  // |LifecycleImpl::Delegate|
-  void Terminate() override {
-    impl_->Terminate([this] {
-      // Since this callback is called by |impl_|, we delay destroying it
-      // until the current stack rolls back up to the MessageLoop which
-      // guarantees impl_::Terminate() and anything that asynchronously
-      // invokes this callback are done running.
-      async::PostTask(async_get_default_dispatcher(), [this] {
-        impl_.reset();
-        on_terminated_();
-      });
-    });
-  }
-
-  LifecycleImpl lifecycle_impl_;
-  std::unique_ptr<Impl> impl_;
-  std::function<void()> on_terminated_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(AppDriver);
-};
-
-}  // namespace modular
-
-#endif  // LIB_APP_DRIVER_CPP_APP_DRIVER_H_
diff --git a/public/lib/app_driver/cpp/module_driver.h b/public/lib/app_driver/cpp/module_driver.h
deleted file mode 100644
index 6431f48..0000000
--- a/public/lib/app_driver/cpp/module_driver.h
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_APP_DRIVER_CPP_MODULE_DRIVER_H_
-#define LIB_APP_DRIVER_CPP_MODULE_DRIVER_H_
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/app/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/interface_request.h>
-#include <lib/fxl/logging.h>
-#include <lib/lifecycle/cpp/lifecycle_impl.h>
-
-namespace modular {
-
-// This interface is passed to the |Impl| object that ModuleDriver initializes.
-class ModuleHost {
- public:
-  virtual component::StartupContext* startup_context() = 0;
-  virtual fuchsia::modular::ModuleContext* module_context() = 0;
-};
-
-// ModuleDriver provides a way to write modules and participate in application
-// lifecycle. The |Impl| class supplied to ModuleDriver is instantiated when the
-// Module and ViewProvider services have both been requested by the framework.
-//
-// Usage:
-//   The |Impl| class must implement:
-//
-//      // A constructor with the following signature:
-//      Constructor(
-//           modular::ModuleHost* module_host,
-//           fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-//           view_provider_request);
-//
-//       // Called by ModuleDriver. Call |done| once shutdown sequence is
-//       // complete, at which point |this| will be deleted.
-//       void Terminate(const std::function<void()>& done);
-//
-// Example:
-//
-// class HelloWorldModule {
-//  public:
-//   HelloWorldModule(
-//      modular::ModuleHost* module_host,
-//      fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-//      view_provider_request) {}
-//
-//   // Called by ModuleDriver.
-//   void Terminate(const std::function<void()>& done) { done(); }
-// };
-//
-// int main(int argc, const char** argv) {
-//   async::Loop loop(&kAsyncLoopConfigAttachToThread);
-//   auto context = component::StartupContext::CreateFromStartupInfo();
-//   modular::ModuleDriver<HelloWorldApp> driver(context.get(),
-//                                               [&loop] { loop.Quit(); });
-//   loop.Run();
-//   return 0;
-// }
-template <typename Impl>
-class ModuleDriver : LifecycleImpl::Delegate, ModuleHost {
- public:
-  ModuleDriver(component::StartupContext* const context,
-               std::function<void()> on_terminated)
-      : context_(context),
-        lifecycle_impl_(context->outgoing().deprecated_services(), this),
-        on_terminated_(std::move(on_terminated)) {
-    context_->ConnectToEnvironmentService(module_context_.NewRequest());
-
-    context_->outgoing().AddPublicService<fuchsia::ui::app::ViewProvider>(
-        [this](fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider> request) {
-          impl_ = std::make_unique<Impl>(static_cast<ModuleHost*>(this),
-                                         std::move(request));
-        });
-
-    context_->outgoing().AddPublicService<fuchsia::ui::viewsv1::ViewProvider>(
-        [this](fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-                   request) {
-          impl_ = std::make_unique<Impl>(static_cast<ModuleHost*>(this),
-                                         std::move(request));
-        });
-  }
-
- private:
-  // |ModuleHost|
-  component::StartupContext* startup_context() override { return context_; }
-
-  // |ModuleHost|
-  fuchsia::modular::ModuleContext* module_context() override {
-    FXL_DCHECK(module_context_);
-    return module_context_.get();
-  }
-
-  // |LifecycleImpl::Delegate|
-  void Terminate() override {
-    // It's possible that we process the |fuchsia::modular::Lifecycle.Terminate|
-    // message before the |Module.Initialize| message, even when both messages
-    // are ready to be processed at the same time. In this case, because |impl_|
-    // hasn't been instantiated yet, we cannot delegate the
-    // |fuchsia::modular::Lifecycle.Terminate| message.
-    if (impl_) {
-      impl_->Terminate([this] {
-        // Cf. AppDriver::Terminate().
-        async::PostTask(async_get_default_dispatcher(), [this] {
-          impl_.reset();
-          on_terminated_();
-        });
-      });
-    } else {
-      on_terminated_();
-    }
-  }
-
-  component::StartupContext* const context_;
-  LifecycleImpl lifecycle_impl_;
-  std::function<void()> on_terminated_;
-  fuchsia::modular::ModuleContextPtr module_context_;
-
-  std::unique_ptr<Impl> impl_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ModuleDriver);
-};
-
-}  // namespace modular
-
-#endif  // LIB_APP_DRIVER_CPP_MODULE_DRIVER_H_
diff --git a/public/lib/async/cpp/BUILD.gn b/public/lib/async/cpp/BUILD.gn
deleted file mode 100644
index c579ff5..0000000
--- a/public/lib/async/cpp/BUILD.gn
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("future") {
-  sources = [
-    "future.cc",
-    "future.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//zircon/public/lib/async-cpp",
-    "//zircon/public/lib/async-default",
-  ]
-}
-
-source_set("operation") {
-  sources = [
-    "operation.cc",
-    "operation.h",
-  ]
-
-  public_deps = [
-    ":future",
-    "//garnet/public/lib/async_promise",
-    "//garnet/public/lib/fxl",
-  ]
-
-  deps = [
-    "//zircon/public/lib/trace",
-  ]
-}
-
-group("unittests") {
-  testonly = true
-
-  deps = [
-    ":future_unittest",
-    ":operation_unittest",
-  ]
-}
-
-source_set("future_unittest") {
-  testonly = true
-
-  sources = [
-    "future_unittest.cc",
-  ]
-
-  deps = [
-    ":future",
-    "//third_party/googletest:gtest",
-    "//zircon/public/lib/async-testutils",
-  ]
-}
-
-source_set("operation_unittest") {
-  testonly = true
-
-  sources = [
-    "operation_unittest.cc",
-  ]
-
-  deps = [
-    ":operation",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/gtest",
-    "//third_party/googletest:gtest",
-  ]
-}
diff --git a/public/lib/async/cpp/future.cc b/public/lib/async/cpp/future.cc
deleted file mode 100644
index 385b047..0000000
--- a/public/lib/async/cpp/future.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/async/cpp/future.h>
-
-namespace modular {
-
-namespace internal {
-
-ResultCollector<Future<>>::ResultCollector(size_t reserved_count)
-    : reserved_count_(reserved_count) {}
-
-bool ResultCollector<Future<>>::IsComplete() const {
-  return finished_count_ == reserved_count_;
-}
-
-void ResultCollector<Future<>>::Complete(Future<>* future) const {
-  future->Complete();
-}
-
-}  // namespace internal
-
-}  // namespace modular
\ No newline at end of file
diff --git a/public/lib/async/cpp/future.h b/public/lib/async/cpp/future.h
deleted file mode 100644
index 449751f..0000000
--- a/public/lib/async/cpp/future.h
+++ /dev/null
@@ -1,1053 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_ASYNC_CPP_FUTURE_H_
-#define LIB_ASYNC_CPP_FUTURE_H_
-
-#include <memory>
-#include <string>
-#include <type_traits>
-#include <utility>
-#include <vector>
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-
-#include "garnet/public/lib/fxl/functional/apply.h"
-#include "garnet/public/lib/fxl/macros.h"
-#include "garnet/public/lib/fxl/memory/ref_counted.h"
-#include "garnet/public/lib/fxl/memory/ref_ptr.h"
-#include "garnet/public/lib/fxl/memory/weak_ptr.h"
-
-namespace modular {
-
-// # Futures
-//
-// A *future* is an object representing the eventual value of an asynchronous
-// operation. They are a useful complement to callback functions or lambdas
-// because they are _composable_: asynchronous operations can be sequentially
-// executed, and an async operation's result can be passed to another async
-// operation, like a Unix pipeline.
-//
-// To use a future:
-//
-// 1. A *producer*, typically an async operation, creates a Future with
-//    Future<ResultType>::Create().
-// 2. The producer starts its async operation (e.g. a network request or disk
-//    read).
-// 3. The producer synchronously returns the Future to a *consumer*.
-// 4. A consumer attaches a *callback* lambda to the Future using Then(). (The
-//    callback can be attached to the future any time after the future is
-//    created, before or after the async operation is finished.)
-// 5. Some time later, when the producer's async operation is finished, the
-//    producer *completes* the future with a *result* using Complete(result).
-//    |result| is 0 to N movable or copyable values, e.g. Complete(),
-//    Complete(value), Complete(value1, value2, ...).
-// 6. The consumer's callback is invoked after the future is completed, with the
-//    completed result passed as zero or more parameters to the callback.
-//
-// The following example shows a simple use case:
-//
-// Producer:
-//
-// FuturePtr<Bytes> MakeNetworkRequest(NetworkRequest& request) {
-//   auto f = Future<Bytes>::Create("NetworkRequest");  // a "trace_name" that's
-//                                                      // logged when things go
-//                                                      // wrong
-//   auto network_request_callback = [f] (Bytes bytes) {
-//     f->Complete(bytes);
-//   };
-//   PerformAsyncNetworkRequest(request, network_request_callback);
-//   return f;
-// }
-//
-// Client:
-//
-// FuturePtr<Bytes> f = MakeNetworkRequest();
-// f->Then([] (Bytes bytes) {
-//   ProcessBytes(bytes);
-// });
-//
-// ## Chaining and sequencing futures
-//
-// Futures can be composed; this is commonly called "chaining". Methods that
-// attach callbacks, such as Then(), will return another Future: the returned
-// Future is completed once the previous callback has finished executing. For
-// example:
-//
-// Client:
-//
-// ShowProgressSpinner(true);
-// FuturePtr<Bytes> f = MakeNetworkRequest(request);
-// f->AsyncMap([] (Bytes zipped_bytes) {
-//   // Use AsyncMap() if your callback wants to return another Future.
-//   FuturePtr<Bytes> f = UnzipInBackground(zipped_bytes);
-//   return f;
-// })->Map([] (Bytes unzipped_bytes) {
-//   // Use Map() if your callback returns a non-future: the callback's return
-//   // value will be wrapped up into the returned Future.
-//   JPEGImage image = DecodeImageSynchronously(unzipped_bytes);
-//   return image;
-// })->AsyncMap([] (JPEGImage image) {
-//   FuturePtr<> f = UpdateUIAsynchronously(image);
-//   return f;
-// })->Then([] {
-//   // Use Then() if your callback returns void. Note that Then() still returns
-//   // a Future<>, which will be completed only when your callback finishes
-//   // executing.
-//   ShowProgressSpinner(false);
-// });
-//
-// ## Memory Management & Ownership
-//
-// FuturePtr is a fxl::RefPtr, which is a smart pointer similar to
-// std::shared_ptr that holds a reference count (refcount). When you call
-// Future::Create(), you are expected to maintain a reference to it. When the
-// Future is deleted, its result and callbacks are also deleted.
-//
-// Each method documents how it affects the future's refcount. To summarize:
-//
-// * Calling Then() on a future does not affect its refcount. This applies to
-//   all methods that returns a chained future, such as AsyncMap() and Map().
-// * However, calling Then() on a future will cause that future to maintain a
-//   reference to the returned chained future. So, you do not need to maintain a
-//   reference to the returned future.
-// * Calling Complete() does not affect the future's refcount.
-// * Unlike Complete(), the closure returned by Completer() _does own_ the
-//   future, so you do not need to maintain a reference to the future after
-//   calling Completer(). (You do need to maintain a reference to the closure,
-//   however.)
-// * Wait(futures) returns a future that every future in |futures| owns, so you
-//   do not need to maintain a reference to the returned future. The callback
-//   attached to each future in |futures| will also keep a reference to
-//   themselves, so that if a future that is Wait()ed on otherwise goes out of
-//   scope, the future itself is kept alive.
-//
-// See each method's documentation for more details on memory management.
-//
-// ## Use Weak*() variants to cancel callback chains
-//
-// "Weak" variants exist for all chain/sequence methods (WeakThen(),
-// WeakConstThen(), WeakMap() and WeakAsyncMap()). These are almost identical
-// to their non-weak counterparts but take an fxl::WeakPtr<T> as a first
-// argument. If, at callback invocation time, the WeakPtr is invalid, execution
-// will halt and no future further down the chain will be executed.
-//
-// Example:
-//
-// FuturePtr<> f = MakeFuture();
-// f->WeakThen(weak_ptr_factory.GetWeakPtr(), [] {
-//   FXL_LOG(INFO) << "This won't execute";
-// })->Then([] {
-//   FXL_LOG(INFO) << "Neither will this";
-// });
-// weak_ptr_factory.InvalidateWeakPtrs();
-// f->Complete();
-//
-// ## Use Wait() to synchronize on multiple futures
-//
-// If multiple futures are running, use the Wait() function to create a
-// Future that completes when all the futures passed to it are completed:
-//
-// FuturePtr<Bytes> f1 = MakeNetworkRequest(request1);
-// FuturePtr<Bytes> f2 = MakeNetworkRequest(request2);
-// FuturePtr<Bytes> f3 = MakeNetworkRequest(request3);
-// Wait<Future<>>("Network requests", {f1, f2, f3})->Then([] {
-//   AllNetworkRequestsAreComplete();
-// });
-//
-// See the Wait() function documentation for more details.
-//
-// ## Use Completer() to integrate with functions requiring callbacks
-//
-// Use the Completer() method to integrate with existing code that uses callback
-// functions. Completer() returns an std::function<void(Result)> that, when
-// called, calls Complete() on the future. Re-visiting the first example:
-//
-// Without Completer():
-//
-// FuturePtr<Bytes> MakeNetworkRequest(NetworkRequest& request) {
-//   auto f = Future<Bytes>::Create("NetworkRequest");
-//   auto network_request_callback = [f] (Bytes bytes) {
-//     f->Complete(bytes);
-//   };
-//   PerformAsyncNetworkRequest(request, network_request_callback);
-//   return f;
-// }
-//
-// With Completer():
-//
-// FuturePtr<Bytes> MakeNetworkRequest(NetworkRequest& request) {
-//   auto f = Future<Bytes>::Create("NetworkRequest");
-//   PerformAsyncNetworkRequest(request, f->Completer());
-//   return f;
-// }
-//
-// ## Use error values to propagate errors back to consumers
-//
-// If the future can fail, use a value (or multiple values) that's capable of
-// storing both the error and a successful result to propagate the return value
-// back to the consumer. For example:
-//
-// FuturePtr<std::error_code, Bytes> f = MakeNetworkRequest();
-// f->Then([] (std::error_code error, Bytes bytes) {
-//   if (error) {
-//     // handle error
-//   } else {
-//     // network request was successful
-//     ProcessBytes(bytes);
-//   }
-// });
-//
-// ## fuchsia::modular::Future vs other Futures/Promises
-//
-// If you are familiar with Futures & Promises in other languages, this Future
-// class is intentionally different from others, to better integrate with
-// Fuchsia coding patterns:
-//
-// * NOT THREADSAFE. This will change in the future when thread safety is
-//   required, but there are no use cases yet. (YAGNI!)
-// * Support for multiple result values via variadic template parameters. This
-//   is required for smooth integration with the fuchsia::modular::Operation
-//   class.
-// * Only a single callback can be set via Then(), since move semantics are used
-//   so heavily in Fuchsia code. (If multiple callbacks were supported and the
-//   result is moved, how does one move the result from one callback to
-//   another?)
-//   * Multiple callbacks can be set if the callback lambda takes the result via
-//     const&. In this case, use ConstThen() to attach each callback, rather
-//     than Then(). ConstThen() calls can also be chained, like Then().
-// * There are no success/error callbacks and control flows: all callbacks are
-//   "success callbacks".
-//   * The traditional reason for error callbacks is to convert exceptions into
-//     error values, but Google C++ style doesn't use exceptions, so error
-//     callbacks aren't needed.
-//   * There's some argument that using separate success/error control flow
-//     paths is beneficial. However, in practice, a lot of client code using
-//     this pattern don't attach error callbacks, only success callbacks, so
-//     errors often go unchecked.
-//   * If error values need to be propagated back to the client, use a dedicated
-//     error type. (Note that many built-in types may have values that can be
-//     interpreted as errors, e.g. nullptr, or 0 or -1.) This also forces a
-//     consumer to inspect the type and check for errors.
-// * No cancellation/progress support. Adding cancellation/progress:
-//   * adds more complexity to the futures implementation,
-//   * can be implemented on top of a core futures implementation for the few
-//     cases where they're required, and
-//   * typically requires extra cancel/progress callbacks, which adds more
-//     control flow paths.
-//   * see fxl::CancelableCallback if you need cancellation.
-// * No execution contexts (yet).
-//   * There needs to be a comprehensive story about runloops etc first.
-
-template <typename... Result>
-class Future;
-
-template <typename... Result>
-using FuturePtr = fxl::RefPtr<Future<Result...>>;
-
-namespace internal {
-
-enum class FutureStatus {
-  kAwaiting,   // not completed
-  kCompleted,  // value available, not yet moved into callback
-  kConsumed    // value moved into callback
-};
-
-// type_traits functions, ported from C++17.
-template <typename From, typename To>
-constexpr bool is_convertible_v = std::is_convertible<From, To>::value;
-
-template <class T>
-constexpr bool is_void_v = std::is_void<T>::value;
-
-template <typename... Result>
-class DefaultResultsFuture {
- public:
-  using type = Future<std::vector<std::tuple<Result...>>>;
-};
-
-template <typename Result>
-class DefaultResultsFuture<Result> {
- public:
-  using type = Future<std::vector<Result>>;
-};
-
-template <>
-class DefaultResultsFuture<> {
- public:
-  using type = Future<>;
-};
-
-template <typename... Result>
-using DefaultResultsFuture_t = typename DefaultResultsFuture<Result...>::type;
-
-template <typename ResultsFuture>
-class ResultCollector {
- public:
-  // ResultsFuture = Future<std::vector<ElementType>>
-  using ElementType = typename std::tuple_element_t<
-      0, typename ResultsFuture::result_tuple_type>::value_type;
-
-  ResultCollector(size_t reserved_count) : results_(reserved_count) {}
-
-  bool IsComplete() const { return finished_count_ == results_.size(); }
-
-  template <typename... Result>
-  void AssignResult(size_t result_index, Result&&... result) {
-    results_[result_index] =
-        std::make_unique<ElementType>(std::forward<Result>(result)...);
-    finished_count_++;
-  }
-
-  void Complete(ResultsFuture* future) {
-    std::vector<ElementType> final_results;
-    final_results.reserve(results_.size());
-    for (auto& result : results_) {
-      final_results.push_back(std::move(*result));
-    }
-    future->Complete(std::move(final_results));
-  }
-
- private:
-  size_t finished_count_ = 0;
-  // Use unique ptrs initially so that we can reserve even if |ElementType| is
-  // not default-constructible.
-  //
-  // TODO(rosswang): Consider adding a specialization for default-constructible
-  // types.
-  std::vector<std::unique_ptr<ElementType>> results_;
-};
-
-template <>
-class ResultCollector<Future<>> {
- public:
-  ResultCollector(size_t reserved_count);
-  bool IsComplete() const;
-
-  // The template on this allows us to use Future<> collectors to swallow
-  // unneeded results of futures we're waiting on.
-  template <typename... Result>
-  void AssignResult(size_t, Result... result) {
-    finished_count_++;
-  }
-
-  void Complete(Future<>* future) const;
-
- private:
-  size_t finished_count_ = 0;
-  size_t reserved_count_;
-};
-
-}  // namespace internal
-
-template <typename... Result>
-class Future : public fxl::RefCountedThreadSafe<Future<Result...>> {
- public:
-  using result_tuple_type = std::tuple<Result...>;
-
-  // Creates a FuturePtr<Result...>. |trace_name| is used solely for debugging
-  // purposes, and is logged when something goes wrong (e.g. Complete() is
-  // called twice.)
-  static FuturePtr<Result...> Create(const std::string& trace_name) {
-    auto f = fxl::AdoptRef(new Future<Result...>);
-    f->trace_name_ = std::move(trace_name);
-    return f;
-  }
-
-  // Creates a FuturePtr<Result...> that's already completed. For example:
-  //
-  //   FuturePtr<int> f = Future<int>::CreateCompleted("MyFuture", 5);
-  //   f->Then([] (int i) {
-  //     // this lambda executes immediately
-  //     assert(i == 5);
-  //   });
-  static FuturePtr<Result...> CreateCompleted(const std::string& trace_name,
-                                              Result&&... result) {
-    auto f = Create(std::move(trace_name));
-    f->Complete(std::forward<Result>(result)...);
-    return f;
-  }
-
-  // Completes a future with |result|. This causes any callbacks registered
-  // with Then(), ConstThen(), etc to be invoked with |result| passed to them
-  // as a parameter.
-  //
-  // Calling Complete() does not affect this future's refcount. This is because:
-  //
-  // 1. Any callbacks that are registered are called immediately and
-  //    synchronously, so the future's lifetime does not need to be extended
-  //    before callbacks are invoked.
-  // 2. Then() correctly handles cases where the future may be deleted by their
-  //    callbacks.
-  // 3. There is no danger of the future being deleted before Complete() is
-  //    called, because if Complete() is called, the code that calls Complete()
-  //    must have a reference to the future.
-  void Complete(Result&&... result) {
-    CompleteWithTuple(std::forward_as_tuple(std::forward<Result>(result)...));
-  }
-
-  // Returns a std::function<void(Result)> that, when called, calls Complete()
-  // on this future. For example:
-  //
-  // FuturePtr<Bytes> MakeNetworkRequest(NetworkRequest& request) {
-  //   auto f = Future<Bytes>::Create();
-  //   PerformAsyncNetworkRequest(request, f->Completer());
-  //   return f;
-  // }
-  //
-  // The returned closure will maintain a reference to the future, so that the
-  // closure can call Complete() on it correctly later. In other words, calling
-  // Completer() will increase this future's refcount, and you do not need to
-  // maintain a reference to it. After the closure is called, the future's
-  // refcount will drop by 1. This enables you to write code like
-  //
-  //   {
-  //     auto f = Future<>::Create();
-  //     CallAsyncMethod(f->Completer());
-  //     // f will now go out of scope, but f->Completer() owns it, so it's
-  //     // still kept alive.
-  //   }
-  std::function<void(Result...)> Completer() {
-    return [shared_this = FuturePtr<Result...>(this)](Result&&... result) {
-      shared_this->Complete(std::forward<Result>(result)...);
-    };
-  }
-
-  // Attaches a |callback| that is invoked when the future is completed with
-  // Complete(), and returns a Future that is complete once |callback| has
-  // finished executing.
-  //
-  // * The callback is invoked immediately (synchronously); it is not scheduled
-  //   on the event loop.
-  // * The callback is invoked on the same thread as the code that calls
-  //   Complete().
-  // * Only one callback can be attached: any callback that was previously
-  //   attached with Then() is discarded.
-  // * |callback| is called after callbacks attached with ConstThen().
-  // * It is safe for |callback| to delete the future that Then() is invoked on.
-  //   If this occurs, any chained futures returned by Then(), Map() etc will be
-  //   de-referenced by this future and not be completed, even if a reference to
-  //   the chained future is maintained elsewhere.
-  // * It is also safe for |callback| to delete the chained future that Then()
-  //   returns.
-  // * The future returned by Then() will be owned by this future, so you do not
-  //   need to maintain a reference to it.
-  //
-  // The type of this function looks complex, but is basically:
-  //
-  //   FuturePtr<> Then(std::function<void(Result...)> callback);
-  template <typename Callback,
-            typename = typename std::enable_if_t<
-                internal::is_void_v<std::result_of_t<Callback(Result...)>>>>
-  FuturePtr<> Then(Callback callback) {
-    return SubfutureCreate(
-        Future<>::Create(trace_name_ + "(Then)"),
-        SubfutureVoidCallback<Result...>(std::move(callback)),
-        SubfutureCompleter<>(), [] { return true; });
-  }
-
-  // Equivalent to Then(), but guards execution of |callback| with a WeakPtr.
-  // If, at the time |callback| is to be executed, |weak_ptr| has been
-  // invalidated, |callback| is not run, nor is the next Future in the chain
-  // completed.
-  template <typename Callback, typename T,
-            typename = typename std::enable_if_t<
-                internal::is_void_v<std::result_of_t<Callback(Result...)>>>>
-  FuturePtr<> WeakThen(fxl::WeakPtr<T> weak_ptr, Callback callback) {
-    return SubfutureCreate(
-        Future<>::Create(trace_name_ + "(WeakThen)"),
-        SubfutureVoidCallback<Result...>(std::move(callback)),
-        SubfutureCompleter<>(), [weak_ptr] { return !!weak_ptr; });
-  }
-
-  // Similar to Then(), except that:
-  //
-  // * |const_callback| must take in the completed result via a const&,
-  // * multiple callbacks can be attached,
-  // * |const_callback| is called _before_ the Then() callback.
-  FuturePtr<> ConstThen(std::function<void(const Result&...)> const_callback) {
-    FuturePtr<> subfuture = Future<>::Create(trace_name_ + "(ConstThen)");
-    AddConstCallback(SubfutureCallback<const Result&...>(
-        subfuture,
-        SubfutureVoidCallback<const Result&...>(std::move(const_callback)),
-        SubfutureCompleter<>(), [] { return true; }));
-    return subfuture;
-  }
-
-  // See WeakThen().
-  template <typename T>
-  FuturePtr<> WeakConstThen(
-      fxl::WeakPtr<T> weak_ptr,
-      std::function<void(const Result&...)> const_callback) {
-    FuturePtr<> subfuture = Future<>::Create(trace_name_ + "(WeakConstThen)");
-    AddConstCallback(SubfutureCallback<const Result&...>(
-        subfuture,
-        SubfutureVoidCallback<const Result&...>(std::move(const_callback)),
-        SubfutureCompleter<>(), [weak_ptr] { return !!weak_ptr; }));
-    return subfuture;
-  }
-
-  // Attaches a |callback| that is invoked when this future is completed with
-  // Complete(). |callback| must return another future: when the returned future
-  // completes, the future returned by AsyncMap() will complete. For example:
-  //
-  // ShowProgressSpinner(true);
-  // FuturePtr<Bytes> f = MakeNetworkRequest(request);
-  // f->AsyncMap([] (Bytes zipped_bytes) {
-  //   FuturePtr<Bytes> f = UnzipInBackground(zipped_bytes);
-  //   return f;
-  // })->AsyncMap([] (Bytes unzipped_bytes) {
-  //   FuturePtr<JPEGImage> f = DecodeImageInBackground(unzipped_bytes);
-  //   return f;
-  // })->AsyncMap([] (JPEGImage image) {
-  //   FuturePtr<> f = UpdateUIAsynchronously(image);
-  //   return f;
-  // })->Then([] {
-  //   ShowProgressSpinner(false);
-  // });
-  //
-  // The type of this method looks terrifying, but is basically:
-  //
-  //   FuturePtr<CallbackResult>
-  //     AsyncMap(std::function<FuturePtr<CallbackResult>(Result...)> callback);
-  template <typename Callback,
-            typename AsyncMapResult = std::result_of_t<Callback(Result...)>,
-            typename MapResult =
-                typename AsyncMapResult::element_type::result_tuple_type,
-            typename = typename std::enable_if_t<internal::is_convertible_v<
-                FuturePtr<MapResult>, AsyncMapResult>>>
-  AsyncMapResult AsyncMap(Callback callback) {
-    return SubfutureCreate(
-        AsyncMapResult::element_type::Create(trace_name_ + "(AsyncMap)"),
-        std::move(callback), SubfutureAsyncMapCompleter<AsyncMapResult>(),
-        [] { return true; });
-  }
-
-  template <typename Callback, typename T,
-            typename AsyncMapResult = std::result_of_t<Callback(Result...)>,
-            typename MapResult =
-                typename AsyncMapResult::element_type::result_tuple_type,
-            typename = typename std::enable_if_t<internal::is_convertible_v<
-                FuturePtr<MapResult>, AsyncMapResult>>>
-  AsyncMapResult WeakAsyncMap(fxl::WeakPtr<T> weak_ptr, Callback callback) {
-    return SubfutureCreate(
-        AsyncMapResult::element_type::Create(trace_name_ + "(WeakAsyncMap)"),
-        std::move(callback), SubfutureAsyncMapCompleter<AsyncMapResult>(),
-        [weak_ptr] { return !!weak_ptr; });
-  }
-
-  // Attaches a |callback| that is invoked when this future is completed with
-  // Complete(). The returned future is completed with |callback|'s return
-  // value, when |callback| finishes executing. Returned tuples are flattened
-  // into variadic futures.
-  //
-  // To return a future that produces a tuple (uncommon), wrap the map result
-  // in another tuple (or use |AsyncMap|).
-  //
-  // That is:
-  // Callback return type              | Returned future
-  // ----------------------------------+----------------
-  // T                                 | FuturePtr<T>
-  // std::tuple<T, U, ...>             | FuturePtr<T, U, ...>
-  // std::tuple<std::tuple<T, U, ...>> | FuturePtr<std::tuple<T, U, ...>>
-  template <typename Callback,
-            typename MapResult = std::result_of_t<Callback(Result...)>>
-  auto Map(Callback callback) {
-    return Map(std::move(callback), Tag<MapResult>{});
-  }
-
-  template <typename Callback, typename T,
-            typename MapResult = std::result_of_t<Callback(Result...)>>
-  FuturePtr<MapResult> WeakMap(fxl::WeakPtr<T> weak_ptr, Callback callback) {
-    return SubfutureCreate(Future<MapResult>::Create(trace_name_ + "(WeakMap)"),
-                           std::move(callback), SubfutureCompleter<MapResult>(),
-                           [weak_ptr] { return !!weak_ptr; });
-  }
-
-  const std::string& trace_name() const { return trace_name_; }
-
- private:
-  template <typename... Args>
-  friend class Future;
-
-  // This is a utility class used as a template parameter to determine function
-  // overloading; see
-  // <https://www.boost.org/community/generic_programming.html#tag_dispatching>
-  // for more info.
-  //
-  // It is used in the |Map| overloads to "specialize" for |std::tuple| and
-  // capture its parameter pack.
-  template <typename T>
-  class Tag {};
-
-  template <typename ResultsFuture, typename... Args>
-  friend fxl::RefPtr<ResultsFuture> Wait(
-      const std::string& trace_name,
-      const std::vector<FuturePtr<Args...>>& futures);
-
-  template <typename ResultsFuture, typename TimeoutCallback, typename... Args>
-  friend fxl::RefPtr<ResultsFuture> WaitWithTimeout(
-      const std::string& trace_name, async_dispatcher_t* dispatcher,
-      zx::duration timeout, TimeoutCallback on_timeout,
-      const std::vector<FuturePtr<Args...>>& futures);
-
-  FRIEND_REF_COUNTED_THREAD_SAFE(Future);
-
-  Future() : result_{}, weak_factory_(this) {}
-
-  void SetCallback(std::function<void(Result...)>&& callback) {
-    callback_ = callback;
-
-    MaybeInvokeCallbacks();
-  }
-
-  void SetCallbackWithTuple(
-      std::function<void(std::tuple<Result...>)>&& callback) {
-    SetCallback([callback](Result&&... result) {
-      callback(std::forward_as_tuple(std::forward<Result>(result)...));
-    });
-  }
-
-  void AddConstCallback(std::function<void(const Result&...)>&& callback) {
-    if (!callback) {
-      return;
-    }
-
-    // It's impossible to add a const callback after a future is completed
-    // *and* it has a callback: the completed value will be moved into the
-    // callback and won't be available for a ConstThen().
-    if (status_ == internal::FutureStatus::kConsumed) {
-      FXL_LOG(FATAL)
-          << "Future@" << static_cast<void*>(this)
-          << (trace_name_.length() ? "(" + trace_name_ + ")" : "")
-          << ": Cannot add a const callback after completed result is "
-             "already moved into Then() callback.";
-    }
-
-    const_callbacks_.emplace_back(callback);
-
-    MaybeInvokeCallbacks();
-  }
-
-  void CompleteWithTuple(std::tuple<Result...>&& result) {
-    FXL_DCHECK(status_ == internal::FutureStatus::kAwaiting)
-        << "Future@" << static_cast<void*>(this)
-        << (trace_name_.length() ? "(" + trace_name_ + ")" : "")
-        << ": Complete() called twice.";
-
-    result_ = std::forward<std::tuple<Result...>>(result);
-    status_ = internal::FutureStatus::kCompleted;
-
-    MaybeInvokeCallbacks();
-  }
-
-  void MaybeInvokeCallbacks() {
-    if (status_ == internal::FutureStatus::kAwaiting) {
-      return;
-    }
-
-    if (const_callbacks_.size()) {
-      // Move |const_callbacks_| to a local variable. MaybeInvokeCallbacks()
-      // can be called multiple times if the client only uses ConstThen() or
-      // WeakConstThen() to fetch the completed values. This prevents calling
-      // these callbacks multiple times by moving them out of the members
-      // scope.
-      auto local_const_callbacks = std::move(const_callbacks_);
-      for (auto& const_callback : local_const_callbacks) {
-        fxl::Apply(const_callback, result_);
-      }
-    }
-
-    if (callback_) {
-      auto callback = std::move(callback_);
-      status_ = internal::FutureStatus::kConsumed;
-      fxl::Apply(callback, std::move(result_));
-    }
-  }
-
-  // The "subfuture" methods below are private helper functions designed to be
-  // used with the futures that are returned by the public API (Then(), Map(),
-  // etc); those returned futures are named "subfutures" in the code, which is
-  // why the methods are named likewise.
-
-  // A convenience method to call this->SetCallback() with the lambda returned
-  // by SubfutureCallback().
-  template <typename Subfuture, typename SubfutureCompleter, typename Callback,
-            typename Guard>
-  Subfuture SubfutureCreate(Subfuture subfuture, Callback&& callback,
-                            SubfutureCompleter&& subfuture_completer,
-                            Guard&& guard) {
-    SetCallback(SubfutureCallback<Result...>(subfuture, callback,
-                                             subfuture_completer, guard));
-    return subfuture;
-  }
-
-  // Returns a lambda that:
-  //
-  // 1. calls |guard| before calling |callback|, and only calls |callback| if
-  //    |guard| returns true;
-  // 2. will not call |subfuture_completer| if either |this| or |subfuture| are
-  //    destroyed by |callback|.
-  template <typename... CoercedResult, typename Subfuture,
-            typename SubfutureCompleter, typename Callback, typename Guard>
-  auto SubfutureCallback(Subfuture subfuture, Callback&& callback,
-                         SubfutureCompleter&& subfuture_completer,
-                         Guard&& guard) {
-    return [this, subfuture, callback, subfuture_completer,
-            guard](CoercedResult&&... result) {
-      if (!guard())
-        return;
-
-      auto weak_future = weak_factory_.GetWeakPtr();
-      auto weak_subfuture = subfuture->weak_factory_.GetWeakPtr();
-      auto subfuture_result = callback(std::forward<CoercedResult>(result)...);
-
-      // |callback| above may delete this future or the returned subfuture when
-      // it finishes executing, so check if |weak_future| and |weak_subfuture|
-      // are still valid before attempting to complete the subfuture.
-      if (weak_future && weak_subfuture)
-        subfuture_completer(subfuture, std::move(subfuture_result));
-    };
-  }
-
-  // Returns a lambda that calls |callback|, and returns an empty tuple. The
-  // consistent return type enables generic programming techniques to be
-  // applied to |callback| since the return type is consistent (it's always a
-  // |std::tuple<T...>|).
-  template <typename... CoercedResult, typename Callback>
-  auto SubfutureVoidCallback(Callback&& callback) {
-    return [callback](CoercedResult&&... result) {
-      callback(std::forward<CoercedResult>(result)...);
-      return std::make_tuple();
-    };
-  }
-
-  // Returns a lambda that, when called with a subfuture and a std::tuple, will
-  // complete the subfuture with the values from the tuple elements. This method
-  // is designed to be used with SubfutureAsyncMapCompleter(), which will do
-  // the same thing but can be passed Futures for the std::tuple values.
-  // Together, this enables generic programming techniques to be applied to the
-  // returned lambda, since the lambda presents a consistent API for callers.
-  template <typename... SubfutureResult>
-  auto SubfutureCompleter() {
-    return [](FuturePtr<SubfutureResult...> subfuture,
-              std::tuple<SubfutureResult...> subfuture_result) {
-      subfuture->CompleteWithTuple(std::move(subfuture_result));
-    };
-  }
-
-  // See the documentation for SubfutureCompleter() above.
-  template <typename AsyncMapResult>
-  auto SubfutureAsyncMapCompleter() {
-    return [](AsyncMapResult subfuture,
-              std::tuple<AsyncMapResult> subfuture_result) {
-      std::get<0>(subfuture_result)
-          ->SetCallbackWithTuple(
-              [subfuture](
-                  std::tuple<
-                      typename AsyncMapResult::element_type::result_tuple_type>
-                      transformed_result) {
-                subfuture->CompleteWithTuple(
-                    std::move(std::get<0>(transformed_result)));
-              });
-    };
-  }
-
-  // The following overloads enable |Map| to flatten out functions that map to
-  // |std::tuple|.
-
-  template <typename Callback, typename MapResult>
-  FuturePtr<MapResult> Map(Callback callback, Tag<MapResult>) {
-    // Directly passing |callback| like this ends up relying on an implicit
-    // |std::tuple| memberwise constructor, which should be fine. It will
-    // convert from |MapResult| to |std::tuple<MapResult>| implicitly.
-    return Map(std::move(callback), Tag<std::tuple<MapResult>>{});
-  }
-
-  template <typename Callback, typename... MapResult>
-  FuturePtr<MapResult...> Map(Callback callback,
-                              Tag<std::tuple<MapResult...>>) {
-    return SubfutureCreate(Future<MapResult...>::Create(trace_name_ + "(Map)"),
-                           std::move(callback),
-                           SubfutureCompleter<MapResult...>(),
-                           [] { return true; });
-  }
-
-  std::string trace_name_;
-
-  internal::FutureStatus status_ = internal::FutureStatus::kAwaiting;
-  std::tuple<Result...> result_;
-
-  // TODO(MI4-1102): Convert std::function to fit::function here & everywhere.
-
-  // The callback attached to this future.
-  std::function<void(Result...)> callback_;
-
-  // Callbacks that have attached with the Const*() methods, such as
-  // ConstThen().
-  std::vector<std::function<void(const Result&...)>> const_callbacks_;
-
-  // Keep this last in the list of members. (See WeakPtrFactory documentation
-  // for more info.)
-  fxl::WeakPtrFactory<Future<Result...>> weak_factory_;
-
-  FXL_DISALLOW_COPY_ASSIGN_AND_MOVE(Future);
-
-  // For unit tests only.
-  friend class FutureTest;
-
-  // For unit tests only.
-  const std::tuple<Result...>& get() const {
-    FXL_DCHECK(status_ != internal::FutureStatus::kAwaiting)
-        << trace_name_ << ": get() called on unset future";
-
-    return result_;
-  }
-};
-
-// Returns a Future that completes when every future in |futures| is complete.
-// The future returned by Wait() will be kept alive until every future in
-// |futures| either completes or is destroyed. If any future in |futures| is
-// destroyed prior to completing, the returned future will never complete. The
-// order of the results corresponds to the order of the given futures,
-// regardless of their completion order.
-//
-// The default type of the resulting future depends on the types of the
-// component futures. Void futures produce a void future. Monadic futures
-// produce a future of a flat vector. Polyadic futures produce a future of a
-// vector of tuples. That is:
-//
-// Components         | Result
-// -------------------+--------------------------------------------
-// FuturePtr<>        | FuturePtr<>
-// FuturePtr<T>       | FuturePtr<std::vector<T>>
-// FuturePtr<T, U...> | FuturePtr<std::vector<std::tuple<T, U...>>>
-//
-// These defaults may be overridden by specifying the template argument for
-// Wait as the type of future desired. All cases may produce a Future<> or a
-// Future<std::vector<std::tuple<...>>>.
-//
-// Example usage:
-//
-// FuturePtr<Bytes> f1 = MakeNetworkRequest(request1);
-// FuturePtr<Bytes> f2 = MakeNetworkRequest(request2);
-// FuturePtr<Bytes> f3 = MakeNetworkRequest(request3);
-// std::vector<FuturePtr<Bytes>> requests{f1, f2, f3};
-// Wait("NetworkRequests", requests)->Then([](
-//     std::vector<Bytes> bytes_vector) {
-//   Bytes f1_bytes = bytes_vector[0];
-//   Bytes f2_bytes = bytes_vector[1];
-//   Bytes f3_bytes = bytes_vector[2];
-// });
-//
-// This is similar to Promise.All() in JavaScript, or Join() in Rust.
-template <typename ResultsFuture, typename... Result>
-fxl::RefPtr<ResultsFuture> Wait(
-    const std::string& trace_name,
-    const std::vector<FuturePtr<Result...>>& futures) {
-  if (futures.empty()) {
-    auto immediate = ResultsFuture::Create(trace_name + "(Completed)");
-    immediate->CompleteWithTuple({});
-    return immediate;
-  }
-
-  auto results = std::make_shared<internal::ResultCollector<ResultsFuture>>(
-      futures.size());
-
-  fxl::RefPtr<ResultsFuture> all_futures_completed =
-      ResultsFuture::Create(trace_name + "(WillWait)");
-
-  for (size_t i = 0; i < futures.size(); i++) {
-    const auto& future = futures[i];
-    future->SetCallback(
-        [i, all_futures_completed, results](Result&&... result) {
-          results->AssignResult(i, std::forward<Result>(result)...);
-
-          if (results->IsComplete()) {
-            results->Complete(all_futures_completed.get());
-          }
-        });
-  }
-
-  return all_futures_completed;
-}
-
-// Like |Wait|, but gives up after a timeout. After the timeout, |on_timeout| is
-// invoked with a diagnostic error string containing the trace names of the
-// futures that have not completed.
-//
-// This maintains a reference to the returned |Future| until all component
-// futures have been completed or destroyed, or until the timeout has elapsed,
-// whichever happens first. However, |on_timeout| will be invoked on timeout if
-// any future has not completed even if any or all futures have been destroyed.
-template <typename ResultsFuture, typename TimeoutCallback, typename... Result>
-fxl::RefPtr<ResultsFuture> WaitWithTimeout(
-    const std::string& trace_name, async_dispatcher_t* dispatcher,
-    zx::duration timeout,
-    TimeoutCallback on_timeout /* void (const std::string&) */,
-    const std::vector<FuturePtr<Result...>>& futures) {
-  auto all_futures_completed = Wait<ResultsFuture>(trace_name, futures);
-
-  if (all_futures_completed->status_ != internal::FutureStatus::kAwaiting) {
-    return all_futures_completed;
-  }
-
-  auto all_trace_names =
-      std::make_shared<std::vector<std::unique_ptr<std::string>>>();
-  all_trace_names->reserve(futures.size());
-
-  for (const auto& future : futures) {
-    // There's no point in waiting on completed futures. Furthermore if we tried
-    // that we'd have to put this before |Wait| since |Wait| consumes the
-    // results, but then if all futures are already completed this is all just
-    // wasted effort.
-    if (future->status_ == internal::FutureStatus::kAwaiting) {
-      size_t i = all_trace_names->size();
-      all_trace_names->push_back(
-          std::make_unique<std::string>(future->trace_name_));
-      future->AddConstCallback([i, all_trace_names](const Result&...) {
-        if (!all_trace_names->empty()) {
-          (*all_trace_names)[i] = nullptr;
-        }
-      });
-    }
-  }
-
-  // Return a proxy so that we can cancel result forwarding in the case of a
-  // timeout. This could with more difficulty be done within |Wait|, but this
-  // way allows us to reuse the logic more easily.
-  fxl::RefPtr<ResultsFuture> all_proxy =
-      ResultsFuture::Create(trace_name + "(WillWaitWithTimeout)");
-  all_futures_completed->SetCallback(all_proxy->Completer());
-
-  // TODO(rosswang): Factor this into dump and cancel functions that can be
-  // called at other times.
-  async::PostDelayedTask(
-      dispatcher,
-      [all_trace_names = std::move(all_trace_names),
-       on_timeout = std::move(on_timeout),
-       all_futures_completed =
-           all_futures_completed->weak_factory_.GetWeakPtr()] {
-        std::ostringstream msg;
-        for (const auto& trace_name : *all_trace_names) {
-          if (trace_name) {
-            msg << "\n\t" << *trace_name;
-          }
-        }
-        if (!msg.str().empty()) {
-          on_timeout("Wait timed out. Still waiting for futures:" + msg.str());
-          if (all_futures_completed) {
-            // cancel results forwarding (possibly releasing all_proxy)
-            all_futures_completed->SetCallback(nullptr);
-          }
-          // Possibly release the component futures. Once this task completes
-          // and goes out of scope, the last reference to the Wait future (also
-          // holding onto the component futures) should be released as well.
-          all_trace_names->clear();
-        }
-      },
-      timeout);
-
-  return all_proxy;
-}
-
-// |WaitWithTimeout| on the thread defaut dispatcher.
-template <typename ResultsFuture, typename TimeoutCallback, typename... Result>
-fxl::RefPtr<ResultsFuture> WaitWithTimeout(
-    const std::string& trace_name, zx::duration timeout,
-    TimeoutCallback on_timeout /* void (const std::string&) */,
-    const std::vector<FuturePtr<Result...>>& futures) {
-  return WaitWithTimeout<ResultsFuture>(trace_name,
-                                        async_get_default_dispatcher(), timeout,
-                                        std::move(on_timeout), futures);
-}
-
-// These overloads allow us to effectively default the first template parameter,
-// |ResultsFuture| (since the others are intended to be inferred).
-// TODO(rosswang): If the overload combinatoric explosion gets too heavy, we can
-// use a dummy struct parameter instead to encapsulate that template parameter.
-
-template <typename... Result>
-auto Wait(const std::string& trace_name,
-          const std::vector<FuturePtr<Result...>>& futures) {
-  return Wait<internal::DefaultResultsFuture_t<Result...>>(trace_name, futures);
-}
-
-template <typename TimeoutCallback, typename... Result>
-auto WaitWithTimeout(const std::string& trace_name,
-                     async_dispatcher_t* dispatcher, zx::duration timeout,
-                     TimeoutCallback on_timeout,
-                     const std::vector<FuturePtr<Result...>>& futures) {
-  return WaitWithTimeout<internal::DefaultResultsFuture_t<Result...>>(
-      trace_name, dispatcher, timeout, std::move(on_timeout), futures);
-}
-
-template <typename TimeoutCallback, typename... Result>
-auto WaitWithTimeout(const std::string& trace_name, zx::duration timeout,
-                     TimeoutCallback on_timeout /* void (const std::string&) */,
-                     const std::vector<FuturePtr<Result...>>& futures) {
-  return WaitWithTimeout<internal::DefaultResultsFuture_t<Result...>>(
-      trace_name, async_get_default_dispatcher(), timeout,
-      std::move(on_timeout), futures);
-}
-
-// We need to provide the initializer list overloads or template deduction fails
-// for the above overloads if given an initializer list.
-// TODO(rosswang): Add a potentially heterogeneous variadic template instead,
-// and prefer it over initializer lists outside of tests.
-template <typename ResultsFuture, typename... Result>
-auto Wait(const std::string& trace_name,
-          std::initializer_list<FuturePtr<Result...>> futures) {
-  return Wait<ResultsFuture>(trace_name,
-                             std::vector<FuturePtr<Result...>>(futures));
-}
-
-template <typename ResultsFuture, typename TimeoutCallback, typename... Result>
-fxl::RefPtr<ResultsFuture> WaitWithTimeout(
-    const std::string& trace_name, async_dispatcher_t* dispatcher,
-    zx::duration timeout, TimeoutCallback on_timeout,
-    std::initializer_list<FuturePtr<Result...>> futures) {
-  return WaitWithTimeout<ResultsFuture>(
-      trace_name, dispatcher, timeout, std::move(on_timeout),
-      std::vector<FuturePtr<Result...>>(futures));
-}
-
-template <typename ResultsFuture, typename TimeoutCallback, typename... Result>
-fxl::RefPtr<ResultsFuture> WaitWithTimeout(
-    const std::string& trace_name, zx::duration timeout,
-    TimeoutCallback on_timeout /* void (const std::string&) */,
-    std::initializer_list<FuturePtr<Result...>> futures) {
-  return WaitWithTimeout<ResultsFuture>(
-      trace_name, async_get_default_dispatcher(), timeout,
-      std::move(on_timeout), std::vector<FuturePtr<Result...>>(futures));
-}
-
-template <typename... Result>
-auto Wait(const std::string& trace_name,
-          std::initializer_list<FuturePtr<Result...>> futures) {
-  return Wait(trace_name, std::vector<FuturePtr<Result...>>(futures));
-}
-
-template <typename TimeoutCallback, typename... Result>
-auto WaitWithTimeout(const std::string& trace_name,
-                     async_dispatcher_t* dispatcher, zx::duration timeout,
-                     TimeoutCallback on_timeout,
-                     std::initializer_list<FuturePtr<Result...>> futures) {
-  return WaitWithTimeout(trace_name, dispatcher, timeout, std::move(on_timeout),
-                         std::vector<FuturePtr<Result...>>(futures));
-}
-
-template <typename TimeoutCallback, typename... Result>
-auto WaitWithTimeout(const std::string& trace_name, zx::duration timeout,
-                     TimeoutCallback on_timeout /* void (const std::string&) */,
-                     std::initializer_list<FuturePtr<Result...>> futures) {
-  return WaitWithTimeout(trace_name, async_get_default_dispatcher(), timeout,
-                         std::move(on_timeout),
-                         std::vector<FuturePtr<Result...>>(futures));
-}
-
-}  // namespace modular
-
-#endif  // LIB_ASYNC_CPP_FUTURE_H_
diff --git a/public/lib/async/cpp/future_unittest.cc b/public/lib/async/cpp/future_unittest.cc
deleted file mode 100644
index 9bc2c05..0000000
--- a/public/lib/async/cpp/future_unittest.cc
+++ /dev/null
@@ -1,910 +0,0 @@
-#include <lib/async/cpp/future.h>
-
-#include <string>
-
-#include <lib/async-testutils/test_loop.h>
-#include <lib/fxl/logging.h>
-
-#include "gtest/gtest-spi.h"
-#include "gtest/gtest.h"
-
-#include <memory>
-#include <string>
-
-namespace modular {
-
-namespace {
-
-// https://www.reddit.com/r/Stargate/comments/114165/stargate_sg_1_episode_200_what_is_your_favorite/c6j8ryy
-// https://en.wikiquote.org/wiki/Stargate_SG-1/Season_10#200_[10.6]
-// (The actual duration is immaterial because we control time in unit tests.)
-constexpr zx::duration kPause = zx::min(38);
-
-// This is a simple class to enable asynchronous callbacks to be tested. In each
-// test:
-//
-// 1. Instantiate an AsyncExceptions object,
-// 2. Call Signal() in each async callback to indicate that an async callback
-//    was successfully called. Note that doesn't mean that the callback itself
-//    was passed the correct parameters or was successful: to ensure that, your
-//    callback should call still EXPECT_* for its expected results.
-// 3. Call Verify(n) at the end of your test method to ensure that the number of
-//    expected async callbacks is correct. |n| should be the number of Signal()
-//    calls that were expected. Verify() will fail if Signal() hasn't been
-//    called exactly |n| times.
-//
-// Note that AsyncExpectations does _not_ integrate with the message loop, since
-// its one use case has no need to do that.
-//
-// THIS CLASS IS NOT THREAD-SAFE.
-//
-// Example:
-//
-// TEST(FooTest, FooTestCase) {
-//   AsyncExpectations async_expectations;
-//   async_function_1([&] {
-//     async_expectations.Signal();
-//   });
-//   async_function_2([&] {
-//     async_expectations.Signal();
-//   });
-//   async_expectations.Verify(2);
-// }
-class AsyncExpectations {
- public:
-  void Signal() { ++count_; }
-  void Reset() { count_ = 0; }
-
-  int count() const { return count_; }
-
- private:
-  int count_ = 0;
-};
-
-TEST(AsyncExpectationTest, TestLessThanExpectedCountFails) {
-  AsyncExpectations async_expectations;
-
-  async_expectations.Signal();
-  EXPECT_NONFATAL_FAILURE({ EXPECT_EQ(2, async_expectations.count()); },
-                          "Expected equality");
-}
-
-TEST(AsyncExpectationTest, TestExpectedCountSucceeds) {
-  AsyncExpectations async_expectations;
-
-  async_expectations.Signal();
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST(AsyncExpectationTest, TestMoreThanExpectedCountFails) {
-  AsyncExpectations async_expectations;
-
-  async_expectations.Signal();
-  async_expectations.Signal();
-  EXPECT_NONFATAL_FAILURE({ EXPECT_EQ(1, async_expectations.count()); },
-                          "Expected equality");
-}
-
-}  // namespace
-
-// FutureTest must be in the ::modular namespace (not in an anonymous namespace)
-// so that the "friend class FutureTest;" declaration in the Future class can
-// properly befriend this test.
-class FutureTest : public ::testing::Test {
- protected:
-  template <typename... Result>
-  const std::tuple<Result...>& get(const FuturePtr<Result...>& future) const {
-    return future->get();
-  }
-
-  template <typename... Result>
-  fxl::WeakPtrFactory<Future<Result...>>& weak_factory(
-      const FuturePtr<Result...>& future) const {
-    return future->weak_factory_;
-  }
-};
-
-namespace {
-
-TEST_F(FutureTest, Create) {
-  auto f = Future<>::Create(__PRETTY_FUNCTION__);
-
-  EXPECT_NE(f.get(), nullptr);
-}
-
-TEST_F(FutureTest, CompleteAndGet) {
-  auto f = Future<int>::Create(__PRETTY_FUNCTION__);
-
-  f->Complete(10);
-  ASSERT_EQ(get(f), std::tuple<int>(10));
-}
-
-TEST_F(FutureTest, ThenWith0Argument) {
-  auto f = Future<>::Create(__PRETTY_FUNCTION__);
-
-  AsyncExpectations async_expectations;
-
-  f->Then([&]() { async_expectations.Signal(); });
-
-  f->Complete();
-  ASSERT_EQ(get(f), std::tuple<>());
-
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, ThenWith1Argument) {
-  auto f = Future<int>::Create(__PRETTY_FUNCTION__);
-
-  AsyncExpectations async_expectations;
-
-  f->Then([&](const int& value) {
-    EXPECT_EQ(value, 10);
-    async_expectations.Signal();
-  });
-
-  f->Complete(10);
-
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, ThenWith2Argument) {
-  auto f = Future<int, float>::Create(__PRETTY_FUNCTION__);
-
-  AsyncExpectations async_expectations;
-
-  f->Then([&](const int& i, const float& f) {
-    EXPECT_EQ(i, 10);
-    EXPECT_FLOAT_EQ(f, 3.14f);
-    async_expectations.Signal();
-  });
-
-  f->Complete(10, 3.14f);
-
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, CompleteBeforeThen) {
-  auto f = Future<int>::Create(__PRETTY_FUNCTION__);
-
-  f->Complete(10);
-
-  AsyncExpectations async_expectations;
-
-  f->Then([&](const int& value) {
-    EXPECT_EQ(value, 10);
-    async_expectations.Signal();
-  });
-
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, ThenCorrectlyMoves) {
-  std::shared_ptr<int> p(new int(10));
-  auto f = Future<std::shared_ptr<int>>::Create(__PRETTY_FUNCTION__);
-
-  AsyncExpectations async_expectations;
-
-  f->Then([&](std::shared_ptr<int> p2) {
-    EXPECT_EQ(p.get(), nullptr);
-    EXPECT_NE(p2.get(), nullptr);
-
-    EXPECT_EQ(*p2, 10);
-    async_expectations.Signal();
-  });
-
-  f->Complete(std::move(p));
-
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, ConstThen) {
-  std::shared_ptr<int> p(new int(10));
-  auto f = Future<std::shared_ptr<int>>::Create(__PRETTY_FUNCTION__);
-
-  AsyncExpectations async_expectations;
-
-  f->ConstThen([&](const std::shared_ptr<int>& p2) {
-    EXPECT_NE(p2.get(), nullptr);
-    EXPECT_EQ(p.get(), nullptr);
-
-    EXPECT_EQ(*p2, 10);
-    async_expectations.Signal();
-  });
-
-  f->ConstThen([&](const std::shared_ptr<int>& p3) {
-    EXPECT_NE(p3.get(), nullptr);
-    EXPECT_EQ(p.get(), nullptr);
-
-    EXPECT_EQ(*p3, 10);
-    async_expectations.Signal();
-  });
-
-  f->Complete(std::move(p));
-
-  EXPECT_EQ(2, async_expectations.count());
-}
-
-TEST_F(FutureTest, ConstThenAfterComplete) {
-  auto f = Future<int>::Create(__PRETTY_FUNCTION__);
-
-  AsyncExpectations async_expectations;
-
-  bool first_const_then{};
-  f->ConstThen([&](const int& i) {
-    EXPECT_FALSE(first_const_then);
-    first_const_then = true;
-    async_expectations.Signal();
-  });
-
-  f->Complete(10);
-
-  bool second_const_then{};
-  f->ConstThen([&](const int& i) {
-    EXPECT_FALSE(second_const_then);
-    second_const_then = true;
-    async_expectations.Signal();
-  });
-
-  EXPECT_EQ(2, async_expectations.count());
-}
-
-TEST_F(FutureTest, ConstThenAfterThen) {
-  std::shared_ptr<int> p(new int(10));
-  auto f = Future<std::shared_ptr<int>>::Create(__PRETTY_FUNCTION__);
-
-  AsyncExpectations async_expectations;
-
-  f->ConstThen([&](const std::shared_ptr<int>& p2) {
-    EXPECT_NE(p2.get(), nullptr);
-    EXPECT_EQ(p.get(), nullptr);
-
-    EXPECT_EQ(*p2, 10);
-    async_expectations.Signal();
-  });
-
-  f->Then([&](std::shared_ptr<int> p4) {
-    EXPECT_NE(p4.get(), nullptr);
-    EXPECT_EQ(p.get(), nullptr);
-
-    EXPECT_EQ(*p4, 10);
-    async_expectations.Signal();
-  });
-
-  f->ConstThen([&](const std::shared_ptr<int>& p3) {
-    EXPECT_NE(p3.get(), nullptr);
-    EXPECT_EQ(p.get(), nullptr);
-
-    EXPECT_EQ(*p3, 10);
-    async_expectations.Signal();
-  });
-
-  f->Complete(std::move(p));
-
-  EXPECT_EQ(3, async_expectations.count());
-}
-
-TEST_F(FutureTest, WeakThen) {
-  // WeakThen() will break an execution chain if its weakptr is invalidated.
-  int data = 0;
-  fxl::WeakPtrFactory<int> factory(&data);
-  AsyncExpectations async_expectations;
-
-  // This time we expect all three to run because we haven't invalidated any
-  // WeakPtrs.
-  auto f =
-      Future<>::Create(std::string(__PRETTY_FUNCTION__) + std::string("1"));
-  f->Then([&] { async_expectations.Signal(); })
-      ->WeakThen(factory.GetWeakPtr(), [&] { async_expectations.Signal(); })
-      ->Then([&] { async_expectations.Signal(); });
-
-  f->Complete();
-  EXPECT_EQ(3, async_expectations.count());
-
-  // But this time we'll invalidate WeakPtrs in the first Then(). Only the first
-  // Then() will run.
-  async_expectations.Reset();
-  f = Future<>::Create(std::string(__PRETTY_FUNCTION__) + std::string("2"));
-  f->Then([&] {
-     async_expectations.Signal();
-     factory.InvalidateWeakPtrs();
-   })
-      ->WeakThen(factory.GetWeakPtr(), [&] { async_expectations.Signal(); })
-      ->Then([&] { async_expectations.Signal(); });
-
-  f->Complete();
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, WeakConstThen) {
-  // WeakConstThen() will not run if its weakptr is invalidated.
-  int data = 0;
-  fxl::WeakPtrFactory<int> factory(&data);
-  AsyncExpectations async_expectations;
-
-  auto f =
-      Future<>::Create(std::string(__PRETTY_FUNCTION__) + std::string("1"));
-  f->WeakConstThen(factory.GetWeakPtr(), [&] { async_expectations.Signal(); });
-  f->Complete();
-  EXPECT_EQ(1, async_expectations.count());
-
-  async_expectations.Reset();
-  f = Future<>::Create(std::string(__PRETTY_FUNCTION__) + std::string("2"));
-  f->WeakConstThen(factory.GetWeakPtr(), [&] { async_expectations.Signal(); });
-  factory.InvalidateWeakPtrs();
-  f->Complete();
-  EXPECT_EQ(0, async_expectations.count());
-}
-
-TEST_F(FutureTest, WeakMap) {
-  // Similar to WeakThen(), but using Map calls instead.
-  int data = 0;
-  fxl::WeakPtrFactory<int> factory(&data);
-
-  auto f =
-      Future<int>::Create(std::string(__PRETTY_FUNCTION__) + std::string("1"));
-
-  // First let everything run.
-  AsyncExpectations async_expectations;
-  f->Map([&](int i) {
-     async_expectations.Signal();
-     return 42;
-   })
-      ->WeakMap(factory.GetWeakPtr(),
-                [&](int i) {
-                  async_expectations.Signal();
-                  return 10;
-                })
-      ->Then([&](int i) { async_expectations.Signal(); });
-
-  f->Complete(10);
-  EXPECT_EQ(3, async_expectations.count());
-
-  // Now invalidate it.
-  f = Future<int>::Create(std::string(__PRETTY_FUNCTION__) + std::string("2"));
-  async_expectations.Reset();
-  f->Map([&](int i) {
-     async_expectations.Signal();
-     factory.InvalidateWeakPtrs();
-     return 42;
-   })
-      ->WeakMap(factory.GetWeakPtr(),
-                [&](int i) {
-                  async_expectations.Signal();
-                  return 10;
-                })
-      ->Then([&](int i) { async_expectations.Signal(); });
-
-  f->Complete(10);
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, WeakAsyncMap) {
-  // Similar to WeakThen(), but using Map calls instead.
-  int data = 0;
-  fxl::WeakPtrFactory<int> factory(&data);
-
-  auto f =
-      Future<int>::Create(std::string(__PRETTY_FUNCTION__) + std::string("1"));
-
-  // First let everything run.
-  AsyncExpectations async_expectations;
-  f->Map([&](int i) {
-     async_expectations.Signal();
-     return 42;
-   })
-      ->WeakAsyncMap(factory.GetWeakPtr(),
-                     [&](int i) {
-                       async_expectations.Signal();
-                       return Future<int>::CreateCompleted(
-                           std::string(__PRETTY_FUNCTION__) + std::string("2"),
-                           10);
-                     })
-      ->Then([&](int i) { async_expectations.Signal(); });
-
-  f->Complete(10);
-  EXPECT_EQ(3, async_expectations.count());
-
-  // Now invalidate it.
-  f = Future<int>::Create(std::string(__PRETTY_FUNCTION__) + std::string("3"));
-  async_expectations.Reset();
-  f->Map([&](int i) {
-     async_expectations.Signal();
-     factory.InvalidateWeakPtrs();
-     return 42;
-   })
-      ->WeakAsyncMap(factory.GetWeakPtr(),
-                     [&](int i) {
-                       async_expectations.Signal();
-                       return Future<int>::CreateCompleted(
-                           std::string(__PRETTY_FUNCTION__) + std::string("4"),
-                           10);
-                     })
-      ->Then([&](int i) { async_expectations.Signal(); });
-
-  f->Complete(10);
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, CreateCompleted) {
-  auto f = Future<>::CreateCompleted(__PRETTY_FUNCTION__);
-
-  AsyncExpectations async_expectations;
-
-  f->Then([&]() { async_expectations.Signal(); });
-
-  ASSERT_EQ(get(f), std::tuple<>());
-
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, Wait) {
-  auto f1 = Future<int, std::string>::Create(std::string(__PRETTY_FUNCTION__) +
-                                             std::string("1"));
-  auto f2 = Future<int, std::string>::Create(std::string(__PRETTY_FUNCTION__) +
-                                             std::string("2"));
-  auto f3 = Future<int, std::string>::Create(std::string(__PRETTY_FUNCTION__) +
-                                             std::string("3"));
-
-  AsyncExpectations async_expectations;
-
-  auto f =
-      Wait(std::string(__PRETTY_FUNCTION__) + std::string("4"), {f1, f2, f3});
-  f->Then([&](std::vector<std::tuple<int, std::string>> v) {
-    EXPECT_EQ(v.size(), 3ul);
-
-    EXPECT_EQ(v[0], std::make_tuple(10, "10"));
-    EXPECT_EQ(v[1], std::make_tuple(20, "20"));
-    EXPECT_EQ(v[2], std::make_tuple(30, "30"));
-
-    async_expectations.Signal();
-  });
-
-  // Go ahead and insert out of order to also ensure that Wait produces results
-  // in insertion order rather than completion order.
-  f2->Complete(20, "20");
-  EXPECT_EQ(0, async_expectations.count());
-  f1->Complete(10, "10");
-  EXPECT_EQ(0, async_expectations.count());
-  f3->Complete(30, "30");
-
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, WaitOnZeroFutures) {
-  auto f = Wait(__PRETTY_FUNCTION__, std::vector<FuturePtr<int>>{});
-
-  AsyncExpectations async_expectations;
-
-  f->Then([&](std::vector<int> v) {
-    EXPECT_EQ(v.size(), 0ul);
-    async_expectations.Signal();
-  });
-
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(
-    FutureTest,
-    WaitReleasesReturnedFutureIfAllComponentFuturesHaveBeenCompletedOrDestroyed) {
-  fxl::WeakPtr<Future<std::vector<int>>> weak_f;
-
-  auto f1 = Future<int>::Create(__PRETTY_FUNCTION__ + std::string("1"));
-  {
-    auto f2 = Future<int>::Create(__PRETTY_FUNCTION__ + std::string("2"));
-    weak_f =
-        weak_factory(Wait(__PRETTY_FUNCTION__ + std::string("Wait"), {f1, f2}))
-            .GetWeakPtr();
-  }
-
-  ASSERT_TRUE(weak_f);
-  weak_f->Then([&](std::vector<int>) { FAIL(); });
-  f1->Complete(42);
-  EXPECT_FALSE(weak_f);
-}
-
-// This test is the happy case, more or less identical to |Wait|.
-TEST_F(FutureTest, WaitWithTimeout) {
-  auto f1 = Future<int, std::string>::Create(std::string(__PRETTY_FUNCTION__) +
-                                             std::string("1"));
-  auto f2 = Future<int, std::string>::Create(std::string(__PRETTY_FUNCTION__) +
-                                             std::string("2"));
-  auto f3 = Future<int, std::string>::Create(std::string(__PRETTY_FUNCTION__) +
-                                             std::string("3"));
-
-  AsyncExpectations async_expectations;
-  async::TestLoop loop;
-
-  auto f = WaitWithTimeout(
-      std::string(__PRETTY_FUNCTION__) + std::string("4"), loop.dispatcher(),
-      kPause, [](const std::string& msg) { FAIL() << msg; }, {f1, f2, f3});
-
-  f->Then([&](std::vector<std::tuple<int, std::string>> v) {
-    EXPECT_EQ(v.size(), 3ul);
-
-    EXPECT_EQ(v[0], std::make_tuple(10, "10"));
-    EXPECT_EQ(v[1], std::make_tuple(20, "20"));
-    EXPECT_EQ(v[2], std::make_tuple(30, "30"));
-
-    async_expectations.Signal();
-  });
-
-  loop.RunUntilIdle();  // ensure the timeout does not occur
-
-  // Go ahead and insert out of order to also ensure that Wait produces results
-  // in insertion order rather than completion order.
-  f2->Complete(20, "20");
-  EXPECT_EQ(0, async_expectations.count());
-  f1->Complete(10, "10");
-  EXPECT_EQ(0, async_expectations.count());
-  f3->Complete(30, "30");
-
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-// Zero futures should instantly complete regardless of timeout.
-TEST_F(FutureTest, WaitWithTimeoutOnZeroFutures) {
-  AsyncExpectations async_expectations;
-  async::TestLoop loop;
-
-  auto f = WaitWithTimeout(__PRETTY_FUNCTION__, loop.dispatcher(), {},
-                           [](const std::string& msg) { FAIL() << msg; },
-                           std::vector<FuturePtr<int>>{});
-
-  loop.RunUntilIdle();
-
-  f->Then([&](std::vector<int> v) {
-    EXPECT_EQ(v.size(), 0ul);
-    async_expectations.Signal();
-  });
-
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, WaitWithTimeoutCallsCallbackOnTimeout) {
-  AsyncExpectations async_expectations;
-  async::TestLoop loop;
-
-  auto f1 =
-      Future<>::Create(std::string(__PRETTY_FUNCTION__) + std::string("1"));
-
-  auto f = WaitWithTimeout(std::string(__PRETTY_FUNCTION__) + std::string("2"),
-                           loop.dispatcher(), {},
-                           [&](const std::string& msg) {
-                             EXPECT_EQ('1', msg[msg.size() - 1]);
-                             async_expectations.Signal();
-                           },
-                           {f1});
-
-  loop.RunUntilIdle();
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, WaitWithTimeoutWithDefaultDispatcher) {
-  AsyncExpectations async_expectations;
-  async::TestLoop loop;
-
-  async_set_default_dispatcher(loop.dispatcher());
-
-  auto f1 =
-      Future<>::Create(std::string(__PRETTY_FUNCTION__) + std::string("1"));
-
-  auto f =
-      WaitWithTimeout(std::string(__PRETTY_FUNCTION__) + std::string("2"), {},
-                      [&](const std::string& msg) {
-                        EXPECT_EQ('1', msg[msg.size() - 1]);
-                        async_expectations.Signal();
-                      },
-                      {f1});
-
-  loop.RunUntilIdle();
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, WaitWithTimeoutDoesNotCompleteAfterTimeout) {
-  async::TestLoop loop;
-
-  auto f1 =
-      Future<>::Create(std::string(__PRETTY_FUNCTION__) + std::string("1"));
-
-  auto f = WaitWithTimeout(std::string(__PRETTY_FUNCTION__) + std::string("2"),
-                           loop.dispatcher(), {}, [](const auto&) {}, {f1});
-
-  f->Then([] { FAIL(); });
-
-  loop.RunUntilIdle();
-  f1->Complete();
-}
-
-// The following several tests also test additional Wait functionality, since
-// WaitWithTimeout is implemented in terms of Wait.
-TEST_F(FutureTest, WaitWithTimeoutOnMoveOnlyType) {
-  AsyncExpectations async_expectations;
-  async::TestLoop loop;
-
-  auto f1 = Future<std::unique_ptr<int>>::Create(
-      std::string(__PRETTY_FUNCTION__) + std::string("1"));
-
-  auto f = WaitWithTimeout(std::string(__PRETTY_FUNCTION__) + std::string("2"),
-                           loop.dispatcher(), kPause,
-                           [](const std::string& msg) { FAIL() << msg; }, {f1});
-
-  f->Then([&](std::vector<std::unique_ptr<int>> v) {
-    EXPECT_EQ(v.size(), 1u);
-
-    EXPECT_EQ(*v[0], 42);
-
-    async_expectations.Signal();
-  });
-
-  f1->Complete(std::make_unique<int>(42));
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, WaitWithTimeoutNoTypeStreamlining) {
-  // This test contains no assertions as it is a compile-time test.
-  async::TestLoop loop;
-  auto f1 =
-      Future<>::Create(std::string(__PRETTY_FUNCTION__) + std::string("1"));
-
-  auto f = WaitWithTimeout<Future<std::vector<std::tuple<>>>>(
-      std::string(__PRETTY_FUNCTION__) + std::string("2"), loop.dispatcher(),
-      kPause, [](const auto&) {}, {f1});
-  f->Then([](std::vector<std::tuple<>> v) {});
-}
-
-// This tests a specific bug case where some futures started completed and some
-// did not. In this bug, WaitWithTimeout added its notification const callbacks
-// after invoking Wait. The futures that were completed would invoke the
-// callback added by Wait immediately, making the const callbacks then added by
-// WaitWithTimeout illegal. This did not manifest when all futures started
-// completed due to an optimization in WaitWithTimeout that returns immediately
-// if the Wait future starts complete.
-TEST_F(FutureTest, WaitWithTimeoutOnPartiallyCompletedFutures) {
-  AsyncExpectations async_expectations;
-  async::TestLoop loop;
-
-  auto f1 = Future<int>::Create(__PRETTY_FUNCTION__ + std::string("1"));
-  auto f2 = Future<int>::Create(__PRETTY_FUNCTION__ + std::string("2"));
-  f1->Complete(42);
-  auto f =
-      WaitWithTimeout(__PRETTY_FUNCTION__ + std::string("Wait"),
-                      loop.dispatcher(), kPause, [](const auto&) {}, {f1, f2})
-          ->Then([&](const std::vector<int>& results) {
-            ASSERT_EQ(2u, results.size());
-            EXPECT_EQ(42, results[0]);
-            EXPECT_EQ(54, results[1]);
-            async_expectations.Signal();
-          });
-  f2->Complete(54);  // http://hitchhikers.wikia.com/wiki/42
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, WaitWithTimeoutReleasesFuturesOnCompletion) {
-  async::TestLoop loop;
-  fxl::WeakPtr<Future<>> weak_f1;
-
-  {
-    auto f1 = Future<>::Create(__PRETTY_FUNCTION__ + std::string("1"));
-    weak_f1 = weak_factory(f1).GetWeakPtr();
-
-    auto f =
-        WaitWithTimeout(__PRETTY_FUNCTION__ + std::string("Wait"),
-                        loop.dispatcher(), kPause, [](const auto&) {}, {f1});
-    f1->Complete();
-  }
-
-  EXPECT_FALSE(weak_f1);
-}
-
-TEST_F(FutureTest, WaitWithTimeoutReleasesFuturesOnTimeout) {
-  async::TestLoop loop;
-  fxl::WeakPtr<Future<>> weak_f1;
-
-  {
-    auto f1 = Future<>::Create(__PRETTY_FUNCTION__ + std::string("1"));
-    weak_f1 = weak_factory(f1).GetWeakPtr();
-
-    WaitWithTimeout(__PRETTY_FUNCTION__ + std::string("Wait"),
-                    loop.dispatcher(), {}, [](const auto&) {}, {f1});
-    loop.RunUntilIdle();
-  }
-
-  EXPECT_FALSE(weak_f1);
-}
-
-TEST_F(FutureTest,
-       WaitWithTimeoutCallsCallbackOnTimeoutEvenIfFuturesAreDestroyed) {
-  AsyncExpectations async_expectations;
-  async::TestLoop loop;
-
-  {
-    auto f1 = Future<>::Create(__PRETTY_FUNCTION__ + std::string("1"));
-    WaitWithTimeout(__PRETTY_FUNCTION__ + std::string("Wait"),
-                    loop.dispatcher(), {},
-                    [&](const auto&) { async_expectations.Signal(); }, {f1});
-  }
-
-  loop.RunUntilIdle();
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(
-    FutureTest,
-    WaitWithTimeoutReleasesReturnedFutureIfAllComponentFuturesHaveBeenCompletedOrDestroyed) {
-  async::TestLoop loop;
-  fxl::WeakPtr<Future<std::vector<int>>> weak_f;
-
-  auto f1 = Future<int>::Create(__PRETTY_FUNCTION__ + std::string("1"));
-  {
-    auto f2 = Future<int>::Create(__PRETTY_FUNCTION__ + std::string("2"));
-    weak_f =
-        weak_factory(WaitWithTimeout(__PRETTY_FUNCTION__ + std::string("Wait"),
-                                     loop.dispatcher(), kPause,
-                                     [](const auto&) {}, {f1, f2}))
-            .GetWeakPtr();
-  }
-
-  ASSERT_TRUE(weak_f);
-  weak_f->Then([&](std::vector<int>) { FAIL(); });
-  f1->Complete(42);
-  EXPECT_FALSE(weak_f);
-}
-
-TEST_F(FutureTest, WaitWithTimeoutReleasesReturnedFutureOnTimeout) {
-  async::TestLoop loop;
-  fxl::WeakPtr<Future<std::vector<int>>> weak_f;
-
-  {
-    auto f1 = Future<int>::Create(__PRETTY_FUNCTION__ + std::string("1"));
-    weak_f = weak_factory(WaitWithTimeout(
-                              __PRETTY_FUNCTION__ + std::string("Wait"),
-                              loop.dispatcher(), {}, [](const auto&) {}, {f1}))
-                 .GetWeakPtr();
-  }
-
-  loop.RunUntilIdle();
-  EXPECT_FALSE(weak_f);
-}
-
-TEST_F(FutureTest, Completer) {
-  auto f = Future<int>::Create(__PRETTY_FUNCTION__);
-
-  auto completer = f->Completer();
-  completer(5);
-
-  AsyncExpectations async_expectations;
-
-  f->Then([&](int i) {
-    EXPECT_EQ(i, 5);
-    async_expectations.Signal();
-  });
-
-  EXPECT_EQ(1, async_expectations.count());
-}
-
-TEST_F(FutureTest, AsyncMap) {
-  auto future =
-      Future<int>::Create(std::string(__PRETTY_FUNCTION__) + std::string("1"));
-
-  AsyncExpectations async_expectations;
-
-  future
-      ->AsyncMap([&](int i) {
-        EXPECT_EQ(i, 10);
-        async_expectations.Signal();
-
-        auto f = Future<std::string>::Create(std::string(__PRETTY_FUNCTION__) +
-                                             std::string("2"));
-        f->Complete(std::to_string(i * 2));
-        return f;
-      })
-      ->AsyncMap([&](std::string s) {
-        EXPECT_EQ(s, "20");
-        async_expectations.Signal();
-
-        auto f = Future<int>::Create(std::string(__PRETTY_FUNCTION__) +
-                                     std::string("3"));
-        f->Complete(std::stoi(s));
-        return f;
-      })
-      ->Then([&](int i) {
-        EXPECT_EQ(i, 20);
-        async_expectations.Signal();
-      });
-
-  future->Complete(10);
-
-  EXPECT_EQ(3, async_expectations.count());
-}
-
-TEST_F(FutureTest, Map) {
-  auto f = Future<int>::Create(__PRETTY_FUNCTION__);
-
-  AsyncExpectations async_expectations;
-
-  f->Map([&](int i) {
-     EXPECT_EQ(i, 10);
-     async_expectations.Signal();
-
-     return std::to_string(i * 2);
-   })
-      ->Map([&](std::string s) {
-        EXPECT_EQ(s, "20");
-        async_expectations.Signal();
-
-        return std::stoi(s);
-      })
-      ->Then([&](int i) {
-        EXPECT_EQ(i, 20);
-        async_expectations.Signal();
-      });
-
-  f->Complete(10);
-
-  EXPECT_EQ(3, async_expectations.count());
-}
-
-TEST_F(FutureTest, MapToTuple) {
-  float fresult;
-  std::string sresult;
-
-  auto f1 = Future<int>::Create(__PRETTY_FUNCTION__);
-  FuturePtr<float, std::string> f2 = f1->Map(
-      [](int i) { return std::make_tuple(i / 2.f, std::to_string(i)); });
-
-  f2->Then([&](float fvalue, const std::string& svalue) {
-    fresult = fvalue;
-    sresult = std::move(svalue);
-  });
-
-  f1->Complete(3);
-
-  EXPECT_EQ(1.5f, fresult);
-  EXPECT_EQ("3", sresult);
-}
-
-// compile-time test
-namespace MapToTupleTuple {
-FuturePtr<std::tuple<float, std::string>> f =
-    Future<int>::Create("MapToTupleTuple")->Map([](int i) {
-      return std::make_tuple(std::make_tuple(i / 2.f, std::to_string(i)));
-    });
-}
-
-TEST_F(FutureTest, trace_name) {
-  auto f = Future<>::Create("test");
-  EXPECT_EQ(f->trace_name(), "test");
-}
-
-TEST_F(FutureTest, ThenCallbackDestroysFuture) {
-  struct S {
-    FuturePtr<> f;
-  };
-  S* s = new S;
-
-  AsyncExpectations async_expectations;
-
-  s->f = Future<>::Create(__PRETTY_FUNCTION__);
-
-  // Explicitly retain the subfuture returned by Then() to keep it alive. This
-  // tests whether the original future will still complete its subfuture if the
-  // original future is destroyed, but the subfuture is still kept alive. (That
-  // should not happen, as per documentation for Then().)
-  auto subfuture = s->f->Then([&] {
-    delete s;
-    async_expectations.Signal();
-  });
-
-  subfuture->Then([&] {
-    // This lambda shouldn't be executed because s--and therefore s->f--was
-    // deleted in the Then() callback above.
-    async_expectations.Signal();
-  });
-
-  s->f->Complete();
-
-  EXPECT_EQ(1, async_expectations.count());  // not 2!
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/public/lib/async/cpp/operation.cc b/public/lib/async/cpp/operation.cc
deleted file mode 100644
index 7d636bd..0000000
--- a/public/lib/async/cpp/operation.cc
+++ /dev/null
@@ -1,256 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/async/cpp/operation.h>
-
-#include <utility>
-
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/fit/bridge.h>
-#include <lib/fit/defer.h>
-#include <lib/fxl/logging.h>
-#include <trace/event.h>
-
-namespace modular {
-
-constexpr char kModularTraceCategory[] = "modular";
-constexpr char kTraceIdKey[] = "id";
-constexpr char kTraceInfoKey[] = "info";
-
-OperationContainer::OperationContainer() = default;
-
-OperationContainer::~OperationContainer() = default;
-
-void OperationContainer::Add(OperationBase* const o) {
-  FXL_DCHECK(o != nullptr);
-  o->SetOwner(this);
-  Hold(o);  // Takes ownership.
-}
-
-void OperationContainer::Schedule(OperationBase* const o) { o->Schedule(); }
-
-void OperationContainer::InvalidateWeakPtrs(OperationBase* const o) {
-  o->InvalidateWeakPtrs();
-}
-
-OperationCollection::OperationCollection()
-    : executor_(async_get_default_dispatcher()), weak_ptr_factory_(this) {}
-
-OperationCollection::~OperationCollection() {
-  // We invalidate weakptrs to all Operation<>s first before destroying them, so
-  // that an outstanding FlowToken<> that gets destroyed in the process doesn't
-  // erroneously call Operation<>::Done.
-  for (auto& operation : operations_) {
-    FXL_DCHECK(operation.get() != nullptr);
-    InvalidateWeakPtrs(operation.get());
-  }
-}
-
-fxl::WeakPtr<OperationContainer> OperationCollection::GetWeakPtr() {
-  return weak_ptr_factory_.GetWeakPtr();
-}
-
-void OperationCollection::Hold(OperationBase* const o) {
-  operations_.emplace_back(o);
-  Schedule(o);
-}
-
-void OperationCollection::Drop(OperationBase* const o) {
-  auto it = std::find_if(
-      operations_.begin(), operations_.end(),
-      [o](const std::unique_ptr<OperationBase>& p) { return p.get() == o; });
-  FXL_DCHECK(it != operations_.end());
-
-  // Ensures we erase the operation off our container first.
-  // By keeping a reference to the operation its destructor is only triggered
-  // after the scope of this method. Otherwise, we would trigger the
-  // operation's destructor first before we actually removed the operation from
-  // the container. To prevent reentry in case, an operation might have a
-  // member variable to someone who has the parent container containing our
-  // operation.
-  //
-  // Example:
-  // operations.erase(operation) calls operation's destructor ~KillModuleCall()
-  //   ~KillModuleCall() [has member variable FlowToken of OnModuleUpdatedCall]
-  //    ~OnModuleUpdatedCall() [holding container containing KillModuleCall]
-  //      ~OperationQueue() [triggered by ~OnModuleUpdatedCall()]
-  //      [ERROR KillModuleCall in operation_ is nullptr at this point]
-  // operations_.erase() actually erases the operation from the container
-  //
-  // See operation_unittest.cc for testcase. TestCollectionNotNullPtr
-  std::unique_ptr<OperationBase> operation = std::move(*it);
-  FXL_DCHECK(it->get() == nullptr);
-  FXL_DCHECK(operation.get() == o);
-  InvalidateWeakPtrs(operation.get());
-  operations_.erase(it);
-}
-
-void OperationCollection::Cont() {
-  // no-op for operation collection.
-}
-
-void OperationCollection::ScheduleTask(fit::pending_task task) {
-  executor_.schedule_task(std::move(task));
-}
-
-OperationQueue::OperationQueue()
-    : executor_(async_get_default_dispatcher()), weak_ptr_factory_(this) {}
-
-OperationQueue::~OperationQueue() {
-  // We invalidate weakptrs to all Operation<>s first before destroying them, so
-  // that an outstanding FlowToken<> that gets destroyed in the process doesn't
-  // erroneously call Operation<>::Done.
-  while (!operations_.empty()) {
-    FXL_DCHECK(operations_.front().get() != nullptr);
-    InvalidateWeakPtrs(operations_.front().get());
-    operations_.pop();
-  }
-}
-
-fxl::WeakPtr<OperationContainer> OperationQueue::GetWeakPtr() {
-  return weak_ptr_factory_.GetWeakPtr();
-}
-
-void OperationQueue::Hold(OperationBase* const o) {
-  operations_.emplace(o);
-  if (idle_) {
-    FXL_DCHECK(operations_.size() == 1);
-    idle_ = false;
-    Schedule(o);
-  }
-}
-
-void OperationQueue::Drop(OperationBase* const o) {
-  FXL_DCHECK(!operations_.empty());
-  FXL_DCHECK(operations_.front().get() == o);
-
-  // See comment in OperationCollection::Drop() for why this move is important.
-  std::unique_ptr<OperationBase> operation = std::move(operations_.front());
-  FXL_DCHECK(operations_.front().get() == nullptr);
-  FXL_DCHECK(operation.get() == o);
-  InvalidateWeakPtrs(operation.get());
-  operations_.pop();
-}
-
-void OperationQueue::Cont() {
-  if (!operations_.empty()) {
-    auto o = operations_.front().get();
-    Schedule(o);
-  } else {
-    idle_ = true;
-  }
-}
-
-namespace {
-class PromiseWrapperCall : public Operation<> {
- public:
-  PromiseWrapperCall(fit::completer<> completer)
-      : Operation("PromiseDoneCall", [] {}), completer_(std::move(completer)) {}
-
-  void Run() {
-    running_ = true;
-    completer_.complete_ok();
-  }
-
-  void SayDone() {
-    FXL_CHECK(running_);
-    Done();
-  }
-
- private:
-  fit::completer<> completer_;
-  bool running_{false};
-};
-}  // namespace
-
-void OperationQueue::ScheduleTask(fit::pending_task task) {
-  // We need to block the execution of this task on tasks in |operations_|, and
-  // then also block further execution of |operations_| on this task finishing.
-  // We do this by "wrapping" the promise in a PromiseWrapperCall.
-  //
-  // |start| will be completed when |wrapper->Run()| is called, and |wrapper|
-  // will be finished as a result of the promise finishing: we call
-  // |wrapper->SayDone()| when |task| is destroyed. It is destroyed when either
-  // a) it is abandoned or b) it is completed successfully or with an error. In
-  // either case we want to unblock the next operation in the queue.
-  fit::bridge start;
-  auto wrapper = new PromiseWrapperCall(std::move(start.completer));
-  executor_.schedule_task(start.consumer.promise().then(
-      [p = task.take_promise(), wrapper](fit::result<>&) mutable {
-        // It is safe to call SayDone() on |wrapper| because we know that
-        // |wrapper| will be alive so long as this promise is being executed.
-        //
-        // We use a fit::defer on the capture list of .then() so that if |p| is
-        // abandoned, we still unblock the queue.
-        return p.then([defer = fit::defer([wrapper] { wrapper->SayDone(); })](
-                          fit::result<>&) {});
-      }));
-
-  Add(wrapper);
-}
-
-OperationBase::OperationBase(const char* const trace_name,
-                             std::string trace_info)
-    // While we transition all operations to be explicitly added to containers
-    // with OperationContainer::Add(), some |c|'s are going to be null.
-    : weak_ptr_factory_(this),
-      trace_name_(trace_name),
-      trace_id_(TRACE_NONCE()),
-      trace_info_(std::move(trace_info)) {}
-
-OperationBase::~OperationBase() = default;
-
-fxl::WeakPtr<OperationBase> OperationBase::GetWeakPtr() {
-  return weak_ptr_factory_.GetWeakPtr();
-}
-
-void OperationBase::SetOwner(OperationContainer* c) {
-  FXL_DCHECK(!container_);
-  container_ = c->GetWeakPtr();
-}
-
-void OperationBase::Schedule() {
-  TraceAsyncBegin();
-
-  async::PostTask(async_get_default_dispatcher(),
-                  [this, weak = weak_ptr_factory_.GetWeakPtr()] {
-                    if (weak) {
-                      Run();
-                    }
-                  });
-}
-
-void OperationBase::InvalidateWeakPtrs() {
-  weak_ptr_factory_.InvalidateWeakPtrs();
-}
-
-void OperationBase::TraceAsyncBegin() {
-  TRACE_ASYNC_BEGIN(kModularTraceCategory, trace_name_, trace_id_, kTraceIdKey,
-                    trace_id_, kTraceInfoKey, trace_info_);
-}
-
-void OperationBase::TraceAsyncEnd() {
-  TRACE_ASYNC_END(kModularTraceCategory, trace_name_, trace_id_, kTraceIdKey,
-                  trace_id_, kTraceInfoKey, trace_info_);
-}
-
-OperationBase::FlowTokenBase::FlowTokenBase(OperationBase* const op)
-    : refcount_(new int), weak_op_(op->weak_ptr_factory_.GetWeakPtr()) {
-  *refcount_ = 1;
-}
-
-OperationBase::FlowTokenBase::FlowTokenBase(const FlowTokenBase& other)
-    : refcount_(other.refcount_), weak_op_(other.weak_op_) {
-  ++*refcount_;
-}
-
-OperationBase::FlowTokenBase::~FlowTokenBase() {
-  --*refcount_;
-  if (*refcount_ == 0) {
-    delete refcount_;
-  }
-}
-
-}  // namespace modular
diff --git a/public/lib/async/cpp/operation.h b/public/lib/async/cpp/operation.h
deleted file mode 100644
index 0898e0d..0000000
--- a/public/lib/async/cpp/operation.h
+++ /dev/null
@@ -1,556 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_ASYNC_CPP_OPERATION_H_
-#define LIB_ASYNC_CPP_OPERATION_H_
-
-#include <functional>
-#include <memory>
-#include <queue>
-#include <tuple>
-#include <utility>
-#include <vector>
-
-#include <lib/async/cpp/future.h>
-#include <lib/async_promise/executor.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <lib/fit/promise.h>
-
-namespace modular {
-class OperationBase;
-
-// An abstract base class which provides methods to hold on to Operation
-// instances until they declare themselves to be Done(). Ownership of
-// the operations must be managed by implementations.
-class OperationContainer {
- public:
-  OperationContainer();
-  virtual ~OperationContainer();
-
-  // Adds |o| to this container and takes ownership.
-  virtual void Add(OperationBase* o) final;
-
-  // Adds |task| to be scheduled on |this|. This mirrors
-  // the interface in fit::executor, and is here only during
-  // a transition from Operations to fit::promises.
-  virtual void ScheduleTask(fit::pending_task task) = 0;
-
- protected:
-  void Schedule(OperationBase* o);
-  void InvalidateWeakPtrs(OperationBase* o);
-
- private:
-  // OperationBase calls the methods below.
-  friend class OperationBase;
-
-  virtual fxl::WeakPtr<OperationContainer> GetWeakPtr() = 0;
-  // Must take ownership of |o|.
-  virtual void Hold(OperationBase* o) = 0;
-  // Must clean up memory for |o|.
-  virtual void Drop(OperationBase* o) = 0;
-  virtual void Cont() = 0;
-};
-
-// An implementation of |OperationContainer| which runs every instance of
-// Operation as soon as it arrives.
-class OperationCollection : public OperationContainer {
- public:
-  OperationCollection();
-  ~OperationCollection() override;
-
-  void ScheduleTask(fit::pending_task task) override;
-
- private:
-  fxl::WeakPtr<OperationContainer> GetWeakPtr() override;
-  void Hold(OperationBase* o) override;
-  void Drop(OperationBase* o) override;
-  void Cont() override;
-
-  async::Executor executor_;
-  std::vector<std::unique_ptr<OperationBase>> operations_;
-
-  // It is essential that the weak_ptr_factory is defined after the operations_
-  // container, so that it gets destroyed before operations_, and hence before
-  // the Operation instances in it, so that the Done() call on their
-  // OperationBase sees the container weak pointer to be null. That's also why
-  // we need the virtual GetWeakPtr() in the base class, rather than to put the
-  // weak ptr factory in the base class.
-  fxl::WeakPtrFactory<OperationContainer> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(OperationCollection);
-};
-
-// An implementation of |OperationContainer| which runs incoming Operations
-// sequentially. This ensures that there are no partially complete operations
-// when a new operation starts.
-class OperationQueue : public OperationContainer {
- public:
-  OperationQueue();
-  ~OperationQueue() override;
-
-  void ScheduleTask(fit::pending_task task) override;
-
- private:
-  fxl::WeakPtr<OperationContainer> GetWeakPtr() override;
-  void Hold(OperationBase* o) override;
-  void Drop(OperationBase* o) override;
-  void Cont() override;
-
-  // Are there any operations running? An operation is considered running once
-  // its |Run()| has been invoked, up until result callback has finished. Note
-  // that an operation could be running while it is not present in
-  // |operations_|: its result callback could be executing.
-  bool idle_ = true;
-
-  async::Executor executor_;
-  std::queue<std::unique_ptr<OperationBase>> operations_;
-
-  // It is essential that the weak_ptr_factory is defined after the operations_
-  // container, so that it gets destroyed before operations_, and hence before
-  // the Operation instances in it, so that the Done() call on their
-  // OperationBase sees the container weak pointer to be null. That's also why
-  // we need the virtual GetWeakPtr() in the base class, rather than to put the
-  // weak ptr factory in the base class.
-  fxl::WeakPtrFactory<OperationContainer> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(OperationQueue);
-};
-
-// Something that can be put in an OperationContainer until it calls Done() on
-// itself. Used to implement asynchronous operations that need to hold on to
-// handles until the operation asynchronously completes and returns a value.
-//
-// Held by a unique_ptr<> in the OperationContainer, so instances of derived
-// classes need to be created with new.
-//
-// Advantages of using an Operation instance to implement asynchronous fidl
-// method invocations:
-//
-//  1. To receive the return callback, the interface pointer on which the method
-//     is invoked needs to be kept around. It's tricky to place a move-only
-//     interface pointer on the capture list of a lambda passed as argument to
-//     its own method. An instance is much simpler.
-//
-//  2. The capture list of the callbacks only holds this, everything else that
-//     needs to be passed on is in the instance.
-//
-//  3. Completion callbacks don't need to be made copyable and don't need to be
-//     mutable, because no move only pointer is pulled from their capture list.
-//
-//  4. Conversion of Handle to Ptr can be done by Bind() because the Ptr is
-//     already there.
-//
-// Use of Operation instances must adhere to invariants:
-//
-// * Deleting the operation container deletes all Operation instances in it, and
-//   it must be guaranteed that no callbacks of ongoing method invocations are
-//   invoked after the Operation instance they access is deleted. In order to
-//   accomplish this, an Operation instance must only invoke methods on fidl
-//   pointers that are either owned by the Operation instance, or that are owned
-//   by the immediate owner of the operation container. This way, when the
-//   operation container is deleted, the destructors of all involved fidl
-//   pointers are called, close their channels, and cancel all pending method
-//   callbacks. If a method is invoked on a fidl pointer that lives on beyond
-//   the lifetime of the operation container, this is not guaranteed.
-class OperationBase {
- public:
-  virtual ~OperationBase();
-
-  // Derived classes implement this method. It is called by the container of
-  // this Operation when it is ready. At some point after Run() is invoked,
-  // |Done()| must be called to signal completion of this operation. This
-  // usually happens implicitly from the destructor of a FlowToken that is
-  // passed along the asynchronous flow of control of the Operation.
-  virtual void Run() = 0;
-
-  // Needed to guard callbacks to methods on FIDL pointers that are not owned by
-  // this Operation instance.
-  //
-  // Callbacks on methods on FIDL pointers that are owned by Operation instance
-  // are never invoked after the Operation instance is deleted, because they are
-  // cancelled by the destructor of the FIDL pointer. However, if the FIDL
-  // pointer is owned outside of the Operation instance, such a callback may be
-  // invoked after the Operation instance was destroyed, if the FIDL pointer
-  // lives longer.
-  fxl::WeakPtr<OperationBase> GetWeakPtr();
-
- protected:
-  // |trace_name| and |trace_info| are used to annotate performance traces.
-  // |trace_name| must outlive *this.
-  OperationBase(const char* trace_name, std::string trace_info);
-
-  // Useful in log messages.
-  const char* trace_name() const { return trace_name_; }
-
-  class FlowTokenBase;
-
- private:
-  // OperationContainer calls SetOwner(), InvalidateWeakPtrs() and Schedule().
-  friend class OperationContainer;
-
-  // Called only by OperationContainer::Add().
-  void SetOwner(OperationContainer* c);
-
-  // Called only by OperationContainer.
-  void Schedule();
-
-  // Called only by OperationContainer.
-  void InvalidateWeakPtrs();
-
-  // Operation<..> class DispatchCallback() and accesses trace info fields
-  // below.
-  template <typename... Args>
-  friend class Operation;
-
-  // Called only by Operation<...>.
-  template <typename... Args,
-            typename ResultCall = std::function<void(Args...)>>
-  void DispatchCallback(ResultCall result_call, Args... result_args) {
-    // Move |container| pointer out of this, because |this| gets deleted before
-    // we stop using |container|.
-    auto container = std::move(container_);
-    if (container) {
-      // Deletes |this|.
-      container->Drop(this);
-
-      // Can no longer refer to |this|.
-      result_call(std::move(result_args)...);
-
-      // The result callback may cause the container to be deleted, so we must
-      // check it still exists before telling it to continue.
-      if (container) {
-        container->Cont();
-      }
-    }
-  }
-
-  // Traces the duration of the Operation excution. Begin() is called from
-  // Schedule(), End() is called from Done().
-  void TraceAsyncBegin();
-  void TraceAsyncEnd();
-
-  fxl::WeakPtr<OperationContainer> container_;
-
-  // Used by FlowTokenBase to suppress Done() calls after the Operation instance
-  // is deleted. The OperationContainer will invalidate all weak pointers to
-  // this instance before the destructor is invoked, so it's not necessary that
-  // this field is last.
-  fxl::WeakPtrFactory<OperationBase> weak_ptr_factory_;
-
-  // Name used to label traces for this operation.
-  const char* const trace_name_;
-
-  // Unique identifier used to correlate trace events for this operation.
-  const uint64_t trace_id_;
-
-  // Additional information added to trace events for this operation.
-  const std::string trace_info_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(OperationBase);
-};
-
-template <typename... Args>
-class Operation : public OperationBase {
- public:
-  ~Operation() override = default;
-
-  using ResultCall = std::function<void(Args...)>;
-
- protected:
-  Operation(const char* const trace_name, ResultCall result_call,
-            const std::string& trace_info = "")
-      : OperationBase(trace_name, trace_info),
-        result_call_(std::move(result_call)) {}
-
-  // Derived classes call this when they are prepared to be removed from the
-  // container. Must be the last thing this instance does, as it results in
-  // destructor invocation.
-  void Done(Args... result_args) {
-    TraceAsyncEnd();
-    DispatchCallback(std::move(result_call_), std::move(result_args)...);
-  }
-
-  class FlowToken;
-  class FlowTokenHolder;
-
- private:
-  ResultCall result_call_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(Operation);
-};
-
-// The instance of FlowToken at which the refcount reaches zero in the
-// destructor calls Done() on the Operation it holds a reference of.
-//
-// It is an inner class of Operation so that it has access to Done(), which is
-// protected.
-//
-// Why this is ref counted, not moved:
-//
-// 1. Some flows of control branch into multiple parallel branches, and then its
-//    subtle to figure out which one to move it along.
-//
-// 2. To move something onto a capture list is more verbose than to just copy
-//    it, so it would defeat the purpose of being simpler to write than the
-//    status quo.
-//
-// 3. A lambda with something that is moveonly on its capture list is not
-//    copyable anymore, and one of the points of Operation was to only have
-//    copyable continuations.
-//
-// NOTE: You cannot mix flow tokens and explicit Done() calls. Once an Operation
-// uses a flow token, this is how Done() is called, and calling Done()
-// explicitly would call it twice.
-//
-// The parts that are not dependent on the template parameter are factored off
-// into a base class as usual.
-class OperationBase::FlowTokenBase {
- public:
-  explicit FlowTokenBase(OperationBase* op);
-  FlowTokenBase(const FlowTokenBase& other);
-  ~FlowTokenBase();
-
- protected:
-  int refcount() const { return *refcount_; }
-  bool weak_op() const { return weak_op_.get() != nullptr; }
-
- private:
-  int* const refcount_;  // shared between copies of FlowToken.
-  fxl::WeakPtr<OperationBase> weak_op_;
-};
-
-template <typename... Args>
-class Operation<Args...>::FlowToken : OperationBase::FlowTokenBase {
- public:
-  explicit FlowToken(Operation<Args...>* const op, Args* const... result)
-      : FlowTokenBase(op), op_(op), result_(result...) {}
-
-  FlowToken(const FlowToken& other)
-      : FlowTokenBase(other), op_(other.op_), result_(other.result_) {}
-
-  ~FlowToken() {
-    // If refcount is 1 here, it will become 0 in ~FlowTokenBase.
-    if (refcount() == 1 && weak_op()) {
-      apply(std::make_index_sequence<
-            std::tuple_size<decltype(result_)>::value>{});
-    }
-  }
-
- private:
-  // This usage is based on the implementation of std::apply(), which is only
-  // available in C++17: http://en.cppreference.com/w/cpp/utility/apply
-  template <size_t... I>
-  void apply(std::integer_sequence<size_t, I...> /*unused*/) {
-    op_->Done(std::move((*std::get<I>(result_)))...);
-  }
-
-  Operation<Args...>* const op_;  // not owned
-
-  // The pointers that FlowToken() is constructed with are stored in this
-  // std::tuple. They are then extracted and std::move()'d in the |apply()|
-  // method.
-  std::tuple<Args* const...> result_;  // the values are not owned
-};
-
-// Sometimes the asynchronous flow of control that is represented by a FlowToken
-// branches, but is actually continued on exactly one branch. For example, when
-// a method is called on an external fidl service, and the callback from that
-// method is also scheduled as a timeout to avoid blocking the operation queue
-// in case the external service misbehaves and doesn't respond.
-//
-// In that situation, it would be wrong to place two copies of the flow token on
-// the capture list of both callbacks, because then the flow would only be
-// Done() once both callbacks are destroyed. In the case where the second
-// callback is a timeout, this might be really late.
-//
-// Instead, a single copy of the flow token is placed in a shared container, a
-// reference to which is placed on the capture list of both callbacks. The first
-// callback that is invoked removes the flow token from the shared container and
-// propagates it from there.
-//
-// That way, the flow token in the shared container also acts as call-once flag.
-//
-// The flow token holder is a simple wrapper of a shared ptr to a unique ptr. We
-// define it because such a nested smart pointer is rather unwieldy to write
-// every time.
-//
-// Example use:
-//
-//   FlowTokenHolder branch{flow};
-//
-//   auto kill_agent = [this, branch] {
-//     std::unique_ptr<FlowToken> flow = branch.Continue();
-//     if (!flow) {
-//       return;
-//     }
-//
-//     stopped_ = true;
-//   };
-//
-//   StopAgent(kill_agent);
-//   SetTimeout(kill_agent, 1);
-//
-template <typename... Args>
-class Operation<Args...>::FlowTokenHolder {
- public:
-  using FlowToken = Operation<Args...>::FlowToken;
-
-  explicit FlowTokenHolder(const FlowToken& flow)
-      : ptr_(std::make_shared<std::unique_ptr<FlowToken>>(
-            std::make_unique<FlowToken>(flow))) {}
-
-  FlowTokenHolder(const FlowTokenHolder& other) : ptr_(other.ptr_) {}
-
-  // Calling this method again on any copy of the same FlowTokenHolder yields a
-  // nullptr. Clients can check for that to enforce call once semantics.
-  //
-  // The method is const because it only mutates the pointed to object. It's
-  // useful to exploit this loophole because this way lambdas that have a
-  // FlowTokenHolder on their capture list don't need to be mutable.
-  std::unique_ptr<FlowToken> Continue() const { return std::move(*ptr_); }
-
- private:
-  std::shared_ptr<std::unique_ptr<FlowToken>> ptr_;
-};
-
-// Following is a list of commonly used operations.
-
-// An operation which wraps a Future<>. See WrapFutureAsOperation() below.
-template <typename... Args>
-class FutureOperation : public Operation<Args...> {
- public:
-  using ResultCall = std::function<void(Args...)>;
-
-  FutureOperation(const char* trace_name, FuturePtr<> on_run,
-                  FuturePtr<Args...> done, ResultCall result_call)
-      : Operation<Args...>(trace_name, std::move(result_call)),
-        on_run_(on_run),
-        done_(done) {}
-
- private:
-  // |OperationBase|
-  void Run() override {
-    // FuturePtr is a shared ptr, so the Then() callback is not necessarily
-    // cancelled by the destructor of this Operation instance. Hence the
-    // callback must be protected against invocation after delete of this.
-    done_->WeakThen(this->GetWeakPtr(), [this](Args&&... args) {
-      this->Done(std::forward<Args>(args)...);
-      // Can no longer refer to |this|.
-    });
-    on_run_->Complete();
-  }
-
-  FuturePtr<> on_run_;
-  FuturePtr<Args...> done_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FutureOperation);
-};
-
-// EXPERIMENTAL
-//
-// This is useful to glue a FIDL call that expects its result as a callback with
-// a Future<>, but have the business logic of the Future<> run on an
-// OperationContainer.
-//
-// Usage:
-//
-// void MyFidlCall(args..., MyFidlCallResult result_call) {
-//   auto on_run = Future<>::Create();
-//   auto done = on_run->Map(...)->Then(...);
-//   operation_container_.Add(WrapFutureAsOperation(
-//       "MyFidlCall", on_run, done, result_call));
-// }
-//
-template <typename... ResultArgs, typename... FutureArgs>
-OperationBase* WrapFutureAsOperation(
-    const char* const trace_name, FuturePtr<> on_run,
-    FuturePtr<FutureArgs...> done,
-    std::function<void(ResultArgs...)> result_call) {
-  return new FutureOperation<ResultArgs...>(
-      trace_name, std::move(on_run), std::move(done), std::move(result_call));
-}
-
-template <typename... Args>
-class FutureOperation2 : public Operation<Args...> {
- public:
-  using ResultCall = std::function<void(Args...)>;
-  using RunOpCall = std::function<FuturePtr<Args...>(OperationBase*)>;
-
-  FutureOperation2(const char* const trace_name, RunOpCall run_op,
-                   ResultCall done)
-      : Operation<Args...>(trace_name, std::move(done)), run_op_(run_op) {}
-
- private:
-  // |OperationBase|
-  void Run() override {
-    // FuturePtr is a shared ptr, so the Then() callback is not necessarily
-    // cancelled by the destructor of this Operation instance. Hence the
-    // callback must be protected against invocation after delete of this.
-    run_op_(this)->WeakThen(this->GetWeakPtr(), [this](Args&&... args) {
-      this->Done(std::forward<Args>(args)...);
-    });
-  }
-
-  RunOpCall run_op_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FutureOperation2);
-};
-
-// EXPERIMENTAL
-//
-// Glue code to define operations where the body of the operation is defined
-// inline to where the operation instance is created. It is an alternative to
-// WrapFutureAsOperation.
-//
-// The body of the operation is defined as a callback, and is expected to return
-// a Future<> that is completed when the operation is finished. If the Future<>
-// is completed with values, those values are used as the result of the
-// Operation.
-//
-// Usage:
-//
-// void MyFidlCall(args..., MyFidlCallResult result_call) {
-//   operation_container.Add(NewCallbackOperation(
-//      "MyFidlService::MyFidlCall",
-//      [this] (OperationBase* op) {
-//        // Use |op->GetWeakPtr()| to guard any async calls.
-//        auto f = Future<>::Create();
-//
-//        DoSomethingAsync(f->Completer());
-//
-//        f->WeakMap(op->GetWeakPtr(), [] (int do_something_result) {
-//          return do_something_result * 2;
-//        });
-//
-//        return f;
-//      },
-//      result_call);
-// }
-template <typename... ResultArgs>
-OperationBase* NewCallbackOperation(
-    const char* const trace_name,
-    typename FutureOperation2<ResultArgs...>::RunOpCall run,
-    typename FutureOperation2<ResultArgs...>::ResultCall done) {
-  return new FutureOperation2<ResultArgs...>(trace_name, std::move(run),
-                                             std::move(done));
-}
-
-// An operation which immediately calls its result callback. This is useful for
-// making sure that all operations that run before this have completed.
-class SyncCall : public Operation<> {
- public:
-  SyncCall(ResultCall result_call)
-      : Operation("SyncCall", std::move(result_call)) {}
-
-  void Run() override { Done(); }
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(SyncCall);
-};
-
-}  // namespace modular
-
-#endif  // LIB_ASYNC_CPP_OPERATION_H_
diff --git a/public/lib/async/cpp/operation_unittest.cc b/public/lib/async/cpp/operation_unittest.cc
deleted file mode 100644
index 16d7d05..0000000
--- a/public/lib/async/cpp/operation_unittest.cc
+++ /dev/null
@@ -1,508 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/async/cpp/operation.h>
-
-#include <lib/async/cpp/future.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <lib/gtest/test_loop_fixture.h>
-
-#include "gtest/gtest.h"
-
-namespace modular {
-namespace {
-
-class TestContainer : public OperationContainer {
- public:
-  TestContainer() : weak_ptr_factory_(this) {}
-
-  fxl::WeakPtr<OperationContainer> GetWeakPtr() override {
-    return weak_ptr_factory_.GetWeakPtr();
-  }
-
-  int hold_count{0};
-  int drop_count{0};
-  int cont_count{0};
-  OperationBase* last_held = nullptr;
-  OperationBase* last_dropped = nullptr;
-
-  void Hold(OperationBase* o) override {
-    ++hold_count;
-    last_held = o;
-  }
-
-  void Drop(OperationBase* o) override {
-    ++drop_count;
-    last_dropped = o;
-  }
-
-  void Cont() override { ++cont_count; }
-
-  void ScheduleTask(fit::pending_task task) override {}
-
-  void PretendToDie() { weak_ptr_factory_.InvalidateWeakPtrs(); }
-
-  using OperationContainer::InvalidateWeakPtrs;  // Promote for testing.
-  using OperationContainer::Schedule;            // Promote for testing.
-
- private:
-  fxl::WeakPtrFactory<OperationContainer> weak_ptr_factory_;
-};
-
-template <typename... Args>
-class TestOperation : public Operation<Args...> {
- public:
-  using ResultCall = std::function<void(Args...)>;
-  TestOperation(std::function<void()> task, ResultCall done)
-      : Operation<Args...>("Test Operation", std::move(done)), task_(task) {}
-
-  void SayDone(Args... args) { this->Done(args...); }
-
- private:
-  void Run() override { task_(); }
-
-  std::function<void()> task_;
-};
-
-class OperationTest : public gtest::TestLoopFixture {};
-
-// Test the lifecycle of a single Operation:
-// 1) Creating a new operation and adding it to a container
-//    causes it to be scheduled (posted to the async task queue).
-// 2) When the operation states it is done, the container is told
-//    to schedule the next task after the result callback is called.
-TEST_F(OperationTest, Lifecycle) {
-  TestContainer container;
-  bool op_ran = false;
-  bool op_done = false;
-  auto op =
-      std::make_unique<TestOperation<>>([&op_ran] { op_ran = true; },
-                                        [&op_done, &container] {
-                                          op_done = true;
-
-                                          // When our op is done, we
-                                          // expect that the
-                                          // OperationContainer that owns
-                                          // it has already been told to
-                                          // drop it, but we do not expect
-                                          // Cont() to have been called.
-                                          // That happens after the done
-                                          // callback is executed.
-                                          EXPECT_EQ(1, container.drop_count);
-                                          EXPECT_EQ(0, container.cont_count);
-                                        });
-
-  // Add() calls Hold() on our OperationContainer implementation. Hold() is
-  // supposed to manage the memory. Ours doesn't.
-  // The task doesn't run until OperationContainer::Schedule is called with the
-  // operation.
-  // TODO(thatguy): TestContainer does not manage memory yet, so passing a
-  // naked pointer backed by a unique_ptr<> is safe.
-  container.Add(op.get());
-  EXPECT_EQ(1, container.hold_count);
-  EXPECT_EQ(op.get(), container.last_held);
-  EXPECT_EQ(0, container.drop_count);
-  EXPECT_EQ(0, container.cont_count);
-  EXPECT_FALSE(op_ran);
-  EXPECT_FALSE(op_done);
-
-  // Add() does not enqueue the operation to be run, at least not in our
-  // implementation of OperationContainer.
-  RunLoopUntilIdle();
-  EXPECT_FALSE(op_ran);
-  EXPECT_FALSE(op_done);
-  EXPECT_EQ(1, container.hold_count);
-  EXPECT_EQ(0, container.drop_count);
-  EXPECT_EQ(0, container.cont_count);
-
-  // OperationContainer impls opt to call Schedule() when they are ready to
-  // have an operation enqueued.
-  container.Schedule(op.get());
-
-  // So when we advance the async loop, we should see that it started running.
-  RunLoopUntilIdle();
-  EXPECT_TRUE(op_ran);
-  EXPECT_FALSE(op_done);
-  EXPECT_EQ(1, container.hold_count);
-  EXPECT_EQ(0, container.drop_count);
-  EXPECT_EQ(0, container.cont_count);
-
-  // When the operation reports being done, we expect it to be dropped, our
-  // done callback run, and the OperationContainer told to continue. These
-  // happen in order. The order is verified in our done callback.
-  op->SayDone();
-  EXPECT_TRUE(op_ran);
-  EXPECT_TRUE(op_done);
-  EXPECT_EQ(1, container.hold_count);
-  EXPECT_EQ(1, container.drop_count);
-  EXPECT_EQ(op.get(), container.last_dropped);
-  EXPECT_EQ(1, container.cont_count);
-}
-
-TEST_F(OperationTest, Lifecycle_ContainerGoesAway) {
-  // In this test, we make the Operation think that its container's memory has
-  // been cleaned up in its done callback. This manifests itself as the
-  // Operation not invoking Cont() on the container.
-  TestContainer container;
-  bool op_ran = false;
-  auto op = std::make_unique<TestOperation<>>(
-      [&op_ran]() { op_ran = true; },
-      [&container]() { container.PretendToDie(); });
-
-  container.Add(op.get());
-  container.Schedule(op.get());
-  RunLoopUntilIdle();
-
-  // When the operation reports being done, we expect it to be dropped, our
-  // done callback run, and the OperationContainer told to continue. These
-  // happen in order. The order is verified in our done callback.
-  op->SayDone();
-  EXPECT_TRUE(op_ran);
-  EXPECT_EQ(1, container.hold_count);
-  EXPECT_EQ(1, container.drop_count);
-  EXPECT_EQ(op.get(), container.last_dropped);
-  EXPECT_EQ(0, container.cont_count);
-}
-
-TEST_F(OperationTest, ResultsAreReceived) {
-  // Show that when an operation calls Done(), its arguments are
-  // passed to the done callback.
-  TestContainer container;
-
-  auto op = std::make_unique<TestOperation<int>>(
-      [] {}, [](int result) { EXPECT_EQ(42, result); });
-
-  container.Add(op.get());
-  container.Schedule(op.get());
-  RunLoopUntilIdle();
-  op->SayDone(42);
-}
-
-class TestFlowTokenOperation : public Operation<int> {
- public:
-  TestFlowTokenOperation(ResultCall done)
-      : Operation("Test FlowToken Operation", std::move(done)) {}
-
-  // |call_before_flow_dies| is invoked before the FlowToken goes out of scope.
-  void SayDone(
-      int result, std::function<void()> call_before_flow_dies = [] {}) {
-    // When |flow| goes out of scope, it will call Done() for us.
-    FlowToken flow{this, &result_};
-
-    // Post the continuation of the operation to an async loop so that we
-    // exercise the refcounting of FlowTokens.
-    async::PostTask(async_get_default_dispatcher(),
-                    [this, flow, result, call_before_flow_dies] {
-                      result_ = result;
-                      call_before_flow_dies();
-                    });
-  }
-
- private:
-  void Run() override {}
-
-  int result_;
-};
-
-TEST_F(OperationTest, Lifecycle_FlowToken) {
-  // FlowTokens simply call Done() for you with whatever results you've pointed
-  // it at. NOTE(thatguy): I haven't figured out a good way of testing the
-  // refcount goodness of FlowTokens. That said, everything else in the world
-  // will crash if they fail.
-  TestContainer container;
-
-  bool done_called{false};
-  int result{0};
-  auto op =
-      std::make_unique<TestFlowTokenOperation>([&result, &done_called](int r) {
-        done_called = true;
-        result = r;
-      });
-
-  container.Add(op.get());
-  container.Schedule(op.get());
-  RunLoopUntilIdle();
-  op->SayDone(42);
-  // TestFlowTokenOperation posts to the async loop in SayDone(). We shouldn't
-  // see Done() called until we run the loop and the FlowToken on the capture
-  // list of the callback goes out of scope.
-  EXPECT_FALSE(done_called);
-  RunLoopUntilIdle();
-  EXPECT_EQ(42, result);
-}
-
-TEST_F(OperationTest, Lifecycle_FlowToken_OperationGoesAway) {
-  // Similar to Lifecycle_FlowToken, but FlowTokens have the behavior that if
-  // their "owning" operation dies before they go out of scope (because, ie,
-  // some callback is sitting in someone else's memory longer than the
-  // operation lives), they don't call Done() on that operation.
-  TestContainer container;
-
-  bool done_called = false;
-  auto op = std::make_unique<TestFlowTokenOperation>(
-      [&done_called](int result) { done_called = true; });
-
-  container.Add(op.get());
-  container.Schedule(op.get());
-  RunLoopUntilIdle();
-  op->SayDone(42,
-              [&container, &op]() { container.InvalidateWeakPtrs(op.get()); });
-  RunLoopUntilIdle();
-  EXPECT_FALSE(done_called);
-}
-
-TEST_F(OperationTest, OperationQueue) {
-  // Here we test a specific implementation of OperationContainer
-  // (OperationQueue), which should only allow one operation to "run" at a
-  // given time.
-  OperationQueue container;
-
-  // OperationQueue, unlike TestContainer, does own the Operations.
-  bool op1_ran = false;
-  bool op1_done = false;
-  auto* op1 = new TestOperation<>([&op1_ran]() { op1_ran = true; },
-                                  [&op1_done]() { op1_done = true; });
-
-  bool op3_ran = false;
-  bool op3_done = false;
-  auto* op3 = new TestOperation<>([&op3_ran]() { op3_ran = true; },
-                                  [&op3_done]() { op3_done = true; });
-
-  // We'll queue |op1|, then a fit::promise ("op2") and another Operation,
-  // |op3|.
-  container.Add(op1);
-
-  bool op2_ran = false;
-  bool op2_done = false;
-  fit::suspended_task suspended_op2;
-  container.ScheduleTask(
-      fit::make_promise([&](fit::context& c) -> fit::result<> {
-        if (op2_ran == true) {
-          op2_done = true;
-          return fit::ok();
-        }
-        op2_ran = true;
-        suspended_op2 = c.suspend_task();
-        return fit::pending();
-      }));
-
-  container.Add(op3);
-
-  // Nothing has run yet because we haven't run the async loop.
-  EXPECT_FALSE(op1_ran);
-  EXPECT_FALSE(op1_done);
-  EXPECT_FALSE(op2_ran);
-  EXPECT_FALSE(op2_done);
-  EXPECT_FALSE(op3_ran);
-  EXPECT_FALSE(op3_done);
-
-  // Running the loop we expect op1 to have run, but not completed.
-  RunLoopUntilIdle();
-  EXPECT_TRUE(op1_ran);
-  EXPECT_FALSE(op1_done);
-  EXPECT_FALSE(op2_ran);
-  EXPECT_FALSE(op2_done);
-  EXPECT_FALSE(op3_ran);
-  EXPECT_FALSE(op3_done);
-
-  // But even if we run more, we do not expect any other ops to run.
-  RunLoopUntilIdle();
-  EXPECT_TRUE(op1_ran);
-  EXPECT_FALSE(op1_done);
-  EXPECT_FALSE(op2_ran);
-  EXPECT_FALSE(op2_done);
-  EXPECT_FALSE(op3_ran);
-  EXPECT_FALSE(op3_done);
-
-  // If op1 says it's Done(), we expect op2 to run.
-  op1->SayDone();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(op1_done);
-  EXPECT_TRUE(op2_ran);
-  EXPECT_FALSE(op2_done);
-  EXPECT_FALSE(op3_ran);
-  EXPECT_FALSE(op3_done);
-
-  // Running the loop again should do nothing, as op2 is still pending (until
-  // we resume it manuall).
-  RunLoopUntilIdle();
-  EXPECT_TRUE(suspended_op2);
-  EXPECT_FALSE(op2_done);
-  EXPECT_FALSE(op3_ran);
-  EXPECT_FALSE(op3_done);
-
-  // Resume op2, and run the loop again. We expect op3 to start, but not
-  // complete.
-  suspended_op2.resume_task();
-  RunLoopUntilIdle();
-  EXPECT_TRUE(op2_done);
-  EXPECT_TRUE(op3_ran);
-  EXPECT_FALSE(op3_done);
-}
-
-TEST_F(OperationTest, OperationCollection) {
-  // OperationCollection starts all operations immediately and lets them run in
-  // parallel.
-  OperationCollection container;
-
-  // OperationQueue, unlike TestContainer, does manage its memory.
-  bool op1_ran = false;
-  bool op1_done = false;
-  auto* op1 = new TestOperation<>([&op1_ran]() { op1_ran = true; },
-                                  [&op1_done]() { op1_done = true; });
-
-  bool op2_ran = false;
-  bool op2_done = false;
-  auto* op2 = new TestOperation<>([&op2_ran]() { op2_ran = true; },
-                                  [&op2_done]() { op2_done = true; });
-
-  container.Add(op1);
-  container.Add(op2);
-  bool op3_ran = false;
-  container.ScheduleTask(fit::make_promise([&] { op3_ran = true; }));
-
-  // Nothing has run yet because we haven't run the async loop.
-  EXPECT_FALSE(op1_ran);
-  EXPECT_FALSE(op1_done);
-  EXPECT_FALSE(op2_ran);
-  EXPECT_FALSE(op2_done);
-  EXPECT_FALSE(op3_ran);
-
-  // Running the loop we expect all ops to have run. TestOperations won't have
-  // completed because they require us to call SayDone(). The fit::promise,
-  // however, will have completed (it doesn't suspend).
-  RunLoopUntilIdle();
-  EXPECT_TRUE(op1_ran);
-  EXPECT_FALSE(op1_done);
-  EXPECT_TRUE(op2_ran);
-  EXPECT_FALSE(op2_done);
-  EXPECT_TRUE(op2_ran);
-}
-
-class TestOperationNotNullPtr : public Operation<> {
- public:
-  TestOperationNotNullPtr(const FlowToken& parent_flow_token)
-      : Operation("Test Operation on container is not nullptr", [] {}),
-        parent_flow_token_(parent_flow_token) {}
-
- private:
-  void Run() override { FlowToken flow{this}; }
-
-  FlowToken parent_flow_token_;
-};
-
-class TestQueueNotNullPtr : public Operation<> {
- public:
-  TestQueueNotNullPtr(ResultCall done)
-      : Operation("TestQueueNotNullPtr", std::move(done)) {}
-
- private:
-  void Run() override {
-    // When |flow| goes out of scope, it will call Done() for us.
-    FlowToken flow{this};
-    operation_queue_.Add(new TestOperationNotNullPtr(flow));
-  }
-
-  OperationQueue operation_queue_;
-};
-
-class TestCollectionNotNullPtr : public Operation<> {
- public:
-  TestCollectionNotNullPtr(ResultCall done)
-      : Operation("TestCollectionNotNullPtr", std::move(done)) {}
-
- private:
-  void Run() override {
-    // When |flow| goes out of scope, it will call Done() for us.
-    FlowToken flow{this};
-    operation_collection_.Add(new TestOperationNotNullPtr(flow));
-  }
-
-  OperationCollection operation_collection_;
-};
-
-// See comments on OperationQueue::Drop.
-TEST_F(OperationTest, TestQueueNotNullPtr) {
-  OperationQueue container;
-
-  bool done_called{false};
-  auto op = new TestQueueNotNullPtr([&done_called] { done_called = true; });
-
-  container.Add(op);
-
-  // Nothing has run yet because we haven't run the async loop.
-  EXPECT_FALSE(done_called);
-
-  // Running the loop we expect done_called to be set to true
-  RunLoopUntilIdle();
-  EXPECT_TRUE(done_called);
-}
-
-// See comments on OperationCollection::Drop.
-TEST_F(OperationTest, TestCollectionNotNullPtr) {
-  OperationQueue container;
-
-  bool done_called{false};
-  auto op =
-      new TestCollectionNotNullPtr([&done_called] { done_called = true; });
-
-  container.Add(op);
-
-  // Nothing has run yet because we haven't run the async loop.
-  EXPECT_FALSE(done_called);
-
-  // Running the loop we expect done_called to be set to true
-  RunLoopUntilIdle();
-  EXPECT_TRUE(done_called);
-}
-
-TEST_F(OperationTest, WrapFutureAsOperation_WithResult) {
-  // Show that when we wrap a Future<> as an operation on a queue, it runs.
-  bool op_did_start{};
-  bool op_did_finish{};
-
-  auto on_run = Future<>::Create(__PRETTY_FUNCTION__);
-  auto done = on_run->Map([&]() -> int {
-    EXPECT_FALSE(op_did_finish);
-    op_did_start = true;
-    return 10;
-  });
-
-  OperationCollection container;
-  container.Add(WrapFutureAsOperation(__PRETTY_FUNCTION__, on_run, done,
-                                      std::function<void(int)>([&](int result) {
-                                        EXPECT_EQ(10, result);
-                                        op_did_finish = true;
-                                      })));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(op_did_start);
-  EXPECT_TRUE(op_did_finish);
-}
-
-TEST_F(OperationTest, WrapFutureAsOperation_WithoutResult) {
-  // Show that when we wrap a Future<> as an operation on a queue, it runs.
-  bool op_did_start{};
-  bool op_did_finish{};
-
-  auto on_run = Future<>::Create(__PRETTY_FUNCTION__);
-  auto done = on_run->Then([&] {
-    EXPECT_FALSE(op_did_finish);
-    op_did_start = true;
-  });
-
-  OperationCollection container;
-  container.Add(WrapFutureAsOperation(
-      __PRETTY_FUNCTION__, on_run, done,
-      std::function<void()>([&] { op_did_finish = true; })));
-
-  RunLoopUntilIdle();
-  EXPECT_TRUE(op_did_start);
-  EXPECT_TRUE(op_did_finish);
-}
-
-}  // namespace
-}  // namespace modular
diff --git a/public/lib/context/cpp/BUILD.gn b/public/lib/context/cpp/BUILD.gn
deleted file mode 100644
index de9d96a..0000000
--- a/public/lib/context/cpp/BUILD.gn
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("context_helper") {
-  sources = [
-    "context_helper.cc",
-    "context_helper.h",
-  ]
-
-  deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("context_metadata_builder") {
-  sources = [
-    "context_metadata_builder.cc",
-    "context_metadata_builder.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
diff --git a/public/lib/context/cpp/context_helper.cc b/public/lib/context/cpp/context_helper.cc
deleted file mode 100644
index ae71e81..0000000
--- a/public/lib/context/cpp/context_helper.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/context/cpp/context_helper.h>
-
-namespace modular {
-
-std::optional<std::vector<fuchsia::modular::ContextValue>> TakeContextValue(
-    fuchsia::modular::ContextUpdate* const update, const std::string& key) {
-  for (auto& it : update->values) {
-    if (it.key == key) {
-      return std::move(it.value);
-    }
-  }
-  return std::nullopt;
-}
-
-void AddToContextQuery(fuchsia::modular::ContextQuery* const query,
-                       const std::string& key,
-                       fuchsia::modular::ContextSelector selector) {
-  fuchsia::modular::ContextQueryEntry entry;
-  entry.key = key;
-  entry.value = std::move(selector);
-  query->selector.push_back(std::move(entry));
-}
-
-bool HasSelectorKey(fuchsia::modular::ContextQuery* const query,
-                    const std::string& key) {
-  for (auto& it : query->selector) {
-    if (it.key == key) {
-      return true;
-    }
-  }
-  return false;
-}
-
-}  // namespace modular
diff --git a/public/lib/context/cpp/context_helper.h b/public/lib/context/cpp/context_helper.h
deleted file mode 100644
index ba1600c..0000000
--- a/public/lib/context/cpp/context_helper.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_CONTEXT_CPP_CONTEXT_HELPER_H_
-#define LIB_CONTEXT_CPP_CONTEXT_HELPER_H_
-
-#include <utility>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/vector.h>
-
-namespace modular {
-
-// Takes a single value specified by |key| from |update|, and sets
-// |update.values| to null."
-std::optional<std::vector<fuchsia::modular::ContextValue>> TakeContextValue(
-    fuchsia::modular::ContextUpdate* update, const std::string& key);
-
-void AddToContextQuery(fuchsia::modular::ContextQuery* query,
-                       const std::string& key,
-                       fuchsia::modular::ContextSelector selector);
-
-bool HasSelectorKey(fuchsia::modular::ContextQuery* const query,
-                    const std::string& key);
-
-}  // namespace modular
-
-#endif  // LIB_CONTEXT_CPP_CONTEXT_HELPER_H_
diff --git a/public/lib/context/cpp/context_metadata_builder.cc b/public/lib/context/cpp/context_metadata_builder.cc
deleted file mode 100644
index 8b56273..0000000
--- a/public/lib/context/cpp/context_metadata_builder.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/context/cpp/context_metadata_builder.h>
-
-#include <lib/fidl/cpp/clone.h>
-
-namespace maxwell {
-
-ContextMetadataBuilder::ContextMetadataBuilder() {}
-ContextMetadataBuilder::ContextMetadataBuilder(
-    fuchsia::modular::ContextMetadata initial_value)
-    : m_(std::move(initial_value)) {}
-
-ContextMetadataBuilder& ContextMetadataBuilder::SetStoryId(
-    const fidl::StringPtr& story_id) {
-  StoryMetadata()->id = story_id;
-  return *this;
-}
-
-ContextMetadataBuilder& ContextMetadataBuilder::SetStoryFocused(bool focused) {
-  auto& story_meta = StoryMetadata();
-  story_meta->focused = fuchsia::modular::FocusedState::New();
-  story_meta->focused->state =
-      focused ? fuchsia::modular::FocusedStateState::FOCUSED
-              : fuchsia::modular::FocusedStateState::NOT_FOCUSED;
-  return *this;
-}
-
-ContextMetadataBuilder& ContextMetadataBuilder::SetModuleUrl(
-    const fidl::StringPtr& url) {
-  ModuleMetadata()->url = url;
-  return *this;
-}
-ContextMetadataBuilder& ContextMetadataBuilder::SetModulePath(
-    const std::vector<std::string>& path) {
-  ModuleMetadata()->path.reset(path);
-  return *this;
-}
-
-ContextMetadataBuilder& ContextMetadataBuilder::SetModuleFocused(bool focused) {
-  auto& module_meta = ModuleMetadata();
-  module_meta->focused = fuchsia::modular::FocusedState::New();
-  module_meta->focused->state =
-      focused ? fuchsia::modular::FocusedStateState::FOCUSED
-              : fuchsia::modular::FocusedStateState::NOT_FOCUSED;
-  return *this;
-}
-
-ContextMetadataBuilder& ContextMetadataBuilder::SetEntityTopic(
-    const fidl::StringPtr& topic) {
-  EntityMetadata()->topic = topic;
-  return *this;
-}
-ContextMetadataBuilder& ContextMetadataBuilder::AddEntityType(
-    const fidl::StringPtr& type) {
-  EntityMetadata()->type.push_back(type);
-  return *this;
-}
-ContextMetadataBuilder& ContextMetadataBuilder::SetEntityTypes(
-    const std::vector<std::string>& types) {
-  EntityMetadata()->type.reset(types);
-  return *this;
-}
-ContextMetadataBuilder& ContextMetadataBuilder::SetLinkPath(
-    const std::vector<std::string>& module_path,
-    const std::string& name) {
-  LinkMetadata()->module_path.reset(module_path);
-  LinkMetadata()->name = name;
-  return *this;
-}
-
-fuchsia::modular::ContextMetadata ContextMetadataBuilder::Build() {
-  return std::move(m_);
-}
-
-fuchsia::modular::ContextMetadataPtr ContextMetadataBuilder::BuildPtr() {
-  auto meta = fuchsia::modular::ContextMetadata::New();
-  *meta.get() = std::move(m_);
-  return meta;
-}
-
-#define ENSURE_MEMBER(field, class_name)            \
-  if (!m_.field) {                                  \
-    m_.field = fuchsia::modular::class_name::New(); \
-  }                                                 \
-  return m_.field;
-
-fuchsia::modular::StoryMetadataPtr& ContextMetadataBuilder::StoryMetadata() {
-  ENSURE_MEMBER(story, StoryMetadata);
-}
-
-fuchsia::modular::ModuleMetadataPtr& ContextMetadataBuilder::ModuleMetadata() {
-  ENSURE_MEMBER(mod, ModuleMetadata);
-}
-
-fuchsia::modular::EntityMetadataPtr& ContextMetadataBuilder::EntityMetadata() {
-  ENSURE_MEMBER(entity, EntityMetadata);
-}
-
-fuchsia::modular::LinkMetadataPtr& ContextMetadataBuilder::LinkMetadata() {
-  ENSURE_MEMBER(link, LinkMetadata);
-}
-
-}  // namespace maxwell
diff --git a/public/lib/context/cpp/context_metadata_builder.h b/public/lib/context/cpp/context_metadata_builder.h
deleted file mode 100644
index ebb3263..0000000
--- a/public/lib/context/cpp/context_metadata_builder.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_CONTEXT_CPP_CONTEXT_METADATA_BUILDER_H_
-#define LIB_CONTEXT_CPP_CONTEXT_METADATA_BUILDER_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-namespace maxwell {
-
-class ContextMetadataBuilder {
- public:
-  ContextMetadataBuilder();
-  explicit ContextMetadataBuilder(
-      fuchsia::modular::ContextMetadata initial_value);
-
-  ContextMetadataBuilder& SetStoryId(const fidl::StringPtr& story_id);
-  ContextMetadataBuilder& SetStoryFocused(bool focused);
-
-  ContextMetadataBuilder& SetModuleUrl(const fidl::StringPtr& url);
-  ContextMetadataBuilder& SetModulePath(
-      const std::vector<std::string>& path);
-  ContextMetadataBuilder& SetModuleFocused(bool focused);
-
-  ContextMetadataBuilder& SetEntityTopic(const fidl::StringPtr& topic);
-  ContextMetadataBuilder& AddEntityType(const fidl::StringPtr& type);
-  ContextMetadataBuilder& SetEntityTypes(
-      const std::vector<std::string>& types);
-
-  ContextMetadataBuilder& SetLinkPath(
-      const std::vector<std::string>& module_path,
-      const std::string& name);
-
-  // Build() or BuildPtr() can be called only once, as they move |m_|.
-  fuchsia::modular::ContextMetadata Build();
-  fuchsia::modular::ContextMetadataPtr BuildPtr();
-
- private:
-  fuchsia::modular::StoryMetadataPtr& StoryMetadata();
-  fuchsia::modular::ModuleMetadataPtr& ModuleMetadata();
-  fuchsia::modular::EntityMetadataPtr& EntityMetadata();
-  fuchsia::modular::LinkMetadataPtr& LinkMetadata();
-
-  fuchsia::modular::ContextMetadata m_;
-};
-
-}  // namespace maxwell
-
-#endif  // LIB_CONTEXT_CPP_CONTEXT_METADATA_BUILDER_H_
diff --git a/public/lib/entity/cpp/BUILD.gn b/public/lib/entity/cpp/BUILD.gn
deleted file mode 100644
index ef2b026..0000000
--- a/public/lib/entity/cpp/BUILD.gn
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-group("cpp") {
-  deps = [
-    ":json",
-  ]
-}
-
-group("unittests") {
-  testonly = true
-
-  deps = [
-    ":json_unittest",
-  ]
-}
-
-source_set("json") {
-  sources = [
-    "json.cc",
-    "json.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//third_party/rapidjson",
-  ]
-}
-
-source_set("json_unittest") {
-  testonly = true
-
-  sources = [
-    "json_unittest.cc",
-  ]
-
-  deps = [
-    ":json",
-    "//third_party/googletest:gtest",
-    "//third_party/rapidjson",
-  ]
-}
diff --git a/public/lib/entity/cpp/json.cc b/public/lib/entity/cpp/json.cc
deleted file mode 100644
index 20670f1..0000000
--- a/public/lib/entity/cpp/json.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/entity/cpp/json.h>
-
-#include <string>
-
-#include <lib/fxl/logging.h>
-
-#include "rapidjson/stringbuffer.h"
-#include "rapidjson/writer.h"
-
-namespace modular {
-
-constexpr char kEntityTypeProperty[] = "@type";
-constexpr char kEntityRefAttribute[] = "@entityRef";
-
-constexpr char kEntityTypeString[] = "com.google.fuchsia.string";
-// We use |kEntityTypeUnknown| if the entity doesn't have a type.
-constexpr char kEntityTypeUnknown[] = "com.google.fuchsia.unknown";
-
-std::string EntityReferenceToJson(const std::string& ref) {
-  auto doc = EntityReferenceToJsonDoc(ref);
-
-  rapidjson::StringBuffer buffer;
-  rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
-  doc.Accept(writer);
-  return buffer.GetString();
-}
-
-rapidjson::Document EntityReferenceToJsonDoc(const std::string& ref) {
-  // Create an object that looks like:
-  // {
-  //   "@entityRef": "<ref string>"
-  // }
-  rapidjson::Document doc;
-  doc.SetObject();
-  rapidjson::Value str;
-  str.SetString(ref, doc.GetAllocator());
-  doc.AddMember(kEntityRefAttribute, str, doc.GetAllocator());
-  return doc;
-}
-
-bool EntityReferenceFromJson(const std::string& json, std::string* ref) {
-  rapidjson::Document doc;
-  doc.Parse(json);
-  if (doc.HasParseError())
-    return false;
-  return EntityReferenceFromJson(doc, ref);
-}
-bool EntityReferenceFromJson(const rapidjson::Value& value, std::string* ref) {
-  if (!value.IsObject() || !value.HasMember(kEntityRefAttribute))
-    return false;
-
-  auto& attr = value[kEntityRefAttribute];
-  if (!attr.IsString())
-    return false;
-  *ref = attr.GetString();
-  return true;
-}
-
-bool ExtractEntityTypesFromJson(const std::string& json,
-                                std::vector<std::string>* const output) {
-  FXL_CHECK(output != nullptr);
-  // If the content has the @type attribute, take its contents and populate the
-  // fuchsia::modular::EntityMetadata appropriately, overriding whatever is
-  // there.
-  rapidjson::Document doc;
-  doc.Parse(json);
-  if (doc.HasParseError()) {
-    FXL_LOG(WARNING) << "Error parsing JSON: " << doc.GetParseError();
-    return false;
-  }
-
-  return ExtractEntityTypesFromJson(doc, output);
-}
-
-bool ExtractEntityTypesFromJson(const rapidjson::Value& value,
-                                std::vector<std::string>* const output) {
-  std::vector<std::string> entity_types;
-
-  if (value.IsString()) {
-    entity_types.emplace_back(kEntityTypeString);
-  } else if (value.IsObject() && value.HasMember(kEntityTypeProperty)) {
-    const auto& types = value[kEntityTypeProperty];
-    if (types.IsString()) {
-      entity_types.emplace_back(types.GetString());
-    } else if (types.IsArray()) {
-      for (uint32_t i = 0; i < types.Size(); ++i) {
-        if (!types[i].IsString())
-          return false;
-        entity_types.emplace_back(types[i].GetString());
-      }
-    } else {
-      return false;
-    }
-  } else {
-    entity_types.push_back(kEntityTypeUnknown);
-  }
-
-  output->swap(entity_types);
-  return true;
-}
-
-}  // namespace modular
diff --git a/public/lib/entity/cpp/json.h b/public/lib/entity/cpp/json.h
deleted file mode 100644
index ebe9e55..0000000
--- a/public/lib/entity/cpp/json.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_ENTITY_CPP_JSON_H_
-#define LIB_ENTITY_CPP_JSON_H_
-
-#include <string>
-#include <vector>
-
-#include "rapidjson/document.h"
-
-namespace modular {
-
-// Returns a JSON string that can be used with EntityReferenceFromJson().
-std::string EntityReferenceToJson(const std::string& ref);
-// Like above but returns a rapidjson::Document.
-rapidjson::Document EntityReferenceToJsonDoc(const std::string& ref);
-
-// Returns false if |json| does not represent an fuchsia::modular::Entity
-// reference.
-bool EntityReferenceFromJson(const std::string& json, std::string* ref);
-// Like above but operates on a rapidjson::Value.
-bool EntityReferenceFromJson(const rapidjson::Value& value, std::string* ref);
-
-// Extracts the values of the JSON object |doc|'s "@type" attribute into
-// |types|. Returns false and leaves |types| untouched if |doc| is not JSON
-// or is not structured in a way that we can extract types.
-bool ExtractEntityTypesFromJson(const std::string& json,
-                                std::vector<std::string>* output);
-bool ExtractEntityTypesFromJson(const rapidjson::Value& value,
-                                std::vector<std::string>* output);
-
-}  // namespace modular
-
-#endif  // LIB_ENTITY_CPP_JSON_H_
diff --git a/public/lib/entity/cpp/json_unittest.cc b/public/lib/entity/cpp/json_unittest.cc
deleted file mode 100644
index 24f34f9..0000000
--- a/public/lib/entity/cpp/json_unittest.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/entity/cpp/json.h>
-
-#include <string>
-
-#include "gtest/gtest.h"
-#include "rapidjson/document.h"
-
-namespace modular {
-
-TEST(EntityJsonTest, EntityReferenceToJson) {
-  auto ret = EntityReferenceToJson("reference");
-  EXPECT_EQ(R"({"@entityRef":"reference"})", ret);
-}
-
-TEST(EntityJsonTest, EntityReferenceToJsonDoc) {
-  auto ret = EntityReferenceToJsonDoc("reference");
-  EXPECT_TRUE(ret.IsObject());
-  EXPECT_TRUE(ret.HasMember("@entityRef"));
-  EXPECT_EQ("reference", std::string(ret["@entityRef"].GetString()));
-}
-
-TEST(EntityJsonTest, EntityReferenceFromJson) {
-  std::string ret;
-  EXPECT_FALSE(EntityReferenceFromJson("invalid", &ret));
-  EXPECT_FALSE(EntityReferenceFromJson("1", &ret));
-  EXPECT_FALSE(EntityReferenceFromJson(R"({"@entityRoof":"reference"})", &ret));
-  EXPECT_FALSE(EntityReferenceFromJson(R"({"@entityRef":12345})", &ret));
-  EXPECT_FALSE(
-      EntityReferenceFromJson(R"({"@entityRef":["reference"]})", &ret));
-
-  EXPECT_TRUE(EntityReferenceFromJson(R"({"@entityRef":"reference"})", &ret));
-  EXPECT_EQ("reference", ret);
-
-  // EntityReferenceFromJson(rapidjson::Value) is tested implicitly with the
-  // above.
-}
-
-TEST(EntityJsonTest, ExtractEntityTypesFromJson) {
-  std::vector<std::string> types;
-
-  // Unknown type cases.
-  types = {"com.google.fuchsia.unknown"};
-  EXPECT_TRUE(ExtractEntityTypesFromJson("1", &types));
-  EXPECT_TRUE(ExtractEntityTypesFromJson("[1,2,3]", &types));
-  EXPECT_TRUE(ExtractEntityTypesFromJson("{}", &types));
-  EXPECT_TRUE(ExtractEntityTypesFromJson(R"({"type": "foo"})", &types));
-  types.clear();
-
-  // Types that have a bad format.
-  EXPECT_FALSE(ExtractEntityTypesFromJson(R"({"@type": 1})", &types));
-  EXPECT_FALSE(ExtractEntityTypesFromJson(R"({"@type": {}})", &types));
-  EXPECT_FALSE(ExtractEntityTypesFromJson(R"({"@type": [1,"foo"]})", &types));
-  types.clear();
-
-  // JSON string case.
-  EXPECT_TRUE(ExtractEntityTypesFromJson(R"("hello")", &types));
-  EXPECT_EQ(1lu, types.size());
-  EXPECT_EQ("com.google.fuchsia.string", types[0]);
-  types.clear();
-
-  // Explicit "@type" case.
-  EXPECT_TRUE(ExtractEntityTypesFromJson(R"({"@type": "foo"})", &types));
-  EXPECT_EQ(1lu, types.size());
-  EXPECT_EQ("foo", types[0]);
-  types.clear();
-
-  EXPECT_TRUE(ExtractEntityTypesFromJson(R"({"@type":["foo","bar"]})", &types));
-  EXPECT_EQ(2lu, types.size());
-  EXPECT_EQ("foo", types[0]);
-  EXPECT_EQ("bar", types[1]);
-  types.clear();
-}
-
-}  // namespace modular
diff --git a/public/lib/fostr/fidl/fuchsia.ledger/BUILD.gn b/public/lib/fostr/fidl/fuchsia.ledger/BUILD.gn
deleted file mode 100644
index 2427fd6..0000000
--- a/public/lib/fostr/fidl/fuchsia.ledger/BUILD.gn
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//garnet/public/build/fostr/fostr_fidl.gni")
-
-fostr_fidl("fuchsia.ledger") {
-  fidl_target = "//peridot/public/fidl/fuchsia.ledger"
-
-  deps = [
-    "//garnet/public/lib/fostr/fidl/fuchsia.mem",
-  ]
-}
diff --git a/public/lib/fostr/fidl/fuchsia.ledger/MAINTAINERS b/public/lib/fostr/fidl/fuchsia.ledger/MAINTAINERS
deleted file mode 100644
index d0e7ba7..0000000
--- a/public/lib/fostr/fidl/fuchsia.ledger/MAINTAINERS
+++ /dev/null
@@ -1,2 +0,0 @@
-etiennej@google.com
-qsr@google.com
diff --git a/public/lib/fostr/fidl/fuchsia.modular.auth/BUILD.gn b/public/lib/fostr/fidl/fuchsia.modular.auth/BUILD.gn
deleted file mode 100644
index 04f05d3..0000000
--- a/public/lib/fostr/fidl/fuchsia.modular.auth/BUILD.gn
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//garnet/public/build/fostr/fostr_fidl.gni")
-
-fostr_fidl("fuchsia.modular.auth") {
-  fidl_target = "//peridot/public/fidl/fuchsia.modular.auth"
-
-  deps = [
-    "//garnet/public/lib/fostr/fidl/fuchsia.ui.viewsv1token",
-  ]
-}
diff --git a/public/lib/fostr/fidl/fuchsia.modular.internal/BUILD.gn b/public/lib/fostr/fidl/fuchsia.modular.internal/BUILD.gn
deleted file mode 100644
index d4293b8..0000000
--- a/public/lib/fostr/fidl/fuchsia.modular.internal/BUILD.gn
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//garnet/public/build/fostr/fostr_fidl.gni")
-
-fostr_fidl("fuchsia.modular.internal") {
-  fidl_target = "//peridot/public/fidl/fuchsia.modular.internal"
-
-  deps = [
-    "//garnet/public/lib/fostr/fidl/fuchsia.auth",
-    "//peridot/public/lib/fostr/fidl/fuchsia.modular",
-  ]
-}
diff --git a/public/lib/fostr/fidl/fuchsia.modular.storymodel/BUILD.gn b/public/lib/fostr/fidl/fuchsia.modular.storymodel/BUILD.gn
deleted file mode 100644
index f90f8c9..0000000
--- a/public/lib/fostr/fidl/fuchsia.modular.storymodel/BUILD.gn
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//garnet/public/build/fostr/fostr_fidl.gni")
-
-fostr_fidl("fuchsia.modular.storymodel") {
-  fidl_target = "//peridot/public/fidl/fuchsia.modular.storymodel"
-
-  deps = [
-    "//garnet/public/lib/fostr/fidl/fuchsia.sys2",
-    "//peridot/public/lib/fostr/fidl/fuchsia.modular",
-  ]
-}
diff --git a/public/lib/fostr/fidl/fuchsia.modular/BUILD.gn b/public/lib/fostr/fidl/fuchsia.modular/BUILD.gn
deleted file mode 100644
index b8ea12d..0000000
--- a/public/lib/fostr/fidl/fuchsia.modular/BUILD.gn
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//garnet/public/build/fostr/fostr_fidl.gni")
-
-fostr_fidl("fuchsia.modular") {
-  fidl_target = "//peridot/public/fidl/fuchsia.modular"
-
-  deps = [
-    "//garnet/public/lib/fostr/fidl/fuchsia.auth",
-    "//garnet/public/lib/fostr/fidl/fuchsia.images",
-    "//garnet/public/lib/fostr/fidl/fuchsia.media",
-    "//garnet/public/lib/fostr/fidl/fuchsia.mem",
-    "//garnet/public/lib/fostr/fidl/fuchsia.ui.policy",
-    "//garnet/public/lib/fostr/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fostr/fidl/fuchsia.ui.viewsv1token",
-    "//peridot/public/lib/fostr/fidl/fuchsia.ledger",
-    "//peridot/public/lib/fostr/fidl/fuchsia.modular.auth",
-    "//peridot/public/lib/fostr/fidl/fuchsia.speech",
-  ]
-}
diff --git a/public/lib/fostr/fidl/fuchsia.speech/BUILD.gn b/public/lib/fostr/fidl/fuchsia.speech/BUILD.gn
deleted file mode 100644
index f4b4bd4..0000000
--- a/public/lib/fostr/fidl/fuchsia.speech/BUILD.gn
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//garnet/public/build/fostr/fostr_fidl.gni")
-
-fostr_fidl("fuchsia.speech") {
-  fidl_target = "//peridot/public/fidl/fuchsia.speech"
-}
diff --git a/public/lib/integration_testing/cpp/BUILD.gn b/public/lib/integration_testing/cpp/BUILD.gn
deleted file mode 100644
index 51fbf52..0000000
--- a/public/lib/integration_testing/cpp/BUILD.gn
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("cpp") {
-  sources = [
-    "reporting.cc",
-    "reporting.h",
-    "testing.cc",
-    "testing.h",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/lib/component/cpp",
-  ]
-}
diff --git a/public/lib/integration_testing/cpp/reporting.cc b/public/lib/integration_testing/cpp/reporting.cc
deleted file mode 100644
index d89ee81..0000000
--- a/public/lib/integration_testing/cpp/reporting.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/integration_testing/cpp/reporting.h>
-
-namespace modular {
-namespace testing {
-
-TestPoint::TestPoint(std::string label) : label_(std::move(label)) {
-  RegisterTestPoint(label_);
-}
-
-TestPoint::~TestPoint() {
-  if (!value_)
-    TEST_FAIL(label_);
-}
-
-void TestPoint::Pass() {
-  value_ = true;
-  TEST_PASS(label_);
-  PassTestPoint(label_);
-}
-
-}  // namespace testing
-}  // namespace modular
diff --git a/public/lib/integration_testing/cpp/reporting.h b/public/lib/integration_testing/cpp/reporting.h
deleted file mode 100644
index e5ecbc6..0000000
--- a/public/lib/integration_testing/cpp/reporting.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_INTEGRATION_TESTING_CPP_REPORTING_H_
-#define LIB_INTEGRATION_TESTING_CPP_REPORTING_H_
-
-#include <iostream>
-
-#include <fuchsia/testing/runner/cpp/fidl.h>
-
-#include <lib/integration_testing/cpp/testing.h>
-
-#define TEST_PASS(label) std::cerr << "[TEST] PASS: " << (label) << std::endl
-#define TEST_FAIL(label)                                  \
-  {                                                       \
-    std::cerr << "[TEST] FAIL: " << (label) << std::endl; \
-    testing::Fail(label);                                 \
-  }
-
-namespace modular {
-namespace testing {
-
-// Helper class to record that a particular condition was reached sometime
-// in the life span of an object. If the test point is not marked with Pass()
-// by the time the destructor is called, the test point records failure.
-class TestPoint {
- public:
-  explicit TestPoint(std::string label);
-  ~TestPoint();
-
-  void Pass();
-
- private:
-  std::string label_;
-  bool value_{};
-};
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // LIB_INTEGRATION_TESTING_CPP_REPORTING_H_
diff --git a/public/lib/integration_testing/cpp/testing.cc b/public/lib/integration_testing/cpp/testing.cc
deleted file mode 100644
index 8866f7d..0000000
--- a/public/lib/integration_testing/cpp/testing.cc
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/integration_testing/cpp/testing.h>
-
-#include <set>
-
-#include <fuchsia/testing/runner/cpp/fidl.h>
-#include <lib/fxl/logging.h>
-
-using fuchsia::testing::runner::TestRunner;
-using fuchsia::testing::runner::TestRunnerPtr;
-using fuchsia::testing::runner::TestRunnerStore;
-using fuchsia::testing::runner::TestRunnerStorePtr;
-
-namespace modular {
-namespace testing {
-
-namespace {
-TestRunnerPtr g_test_runner;
-TestRunnerStorePtr g_test_runner_store;
-std::set<std::string> g_test_points;
-bool g_connected;
-}  // namespace
-
-void Init(component::StartupContext* context, const std::string& identity) {
-  FXL_CHECK(context);
-  FXL_CHECK(!g_test_runner.is_bound());
-  FXL_CHECK(!g_test_runner_store.is_bound());
-
-  g_test_runner = context->ConnectToEnvironmentService<TestRunner>();
-  g_test_runner.set_error_handler([](zx_status_t status) {
-    if (g_connected) {
-      FXL_LOG(ERROR) << "Lost connection to TestRunner. This indicates that "
-                        "there was an observed process that was terminated "
-                        "without calling TestRunner.Done().";
-    } else {
-      FXL_LOG(ERROR) << "This application must be run under test_runner.";
-    }
-    exit(1);
-  });
-  g_test_runner->Identify(identity, [] { g_connected = true; });
-  g_test_runner->SetTestPointCount(g_test_points.size());
-  g_test_runner_store = context->ConnectToEnvironmentService<TestRunnerStore>();
-}
-
-void Fail(const std::string& log_msg) {
-  if (g_test_runner.is_bound()) {
-    g_test_runner->Fail(log_msg);
-  }
-}
-
-void Done(const std::function<void()>& ack) {
-  if (g_test_runner.is_bound()) {
-    g_test_runner->Done([ack] {
-      ack();
-      g_test_runner.Unbind();
-    });
-  } else {
-    ack();
-  }
-
-  if (g_test_runner_store.is_bound()) {
-    g_test_runner_store.Unbind();
-  }
-}
-
-void Teardown(const std::function<void()>& ack) {
-  if (g_test_runner.is_bound()) {
-    g_test_runner->Teardown([ack] {
-      ack();
-      g_test_runner.Unbind();
-    });
-  } else {
-    ack();
-  }
-
-  if (g_test_runner_store.is_bound()) {
-    g_test_runner_store.Unbind();
-  }
-}
-
-TestRunnerStore* GetStore() {
-  FXL_CHECK(g_test_runner_store.is_bound());
-  return g_test_runner_store.get();
-}
-
-std::function<void(fidl::StringPtr)> NewBarrierClosure(
-    const int limit, std::function<void()> proceed) {
-  return [limit, count = std::make_shared<int>(0),
-          proceed = std::move(proceed)](fidl::StringPtr value) {
-    ++*count;
-    if (*count == limit) {
-      proceed();
-    }
-  };
-}
-
-void Put(const fidl::StringPtr& key, const fidl::StringPtr& value) {
-  modular::testing::GetStore()->Put(key, value, [] {});
-}
-
-void Get(const fidl::StringPtr& key,
-         std::function<void(fidl::StringPtr)> callback) {
-  modular::testing::GetStore()->Get(key, std::move(callback));
-}
-
-void Signal(const fidl::StringPtr& condition) {
-  modular::testing::GetStore()->Put(condition, condition, [] {});
-}
-
-void Await(const fidl::StringPtr& condition, std::function<void()> cont) {
-  modular::testing::GetStore()->Get(
-      condition, [cont = std::move(cont)](fidl::StringPtr) { cont(); });
-}
-
-void RegisterTestPoint(const std::string& label) {
-  // Test points can only be registered before Init is called.
-  FXL_CHECK(!g_test_runner.is_bound())
-      << "Test Runner connection not bound. You must call "
-      << "ComponentBase::TestInit() before registering "
-      << "\"" << label << "\".";
-
-  auto inserted = g_test_points.insert(label);
-
-  // Test points must have unique labels.
-  FXL_CHECK(inserted.second) << "Test points must have unique labels. "
-                             << "\"" << label << "\" is repeated.";
-}
-
-void PassTestPoint(const std::string& label) {
-  // Test points can only be passed after initialization.
-  FXL_CHECK(g_test_runner.is_bound())
-      << "Test Runner connection not bound. You must call "
-      << "ComponentBase::TestInit() before \"" << label << "\".Pass() can be "
-      << "called.";
-
-  // Test points can only be passed once.
-  FXL_CHECK(g_test_points.erase(label))
-      << "TEST FAILED: Test point can only be passed once. "
-      << "\"" << label << "\".Pass() has been called twice.";
-
-  g_test_runner->PassTestPoint();
-}
-
-}  // namespace testing
-}  // namespace modular
diff --git a/public/lib/integration_testing/cpp/testing.h b/public/lib/integration_testing/cpp/testing.h
deleted file mode 100644
index e8acde5..0000000
--- a/public/lib/integration_testing/cpp/testing.h
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_INTEGRATION_TESTING_CPP_TESTING_H_
-#define LIB_INTEGRATION_TESTING_CPP_TESTING_H_
-
-#include <string>
-
-#include <fuchsia/testing/runner/cpp/fidl.h>
-#include <lib/component/cpp/startup_context.h>
-
-namespace modular {
-namespace testing {
-
-// TestStore key used to signal termination of the integration test suite to the
-// DevBaseShell, causing it to call Shutdown().
-constexpr char kTestShutdown[] = "test_shutdown";
-
-// Integration tests that run under DevBaseShell are cut off after this
-// timeout.
-constexpr int kTestTimeoutMilliseconds = 30000;
-
-// Connects to the TestRunner service in the caller's Environment.
-// This function must be invoked first before calling any of the ones below. A
-// test is expected to call either Done() or Teardown() before terminating
-// itself in order for the TestRunner service to know that a test process did
-// not crash, or that the test has completed and should be torn down.
-void Init(component::StartupContext* context, const std::string& identity);
-
-// Marks the test a failure with the given |log_msg| message, but does not tear
-// it down; the test may continue running. Once the test signals teardown by
-// calling Teardown(), the test is finished as a failure.
-void Fail(const std::string& log_msg);
-
-// A test must call Done() before it dies, to let the TestRunner service (which
-// has a channel connected to this application) know that this test process has
-// not crashed, otherwise it must call Teardown() to signal the TestRunner that
-// the test has finished altogether. If Done() is not called and the connection
-// to the TestService is broken, the test is declared as failed and is torn
-// down. If Done() is called, it is not possible to call Teardown().
-//
-// The calling test component should defer its own exit until test runner has
-// acknowledged the receipt of the message using the ack callback. Otherwise
-// there is a race between the teardown request and the close of the connection
-// to the application controller. If the close of the application controller is
-// noticed first by the test runner, it terminates the test as failed.
-void Done(const std::function<void()>& ack);
-
-// A test may call Teardown() to finish the test run and tear down the service.
-// Unless Fail() is called, the TestRunner will consider the test run as having
-// passed successfully.
-//
-// The calling test component should defer its own exit until test runner has
-// acknowledged the receipt of the message using the ack callback. Otherwise
-// there is a race between the teardown request and the close of the connection
-// to the application controller. If the close of the application controller is
-// noticed first by the test runner, it terminates the test as failed.
-void Teardown(const std::function<void()>& ack);
-
-// Returns the TestRunnerStore interface from the caller's
-// Environment. Init() must be called before GetStore().
-fuchsia::testing::runner::TestRunnerStore* GetStore();
-
-// Creates function that invokes the |proceed| callback after being called
-// |limit| times.
-std::function<void(fidl::StringPtr)> NewBarrierClosure(
-    const int limit, std::function<void()> proceed);
-
-// Defined for convenience of using GetStore().
-void Put(const fidl::StringPtr& key, const fidl::StringPtr& value);
-
-// Defined for convenience of using GetStore(). Listens for the |key|; the value
-// is passed to the |callback| function.
-void Get(const fidl::StringPtr& key,
-         std::function<void(fidl::StringPtr)> callback);
-
-// Defined for convenience of using GetStore(). The |condition| is used as both
-// the key and the value. When listening for the key using Get(), the value is
-// used by the receiver to display what key it was waiting on. That way the same
-// receiver function can be used to wait for multiple keys. Otherwise, Await()
-// can be used to listen for the key.
-void Signal(const fidl::StringPtr& condition);
-
-// Defined for convenience of using GetStore(). Waits for |condition| to be
-// present as a key in the TestRunnerStore before calling |cont|. The value on
-// that key is not exposed to the receiver function |cont|.
-void Await(const fidl::StringPtr& condition, std::function<void()> cont);
-
-// Registers a test point that should pass for a test to be considered
-// successful.
-void RegisterTestPoint(const std::string& label);
-
-// Signals that a test point has been passed.
-void PassTestPoint(const std::string& label);
-
-}  // namespace testing
-}  // namespace modular
-
-#endif  // LIB_INTEGRATION_TESTING_CPP_TESTING_H_
diff --git a/public/lib/lifecycle/cpp/BUILD.gn b/public/lib/lifecycle/cpp/BUILD.gn
deleted file mode 100644
index 25d603c..0000000
--- a/public/lib/lifecycle/cpp/BUILD.gn
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-group("cpp") {
-  public_deps = [
-    ":lifecycle_impl",
-  ]
-}
-
-source_set("lifecycle_impl") {
-  sources = [
-    "lifecycle_impl.cc",
-    "lifecycle_impl.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/svc/cpp",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
diff --git a/public/lib/lifecycle/cpp/lifecycle_impl.cc b/public/lib/lifecycle/cpp/lifecycle_impl.cc
deleted file mode 100644
index b65de12..0000000
--- a/public/lib/lifecycle/cpp/lifecycle_impl.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/lifecycle/cpp/lifecycle_impl.h>
-
-namespace modular {
-
-LifecycleImpl::LifecycleImpl(component::ServiceNamespace* service_namespace,
-                             LifecycleImpl::Delegate* delegate)
-    : delegate_(delegate), binding_(this) {
-  service_namespace->AddService<fuchsia::modular::Lifecycle>(
-      [this](fidl::InterfaceRequest<fuchsia::modular::Lifecycle> request) {
-        binding_.Bind(std::move(request));
-      });
-}
-
-// |fuchsia::modular::Lifecycle|
-void LifecycleImpl::Terminate() {
-  binding_.Unbind();
-  delegate_->Terminate();
-}
-
-}  // namespace modular
diff --git a/public/lib/lifecycle/cpp/lifecycle_impl.h b/public/lib/lifecycle/cpp/lifecycle_impl.h
deleted file mode 100644
index 61182c4..0000000
--- a/public/lib/lifecycle/cpp/lifecycle_impl.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_LIFECYCLE_CPP_LIFECYCLE_IMPL_H_
-#define LIB_LIFECYCLE_CPP_LIFECYCLE_IMPL_H_
-
-#include <functional>
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/macros.h>
-#include <lib/svc/cpp/service_namespace.h>
-
-namespace modular {
-
-class LifecycleImpl : fuchsia::modular::Lifecycle {
- public:
-  // Users of LifecycleImpl register a delegate to receive Terminate().
-  class Delegate {
-   public:
-    virtual void Terminate() = 0;
-  };
-
-  // |Delegate.Terminate()| is called when a
-  // fuchsia::modular::Lifecycle.Terminate message is received.
-  LifecycleImpl(component::ServiceNamespace* service_namespace,
-                Delegate* delegate);
-
- private:
-  // |fuchsia::modular::Lifecycle|
-  void Terminate() override;
-
-  Delegate* const delegate_;
-  fidl::Binding<fuchsia::modular::Lifecycle> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LifecycleImpl);
-};
-
-}  // namespace modular
-
-#endif  // LIB_LIFECYCLE_CPP_LIFECYCLE_IMPL_H_
diff --git a/public/lib/message_queue/cpp/BUILD.gn b/public/lib/message_queue/cpp/BUILD.gn
deleted file mode 100644
index 04b245c..0000000
--- a/public/lib/message_queue/cpp/BUILD.gn
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-group("cpp") {
-  public_deps = [
-    ":message_queue_client",
-    ":message_sender_client",
-  ]
-}
-
-source_set("message_queue_client") {
-  sources = [
-    "message_queue_client.cc",
-    "message_queue_client.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
-
-source_set("message_sender_client") {
-  sources = [
-    "message_sender_client.cc",
-    "message_sender_client.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-  ]
-}
diff --git a/public/lib/message_queue/cpp/message_queue_client.cc b/public/lib/message_queue/cpp/message_queue_client.cc
deleted file mode 100644
index cd051dd..0000000
--- a/public/lib/message_queue/cpp/message_queue_client.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/fsl/vmo/strings.h>
-#include <lib/message_queue/cpp/message_queue_client.h>
-
-namespace modular {
-
-MessageQueueClient::MessageQueueClient() : reader_(this) {}
-
-fidl::InterfaceRequest<fuchsia::modular::MessageQueue>
-MessageQueueClient::NewRequest() {
-  if (reader_.is_bound()) {
-    reader_.Unbind();
-    receiver_ = nullptr;
-  }
-
-  return queue_.NewRequest();
-}
-
-void MessageQueueClient::GetToken(
-    std::function<void(fidl::StringPtr)> callback) {
-  queue_->GetToken(callback);
-}
-
-void MessageQueueClient::RegisterReceiver(ReceiverCallback receiver) {
-  receiver_ = std::move(receiver);
-
-  if (!receiver_) {
-    reader_.Unbind();
-    return;
-  }
-
-  if (!reader_.is_bound()) {
-    queue_->RegisterReceiver(reader_.NewBinding());
-  }
-}
-
-// |fuchsia::modular::MessageReader|
-void MessageQueueClient::OnReceive(fuchsia::mem::Buffer message,
-                                   std::function<void()> ack) {
-  FXL_DCHECK(reader_.is_bound());
-
-  std::string str;
-  FXL_CHECK(fsl::StringFromVmo(message, &str));
-
-  receiver_(std::move(str), std::move(ack));
-}
-
-}  // namespace modular
\ No newline at end of file
diff --git a/public/lib/message_queue/cpp/message_queue_client.h b/public/lib/message_queue/cpp/message_queue_client.h
deleted file mode 100644
index 1324f99..0000000
--- a/public/lib/message_queue/cpp/message_queue_client.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_MESSAGE_QUEUE_CPP_MESSAGE_QUEUE_CLIENT_H_
-#define LIB_MESSAGE_QUEUE_CPP_MESSAGE_QUEUE_CLIENT_H_
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fit/function.h>
-
-#include "lib/fxl/macros.h"
-
-namespace modular {
-
-// MessageQueueClient is a wrapper class for using fuchsia.modular.MessageQueue
-// in a more convinient way. This class represents messages as a std::string,
-// which the underlying fidl interface may not.
-//
-// Usage:
-//
-// // 1. Obtain message queue and use it with MessageQueueClient.
-// MessageQueueClient message_queue;
-// component_context->ObtainMessageQueue("my_msg_q",
-//                                       message_queue.NewRequest());
-//
-// // 2. Register receiver. New messages are sent to the supplied callback until
-// //    the MessageQueueClient goes out of scope, or the receiver is
-// //    unregistered. To unregister the receiver, call this method with a
-// //    |nullptr| receiver.
-// message_queue.RegisterReceiver([] (std::string msg, fit::function<void> ack){
-//       ack();  // Acknowledge message receipt. We will continue to have new
-//               // messages delivered to this callback.
-//       FXL_LOG(INFO) << "new message: " << msg;
-//     });
-class MessageQueueClient : public fuchsia::modular::MessageReader {
- public:
-  using ReceiverCallback =
-      fit::function<void(std::string message, fit::function<void()> ack)>;
-
-  MessageQueueClient();
-
-  // Creates a new interface pair, binds one end to this object and returns the
-  // request side. The previous message queue and receiver are unbound.
-  fidl::InterfaceRequest<fuchsia::modular::MessageQueue> NewRequest();
-
-  // Register a receiver callback, which will be called everytime there is a new
-  // message. The receiver is supplied the message and an acknowledgement
-  // callback which the receiver must call, to acknowledge that the message has
-  // been processed and does not need to be received again. Supplying a
-  // |nullptr| will unregister the previous receiver.
-  void RegisterReceiver(ReceiverCallback receiver);
-
-  // Returns a token for this message queue, which is used to send messages
-  // to this message queue.
-  void GetToken(std::function<void(fidl::StringPtr)> callback);
-
- private:
-  // |fuchsia::modular::MessageReader|
-  void OnReceive(fuchsia::mem::Buffer message,
-                 std::function<void()> ack) override;
-
-  fuchsia::modular::MessageQueuePtr queue_;
-  fidl::Binding<fuchsia::modular::MessageReader> reader_;
-  ReceiverCallback receiver_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(MessageQueueClient);
-};
-
-}  // namespace modular
-
-#endif  // LIB_MESSAGE_QUEUE_CPP_MESSAGE_QUEUE_CLIENT_H_
diff --git a/public/lib/message_queue/cpp/message_sender_client.cc b/public/lib/message_queue/cpp/message_sender_client.cc
deleted file mode 100644
index a3ac394..0000000
--- a/public/lib/message_queue/cpp/message_sender_client.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <lib/message_queue/cpp/message_sender_client.h>
-
-#include <lib/fsl/vmo/strings.h>
-
-namespace modular {
-
-MessageSenderClient::MessageSenderClient() = default;
-
-void MessageSenderClient::Send(fxl::StringView msg) {
-  FXL_DCHECK(sender_);
-
-  fsl::SizedVmo vmo;
-  FXL_CHECK(fsl::VmoFromString(msg, &vmo));
-  sender_->Send(std::move(vmo).ToTransport());
-}
-
-fidl::InterfaceRequest<fuchsia::modular::MessageSender>
-MessageSenderClient::NewRequest() {
-  return sender_.NewRequest();
-}
-
-}  // namespace modular
\ No newline at end of file
diff --git a/public/lib/message_queue/cpp/message_sender_client.h b/public/lib/message_queue/cpp/message_sender_client.h
deleted file mode 100644
index 166e3f1..0000000
--- a/public/lib/message_queue/cpp/message_sender_client.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIB_MESSAGE_QUEUE_CPP_MESSAGE_SENDER_CLIENT_H_
-#define LIB_MESSAGE_QUEUE_CPP_MESSAGE_SENDER_CLIENT_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-namespace modular {
-
-// MessageSenderClient is a wrapper class for using
-// fuchsia.modular.MessageSender in a more convinient way. This class represents
-// messages as a std::string, which the underlying fidl interface may not.
-//
-// Usage:
-//
-// // 1. Given a message queue token (|msg_queue_token|), get a MessageSender
-// //    out of it.
-// MessageSenderClient message_sender;
-// component_context->GetMessageSender(msg_queue_token,
-//                                     message_sender.NewRequest());
-//
-// // 2. Send a message.
-// message_sender.Send("hello");
-class MessageSenderClient {
- public:
-  MessageSenderClient();
-
-  // A message sender must be bound (by calling NewRequest()) to this class
-  // before Send() is called.
-  void Send(fxl::StringView msg);
-
-  // Binds a new interface connection and returns the request side.
-  fidl::InterfaceRequest<fuchsia::modular::MessageSender> NewRequest();
-
-  // Whether the underlying interface connection is currently bound.
-  explicit operator bool() const { return sender_.is_bound(); }
-
- private:
-  fuchsia::modular::MessageSenderPtr sender_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(MessageSenderClient);
-};
-
-}  // namespace modular
-
-#endif  // LIB_MESSAGE_QUEUE_CPP_MESSAGE_SENDER_CLIENT_H_
diff --git a/tests/BUILD.gn b/tests/BUILD.gn
deleted file mode 100644
index 612964d..0000000
--- a/tests/BUILD.gn
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# We follow these conventions for the organization of the sources, build rules,
-# and packages here:
-#
-# 1. All the binaries used in tests are run through a basemgr invocation
-#    configured in modular_tests.json. It usually does not ever make sense to
-#    run a test component binary directly, especially not as a test. Therefore,
-#    all binaries are deployed in their own packages, so that they are not run
-#    automatically by roller scripts. Instead, only the run_modular_tests.sh
-#    script is present in /system/test/, which then invokes the test runner,
-#    which in turn invokes all the test component binaries in the right
-#    configuration.
-#
-# 2. The component binary as well as its package is named with a prefix that
-#    tells the test it belongs to, followed by "_test", optionally followed by a
-#    name component indicating its function if there are multiple components of
-#    the same type in a single test, followed a suffix indicating the component
-#    type. This way, all components belonging to the same test are
-#    lexicographically sorted together.
-#
-# 3. Common components shared between tests are named after their function
-#    followed by a suffix indicating the component type.
-#
-# 4. The suffix that indicates the component type (i.e. the primary service
-#    provided by the component) is:
-#
-#    - _module -- Module
-#    - _agent -- Agent
-#    - _session_shell -- SessionShell
-#    - _base_shell -- BaseShell
-#    - _story_shell -- StoryShell
-#    - _service -- FIDL interfaces
-#
-# 5. The main sources of the components are named like the binaries they create.
-#
-#
-# HOW TO ADD A NEW INTEGRATION TEST
-#
-# 1. Add a new subdirectory with rules for the test components (session shells,
-#    modules, agents). Define all test components as executable_package()s.
-#
-# 2. Add the newly defined packages for all test components to
-#    //peridot/packages/tests/modular.
-#
-# 3. Add an entry for the test to modular_tests.json.
-
-import("//build/package.gni")
-
-package("modular_tests") {
-  testonly = true
-
-  tests = [
-    {
-      name = rebase_path("run_modular_tests.sh")
-      dest = "run_modular_tests.sh"
-    },
-  ]
-
-  resources = [
-    {
-      path = rebase_path("modular_tests.json")
-      dest = "modular_tests.json"
-    },
-  ]
-}
diff --git a/tests/README.md b/tests/README.md
deleted file mode 100644
index 70c0107..0000000
--- a/tests/README.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# Testing
-
-Modular has two types of tests, unit tests and integration tests.
-
-## Unit tests
-
-Unit tests are low-level tests written against the smallest testable parts of
-the code. Tests for `some_class.{h,cc}` are placed side-by-side the code being
-tested, in a `some_class_unittest.cc` file.
-
-Unit tests are regular [Google Test] tests, although most of them use our own
-[TestLoopFixture] base class to conveniently run delayed tasks with a
-timeout, ensuring that a failing test does not hang forever.
-
-All Modular unit tests in the peridot tree are built into a single
-`modular_unittests` binary, which can be executed on fuchsia by running
-`/system/test/modular_unittests`.
-
-## Integration tests
-
-Integration tests are written against client-facing FIDL services exposed by
-Modular and run through the [Test Runner] framework in a fuchsia instance
-running on either the build host using QEMU or on a target device.
-
-There are two ways to invoke the test suite, remotely from the build host or
-directly on the fuchsia instance.
-
-### Starting tests remotely from the build host
-
-The test runner discovers the running fuchsia instance automatically, but will
-stop with an error if there is more than one. To fix the problem, specify the
-device name with the `--server` parameter.
-
-In order to run tests from your workstation, a `test_runner` must be running
-under fuchsia. In order to start `test_runner`, you can either:
-
-* Use a gn module to automatically start `test_runner` at fuchsia boot
-  time using [boot_test.config](boot_test.config). At build time on your
-  workstation, do:
-
-```
-fx set x64 --packages peridot/packages/products/test_modular
-```
-
-* Alternatively, invoke `test_runner` manually after starting fuchsia. In a
-  shell on your fuchsia device, do:
-
-```
-run test_runner
-```
-
-Each subdirectory of `peridot/tests` contains one integration test. They
-are all run together by the test runner as specified by the
-[modular_tests.json](modular_tests.json) configuration file:
-
-```
-fx exec garnet/bin/test_runner/run_test \
-  --test_file=peridot/tests/modular_tests.json
-```
-
-### Starting the test suite directly under fuchsia
-
-`run_modular_tests.sh` is a command that runs all of the Modular tests. It is
-based on the [Test Runner] framework, but runs the tests without requiring
-`test_runner` to be running under fuchsia.
-
-Run it from the fuchsia shell:
-
-```
-$ /pkgfs/packages/modular_tests/0/test/run_modular_tests.sh
-```
-
-You can also run specific tests by using their name. For example this
-will run only the *link_update* test (as described in
-[modular_tests.json](modular_tests.json)).
-
-```
-$ /pkgfs/packages/modular_tests/0/test/run_modular_tests.sh link_update
-```
-
-
-[Test Runner]: https://fuchsia.googlesource.com/test_runner/ "Test Runner"
-[Google Test]: https://github.com/google/googletest "Google Test"
-[TestLoopFixture]: ../lib/gtest/test_loop_fixture.h
diff --git a/tests/benchmarks/BUILD.gn b/tests/benchmarks/BUILD.gn
deleted file mode 100644
index 2ee3049..0000000
--- a/tests/benchmarks/BUILD.gn
+++ /dev/null
@@ -1,67 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/package.gni")
-
-# We follow the conventions of ../BUILD.gn for the organization of the sources,
-# build rules, and packages, with the following modifications:
-#
-# 1. All the binaries used in tests are run through a basemgr invocation
-#    configured in the .tspec file of the benchmark subdirectory.
-#
-# 2. The component binary as well as its package is named with a prefix that
-#    tells the benchmark it belongs to, followed by "_benchmark", followed by
-#    more name components as described in ../BUILD.gn. The tspec file is also
-#    named like the benchmark, followed by "_benchmark", followed by ".tspec".
-#
-# 3. [unchanged]
-#
-# 4. [unchanged]
-#
-# 5. [unchanged]
-#
-#
-# HOW TO ADD A NEW BENCHMARK
-#
-# 1. Add a new subdirectory with rules for the test components (session shells,
-#    modules, agents). Define all test components as executable_package()s.
-#
-# 2. Add the newly defined packages for all test components to
-#    //peridot/packages/benchmarks/modular.
-#
-# 3. Add a tspec file for the benchmark in the newly added subdirectory.
-#
-# 4. Add an entry for the tspec file to the resources = field of the
-#    modular_benchmarks build rule.
-#
-# 5. Add an entry for the test to run_modular_benchmarks.sh.
-
-package("modular_benchmarks") {
-  testonly = true
-
-  binaries = [
-    {
-      name = rebase_path("run_modular_benchmarks.sh")
-      dest = "run_modular_benchmarks.sh"
-    },
-  ]
-
-  resources = [
-    {
-      path = rebase_path("story/modular_benchmark_story.tspec")
-      dest = "modular_benchmark_story.tspec"
-    },
-  ]
-}
-
-package("peridot_benchmarks") {
-  testonly = true
-
-  binaries = [
-    {
-      name = rebase_path("benchmarks.sh")
-      dest = "benchmarks.sh"
-    },
-  ]
-}
diff --git a/tests/benchmarks/README.md b/tests/benchmarks/README.md
deleted file mode 100644
index aee523b..0000000
--- a/tests/benchmarks/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# benchmark
-
-This directory contains benchmark tests for modular. They follow the pattern
-established by the [benchmark tests for ledger].
-
-[benchmark tests for ledger]: /bin/ledger/tests/benchmark/README.md
diff --git a/tests/benchmarks/benchmarks.sh b/tests/benchmarks/benchmarks.sh
deleted file mode 100644
index a4d6578..0000000
--- a/tests/benchmarks/benchmarks.sh
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/boot/bin/sh
-#
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# This script runs all benchmarks for the Peridot layer.
-#
-# For usage, see runbench_read_arguments in runbenchmarks.sh.
-
-# Import the runbenchmarks library.
-. /pkgfs/packages/runbenchmarks/0/data/runbenchmarks.sh
-
-runbench_read_arguments "$@"
-
-# Run "local" Ledger benchmarks.  These don't need external services to function
-# properly.
-
-runbench_exec "${OUT_DIR}/ledger.add_new_page_precached.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/add_new_page_precached.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.add_new_page_precached.json"
-
-runbench_exec "${OUT_DIR}/ledger.add_new_page.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/add_new_page.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.add_new_page.json"
-
-runbench_exec "${OUT_DIR}/ledger.get_same_page.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/get_same_page.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.get_same_page.json"
-
-runbench_exec "${OUT_DIR}/ledger.get_page_id.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/get_page_id.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.get_page_id.json"
-
-runbench_exec "${OUT_DIR}/ledger.put.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/put.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.put.json"
-
-runbench_exec "${OUT_DIR}/ledger.put_as_reference.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/put_as_reference.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.put_as_reference.json"
-
-runbench_exec "${OUT_DIR}/ledger.put_big_entry.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/put_big_entry.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.put_big_entry.json"
-
-runbench_exec "${OUT_DIR}/ledger.transaction.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/transaction.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.transaction.json"
-
-runbench_exec "${OUT_DIR}/ledger.update_entry.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/update_entry.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.update_entry.json"
-
-runbench_exec "${OUT_DIR}/ledger.update_big_entry.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/update_big_entry.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.update_big_entry.json"
-
-runbench_exec "${OUT_DIR}/ledger.update_entry_transactions.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/update_entry_transactions.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.update_entry_transactions.json"
-
-runbench_exec "${OUT_DIR}/ledger.delete_entry.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/delete_entry.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.delete_entry.json"
-
-runbench_exec "${OUT_DIR}/ledger.delete_big_entry.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/delete_big_entry.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.delete_big_entry.json"
-
-runbench_exec "${OUT_DIR}/ledger.delete_entry_transactions.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/delete_entry_transactions.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.delete_entry_transactions.json"
-
-runbench_exec "${OUT_DIR}/ledger.disk_space_empty_ledger.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/disk_space_empty_ledger.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.disk_space_empty_ledger.json"
-
-runbench_exec "${OUT_DIR}/ledger.disk_space_empty_pages.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/disk_space_empty_pages.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.disk_space_empty_pages.json"
-
-runbench_exec "${OUT_DIR}/ledger.disk_space_entries.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/disk_space_entries.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.disk_space_entries.json"
-
-runbench_exec "${OUT_DIR}/ledger.disk_space_small_keys.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/disk_space_small_keys.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.disk_space_small_keys.json"
-
-runbench_exec "${OUT_DIR}/ledger.disk_space_updates.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/disk_space_updates.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.disk_space_updates.json"
-
-runbench_exec "${OUT_DIR}/ledger.disk_space_one_commit_per_entry.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/disk_space_one_commit_per_entry.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.disk_space_one_commit_per_entry.json"
-
-runbench_exec "${OUT_DIR}/ledger.disk_space_cleared_page.json" \
-    trace record \
-    --spec-file=/pkgfs/packages/ledger_benchmarks/0/data/disk_space_cleared_page.tspec \
-    --benchmark-results-file="${OUT_DIR}/ledger.disk_space_cleared_page.json"
-
-runbench_exec "${OUT_DIR}/modular.story_runner.json" \
-  trace record \
-   --spec-file=/pkgfs/packages/modular_benchmarks/0/data/modular_benchmark_story.tspec \
-   --test-suite=fuchsia.modular \
-   --benchmark-results-file="${OUT_DIR}/modular.story_runner.json"
-
-# Exit with a code indicating whether any errors occurred.
-runbench_finish "${OUT_DIR}"
diff --git a/tests/benchmarks/run_modular_benchmarks.sh b/tests/benchmarks/run_modular_benchmarks.sh
deleted file mode 100644
index 1c2192f..0000000
--- a/tests/benchmarks/run_modular_benchmarks.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/boot/bin/sh
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This script runs the Modular benchmarks. It's intended for use in continuous
-# integration jobs. It must be run from the pathname to the file inside the
-# package, it cannot (yet) be run by the package name alone.
-
-set -e
-
-trace record --spec-file=/pkgfs/packages/modular_benchmarks/0/data/modular_benchmark_story.tspec
-
-# add more benchmark tests here
diff --git a/tests/benchmarks/story/BUILD.gn b/tests/benchmarks/story/BUILD.gn
deleted file mode 100644
index 26f2722..0000000
--- a/tests/benchmarks/story/BUILD.gn
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-executable_package("modular_benchmark_story_module") {
-
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/modular_benchmark_story_module.cmx"
-      dest = "modular_benchmark_story_module.cmx"
-    },
-  ]
-
-  sources = [
-    "modular_benchmark_story_module.cc",
-  ]
-  deps = [
-    ":tracing_waiter",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("modular_benchmark_story_session_shell") {
-
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/modular_benchmark_story_session_shell.cmx"
-      dest = "modular_benchmark_story_session_shell.cmx"
-    },
-  ]
-
-  deps = [
-    ":tracing_waiter",
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/common:names",
-    "//peridot/lib/fidl:single_service_app",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:component_main",
-    "//peridot/lib/testing:session_shell_impl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/integration_testing/cpp",
-  ]
-
-  sources = [
-    "modular_benchmark_story_session_shell.cc",
-  ]
-}
-
-source_set("tracing_waiter") {
-  sources = [
-    "tracing_waiter.cc",
-    "tracing_waiter.h",
-  ]
-
-  public_deps = [
-    "//zircon/public/lib/async",
-    "//zircon/public/lib/trace",
-    "//zircon/public/lib/trace-provider",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-  ]
-}
diff --git a/tests/benchmarks/story/README.md b/tests/benchmarks/story/README.md
deleted file mode 100644
index c57fd9d..0000000
--- a/tests/benchmarks/story/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-This benchmark runs everything related to a story. For a while, this could well
-be the only thing to benchmark around the framework at all, as everything the
-framework does has to do with stories. We might add other benchmarks later, and
-for the sheer possibility of that it is that this benchmark has a name of its
-own.
-
-We keep log output of past executions in RUNLOG so we can track evolution of
-numbers.
\ No newline at end of file
diff --git a/tests/benchmarks/story/RUNLOG b/tests/benchmarks/story/RUNLOG
deleted file mode 100644
index e4e76ca..0000000
--- a/tests/benchmarks/story/RUNLOG
+++ /dev/null
@@ -1,114 +0,0 @@
-$ /pkgfs/packages/modular_benchmarks/0/bin/run_modular_benchmarks.sh
-Launching basemgr
-Starting trace; will stop in 1200 seconds...
-Application exited with return code 0
-Stopping trace...
-Application terminated
-Trace file written to /data/trace.json
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. modular AgentContextImpl::InitializeCall
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. modular AgentRunnerStorageImpl::InitializeCall
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. modular WriteDataCall
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[WARNING:garnet/lib/measure/duration.cc(75)] Ignoring a trace event: async or flow end not preceded by begin. benchmark link/trans
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "AgentRunnerStorageImpl::InitializeCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "AgentRunnerStorageImpl::WriteTaskCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "AgentRunnerStorageImpl::DeleteTaskCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "LinkImpl::GetCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "LinkImpl::EraseCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "LinkImpl::GetEntityCallCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "SessionStorage::MutateStoryDataCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryControllerImpl::KillModuleCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryControllerImpl::InitializeChainCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryControllerImpl::StopModuleCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryControllerImpl::DeleteCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryControllerImpl::OnModuleDataUpdatedCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryControllerImpl::FocusCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryControllerImpl::DefocusCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryControllerImpl::ResolveParametersCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryProviderImpl::DeleteStoryCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryProviderImpl::GetLinkPeerCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryStorage::ReadLinkDataCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryStorage::WriteLinkDataCall (modular)".
-[ERROR:garnet/bin/trace/commands/record.cc(349)] No results for measurement "StoryStorage::UpdateLinkCall (modular)".
-link/set (benchmark) -> 
-  samples 0 to 9: avg 3.08537866915423ms out of 10 samples. (std dev 0.327364625011531, min 2.71797388059702, max 3.58024751243781)
-  samples 10 to 2019: avg 3.11997304862503ms out of 2010 samples. (std dev 0.493919138663738, min 2.2520236318408, max 8.04235074626866)
-link/trans (benchmark) -> 
-  samples 0 to 9: avg 3.08896243781095ms out of 10 samples. (std dev 0.370484835949823, min 2.69241542288557, max 3.7780342039801)
-  samples 10 to 2019: avg 3.09267429209673ms out of 2010 samples. (std dev 0.478776309955248, min 2.2346828358209, max 6.18221828358209)
-story/create (benchmark) -> 
-  samples 0 to 0: 378.436559079602ms
-  samples 1 to 19: avg 424.684147911757ms out of 19 samples. (std dev 30.7204249072897, min 368.310649875622, max 469.822699626866)
-story/info (benchmark) -> 
-  samples 0 to 0: 69.3502133084577ms
-  samples 1 to 19: avg 71.2043160513223ms out of 19 samples. (std dev 5.23282503949471, min 61.9065895522388, max 80.4358700248756)
-story/start (benchmark) -> 
-  samples 0 to 0: 2.34076243781095ms
-  samples 1 to 19: avg 1.51073978790259ms out of 19 samples. (std dev 0.273893107650646, min 1.17197450248756, max 2.3538513681592)
-story/stop (benchmark) -> 
-  samples 0 to 0: 4.84000746268657ms
-  samples 1 to 19: avg 4.90821445404556ms out of 19 samples. (std dev 4.03567707901002, min 1.54024502487562, max 11.5805155472637)
-user/logout (benchmark) -> 0.222438432835821ms
-ReadAllDataCall (modular) -> avg 0.760300497512438ms out of 20 samples. (std dev 0.269687537664423, min 0.46442039800995, max 1.73237748756219)
-ReadDataCall (modular) -> avg 43.7541292184909ms out of 60 samples. (std dev 31.8507898913188, min 0.503220771144279, max 79.0309141791045)
-WriteDataCall (modular) -> avg 1.95153236940298ms out of 40 samples. (std dev 0.595833307350367, min 1.56620957711443, max 5.28696206467662)
-SyncCall (modular) -> avg 0.197957195728674ms out of 123 samples. (std dev 1.38766809817586, min 0.00673445273631841, max 13.9288737562189)
-AgentContextImpl::InitializeCall (modular) -> avg 20.0031674662402ms out of 7 samples. (std dev 14.0494825376138, min 1.92740485074627, max 41.6166592039801)
-AgentContextImpl::StopCall (modular) -> avg 1.888375ms out of 2 samples. (std dev 0.0553687810945274, min 1.83300621890547, max 1.94374378109453)
-AgentRunnerStorageImpl::InitializeCall (modular) ->  no results
-AgentRunnerStorageImpl::WriteTaskCall (modular) ->  no results
-AgentRunnerStorageImpl::DeleteTaskCall (modular) ->  no results
-LinkImpl::ReadLinkDataCall (modular) -> avg 0.405560385572139ms out of 20 samples. (std dev 0.142149907386102, min 0.240318407960199, max 0.845122512437811)
-LinkImpl::WriteLinkDataCall (modular) -> avg 1.82188344231811ms out of 2020 samples. (std dev 0.30470151052762, min 1.30627674129353, max 4.91131343283582)
-LinkImpl::FlushWatchersCall (modular) -> avg 1.141020868738ms out of 2020 samples. (std dev 0.179000152151604, min 0.819532960199005, max 2.34427425373134)
-LinkImpl::WriteCall (modular) -> avg 3.00742333998326ms out of 2020 samples. (std dev 0.46839227693992, min 2.16766666666667, max 5.99262873134328)
-LinkImpl::ReadCall (modular) -> avg 0.472000995024876ms out of 20 samples. (std dev 0.138630550437487, min 0.306875, max 0.900149253731343)
-LinkImpl::GetCall (modular) ->  no results
-LinkImpl::SetCall (modular) -> avg 3.02955667577952ms out of 2020 samples. (std dev 0.469719692566121, min 2.18553047263682, max 6.04290422885572)
-LinkImpl::EraseCall (modular) ->  no results
-LinkImpl::GetEntityCallCall (modular) ->  no results
-LinkImpl::WatchCall (modular) -> avg 0.0248887852404643ms out of 60 samples. (std dev 0.0211014577205166, min 0.015410447761194, max 0.184106343283582)
-LinkImpl::ChangeCall (modular) -> avg 0.023023183894882ms out of 2020 samples. (std dev 0.00801060659066399, min 0.0139154228855721, max 0.15521828358209)
-SessionStorage::CreateStoryCall (modular) -> avg 349.324575808458ms out of 20 samples. (std dev 47.4617117678454, min 190.873377487562, max 403.758059079602)
-SessionStorage::MutateStoryDataCall (modular) ->  no results
-StoryControllerImpl::LaunchModuleCall (modular) -> avg 0.531989365671642ms out of 20 samples. (std dev 0.279076421429912, min 0.36103855721393, max 1.57448383084577)
-StoryControllerImpl::KillModuleCall (modular) ->  no results
-StoryControllerImpl::ConnectLinkCall (modular) -> avg 0.230094330431177ms out of 60 samples. (std dev 0.30272192373998, min 0.0132108208955224, max 1.13895584577114)
-StoryControllerImpl::InitializeChainCall (modular) ->  no results
-StoryControllerImpl::LaunchModuleInShellCall (modular) -> avg 0.758289054726368ms out of 20 samples. (std dev 0.626946244651249, min 0.440429726368159, max 3.17082027363184)
-StoryControllerImpl::StopCall (modular) -> avg 4.29517719216418ms out of 40 samples. (std dev 3.27565806994589, min 0.0869558457711443, max 11.5320553482587)
-StoryControllerImpl::StopModuleCall (modular) ->  no results
-StoryControllerImpl::DeleteCall (modular) ->  no results
-StoryControllerImpl::OnModuleDataUpdatedCall (modular) ->  no results
-StoryControllerImpl::FocusCall (modular) ->  no results
-StoryControllerImpl::DefocusCall (modular) ->  no results
-StoryControllerImpl::ResolveParametersCall (modular) ->  no results
-StoryControllerImpl::ResolveModulesCall (modular) -> avg 9.71854449626866ms out of 20 samples. (std dev 39.7811895810035, min 0.136840796019901, max 183.077365049751)
-StoryProviderImpl::CreateStoryCall (modular) -> avg 422.163254415423ms out of 20 samples. (std dev 31.5918493734685, min 368.104149875622, max 469.629546641791)
-StoryProviderImpl::DeleteStoryCall (modular) ->  no results
-StoryProviderImpl::GetControllerCall (modular) -> avg 0.519575668532338ms out of 40 samples. (std dev 0.49759768134132, min 0.050285447761194, max 1.60482587064677)
-StoryProviderImpl::StopAllStoriesCall (modular) -> 8.29005597014925ms
-StoryProviderImpl::StopStoryShellCall (modular) -> 0.0730634328358209ms
-StoryProviderImpl::GetLinkPeerCall (modular) ->  no results
-StoryStorage::ReadLinkDataCall (modular) ->  no results
-StoryStorage::WriteLinkDataCall (modular) ->  no results
-StoryStorage::UpdateLinkCall (modular) ->  no results
-[ERROR:garnet/bin/trace/commands/record.cc(356)] One or more measurements had empty results. Quitting.
diff --git a/tests/benchmarks/story/meta/modular_benchmark_story_module.cmx b/tests/benchmarks/story/meta/modular_benchmark_story_module.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/benchmarks/story/meta/modular_benchmark_story_module.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/benchmarks/story/meta/modular_benchmark_story_session_shell.cmx b/tests/benchmarks/story/meta/modular_benchmark_story_session_shell.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/benchmarks/story/meta/modular_benchmark_story_session_shell.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/benchmarks/story/modular_benchmark_story.tspec b/tests/benchmarks/story/modular_benchmark_story.tspec
deleted file mode 100644
index 8351e11..0000000
--- a/tests/benchmarks/story/modular_benchmark_story.tspec
+++ /dev/null
@@ -1,48 +0,0 @@
-{
-  "test_suite_name": "fuchsia.modular",
-  "app": "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-  "args": ["--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-           "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-           "--session_shell=fuchsia-pkg://fuchsia.com/modular_benchmark_story_session_shell#meta/modular_benchmark_story_session_shell.cmx",
-           "--session_shell_args=--story_count=20",
-           "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx"],
-  "categories": ["benchmark", "modular"],
-  "duration": 120,
-  "measure": [
-    {
-      "type": "duration",
-      "event_name": "link/set",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "link/trans",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "story/create",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "story/info",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "story/start",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "story/stop",
-      "event_category": "benchmark"
-    },
-    {
-      "type": "duration",
-      "event_name": "user/logout",
-      "event_category": "benchmark"
-    }
-  ]
-}
diff --git a/tests/benchmarks/story/modular_benchmark_story_module.cc b/tests/benchmarks/story/modular_benchmark_story_module.cc
deleted file mode 100644
index 4e83172..0000000
--- a/tests/benchmarks/story/modular_benchmark_story_module.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fsl/vmo/strings.h>
-#include <trace-provider/provider.h>
-#include <trace/event.h>
-#include <trace/observer.h>
-
-#include "peridot/tests/benchmarks/story/tracing_waiter.h"
-
-namespace {
-
-// This Module updates its root link 100 times and then just sits there until
-// it's terminated.
-class NullModule : fuchsia::modular::LinkWatcher {
- public:
-  NullModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_host_(module_host), link_watcher_binding_(this) {
-    FXL_LOG(INFO) << "NullModule()";
-    module_host_->module_context()->GetLink(nullptr, link_.NewRequest());
-
-    // Will call Notify() with current value.
-    link_->WatchAll(link_watcher_binding_.NewBinding());
-  }
-
-  NullModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : NullModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  // Called by ModuleDriver.
-  void Terminate(const std::function<void()>& done) { done(); }
-
- private:
-  // |fuchsia::modular::LinkWatcher|
-  void Notify(fuchsia::mem::Buffer content) override {
-    std::string json;
-    FXL_CHECK(fsl::StringFromVmo(content, &json));
-    FXL_LOG(INFO) << "Notify() " << json;
-
-    // First invocation is from WatchAll(); next from Set().
-    if (count_ == -1) {
-      count_ = 0;
-      tracing_waiter_.WaitForTracing([this] { Set(); });
-      return;
-    }
-
-    // Corresponding TRACE_ASYNC_BEGIN() is in Set().
-    TRACE_ASYNC_END("benchmark", "link/set", count_);
-
-    ++count_;
-    if (count_ <= 100) {
-      Set();
-    }
-  }
-
-  void Set() {
-    FXL_LOG(INFO) << "Set() " << count_;
-
-    // Corresponding TRACE_ASYNC_END() is in Notify().
-    TRACE_ASYNC_BEGIN("benchmark", "link/set", count_);
-
-    // Corresponding TRACE_FLOW_END() is in the session shell.
-    TRACE_FLOW_BEGIN("benchmark", "link/trans", count_);
-
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(std::to_string(count_), &vmo));
-    link_->Set(nullptr, std::move(vmo).ToTransport());
-  }
-
-  modular::ModuleHost* const module_host_;
-  modular::TracingWaiter tracing_waiter_;
-  fuchsia::modular::LinkPtr link_;
-  fidl::Binding<fuchsia::modular::LinkWatcher> link_watcher_binding_;
-
-  int count_{-1};
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<NullModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/benchmarks/story/modular_benchmark_story_session_shell.cc b/tests/benchmarks/story/modular_benchmark_story_session_shell.cc
deleted file mode 100644
index 1e249a0..0000000
--- a/tests/benchmarks/story/modular_benchmark_story_session_shell.cc
+++ /dev/null
@@ -1,305 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <utility>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_number_conversions.h>
-#include <trace-provider/provider.h>
-#include <trace/event.h>
-#include <trace/observer.h>
-
-#include "peridot/lib/common/names.h"
-#include "peridot/lib/fidl/single_service_app.h"
-#include "peridot/lib/testing/component_main.h"
-#include "peridot/lib/testing/session_shell_impl.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/benchmarks/story/tracing_waiter.h"
-
-namespace {
-
-const char kStoryNamePrefix[] = "story-";
-
-class Settings {
- public:
-  explicit Settings(const fxl::CommandLine& command_line) {
-    const auto story_count_str =
-        command_line.GetOptionValueWithDefault("story_count", "1");
-    if (!fxl::StringToNumberWithError(story_count_str, &story_count)) {
-      FXL_LOG(ERROR) << "Unrecognized value [--story_count=" << story_count_str
-                     << "]: Using 0.";
-    }
-
-    module_url = command_line.GetOptionValueWithDefault(
-        "module_url",
-        "fuchsia-pkg://fuchsia.com/modular_benchmark_story_module#meta/modular_benchmark_story_module.cmx");
-  }
-
-  int story_count{0};
-  std::string module_url;
-};
-
-// A simple story watcher implementation that invokes a "continue" callback when
-// it sees the watched story transition to the given state. Used to push the
-// test sequence forward when the test story reaches the next state.
-class StoryWatcherImpl : fuchsia::modular::StoryWatcher {
- public:
-  StoryWatcherImpl() : binding_(this) {}
-  ~StoryWatcherImpl() override = default;
-
-  // Registers itself as a watcher on the given story. Only one story at a time
-  // can be watched.
-  void Watch(fuchsia::modular::StoryController* const story_controller) {
-    story_controller->Watch(binding_.NewBinding());
-  }
-
-  // Deregisters itself from the watched story.
-  void Reset() { binding_.Unbind(); }
-
-  // Sets the function where to continue when the story is observed to be done.
-  void Continue(fuchsia::modular::StoryState state, std::function<void()> at) {
-    continue_state_ = state;
-    continue_ = at;
-  }
-
- private:
-  // |fuchsia::modular::StoryWatcher|
-  void OnStateChange(fuchsia::modular::StoryState state) override {
-    if (state != continue_state_) {
-      return;
-    }
-
-    continue_();
-  }
-
-  // |fuchsia::modular::StoryWatcher|
-  void OnModuleAdded(fuchsia::modular::ModuleData module_data) override {}
-
-  // |fuchsia::modular::StoryWatcher|
-  void OnModuleFocused(std::vector<std::string> module_path) override {}
-
-  fidl::Binding<fuchsia::modular::StoryWatcher> binding_;
-
-  fuchsia::modular::StoryState continue_state_{
-      fuchsia::modular::StoryState::STOPPED};
-  std::function<void()> continue_{[] {}};
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryWatcherImpl);
-};
-
-// A simple link watcher implementation that invokes a "continue" callback when
-// it sees the watched link change.
-class LinkWatcherImpl : fuchsia::modular::LinkWatcher {
- public:
-  LinkWatcherImpl() : binding_(this) {}
-  ~LinkWatcherImpl() override = default;
-
-  // Registers itself as a watcher on the given link. Only one story at a time
-  // can be watched.
-  void Watch(fuchsia::modular::Link* const link) {
-    link->WatchAll(binding_.NewBinding());
-  }
-
-  // Deregisters itself from the watched story.
-  void Reset() { binding_.Unbind(); }
-
-  // Sets the function where to continue when the story is observed to be done.
-  void Continue(std::function<void(fidl::StringPtr)> at) { continue_ = at; }
-
- private:
-  // |fuchsia::modular::LinkWatcher|
-  void Notify(fuchsia::mem::Buffer value) override {
-    std::string json;
-    FXL_CHECK(fsl::StringFromVmo(value, &json));
-    continue_(json);
-  }
-
-  fidl::Binding<fuchsia::modular::LinkWatcher> binding_;
-
-  std::function<void(fidl::StringPtr)> continue_{[](fidl::StringPtr) {}};
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(LinkWatcherImpl);
-};
-
-// Measures timing the machinery available to a session shell implementation.
-// This is invoked as a session shell from basemgr and executes a predefined
-// sequence of steps, rather than to expose a UI to be driven by user
-// interaction, as a session shell normally would.
-class TestApp : public modular::ViewApp {
- public:
-  TestApp(component::StartupContext* const startup_context, Settings settings)
-      : ViewApp(startup_context), settings_(std::move(settings)) {
-    startup_context->ConnectToEnvironmentService(
-        session_shell_context_.NewRequest());
-    session_shell_context_->GetStoryProvider(story_provider_.NewRequest());
-
-    startup_context->ConnectToEnvironmentService(puppet_master_.NewRequest());
-
-    startup_context->outgoing().AddPublicService(
-        session_shell_impl_.GetHandler());
-
-    tracing_waiter_.WaitForTracing([this] { Loop(); });
-  }
-
-  ~TestApp() override = default;
-
-  // Called by AppDriver in ComponentMain(). NOTE(mesch): Even though it
-  // overrides SingleServiceApp::Terminate(), it is called directly on TestApp
-  // by AppDriver, so it must not be private.
-  void Terminate(std::function<void()> done) override {
-    // The corresponding BEGIN() call is in Loop(), below.
-    TRACE_ASYNC_END("benchmark", "user/logout", 0);
-    done();
-  }
-
- private:
-  void Loop() {
-    if (story_count_ < settings_.story_count) {
-      FXL_LOG(INFO) << "Loop at " << story_count_ << " of "
-                    << settings_.story_count;
-      async::PostTask(async_get_default_dispatcher(),
-                      [this] { StoryCreate(); });
-
-    } else {
-      TRACE_ASYNC_BEGIN("benchmark", "user/logout", 0);
-      session_shell_context_->Logout();
-    }
-  }
-
-  void StoryCreate() {
-    FXL_LOG(INFO) << "StoryCreate()";
-    TRACE_ASYNC_BEGIN("benchmark", "story/create", 0);
-    std::string story_name = std::string(kStoryNamePrefix) + std::to_string(story_count_);
-    puppet_master_->ControlStory(story_name, story_puppet_master_.NewRequest());
-
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("root");
-    add_mod.intent.handler = settings_.module_url;
-    add_mod.intent.action = "action";
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-    commands.push_back(std::move(command));
-
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this, story_name](fuchsia::modular::ExecuteResult result) {
-          TRACE_ASYNC_END("benchmark", "story/create", 0);
-          StoryInfo(story_name);
-        });
-  }
-
-  void StoryInfo(fidl::StringPtr story_id) {
-    FXL_LOG(INFO) << "StoryInfo()";
-    story_provider_->GetController(story_id, story_controller_.NewRequest());
-
-    TRACE_ASYNC_BEGIN("benchmark", "story/info", 0);
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo story_info,
-                                      fuchsia::modular::StoryState state) {
-      TRACE_ASYNC_END("benchmark", "story/info", 0);
-      Link();
-    });
-  }
-
-  void Link() {
-    FXL_LOG(INFO) << "Link()";
-
-    fuchsia::modular::LinkPath link_path = fuchsia::modular::LinkPath();
-    std::vector<std::string> root_module_path;
-    root_module_path.push_back(modular::kRootModuleName);
-    link_path.module_path = std::move(root_module_path);
-    link_path.link_name = nullptr;
-    story_controller_->GetLink(std::move(link_path), link_.NewRequest());
-
-    link_watcher_.Watch(link_.get());
-    link_watcher_.Continue([this](fidl::StringPtr json) {
-      FXL_LOG(INFO) << "Link() Watch: " << json;
-      if (json == "") {
-        return;
-      }
-
-      const int count = fxl::StringToNumber<int>(json.get());
-
-      // Corresponding TRACE_FLOW_BEGIN() is in the module.
-      TRACE_FLOW_END("benchmark", "link/trans", count);
-
-      if (count == 100) {
-        StoryStop();
-      }
-    });
-
-    StoryStart();
-  }
-
-  void StoryStart() {
-    FXL_LOG(INFO) << "StoryStart()";
-    TRACE_ASYNC_BEGIN("benchmark", "story/start", 0);
-    story_watcher_.Continue(fuchsia::modular::StoryState::RUNNING, [this] {
-      TRACE_ASYNC_END("benchmark", "story/start", 0);
-    });
-
-    story_watcher_.Watch(story_controller_.get());
-    story_controller_->RequestStart();
-  }
-
-  void StoryStop() {
-    FXL_LOG(INFO) << "StoryStop()";
-    TRACE_ASYNC_BEGIN("benchmark", "story/stop", 0);
-    story_controller_->Stop([this] {
-      TRACE_ASYNC_END("benchmark", "story/stop", 0);
-      MaybeRepeat();
-    });
-  }
-
-  void MaybeRepeat() {
-    FXL_LOG(INFO) << "MaybeRepeat()";
-    story_watcher_.Reset();
-    story_controller_.Unbind();
-
-    story_count_++;
-    Loop();
-  }
-
-  modular::TracingWaiter tracing_waiter_;
-
-  const Settings settings_;
-
-  int story_count_{};
-
-  StoryWatcherImpl story_watcher_;
-  LinkWatcherImpl link_watcher_;
-  modular::testing::SessionShellImpl session_shell_impl_;
-
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-
-  fuchsia::modular::SessionShellContextPtr session_shell_context_;
-  fuchsia::modular::StoryProviderPtr story_provider_;
-  fuchsia::modular::StoryControllerPtr story_controller_;
-  fuchsia::modular::LinkPtr link_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int argc, const char** argv) {
-  auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  Settings settings(command_line);
-  modular::testing::ComponentMain<TestApp, Settings>(std::move(settings));
-  return 0;
-}
diff --git a/tests/benchmarks/story/tracing_waiter.cc b/tests/benchmarks/story/tracing_waiter.cc
deleted file mode 100644
index 861f9ef..0000000
--- a/tests/benchmarks/story/tracing_waiter.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/tests/benchmarks/story/tracing_waiter.h"
-
-#include <lib/async/default.h>
-
-namespace modular {
-
-TracingWaiter::TracingWaiter() = default;
-TracingWaiter::~TracingWaiter() = default;
-
-void TracingWaiter::WaitForTracing(std::function<void()> cont) {
-  // Cf. RunWithTracing() used by ledger benchmarks.
-  trace_provider_ =
-      std::make_unique<trace::TraceProvider>(async_get_default_dispatcher());
-  trace_observer_ = std::make_unique<trace::TraceObserver>();
-
-  std::function<void()> on_trace_state_changed = [this, cont] {
-    if (TRACE_CATEGORY_ENABLED("benchmark") && !started_) {
-      started_ = true;
-      cont();
-    }
-  };
-
-  // In case tracing has already started.
-  on_trace_state_changed();
-
-  if (!started_) {
-    trace_observer_->Start(async_get_default_dispatcher(),
-                           on_trace_state_changed);
-  }
-}
-
-}  // namespace modular
diff --git a/tests/benchmarks/story/tracing_waiter.h b/tests/benchmarks/story/tracing_waiter.h
deleted file mode 100644
index 66ab0eb..0000000
--- a/tests/benchmarks/story/tracing_waiter.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_BENCHMARKS_STORY_TRACING_WAITER_H_
-#define PERIDOT_TESTS_BENCHMARKS_STORY_TRACING_WAITER_H_
-
-#include <functional>
-#include <memory>
-
-#include <lib/fxl/macros.h>
-#include <trace-provider/provider.h>
-#include <trace/event.h>
-#include <trace/observer.h>
-
-namespace modular {
-
-// An instance of this class can be used to wait for the tracing system to be
-// ready to use. A client calls WaitForTracing() on an instance of this class,
-// and is free to make tracing calls once the callback is invoked.
-class TracingWaiter {
- public:
-  TracingWaiter();
-  ~TracingWaiter();
-
-  void WaitForTracing(std::function<void()>);
-
- private:
-  bool started_{};
-  std::unique_ptr<trace::TraceProvider> trace_provider_;
-  std::unique_ptr<trace::TraceObserver> trace_observer_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TracingWaiter);
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_TESTS_BENCHMARKS_STORY_TRACING_WAITER_H_
diff --git a/tests/clipboard/BUILD.gn b/tests/clipboard/BUILD.gn
deleted file mode 100644
index 0cef4a8..0000000
--- a/tests/clipboard/BUILD.gn
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-executable_package("clipboard_test_module") {
-  testonly = true
-
-  sources = [
-    "clipboard_test_module.cc",
-  ]
-
-  meta = [
-    {
-      path = "meta/clipboard_test_module.cmx"
-      dest = "clipboard_test_module.cmx"
-    },
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
diff --git a/tests/clipboard/README.md b/tests/clipboard/README.md
deleted file mode 100644
index 823ec3f..0000000
--- a/tests/clipboard/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# clipboard integration test
-
-This test exercises the `fuchsia::modular::Clipboard` service exposed to Modules.
-
diff --git a/tests/clipboard/clipboard_test_module.cc b/tests/clipboard/clipboard_test_module.cc
deleted file mode 100644
index fc98f42..0000000
--- a/tests/clipboard/clipboard_test_module.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/connect.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/clipboard/defs.h"
-#include "peridot/tests/common/defs.h"
-
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestPoint initialized_{"fuchsia::modular::Clipboard module initialized"};
-  TestPoint successful_peek_{
-      "fuchsia::modular::Clipboard pushed and peeked value"};
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_host_(module_host) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    initialized_.Pass();
-
-    SetUp();
-
-    const std::string expected_value = "hello there";
-    clipboard_->Push(expected_value);
-    clipboard_->Peek([this, expected_value](fidl::StringPtr text) {
-      if (expected_value == text) {
-        successful_peek_.Pass();
-      }
-      Signal(modular::testing::kTestShutdown);
-    });
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  TestPoint stopped_{"fuchsia::modular::Clipboard module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  void SetUp() {
-    module_host_->module_context()->GetComponentContext(
-        component_context_.NewRequest());
-
-    fuchsia::sys::ServiceProviderPtr agent_services;
-    component_context_->ConnectToAgent(kClipboardAgentUrl,
-                                       agent_services.NewRequest(),
-                                       agent_controller_.NewRequest());
-    component::ConnectToService(agent_services.get(), clipboard_.NewRequest());
-  }
-
-  modular::ModuleHost* const module_host_;
-  fuchsia::modular::AgentControllerPtr agent_controller_;
-  fuchsia::modular::ClipboardPtr clipboard_;
-  fuchsia::modular::ComponentContextPtr component_context_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/clipboard/defs.h b/tests/clipboard/defs.h
deleted file mode 100644
index a073220..0000000
--- a/tests/clipboard/defs.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_CLIPBOARD_DEFS_H_
-#define PERIDOT_TESTS_CLIPBOARD_DEFS_H_
-
-namespace {
-
-// The url of the clipboard agent under test.
-constexpr char kClipboardAgentUrl[] =
-    "fuchsia-pkg://fuchsia.com/clipboard_agent#meta/clipboard_agent.cmx";
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_CLIPBOARD_DEFS_H_
diff --git a/tests/clipboard/meta/clipboard_test_module.cmx b/tests/clipboard/meta/clipboard_test_module.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/clipboard/meta/clipboard_test_module.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/common/BUILD.gn b/tests/common/BUILD.gn
deleted file mode 100644
index 4e8ad87..0000000
--- a/tests/common/BUILD.gn
+++ /dev/null
@@ -1,102 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/package.gni")
-import("//peridot/build/module_manifest.gni")
-
-group("common") {
-  testonly = true
-
-  public_deps = [
-    ":common_active_module_bin",
-    ":common_null_module_bin",
-  ]
-}
-
-executable("common_null_module_bin") {
-  testonly = true
-
-  output_name = "common_null_module"
-
-  sources = [
-    "common_null_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-package("common_null_module") {
-  testonly = true
-
-  deps = [
-    ":common_null_module_bin",
-  ]
-
-  binary = "common_null_module"
-
-  meta = [
-    {
-      path = "common_null_module.cmx"
-      dest = "common_null_module.cmx"
-    },
-  ]
-}
-
-executable("common_active_module_bin") {
-  testonly = true
-
-  output_name = "common_active_module"
-
-  sources = [
-    "common_active_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-package("common_active_module") {
-  testonly = true
-
-  deps = [
-    ":common_active_module_bin",
-  ]
-
-  binary = "common_active_module"
-
-  meta = [
-    {
-      path = "common_active_module.cmx"
-      dest = "common_active_module.cmx"
-    },
-  ]
-}
-
-initial_module_packages("common_module_index") {
-  packages = [
-    "common_active_module",
-    "common_null_module",
-  ]
-}
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
diff --git a/tests/common/README.md b/tests/common/README.md
deleted file mode 100644
index de8a566..0000000
--- a/tests/common/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# common
-
-This directory contains components and configuration that are used by multiple
-integration tests.
-
-Specifically, there is a module `NullModule` which doesn't do anything and just
-sits there.
-
-It is deployed as its own package and has a module manifest in its package. It
-is added to the configuration of the `fuchsia::modular::ModuleResolver` so it can be started by an
-`fuchsia::modular::Intent`.
diff --git a/tests/common/common_active_module.cc b/tests/common/common_active_module.cc
deleted file mode 100644
index 63f0a1f..0000000
--- a/tests/common/common_active_module.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <lib/fxl/tasks/task_runner.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-// The ActiveModule issues Active() calls until it's terminated.
-class ActiveModule {
- public:
-  TestPoint initialized_{"Active module initialized"};
-
-  ActiveModule(modular::ModuleHost* const module_host,
-               fidl::InterfaceRequest<
-                   fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_host_(module_host), weak_ptr_factory_(this) {
-    modular::testing::Init(module_host_->startup_context(), __FILE__);
-    initialized_.Pass();
-    Signal(kCommonActiveModuleStarted);
-
-    ScheduleActive();
-  }
-
-  ActiveModule(
-      modular::ModuleHost* const module_host,
-      fidl::InterfaceRequest<
-          fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : ActiveModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  void ScheduleActive() {
-    async::PostDelayedTask(async_get_default_dispatcher(),
-                           [this, weak_this = weak_ptr_factory_.GetWeakPtr()] {
-                             if (!weak_this) {
-                               return;
-                             }
-                             module_host_->module_context()->Active();
-                             Signal(kCommonActiveModuleOngoing);
-                             ScheduleActive();
-                           },
-                           zx::duration(ZX_SEC(1)));
-  }
-
-  // Called by ModuleDriver.
-  TestPoint stopped_{"Active module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    Signal(kCommonActiveModuleStopped);
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  modular::ModuleHost* const module_host_;
-  fxl::WeakPtrFactory<ActiveModule> weak_ptr_factory_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(ActiveModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<ActiveModule> driver(context.get(),
-                                             [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/common/common_active_module.cmx b/tests/common/common_active_module.cmx
deleted file mode 100644
index 44b48d2..0000000
--- a/tests/common/common_active_module.cmx
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "program": {
-      "binary": "bin/app"
-    },
-    "sandbox": {
-      "services": [
-        "fuchsia.modular.ComponentContext",
-        "fuchsia.modular.ModuleContext",
-        "fuchsia.testing.runner.TestRunner",
-        "fuchsia.testing.runner.TestRunnerStore"
-      ]
-    },
-    "facets": {
-        "fuchsia.module": {
-            "@version": 2,
-            "intent_filters": [
-                {
-                    "action": "com.google.fuchsia.common.active",
-                    "parameters": []
-                }
-            ],
-            "suggestion_headline": "Active module"
-        }
-    }
-}
diff --git a/tests/common/common_null_module.cc b/tests/common/common_null_module.cc
deleted file mode 100644
index c406863..0000000
--- a/tests/common/common_null_module.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-// The NullModule just sits there and does nothing until it's terminated.
-class NullModule {
- public:
-  NullModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>
-                 view_provider_request)
-      : module_host_(module_host),
-        app_view_provider_(std::move(view_provider_request)) {
-    modular::testing::Init(module_host_->startup_context(), __FILE__);
-    initialized_.Pass();
-    Signal(kCommonNullModuleStarted);
-  }
-
-  NullModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-                 view_provider_request)
-      : NullModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {
-    viewsv1_view_provider_ = std::move(view_provider_request);
-  }
-
-  // Called by ModuleDriver.
-  void Terminate(const std::function<void()>& done) {
-    Signal(kCommonNullModuleStopped);
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  TestPoint initialized_{"Null module initialized"};
-  TestPoint stopped_{"Null module stopped"};
-
-  modular::ModuleHost* const module_host_;
-  // We keep the view provider around so that story shell can hold a view for
-  // us, but don't do anything with it.
-  fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-      viewsv1_view_provider_;
-  fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider> app_view_provider_;
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<NullModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/common/common_null_module.cmx b/tests/common/common_null_module.cmx
deleted file mode 100644
index 0a98241..0000000
--- a/tests/common/common_null_module.cmx
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-    "program": {
-      "binary": "bin/app"
-    },
-    "sandbox": {
-      "services": [
-        "fuchsia.modular.ComponentContext",
-        "fuchsia.modular.ModuleContext",
-        "fuchsia.testing.runner.TestRunner",
-        "fuchsia.testing.runner.TestRunnerStore"
-      ]
-    },
-    "facets": {
-        "fuchsia.module": {
-            "@version": 2,
-            "binary": "bin/app",
-            "composition_pattern": "ticker",
-            "intent_filters": [
-                {
-                    "action": "com.google.fuchsia.common.null",
-                    "parameters": []
-                }
-            ],
-            "suggestion_headline": "Null module"
-        }
-    }
-}
diff --git a/tests/common/defs.h b/tests/common/defs.h
deleted file mode 100644
index 12ec49d..0000000
--- a/tests/common/defs.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_COMMON_DEFS_H_
-#define PERIDOT_TESTS_COMMON_DEFS_H_
-
-namespace {
-
-constexpr char kCommonNullModule[] =
-    "fuchsia-pkg://fuchsia.com/common_null_module#meta/common_null_module.cmx";
-constexpr char kCommonNullAction[] = "com.google.fuchsia.common.null";
-
-constexpr char kCommonNullModuleStarted[] = "common_null_module_started";
-constexpr char kCommonNullModuleStopped[] = "common_null_module_stopped";
-
-constexpr char kCommonActiveModule[] =
-    "fuchsia-pkg://fuchsia.com/common_active_module#meta/common_active_module.cmx";
-constexpr char kCommonActiveAction[] = "com.google.fuchsia.common.active";
-
-constexpr char kCommonActiveModuleStarted[] = "common_active_module_started";
-constexpr char kCommonActiveModuleOngoing[] = "common_active_module_ongoing";
-constexpr char kCommonActiveModuleStopped[] = "common_active_module_stopped";
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_COMMON_DEFS_H_
diff --git a/tests/component_context/BUILD.gn b/tests/component_context/BUILD.gn
deleted file mode 100644
index 66c9fd5..0000000
--- a/tests/component_context/BUILD.gn
+++ /dev/null
@@ -1,127 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-import("//peridot/build/executable_package.gni")
-
-executable_package("component_context_test_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/component_context_test_module.cmx"
-      dest = "component_context_test_module.cmx"
-    },
-  ]
-
-  sources = [
-    "component_context_test_module.cc",
-  ]
-
-  deps = [
-    ":component_context_test_service",
-    ":defs",
-    "//garnet/public/lib/callback",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/public/lib/message_queue/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("component_context_test_one_agent") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/component_context_test_one_agent.cmx"
-      dest = "component_context_test_one_agent.cmx"
-    },
-  ]
-
-  sources = [
-    "component_context_test_one_agent.cc",
-  ]
-
-  deps = [
-    ":component_context_test_service",
-    ":defs",
-    "//garnet/public/lib/fsl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:agent_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/public/lib/message_queue/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("component_context_test_two_agent") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/component_context_test_two_agent.cmx"
-      dest = "component_context_test_two_agent.cmx"
-    },
-  ]
-
-  sources = [
-    "component_context_test_two_agent.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:agent_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("component_context_test_unstoppable_agent") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/component_context_test_unstoppable_agent.cmx"
-      dest = "component_context_test_unstoppable_agent.cmx"
-    },
-  ]
-
-  sources = [
-    "component_context_test_unstoppable_agent.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:agent_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-fidl("component_context_test_service") {
-  testonly = true
-  cpp_legacy_callbacks = true
-
-  name = "test.peridot.tests.componentcontext"
-
-  sources = [
-    "component_context_test_service.fidl",
-  ]
-}
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
diff --git a/tests/component_context/README.md b/tests/component_context/README.md
deleted file mode 100644
index 136d185..0000000
--- a/tests/component_context/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# component_context integration test
-
-The purpose of `fuchsia::modular::ComponentContext` is mainly to expose APIs that lets clients
-interact with Agents.
-
-This test exercises the APIs used to connect with Agents, influence their
-life cycle, and use their services.
diff --git a/tests/component_context/component_context_test_module.cc b/tests/component_context/component_context_test_module.cc
deleted file mode 100644
index 11f0e2f..0000000
--- a/tests/component_context/component_context_test_module.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <lib/message_queue/cpp/message_queue_client.h>
-#include <test/peridot/tests/componentcontext/cpp/fidl.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/component_context/defs.h"
-
-using ::modular::testing::Await;
-using ::modular::testing::Signal;
-using ::modular::testing::TestPoint;
-using ::test::peridot::tests::componentcontext::ComponentContextTestServicePtr;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestPoint initialized_{"Root module initialized"};
-
-  TestModule(modular::ModuleHost* module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : weak_ptr_factory_(this) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-
-    initialized_.Pass();
-
-    // Exercise fuchsia::modular::ComponentContext.ConnectToAgent()
-    module_host->module_context()->GetComponentContext(
-        component_context_.NewRequest());
-
-    fuchsia::sys::ServiceProviderPtr one_agent_services;
-    component_context_->ConnectToAgent(kOneAgentUrl,
-                                       one_agent_services.NewRequest(),
-                                       one_agent_controller.NewRequest());
-    component::ConnectToService(one_agent_services.get(),
-                                one_agent_interface_.NewRequest());
-
-    TestAgentConnected();
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  // Called by ModuleDriver.
-  TestPoint stopped_{"Root module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  TestPoint one_agent_connected_{"One agent accepted connection"};
-
-  void TestAgentConnected() {
-    Await("one_agent_connected", [this] {
-                                   FXL_LOG(INFO) << "TestModule One Agent Connected";
-                                   one_agent_connected_.Pass();
-                                   TestMessageQueue();
-                               });
-  }
-
-  TestPoint msg_queue_communicated_{
-      "Communicated message between Agent one using a MessageQueue"};
-
-  // Tests message queues.
-  void TestMessageQueue() {
-    constexpr char kTestMessage[] = "test message!";
-
-    component_context_->ObtainMessageQueue("root_msg_queue",
-                                           msg_queue_.NewRequest());
-
-    // MessageQueueManager shouldn't send us anything just yet.
-    msg_queue_.RegisterReceiver(
-        [this, kTestMessage](const std::string& msg,
-                             fit::function<void()> ack) {
-          ack();
-          // We only want one message.
-          msg_queue_.RegisterReceiver(nullptr);
-
-          if (msg == kTestMessage) {
-            msg_queue_communicated_.Pass();
-          }
-          TestAgentController();
-        });
-
-    msg_queue_.GetToken([this, kTestMessage](const fidl::StringPtr& token) {
-      one_agent_interface_->SendToMessageQueue(token, kTestMessage);
-    });
-  }
-
-  TestPoint one_agent_stopped_{"One agent stopped"};
-
-  // Tests fuchsia::modular::AgentController. Calls |done_cb| when completed
-  // successfully.
-  void TestAgentController() {
-    // Closing the agent controller should trigger the agent to stop.
-    one_agent_controller.Unbind();
-
-    Await("one_agent_stopped", [this] {
-      one_agent_stopped_.Pass();
-      TestUnstoppableAgent();
-    });
-  }
-
-  // Start an agent that will not stop of its own accord.
-  void TestUnstoppableAgent() {
-    fuchsia::sys::ServiceProviderPtr unstoppable_agent_services;
-    component_context_->ConnectToAgent(
-        kUnstoppableAgent, unstoppable_agent_services.NewRequest(),
-        unstoppable_agent_controller_.NewRequest());
-
-    // After 500ms close the fuchsia::modular::AgentController for the
-    // unstoppable agent.
-    // TODO(jimbe) We don't check if the agent started running in the allotted
-    // time, so this test isn't reliable. We need to make a call to the agent
-    // and wait for a response.
-    async::PostDelayedTask(
-        async_get_default_dispatcher(),
-        callback::MakeScoped(weak_ptr_factory_.GetWeakPtr(),
-                             [this] {
-                               unstoppable_agent_controller_.Unbind();
-                               Signal(modular::testing::kTestShutdown);
-                             }),
-        zx::msec(500));
-  }
-
-  fuchsia::modular::AgentControllerPtr one_agent_controller;
-  ComponentContextTestServicePtr one_agent_interface_;
-  fuchsia::modular::ComponentContextPtr component_context_;
-  modular::MessageQueueClient msg_queue_;
-
-  fuchsia::modular::AgentControllerPtr unstoppable_agent_controller_;
-
-  fxl::WeakPtrFactory<TestModule> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/component_context/component_context_test_one_agent.cc b/tests/component_context/component_context_test_one_agent.cc
deleted file mode 100644
index e9dcc4b..0000000
--- a/tests/component_context/component_context_test_one_agent.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/agent_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fxl/logging.h>
-#include <lib/message_queue/cpp/message_sender_client.h>
-#include <test/peridot/tests/componentcontext/cpp/fidl.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/component_context/defs.h"
-
-using ::modular::testing::Await;
-using ::modular::testing::Signal;
-using ::modular::testing::TestPoint;
-using ::test::peridot::tests::componentcontext::ComponentContextTestService;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestApp : ComponentContextTestService {
- public:
-  TestApp(modular::AgentHost* const agent_host) {
-    modular::testing::Init(agent_host->startup_context(), __FILE__);
-    agent_host->agent_context()->GetComponentContext(
-        component_context_.NewRequest());
-    agent_services_.AddService<ComponentContextTestService>(
-        [this](fidl::InterfaceRequest<ComponentContextTestService> request) {
-          agent_interface_.AddBinding(this, std::move(request));
-        });
-
-    // Connecting to the agent should start it up.
-    fuchsia::sys::ServiceProviderPtr agent_services;
-    component_context_->ConnectToAgent(kTwoAgentUrl,
-                                       agent_services.NewRequest(),
-                                       two_agent_controller_.NewRequest());
-  }
-
-  // Called by AgentDriver.
-  void Connect(fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> request) {
-    agent_services_.AddBinding(std::move(request));
-    Signal("one_agent_connected");
-  }
-
-  // Called by AgentDriver.
-  void RunTask(const fidl::StringPtr& /*task_id*/,
-               const std::function<void()>& /*callback*/) {}
-
-  TestPoint two_agent_connected_{"Two agent accepted connection"};
-
-  // Called by AgentDriver.
-  void Terminate(const std::function<void()>& done) {
-    FXL_LOG(INFO) << "TestOneAgent::Terminate()";
-    // Before reporting that we stop, we wait until two_agent has connected.
-    Await("two_agent_connected", [this, done] {
-          FXL_LOG(INFO) << "TestOneAgent::Terminate() GET";
-          // Killing the agent controller should stop it.
-          two_agent_controller_.Unbind();
-          two_agent_connected_.Pass();
-          Signal("one_agent_stopped");
-          modular::testing::Done(done);
-        });
-  }
-
- private:
-  // |Agent1Interface|
-  void SendToMessageQueue(std::string message_queue_token,
-                          std::string message_to_send) override {
-    modular::MessageSenderClient message_sender;
-    component_context_->GetMessageSender(message_queue_token,
-                                         message_sender.NewRequest());
-    message_sender.Send(message_to_send);
-  }
-
-  fuchsia::modular::ComponentContextPtr component_context_;
-  fuchsia::modular::AgentControllerPtr two_agent_controller_;
-
-  component::ServiceNamespace agent_services_;
-  fidl::BindingSet<ComponentContextTestService> agent_interface_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AgentDriver<TestApp> driver(context.get(), [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/component_context/component_context_test_service.fidl b/tests/component_context/component_context_test_service.fidl
deleted file mode 100644
index 9e4aedb..0000000
--- a/tests/component_context/component_context_test_service.fidl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library test.peridot.tests.componentcontext;
-
-// An interface implemented by component_context_test_one_agent.cc which the
-// root module uses.
-//
-// Cf. README.md for what this test does and how.
-[Discoverable]
-interface ComponentContextTestService {
-    // Send |message_to_send| to the message queue backed by
-    // |message_queue_token|.
-    1: SendToMessageQueue(string message_queue_token, string message_to_send);
-};
diff --git a/tests/component_context/component_context_test_two_agent.cc b/tests/component_context/component_context_test_two_agent.cc
deleted file mode 100644
index ffc24e9..0000000
--- a/tests/component_context/component_context_test_two_agent.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/agent_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/component_context/defs.h"
-
-using ::modular::testing::Signal;
-using ::modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestApp {
- public:
-  TestApp(modular::AgentHost* const agent_host) {
-    modular::testing::Init(agent_host->startup_context(), __FILE__);
-  }
-
-  // Called by AgentDriver.
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> /*services*/) {
-    Signal("two_agent_connected");
-  }
-
-  // Called by AgentDriver.
-  void RunTask(fidl::StringPtr /*task_id*/,
-               const std::function<void()>& /*callback*/) {}
-
-  TestPoint terminate_called_{"Terminate() called."};
-
-  // Called by AgentDriver.
-  void Terminate(const std::function<void()>& done) {
-    terminate_called_.Pass();
-    modular::testing::Done(done);
-  }
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AgentDriver<TestApp> driver(context.get(), [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/component_context/component_context_test_unstoppable_agent.cc b/tests/component_context/component_context_test_unstoppable_agent.cc
deleted file mode 100644
index e0175dd..0000000
--- a/tests/component_context/component_context_test_unstoppable_agent.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/agent_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fxl/logging.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/component_context/defs.h"
-
-using ::modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestApp {
- public:
-  TestPoint initialized_{"Unstoppable agent initialized"};
-
-  TestApp(modular::AgentHost* agent_host) {
-    modular::testing::Init(agent_host->startup_context(), __FILE__);
-    agent_host->agent_context()->GetComponentContext(
-        component_context_.NewRequest());
-    initialized_.Pass();
-  }
-
-  // Called by AgentDriver.
-  void Connect(
-      fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> /*services*/) {}
-
-  // Called by AgentDriver.
-  void RunTask(fidl::StringPtr /*task_id*/,
-               const std::function<void()>& /*callback*/) {}
-
-  TestPoint stopped_{"Unstoppable agent stopped"};
-
-  // Called by AgentDriver.
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  fuchsia::modular::AgentContextPtr agent_context_;
-  fuchsia::modular::ComponentContextPtr component_context_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AgentDriver<TestApp> driver(context.get(), [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/component_context/defs.h b/tests/component_context/defs.h
deleted file mode 100644
index f2f11c5..0000000
--- a/tests/component_context/defs.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_COMPONENT_CONTEXT_DEFS_H_
-#define PERIDOT_TESTS_COMPONENT_CONTEXT_DEFS_H_
-
-namespace {
-
-// Package URLs of the test components used here.
-constexpr char kOneAgentUrl[] =
-    "fuchsia-pkg://fuchsia.com/component_context_test_one_agent#meta/component_context_test_one_agent.cmx";
-constexpr char kUnstoppableAgent[] =
-    "fuchsia-pkg://fuchsia.com/component_context_test_unstoppable_agent#meta/component_context_test_unstoppable_agent.cmx";
-constexpr char kTwoAgentUrl[] =
-    "fuchsia-pkg://fuchsia.com/component_context_test_two_agent#meta/component_context_test_two_agent.cmx";
-
-constexpr int kTotalSimultaneousTests = 2;
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_COMPONENT_CONTEXT_DEFS_H_
diff --git a/tests/component_context/meta/component_context_test_module.cmx b/tests/component_context/meta/component_context_test_module.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/component_context/meta/component_context_test_module.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/component_context/meta/component_context_test_one_agent.cmx b/tests/component_context/meta/component_context_test_one_agent.cmx
deleted file mode 100644
index 12bf3ba..0000000
--- a/tests/component_context/meta/component_context_test_one_agent.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.AgentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/component_context/meta/component_context_test_two_agent.cmx b/tests/component_context/meta/component_context_test_two_agent.cmx
deleted file mode 100644
index 12bf3ba..0000000
--- a/tests/component_context/meta/component_context_test_two_agent.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.AgentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/component_context/meta/component_context_test_unstoppable_agent.cmx b/tests/component_context/meta/component_context_test_unstoppable_agent.cmx
deleted file mode 100644
index 12bf3ba..0000000
--- a/tests/component_context/meta/component_context_test_unstoppable_agent.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.AgentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/embed_shell/BUILD.gn b/tests/embed_shell/BUILD.gn
deleted file mode 100644
index 9ad1c6e..0000000
--- a/tests/embed_shell/BUILD.gn
+++ /dev/null
@@ -1,122 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
-
-executable_package("embed_shell_test_child_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/embed_shell_test_child_module.cmx"
-      dest = "embed_shell_test_child_module.cmx"
-    },
-  ]
-
-  sources = [
-    "embed_shell_test_child_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("embed_shell_test_session_shell") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/embed_shell_test_session_shell.cmx"
-      dest = "embed_shell_test_session_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "embed_shell_test_session_shell.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/callback",
-    "//peridot/lib/testing:component_main",
-    "//peridot/lib/testing:session_shell_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("embed_shell_test_parent_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/embed_shell_test_parent_module.cmx"
-      dest = "embed_shell_test_parent_module.cmx"
-    },
-  ]
-
-  sources = [
-    "embed_shell_test_parent_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/callback",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("embed_shell_test_story_shell") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/embed_shell_test_story_shell.cmx"
-      dest = "embed_shell_test_story_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "embed_shell_test_story_shell.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:component_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
diff --git a/tests/embed_shell/README.md b/tests/embed_shell/README.md
deleted file mode 100644
index 4e37d06..0000000
--- a/tests/embed_shell/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# embed_shell integration test
-
-This test executes the interaction of embedding modules with the story shell.
-
-Modules can start other modules. They can do this either by *embedding* the view
-of the other module into their own view, or by instructing the story runner to
-send the view of the newly started module to the story shell. In that case, the
-story shell is supplied with the view of the started module, an ID for it, the
-ID of the view of the parent module, and the *surface relationship* of the new
-module to its parent module. This information is used to layout the views of the
-modules and provide navigation between them.
-
-A subtlety arises when module one embeds module two, which starts module three,
-but in the story shell. In that case, the story shell doesn't know about the
-direct parent of module three, because it's embedded and its view is not sent to
-the story shell. Instead, module one must be used as the display parent module
-declared to the story shell for the view of module three.
-
-This test executes that behavior. In this test, we use the following concrete
-module implementations:
-
-    * *one*: `embed_shell_test_parent_module`
-    * *two*: `embed_shell_test_child_module`
-    * *three*: `common_null_module`
-
diff --git a/tests/embed_shell/defs.h b/tests/embed_shell/defs.h
deleted file mode 100644
index 3cd0c37..0000000
--- a/tests/embed_shell/defs.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_EMBED_SHELL_DEFS_H_
-#define PERIDOT_TESTS_EMBED_SHELL_DEFS_H_
-
-namespace {
-
-constexpr char kStoryName[] = "story";
-
-constexpr char kChildModuleName[] = "child";
-
-// Package URLs of the test components used here.
-constexpr char kChildModuleUrl[] =
-    "fuchsia-pkg://fuchsia.com/embed_shell_test_child_module#meta/"
-    "embed_shell_test_child_module.cmx";
-
-constexpr char kParentModuleUrl[] =
-    "fuchsia-pkg://fuchsia.com/embed_shell_test_parent_module#meta/"
-    "embed_shell_test_parent_module.cmx";
-
-constexpr char kParentModuleAction[] = "action";
-constexpr char kChildModuleAction[] = "action";
-
-constexpr char kParentModuleDoneSignal[] = "parent_module_done";
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_EMBED_SHELL_DEFS_H_
diff --git a/tests/embed_shell/embed_shell_test_child_module.cc b/tests/embed_shell/embed_shell_test_child_module.cc
deleted file mode 100644
index fc77731..0000000
--- a/tests/embed_shell/embed_shell_test_child_module.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/embed_shell/defs.h"
-
-using modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>
-                 view_provider_request)
-      : module_host_(module_host),
-        app_view_provider_(std::move(view_provider_request)) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    StartChildModule();
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-                 view_provider_request)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {
-    views1_view_provider_ = std::move(view_provider_request);
-  }
-
-  // Called from ModuleDriver.
-  void Terminate(const std::function<void()>& done) {
-    modular::testing::Done(done);
-  }
-
- private:
-  void StartChildModule() {
-    child_module_.events().OnStateChange =
-        [this](fuchsia::modular::ModuleState new_state) {
-          OnStateChange(std::move(new_state));
-        };
-
-    fuchsia::modular::Intent intent;
-    intent.handler = kCommonNullModule;
-    intent.action = kCommonNullAction;
-    module_host_->module_context()->AddModuleToStory(
-        kChildModuleName, std::move(intent), child_module_.NewRequest(),
-        nullptr /* surface_relation */,
-        [](const fuchsia::modular::StartModuleStatus) {});
-  }
-
-  void OnStateChange(fuchsia::modular::ModuleState state) {
-    if (state == fuchsia::modular::ModuleState::RUNNING) {
-      modular::testing::GetStore()->Put("child_module_done", "1", [] {});
-    }
-  }
-
-  modular::ModuleHost* const module_host_;
-
-  // We keep the view provider around so that story shell can hold a view for
-  // us, but don't do anything with it.
-  fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-      views1_view_provider_;
-  fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider> app_view_provider_;
-
-  fuchsia::modular::ModuleControllerPtr child_module_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/embed_shell/embed_shell_test_parent_module.cc b/tests/embed_shell/embed_shell_test_parent_module.cc
deleted file mode 100644
index d1dbcee..0000000
--- a/tests/embed_shell/embed_shell_test_parent_module.cc
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/embed_shell/defs.h"
-
-using modular::testing::Await;
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>
-                 view_provider_request)
-      : module_host_(module_host),
-        app_view_provider_(std::move(view_provider_request)) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    ScheduleDone();
-    StartChildModule();
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-                 view_provider_request)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {
-    views1_view_provider_ = std::move(view_provider_request);
-  }
-
-  void Terminate(const std::function<void()>& done) {
-    modular::testing::Done(done);
-  }
-
- private:
-  void ScheduleDone() {
-    auto check = [this, done = std::make_shared<int>(0)] {
-      ++*done;
-      if (*done == 2) {
-        Signal(kParentModuleDoneSignal);
-      }
-    };
-
-    Await("story_shell_done", check);
-    Await("child_module_done", check);
-  }
-
-  void StartChildModule() {
-    fuchsia::modular::Intent intent;
-    intent.action = kChildModuleAction;
-    intent.handler = kChildModuleUrl;
-    FXL_LOG(INFO) << "Starting child module = " << intent.handler;
-    module_host_->module_context()->EmbedModule(
-        kChildModuleName, std::move(intent), child_module_.NewRequest(),
-        child_view_.NewRequest(),
-        [](const fuchsia::modular::StartModuleStatus status) {
-          FXL_LOG(INFO) << "StartModuleStatus="
-                        << static_cast<uint32_t>(status);
-        });
-  }
-
-  modular::ModuleHost* const module_host_;
-  fuchsia::modular::ModuleControllerPtr child_module_;
-  fuchsia::ui::viewsv1token::ViewOwnerPtr child_view_;
-
-  // We keep the view provider around so that story shell can hold a view for
-  // us, but don't do anything with it.
-  fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-      views1_view_provider_;
-  fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider> app_view_provider_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  FXL_LOG(INFO) << "embed_shell_test_parent_module";
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/embed_shell/embed_shell_test_session_shell.cc b/tests/embed_shell/embed_shell_test_session_shell.cc
deleted file mode 100644
index c5a2c4c..0000000
--- a/tests/embed_shell/embed_shell_test_session_shell.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/testing/component_main.h"
-#include "peridot/lib/testing/session_shell_base.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/embed_shell/defs.h"
-
-using modular::testing::Await;
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does in general and how. The test cases are
-// described in detail in comments below.
-class TestApp : public modular::testing::SessionShellBase {
- public:
-  explicit TestApp(component::StartupContext* const startup_context)
-      : SessionShellBase(startup_context) {
-    TestInit(__FILE__);
-
-    startup_context->ConnectToEnvironmentService(puppet_master_.NewRequest());
-
-    TestParentChild();
-  }
-
-  ~TestApp() override = default;
-
- private:
-  void TestParentChild() {
-    puppet_master_->ControlStory(kStoryName, story_puppet_master_.NewRequest());
-
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("root");
-    add_mod.intent.handler = kParentModuleUrl;
-    add_mod.intent.action = kParentModuleAction;
-    add_mod.intent.parameters =
-        fidl::VectorPtr<fuchsia::modular::IntentParameter>::New(0);
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    commands.push_back(std::move(command));
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          story_provider()->GetController(kStoryName,
-                                          story_controller_.NewRequest());
-          fidl::InterfaceHandle<fuchsia::ui::viewsv1token::ViewOwner>
-              root_module_view;
-          story_controller_->RequestStart();
-        });
-
-    Await(kParentModuleDoneSignal, [this] {
-      story_controller_->Stop([this] { TestModuleReinflation(); });
-    });
-  }
-
-  TestPoint modules_reinflated_correctly_{"Modules reinfated correctly"};
-  // Test that embedded modules are not reinflated.
-  void TestModuleReinflation() {
-    story_controller_->RequestStart();
-    story_controller_->GetActiveModules(
-        [this](std::vector<fuchsia::modular::ModuleData> active_modules) {
-          size_t num_embedded_mods = 0u;
-          for (const fuchsia::modular::ModuleData& mod : active_modules) {
-            num_embedded_mods += mod.is_embedded;
-          }
-          if (num_embedded_mods == 0 && active_modules.size() == 2u) {
-            modules_reinflated_correctly_.Pass();
-          }
-          Await(kParentModuleDoneSignal, [this] { Logout(); });
-        });
-  }
-
-  void Logout() { Signal(modular::testing::kTestShutdown); }
-
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-  fuchsia::modular::StoryControllerPtr story_controller_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int argc, const char** argv) {
-  auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  modular::testing::ComponentMain<TestApp>();
-  return 0;
-}
diff --git a/tests/embed_shell/embed_shell_test_story_shell.cc b/tests/embed_shell/embed_shell_test_story_shell.cc
deleted file mode 100644
index 98aff2c..0000000
--- a/tests/embed_shell/embed_shell_test_story_shell.cc
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Implementation of the fuchsia::modular::StoryShell service that just lays out
-// the views of all modules side by side.
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/testing/component_base.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/embed_shell/defs.h"
-
-using modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestApp
-    : public modular::testing::ComponentBase<fuchsia::modular::StoryShell> {
- public:
-  TestApp(component::StartupContext* const startup_context)
-      : ComponentBase(startup_context) {
-    TestInit(__FILE__);
-  }
-
-  ~TestApp() override = default;
-
- private:
-  // |fuchsia::modular::StoryShell|
-  void Initialize(fidl::InterfaceHandle<fuchsia::modular::StoryShellContext>
-                      story_shell_context) override {
-    story_shell_context_.Bind(std::move(story_shell_context));
-  }
-
-  TestPoint add_surface_{"AddSurface root:child:child root"};
-
-  // |fuchsia::modular::StoryShell|
-  void AddSurface(fuchsia::modular::ViewConnection view_connection,
-                  fuchsia::modular::SurfaceInfo surface_info) override {
-    FXL_LOG(INFO) << "surface_id=" << view_connection.surface_id
-                  << ", anchor_id=" << surface_info.parent_id;
-    if (view_connection.surface_id == "root:child:child" &&
-        surface_info.parent_id == "root") {
-      add_surface_.Pass();
-      modular::testing::GetStore()->Put("story_shell_done", "1", [] {});
-    } else {
-      FXL_LOG(WARNING) << "AddView " << view_connection.surface_id << " anchor "
-                       << surface_info.parent_id;
-    }
-  }
-
-  // |fuchsia::modular::StoryShell|
-  void FocusSurface(std::string /*surface_id*/) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void DefocusSurface(std::string /*surface_id*/,
-                      DefocusSurfaceCallback callback) override {
-    callback();
-  }
-
-  // |fuchsia::modular::StoryShell|
-  void AddContainer(
-      std::string /*container_name*/, fidl::StringPtr /*parent_id*/,
-      fuchsia::modular::SurfaceRelation /*relation*/,
-      std::vector<fuchsia::modular::ContainerLayout> /*layout*/,
-      std::vector<fuchsia::modular::ContainerRelationEntry> /* relationships */,
-      std::vector<fuchsia::modular::ContainerView> /* views */) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void RemoveSurface(std::string /*surface_id*/) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void ReconnectView(
-      fuchsia::modular::ViewConnection view_connection) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void UpdateSurface(fuchsia::modular::ViewConnection view_connection,
-                     fuchsia::modular::SurfaceInfo /*surface_info*/) override{};
-
-  fuchsia::modular::StoryShellContextPtr story_shell_context_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /* argc */, const char** /* argv */) {
-  FXL_LOG(INFO) << "Embed Story Shell main";
-  modular::testing::ComponentMain<TestApp>();
-  return 0;
-}
diff --git a/tests/embed_shell/meta/embed_shell_test_child_module.cmx b/tests/embed_shell/meta/embed_shell_test_child_module.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/embed_shell/meta/embed_shell_test_child_module.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/embed_shell/meta/embed_shell_test_parent_module.cmx b/tests/embed_shell/meta/embed_shell_test_parent_module.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/embed_shell/meta/embed_shell_test_parent_module.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/embed_shell/meta/embed_shell_test_session_shell.cmx b/tests/embed_shell/meta/embed_shell_test_session_shell.cmx
deleted file mode 100644
index a2fe1c5..0000000
--- a/tests/embed_shell/meta/embed_shell_test_session_shell.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/embed_shell/meta/embed_shell_test_story_shell.cmx b/tests/embed_shell/meta/embed_shell_test_story_shell.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/embed_shell/meta/embed_shell_test_story_shell.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/intents/BUILD.gn b/tests/intents/BUILD.gn
deleted file mode 100644
index 6f8c2bd..0000000
--- a/tests/intents/BUILD.gn
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
-
-executable_package("intent_test_parent_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/intent_test_parent_module.cmx"
-      dest = "intent_test_parent_module.cmx"
-    },
-  ]
-
-  sources = [
-    "intent_test_parent_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("intent_test_child_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/intent_test_child_module.cmx"
-      dest = "intent_test_child_module.cmx"
-    },
-  ]
-
-  sources = [
-    "intent_test_child_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/callback",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
diff --git a/tests/intents/README.md b/tests/intents/README.md
deleted file mode 100644
index 14957a3..0000000
--- a/tests/intents/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Intents integration test
-
-This test exercises the IntentHandler API. It verifies that modules
-receive intents both when they are started as well as when they are
-running and new intents are received by the framework.
diff --git a/tests/intents/defs.h b/tests/intents/defs.h
deleted file mode 100644
index a527010..0000000
--- a/tests/intents/defs.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_INTENTS_DEFS_H_
-#define PERIDOT_TESTS_INTENTS_DEFS_H_
-
-namespace {
-
-constexpr char kChildModuleName[] = "child";
-
-// Package URLs of the test components used here.
-constexpr char kChildModuleUrl[] =
-    "fuchsia-pkg://fuchsia.com/intent_test_child_module#meta/intent_test_child_module.cmx";
-
-// The action of the intent the parent module issues to the child module.
-constexpr char kChildModuleAction[] = "intent_test_child_module_action";
-
-// The signal which the child module sends when it has received an intent.
-constexpr char kChildModuleHandledIntent[] = "child_module_handled_intent";
-
-// The name of the intent parameter which contains a string which the child
-// module is to append to its signal.
-constexpr char kIntentParameterName[] = "intent_parameter";
-
-// The name of the intent parameter which contains a string which the child
-// module is to append to its signal.
-constexpr char kIntentParameterNameAlternate[] = "intent_parameter_alternate";
-
-constexpr int kTimeoutMilliseconds = 5000;
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_INTENTS_DEFS_H_
diff --git a/tests/intents/intent_test_child_module.cc b/tests/intents/intent_test_child_module.cc
deleted file mode 100644
index 709bb83..0000000
--- a/tests/intents/intent_test_child_module.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/intents/defs.h"
-
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule : fuchsia::modular::IntentHandler {
- public:
-  TestModule(modular::ModuleHost* module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    module_host->startup_context()
-        ->outgoing()
-        .AddPublicService<fuchsia::modular::IntentHandler>(
-            [this](fidl::InterfaceRequest<fuchsia::modular::IntentHandler>
-                       request) {
-              bindings_.AddBinding(this, std::move(request));
-            });
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  // Called from ModuleDriver.
-  void Terminate(const std::function<void()>& done) {
-    modular::testing::Done(done);
-  }
-
- private:
-  // |IntentHandler|
-  void HandleIntent(fuchsia::modular::Intent intent) override {
-    for (const auto& parameter : *intent.parameters) {
-      if (parameter.data.is_json()) {
-        if (parameter.name == kIntentParameterName ||
-            parameter.name == kIntentParameterNameAlternate) {
-          std::string parameter_data;
-          FXL_CHECK(fsl::StringFromVmo(parameter.data.json(), &parameter_data));
-          Signal(kChildModuleHandledIntent + parameter_data);
-        }
-      }
-    }
-  }
-
-  fidl::BindingSet<fuchsia::modular::IntentHandler> bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/intents/intent_test_parent_module.cc b/tests/intents/intent_test_parent_module.cc
deleted file mode 100644
index 10e819a..0000000
--- a/tests/intents/intent_test_parent_module.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/intents/defs.h"
-
-using modular::testing::Await;
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-void StartModuleWithJsonParameter(
-    fuchsia::modular::ModuleContext* const module_context,
-    std::string module_name, std::string parameter_name,
-    std::string parameter_content,
-    fidl::InterfaceRequest<fuchsia::modular::ModuleController> request) {
-  fuchsia::modular::Intent intent;
-  intent.handler = kChildModuleUrl;
-  intent.action = kChildModuleAction;
-
-  {
-    fuchsia::modular::IntentParameter intent_parameter;
-    intent_parameter.name = parameter_name;
-    intent_parameter.data = fuchsia::modular::IntentParameterData();
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(parameter_content, &vmo));
-    intent_parameter.data.set_json(std::move(vmo).ToTransport());
-    intent.parameters.push_back(std::move(intent_parameter));
-  }
-
-  // This tests a null parameter name; it should be excluded from module
-  // resolution altogether.
-  {
-    fuchsia::modular::IntentParameter intent_parameter;
-    intent_parameter.name = nullptr;
-    intent_parameter.data = fuchsia::modular::IntentParameterData();
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(R"("")", &vmo));
-    intent_parameter.data.set_json(std::move(vmo).ToTransport());
-    intent.parameters.push_back(std::move(intent_parameter));
-  }
-
-  module_context->AddModuleToStory(
-      module_name, std::move(intent), std::move(request), nullptr,
-      [](const fuchsia::modular::StartModuleStatus) {});
-}
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestPoint initialized_{"Parent module initialized"};
-  TestModule(modular::ModuleHost* module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_host_(module_host) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    initialized_.Pass();
-    TestStartWithModuleControllerRequest();
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  // Tests that a module which is started with an intent and exposes an intent
-  // handler gets notified of the intent by the framework.
-  TestPoint intent_was_handled_{"First intent was handled"};
-  void TestStartWithModuleControllerRequest() {
-    std::string json = "\"first\"";
-    StartModuleWithJsonParameter(module_host_->module_context(),
-                                 kChildModuleName, kIntentParameterName, json,
-                                 child_module_.NewRequest());
-    Await(kChildModuleHandledIntent + json, [this] {
-      intent_was_handled_.Pass();
-      TestStartSecondIntentSameParameter();
-    });
-  }
-
-  // Tests that a second intent sent to an already running module with the same
-  // parameters but different data notifies the intent handler of the new
-  // intent.
-  TestPoint second_intent_was_handled_{"Second intent was handled"};
-  void TestStartSecondIntentSameParameter() {
-    std::string json = "\"second\"";
-    StartModuleWithJsonParameter(module_host_->module_context(),
-                                 kChildModuleName, kIntentParameterName, json,
-                                 child_module_second_.NewRequest());
-    Await(kChildModuleHandledIntent + json, [this] {
-      second_intent_was_handled_.Pass();
-      TestStartThirdIntentDifferentParameter();
-    });
-  }
-
-  // Tests that a third intent with different parameters is delivered to the
-  // already running intent handler.
-  TestPoint third_intent_was_handled_{"Third intent was handled"};
-  void TestStartThirdIntentDifferentParameter() {
-    std::string json = "\"third\"";
-    StartModuleWithJsonParameter(
-        module_host_->module_context(), kChildModuleName,
-        kIntentParameterNameAlternate, json, child_module_second_.NewRequest());
-    Await(kChildModuleHandledIntent + json, [this] {
-      third_intent_was_handled_.Pass();
-      Signal(modular::testing::kTestShutdown);
-    });
-  }
-
-  // Called by ModuleDriver.
-  TestPoint stopped_{"Parent module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  modular::ModuleHost* module_host_;
-  fuchsia::modular::ModuleControllerPtr child_module_;
-  fuchsia::modular::ModuleControllerPtr child_module_second_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/intents/meta/intent_test_child_module.cmx b/tests/intents/meta/intent_test_child_module.cmx
deleted file mode 100644
index 2bb255c..0000000
--- a/tests/intents/meta/intent_test_child_module.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.BasemgrMonitor",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/intents/meta/intent_test_parent_module.cmx b/tests/intents/meta/intent_test_parent_module.cmx
deleted file mode 100644
index 2bb255c..0000000
--- a/tests/intents/meta/intent_test_parent_module.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.BasemgrMonitor",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/last_focus_time/BUILD.gn b/tests/last_focus_time/BUILD.gn
deleted file mode 100644
index 161e3a9..0000000
--- a/tests/last_focus_time/BUILD.gn
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
-
-executable_package("last_focus_time_test_session_shell") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/last_focus_time_test_session_shell.cmx"
-      dest = "last_focus_time_test_session_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "last_focus_time_test_session_shell.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/common:story_provider_watcher_base",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:component_main",
-    "//peridot/lib/testing:session_shell_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-  ]
-}
diff --git a/tests/last_focus_time/README.md b/tests/last_focus_time/README.md
deleted file mode 100644
index 589476e..0000000
--- a/tests/last_focus_time/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# last_focus_time integration test
-
-The story runner records the time a story was last focused in the user's root
-page as part of `fuchsia::modular::StoryInfo`.
-
-This test verifies that requesting focus for a story indeed increases the
-`last_focus_time` recorded for that story, and triggers the watchers for the
-story.
-
diff --git a/tests/last_focus_time/defs.h b/tests/last_focus_time/defs.h
deleted file mode 100644
index fef6a67..0000000
--- a/tests/last_focus_time/defs.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_LAST_FOCUS_TIME_DEFS_H_
-#define PERIDOT_TESTS_LAST_FOCUS_TIME_DEFS_H_
-
-namespace {
-
-// URLs of the modules used here.
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_LAST_FOCUS_TIME_DEFS_H_
diff --git a/tests/last_focus_time/last_focus_time_test_session_shell.cc b/tests/last_focus_time/last_focus_time_test_session_shell.cc
deleted file mode 100644
index 849df8e..0000000
--- a/tests/last_focus_time/last_focus_time_test_session_shell.cc
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/common/story_provider_watcher_base.h"
-#include "peridot/lib/testing/component_main.h"
-#include "peridot/lib/testing/session_shell_base.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/last_focus_time/defs.h"
-
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-constexpr char kStoryName[] = "story1";
-
-// A simple story provider watcher implementation. It confirms that it sees an
-// increase in the last_focus_time in the fuchsia::modular::StoryInfo it
-// receives, and pushes the test through to the next step.
-class StoryProviderWatcherImpl : public modular::StoryProviderWatcherBase {
- public:
-  StoryProviderWatcherImpl() = default;
-  ~StoryProviderWatcherImpl() override = default;
-
- private:
-  TestPoint last_focus_time_created_{
-      "StoryInfo::last_focus_time increased after create"};
-  TestPoint last_focus_time_focused_{
-      "StoryInfo::last_focus_time increased after focus"};
-
-  // |fuchsia::modular::StoryProviderWatcher|
-  void OnChange(
-      fuchsia::modular::StoryInfo story_info,
-      fuchsia::modular::StoryState story_state,
-      fuchsia::modular::StoryVisibilityState story_visibility_state) override {
-    FXL_CHECK(story_info.last_focus_time >= last_focus_time_);
-    if (story_info.last_focus_time <= last_focus_time_) {
-      return;
-    }
-
-    // Every time we see an increase in last_focus_time, we push the test
-    // sequence forward.
-    //
-    // We expect two last_focus_time transitions:
-    //
-    //   -1 -> 0 on creation of the story.
-    //
-    //   0 -> Y where Y > 0 on focusing the story.
-    //
-    switch (++change_count_) {
-      case 1:
-        if (story_info.last_focus_time == 0) {
-          last_focus_time_created_.Pass();
-        }
-        break;
-      case 2:
-        last_focus_time_focused_.Pass();
-        break;
-      default:
-        FXL_CHECK(change_count_ == 1 || change_count_ == 2);
-        break;
-    }
-
-    last_focus_time_ = story_info.last_focus_time;
-    continue_();
-  }
-
-  int change_count_{};
-  int64_t last_focus_time_{-1};
-};
-
-class StoryWatcherImpl : fuchsia::modular::StoryWatcher {
- public:
-  StoryWatcherImpl() : binding_(this) {}
-  ~StoryWatcherImpl() override = default;
-
-  // Registers itself as a watcher on the given story. Only one story at a time
-  // can be watched.
-  void Watch(fuchsia::modular::StoryController* const story_controller) {
-    story_controller->Watch(binding_.NewBinding());
-  }
-
-  // Deregisters itself from the watched story.
-  void Reset() { binding_.Unbind(); }
-
-  // Sets the function where to continue when the story is observed to be
-  // running.
-  void Continue(std::function<void()> at) { continue_ = at; }
-
- private:
-  // |fuchsia::modular::StoryWatcher|
-  void OnStateChange(fuchsia::modular::StoryState state) override {
-    FXL_LOG(INFO) << "OnStateChange() " << fidl::ToUnderlying(state);
-    if (state != fuchsia::modular::StoryState::RUNNING) {
-      return;
-    }
-
-    continue_();
-  }
-
-  // |fuchsia::modular::StoryWatcher|
-  void OnModuleAdded(fuchsia::modular::ModuleData /*module_data*/) override {}
-
-  // |fuchsia::modular::StoryWatcher|
-  void OnModuleFocused(
-      std::vector<std::string> /*module_path*/) override {}
-
-  fidl::Binding<fuchsia::modular::StoryWatcher> binding_;
-  std::function<void()> continue_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryWatcherImpl);
-};
-
-// A simple focus watcher implementation that invokes a "continue" callback when
-// it sees the next focus change.
-class FocusWatcherImpl : fuchsia::modular::FocusWatcher {
- public:
-  FocusWatcherImpl() : binding_(this) {}
-  ~FocusWatcherImpl() override = default;
-
-  // Registers itself as a watcher on the focus provider.
-  void Watch(fuchsia::modular::FocusProvider* const focus_provider) {
-    focus_provider->Watch(binding_.NewBinding());
-  }
-
-  // Deregisters itself from the watched focus provider.
-  void Reset() { binding_.Unbind(); }
-
- private:
-  // |fuchsia::modular::FocusWatcher|
-  void OnFocusChange(fuchsia::modular::FocusInfoPtr info) override {
-    FXL_LOG(INFO) << "OnFocusChange() " << info->focused_story_id;
-  }
-
-  fidl::Binding<fuchsia::modular::FocusWatcher> binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(FocusWatcherImpl);
-};
-
-// Cf. README.md for what this test does and how.
-class TestApp : public modular::testing::SessionShellBase {
- public:
-  TestApp(component::StartupContext* const startup_context)
-      : SessionShellBase(startup_context) {
-    TestInit(__FILE__);
-
-    startup_context->ConnectToEnvironmentService(puppet_master_.NewRequest());
-    story_provider_watcher_.Watch(story_provider());
-
-    session_shell_context()->GetFocusController(focus_controller_.NewRequest());
-    session_shell_context()->GetFocusProvider(focus_provider_.NewRequest());
-    focus_watcher_.Watch(focus_provider_.get());
-
-    CreateStory();
-  }
-
-  ~TestApp() override = default;
-
- private:
-  TestPoint create_story_{"CreateStory()"};
-
-  void CreateStory() {
-    puppet_master_->ControlStory(kStoryName, story_puppet_master_.NewRequest());
-
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("mod1");
-    add_mod.intent.handler = kCommonNullModule;
-    add_mod.intent.action = kCommonNullAction;
-
-    std::vector<fuchsia::modular::StoryCommand> commands(1);
-    commands.at(0).set_add_mod(std::move(add_mod));
-
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          create_story_.Pass();
-          StartStory();
-        });
-  }
-
-  TestPoint start_story_{"StartStory()"};
-
-  void StartStory() {
-    story_provider()->GetController(kStoryName, story_controller_.NewRequest());
-    story_watcher_.Watch(story_controller_.get());
-
-    // Request start of the new story.
-    story_controller_->RequestStart();
-
-    story_watcher_.Continue([this] {
-      start_story_.Pass();
-      story_watcher_.Reset();
-      Focus();
-    });
-  }
-
-  TestPoint focus_{"Focus()"};
-
-  void Focus() {
-    focus_controller_->Set(kStoryName);
-
-    story_provider_watcher_.Continue([this] {
-      focus_.Pass();
-      story_provider_watcher_.Reset();
-
-      Signal(modular::testing::kTestShutdown);
-    });
-  }
-
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-  StoryProviderWatcherImpl story_provider_watcher_;
-
-  fuchsia::modular::StoryControllerPtr story_controller_;
-  StoryWatcherImpl story_watcher_;
-
-  fuchsia::modular::FocusControllerPtr focus_controller_;
-  fuchsia::modular::FocusProviderPtr focus_provider_;
-  FocusWatcherImpl focus_watcher_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  modular::testing::ComponentMain<TestApp>();
-  return 0;
-}
diff --git a/tests/last_focus_time/meta/last_focus_time_test_session_shell.cmx b/tests/last_focus_time/meta/last_focus_time_test_session_shell.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/last_focus_time/meta/last_focus_time_test_session_shell.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/link_context_entities/BUILD.gn b/tests/link_context_entities/BUILD.gn
deleted file mode 100644
index 736db1f..0000000
--- a/tests/link_context_entities/BUILD.gn
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
-
-executable_package("link_context_entities_test_session_shell") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/link_context_entities_test_session_shell.cmx"
-      dest = "link_context_entities_test_session_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "link_context_entities_test_session_shell.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:single_service_app",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:component_main",
-    "//peridot/lib/testing:session_shell_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/context/cpp:context_helper",
-    "//peridot/public/lib/fostr/fidl/fuchsia.modular",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("link_context_entities_test_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/link_context_entities_test_module.cmx"
-      dest = "link_context_entities_test_module.cmx"
-    },
-  ]
-
-  sources = [
-    "link_context_entities_test_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//peridot/lib/testing:component_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
diff --git a/tests/link_context_entities/README.md b/tests/link_context_entities/README.md
deleted file mode 100644
index 78db09e..0000000
--- a/tests/link_context_entities/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# link_context_entities integration test
-
-This test exercises the machinery that includes link values in the context
-exposed by `ContextService` in the case that the link values contain entities.
diff --git a/tests/link_context_entities/defs.h b/tests/link_context_entities/defs.h
deleted file mode 100644
index d7182a5..0000000
--- a/tests/link_context_entities/defs.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_LINK_CONTEXT_ENTITIES_DEFS_H_
-#define PERIDOT_TESTS_LINK_CONTEXT_ENTITIES_DEFS_H_
-
-namespace {
-
-// Package URLs of the test components used here.
-constexpr char kModuleUrl[] =
-    "fuchsia-pkg://fuchsia.com/link_context_entities_test_module#meta/link_context_entities_test_module.cmx";
-constexpr char kModuleAction[] = "action";
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_LINK_CONTEXT_ENTITIES_DEFS_H_
diff --git a/tests/link_context_entities/link_context_entities_test_module.cc b/tests/link_context_entities/link_context_entities_test_module.cc
deleted file mode 100644
index 3189dc4..0000000
--- a/tests/link_context_entities/link_context_entities_test_module.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/time/time_delta.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/link_context_entities/defs.h"
-
-using modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestPoint initialized_{"Child module initialized"};
-
-  TestModule(modular::ModuleHost* module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    initialized_.Pass();
-    module_host->module_context()->GetLink("link1", link1_.NewRequest());
-    module_host->module_context()->GetLink("link2", link2_.NewRequest());
-    Set1();
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  // Called from ModuleDriver.
-  TestPoint stopped_{"Child module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  void SetLink(fuchsia::modular::Link* link,
-               fidl::VectorPtr<std::string> path,
-               const std::string& value) {
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(value, &vmo));
-    link->Set(std::move(path), std::move(vmo).ToTransport());
-  }
-
-  void Set1() {
-    SetLink(link1_.get(), nullptr, R"({"@type": "type1", "value": "value1"})");
-    SetLink(link2_.get(), nullptr, R"({"@type": "type2", "value": "value2"})");
-    // TODO(thatguy): When we have fuchsia::modular::Entity support in
-    // fuchsia::modular::ContextWriter, create a simple fuchsia::modular::Entity
-    // reference and slap it into the fuchsia::modular::Link.
-  }
-
-  fuchsia::modular::LinkPtr link1_;
-  fuchsia::modular::LinkPtr link2_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/link_context_entities/link_context_entities_test_session_shell.cc b/tests/link_context_entities/link_context_entities_test_session_shell.cc
deleted file mode 100644
index 918d37f..0000000
--- a/tests/link_context_entities/link_context_entities_test_session_shell.cc
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <sstream>
-#include <string>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/context/cpp/context_helper.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fostr/fidl/fuchsia/modular/formatting.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/fidl/array_to_string.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/lib/testing/component_main.h"
-#include "peridot/lib/testing/session_shell_base.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/link_context_entities/defs.h"
-
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-const char kStoryName[] = "story";
-
-// A context reader watcher implementation.
-class ContextListenerImpl : fuchsia::modular::ContextListener {
- public:
-  ContextListenerImpl() : binding_(this) {
-    handler_ = [](const fuchsia::modular::ContextValue&) {};
-  }
-
-  ~ContextListenerImpl() override = default;
-
-  // Registers itself a watcher on the given story provider. Only one story
-  // provider can be watched at a time.
-  void Listen(fuchsia::modular::ContextReader* const context_reader) {
-    // Subscribe to all entity values.
-    fuchsia::modular::ContextSelector selector;
-    selector.type = fuchsia::modular::ContextValueType::ENTITY;
-
-    fuchsia::modular::ContextQuery query;
-    modular::AddToContextQuery(&query, "all", std::move(selector));
-
-    context_reader->Subscribe(std::move(query), binding_.NewBinding());
-    binding_.set_error_handler([](zx_status_t status) {
-      FXL_LOG(ERROR) << "Lost fuchsia::modular::ContextListener connection to "
-                        "fuchsia::modular::ContextReader.";
-    });
-  }
-
-  using Handler = std::function<void(const fuchsia::modular::ContextValue&)>;
-
-  void Handle(const Handler& handler) { handler_ = handler; }
-
-  // Deregisters itself from the watched story provider.
-  void Reset() { binding_.Unbind(); }
-
- private:
-  // |fuchsia::modular::ContextListener|
-  void OnContextUpdate(fuchsia::modular::ContextUpdate update) override {
-    FXL_LOG(INFO) << "ContextListenerImpl::OnUpdate()";
-    if (auto values = modular::TakeContextValue(&update, "all")) {
-      for (const auto& value : *values) {
-        FXL_LOG(INFO) << "ContextListenerImpl::OnUpdate() " << value;
-        handler_(value);
-      }
-    };
-  }
-
-  fidl::Binding<fuchsia::modular::ContextListener> binding_;
-  Handler handler_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(ContextListenerImpl);
-};
-
-// Cf. README.md for what this test does and how.
-class TestApp : public modular::testing::SessionShellBase {
- public:
-  TestApp(component::StartupContext* const startup_context)
-      : SessionShellBase(startup_context) {
-    TestInit(__FILE__);
-
-    startup_context->ConnectToEnvironmentService(puppet_master_.NewRequest());
-
-    fuchsia::modular::IntelligenceServicesPtr intelligence_services;
-    startup_context->ConnectToEnvironmentService(
-        intelligence_services.NewRequest());
-    intelligence_services->GetContextReader(context_reader_.NewRequest());
-    context_listener_.Listen(context_reader_.get());
-    context_reader_.set_error_handler([](zx_status_t status) {
-      FXL_LOG(ERROR) << "Lost fuchsia::modular::ContextReader connection.";
-    });
-
-    CreateStory();
-  }
-
-  ~TestApp() override = default;
-
- private:
-  TestPoint create_story_{"CreateStory()"};
-
-  void CreateStory() {
-    puppet_master_->ControlStory(kStoryName, story_puppet_master_.NewRequest());
-
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("root");
-    add_mod.intent.handler = kModuleUrl;
-    add_mod.intent.action = kModuleAction;
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-    commands.push_back(std::move(command));
-
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          create_story_.Pass();
-          StartStory();
-        });
-  }
-
-  TestPoint start_story_enter_{"StartStory() Enter"};
-  TestPoint start_story_exit_{"StartStory() Exit"};
-
-  void StartStory() {
-    start_story_enter_.Pass();
-
-    context_listener_.Handle(
-        [this](const fuchsia::modular::ContextValue& value) {
-          ProcessContextValue(value);
-        });
-
-    story_provider()->GetController(kStoryName, story_controller_.NewRequest());
-    story_controller_->RequestStart();
-
-    start_story_exit_.Pass();
-  }
-
-  TestPoint get_context_topic_1_{"GetContextTopic() value=1"};
-  int get_context_topic_1_called_{};
-  TestPoint get_context_topic_2_{"GetContextTopic() value=2"};
-  int get_context_topic_2_called_{};
-
-  void ProcessContextValue(const fuchsia::modular::ContextValue& value) {
-    // The context value has metadata that is derived from the story id in
-    // which it was published.
-    if (!value.meta.story || !value.meta.link || !value.meta.entity) {
-      FXL_LOG(ERROR) << "fuchsia::modular::ContextValue missing metadata: "
-                     << value;
-      return;
-    }
-
-    if (value.meta.story->id != kStoryName ||
-        value.meta.entity->type.is_null() ||
-        value.meta.entity->type->size() != 1) {
-      FXL_LOG(ERROR) << "fuchsia::modular::ContextValue metadata is incorrect: "
-                     << value;
-      return;
-    }
-
-    modular::JsonDoc doc;
-    doc.Parse(value.content);
-
-    if (doc.HasParseError()) {
-      FXL_LOG(ERROR) << "JSON Parse Error" << value.content;
-      Logout();
-      return;
-    }
-
-    if (!doc.IsObject()) {
-      FXL_LOG(ERROR) << "JSON not an Object" << value.content;
-      Logout();
-      return;
-    }
-
-    if (!doc.HasMember("value")) {
-      FXL_LOG(ERROR) << "JSON missing 'value': " << value.content;
-      Logout();
-      return;
-    }
-
-    const std::string value_property{doc["value"].GetString()};
-    const std::string type{value.meta.entity->type->at(0)};
-    if (value_property != "value1" && value_property != "value2") {
-      FXL_LOG(ERROR) << "JSON 'value' property (set by module) wrong: "
-                     << value_property;
-      Logout();
-      return;
-    }
-
-    if (value_property == "value1" && type == "type1" &&
-        value.meta.link->name == "link1") {
-      if (++get_context_topic_1_called_ == 1) {
-        get_context_topic_1_.Pass();
-      }
-    } else if (value_property == "value2" && type == "type2" &&
-               value.meta.link->name == "link2") {
-      if (++get_context_topic_2_called_ == 1) {
-        get_context_topic_2_.Pass();
-      }
-    }
-
-    if (get_context_topic_1_called_ > 0 && get_context_topic_2_called_ > 0) {
-      context_listener_.Reset();
-      context_listener_.Handle(
-          [this](const fuchsia::modular::ContextValue&) {});
-      Logout();
-    }
-  }
-
-  void Logout() {
-    Signal(modular::testing::kTestShutdown);
-  }
-
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-
-  fuchsia::modular::StoryControllerPtr story_controller_;
-
-  fuchsia::modular::ContextReaderPtr context_reader_;
-  ContextListenerImpl context_listener_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  modular::testing::ComponentMain<TestApp>();
-  return 0;
-}
diff --git a/tests/link_context_entities/meta/link_context_entities_test_module.cmx b/tests/link_context_entities/meta/link_context_entities_test_module.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/link_context_entities/meta/link_context_entities_test_module.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/link_context_entities/meta/link_context_entities_test_session_shell.cmx b/tests/link_context_entities/meta/link_context_entities_test_session_shell.cmx
deleted file mode 100644
index 7efcca5..0000000
--- a/tests/link_context_entities/meta/link_context_entities_test_session_shell.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.IntelligenceServices",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/maxwell_integration/BUILD.gn b/tests/maxwell_integration/BUILD.gn
deleted file mode 100644
index c72a6a9..0000000
--- a/tests/maxwell_integration/BUILD.gn
+++ /dev/null
@@ -1,115 +0,0 @@
-# Copyright 2016 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/tests_package.gni")
-
-hermetic_tests_package("maxwell_integration_tests") {
-  deps = [
-    ":context_engine_test",
-    ":suggestion_engine_test",
-  ]
-}
-
-executable("context_engine_test") {
-  testonly = true
-
-  sources = [
-    "context_engine_test.cc",
-  ]
-
-  deps = [
-    ":context_common",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fsl",
-    "//peridot/bin/context_engine:scope_utils",
-    "//peridot/lib/testing:entity_resolver_fake",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/context/cpp:context_helper",
-    "//peridot/public/lib/context/cpp:context_metadata_builder",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-executable("suggestion_engine_test") {
-  testonly = true
-
-  sources = [
-    "suggestion_engine_test.cc",
-  ]
-
-  deps = [
-    ":context_common",
-    ":test_suggestion_listener",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/fsl",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:story_provider_mock",
-    "//peridot/lib/testing:wait_until_idle",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/context/cpp:context_helper",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-# TODO(rosswang): move utils to a subdirectory
-
-source_set("context_common") {
-  testonly = true
-
-  sources = [
-    "context_engine_test_base.cc",
-    "context_engine_test_base.h",
-  ]
-
-  deps = [
-    ":common",
-    "//peridot/lib/testing:wait_until_idle",
-  ]
-
-  public_deps = [
-    "//peridot/public/fidl/fuchsia.modular",
-    "//third_party/googletest:gtest",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-source_set("common") {
-  testonly = true
-
-  sources = [
-    "test.cc",
-    "test.h",
-  ]
-
-  deps = [
-    "//peridot/lib/environment_host",
-    "//peridot/lib/testing:component_context_fake",
-    "//peridot/lib/testing:entity_resolver_fake",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/component/cpp",
-    "//third_party/googletest:gtest",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-source_set("test_suggestion_listener") {
-  testonly = true
-
-  sources = [
-    "test_suggestion_listener.cc",
-    "test_suggestion_listener.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/fostr/fidl/fuchsia.modular",
-  ]
-
-  public_deps = [
-    "//third_party/googletest:gtest",
-  ]
-}
diff --git a/tests/maxwell_integration/context_engine_test.cc b/tests/maxwell_integration/context_engine_test.cc
deleted file mode 100644
index 9c3cb4a..0000000
--- a/tests/maxwell_integration/context_engine_test.cc
+++ /dev/null
@@ -1,342 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/context/cpp/context_helper.h>
-#include <lib/context/cpp/context_metadata_builder.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/clone.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fxl/logging.h>
-#include "peridot/bin/context_engine/scope_utils.h"
-#include "peridot/tests/maxwell_integration/context_engine_test_base.h"
-
-namespace maxwell {
-namespace {
-
-fuchsia::modular::ComponentScope MakeGlobalScope() {
-  fuchsia::modular::ComponentScope scope;
-  scope.set_global_scope(fuchsia::modular::GlobalScope());
-  return scope;
-}
-
-class TestListener : public fuchsia::modular::ContextListener {
- public:
-  fuchsia::modular::ContextUpdatePtr last_update;
-
-  TestListener() : binding_(this) {}
-
-  void OnContextUpdate(fuchsia::modular::ContextUpdate update) override {
-    last_update = fidl::MakeOptional(std::move(update));
-  }
-
-  fidl::InterfaceHandle<fuchsia::modular::ContextListener> GetHandle() {
-    return binding_.NewBinding();
-  }
-
-  void Reset() { last_update.reset(); }
-
- private:
-  fidl::Binding<fuchsia::modular::ContextListener> binding_;
-};
-
-class ContextEngineTest : public ContextEngineTestBase {
- public:
-  void SetUp() override {
-    ContextEngineTestBase::SetUp();
-    InitAllGlobalScope();
-  }
-
- protected:
-  void InitAllGlobalScope() {
-    InitReader(MakeGlobalScope());
-    InitWriter(MakeGlobalScope());
-  }
-
-  void InitReader(fuchsia::modular::ComponentScope scope) {
-    reader_.Unbind();
-    context_engine()->GetReader(std::move(scope), reader_.NewRequest());
-  }
-
-  void InitWriter(fuchsia::modular::ComponentScope client_info) {
-    writer_.Unbind();
-    context_engine()->GetWriter(std::move(client_info), writer_.NewRequest());
-  }
-
-  fuchsia::modular::ContextReaderPtr reader_;
-  fuchsia::modular::ContextWriterPtr writer_;
-};
-
-// Result ordering for |fuchsia::modular::ContextValue|s is not specified, and
-// ordering ends up depending on the order the
-// |fuchsia::modular::ContextValueWriter::Set| calls get handled, which is
-// nondeterministic since they are on separate channels.
-std::set<std::string> GetTopicSet(
-    const std::vector<fuchsia::modular::ContextValue>& values) {
-  std::set<std::string> topics;
-  for (const auto& value : values) {
-    topics.emplace(value.meta.entity->topic);
-  }
-  return topics;
-}
-
-}  // namespace
-
-TEST_F(ContextEngineTest, ContextValueWriter) {
-  // Use the fuchsia::modular::ContextValueWriter interface, available by
-  // calling fuchsia::modular::ContextWriter.CreateValue().
-  fuchsia::modular::ContextValueWriterPtr value1;
-  writer_->CreateValue(value1.NewRequest(),
-                       fuchsia::modular::ContextValueType::ENTITY);
-  value1->Set(R"({ "@type": "someType", "foo": "bar" })",
-              fidl::MakeOptional(
-                  ContextMetadataBuilder().SetEntityTopic("topic").Build()));
-
-  fuchsia::modular::ContextValueWriterPtr value2;
-  writer_->CreateValue(value2.NewRequest(),
-                       fuchsia::modular::ContextValueType::ENTITY);
-  value2->Set(R"({ "@type": ["someType", "alsoAnotherType"], "baz": "bang" })",
-              fidl::MakeOptional(
-                  ContextMetadataBuilder().SetEntityTopic("frob").Build()));
-
-  fuchsia::modular::ContextValueWriterPtr value3;
-  writer_->CreateValue(value3.NewRequest(),
-                       fuchsia::modular::ContextValueType::ENTITY);
-  value3->Set(
-      entity_resolver().AddEntity({{"someType", ""}, {"evenMoreType", ""}}),
-      fidl::MakeOptional(
-          ContextMetadataBuilder().SetEntityTopic("borf").Build()));
-
-  // Subscribe to those values.
-  fuchsia::modular::ContextSelector selector;
-  selector.type = fuchsia::modular::ContextValueType::ENTITY;
-  selector.meta = fidl::MakeOptional(
-      ContextMetadataBuilder().AddEntityType("someType").Build());
-
-  fuchsia::modular::ContextQuery query;
-  modular::AddToContextQuery(&query, "a", std::move(selector));
-
-  TestListener listener;
-  reader_->Subscribe(std::move(query), listener.GetHandle());
-
-  WaitUntilIdle();
-  ASSERT_TRUE(listener.last_update);
-  auto maybe_results =
-      modular::TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_results.has_value());
-  auto results = std::move(maybe_results.value());
-  ASSERT_EQ(3u, results.size());
-  EXPECT_EQ(std::set<std::string>({"topic", "frob", "borf"}),
-            GetTopicSet(results));
-
-  // Update value1 and value3 so they're no longer matches for the 'someType'
-  // query.
-  listener.Reset();
-  value1->Set(R"({ "@type": "notSomeType", "foo": "bar" })", nullptr);
-  value3.Unbind();
-
-  WaitUntilIdle();
-  ASSERT_TRUE(listener.last_update);
-  maybe_results = modular::TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_results.has_value());
-  results = std::move(maybe_results.value());
-  ASSERT_EQ(1u, results.size());
-  EXPECT_EQ("frob", results[0].meta.entity->topic);
-
-  // Create two new values: A Story value and a child fuchsia::modular::Entity
-  // value, where the fuchsia::modular::Entity value matches our query.
-  listener.Reset();
-  fuchsia::modular::ContextValueWriterPtr story_value;
-  writer_->CreateValue(story_value.NewRequest(),
-                       fuchsia::modular::ContextValueType::STORY);
-  story_value->Set(
-      nullptr,
-      fidl::MakeOptional(ContextMetadataBuilder().SetStoryId("story").Build()));
-
-  WaitUntilIdle();
-  FXL_LOG(INFO) << "should be null right now: " << listener.last_update;
-
-  fuchsia::modular::ContextValueWriterPtr value4;
-  story_value->CreateChildValue(value4.NewRequest(),
-                                fuchsia::modular::ContextValueType::ENTITY);
-  WaitUntilIdle();
-  value4->Set(R"({"@type": "someType"})",
-              fidl::MakeOptional(
-                  ContextMetadataBuilder().AddEntityType("someType").Build()));
-
-  WaitUntilIdle();
-  maybe_results = modular::TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_results.has_value());
-  results = std::move(maybe_results.value());
-  ASSERT_EQ(2u, results.size());
-
-  fuchsia::modular::ContextValue entity_result, story_result;
-  if (results[0].type == fuchsia::modular::ContextValueType::ENTITY) {
-    entity_result = std::move(results[0]);
-    story_result = std::move(results[1]);
-  } else {
-    story_result = std::move(results[0]);
-    entity_result = std::move(results[1]);
-  }
-  EXPECT_EQ("frob", entity_result.meta.entity->topic);
-  EXPECT_EQ(R"({"@type": "someType"})", story_result.content);
-  EXPECT_EQ("story", story_result.meta.story->id);
-
-  // Lastly remove one of the values by resetting the
-  // fuchsia::modular::ContextValueWriter proxy.
-  listener.Reset();
-  value4.Unbind();
-
-  WaitUntilIdle();
-  ASSERT_TRUE(listener.last_update);
-  maybe_results = modular::TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_results.has_value());
-  results = std::move(maybe_results.value());
-  ASSERT_EQ(1u, results.size());
-  EXPECT_EQ("frob", results[0].meta.entity->topic);
-}
-
-TEST_F(ContextEngineTest, WriteNullEntity) {
-  fuchsia::modular::ContextMetadata meta =
-      ContextMetadataBuilder().SetEntityTopic("topic").Build();
-
-  fuchsia::modular::ContextSelector selector;
-  selector.type = fuchsia::modular::ContextValueType::ENTITY;
-  selector.meta = fidl::MakeOptional(fidl::Clone(meta));
-  fuchsia::modular::ContextQuery query;
-  modular::AddToContextQuery(&query, "a", std::move(selector));
-
-  fuchsia::modular::ContextValueWriterPtr value;
-  writer_->CreateValue(value.NewRequest(),
-                       fuchsia::modular::ContextValueType::ENTITY);
-
-  const std::string value1 = R"({ "@type": "someType", "foo": "frob" })";
-  const std::string value2 = R"({ "@type": "someType", "foo": "borf" })";
-
-  value->Set(value1, fidl::MakeOptional(fidl::Clone(meta)));
-
-  TestListener listener;
-  reader_->Subscribe(std::move(query), listener.GetHandle());
-
-  WaitUntilIdle();
-
-  ASSERT_TRUE(listener.last_update);
-  auto maybe_result =
-      modular::TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_result.has_value());
-  auto result = std::move(maybe_result.value());
-  ASSERT_EQ(1u, result.size());
-  EXPECT_EQ(value1, result[0].content);
-
-  listener.Reset();
-
-  value->Set(nullptr, nullptr);
-
-  // Ensure that this didn't cause a crash; the fidl further specifies that
-  // previous values should be unchanged.
-
-  value->Set(value2, fidl::MakeOptional(fidl::Clone(meta)));
-
-  WaitUntilIdle();
-  ASSERT_TRUE(listener.last_update);
-
-  maybe_result = modular::TakeContextValue(listener.last_update.get(), "a");
-  ASSERT_TRUE(maybe_result.has_value());
-  result = std::move(maybe_result.value());
-  ASSERT_EQ(1u, result.size());
-  EXPECT_EQ(value2, result[0].content);
-}
-
-TEST_F(ContextEngineTest, CloseListenerAndReader) {
-  // Ensure that listeners can be closed individually, and that the reader
-  // itself can be closed and listeners are still valid.
-  fuchsia::modular::ContextSelector selector;
-  selector.type = fuchsia::modular::ContextValueType::ENTITY;
-  selector.meta = fidl::MakeOptional(
-      ContextMetadataBuilder().SetEntityTopic("topic").Build());
-  fuchsia::modular::ContextQuery query;
-  modular::AddToContextQuery(&query, "a", std::move(selector));
-
-  TestListener listener2;
-  {
-    TestListener listener1;
-    reader_->Subscribe(fidl::Clone(query), listener1.GetHandle());
-    reader_->Subscribe(fidl::Clone(query), listener2.GetHandle());
-    InitReader(MakeGlobalScope());
-
-    WaitUntilIdle();
-    EXPECT_TRUE(listener2.last_update);
-    listener2.Reset();
-  }
-
-  // We don't want to crash. If the test below fails, context engine has
-  // probably crashed.
-  fuchsia::modular::ContextValueWriterPtr value;
-  writer_->CreateValue(value.NewRequest(),
-                       fuchsia::modular::ContextValueType::ENTITY);
-  value->Set("foo",
-             fidl::MakeOptional(
-                 ContextMetadataBuilder().SetEntityTopic("topic").Build()));
-
-  WaitUntilIdle();
-  EXPECT_TRUE(listener2.last_update);
-}
-
-TEST_F(ContextEngineTest, GetContext) {
-  // Ensure fuchsia::modular::ContextReader::Get returns values in the context
-  // we queried for.
-  fuchsia::modular::ContextValueWriterPtr value1;
-  writer_->CreateValue(value1.NewRequest(),
-                       fuchsia::modular::ContextValueType::ENTITY);
-  value1->Set(R"({ "@type": "someType", "foo": "bar" })",
-              fidl::MakeOptional(
-                  ContextMetadataBuilder().SetEntityTopic("topic").Build()));
-
-  fuchsia::modular::ContextValueWriterPtr value2;
-  writer_->CreateValue(value2.NewRequest(),
-                       fuchsia::modular::ContextValueType::ENTITY);
-  value2->Set(R"({ "@type": ["someType", "alsoAnotherType"], "baz": "bang" })",
-              fidl::MakeOptional(
-                  ContextMetadataBuilder().SetEntityTopic("frob").Build()));
-
-  fuchsia::modular::ContextValueWriterPtr value3;
-  writer_->CreateValue(value3.NewRequest(),
-                       fuchsia::modular::ContextValueType::ENTITY);
-  value3->Set(R"({ "@type": ["otherType", "alsoAnotherType"], "qux": "quux" })",
-              fidl::MakeOptional(
-                  ContextMetadataBuilder().SetEntityTopic("borf").Build()));
-
-  // Query those values.
-  fuchsia::modular::ContextSelector selector;
-  selector.type = fuchsia::modular::ContextValueType::ENTITY;
-  selector.meta = fidl::MakeOptional(
-      ContextMetadataBuilder().AddEntityType("someType").Build());
-  fuchsia::modular::ContextQuery query;
-  modular::AddToContextQuery(&query, "a", std::move(selector));
-
-  // Make sure context has been written.
-  TestListener listener;
-  reader_->Subscribe(fidl::Clone(query), listener.GetHandle());
-
-  WaitUntilIdle();
-  EXPECT_TRUE(listener.last_update);
-
-  // Assert Get gives us the expected context.
-  bool callback_called = false;
-  reader_->Get(std::move(query), [&callback_called](
-                                     fuchsia::modular::ContextUpdate update) {
-    callback_called = true;
-
-    auto maybe_results = modular::TakeContextValue(&update, "a");
-    ASSERT_TRUE(maybe_results.has_value());
-    auto results = std::move(maybe_results.value());
-    ASSERT_EQ(2u, results.size());
-    EXPECT_EQ(std::set<std::string>({"topic", "frob"}), GetTopicSet(results));
-  });
-
-  WaitUntilIdle();
-  EXPECT_TRUE(callback_called);
-}
-
-}  // namespace maxwell
diff --git a/tests/maxwell_integration/context_engine_test_base.cc b/tests/maxwell_integration/context_engine_test_base.cc
deleted file mode 100644
index 2e5600f..0000000
--- a/tests/maxwell_integration/context_engine_test_base.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/tests/maxwell_integration/context_engine_test_base.h"
-
-#include "peridot/lib/testing/wait_until_idle.h"
-
-namespace {
-
-constexpr char kContextEngineUrl[] =
-    "fuchsia-pkg://fuchsia.com/context_engine#meta/context_engine.cmx";
-
-}
-
-namespace maxwell {
-
-void ContextEngineTestBase::SetUp() {
-  context_engine_ =
-      ConnectToService<fuchsia::modular::ContextEngine>(kContextEngineUrl);
-  context_engine_->GetContextDebug(debug_.NewRequest());
-}
-
-void ContextEngineTestBase::StartContextAgent(const std::string& url) {
-  auto agent_bridge =
-      std::make_unique<MaxwellServiceProviderBridge>(root_environment());
-  agent_bridge->AddService<fuchsia::modular::ContextWriter>(
-      [this,
-       url](fidl::InterfaceRequest<fuchsia::modular::ContextWriter> request) {
-        fuchsia::modular::ComponentScope scope;
-        fuchsia::modular::AgentScope agent_scope;
-        agent_scope.url = url;
-        scope.set_agent_scope(std::move(agent_scope));
-        context_engine_->GetWriter(std::move(scope), std::move(request));
-      });
-  agent_bridge->AddService<fuchsia::modular::ContextReader>(
-      [this,
-       url](fidl::InterfaceRequest<fuchsia::modular::ContextReader> request) {
-        fuchsia::modular::ComponentScope scope;
-        fuchsia::modular::AgentScope agent_scope;
-        agent_scope.url = url;
-        scope.set_agent_scope(std::move(agent_scope));
-        context_engine_->GetReader(std::move(scope), std::move(request));
-      });
-  StartAgent(url, std::move(agent_bridge));
-}
-
-void ContextEngineTestBase::WaitUntilIdle() {
-  util::WaitUntilIdle(&debug_, &loop_);
-}
-
-}  // namespace maxwell
diff --git a/tests/maxwell_integration/context_engine_test_base.h b/tests/maxwell_integration/context_engine_test_base.h
deleted file mode 100644
index 641ce9c..0000000
--- a/tests/maxwell_integration/context_engine_test_base.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_MAXWELL_INTEGRATION_CONTEXT_ENGINE_TEST_BASE_H_
-#define PERIDOT_TESTS_MAXWELL_INTEGRATION_CONTEXT_ENGINE_TEST_BASE_H_
-
-#include <fuchsia/modular/cpp/fidl.h>
-
-#include "peridot/tests/maxwell_integration/test.h"
-
-namespace maxwell {
-
-// Base fixture to support test cases requiring Context Engine.
-class ContextEngineTestBase : public MaxwellTestBase {
- public:
-  void SetUp() override;
-
- protected:
-  void StartContextAgent(const std::string& url);
-  void WaitUntilIdle();
-
-  fuchsia::modular::ContextEngine* context_engine() {
-    return context_engine_.get();
-  }
-
- private:
-  fuchsia::modular::ContextEnginePtr context_engine_;
-  fuchsia::modular::ContextDebugPtr debug_;
-};
-
-}  // namespace maxwell
-
-#endif  // PERIDOT_TESTS_MAXWELL_INTEGRATION_CONTEXT_ENGINE_TEST_BASE_H_
diff --git a/tests/maxwell_integration/meta/context_engine_test.cmx b/tests/maxwell_integration/meta/context_engine_test.cmx
deleted file mode 100644
index dd44b6c..0000000
--- a/tests/maxwell_integration/meta/context_engine_test.cmx
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "program": {
-    "binary": "test/context_engine_test"
-  },
-  "sandbox": {
-    "services": [
-      "fuchsia.sys.Launcher",
-      "fuchsia.sys.Environment"
-    ]
-  }
-}
diff --git a/tests/maxwell_integration/meta/suggestion_engine_test.cmx b/tests/maxwell_integration/meta/suggestion_engine_test.cmx
deleted file mode 100644
index 80566e2..0000000
--- a/tests/maxwell_integration/meta/suggestion_engine_test.cmx
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "program": {
-    "binary": "test/suggestion_engine_test"
-  },
-  "sandbox": {
-    "services": [
-      "fuchsia.sys.Launcher",
-      "fuchsia.sys.Environment"
-    ]
-  }
-}
diff --git a/tests/maxwell_integration/suggestion_engine_test.cc b/tests/maxwell_integration/suggestion_engine_test.cc
deleted file mode 100644
index 278742c..0000000
--- a/tests/maxwell_integration/suggestion_engine_test.cc
+++ /dev/null
@@ -1,948 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/context/cpp/context_helper.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/optional.h>
-#include <lib/fxl/logging.h>
-#include <lib/svc/cpp/services.h>
-
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/lib/testing/story_provider_mock.h"
-#include "peridot/lib/testing/wait_until_idle.h"
-#include "peridot/tests/maxwell_integration/context_engine_test_base.h"
-#include "peridot/tests/maxwell_integration/test_suggestion_listener.h"
-#include "rapidjson/document.h"
-#include "rapidjson/pointer.h"
-
-namespace maxwell {
-namespace {
-
-// context agent that publishes an int n
-class NWriter {
- public:
-  NWriter(fuchsia::modular::ContextEngine* context_engine) {
-    fuchsia::modular::ComponentScope scope;
-    scope.set_global_scope(fuchsia::modular::GlobalScope());
-    context_engine->GetWriter(std::move(scope), pub_.NewRequest());
-  }
-
-  void Publish(int n) { pub_->WriteEntityTopic("n", std::to_string(n)); }
-
- private:
-  fuchsia::modular::ContextWriterPtr pub_;
-};
-
-fuchsia::modular::Proposal CreateProposal(
-    const std::string& id, const std::string& headline,
-    std::vector<fuchsia::modular::StoryCommand> commands,
-    fuchsia::modular::AnnoyanceType annoyance) {
-  fuchsia::modular::Proposal p;
-  p.id = id;
-  p.on_selected = std::move(commands);
-  p.affinity.resize(0);
-  fuchsia::modular::SuggestionDisplay d;
-
-  d.headline = headline;
-  d.color = 0x00aa00aa;  // argb purple
-  d.annoyance = annoyance;
-
-  p.display = std::move(d);
-  return p;
-}
-
-class Proposinator {
- public:
-  Proposinator(fuchsia::modular::SuggestionEngine* suggestion_engine,
-               fidl::StringPtr url = "Proposinator") {
-    suggestion_engine->RegisterProposalPublisher("Proposinator",
-                                                 out_.NewRequest());
-  }
-
-  virtual ~Proposinator() = default;
-
-  void Propose(const std::string& id,
-               std::vector<fuchsia::modular::StoryCommand> commands ={}) {
-    Propose(id, id, fuchsia::modular::AnnoyanceType::NONE, std::move(commands));
-  }
-
-  void Propose(const std::string& id, const std::string& headline,
-               fuchsia::modular::AnnoyanceType annoyance =
-                   fuchsia::modular::AnnoyanceType::NONE,
-               std::vector<fuchsia::modular::StoryCommand> commands = {}) {
-    Propose(CreateProposal(id, headline, std::move(commands), annoyance));
-  }
-
-  void Propose(fuchsia::modular::Proposal proposal) {
-    out_->Propose(std::move(proposal));
-  }
-
-  void Remove(const std::string& id) { out_->Remove(id); }
-
-  void KillPublisher() { out_.Unbind(); }
-
- protected:
-  fuchsia::modular::ProposalPublisherPtr out_;
-};
-
-class AskProposinator : public Proposinator,
-                        public fuchsia::modular::QueryHandler {
- public:
-  AskProposinator(fuchsia::modular::SuggestionEngine* suggestion_engine,
-                  async::Loop* loop, fidl::StringPtr url = "AskProposinator")
-      : Proposinator(suggestion_engine, url), loop_(loop), ask_binding_(this) {
-    fidl::InterfaceHandle<fuchsia::modular::QueryHandler> query_handle;
-    ask_binding_.Bind(query_handle.NewRequest());
-    suggestion_engine->RegisterQueryHandler(url, std::move(query_handle));
-  }
-
-  void OnQuery(fuchsia::modular::UserInput query,
-               OnQueryCallback callback) override {
-    query_ = fidl::MakeOptional(query);
-    query_callback_ = callback;
-    query_proposals_.resize(0);
-
-    if (waiting_for_query_) {
-      waiting_for_query_ = false;
-      async::PostTask(loop_->dispatcher(), [this] { loop_->Quit(); });
-    }
-  }
-
-  void WaitForQuery() {
-    waiting_for_query_ = true;
-    loop_->Run();
-    loop_->ResetQuit();
-  }
-
-  void Commit() {
-    fuchsia::modular::QueryResponse response;
-    response.proposals = std::move(query_proposals_);
-    query_callback_(std::move(response));
-  }
-
-  fidl::StringPtr query() const { return query_ ? query_->text : nullptr; }
-
-  void ProposeForAsk(const std::string& id) {
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    ProposeForAsk(id, id, fuchsia::modular::AnnoyanceType::NONE,
-                  std::move(commands));
-  }
-
-  void ProposeForAsk(
-      const std::string& id, const std::string& headline,
-      fuchsia::modular::AnnoyanceType annoyance =
-          fuchsia::modular::AnnoyanceType::NONE,
-      std::vector<fuchsia::modular::StoryCommand> commands ={}) {
-    query_proposals_.push_back(
-        CreateProposal(id, headline, std::move(commands), annoyance));
-  }
-
- private:
-  async::Loop* const loop_;
-  fidl::Binding<fuchsia::modular::QueryHandler> ask_binding_;
-  fuchsia::modular::UserInputPtr query_;
-  std::vector<fuchsia::modular::Proposal> query_proposals_;
-  OnQueryCallback query_callback_;
-  bool waiting_for_query_ = false;
-};
-
-// maintains the number of proposals specified by the context field "n"
-class NProposals : public Proposinator,
-                   public fuchsia::modular::ContextListener {
- public:
-  NProposals(fuchsia::modular::ContextEngine* context_engine,
-             fuchsia::modular::SuggestionEngine* suggestion_engine)
-      : Proposinator(suggestion_engine, "NProposals"), listener_binding_(this) {
-    fuchsia::modular::ComponentScope scope;
-    scope.set_global_scope(fuchsia::modular::GlobalScope());
-    context_engine->GetReader(std::move(scope), reader_.NewRequest());
-
-    fuchsia::modular::ContextSelector selector;
-    selector.type = fuchsia::modular::ContextValueType::ENTITY;
-    selector.meta = fuchsia::modular::ContextMetadata::New();
-    selector.meta->entity = fuchsia::modular::EntityMetadata::New();
-    selector.meta->entity->topic = "n";
-    fuchsia::modular::ContextQuery query;
-    modular::AddToContextQuery(&query, "n", std::move(selector));
-    reader_->Subscribe(std::move(query), listener_binding_.NewBinding());
-  }
-
-  void OnContextUpdate(fuchsia::modular::ContextUpdate update) override {
-    auto maybe_result = modular::TakeContextValue(&update, "n");
-    if (!maybe_result) {
-      FXL_LOG(INFO) << "Expect an update key for every query key.";
-    }
-    auto& r = maybe_result.value();
-    if (r.empty()) {
-      return;
-    }
-    int n = std::stoi(r.at(0).content);
-
-    for (int i = n_; i < n; i++) {
-      Propose(std::to_string(i));
-    }
-    for (int i = n; i < n_; i++) {
-      Remove(std::to_string(i));
-    }
-
-    n_ = n;
-  }
-
- private:
-  fuchsia::modular::ContextReaderPtr reader_;
-  fidl::Binding<fuchsia::modular::ContextListener> listener_binding_;
-
-  int n_ = 0;
-};
-
-class SuggestionEngineTest : public ContextEngineTestBase,
-                             fuchsia::modular::ProposalListener {
- public:
-  SuggestionEngineTest() : story_provider_binding_(&story_provider_) {}
-
-  void SetUp() override {
-    ContextEngineTestBase::SetUp();
-
-    component::Services suggestion_services =
-        StartServices("fuchsia-pkg://fuchsia.com/suggestion_engine#meta/suggestion_engine.cmx");
-    suggestion_engine_ =
-        suggestion_services
-            .ConnectToService<fuchsia::modular::SuggestionEngine>();
-    suggestion_provider_ =
-        suggestion_services
-            .ConnectToService<fuchsia::modular::SuggestionProvider>();
-    suggestion_debug_ =
-        suggestion_services
-            .ConnectToService<fuchsia::modular::SuggestionDebug>();
-  }
-
- protected:
-  fuchsia::modular::SuggestionEngine* suggestion_engine() {
-    return suggestion_engine_.get();
-  }
-
-  fuchsia::modular::SuggestionProvider* suggestion_provider() {
-    return suggestion_provider_.get();
-  }
-
-  fuchsia::modular::SuggestionDebug* suggestion_debug() {
-    return suggestion_debug_.get();
-  }
-
-  modular::StoryProviderMock* story_provider() { return &story_provider_; }
-
-  void StartSuggestionAgent(const std::string& url) {
-    auto agent_bridge =
-        std::make_unique<MaxwellServiceProviderBridge>(root_environment());
-    agent_bridge->AddService<fuchsia::modular::ContextReader>(
-        [this,
-         url](fidl::InterfaceRequest<fuchsia::modular::ContextReader> request) {
-          fuchsia::modular::ComponentScope scope;
-          fuchsia::modular::AgentScope agent_scope;
-          agent_scope.url = url;
-          scope.set_agent_scope(std::move(agent_scope));
-          context_engine()->GetReader(std::move(scope), std::move(request));
-        });
-    agent_bridge->AddService<fuchsia::modular::ProposalPublisher>(
-        [this, url](fidl::InterfaceRequest<fuchsia::modular::ProposalPublisher>
-                        request) {
-          suggestion_engine_->RegisterProposalPublisher(url,
-                                                        std::move(request));
-        });
-    StartAgent(url, std::move(agent_bridge));
-  }
-
-  void AcceptSuggestion(const std::string& suggestion_id) {
-    Interact(suggestion_id, fuchsia::modular::InteractionType::SELECTED);
-  }
-
-  void DismissSuggestion(const std::string& suggestion_id) {
-    Interact(suggestion_id, fuchsia::modular::InteractionType::DISMISSED);
-  }
-
-  void WaitUntilIdle() {
-    ContextEngineTestBase::WaitUntilIdle();
-    util::WaitUntilIdle(&suggestion_debug_, &loop_);
-  }
-
-  void RunUntilIdle() {
-    suggestion_debug()->RunUntilIdle([this] { loop_.Quit(); });
-    loop_.Run();
-    loop_.ResetQuit();
-    loop_.RunUntilIdle();
-  }
-
-  void AddProposalListenerBinding(
-      fidl::InterfaceRequest<fuchsia::modular::ProposalListener> request) {
-    proposal_listener_bindings_.AddBinding(this, std::move(request));
-  }
-
-  // The id of the most recently accepted proposal.
-  std::string accepted_proposal_id_;
-
-  // The amount of proposals that have been accepted, as indicated by calls to
-  // |OnProposalAccepted|.
-  int accepted_proposal_count_ = 0;
-
-  // Whether or not a successful create story action has been observed.
-  bool created_story_action_;
-
-  // Story ID when a proposal is accepted. This is the ID of a story that was
-  // created as result of the execution of a proposal actions, either through
-  // AddModule or for a rich suggestion.
-  std::string accepted_proposal_story_id_;
-
- private:
-  void Interact(const std::string& suggestion_id,
-                fuchsia::modular::InteractionType interaction_type) {
-    fuchsia::modular::Interaction interaction;
-    interaction.type = interaction_type;
-    suggestion_provider_->NotifyInteraction(suggestion_id,
-                                            std::move(interaction));
-  }
-
-  // |fuchsia::modular::ProposalListener|
-  void OnProposalAccepted(std::string proposal_id,
-                          fidl::StringPtr story_id) override {
-    accepted_proposal_id_ = proposal_id;
-    if (!story_id->empty()) {
-      created_story_action_ = true;
-      accepted_proposal_story_id_ = story_id;
-    }
-    accepted_proposal_count_++;
-  }
-
-  fuchsia::modular::SuggestionEnginePtr suggestion_engine_;
-  fuchsia::modular::SuggestionDebugPtr suggestion_debug_;
-  fuchsia::modular::SuggestionProviderPtr suggestion_provider_;
-
-  modular::StoryProviderMock story_provider_;
-  fidl::Binding<fuchsia::modular::StoryProvider> story_provider_binding_;
-  fidl::BindingSet<fuchsia::modular::ProposalListener>
-      proposal_listener_bindings_;
-};
-
-class AskTest : public virtual SuggestionEngineTest {
- public:
-  AskTest()
-      : listener_binding_(&listener_),
-        debug_listener_binding_(&debug_listener_) {}
-
-  void SetUp() override {
-    SuggestionEngineTest::SetUp();
-
-    suggestion_debug()->WatchAskProposals(debug_listener_binding_.NewBinding());
-  }
-
-  void CloseAndResetListener() {
-    if (listener_binding_.is_bound()) {
-      listener_binding_.Unbind();
-      listener_.ClearSuggestions();
-    }
-  }
-
-  void Query(const std::string& query, int count = 10) {
-    CloseAndResetListener();
-    fuchsia::modular::UserInput input;
-    input.type = fuchsia::modular::InputType::TEXT;
-    input.text = query;
-    suggestion_provider()->Query(listener_binding_.NewBinding(),
-                                 std::move(input), count);
-  }
-
-  int suggestion_count() const { return listener_.suggestion_count(); }
-
-  modular::TestSuggestionListener* listener() { return &listener_; }
-
- protected:
-  void EnsureDebugMatches() {
-    auto& subscriberAsks = listener_.GetSuggestions();
-    auto& debugAsks = debug_listener_.GetProposals();
-    EXPECT_GE(debugAsks.size(), subscriberAsks.size());
-    for (size_t i = 0; i < subscriberAsks.size(); i++) {
-      auto& suggestion = subscriberAsks[i];
-      auto& proposal = debugAsks[i];
-      EXPECT_EQ(suggestion->display.headline, proposal.display.headline);
-      EXPECT_EQ(suggestion->display.subheadline, proposal.display.subheadline);
-      EXPECT_EQ(suggestion->display.details, proposal.display.details);
-    }
-  }
-
- private:
-  modular::TestSuggestionListener listener_;
-  modular::TestDebugAskListener debug_listener_;
-  fidl::Binding<fuchsia::modular::QueryListener> listener_binding_;
-  fidl::Binding<fuchsia::modular::AskProposalListener> debug_listener_binding_;
-};
-
-class InterruptionTest : public virtual SuggestionEngineTest {
- public:
-  InterruptionTest()
-      : listener_binding_(&listener_),
-        debug_listener_binding_(&debug_listener_) {}
-
-  void SetUp() override {
-    SuggestionEngineTest::SetUp();
-
-    suggestion_provider()->SubscribeToInterruptions(
-        listener_binding_.NewBinding());
-    suggestion_debug()->WatchInterruptionProposals(
-        debug_listener_binding_.NewBinding());
-
-    // Make sure we're subscribed before we start the test.
-    WaitUntilIdle();
-  }
-
-  modular::TestDebugInterruptionListener* debugListener() {
-    return &debug_listener_;
-  }
-  modular::TestSuggestionListener* listener() { return &listener_; }
-
- protected:
-  int suggestion_count() const { return listener_.suggestion_count(); }
-
-  void EnsureDebugMatches() {
-    auto& subscriberNexts = listener_.GetSuggestions();
-    auto lastInterruption = debug_listener_.get_interrupt_proposal();
-    ASSERT_GE(subscriberNexts.size(), 1u);
-    auto& suggestion = subscriberNexts[0];
-    EXPECT_EQ(suggestion->display.headline, lastInterruption.display.headline);
-    EXPECT_EQ(suggestion->display.subheadline,
-              lastInterruption.display.subheadline);
-    EXPECT_EQ(suggestion->display.details, lastInterruption.display.details);
-  }
-
- private:
-  modular::TestSuggestionListener listener_;
-  modular::TestDebugInterruptionListener debug_listener_;
-
-  fidl::Binding<fuchsia::modular::InterruptionListener> listener_binding_;
-  fidl::Binding<fuchsia::modular::InterruptionProposalListener>
-      debug_listener_binding_;
-};
-
-class NextTest : public virtual SuggestionEngineTest {
- public:
-  NextTest()
-      : listener_binding_(&listener_),
-        debug_listener_binding_(&debug_listener_) {}
-
-  void SetUp() override {
-    SuggestionEngineTest::SetUp();
-
-    suggestion_debug()->WatchNextProposals(
-        debug_listener_binding_.NewBinding());
-  }
-
-  modular::TestDebugNextListener* debugListener() { return &debug_listener_; }
-  modular::TestSuggestionListener* listener() { return &listener_; }
-
- protected:
-  void StartListening(int count) {
-    suggestion_provider()->SubscribeToNext(listener_binding_.NewBinding(),
-                                           count);
-  }
-
-  void CloseAndResetListener() {
-    listener_binding_.Unbind();
-    listener_.ClearSuggestions();
-  }
-
-  void SetResultCount(int count) {
-    CloseAndResetListener();
-    suggestion_provider()->SubscribeToNext(listener_binding_.NewBinding(),
-                                           count);
-  }
-
-  int suggestion_count() const { return listener_.suggestion_count(); }
-
-  const fuchsia::modular::Suggestion* GetOnlySuggestion() const {
-    return listener_.GetOnlySuggestion();
-  }
-
-  void EnsureDebugMatches() {
-    auto& subscriberNexts = listener_.GetSuggestions();
-    auto& debugNexts = debug_listener_.GetProposals();
-    EXPECT_GE(debugNexts.size(), subscriberNexts.size());
-    for (size_t i = 0; i < subscriberNexts.size(); i++) {
-      auto& suggestion = subscriberNexts[i];
-      auto& proposal = debugNexts[i];
-      EXPECT_EQ(suggestion->display.headline, proposal.display.headline);
-      EXPECT_EQ(suggestion->display.subheadline, proposal.display.subheadline);
-      EXPECT_EQ(suggestion->display.details, proposal.display.details);
-    }
-  }
-
- private:
-  modular::TestSuggestionListener listener_;
-  modular::TestDebugNextListener debug_listener_;
-
-  fidl::Binding<fuchsia::modular::NextListener> listener_binding_;
-  fidl::Binding<fuchsia::modular::NextProposalListener> debug_listener_binding_;
-};
-
-class ResultCountTest : public NextTest {
- public:
-  void SetUp() override {
-    NextTest::SetUp();
-
-    pub_.reset(new NWriter(context_engine()));
-    sub_.reset(new NProposals(context_engine(), suggestion_engine()));
-  }
-
- protected:
-  // Publishes signals for n new suggestions to context.
-  void PublishNewSignal(int n = 1) { pub_->Publish(n_ += n); }
-
- private:
-  std::unique_ptr<NWriter> pub_;
-  std::unique_ptr<NProposals> sub_;
-  int n_ = 0;
-};
-
-}  // namespace
-
-// Macro rather than method to capture the expectation in the assertion message.
-#define CHECK_RESULT_COUNT(expected) ASYNC_EQ(expected, suggestion_count())
-
-TEST_F(ResultCountTest, InitiallyEmpty) {
-  StartListening(10);
-  WaitUntilIdle();
-  EXPECT_EQ(0, suggestion_count());
-}
-
-TEST_F(ResultCountTest, OneByOne) {
-  StartListening(10);
-  PublishNewSignal();
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-
-  PublishNewSignal();
-  WaitUntilIdle();
-  EXPECT_EQ(2, suggestion_count());
-}
-
-TEST_F(ResultCountTest, AddOverLimit) {
-  StartListening(0);
-  PublishNewSignal(3);
-  WaitUntilIdle();
-  EXPECT_EQ(0, suggestion_count());
-
-  SetResultCount(1);
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-
-  SetResultCount(3);
-  WaitUntilIdle();
-  EXPECT_EQ(3, suggestion_count());
-
-  SetResultCount(5);
-  WaitUntilIdle();
-  EXPECT_EQ(3, suggestion_count());
-
-  PublishNewSignal(4);
-  WaitUntilIdle();
-  EXPECT_EQ(5, suggestion_count());
-}
-
-TEST_F(ResultCountTest, Clear) {
-  StartListening(10);
-  PublishNewSignal(3);
-  WaitUntilIdle();
-  EXPECT_EQ(3, suggestion_count());
-
-  SetResultCount(0);
-  WaitUntilIdle();
-  EXPECT_EQ(0, suggestion_count());
-
-  SetResultCount(10);
-  WaitUntilIdle();
-  EXPECT_EQ(3, suggestion_count());
-}
-
-TEST_F(ResultCountTest, MultiRemove) {
-  StartListening(10);
-  PublishNewSignal(3);
-  WaitUntilIdle();
-  EXPECT_EQ(3, suggestion_count());
-
-  SetResultCount(1);
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-
-  SetResultCount(10);
-  WaitUntilIdle();
-  EXPECT_EQ(3, suggestion_count());
-}
-
-// Tests the removal of earlier suggestions, ensuring that suggestion engine can
-// handle the case where an agent requests the removal of suggestions in a non-
-// LIFO ordering. This exercises some internal shuffling, especially when
-// rankings are likewise non-LIFO (where last = lowest-priority).
-//
-// TODO(rosswang): Currently this test also tests removing higher-ranked
-// suggestions. After we have real ranking, add a test for that.
-TEST_F(NextTest, Fifo) {
-  Proposinator fifo(suggestion_engine());
-
-  StartListening(10);
-  fifo.Propose("1");
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-  auto uuid_1 = GetOnlySuggestion()->uuid;
-
-  fifo.Propose("2");
-  WaitUntilIdle();
-  EXPECT_EQ(2, suggestion_count());
-  fifo.Remove("1");
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-  auto suggestion = GetOnlySuggestion();
-  EXPECT_NE(uuid_1, suggestion->uuid);
-  EXPECT_EQ("2", suggestion->display.headline);
-}
-
-// Tests the removal of earlier suggestions while capped.
-// TODO(rosswang): see above TODO
-TEST_F(NextTest, CappedFifo) {
-  Proposinator fifo(suggestion_engine());
-
-  StartListening(1);
-  fifo.Propose("1");
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-  auto uuid1 = GetOnlySuggestion()->uuid;
-
-  fifo.Propose("2");
-  WaitUntilIdle();
-  EXPECT_EQ(uuid1, GetOnlySuggestion()->uuid)
-      << "fuchsia::modular::Proposal 2 ranked over proposal 2; test invalid; "
-         "update to test "
-         "FIFO-ranked proposals.";
-
-  fifo.Remove("1");
-  WaitUntilIdle();
-  ASSERT_EQ(1, suggestion_count());
-  EXPECT_NE(uuid1, GetOnlySuggestion()->uuid);
-
-  EXPECT_EQ("2", GetOnlySuggestion()->display.headline);
-}
-
-TEST_F(NextTest, RemoveBeforeSubscribe) {
-  Proposinator zombinator(suggestion_engine());
-
-  zombinator.Propose("brains");
-  zombinator.Remove("brains");
-  WaitUntilIdle();
-
-  StartListening(10);
-  WaitUntilIdle();
-  EXPECT_EQ(0, suggestion_count());
-}
-
-TEST_F(NextTest, SubscribeBeyondController) {
-  Proposinator p(suggestion_engine());
-
-  StartListening(10);
-  WaitUntilIdle();
-  p.Propose("1");
-  p.Propose("2");
-  WaitUntilIdle();
-  EXPECT_EQ(2, suggestion_count());
-}
-
-TEST_F(AskTest, DefaultAsk) {
-  AskProposinator p(suggestion_engine(), &loop_);
-
-  Query("test query");
-  p.WaitForQuery();
-  p.ProposeForAsk("1");
-  p.Commit();
-
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-
-  Query("test query 2");
-  p.WaitForQuery();
-  p.ProposeForAsk("2");
-  p.Commit();
-
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-  EnsureDebugMatches();
-}
-
-/* These tests assume that a string match between the proposal headline
-   and the query text factors into suggestion ranking. That ranking
-   feature is currently turned off and thus these tests fail, but they
-   will pass with it turned on.
-
-#define CHECK_TOP_HEADLINE(h) \
-  ASYNC_CHECK(listener()->GetTopSuggestion()->display->headline == h)
-
-TEST_F(AskTest, AskDifferentQueries) {
-  AskProposinator p(suggestion_engine(), &loop_);
-
-  Query("The Hottest Band on the Internet");
-  p.WaitForQuery();
-  p.ProposeForAsk("Mozart's Ghost");
-  p.ProposeForAsk("The Hottest Band on the Internet");
-  p.Commit();
-  WaitUntilIdle();
-
-  CHECK_TOP_HEADLINE("The Hottest Band on the Internet");
-
-  Query("Mozart's Ghost");
-  p.WaitForQuery();
-  p.ProposeForAsk("Mozart's Ghost");
-  p.ProposeForAsk("The Hottest Band on the Internet");
-  p.Commit();
-  WaitUntilIdle();
-
-  CHECK_TOP_HEADLINE("Mozart's Ghost");
-  EnsureDebugMatches();
-}
-
-TEST_F(AskTest, ChangeHeadlineRank) {
-  AskProposinator p(suggestion_engine(), &loop_);
-
-  Query("test query");
-  p.WaitForQuery();
-  p.ProposeForAsk("E-mail", "E-mail");
-  p.ProposeForAsk("E-vite", "E-vite");
-  p.ProposeForAsk("E-card", "E-card");
-  p.ProposeForAsk("Music", "Music");
-  p.Commit();
-
-  WaitUntilIdle();
-  EXPECT_EQ(4, suggestion_count());
-
-  Query("Ca");
-  p.WaitForQuery();
-  p.ProposeForAsk("E-mail", "E-mail");
-  p.ProposeForAsk("E-vite", "E-vite");
-  p.ProposeForAsk("E-card", "E-card");
-  p.ProposeForAsk("Music", "Music");
-  p.Commit();
-  WaitUntilIdle();
-
-  // E-card has a 'ca' in the 3rd position, so should be ranked highest.
-  CHECK_TOP_HEADLINE("E-card");
-
-  Query("Ca");
-  p.WaitForQuery();
-  p.ProposeForAsk("E-mail", "E-mail");
-  p.ProposeForAsk("E-mail", "Cam");
-  p.ProposeForAsk("E-vite", "E-vite");
-  p.ProposeForAsk("E-card", "E-card");
-  p.ProposeForAsk("Music", "Music");
-  p.Commit();
-  WaitUntilIdle();
-
-  CHECK_TOP_HEADLINE("Cam");
-  EnsureDebugMatches();
-  EXPECT_EQ(4, suggestion_count());
-}
-*/
-
-/* These tests make an assumption that timestamp factors into ranking, which
-   it no longer does.  It could be re-enabled if that factor is included again.
-
-#define HEADLINE_EQ(expected, index) \
-  EXPECT_EQ(expected, (*listener())[index]->display->headline)
-
-TEST_F(AskTest, AskRanking) {
-  AskProposinator p(suggestion_engine(), &loop_);
-
-  Query("");
-  p.WaitForQuery();
-  p.ProposeForAsk("View E-mail");
-  p.ProposeForAsk("Compose E-mail");
-  p.ProposeForAsk("Reply to E-mail");
-  p.ProposeForAsk("Send E-vites");
-  p.ProposeForAsk("E-mail Guests");
-  p.Commit();
-
-  WaitUntilIdle();
-  EXPECT_EQ(5, suggestion_count());
-  // Results should be ranked by timestamp at this point.
-  HEADLINE_EQ("View E-mail", 0);
-  HEADLINE_EQ("Compose E-mail", 1);
-  HEADLINE_EQ("Reply to E-mail", 2);
-  HEADLINE_EQ("Send E-vites", 3);
-  HEADLINE_EQ("E-mail Guests", 4);
-  EnsureDebugMatches();
-
-  Query("e-mail");
-  p.WaitForQuery();
-  p.ProposeForAsk("View E-mail");
-  p.ProposeForAsk("Compose E-mail");
-  p.ProposeForAsk("Reply to E-mail");
-  p.ProposeForAsk("Send E-vites");
-  p.ProposeForAsk("E-mail Guests");
-  p.Commit();
-
-  WaitUntilIdle();
-  EXPECT_EQ(5, suggestion_count());
-  HEADLINE_EQ("View E-mail", 0);
-  HEADLINE_EQ("E-mail Guests", 1);
-  HEADLINE_EQ("Compose E-mail", 2);
-  HEADLINE_EQ("Reply to E-mail", 3);
-  EnsureDebugMatches();
-
-  Query("e-mail", 2);
-  p.WaitForQuery();
-  p.ProposeForAsk("View E-mail");
-  p.ProposeForAsk("Compose E-mail");
-  p.ProposeForAsk("Reply to E-mail");
-  p.ProposeForAsk("Send E-vites");
-  p.ProposeForAsk("E-mail Guests");
-  p.Commit();
-
-  WaitUntilIdle();
-  EXPECT_EQ(2, suggestion_count());
-  HEADLINE_EQ("View E-mail", 0);
-  HEADLINE_EQ("E-mail Guests", 1);
-
-  Query("Compose", 1);
-  p.WaitForQuery();
-  p.ProposeForAsk("View E-mail");
-  p.ProposeForAsk("Compose E-mail");
-  p.ProposeForAsk("Reply to E-mail");
-  p.ProposeForAsk("Send E-vites");
-  p.ProposeForAsk("E-mail Guests");
-  p.Commit();
-
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-  HEADLINE_EQ("Compose E-mail", 0);
-  EnsureDebugMatches();
-}
-*/
-
-// This test ensures that Suggestion Engine doesn't keep querying dead handlers.
-TEST_F(AskTest, DeadAgent) {
-  AskProposinator p(suggestion_engine(), &loop_);
-
-  { AskProposinator m(suggestion_engine(), &loop_); }
-
-  Query("test query");
-  p.WaitForQuery();
-  p.ProposeForAsk("1");
-  p.Commit();
-
-  // RunUntilIdle rather than WaitUntilIdle to not wait for the query handler
-  // timeout. If we'd need to wait for the timeout, the test should fail.
-  RunUntilIdle();
-
-  EXPECT_EQ(1, suggestion_count());
-  EXPECT_TRUE(listener()->query_complete());
-}
-
-// This test ensures that if a query handler dies while handling a query,
-// Suggestion Engine stops waiting for it gracefully.
-TEST_F(AskTest, AgentKilledInAction) {
-  AskProposinator p(suggestion_engine(), &loop_);
-
-  {
-    AskProposinator coulson(suggestion_engine(), &loop_);
-
-    Query("test query");
-    p.WaitForQuery();
-    p.ProposeForAsk("1");
-    p.Commit();
-
-    RunUntilIdle();
-
-    EXPECT_FALSE(listener()->query_complete());
-  }
-
-  RunUntilIdle();
-
-  EXPECT_EQ(1, suggestion_count());
-  EXPECT_TRUE(listener()->query_complete());
-}
-
-class SuggestionFilteringTest : public NextTest {};
-
-TEST_F(SuggestionFilteringTest, Baseline) {
-  // Show that without any existing Stories, we see Proposals to launch
-  // any story.
-  Proposinator p(suggestion_engine());
-  StartListening(10);
-
-  fuchsia::modular::Intent intent;
-  intent.handler = "foo://bar";
-  fuchsia::modular::AddMod add_mod;
-  add_mod.mod_name.push_back("foo");
-  add_mod.intent = std::move(intent);
-
-  fuchsia::modular::StoryCommand command;
-  command.set_add_mod(std::move(add_mod));
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  commands.push_back(std::move(command));
-  p.Propose("1", std::move(commands));
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-}
-
-TEST_F(SuggestionFilteringTest, Baseline_FilterDoesntMatch) {
-  // Show that with an existing Story for a URL, we see Proposals to launch
-  // other URLs.
-  Proposinator p(suggestion_engine());
-  StartListening(10);
-
-  // First notify watchers of the fuchsia::modular::StoryProvider that a story
-  // already exists.
-  fuchsia::modular::StoryInfo story_info;
-  story_info.url = "foo://bazzle_dazzle";
-  story_info.id = "";
-  story_provider()->NotifyStoryChanged(
-      std::move(story_info), fuchsia::modular::StoryState::STOPPED,
-      fuchsia::modular::StoryVisibilityState::DEFAULT);
-
-  fuchsia::modular::Intent intent;
-  intent.handler = "foo://bar";
-  fuchsia::modular::AddMod add_mod;
-  add_mod.intent = std::move(intent);
-  add_mod.mod_name.push_back("foo");
-
-  fuchsia::modular::StoryCommand command;
-  command.set_add_mod(std::move(add_mod));
-  std::vector<fuchsia::modular::StoryCommand> commands;
-  commands.push_back(std::move(command));
-  p.Propose("1", std::move(commands));
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-}
-
-TEST_F(InterruptionTest, SingleInterruption) {
-  Proposinator p(suggestion_engine());
-
-  p.Propose("1", "2", fuchsia::modular::AnnoyanceType::INTERRUPT);
-
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-  EnsureDebugMatches();
-}
-
-TEST_F(InterruptionTest, RemovedInterruption) {
-  Proposinator p(suggestion_engine());
-
-  p.Propose("1", "2", fuchsia::modular::AnnoyanceType::INTERRUPT);
-
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-  EnsureDebugMatches();
-
-  // Removing shouldn't do anything to an interruption
-  p.Remove("1");
-
-  WaitUntilIdle();
-  EXPECT_EQ(1, suggestion_count());
-}
-
-}  // namespace maxwell
diff --git a/tests/maxwell_integration/test.cc b/tests/maxwell_integration/test.cc
deleted file mode 100644
index f2f2874..0000000
--- a/tests/maxwell_integration/test.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/tests/maxwell_integration/test.h"
-
-#include <lib/fxl/logging.h>
-
-namespace maxwell {
-namespace {
-
-constexpr char kEnvironmentLabel[] = "maxwell-test-env";
-
-}
-
-MaxwellTestBase::MaxwellTestBase() : loop_(&kAsyncLoopConfigAttachToThread) {
-  startup_context_ = component::StartupContext::CreateFromStartupInfo();
-
-  child_app_services_.AddService<fuchsia::modular::ComponentContext>(
-      [this](
-          fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request) {
-        child_component_context_.Connect(std::move(request));
-      });
-}
-
-void MaxwellTestBase::StartAgent(
-    const std::string& url,
-    std::unique_ptr<MaxwellServiceProviderBridge> bridge) {
-  bridge_ = std::move(bridge);
-
-  fuchsia::sys::ServiceListPtr service_list(new fuchsia::sys::ServiceList);
-  service_list->names = bridge_->service_names();
-  service_list->host_directory = bridge_->OpenAsDirectory();
-  fuchsia::sys::EnvironmentPtr agent_env;
-  startup_context_->environment()->CreateNestedEnvironment(
-      agent_env.NewRequest(), environment_controller_.NewRequest(),
-      kEnvironmentLabel, std::move(service_list), {});
-
-  fuchsia::sys::LauncherPtr launcher;
-  agent_env->GetLauncher(launcher.NewRequest());
-
-  fuchsia::sys::LaunchInfo launch_info;
-  launch_info.url = url;
-  component::Services services;
-  launch_info.directory_request = services.NewRequest();
-  FXL_LOG(INFO) << "Starting modular agent " << url;
-  launcher->CreateComponent(std::move(launch_info), nullptr);
-}
-
-component::Services MaxwellTestBase::StartServices(const std::string& url) {
-  component::Services services;
-  fuchsia::sys::LaunchInfo launch_info;
-  launch_info.url = url;
-  launch_info.directory_request = services.NewRequest();
-
-  auto service_list = fuchsia::sys::ServiceList::New();
-  service_list->names.push_back(fuchsia::modular::ComponentContext::Name_);
-  child_app_services_.AddBinding(service_list->provider.NewRequest());
-  launch_info.additional_services = std::move(service_list);
-
-  fuchsia::sys::ComponentControllerPtr component_ptr;
-  startup_context_->launcher()->CreateComponent(std::move(launch_info),
-                                                component_ptr.NewRequest());
-  component_ptrs_.push_back(std::move(component_ptr));
-  return services;
-}
-
-fuchsia::sys::Environment* MaxwellTestBase::root_environment() {
-  return startup_context_->environment().get();
-}
-
-}  // namespace maxwell
diff --git a/tests/maxwell_integration/test.h b/tests/maxwell_integration/test.h
deleted file mode 100644
index d30c743..0000000
--- a/tests/maxwell_integration/test.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_MAXWELL_INTEGRATION_TEST_H_
-#define PERIDOT_TESTS_MAXWELL_INTEGRATION_TEST_H_
-
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/component/cpp/service_provider_impl.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/svc/cpp/services.h>
-
-#include "gtest/gtest.h"
-#include "peridot/lib/environment_host/maxwell_service_provider_bridge.h"
-#include "peridot/lib/testing/component_context_fake.h"
-#include "peridot/lib/testing/entity_resolver_fake.h"
-
-namespace maxwell {
-
-class MaxwellTestBase : public testing::Test {
- protected:
-  MaxwellTestBase();
-  ~MaxwellTestBase() override = default;
-
-  void StartAgent(const std::string& url,
-                  std::unique_ptr<MaxwellServiceProviderBridge> bridge);
-
-  component::Services StartServices(const std::string& url);
-
-  template <typename Interface>
-  fidl::InterfacePtr<Interface> ConnectToService(const std::string& url) {
-    auto services = StartServices(url);
-    return services.ConnectToService<Interface>();
-  }
-
-  fuchsia::sys::Environment* root_environment();
-
-  modular::EntityResolverFake& entity_resolver() {
-    return child_component_context_.entity_resolver_fake();
-  }
-
-  async::Loop loop_;
-
- private:
-  std::unique_ptr<component::StartupContext> startup_context_;
-  fuchsia::sys::EnvironmentControllerPtr environment_controller_;
-  std::vector<fuchsia::sys::ComponentControllerPtr> component_ptrs_;
-
-  std::unique_ptr<maxwell::MaxwellServiceProviderBridge> bridge_;
-
-  component::ServiceProviderImpl child_app_services_;
-  modular::ComponentContextFake child_component_context_;
-};
-
-}  // namespace maxwell
-
-#endif  // PERIDOT_TESTS_MAXWELL_INTEGRATION_TEST_H_
diff --git a/tests/maxwell_integration/test_suggestion_listener.cc b/tests/maxwell_integration/test_suggestion_listener.cc
deleted file mode 100644
index 534ba5c..0000000
--- a/tests/maxwell_integration/test_suggestion_listener.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/tests/maxwell_integration/test_suggestion_listener.h"
-
-#include <lib/fostr/fidl/fuchsia/modular/formatting.h>
-
-bool suggestion_less(const fuchsia::modular::Suggestion* a,
-                     const fuchsia::modular::Suggestion* b) {
-  return a->confidence > b->confidence;
-}
-
-namespace modular {
-
-template <typename T>
-std::ostream& operator<<(std::ostream& os, const std::vector<T>& value) {
-  os << "[ ";
-  for (const T& element : value) {
-    os << element << " ";
-  }
-  return os << "]";
-}
-
-void TestSuggestionListener::OnInterrupt(
-    fuchsia::modular::Suggestion suggestion) {
-  FXL_LOG(INFO) << "OnInterrupt(" << suggestion.uuid << ")";
-
-  ClearSuggestions();
-
-  auto insert_head = ordered_suggestions_.begin();
-  insert_head = std::upper_bound(insert_head, ordered_suggestions_.end(),
-                                 &suggestion, suggestion_less);
-  suggestions_by_id_[suggestion.uuid] = fuchsia::modular::Suggestion();
-  fidl::Clone(suggestion, &suggestions_by_id_[suggestion.uuid]);
-  insert_head = ordered_suggestions_.insert(
-                    insert_head, &suggestions_by_id_[suggestion.uuid]) +
-                1;
-
-  EXPECT_EQ((signed)ordered_suggestions_.size(),
-            (signed)suggestions_by_id_.size());
-}
-
-void TestSuggestionListener::OnNextResults(
-    std::vector<fuchsia::modular::Suggestion> suggestions) {
-  FXL_LOG(INFO) << "OnNextResults(" << suggestions << ")";
-
-  OnAnyResults(suggestions);
-}
-
-void TestSuggestionListener::OnQueryResults(
-    std::vector<fuchsia::modular::Suggestion> suggestions) {
-  FXL_LOG(INFO) << "OnQueryResults(" << suggestions << ")";
-
-  OnAnyResults(suggestions);
-}
-
-void TestSuggestionListener::OnAnyResults(
-    std::vector<fuchsia::modular::Suggestion>& suggestions) {
-  ClearSuggestions();
-
-  auto insert_head = ordered_suggestions_.begin();
-  for (auto& suggestion : suggestions) {
-    insert_head = std::upper_bound(insert_head, ordered_suggestions_.end(),
-                                   &suggestion, suggestion_less);
-    suggestions_by_id_[suggestion.uuid] = fuchsia::modular::Suggestion();
-    fidl::Clone(suggestion, &suggestions_by_id_[suggestion.uuid]);
-    insert_head = ordered_suggestions_.insert(
-                      insert_head, &suggestions_by_id_[suggestion.uuid]) +
-                  1;
-  }
-
-  EXPECT_EQ((signed)ordered_suggestions_.size(),
-            (signed)suggestions_by_id_.size());
-}
-
-void TestSuggestionListener::ClearSuggestions() {
-  // For use when the listener_binding_ is reset
-  ordered_suggestions_.clear();
-  suggestions_by_id_.clear();
-  query_complete_ = false;
-}
-
-void TestSuggestionListener::OnProcessingChange(bool processing) {
-  FXL_LOG(INFO) << "OnProcessingChange to " << processing;
-}
-
-void TestSuggestionListener::OnQueryComplete() {
-  FXL_LOG(INFO) << "OnQueryComplete";
-  query_complete_ = true;
-}
-
-}  // namespace modular
diff --git a/tests/maxwell_integration/test_suggestion_listener.h b/tests/maxwell_integration/test_suggestion_listener.h
deleted file mode 100644
index 326b781..0000000
--- a/tests/maxwell_integration/test_suggestion_listener.h
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_MAXWELL_INTEGRATION_TEST_SUGGESTION_LISTENER_H_
-#define PERIDOT_TESTS_MAXWELL_INTEGRATION_TEST_SUGGESTION_LISTENER_H_
-
-#include <map>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/fxl/logging.h>
-
-#include "gtest/gtest.h"
-
-namespace modular {
-
-class TestSuggestionListener : public fuchsia::modular::NextListener,
-                               public fuchsia::modular::QueryListener,
-                               public fuchsia::modular::InterruptionListener {
- public:
-  // |fuchsia::modular::InterruptionListener|
-  void OnInterrupt(fuchsia::modular::Suggestion suggestion) override;
-
-  // |fuchsia::modular::NextListener|
-  void OnNextResults(
-      std::vector<fuchsia::modular::Suggestion> suggestions) override;
-
-  // |fuchsia::modular::NextListener|
-  void OnProcessingChange(bool processing) override;
-
-  // |fuchsia::modular::QueryListener|
-  void OnQueryResults(
-      std::vector<fuchsia::modular::Suggestion> suggestions) override;
-
-  // |fuchsia::modular::QueryListener|
-  void OnQueryComplete() override;
-
-  bool query_complete() const { return query_complete_; }
-  int suggestion_count() const { return (signed)ordered_suggestions_.size(); }
-
-  void ClearSuggestions();
-
-  // Exposes a pointer to the only suggestion in this listener. Retains
-  // ownership of the pointer.
-  const fuchsia::modular::Suggestion* GetOnlySuggestion() const {
-    EXPECT_EQ(1, suggestion_count());
-    return GetTopSuggestion();
-  }
-
-  // Exposes a pointer to the top suggestion in this listener. Retains
-  // ownership of the pointer.
-  const fuchsia::modular::Suggestion* GetTopSuggestion() const {
-    EXPECT_GE(suggestion_count(), 1);
-    return ordered_suggestions_.front();
-  }
-
-  const fuchsia::modular::Suggestion* operator[](int index) const {
-    return ordered_suggestions_[index];
-  }
-
-  const fuchsia::modular::Suggestion* operator[](const std::string& id) const {
-    auto it = suggestions_by_id_.find(id);
-    return it == suggestions_by_id_.end() ? NULL : &it->second;
-  }
-
-  const std::vector<fuchsia::modular::Suggestion*>& GetSuggestions() {
-    return ordered_suggestions_;
-  }
-
- private:
-  void OnAnyResults(std::vector<fuchsia::modular::Suggestion>& suggestions);
-
-  std::map<std::string, fuchsia::modular::Suggestion> suggestions_by_id_;
-  std::vector<fuchsia::modular::Suggestion*> ordered_suggestions_;
-  bool query_complete_ = false;
-};
-
-class TestProposalListener {
- public:
-  const std::vector<fuchsia::modular::ProposalSummary>& GetProposals() {
-    return proposals_;
-  }
-  int proposal_count() const { return proposals_.size(); }
-
- protected:
-  void UpdateProposals(
-      std::vector<fuchsia::modular::ProposalSummary> proposals) {
-    proposals_.clear();
-    for (size_t i = 0; i < proposals.size(); ++i) {
-      proposals_.push_back(std::move(proposals.at(i)));
-    }
-  }
-  std::vector<fuchsia::modular::ProposalSummary> proposals_;
-};
-
-class TestDebugNextListener : public fuchsia::modular::NextProposalListener,
-                              public TestProposalListener {
- public:
-  void OnNextUpdate(
-      std::vector<fuchsia::modular::ProposalSummary> proposals) override {
-    FXL_LOG(INFO) << "In OnNextUpdate debug";
-    UpdateProposals(std::move(proposals));
-  }
-};
-
-class TestDebugAskListener : public fuchsia::modular::AskProposalListener,
-                             public TestProposalListener {
- public:
-  void OnAskStart(
-      std::string query,
-      std::vector<fuchsia::modular::ProposalSummary> proposals) override {
-    UpdateProposals(std::move(proposals));
-    query_ = query;
-  }
-  void OnProposalSelected(
-      fuchsia::modular::ProposalSummaryPtr selectedProposal) override {
-    selected_proposal_ = selectedProposal.get();
-  }
-  const std::string get_query() { return query_; }
-  fuchsia::modular::ProposalSummary* get_selected_proposal() {
-    return selected_proposal_;
-  }
-
- private:
-  std::string query_;
-  fuchsia::modular::ProposalSummary* selected_proposal_;
-};
-
-class TestDebugInterruptionListener
-    : public fuchsia::modular::InterruptionProposalListener {
- public:
-  void OnInterrupt(
-      fuchsia::modular::ProposalSummary interruptionProposal) override {
-    interrupt_proposal_ = std::move(interruptionProposal);
-  }
-  fuchsia::modular::ProposalSummary get_interrupt_proposal() {
-    fuchsia::modular::ProposalSummary result;
-    fidl::Clone(interrupt_proposal_, &result);
-    return result;
-  }
-
- private:
-  fuchsia::modular::ProposalSummary interrupt_proposal_;
-};
-
-}  // namespace modular
-
-#endif  // PERIDOT_TESTS_MAXWELL_INTEGRATION_TEST_SUGGESTION_LISTENER_H_
diff --git a/tests/modular_tests.json b/tests/modular_tests.json
deleted file mode 100644
index af69f88..0000000
--- a/tests/modular_tests.json
+++ /dev/null
@@ -1,172 +0,0 @@
-{
-  "tests": [
-    {
-      "name": "clipboard",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/dev_session_shell#meta/dev_session_shell.cmx",
-        "--session_shell_args=--root_module=fuchsia-pkg://fuchsia.com/clipboard_test_module#meta/clipboard_test_module.cmx",
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "component_context",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger",
-        "--session_shell=fuchsia-pkg://fuchsia.com/dev_session_shell#meta/dev_session_shell.cmx",
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx",
-        "--session_shell_args=--root_module=fuchsia-pkg://fuchsia.com/component_context_test_module#meta/component_context_test_module.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "embed_shell",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/embed_shell_test_session_shell#meta/embed_shell_test_session_shell.cmx",
-        "--story_shell=fuchsia-pkg://fuchsia.com/embed_shell_test_story_shell#meta/embed_shell_test_story_shell.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "last_focus_time",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/last_focus_time_test_session_shell#meta/last_focus_time_test_session_shell.cmx",
-        "--session_shell_args=--use_memfs_for_ledger",
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "link_context_entities",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/link_context_entities_test_session_shell#meta/link_context_entities_test_session_shell.cmx",
-        "--session_shell_args=--use_memfs_for_ledger",
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "parent_child",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/dev_session_shell#meta/dev_session_shell.cmx",
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx",
-        "--session_shell_args=--root_module=fuchsia-pkg://fuchsia.com/parent_child_test_parent_module#meta/parent_child_test_parent_module.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "queue_persistence",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/dev_session_shell#meta/dev_session_shell.cmx",
-        "--session_shell_args=--root_module=fuchsia-pkg://fuchsia.com/queue_persistence_test_module#meta/queue_persistence_test_module.cmx",
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "story_shell",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/story_shell_test_session_shell#meta/story_shell_test_session_shell.cmx",
-        "--session_shell_args=--use_memfs_for_ledger",
-        "--story_shell=fuchsia-pkg://fuchsia.com/story_shell_test_story_shell#meta/story_shell_test_story_shell.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "suggestion",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/suggestion_test_session_shell#meta/suggestion_test_session_shell.cmx",
-        "--session_shell_args=--use_memfs_for_ledger",
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "trigger",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/trigger_test_session_shell#meta/trigger_test_session_shell.cmx",
-        "--session_shell_args=--use_memfs_for_ledger",
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "module_context",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/module_context_test_session_shell#meta/module_context_test_session_shell.cmx",
-        "--session_shell_args=--use_memfs_for_ledger",
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "session_shell",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/session_shell_test_session_shell#meta/session_shell_test_session_shell.cmx",
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    },
-    {
-      "name": "intents",
-      "exec": [
-        "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
-        "--test",
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/dev_token_manager.cmx",
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/dev_base_shell.cmx",
-        "--session_shell=fuchsia-pkg://fuchsia.com/dev_session_shell#meta/dev_session_shell.cmx",
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/dev_story_shell.cmx",
-        "--session_shell_args=--root_module=fuchsia-pkg://fuchsia.com/intent_test_parent_module#meta/intent_test_parent_module.cmx",
-        "--sessionmgr_args=--use_memfs_for_ledger"
-      ]
-    }
-  ]
-}
\ No newline at end of file
diff --git a/tests/module_context/BUILD.gn b/tests/module_context/BUILD.gn
deleted file mode 100644
index 3cb69fa..0000000
--- a/tests/module_context/BUILD.gn
+++ /dev/null
@@ -1,101 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-executable_package("module_context_test_session_shell") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/module_context_test_session_shell.cmx"
-      dest = "module_context_test_session_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "module_context_test_session_shell.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:single_service_app",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:component_main",
-    "//peridot/lib/testing:session_shell_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-  ]
-}
-
-executable_package("module_context_test_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/module_context_test_module.cmx"
-      dest = "module_context_test_module.cmx"
-    },
-  ]
-
-  sources = [
-    "module_context_test_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:component_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//peridot/tests/trigger:trigger_test_service",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("module_context_test_entity_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/module_context_test_entity_module.cmx"
-      dest = "module_context_test_entity_module.cmx"
-    },
-  ]
-
-  sources = [
-    "module_context_test_entity_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//peridot/lib/entity:entity_watcher",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:component_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/tests/common:defs",
-    "//peridot/tests/trigger:trigger_test_service",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
diff --git a/tests/module_context/README.md b/tests/module_context/README.md
deleted file mode 100644
index 2eb14bb..0000000
--- a/tests/module_context/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# ModuleContext integration test
-
-Tests that calls to ModuleContext.RemoveSelfFromStory() are handled correctly by the framework.
-
-The session shell starts a story and adds two modules to it. It then signals the
-first module to call ModuleContext.RemoveSelfFromStory and verifies that the
-module is stopped. The session shell then signals the second module to
-ModuleContext.RemoveSelfFromStory, and verifies that the story is stopped as
-well.
\ No newline at end of file
diff --git a/tests/module_context/defs.h b/tests/module_context/defs.h
deleted file mode 100644
index 91f2334..0000000
--- a/tests/module_context/defs.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_MODULE_CONTEXT_DEFS_H_
-#define PERIDOT_TESTS_MODULE_CONTEXT_DEFS_H_
-
-namespace {
-
-// The name of the link that the modules receive their startup parameters on.
-constexpr char kLinkName[] = "link";
-
-// The key the modules use to Get their name.
-constexpr char kLinkKey[] = "name";
-
-// The URL for the module under test.
-constexpr char kModuleUrl[] =
-    "fuchsia-pkg://fuchsia.com/module_context_test_module#meta/module_context_test_module.cmx";
-
-// The intent action |kModuleUrl| accepts.
-constexpr char kIntentAction[] = "action";
-
-// The URL for the entity test module.
-constexpr char kEntityModuleUrl[] =
-    "fuchsia-pkg://fuchsia.com/module_context_test_entity_module#meta/module_context_test_entity_module.cmx";
-
-// The intent action |kEntityModuleUrl| accepts.
-constexpr char kEntityIntentAction[] = "test";
-
-// The names of the first and second modules to be stopped.
-constexpr char kFirstModuleName[] = "first";
-constexpr char kSecondModuleName[] = "second";
-
-// The signal the modules wait for before calling done.
-constexpr char kFirstModuleCallDone[] = "first_done";
-constexpr char kSecondModuleCallDone[] = "second_done";
-
-// The signal the modules wait for before starting/stopping ongoing activity.
-constexpr char kFirstModuleCallStartActivity[] = "first_activity_start";
-constexpr char kSecondModuleCallStartActivity[] = "second_activity_start";
-constexpr char kFirstModuleCallStopActivity[] = "first_activity_stop";
-constexpr char kSecondModuleCallStopActivity[] = "second_activity_stop";
-
-// The signal the modules send when they have been terminated.
-constexpr char kFirstModuleTerminated[] = "first terminated";
-constexpr char kSecondModuleTerminated[] = "second terminated";
-
-// The signals the entity module sends once it's done verifying the entity
-// related methods on module context. Once all these have been signaled the
-// module is done.
-constexpr char kEntityModuleDoneFirstTask[] = "entity_module_done_first";
-constexpr char kEntityModuleDoneSecondTask[] = "entity_module_done_second";
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_MODULE_CONTEXT_DEFS_H_
diff --git a/tests/module_context/meta/module_context_test_entity_module.cmx b/tests/module_context/meta/module_context_test_entity_module.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/module_context/meta/module_context_test_entity_module.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/module_context/meta/module_context_test_module.cmx b/tests/module_context/meta/module_context_test_module.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/module_context/meta/module_context_test_module.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/module_context/meta/module_context_test_session_shell.cmx b/tests/module_context/meta/module_context_test_session_shell.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/module_context/meta/module_context_test_session_shell.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/module_context/module_context_test_entity_module.cc b/tests/module_context/module_context_test_entity_module.cc
deleted file mode 100644
index 484c1db..0000000
--- a/tests/module_context/module_context_test_entity_module.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.h>
-#include <test/peridot/tests/trigger/cpp/fidl.h>
-
-#include "peridot/lib/entity/entity_watcher_impl.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/module_context/defs.h"
-
-using ::modular::testing::Await;
-using ::modular::testing::Signal;
-using ::modular::testing::TestPoint;
-using ::test::peridot::tests::trigger::TriggerTestServicePtr;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestApp {
- public:
-  TestPoint initialized_{"Entity module initialized"};
-  TestPoint created_entity_{"Created entity"};
-  TestPoint entity_data_correct_{"Entity data correct"};
-  TestPoint entity_data_correct_after_resolution_{
-      "Entity data correct after entity resolution"};
-  TestPoint watch_data_correct_{"Entity watch returned correct data"};
-  TestApp(modular::ModuleHost* const module_host,
-          fidl::InterfaceRequest<
-              fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_context_(module_host->module_context()),
-        entity_watcher_binding_(&entity_watcher_) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    initialized_.Pass();
-
-    const char kTestString[] = "test";
-    const char kTestType[] = "com.fuchsia.test";
-    const char kUpdatedString[] = "updated";
-    fsl::SizedVmo vmo;
-    fsl::VmoFromString(kTestString, &vmo);
-    module_context_->CreateEntity(
-        kTestType, std::move(vmo).ToTransport(), entity_.NewRequest(),
-        fxl::MakeCopyable([this](fidl::StringPtr entity_reference) mutable {
-          if (!entity_reference || entity_reference->empty()) {
-            modular::testing::Fail("Failed to create entity.");
-            return;
-          } else {
-            created_entity_.Pass();
-          }
-        }));
-
-    // Register a watcher and make sure it is notified with the correct data
-    // when the entity value is updated.
-    entity_watcher_.SetOnUpdated(
-        [this, kUpdatedString](std::unique_ptr<fuchsia::mem::Buffer> value) {
-          if (value) {
-            std::string data_string;
-            fsl::StringFromVmo(*value, &data_string);
-
-            if (data_string == kUpdatedString) {
-              watch_data_correct_.Pass();
-              Signal(kEntityModuleDoneSecondTask);
-            }
-          }
-        });
-
-    entity_->Watch(kTestType, entity_watcher_binding_.NewBinding());
-
-    // Fetch the data and verify that it matches the data used to create the
-    // entity.
-    entity_->GetData(
-        kTestType,
-        fxl::MakeCopyable([this, kTestString](fuchsia::mem::BufferPtr data) {
-          if (data) {
-            std::string data_string;
-            fsl::StringFromVmo(*data, &data_string);
-            if (data_string == kTestString) {
-              entity_data_correct_.Pass();
-            }
-          }
-          Signal(kEntityModuleDoneFirstTask);
-        }));
-
-    // Fetch the reference from the entity to verify the round-trip
-    // resolution.
-    entity_->GetReference(
-        fxl::MakeCopyable([this, kTestString, kTestType,
-                           kUpdatedString](fidl::StringPtr entity_reference) {
-          // Grab the entity resolver from the component context.
-          fuchsia::modular::EntityResolverPtr entity_resolver;
-          fuchsia::modular::ComponentContextPtr component_context;
-          module_context_->GetComponentContext(component_context.NewRequest());
-          component_context->GetEntityResolver(entity_resolver.NewRequest());
-
-          // Resolve the entity and verify the data is correct.
-          fuchsia::modular::EntityPtr resolved_entity;
-          entity_resolver->ResolveEntity(entity_reference,
-                                         resolved_entity.NewRequest());
-          resolved_entity->GetData(
-              kTestType,
-              fxl::MakeCopyable([this, kTestString, kTestType, kUpdatedString,
-                                 resolved_entity = std::move(resolved_entity)](
-                                    fuchsia::mem::BufferPtr data) {
-                if (data) {
-                  std::string data_string;
-                  fsl::StringFromVmo(*data, &data_string);
-                  if (data_string == kTestString) {
-                    entity_data_correct_after_resolution_.Pass();
-                  }
-                }
-
-                fsl::SizedVmo vmo;
-                fsl::VmoFromString(kUpdatedString, &vmo);
-                entity_->WriteData(
-                    kTestType, std::move(vmo).ToTransport(),
-                    [](fuchsia::modular::EntityWriteStatus status) {});
-              }));
-        }));
-  }
-
-  TestApp(modular::ModuleHost* const module_host,
-          fidl::InterfaceRequest<
-              fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestApp(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  TestPoint stopped_{"Entity module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  fuchsia::modular::EntityPtr entity_;
-  std::string module_name_ = "";
-  fuchsia::modular::OngoingActivityPtr ongoing_activity_;
-  fuchsia::modular::ModuleContext* module_context_;
-  modular::EntityWatcherImpl entity_watcher_;
-  fidl::Binding<fuchsia::modular::EntityWatcher> entity_watcher_binding_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestApp> driver(context.get(),
-                                        [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/module_context/module_context_test_module.cc b/tests/module_context/module_context_test_module.cc
deleted file mode 100644
index bc88447..0000000
--- a/tests/module_context/module_context_test_module.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/fsl/vmo/strings.h>
-#include <test/peridot/tests/trigger/cpp/fidl.h>
-
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/module_context/defs.h"
-
-using ::modular::testing::Await;
-using ::modular::testing::Signal;
-using ::modular::testing::TestPoint;
-using ::test::peridot::tests::trigger::TriggerTestServicePtr;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestPoint initialized_{"Root module initialized"};
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    fuchsia::modular::ModuleContext* module_context =
-        module_host->module_context();
-    initialized_.Pass();
-
-    module_host->module_context()->GetLink(kLinkName, link_.NewRequest());
-    fidl::VectorPtr<std::string> name;
-    name.push_back(kLinkKey);
-    link_->Get(name.Clone(), [this, module_context](
-                                 std::unique_ptr<fuchsia::mem::Buffer> value) {
-      if (!value) {
-        modular::testing::Fail("Did not receive a module name in link.");
-        return;
-      }
-
-      std::string value_string;
-      FXL_CHECK(fsl::StringFromVmo(*value, &value_string));
-
-      rapidjson::Document document;
-      document.Parse(value_string.c_str());
-      module_name_ = document.GetString();
-
-      Await(module_name_ == kFirstModuleName ? kFirstModuleCallDone
-                                             : kSecondModuleCallDone,
-            [this, module_context] { module_context->RemoveSelfFromStory(); });
-      Await(module_name_ == kFirstModuleName ? kFirstModuleCallStartActivity
-                                             : kSecondModuleCallStartActivity,
-            [this, module_context] {
-              module_context->StartOngoingActivity(
-                  fuchsia::modular::OngoingActivityType::VIDEO,
-                  ongoing_activity_.NewRequest());
-            });
-      Await(module_name_ == kFirstModuleName ? kFirstModuleCallStopActivity
-                                             : kSecondModuleCallStopActivity,
-            [this, module_context] { ongoing_activity_.Unbind(); });
-    });
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  // Called by ModuleDriver.
-  TestPoint stopped_{"Root module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    std::string terminated = module_name_ == kFirstModuleName
-                                 ? kFirstModuleTerminated
-                                 : kSecondModuleTerminated;
-    Signal(terminated);
-    modular::testing::Done(done);
-  }
-
- private:
-  fuchsia::modular::LinkPtr link_;
-  std::string module_name_ = "";
-  fuchsia::modular::OngoingActivityPtr ongoing_activity_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/module_context/module_context_test_session_shell.cc b/tests/module_context/module_context_test_session_shell.cc
deleted file mode 100644
index 17f2238..0000000
--- a/tests/module_context/module_context_test_session_shell.cc
+++ /dev/null
@@ -1,364 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/lib/testing/component_main.h"
-#include "peridot/lib/testing/session_shell_base.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/module_context/defs.h"
-
-using ::modular::testing::Await;
-using ::modular::testing::Signal;
-using ::modular::testing::TestPoint;
-
-namespace {
-
-const char kStoryName[] = "story";
-
-// A simple story activity watcher implementation.
-class StoryActivityWatcherImpl : fuchsia::modular::StoryActivityWatcher {
- public:
-  StoryActivityWatcherImpl()
-      : binding_(this),
-        on_notify_(
-            [](std::string,
-               std::vector<fuchsia::modular::OngoingActivityType>) {}) {}
-  ~StoryActivityWatcherImpl() override = default;
-
-  void Watch(fuchsia::modular::StoryProvider* const story_provider) {
-    story_provider->WatchActivity(binding_.NewBinding());
-  }
-
-  void OnNotify(std::function<
-                void(std::string,
-                     std::vector<fuchsia::modular::OngoingActivityType>)>
-                    on_notify) {
-    on_notify_ = std::move(on_notify);
-  }
-
- private:
-  // |fuchsia::modular::StoryActivityWatcher|
-  void OnStoryActivityChange(
-      std::string story_id,
-      std::vector<fuchsia::modular::OngoingActivityType> activities)
-      override {
-    on_notify_(std::move(story_id), std::move(activities));
-  }
-
-  fidl::Binding<fuchsia::modular::StoryActivityWatcher> binding_;
-  std::function<void(std::string,
-                     std::vector<fuchsia::modular::OngoingActivityType>)>
-      on_notify_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryActivityWatcherImpl);
-};
-
-class TestApp : public modular::testing::SessionShellBase {
- public:
-  TestApp(component::StartupContext* const startup_context)
-      : SessionShellBase(startup_context), weak_ptr_factory_(this) {
-    TestInit(__FILE__);
-
-    startup_context->ConnectToEnvironmentService(puppet_master_.NewRequest());
-
-    CreateStory();
-  }
-
-  ~TestApp() override = default;
-
- private:
-  TestPoint story_create_{"Created story."};
-  void CreateStory() {
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    {
-      fuchsia::modular::AddMod add_mod;
-      add_mod.mod_name.push_back(kFirstModuleName);
-      add_mod.intent = IntentWithParameterString(kFirstModuleName);
-
-      fuchsia::modular::StoryCommand command;
-      command.set_add_mod(std::move(add_mod));
-      commands.push_back(std::move(command));
-    }
-    {
-      fuchsia::modular::AddMod add_mod;
-      add_mod.mod_name.push_back(kSecondModuleName);
-      add_mod.intent = IntentWithParameterString(kSecondModuleName);
-
-      fuchsia::modular::StoryCommand command;
-      command.set_add_mod(std::move(add_mod));
-      commands.push_back(std::move(command));
-    }
-    {
-      fuchsia::modular::Intent intent;
-      intent.handler = kEntityModuleUrl;
-      intent.action = kEntityIntentAction;
-      fuchsia::modular::AddMod add_mod;
-      add_mod.mod_name.push_back("entity_module");
-      add_mod.intent = std::move(intent);
-      add_mod.surface_parent_mod_name.resize(0);
-
-      fuchsia::modular::StoryCommand command;
-      command.set_add_mod(std::move(add_mod));
-      commands.push_back(std::move(command));
-    }
-
-    puppet_master_->ControlStory(kStoryName, story_puppet_master_.NewRequest());
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          story_create_.Pass();
-          StartStory();
-        });
-  }
-
-  TestPoint story_get_controller_{"Story GetController()"};
-  // Starts the story and adds two modules to it.
-  void StartStory() {
-    story_provider()->GetController(kStoryName, story_controller_.NewRequest());
-    story_controller_.set_error_handler([this](zx_status_t status) {
-      FXL_LOG(ERROR) << "Story controller for story " << kStoryName
-                     << " died. Does this story exist?";
-    });
-
-    story_controller_->RequestStart();
-    story_controller_->GetInfo(
-        [this](fuchsia::modular::StoryInfo, fuchsia::modular::StoryState) {
-          story_get_controller_.Pass();
-          PerformWatchActivity();
-        });
-  }
-
-  TestPoint on_watch_ongoing_activities_dispatched{
-      "When a watcher is registered, ongoing activities should be dispatched."};
-  void PerformWatchActivity() {
-    story_activity_watcher_.Watch(story_provider());
-    story_activity_watcher_.OnNotify(
-        [this](
-            std::string story_id,
-            std::vector<fuchsia::modular::OngoingActivityType> activities) {
-          if (story_id == kStoryName && activities.empty()) {
-            on_watch_ongoing_activities_dispatched.Pass();
-          }
-          PerformFirstModuleStartActivity();
-        });
-  }
-
-  TestPoint on_start_ongoing_activity_dispatched{
-      "When there is a new ongoing activity, the ongoing activity should be "
-      "dispatched."};
-  // Signals the first module to call ModuleContext.StartOngoingActivity().
-  void PerformFirstModuleStartActivity() {
-    Signal(kFirstModuleCallStartActivity);
-    story_activity_watcher_.OnNotify(
-        [this](
-            std::string story_id,
-            std::vector<fuchsia::modular::OngoingActivityType> activities) {
-          if (story_id == kStoryName && activities.size() == 1 &&
-              activities[0] ==
-                  fuchsia::modular::OngoingActivityType::VIDEO) {
-            on_start_ongoing_activity_dispatched.Pass();
-          }
-          PerformSecondModuleStartActivity();
-        });
-  }
-
-  TestPoint on_start_all_ongoing_activities_dispatched{
-      "When there is a new ongoing activity, all ongoing activities should be "
-      "dispatched."};
-  // Signals the second module to call ModuleContext.StartOngoingActivity().
-  void PerformSecondModuleStartActivity() {
-    Signal(kSecondModuleCallStartActivity);
-    story_activity_watcher_.OnNotify(
-        [this](
-            std::string story_id,
-            std::vector<fuchsia::modular::OngoingActivityType> activities) {
-          if (story_id == kStoryName && activities.size() == 2 &&
-              activities[0] ==
-                  fuchsia::modular::OngoingActivityType::VIDEO &&
-              activities[1] ==
-                  fuchsia::modular::OngoingActivityType::VIDEO) {
-            on_start_all_ongoing_activities_dispatched.Pass();
-          }
-          PerformSecondModuleStopActivity();
-        });
-  }
-
-  TestPoint on_stop_remaining_ongoing_activities_dispatched{
-      "When an ongoing activity is stopped, all remaining ongoing activities "
-      "should be dispatched."};
-  // Signals the second module to stop ongoing activity.
-  void PerformSecondModuleStopActivity() {
-    Signal(kSecondModuleCallStopActivity);
-    story_activity_watcher_.OnNotify(
-        [this](
-            std::string story_id,
-            std::vector<fuchsia::modular::OngoingActivityType> activities) {
-          if (story_id == kStoryName && activities.size() == 1 &&
-              activities[0] ==
-                  fuchsia::modular::OngoingActivityType::VIDEO) {
-            on_stop_remaining_ongoing_activities_dispatched.Pass();
-          }
-          TestModuleCreatingEntity();
-        });
-  }
-
-  void TestModuleCreatingEntity() {
-    Await(kEntityModuleDoneFirstTask, [this] {
-      Await(kEntityModuleDoneSecondTask, [this] {
-        fuchsia::modular::Intent intent;
-        intent.handler = kEntityModuleUrl;
-        intent.action = kEntityIntentAction;
-        fuchsia::modular::RemoveMod remove_mod;
-        remove_mod.mod_name.push_back("entity_module");
-
-        std::vector<fuchsia::modular::StoryCommand> commands;
-        fuchsia::modular::StoryCommand command;
-        command.set_remove_mod(std::move(remove_mod));
-        commands.push_back(std::move(command));
-
-        puppet_master_->ControlStory(kStoryName,
-                                     story_puppet_master_.NewRequest());
-        story_puppet_master_->Enqueue(std::move(commands));
-        story_puppet_master_->Execute(
-            [this](fuchsia::modular::ExecuteResult result) {
-              PerformFirstModuleDone();
-            });
-      });
-    });
-  }
-
-  TestPoint on_done_ongoing_activities_stopped{
-      "When a module is teared down, the ongoing activity should also be "
-      "stopped"};
-  TestPoint second_module_active_{
-      "Only second module is still active after first calls "
-      "RemoveSelfFromStory()"};
-  // Signals the first module to call ModuleContext.RemoveSelfFromStory().
-  void PerformFirstModuleDone() {
-    Signal(kFirstModuleCallDone);
-    Await(kFirstModuleTerminated, [this] {
-      // Verify that the second module is still active, but the first one is
-      // not.
-      story_controller_->GetActiveModules(
-          [this](std::vector<fuchsia::modular::ModuleData> module_data) {
-            if (module_data.size() == 1) {
-              second_module_active_.Pass();
-            }
-            VerifyStoryStillRunning();
-          });
-    });
-
-    story_activity_watcher_.OnNotify(
-        [this](
-            std::string story_id,
-            std::vector<fuchsia::modular::OngoingActivityType> activities) {
-          if (story_id == kStoryName && activities.empty()) {
-            on_done_ongoing_activities_stopped.Pass();
-          }
-        });
-  }
-
-  TestPoint story_still_active_{
-      "The story is still active after first module calls "
-      "RemoveSelfFromStory()"};
-  // Verifies that the story is still running after the first module has called
-  // done and been stopped.
-  void VerifyStoryStillRunning() {
-    IsStoryRunning([this](bool is_running) {
-      if (is_running) {
-        story_still_active_.Pass();
-      }
-      PerformSecondModuleDone();
-    });
-  }
-
-  TestPoint no_module_active_{
-      "No modules are active after second mod calls RemoveSelfFromStory()"};
-  TestPoint story_stopped_{"The story was stopped."};
-  // Signals the second module to call ModuleContext.Done.
-  void PerformSecondModuleDone() {
-    Signal(kSecondModuleCallDone);
-    Await(kSecondModuleTerminated, [this] {
-      // Verify that the second module is still active.
-      story_controller_->GetActiveModules(
-          [this](std::vector<fuchsia::modular::ModuleData> module_data) {
-            if (module_data.empty()) {
-              no_module_active_.Pass();
-            }
-            IsStoryRunning([this](bool is_running) {
-              if (!is_running) {
-                story_stopped_.Pass();
-              }
-
-              Signal(modular::testing::kTestShutdown);
-            });
-          });
-    });
-  }
-
-  // Verifies that the story is stopped when the last module that is part of the
-  // story calls ModuleContext.Done and is stopped.
-  void IsStoryRunning(std::function<void(bool)> callback) {
-    story_controller_->GetInfo(
-        [this, callback](fuchsia::modular::StoryInfo story_info,
-                         fuchsia::modular::StoryState state) {
-          callback(state == fuchsia::modular::StoryState::RUNNING);
-        });
-  }
-
-  // Creates an intent with one parameter, kLinkName, with the following
-  // contents: { |kLinkKey| : |parameter_string| }.
-  fuchsia::modular::Intent IntentWithParameterString(
-      std::string parameter_string) {
-    fuchsia::modular::Intent intent;
-    intent.handler = kModuleUrl;
-    intent.action = kIntentAction;
-
-    fuchsia::modular::IntentParameter parameter;
-    parameter.name = kLinkName;
-
-    rapidjson::Document document;
-    document.SetObject();
-    document.AddMember(kLinkKey, parameter_string, document.GetAllocator());
-
-    fuchsia::modular::IntentParameterData parameter_data;
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(modular::JsonValueToString(document), &vmo));
-    parameter_data.set_json(std::move(vmo).ToTransport());
-    parameter.data = std::move(parameter_data);
-    intent.parameters.push_back(std::move(parameter));
-
-    return intent;
-  }
-
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-  fuchsia::modular::StoryControllerPtr story_controller_;
-  StoryActivityWatcherImpl story_activity_watcher_;
-
-  fxl::WeakPtrFactory<TestApp> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  modular::testing::ComponentMain<TestApp>();
-  return 0;
-}
diff --git a/tests/parent_child/BUILD.gn b/tests/parent_child/BUILD.gn
deleted file mode 100644
index 31adf51..0000000
--- a/tests/parent_child/BUILD.gn
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
-
-executable_package("parent_child_test_child_module1") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/parent_child_test_child_module1.cmx"
-      dest = "parent_child_test_child_module1.cmx"
-    },
-  ]
-
-  sources = [
-    "parent_child_test_child_module1.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("parent_child_test_child_module2") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/parent_child_test_child_module2.cmx"
-      dest = "parent_child_test_child_module2.cmx"
-    },
-  ]
-
-  sources = [
-    "parent_child_test_child_module2.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("parent_child_test_parent_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/parent_child_test_parent_module.cmx"
-      dest = "parent_child_test_parent_module.cmx"
-    },
-  ]
-
-  sources = [
-    "parent_child_test_parent_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/callback",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
diff --git a/tests/parent_child/README.md b/tests/parent_child/README.md
deleted file mode 100644
index 107bddf..0000000
--- a/tests/parent_child/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# parent_child integration test
-
-This test exercises the API that is exposed to Modules to start more modules and
-control the life cycle of the newly started modules.
diff --git a/tests/parent_child/defs.h b/tests/parent_child/defs.h
deleted file mode 100644
index 74e1152..0000000
--- a/tests/parent_child/defs.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_PARENT_CHILD_DEFS_H_
-#define PERIDOT_TESTS_PARENT_CHILD_DEFS_H_
-
-namespace {
-
-constexpr char kChildModuleName[] = "child";
-
-// Package URLs of the test components used here.
-constexpr char kChildModuleUrl1[] =
-    "fuchsia-pkg://fuchsia.com/parent_child_test_child_module1#meta/parent_child_test_child_module1.cmx";
-constexpr char kChildModuleUrl2[] =
-    "fuchsia-pkg://fuchsia.com/parent_child_test_child_module2#meta/parent_child_test_child_module2.cmx";
-constexpr char kChildModuleAction[] =
-    "fuchsia-pkg://fuchsia.com/parent_child_test_child_module_action#meta/parent_child_test_child_module_action.cmx";
-
-constexpr int kTimeoutMilliseconds = 5000;
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_PARENT_CHILD_DEFS_H_
diff --git a/tests/parent_child/meta/parent_child_test_child_module1.cmx b/tests/parent_child/meta/parent_child_test_child_module1.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/parent_child/meta/parent_child_test_child_module1.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/parent_child/meta/parent_child_test_child_module2.cmx b/tests/parent_child/meta/parent_child_test_child_module2.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/parent_child/meta/parent_child_test_child_module2.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/parent_child/meta/parent_child_test_parent_module.cmx b/tests/parent_child/meta/parent_child_test_parent_module.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/parent_child/meta/parent_child_test_parent_module.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/parent_child/parent_child_test_child_module1.cc b/tests/parent_child/parent_child_test_child_module1.cc
deleted file mode 100644
index 3fe9c77..0000000
--- a/tests/parent_child/parent_child_test_child_module1.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/parent_child/defs.h"
-
-using modular::testing::Get;
-using modular::testing::Put;
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestModule(modular::ModuleHost* module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-
-    FXL_LOG(INFO) << "Child module 1 initialized";
-    Signal(std::string("child_module_1_init"));
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  // Called from ModuleDriver.
-  TestPoint stopped_{"Child module 1 stopped"};
-  void Terminate(const std::function<void()>& done) {
-    FXL_LOG(INFO) << "Child module 1 exiting.";
-    stopped_.Pass();
-
-    Signal("child_module_1_stop");
-    modular::testing::Done(done);
-  }
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/parent_child/parent_child_test_child_module2.cc b/tests/parent_child/parent_child_test_child_module2.cc
deleted file mode 100644
index 92f5923..0000000
--- a/tests/parent_child/parent_child_test_child_module2.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fsl/vmo/strings.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/parent_child/defs.h"
-
-using modular::testing::Get;
-using modular::testing::Put;
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestModule(modular::ModuleHost* module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-
-    FXL_LOG(INFO) << "Child module 2 initialized";
-    Signal(std::string("child_module_2_init"));
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  // Called from ModuleDriver.
-  TestPoint stopped_{"Child module 2 stopped"};
-  void Terminate(const std::function<void()>& done) {
-    FXL_LOG(INFO) << "Child module 2 exiting.";
-    stopped_.Pass();
-
-    Signal("child_module_2_stop");
-    modular::testing::Done(done);
-  }
-
- private:
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/parent_child/parent_child_test_parent_module.cc b/tests/parent_child/parent_child_test_parent_module.cc
deleted file mode 100644
index b4259ca..0000000
--- a/tests/parent_child/parent_child_test_parent_module.cc
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/memory/weak_ptr.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/parent_child/defs.h"
-
-using modular::testing::Await;
-using modular::testing::Get;
-using modular::testing::Put;
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-void AddModuleToStoryWithHandler(
-    fuchsia::modular::ModuleContext* const module_context,
-    fidl::InterfaceRequest<fuchsia::modular::ModuleController> request,
-    fidl::StringPtr handler) {
-  fuchsia::modular::Intent intent;
-  intent.handler = handler;
-  intent.action = kChildModuleAction;
-  module_context->AddModuleToStory(
-      kChildModuleName, std::move(intent), std::move(request),
-      nullptr /* surface_relation */,
-      [](const fuchsia::modular::StartModuleStatus) {});
-}
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestPoint initialized_{"Parent module initialized"};
-
-  TestModule(modular::ModuleHost* module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_host_(module_host) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    initialized_.Pass();
-
-    StartChildModuleTwice();
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  // Called by ModuleDriver.
-  TestPoint stopped_{"Parent module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  TestPoint second_child_module_controller_closed_{
-      "Second child module controller closed"};
-
-  void StartChildModuleTwice() {
-    AddModuleToStoryWithHandler(module_host_->module_context(),
-                                child_module_.NewRequest(), kChildModuleUrl1);
-    child_module_.set_error_handler(
-        [this](zx_status_t status) { OnFirstChildModuleStopped(); });
-
-    // Once the module starts, start the same module again with the same
-    // Intent, and then again but with a different Intent.handler. The second
-    // call stops the previous module instance and starts a new one.
-    Await("child_module_1_init", [this] {
-      AddModuleToStoryWithHandler(module_host_->module_context(),
-                                  child_module_again_.NewRequest(),
-                                  kChildModuleUrl1);
-      child_module_again_.set_error_handler([this](zx_status_t status) {
-        second_child_module_controller_closed_.Pass();
-      });
-      AddModuleToStoryWithHandler(module_host_->module_context(),
-                                  child_module2_.NewRequest(),
-                                  kChildModuleUrl2);
-    });
-  }
-
-  TestPoint child_module1_stopped_{"Child module killed for restart"};
-
-  void OnFirstChildModuleStopped() {
-    child_module1_stopped_.Pass();
-
-    // Confirm that the first module instance stopped, and then stop the second
-    // module instance.
-    Await("child_module_1_stop", [this] {
-      Await("child_module_2_init", [this] {
-        child_module2_->Stop([this] { OnChildModule2Stopped(); });
-      });
-    });
-  }
-
-  TestPoint child_module2_stopped_{"Second child module stopped"};
-  void OnChildModule2Stopped() {
-    child_module2_stopped_.Pass();
-
-    TestPipelinedAddAndStop();
-  }
-
-  TestPoint child_module_3_started_{"Third child module started"};
-  TestPoint child_module_3_stopped_{"Third child module stopped"};
-  void TestPipelinedAddAndStop() {
-    // New test case: start a third child module, and immediately stop it.
-    // We expect that the child module will go through its full lifecycle,
-    // since we serialize these requests in sessionmgr.
-    AddModuleToStoryWithHandler(module_host_->module_context(),
-                                child_module3_.NewRequest(), kChildModuleUrl1);
-    child_module3_->Stop([this] { /* do nothing */ });
-    child_module3_.events().OnStateChange =
-        [this](fuchsia::modular::ModuleState module_state) {
-          if (module_state == fuchsia::modular::ModuleState::RUNNING) {
-            child_module_3_started_.Pass();
-          }
-          if (module_state == fuchsia::modular::ModuleState::STOPPED) {
-            child_module_3_stopped_.Pass();
-            Signal(modular::testing::kTestShutdown);
-          }
-        };
-  }
-
-  modular::ModuleHost* module_host_;
-  fuchsia::modular::ModuleControllerPtr child_module_;
-  fuchsia::modular::ModuleControllerPtr child_module_again_;
-  fuchsia::modular::ModuleControllerPtr child_module2_;
-  fuchsia::modular::ModuleControllerPtr child_module3_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/queue_persistence/BUILD.gn b/tests/queue_persistence/BUILD.gn
deleted file mode 100644
index 23267e2..0000000
--- a/tests/queue_persistence/BUILD.gn
+++ /dev/null
@@ -1,76 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-import("//peridot/build/executable_package.gni")
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
-
-executable_package("queue_persistence_test_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/queue_persistence_test_module.cmx"
-      dest = "queue_persistence_test_module.cmx"
-    },
-  ]
-
-  sources = [
-    "queue_persistence_test_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    ":queue_persistence_test_service",
-    "//garnet/public/lib/callback",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/public/lib/message_queue/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("queue_persistence_test_agent") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/queue_persistence_test_agent.cmx"
-      dest = "queue_persistence_test_agent.cmx"
-    },
-  ]
-
-  sources = [
-    "queue_persistence_test_agent.cc",
-  ]
-
-  deps = [
-    ":defs",
-    ":queue_persistence_test_service",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:agent_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/public/lib/message_queue/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-fidl("queue_persistence_test_service") {
-  name = "test.peridot.tests.queuepersistence"
-  cpp_legacy_callbacks = true
-
-  sources = [
-    "queue_persistence_test_service.fidl",
-  ]
-}
diff --git a/tests/queue_persistence/README.md b/tests/queue_persistence/README.md
deleted file mode 100644
index 89af8ff..0000000
--- a/tests/queue_persistence/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# queue_persistence integration test
-
-This test exercises the APIs exposed to modules to connect to agents, and for
-Modules and Agents to exchange message queues.
-
-It specifically tests that message queues are persistent between invocations of
-agents, and that a message sent to the message queue of agent while the agent is
-not running can be received by the agent when it's started again.
diff --git a/tests/queue_persistence/defs.h b/tests/queue_persistence/defs.h
deleted file mode 100644
index b9c4bb7..0000000
--- a/tests/queue_persistence/defs.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_QUEUE_PERSISTENCE_DEFS_H_
-#define PERIDOT_TESTS_QUEUE_PERSISTENCE_DEFS_H_
-
-namespace {
-
-// This is how long we wait for the test to finish before we timeout and tear
-// down our test.
-constexpr int kTimeoutMilliseconds = 10000;
-
-// Package URLs of the test components used here.
-constexpr char kTestAgent[] =
-    "fuchsia-pkg://fuchsia.com/queue_persistence_test_agent#meta/queue_persistence_test_agent.cmx";
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_QUEUE_PERSISTENCE_DEFS_H_
diff --git a/tests/queue_persistence/meta/queue_persistence_test_agent.cmx b/tests/queue_persistence/meta/queue_persistence_test_agent.cmx
deleted file mode 100644
index 12bf3ba..0000000
--- a/tests/queue_persistence/meta/queue_persistence_test_agent.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.AgentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/queue_persistence/meta/queue_persistence_test_module.cmx b/tests/queue_persistence/meta/queue_persistence_test_module.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/queue_persistence/meta/queue_persistence_test_module.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/queue_persistence/queue_persistence_test_agent.cc b/tests/queue_persistence/queue_persistence_test_agent.cc
deleted file mode 100644
index 8758656..0000000
--- a/tests/queue_persistence/queue_persistence_test_agent.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/agent_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fxl/logging.h>
-#include <lib/message_queue/cpp/message_queue_client.h>
-#include <test/peridot/tests/queuepersistence/cpp/fidl.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/queue_persistence/defs.h"
-
-using modular::testing::TestPoint;
-using namespace test::peridot::tests::queuepersistence;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestApp : QueuePersistenceTestService {
- public:
-  TestApp(modular::AgentHost* agent_host) {
-    modular::testing::Init(agent_host->startup_context(), __FILE__);
-    agent_host->agent_context()->GetComponentContext(
-        component_context_.NewRequest());
-
-    // Create a message queue and schedule a task to be run on receiving a
-    // message on it.
-    component_context_->ObtainMessageQueue("Test Queue",
-                                           msg_queue_.NewRequest());
-    msg_queue_.RegisterReceiver(
-        [this](std::string message, fit::function<void()> ack) {
-          ack();
-          modular::testing::GetStore()->Put(
-              "queue_persistence_test_agent_received_message", "", [] {});
-        });
-
-    services_.AddService<QueuePersistenceTestService>(
-        [this](fidl::InterfaceRequest<QueuePersistenceTestService> request) {
-          services_bindings_.AddBinding(this, std::move(request));
-        });
-
-    initialized_.Pass();
-  }
-
-  // Called by AgentDriver.
-  void Connect(fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services) {
-    services_.AddBinding(std::move(services));
-    modular::testing::GetStore()->Put("queue_persistence_test_agent_connected",
-                                      "", [] {});
-  }
-
-  // Called by AgentDriver.
-  void RunTask(const fidl::StringPtr& /*task_id*/,
-               const std::function<void()>& /*callback*/) {}
-
-  // Called by AgentDriver.
-  void Terminate(const std::function<void()>& done) {
-    // Stop processing messages, since we do async operations below and don't
-    // want our receiver to fire.
-    msg_queue_.RegisterReceiver(nullptr);
-
-    modular::testing::GetStore()->Put("queue_persistence_test_agent_stopped",
-                                      "",
-                                      [done] { modular::testing::Done(done); });
-  }
-
- private:
-  // |QueuePersistenceTestService|
-  void GetMessageQueueToken(GetMessageQueueTokenCallback callback) override {
-    msg_queue_.GetToken(
-        [callback](const fidl::StringPtr& token) { callback(token); });
-  }
-
-  TestPoint initialized_{"Queue persistence test agent initialized"};
-
-  fuchsia::modular::ComponentContextPtr component_context_;
-  modular::MessageQueueClient msg_queue_;
-
-  component::ServiceNamespace services_;
-  fidl::BindingSet<QueuePersistenceTestService> services_bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AgentDriver<TestApp> driver(context.get(), [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/queue_persistence/queue_persistence_test_module.cc b/tests/queue_persistence/queue_persistence_test_module.cc
deleted file mode 100644
index 26c44bf..0000000
--- a/tests/queue_persistence/queue_persistence_test_module.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/fxl/memory/weak_ptr.h>
-#include <lib/message_queue/cpp/message_sender_client.h>
-#include <test/peridot/tests/queuepersistence/cpp/fidl.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/queue_persistence/defs.h"
-
-using modular::testing::Await;
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-using namespace test::peridot::tests::queuepersistence;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestPoint initialized_{"Root module initialized"};
-
-  TestModule(modular::ModuleHost* module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_host_(module_host), weak_ptr_factory_(this) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    initialized_.Pass();
-
-    module_host_->module_context()->GetComponentContext(
-        component_context_.NewRequest());
-
-    fuchsia::sys::ServiceProviderPtr agent_services;
-    component_context_->ConnectToAgent(kTestAgent, agent_services.NewRequest(),
-                                       agent_controller_.NewRequest());
-    component::ConnectToService(agent_services.get(),
-                                agent_service_.NewRequest());
-
-    Await("queue_persistence_test_agent_connected",
-          [this] { AgentConnected(); });
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  // Called by ModuleDriver.
-  TestPoint stopped_{"Root module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  TestPoint agent_connected_{"fuchsia::modular::Agent accepted connection"};
-
-  void AgentConnected() {
-    agent_connected_.Pass();
-    agent_service_->GetMessageQueueToken(
-        [this](const fidl::StringPtr& token) { ReceivedQueueToken(token); });
-  }
-
-  TestPoint received_queue_persistence_token_{
-      "Received queue_persistence token"};
-
-  void ReceivedQueueToken(const fidl::StringPtr& token) {
-    queue_token_ = token;
-    received_queue_persistence_token_.Pass();
-
-    // Stop the agent.
-    agent_controller_.Unbind();
-    agent_service_.Unbind();
-    Await("queue_persistence_test_agent_stopped", [this] { AgentStopped(); });
-  }
-
-  TestPoint agent_stopped_{"fuchsia::modular::Agent stopped"};
-
-  void AgentStopped() {
-    agent_stopped_.Pass();
-
-    // Send a message to the stopped agent which should be persisted to local
-    // storage. No triggers are set so the agent won't be automatically started.
-    modular::MessageSenderClient message_sender;
-    component_context_->GetMessageSender(queue_token_,
-                                         message_sender.NewRequest());
-    message_sender.Send("Queued message...");
-
-    // Start the agent again.
-    fuchsia::sys::ServiceProviderPtr agent_services;
-    component_context_->ConnectToAgent(kTestAgent, agent_services.NewRequest(),
-                                       agent_controller_.NewRequest());
-    component::ConnectToService(agent_services.get(),
-                                agent_service_.NewRequest());
-
-    Await("queue_persistence_test_agent_connected",
-          [this] { AgentConnectedAgain(); });
-  }
-
-  TestPoint agent_connected_again_{
-      "fuchsia::modular::Agent accepted connection, again"};
-
-  void AgentConnectedAgain() {
-    agent_connected_again_.Pass();
-    Await("queue_persistence_test_agent_received_message",
-          [this] { AgentReceivedMessage(); });
-  }
-
-  TestPoint agent_received_message_{"fuchsia::modular::Agent received message"};
-
-  void AgentReceivedMessage() {
-    agent_received_message_.Pass();
-
-    // Stop the agent again.
-    agent_controller_.Unbind();
-    agent_service_.Unbind();
-    Await("queue_persistence_test_agent_stopped",
-          [this] { Signal(modular::testing::kTestShutdown); });
-  }
-
-  modular::ModuleHost* module_host_;
-  fuchsia::modular::AgentControllerPtr agent_controller_;
-  QueuePersistenceTestServicePtr agent_service_;
-  fuchsia::modular::ComponentContextPtr component_context_;
-  fuchsia::modular::MessageQueuePtr msg_queue_;
-
-  std::string queue_token_;
-
-  fxl::WeakPtrFactory<TestModule> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/queue_persistence/queue_persistence_test_service.fidl b/tests/queue_persistence/queue_persistence_test_service.fidl
deleted file mode 100644
index c052117..0000000
--- a/tests/queue_persistence/queue_persistence_test_service.fidl
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library test.peridot.tests.queuepersistence;
-
-// Cf. README.md for what this test does and how.
-[Discoverable]
-interface QueuePersistenceTestService {
-    1: GetMessageQueueToken() -> (string message_queue_token);
-};
diff --git a/tests/run_modular_tests.sh b/tests/run_modular_tests.sh
deleted file mode 100644
index 66aa9a5..0000000
--- a/tests/run_modular_tests.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/boot/bin/sh
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-set -e
-
-run_integration_tests --test_file=/pkgfs/packages/modular_tests/0/data/modular_tests.json "$@"
-
diff --git a/tests/session_shell/BUILD.gn b/tests/session_shell/BUILD.gn
deleted file mode 100644
index a669070..0000000
--- a/tests/session_shell/BUILD.gn
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
-
-executable_package("session_shell_test_session_shell") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/session_shell_test_session_shell.cmx"
-      dest = "session_shell_test_session_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "session_shell_test_session_shell.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:component_main",
-    "//peridot/lib/testing:session_shell_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-  ]
-}
diff --git a/tests/session_shell/README.md b/tests/session_shell/README.md
deleted file mode 100644
index 2e3f80a..0000000
--- a/tests/session_shell/README.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# session_shell integration test
-
-This test exercises the APIs exposed to the session shell:
-
-* Create, start, stop, delete stories.
-
-* See existing stories as long as they are not deleted.
-
-* Add modules to existing stories.
-
-* Be notified when story state changes.
-
-* Be notified through SessionShell.AttachView() of a new story view when story
-  start is requested by RequestStart().
-
-* Be notified through SessionShell.DetachView() of a story going away.
-
-* StoryRunner tolerates a session shell not responding fast enough to
-  SessionShell.DetachView().
-
-* On logout, no DetachView() calls are made for still running stories.
-
-The test code is invoked as a session shell from basemgr and executes a
-predefined sequence of steps, rather than to expose a UI to be driven by user
-interaction, as a session shell normally would. I.e. the test is implemented as a
-session shell component.
diff --git a/tests/session_shell/defs.h b/tests/session_shell/defs.h
deleted file mode 100644
index a314bcb..0000000
--- a/tests/session_shell/defs.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_SESSION_SHELL_DEFS_H_
-#define PERIDOT_TESTS_SESSION_SHELL_DEFS_H_
-
-namespace {
-
-// URLs of the modules used here.
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_SESSION_SHELL_DEFS_H_
diff --git a/tests/session_shell/meta/session_shell_test_session_shell.cmx b/tests/session_shell/meta/session_shell_test_session_shell.cmx
deleted file mode 100644
index a2fe1c5..0000000
--- a/tests/session_shell/meta/session_shell_test_session_shell.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/session_shell/session_shell_test_session_shell.cc b/tests/session_shell/session_shell_test_session_shell.cc
deleted file mode 100644
index 21613c2..0000000
--- a/tests/session_shell/session_shell_test_session_shell.cc
+++ /dev/null
@@ -1,819 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <set>
-#include <utility>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fsl/vmo/sized_vmo.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/time/time_delta.h>
-
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/lib/testing/component_main.h"
-#include "peridot/lib/testing/session_shell_base.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/session_shell/defs.h"
-
-using modular::testing::Await;
-using modular::testing::Fail;
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-using fuchsia::modular::ViewIdentifier;
-
-namespace {
-
-// A simple story provider watcher implementation. Just logs observed state
-// transitions.
-class StoryProviderStateWatcherImpl : fuchsia::modular::StoryProviderWatcher {
- public:
-  StoryProviderStateWatcherImpl() : binding_(this) {}
-  ~StoryProviderStateWatcherImpl() override = default;
-
-  // Registers itself a watcher on the given story provider. Only one story
-  // provider can be watched at a time.
-  void Watch(fuchsia::modular::StoryProvider* const story_provider) {
-    story_provider->Watch(binding_.NewBinding());
-  }
-
-  // Deregisters itself from the watched story provider.
-  void Reset() { binding_.Unbind(); }
-
-  void SetKindOfProtoStory(fidl::StringPtr story_id) {
-    kind_of_proto_stories_.insert(story_id);
-  }
-
- private:
-  TestPoint on_delete_called_once_{"OnDelete() Called"};
-  int on_delete_called_{};
-
-  // |fuchsia::modular::StoryProviderWatcher|
-  void OnDelete(std::string story_id) override {
-    FXL_LOG(INFO) << "StoryProviderStateWatcherImpl::OnDelete() " << story_id;
-
-    if (++on_delete_called_ == 1) {
-      on_delete_called_once_.Pass();
-    }
-
-    deleted_stories_.emplace(story_id);
-  }
-
-  TestPoint on_running_called_once_{"OnChange() RUNNING Called"};
-  int on_running_called_{};
-
-  TestPoint on_stopping_called_once_{"OnChange() STOPPING Called"};
-  int on_stopping_called_{};
-
-  TestPoint on_stopped_called_once_{"OnChange() STOPPED Called"};
-  int on_stopped_called_{};
-
-  // |fuchsia::modular::StoryProviderWatcher|
-  void OnChange(const fuchsia::modular::StoryInfo story_info,
-                const fuchsia::modular::StoryState story_state,
-                const fuchsia::modular::StoryVisibilityState
-                    story_visibility_state) override {
-    FXL_LOG(INFO) << "StoryProviderStateWatcherImpl::OnChange() "
-                  << " id " << story_info.id << " state "
-                  << fidl::ToUnderlying(story_state) << " visibility state "
-                  << fidl::ToUnderlying(story_visibility_state) << " url "
-                  << story_info.url;
-
-    if (deleted_stories_.find(story_info.id) != deleted_stories_.end()) {
-      FXL_LOG(ERROR) << "Status change notification for deleted story "
-                     << story_info.id;
-      modular::testing::Fail("Status change notification for deleted story");
-    }
-
-    if (kind_of_proto_stories_.find(story_info.id) !=
-        kind_of_proto_stories_.end()) {
-      modular::testing::Fail(
-          "Stories with kind_of_proto_story option set shouldn't notify "
-          "OnChange");
-    }
-
-    // Just check that all states are covered at least once, proving that we get
-    // state notifications at all from the story provider.
-    switch (story_state) {
-      case fuchsia::modular::StoryState::RUNNING:
-        if (++on_running_called_ == 1) {
-          on_running_called_once_.Pass();
-        }
-        break;
-      case fuchsia::modular::StoryState::STOPPING:
-        if (++on_stopping_called_ == 1) {
-          on_stopping_called_once_.Pass();
-        }
-        break;
-      case fuchsia::modular::StoryState::STOPPED:
-        if (++on_stopped_called_ == 1) {
-          on_stopped_called_once_.Pass();
-        }
-        break;
-    }
-  }
-
-  fidl::Binding<fuchsia::modular::StoryProviderWatcher> binding_;
-
-  // Remember deleted stories. After a story is deleted, there must be no state
-  // change notifications for it.
-  std::set<std::string> deleted_stories_;
-
-  std::set<std::string> kind_of_proto_stories_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(StoryProviderStateWatcherImpl);
-};
-
-// Cf. README.md for what this test does in general and how. The test cases are
-// described in detail in comments below.
-class TestApp : public modular::testing::SessionShellBase {
- public:
-  using ViewId = fuchsia::modular::ViewIdentifier;
-
-  explicit TestApp(component::StartupContext* const startup_context)
-      : SessionShellBase(startup_context) {
-    TestInit(__FILE__);
-
-    startup_context->ConnectToEnvironmentService(puppet_master_.NewRequest());
-    startup_context->ConnectToEnvironmentService(
-        component_context_.NewRequest());
-    story_provider_state_watcher_.Watch(story_provider());
-
-    TestComponentContext_GetPackageName_Works();
-  }
-
-  ~TestApp() override = default;
-
- private:
-  TestPoint create_view_{"CreateView()"};
-
-  // |SingleServiceApp|
-  void CreateView(
-      zx::eventpair /*view_token*/,
-      fidl::InterfaceRequest<
-          fuchsia::sys::ServiceProvider> /*incoming_services*/,
-      fidl::InterfaceHandle<
-          fuchsia::sys::ServiceProvider> /*outgoing_services*/) override {
-    create_view_.Pass();
-  }
-
-  // Test Case GetPackageName:
-  //
-  // When we call GetPackageName() on ComponentContext acquired from our
-  // environment, it works.
-
-  TestPoint component_context_package_name_{
-      "ComponentContext.GetPackageName() works"};
-
-  void TestComponentContext_GetPackageName_Works() {
-    component_context_->GetPackageName([this](fidl::StringPtr name) {
-      if (name) {
-        component_context_package_name_.Pass();
-      }
-
-      TestStoryProvider_GetStoryInfo_Null();
-    });
-  }
-
-  // Test Case GetStoryInfo Null:
-  //
-  // The story info of a story that does not exist is null.
-
-  TestPoint get_story_info_null_{"StoryProvider.GetStoryInfo() is null"};
-
-  void TestStoryProvider_GetStoryInfo_Null() {
-    story_provider()->GetStoryInfo(
-        "X", [this](fuchsia::modular::StoryInfoPtr story_info) {
-          if (!story_info) {
-            get_story_info_null_.Pass();
-          }
-
-          TestSessionShellContext_GetLink();
-        });
-  }
-
-  // Test Case SessionShellContext:
-  //
-  // The session shell can access a Link.
-
-  TestPoint get_link_{"SessionShellContext.GetLink()"};
-
-  void TestSessionShellContext_GetLink() {
-    session_shell_context()->GetLink(session_shell_link_.NewRequest());
-    session_shell_link_->Get(
-        nullptr, [this](std::unique_ptr<fuchsia::mem::Buffer> value) {
-          get_link_.Pass();
-          TestStoryProvider_GetStories();
-        });
-  }
-
-  // Test Case StoryProvider:
-  //
-  // The session shell can access the list of existing stories. This list is
-  // empty at the outset.
-
-  TestPoint previous_stories_{"StoryProvider.GetStories()"};
-
-  void TestStoryProvider_GetStories() {
-    story_provider()->GetStories(
-        nullptr, [this](std::vector<fuchsia::modular::StoryInfo> stories) {
-          previous_stories_.Pass();
-          TestStoryProvider_GetStoryInfo(std::move(stories));
-        });
-  }
-
-  TestPoint get_story_info_{"StoryProvider.GetStoryInfo()"};
-
-  void TestStoryProvider_GetStoryInfo(
-      std::vector<fuchsia::modular::StoryInfo> stories) {
-    if (stories.empty()) {
-      get_story_info_.Pass();
-    } else {
-      FXL_LOG(ERROR) << "StoryProvider.GetStoryInfo() " << stories.size();
-      for (const auto& item : stories) {
-        FXL_LOG(INFO) << item.id;
-      }
-    }
-
-    TestStory1();
-  }
-
-  // Test Case Story1:
-  //
-  // Create a story with extra information, start, and stop it.
-
-  TestPoint story1_create_{"Story1 Create"};
-
-  void TestStory1() {
-    const std::string initial_json = R"({"created-with-info": true})";
-    puppet_master_->ControlStory("story1", story_puppet_master_.NewRequest());
-
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("mod1");
-    add_mod.intent.handler = kCommonActiveModule;
-
-    fuchsia::modular::IntentParameter param;
-    param.name = "root";
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(initial_json, &vmo));
-    param.data.set_json(std::move(vmo).ToTransport());
-    add_mod.intent.parameters.push_back(std::move(param));
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    commands.push_back(std::move(command));
-
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          story1_create_.Pass();
-          TestStory1_GetController("story1");
-        });
-  }
-
-  TestPoint story1_get_controller_{"Story1 GetController"};
-
-  void TestStory1_GetController(fidl::StringPtr story_id) {
-    story_provider()->GetController(story_id, story_controller_.NewRequest());
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo story_info,
-                                      fuchsia::modular::StoryState state) {
-      story1_get_controller_.Pass();
-      story_info_ = std::move(story_info);
-      TestStory1_Run();
-    });
-  }
-
-  TestPoint story1_run_{"Story1 Run"};
-  void TestStory1_Run() {
-    // Start and show the new story.
-    story_controller_->RequestStart();
-    story1_run_.Pass();
-    TestStory1_Stop();
-  }
-
-  TestPoint story1_stop_{"Story1 Stop"};
-
-  void TestStory1_Stop() {
-    story_controller_->Stop([this] {
-      TeardownStoryController();
-      story1_stop_.Pass();
-
-      // When the story is done, we start the next one.
-      TestStory2();
-    });
-  }
-
-  // Test Case Story2:
-  //
-  // Verify that when pipelining Start() and GetInfo() calls, GetInfo() yields
-  // the run state after Start().
-  //
-  // Verify that after DeleteStory(), GetInfo() returns null again.
-
-  TestPoint story2_create_{"Story2 Create"};
-
-  void TestStory2() {
-    puppet_master_->ControlStory("story2", story_puppet_master_.NewRequest());
-
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("mod1");
-    add_mod.intent.handler = kCommonNullModule;
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    commands.push_back(std::move(command));
-
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          story2_create_.Pass();
-          TestStory2_GetController("story2");
-        });
-  }
-
-  TestPoint story2_get_controller_{"Story2 Get Controller"};
-
-  void TestStory2_GetController(fidl::StringPtr story_id) {
-    story_provider()->GetController(story_id, story_controller_.NewRequest());
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo story_info,
-                                      fuchsia::modular::StoryState state) {
-      story_info_ = std::move(story_info);
-      story2_get_controller_.Pass();
-      TestStory2_GetModules();
-    });
-  }
-
-  TestPoint story2_get_modules_{"Story2 Get Modules"};
-
-  void TestStory2_GetModules() {
-    story_controller_->GetModules(
-        [this](std::vector<fuchsia::modular::ModuleData> modules) {
-          if (modules.size() == 1) {
-            story2_get_modules_.Pass();
-          }
-
-          TestStory2_Run();
-        });
-  }
-
-  TestPoint story2_state_before_run_{"Story2 State before Run"};
-  TestPoint story2_state_after_run_{"Story2 State after Run"};
-
-  void TestStory2_Run() {
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo info,
-                                      fuchsia::modular::StoryState state) {
-      if (state == fuchsia::modular::StoryState::STOPPED) {
-        story2_state_before_run_.Pass();
-      }
-    });
-
-    // Start and show the new story *while* the GetInfo() call above is in
-    // flight.
-    story_controller_->RequestStart();
-
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo info,
-                                      fuchsia::modular::StoryState state) {
-      if (state == fuchsia::modular::StoryState::RUNNING) {
-        story2_state_after_run_.Pass();
-      }
-
-      TestStory2_DeleteStory();
-    });
-  }
-
-  TestPoint story2_delete_{"Story2 Delete"};
-
-  void TestStory2_DeleteStory() {
-    puppet_master_->DeleteStory(story_info_.id,
-                                [this] { story2_delete_.Pass(); });
-
-    story_provider()->GetStoryInfo(
-        story_info_.id, [this](fuchsia::modular::StoryInfoPtr info) {
-          TestStory2_InfoAfterDeleteIsNull(std::move(info));
-        });
-  }
-
-  TestPoint story2_info_after_delete_{"Story2 Info After Delete"};
-
-  void TestStory2_InfoAfterDeleteIsNull(fuchsia::modular::StoryInfoPtr info) {
-    story2_info_after_delete_.Pass();
-    if (info) {
-      modular::testing::Fail("StoryInfo after DeleteStory() must return null.");
-    }
-
-    TestStory3();
-  }
-
-  // Test Case Story3:
-  //
-  // Verify that a "kind of proto" story doesn't appear in the list of stories
-  // of the story provider.
-
-  TestPoint story3_create_{"Story3 Create"};
-
-  void TestStory3() {
-    story_provider_state_watcher_.Reset();
-    story_provider_state_watcher_.Watch(story_provider());
-
-    puppet_master_->ControlStory("story3", story_puppet_master_.NewRequest());
-
-    fuchsia::modular::StoryOptions story_options;
-    story_options.kind_of_proto_story = true;
-    story_puppet_master_->SetCreateOptions(std::move(story_options));
-
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          story_provider_state_watcher_.SetKindOfProtoStory("story3");
-          story3_create_.Pass();
-          TestStory3_GetController("story3");
-        });
-  }
-
-  TestPoint story3_get_controller_{"Story3 GetController"};
-
-  void TestStory3_GetController(fidl::StringPtr story_id) {
-    story_provider()->GetController(story_id, story_controller_.NewRequest());
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo story_info,
-                                      fuchsia::modular::StoryState state) {
-      story_info_ = std::move(story_info);
-      story3_get_controller_.Pass();
-      TestStory3_GetStories();
-    });
-  }
-
-  TestPoint story3_previous_stories_{"Story3 GetGetStories"};
-
-  void TestStory3_GetStories() {
-    story_provider()->GetStories(
-        nullptr, [this](std::vector<fuchsia::modular::StoryInfo> stories) {
-          // Since this is a kind-of-proto story, it shouldn't appear in
-          // GetStories calls. Note that we still expect 1 story to be here
-          // since Story1 wasn't deleted.
-          if (stories.size() == 1 && stories.at(0).id != story_info_.id) {
-            story3_previous_stories_.Pass();
-          } else {
-            FXL_LOG(ERROR) << "StoryProvider.GetStories() " << stories.size();
-            for (const auto& item : stories) {
-              FXL_LOG(INFO) << item.id;
-            }
-          }
-          TestStory3_Run();
-        });
-  }
-
-  TestPoint story3_run_{"Story3 Run"};
-
-  void TestStory3_Run() {
-    story_controller_->RequestStart();
-
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo info,
-                                      fuchsia::modular::StoryState state) {
-      if (state == fuchsia::modular::StoryState::RUNNING) {
-        story3_run_.Pass();
-      }
-
-      TestStory3_Stop();
-    });
-  }
-
-  TestPoint story3_stop_{"Story3 Stop"};
-
-  void TestStory3_Stop() {
-    story_controller_->Stop([this] {
-      TeardownStoryController();
-      story3_stop_.Pass();
-      TestStory3_DeleteStory();
-    });
-  }
-
-  TestPoint story3_delete_{"Story3 Delete"};
-
-  void TestStory3_DeleteStory() {
-    puppet_master_->DeleteStory(story_info_.id,
-                                [this] { story3_delete_.Pass(); });
-
-    story_provider()->GetStoryInfo(
-        story_info_.id, [this](fuchsia::modular::StoryInfoPtr info) {
-          TestStory3_InfoAfterDeleteIsNull(std::move(info));
-        });
-  }
-
-  TestPoint story3_info_after_delete_{"Story3 InfoAfterDeleteIsNull"};
-
-  void TestStory3_InfoAfterDeleteIsNull(fuchsia::modular::StoryInfoPtr info) {
-    if (!info) {
-      story3_info_after_delete_.Pass();
-    }
-
-    TestStory4();
-  }
-
-  // Test Case Story4:
-  //
-  // Create a story and start it with RequestStart() rather than Start().
-  //
-  // Verify the view is received through SessionShell.AttachView().
-  //
-  // Verify that, when the story is stopped, a request for
-  // SessionShell.DetachView() is received.
-
-  TestPoint story4_create_{"Story4 Create"};
-
-  void TestStory4() {
-    puppet_master_->ControlStory("story4", story_puppet_master_.NewRequest());
-
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("mod1");
-    add_mod.intent.handler = kCommonNullModule;
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    commands.push_back(std::move(command));
-
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          story4_create_.Pass();
-          TestStory4_Run();
-        });
-  }
-
-  TestPoint story4_state_before_run_{"Story4 State before Run"};
-  TestPoint story4_state_after_run_{"Story4 State after Run"};
-  TestPoint story4_attach_view_{"Story4 attach View"};
-
-  void TestStory4_Run() {
-    story_provider()->GetController("story4", story_controller_.NewRequest());
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo info,
-                                      fuchsia::modular::StoryState state) {
-      story_info_ = std::move(info);
-      if (state == fuchsia::modular::StoryState::STOPPED) {
-        story4_state_before_run_.Pass();
-      }
-    });
-
-    // Start and show the new story using RequestStart().
-    story_controller_->RequestStart();
-
-    session_shell_impl()->set_on_attach_view(
-        [this](ViewId) { story4_attach_view_.Pass(); });
-
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo info,
-                                      fuchsia::modular::StoryState state) {
-      if (state == fuchsia::modular::StoryState::RUNNING) {
-        story4_state_after_run_.Pass();
-        TestStory4_Stop();
-      }
-    });
-  }
-
-  TestPoint story4_detach_view_{"Story4 detach View"};
-  TestPoint story4_stop_{"Story4 Stop"};
-
-  void TestStory4_Stop() {
-    session_shell_impl()->set_on_detach_view(
-        [this](ViewId) { story4_detach_view_.Pass(); });
-
-    story_controller_->Stop([this] {
-      TeardownStoryController();
-      story4_stop_.Pass();
-
-      TestStory4_DeleteStory();
-    });
-  }
-
-  TestPoint story4_delete_{"Story4 Delete"};
-
-  void TestStory4_DeleteStory() {
-    puppet_master_->DeleteStory(story_info_.id,
-                                [this] { story4_delete_.Pass(); });
-
-    story_provider()->GetStoryInfo(
-        story_info_.id, [this](fuchsia::modular::StoryInfoPtr info) {
-          TestStory4_InfoAfterDeleteIsNull(std::move(info));
-        });
-  }
-
-  TestPoint story4_info_after_delete_{"Story4 Info after Delete is null"};
-
-  void TestStory4_InfoAfterDeleteIsNull(fuchsia::modular::StoryInfoPtr info) {
-    if (!info) {
-      story4_info_after_delete_.Pass();
-    }
-
-    TestStory5();
-  }
-
-  // Test Case Story5:
-  //
-  // Create a story and start it with RequestStart() rather than Start().
-  //
-  // Verify that, when the story is stopped, a request for
-  // SessionShell.DetachView() is received, and if the request is not answered,
-  // the Stop() request proceeds anyway.
-
-  TestPoint story5_create_{"Story5 Create"};
-
-  void TestStory5() {
-    puppet_master_->ControlStory("story5", story_puppet_master_.NewRequest());
-
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("mod1");
-    add_mod.intent.handler = kCommonNullModule;
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    commands.push_back(std::move(command));
-
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          story5_create_.Pass();
-          TestStory5_Run();
-        });
-  }
-
-  TestPoint story5_state_before_run_{"Story5 State before Run"};
-  TestPoint story5_state_after_run_{"Story5 State after Run"};
-
-  TestPoint story5_attach_view_{"Story5 attach View"};
-
-  void TestStory5_Run() {
-    story_provider()->GetController("story5", story_controller_.NewRequest());
-
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo info,
-                                      fuchsia::modular::StoryState state) {
-      story_info_ = std::move(info);
-      if (state == fuchsia::modular::StoryState::STOPPED) {
-        story5_state_before_run_.Pass();
-      }
-    });
-
-    // Start and show the new story using RequestStart().
-    story_controller_->RequestStart();
-
-    session_shell_impl()->set_on_attach_view(
-        [this](ViewId) { story5_attach_view_.Pass(); });
-
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo info,
-                                      fuchsia::modular::StoryState state) {
-      if (state == fuchsia::modular::StoryState::RUNNING) {
-        story5_state_after_run_.Pass();
-        TestStory5_Stop();
-      }
-    });
-  }
-
-  TestPoint story5_stop_{"Story5 Stop"};
-
-  void TestStory5_Stop() {
-    // Ignore the detach view. The delay is larger than the timeout for the
-    // whole test configured in dev_base_shell.cc, so an attempt to wait for
-    // this timeout would fail the whole test.
-    session_shell_impl()->set_detach_delay(
-        zx::msec(modular::testing::kTestTimeoutMilliseconds * 2));
-    session_shell_impl()->set_on_detach_view([](ViewId) {});
-
-    story_controller_->Stop([this] {
-      TeardownStoryController();
-      story5_stop_.Pass();
-
-      TestStory5_DeleteStory();
-    });
-  }
-
-  TestPoint story5_delete_{"Story5 Delete"};
-
-  void TestStory5_DeleteStory() {
-    puppet_master_->DeleteStory(story_info_.id,
-                                [this] { story5_delete_.Pass(); });
-
-    story_provider()->GetStoryInfo(
-        story_info_.id, [this](fuchsia::modular::StoryInfoPtr info) {
-          TestStory5_InfoAfterDeleteIsNull(std::move(info));
-        });
-  }
-
-  TestPoint story5_info_after_delete_{"Story5 Info after Delete is null"};
-
-  void TestStory5_InfoAfterDeleteIsNull(fuchsia::modular::StoryInfoPtr info) {
-    if (!info) {
-      story5_info_after_delete_.Pass();
-    }
-
-    TestStory6();
-  }
-
-  // Test Case Story6:
-  //
-  // Create a story and start it with RequestStart() rather than Start().
-  //
-  // Verify that, when the story is NOT stopped when the SessionShell is stopped
-  // (such as at Logout) NO request for SessionShell.DetachView() is received.
-
-  TestPoint story6_create_{"Story6 Create"};
-
-  void TestStory6() {
-    puppet_master_->ControlStory("story6", story_puppet_master_.NewRequest());
-
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("mod1");
-    add_mod.intent.handler = kCommonNullModule;
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    commands.push_back(std::move(command));
-
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          story6_create_.Pass();
-          TestStory6_Run();
-        });
-  }
-
-  TestPoint story6_state_before_run_{"Story6 State before Run"};
-  TestPoint story6_state_after_run_{"Story6 State after Run"};
-
-  TestPoint story6_attach_view_{"Story6 attach View"};
-
-  void TestStory6_Run() {
-    story_provider()->GetController("story6", story_controller_.NewRequest());
-
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo info,
-                                      fuchsia::modular::StoryState state) {
-      story_info_ = std::move(info);
-      if (state == fuchsia::modular::StoryState::STOPPED) {
-        story6_state_before_run_.Pass();
-      }
-    });
-
-    // Start and show the new story using RequestStart().
-    story_controller_->RequestStart();
-
-    session_shell_impl()->set_on_attach_view(
-        [this](ViewId) { story6_attach_view_.Pass(); });
-
-    story_controller_->GetInfo([this](fuchsia::modular::StoryInfo info,
-                                      fuchsia::modular::StoryState state) {
-      if (state == fuchsia::modular::StoryState::RUNNING) {
-        story6_state_after_run_.Pass();
-        TestStory6_Logout();
-      }
-    });
-  }
-
-  void TestStory6_Logout() {
-    // If we get a DetachView() call during logout, that's a failure.
-    session_shell_impl()->set_detach_delay(zx::sec(0));
-    session_shell_impl()->set_on_detach_view(
-        [](ViewId) { Fail("DetachView() Received on Logout"); });
-
-    Signal(modular::testing::kTestShutdown);
-  }
-
-  void TeardownStoryController() { story_controller_.Unbind(); }
-
-  StoryProviderStateWatcherImpl story_provider_state_watcher_;
-
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-  fuchsia::modular::ComponentContextPtr component_context_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-  fuchsia::modular::StoryControllerPtr story_controller_;
-  fuchsia::modular::LinkPtr session_shell_link_;
-  fuchsia::modular::StoryInfo story_info_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int argc, const char** argv) {
-  auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
-  modular::testing::ComponentMain<TestApp>();
-  return 0;
-}
diff --git a/tests/sessionctl/BUILD.gn b/tests/sessionctl/BUILD.gn
deleted file mode 100644
index e137c12..0000000
--- a/tests/sessionctl/BUILD.gn
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2019 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/tests_package.gni")
-
-executable("sessionctl_test") {
-  testonly = true
-  output_name = "sessionctl_test"
-
-  sources = [
-    "sessionctl_test.cc",
-  ]
-
-  deps = [
-    "//garnet/public/fidl/fuchsia.sys",
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/lib/component/cpp",
-    "//garnet/public/lib/component/cpp/testing",
-    "//garnet/public/lib/fxl",
-    "//garnet/public/lib/fxl/test:gtest_main",
-    "//garnet/public/lib/test_runner/cpp",
-    "//peridot/bin/sessionctl:lib",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/fidl/fuchsia.modular.internal",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//third_party/googletest:gtest",
-  ]
-}
-
-hermetic_tests_package("sessionctl_integration_tests") {
-  deps = [
-    ":sessionctl_test",
-  ]
-}
diff --git a/tests/sessionctl/README.md b/tests/sessionctl/README.md
deleted file mode 100644
index 131b6ec..0000000
--- a/tests/sessionctl/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# sessionctl integration test
-
-This ensures that the sessionctl service can be found in /hub after `basemgr`
-is launched.
\ No newline at end of file
diff --git a/tests/sessionctl/meta/sessionctl_test.cmx b/tests/sessionctl/meta/sessionctl_test.cmx
deleted file mode 100644
index a4f4810..0000000
--- a/tests/sessionctl/meta/sessionctl_test.cmx
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-    "facets": {
-        "fuchsia.test": {
-            "injected-services": {
-                "fuchsia.devicesettings.DeviceSettingsManager": "fuchsia-pkg://fuchsia.com/device_settings_manager#meta/device_settings_manager.cmx",
-                "fuchsia.tracelink.Registry": "fuchsia-pkg://fuchsia.com/trace_manager#meta/trace_manager.cmx"
-            }
-        }
-    },
-    "program": {
-        "binary": "test/sessionctl_test"
-    },
-    "sandbox": {
-        "features": [
-            "shell"
-        ],
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ComponentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/sessionctl/sessionctl_test.cc b/tests/sessionctl/sessionctl_test.cc
deleted file mode 100644
index b6f762c..0000000
--- a/tests/sessionctl/sessionctl_test.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2019 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/modular/internal/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <lib/async/default.h>
-
-#include "lib/component/cpp/environment_services_helper.h"
-#include "lib/component/cpp/testing/test_util.h"
-#include "lib/component/cpp/testing/test_with_environment.h"
-#include "lib/fxl/files/directory.h"
-#include "lib/fxl/files/file.h"
-#include "lib/fxl/files/glob.h"
-#include "lib/fxl/strings/join_strings.h"
-
-#include "gtest/gtest.h"
-#include "peridot/bin/sessionctl/session_ctl_constants.h"
-
-namespace sessionctl {
-
-class SessionCtlTest : public component::testing::TestWithEnvironment {
- protected:
-  void RunBasemgr() {
-    std::vector<std::string> args;
-    args.push_back("--test");
-    args.push_back("--run_base_shell_with_test_runner=false");
-    args.push_back(
-        "--account_provider=fuchsia-pkg://fuchsia.com/dev_token_manager#meta/"
-        "dev_token_manager.cmx");
-    args.push_back(
-        "--base_shell=fuchsia-pkg://fuchsia.com/dev_base_shell#meta/"
-        "dev_base_shell.cmx");
-    args.push_back(
-        "--session_shell=fuchsia-pkg://fuchsia.com/dev_session_shell#meta/"
-        "dev_session_shell.cmx");
-    args.push_back(
-        "--story_shell=fuchsia-pkg://fuchsia.com/dev_story_shell#meta/"
-        "dev_story_shell.cmx");
-    args.push_back("--sessionmgr_args=--use_memfs_for_ledger");
-
-    RunComponent("fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx", args);
-  }
-
-  void RunComponent(const std::string& component_url,
-                    const std::vector<std::string>& args) {
-    fuchsia::sys::LaunchInfo launch_info;
-    launch_info.url = component_url;
-    for (auto arg : args) {
-      launch_info.arguments.push_back(arg);
-    }
-
-    fuchsia::sys::ComponentControllerPtr controller;
-    launcher_ptr()->CreateComponent(std::move(launch_info),
-                                    controller.NewRequest());
-    component_ptrs_.push_back(std::move(controller));
-
-    RunLoopWithTimeout(zx::sec(10));
-  }
-
-  std::vector<fuchsia::sys::ComponentControllerPtr> component_ptrs_;
-};
-
-TEST_F(SessionCtlTest, FindSessionCtlService) {
-  RunBasemgr();
-
-  files::Glob sessionctl_service(modular::kSessionCtlServiceGlobPath);
-  EXPECT_EQ(sessionctl_service.size(), 1u)
-      << modular::kSessionCtlServiceGlobPath << " expected to match once.";
-}
-
-}  // namespace sessionctl
diff --git a/tests/story_shell/BUILD.gn b/tests/story_shell/BUILD.gn
deleted file mode 100644
index 0fb4401..0000000
--- a/tests/story_shell/BUILD.gn
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
-
-executable_package("story_shell_test_story_shell") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/story_shell_test_story_shell.cmx"
-      dest = "story_shell_test_story_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "story_shell_test_story_shell.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/fidl/fuchsia.ui.policy",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/common:names",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:clone",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:component_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-  ]
-}
-
-executable_package("story_shell_test_session_shell") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/story_shell_test_session_shell.cmx"
-      dest = "story_shell_test_session_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "story_shell_test_session_shell.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/fidl/fuchsia.ui.policy",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fsl",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/common:names",
-    "//peridot/lib/fidl:array_to_string",
-    "//peridot/lib/fidl:clone",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:component_main",
-    "//peridot/lib/testing:session_shell_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-  ]
-}
diff --git a/tests/story_shell/README.md b/tests/story_shell/README.md
deleted file mode 100644
index 7465558..0000000
--- a/tests/story_shell/README.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# story_shell test
-
-This test executes the story shell. Below is the sequence of actions and
-verifications. All actions and verifications are driven by the session shell. The
-story shell just responds.
-
-* Create a story and start it.
-* Verify the contents of the link. The first time the story shell is created the
-  link content is empty. If the content is empty, write to the link and verify
-  those contents when the story shell is restarted.
-* Add a top level module to the story. The module is specified by an intent. The
-  intent is resolved to a module that possesses a manifest. The manifest
-  specifies a composition pattern.
-* We verify that the story shell receives the notification that the module has
-  started, including the manifest.
-* Stop the story. Start the story again.
-* We verify that the story shell receives the same notification about the
-  started module as before, including the manifest.
-
-We also verify that the story receives the manifest regardless of how the intent
-we use to add the module is resolved, i.e. regardless of whether it specifies
-the action or the package of the module. For that, we run the whole sequence
-above again, but use intents that specify handlers rather than actions to add
-the modules.
-
-For each event we would like to verify, the story shell writes to TestStore
-using Put(). The session shell uses Get() to register handlers for the keys it
-expects the story shell to Put(), and continues when it has seen all the keys.
diff --git a/tests/story_shell/defs.h b/tests/story_shell/defs.h
deleted file mode 100644
index 232d015..0000000
--- a/tests/story_shell/defs.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_STORY_SHELL_DEFS_H_
-#define PERIDOT_TESTS_STORY_SHELL_DEFS_H_
-
-namespace {
-
-// URLs of the modules used here.
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_STORY_SHELL_DEFS_H_
diff --git a/tests/story_shell/meta/story_shell_test_session_shell.cmx b/tests/story_shell/meta/story_shell_test_session_shell.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/story_shell/meta/story_shell_test_session_shell.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/story_shell/meta/story_shell_test_story_shell.cmx b/tests/story_shell/meta/story_shell_test_story_shell.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/story_shell/meta/story_shell_test_story_shell.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/story_shell/story_shell_test_session_shell.cc b/tests/story_shell/story_shell_test_session_shell.cc
deleted file mode 100644
index 5395d03..0000000
--- a/tests/story_shell/story_shell_test_session_shell.cc
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <set>
-#include <utility>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/sys/cpp/fidl.h>
-#include <fuchsia/ui/policy/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-#include <lib/fxl/tasks/task_runner.h>
-#include <lib/fxl/time/time_delta.h>
-
-#include "peridot/lib/common/names.h"
-#include "peridot/lib/fidl/clone.h"
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/lib/testing/component_main.h"
-#include "peridot/lib/testing/session_shell_base.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/story_shell/defs.h"
-
-using modular::testing::Get;
-using modular::testing::Put;
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-const char kStoryName1[] = "story1";
-const char kStoryName2[] = "story2";
-
-// Cf. README.md for what this test does and how.
-class TestApp : public modular::testing::SessionShellBase,
-                fuchsia::modular::SessionShellPresentationProvider {
- public:
-  explicit TestApp(component::StartupContext* const startup_context)
-      : SessionShellBase(startup_context) {
-    TestInit(__FILE__);
-
-    startup_context->ConnectToEnvironmentService(puppet_master_.NewRequest());
-
-    startup_context->outgoing()
-        .AddPublicService<fuchsia::modular::SessionShellPresentationProvider>(
-            [this](fidl::InterfaceRequest<
-                   fuchsia::modular::SessionShellPresentationProvider>
-                       request) {
-              presentation_provider_bindings_.AddBinding(this,
-                                                         std::move(request));
-            });
-
-    Story1_Create();
-  }
-
-  ~TestApp() override = default;
-
- private:
-  TestPoint story1_presentation_request_{"Story1 Presentation request"};
-  bool story1_presentation_request_received_{};
-
-  TestPoint story2_presentation_request_{"Story2 Presentation request"};
-  bool story2_presentation_request_received_{};
-
-  // |fuchsia::modular::SessionShellPresentationProvider|
-  void GetPresentation(std::string story_id,
-                       fidl::InterfaceRequest<fuchsia::ui::policy::Presentation>
-                           request) override {
-    if (story_id == kStoryName1 && !story1_presentation_request_received_) {
-      story1_presentation_request_.Pass();
-      story1_presentation_request_received_ = true;
-    }
-
-    if (story_id == kStoryName2 && !story2_presentation_request_received_) {
-      story2_presentation_request_.Pass();
-      story2_presentation_request_received_ = true;
-    }
-
-    MaybeLogout();
-  }
-
-  // |fuchsia::modular::SessionShellPresentationProvider|
-  void WatchVisualState(
-      std::string story_id,
-      fidl::InterfaceHandle<fuchsia::modular::StoryVisualStateWatcher> watcher)
-      override {}
-
-  TestPoint create_view_{"CreateView()"};
-
-  // |SingleServiceApp|
-  void CreateView(
-      zx::eventpair /*view_token*/,
-      fidl::InterfaceRequest<
-          fuchsia::sys::ServiceProvider> /*incoming_services*/,
-      fidl::InterfaceHandle<
-          fuchsia::sys::ServiceProvider> /*outgoing_services*/) override {
-    create_view_.Pass();
-  }
-
-  TestPoint story1_create_{"Story1 Create"};
-
-  void Story1_Create() {
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    auto addMod = [&commands](fidl::StringPtr name,
-                              std::vector<fidl::StringPtr> parent) {
-      fuchsia::modular::AddMod add_mod;
-      add_mod.mod_name.push_back(name);
-      add_mod.intent.action = kCommonNullAction;
-      add_mod.intent.handler = kCommonNullModule;
-
-      for (auto i : parent) {
-        add_mod.surface_parent_mod_name.push_back(i);
-      }
-
-      fuchsia::modular::StoryCommand command;
-      command.set_add_mod(std::move(add_mod));
-      commands.push_back(std::move(command));
-    };
-
-    addMod("root", {});
-    addMod("one", {"root"});
-    addMod("two", {"root", "one"});
-
-    puppet_master_->ControlStory(kStoryName1,
-                                 story_puppet_master_.NewRequest());
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          story1_create_.Pass();
-          Story1_Run1();
-        });
-  }
-
-  TestPoint story1_run1_{"Story1 Run1"};
-
-  void Story1_Run1() {
-    story_provider()->GetController(kStoryName1, story_controller_.NewRequest());
-
-    // TODO(jphsiao|vardhan): remodel this |proceed_after_6| style of
-    // continuation to use Futures instead.
-    auto proceed_after_6 = modular::testing::NewBarrierClosure(6, [this] {
-      story1_run1_.Pass();
-      Story1_Stop1();
-    });
-
-    Get("story link data: null", proceed_after_6);
-    Get("root:one", proceed_after_6);
-    Get("root:one manifest", proceed_after_6);
-    Get("root:one:two", proceed_after_6);
-    Get("root:one:two manifest", proceed_after_6);
-    Get("root:one:two ordering", proceed_after_6);
-
-    story_controller_->RequestStart();
-  }
-
-  void Story1_Stop1() {
-    story_controller_->Stop([this] { Story1_Run2(); });
-  }
-
-  TestPoint story1_run2_{"Story1 Run2"};
-
-  void Story1_Run2() {
-    auto proceed_after_6 = modular::testing::NewBarrierClosure(6, [this] {
-      story1_run2_.Pass();
-      Story1_Stop2();
-    });
-
-    Get("story link data: {\"label\":\"value\"}", proceed_after_6);
-    Get("root:one", proceed_after_6);
-    Get("root:one manifest", proceed_after_6);
-    Get("root:one:two", proceed_after_6);
-    Get("root:one:two manifest", proceed_after_6);
-    Get("root:one:two ordering", proceed_after_6);
-
-    story_controller_->RequestStart();
-  }
-
-  void Story1_Stop2() {
-    story_controller_->Stop([this] { Story2_Create(); });
-  }
-
-  // We do the same sequence with Story2 that we did for Story1, except that the
-  // modules are started with packages rather than actions in their Intents.
-
-  TestPoint story2_create_{"Story2 Create"};
-
-  void Story2_Create() {
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    auto addMod = [&commands](fidl::StringPtr name,
-                              std::vector<fidl::StringPtr> parent) {
-      fuchsia::modular::AddMod add_mod;
-      add_mod.mod_name.push_back(name);
-      add_mod.intent.action = kCommonNullAction;
-      add_mod.intent.handler = kCommonNullModule;
-
-      for (auto i : parent) {
-        add_mod.surface_parent_mod_name.push_back(i);
-      }
-
-      fuchsia::modular::StoryCommand command;
-      command.set_add_mod(std::move(add_mod));
-      commands.push_back(std::move(command));
-    };
-
-    addMod("root", {});
-    addMod("one", {"root"});
-    addMod("two", {"root", "one"});
-
-    puppet_master_->ControlStory(kStoryName2,
-                                 story_puppet_master_.NewRequest());
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          story2_create_.Pass();
-          Story2_Run1();
-        });
-  }
-
-  TestPoint story2_run1_{"Story2 Run1"};
-
-  void Story2_Run1() {
-    auto proceed_after_5 = modular::testing::NewBarrierClosure(5, [this] {
-      story2_run1_.Pass();
-      Story2_Stop1();
-    });
-
-    Get("root:one", proceed_after_5);
-    Get("root:one manifest", proceed_after_5);
-    Get("root:one:two", proceed_after_5);
-    Get("root:one:two manifest", proceed_after_5);
-    Get("root:one:two ordering", proceed_after_5);
-
-    story_provider()->GetController(kStoryName2, story_controller_.NewRequest());
-    story_controller_->RequestStart();
-  }
-
-  void Story2_Stop1() {
-    story_controller_->Stop([this] { Story2_Run2(); });
-  }
-
-  TestPoint story2_run2_{"Story2 Run2"};
-
-  void Story2_Run2() {
-    auto proceed_after_5 = modular::testing::NewBarrierClosure(5, [this] {
-      story2_run2_.Pass();
-      Story2_Stop2();
-    });
-
-    Get("root:one", proceed_after_5);
-    Get("root:one manifest", proceed_after_5);
-    Get("root:one:two", proceed_after_5);
-    Get("root:one:two manifest", proceed_after_5);
-    Get("root:one:two ordering", proceed_after_5);
-
-    story_controller_->RequestStart();
-  }
-
-  bool end_of_story2_{};
-
-  void Story2_Stop2() {
-    story_controller_->Stop([this] {
-      end_of_story2_ = true;
-      MaybeLogout();
-    });
-  }
-
-  void MaybeLogout() {
-    if (story1_presentation_request_received_ &&
-        story2_presentation_request_received_ && end_of_story2_) {
-      Signal(modular::testing::kTestShutdown);
-    }
-  }
-
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-  fuchsia::modular::StoryControllerPtr story_controller_;
-  fidl::BindingSet<fuchsia::modular::SessionShellPresentationProvider>
-      presentation_provider_bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /* argc */, const char** /* argv */) {
-  modular::testing::ComponentMain<TestApp>();
-  return 0;
-}
diff --git a/tests/story_shell/story_shell_test_story_shell.cc b/tests/story_shell/story_shell_test_story_shell.cc
deleted file mode 100644
index 5480949..0000000
--- a/tests/story_shell/story_shell_test_story_shell.cc
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Implementation of the fuchsia::modular::StoryShell service that just lays out
-// the views of all modules side by side.
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/policy/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/app_driver/cpp/app_driver.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fsl/vmo/strings.h>
-#include <lib/fxl/command_line.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/rapidjson/rapidjson.h"
-#include "peridot/lib/testing/component_base.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/story_shell/defs.h"
-#include "rapidjson/document.h"
-
-using modular::testing::Signal;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestApp
-    : public modular::testing::ComponentBase<fuchsia::modular::StoryShell> {
- public:
-  TestApp(component::StartupContext* const startup_context)
-      : ComponentBase(startup_context) {
-    TestInit(__FILE__);
-  }
-
-  ~TestApp() override = default;
-
- private:
-  // |fuchsia::modular::StoryShell|
-  void Initialize(fidl::InterfaceHandle<fuchsia::modular::StoryShellContext>
-                      story_shell_context) override {
-    story_shell_context_.Bind(std::move(story_shell_context));
-    story_shell_context_->GetPresentation(presentation_.NewRequest());
-    story_shell_context_->GetLink(story_shell_link_.NewRequest());
-    fidl::VectorPtr<std::string> link_path;
-    link_path.push_back("path");
-
-    story_shell_link_->Get(
-        link_path.Clone(),
-        [this](std::unique_ptr<fuchsia::mem::Buffer> content) {
-          std::string data_string;
-          fsl::StringFromVmo(*content, &data_string);
-          Signal("story link data: " + data_string);
-
-          rapidjson::Document document;
-          document.SetObject();
-          document.AddMember("label", "value", document.GetAllocator());
-          fsl::SizedVmo vmo;
-          fidl::VectorPtr<std::string> path_to_write;
-          path_to_write.push_back("path");
-          fsl::VmoFromString(modular::JsonValueToString(document), &vmo);
-          fuchsia::mem::Buffer buffer = std::move(vmo).ToTransport();
-          story_shell_link_->Set(path_to_write.Clone(), std::move(buffer));
-        });
-  }
-
-  // Keep state to check ordering. Cf. below.
-  bool seen_root_one_{};
-
-  // |fuchsia::modular::StoryShell|
-  void AddSurface(
-      fuchsia::modular::ViewConnection view_connection,
-      fuchsia::modular::SurfaceInfo surface_info) override {
-    fuchsia::modular::ModuleManifestPtr module_manifest = std::move(surface_info.module_manifest);
-    FXL_LOG(INFO) << "AddSurface " << view_connection.surface_id << " " << surface_info.parent_id << " "
-                  << (module_manifest ? module_manifest->composition_pattern
-                                      : " NO MANIFEST");
-    if (view_connection.surface_id == "root:one" && surface_info.parent_id == "root") {
-      Signal("root:one");
-
-      if (module_manifest && module_manifest->composition_pattern == "ticker" &&
-          module_manifest->intent_filters->size() == 1 &&
-          module_manifest->intent_filters.get()[0].action ==
-              kCommonNullAction) {
-        Signal("root:one manifest");
-      }
-
-      seen_root_one_ = true;
-    }
-
-    if (view_connection.surface_id == "root:one:two" && surface_info.parent_id == "root:one") {
-      Signal("root:one:two");
-
-      if (module_manifest && module_manifest->composition_pattern == "ticker" &&
-          module_manifest->intent_filters->size() == 1 &&
-          module_manifest->intent_filters.get()[0].action ==
-              kCommonNullAction) {
-        Signal("root:one:two manifest");
-      }
-
-      if (seen_root_one_) {
-        Signal("root:one:two ordering");
-      }
-    }
-  }
-
-  // |fuchsia::modular::StoryShell|
-  void FocusSurface(std::string /*surface_id*/) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void DefocusSurface(std::string /*surface_id*/,
-                   DefocusSurfaceCallback callback) override {
-    callback();
-  }
-
-  // |fuchsia::modular::StoryShell|
-  void AddContainer(
-      std::string /*container_name*/, fidl::StringPtr /*parent_id*/,
-      fuchsia::modular::SurfaceRelation /*relation*/,
-      std::vector<fuchsia::modular::ContainerLayout> /*layout*/,
-      std::vector<
-          fuchsia::modular::ContainerRelationEntry> /* relationships */,
-      std::vector<fuchsia::modular::ContainerView> /* views */) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void RemoveSurface(std::string /*surface_id*/) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void ReconnectView(fuchsia::modular::ViewConnection view_connection) override {}
-
-  // |fuchsia::modular::StoryShell|
-  void UpdateSurface(fuchsia::modular::ViewConnection view_connection,
-        fuchsia::modular::SurfaceInfo /*surface_info*/) override {};
-
-
-  fuchsia::modular::StoryShellContextPtr story_shell_context_;
-  fuchsia::modular::LinkPtr story_shell_link_;
-  fuchsia::ui::policy::PresentationPtr presentation_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /* argc */, const char** /* argv */) {
-  FXL_LOG(INFO) << "Story Shell main";
-  modular::testing::ComponentMain<TestApp>();
-  return 0;
-}
diff --git a/tests/suggestion/BUILD.gn b/tests/suggestion/BUILD.gn
deleted file mode 100644
index 675109b..0000000
--- a/tests/suggestion/BUILD.gn
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/executable_package.gni")
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
-
-executable_package("suggestion_test_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/suggestion_test_module.cmx"
-      dest = "suggestion_test_module.cmx"
-    },
-  ]
-
-  sources = [
-    "suggestion_test_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/lib/callback",
-    "//peridot/lib/testing:component_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("suggestion_test_session_shell") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/suggestion_test_session_shell.cmx"
-      dest = "suggestion_test_session_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "suggestion_test_session_shell.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//peridot/lib/testing:component_main",
-    "//peridot/lib/testing:session_shell_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-  ]
-}
diff --git a/tests/suggestion/README.md b/tests/suggestion/README.md
deleted file mode 100644
index 24d44b7..0000000
--- a/tests/suggestion/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# suggestion integration test
-
-This test exercises the API exposed to Modules to make suggestion proposals. It
-verifies that a suggestion proposal made by a module can be received by the user
-shell eventually.
diff --git a/tests/suggestion/defs.h b/tests/suggestion/defs.h
deleted file mode 100644
index 03aa224..0000000
--- a/tests/suggestion/defs.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_SUGGESTION_DEFS_H_
-#define PERIDOT_TESTS_SUGGESTION_DEFS_H_
-
-namespace {
-
-// Package URLs of the test components used here.
-constexpr char kSuggestionTestModule[] =
-    "fuchsia-pkg://fuchsia.com/suggestion_test_module#meta/suggestion_test_module.cmx";
-
-constexpr char kSuggestionTestAction[] = "suggestion_test_action";
-
-constexpr char kSuggestionTestModuleDone[] = "suggestion_test_module_done";
-
-constexpr char kProposalId[] =
-    "file:///system/bin/modular_tests/suggestion_proposal_test#proposal";
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_SUGGESTION_DEFS_H_
diff --git a/tests/suggestion/meta/suggestion_test_module.cmx b/tests/suggestion/meta/suggestion_test_module.cmx
deleted file mode 100644
index 7efcca5..0000000
--- a/tests/suggestion/meta/suggestion_test_module.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.IntelligenceServices",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/suggestion/meta/suggestion_test_session_shell.cmx b/tests/suggestion/meta/suggestion_test_session_shell.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/suggestion/meta/suggestion_test_session_shell.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/suggestion/suggestion_test_module.cc b/tests/suggestion/suggestion_test_module.cc
deleted file mode 100644
index 62a0757..0000000
--- a/tests/suggestion/suggestion_test_module.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/component/cpp/connect.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/suggestion/defs.h"
-
-using modular::testing::Await;
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule : fuchsia::modular::ProposalListener {
- public:
-  TestPoint initialized_{"Root module initialized"};
-  TestPoint received_story_id_{"Root module received story id"};
-  TestPoint proposal_was_accepted_{"fuchsia::modular::Proposal was accepted"};
-
-  TestModule(modular::ModuleHost* module_host,
-             fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>
-                 view_provider_request)
-      : module_host_(module_host),
-        app_view_provider_(std::move(view_provider_request)) {
-    modular::testing::Init(module_host_->startup_context(), __FILE__);
-    initialized_.Pass();
-
-    fuchsia::modular::IntelligenceServicesPtr intelligence_services;
-
-    module_host_->startup_context()->ConnectToEnvironmentService(
-        intelligence_services.NewRequest());
-    intelligence_services->GetProposalPublisher(
-        proposal_publisher_.NewRequest());
-
-    module_host_->module_context()->GetStoryId(
-        [this](const fidl::StringPtr& story_id) {
-          received_story_id_.Pass();
-
-          fuchsia::modular::SetFocusState focus_story;
-          focus_story.focused = true;
-
-          fuchsia::modular::StoryCommand command;
-          command.set_set_focus_state(std::move(focus_story));
-
-          // Craft a minimal suggestion proposal.
-          fuchsia::modular::SuggestionDisplay suggestion_display;
-          suggestion_display.headline = "foo";
-          suggestion_display.subheadline = "bar";
-          suggestion_display.details = "baz";
-          suggestion_display.color = 0xffff0000;
-
-          fuchsia::modular::Proposal proposal;
-          proposal.id = kProposalId;
-          proposal.affinity.resize(0);
-          proposal.story_name = story_id;
-          proposal.display = std::move(suggestion_display);
-          proposal.on_selected.push_back(std::move(command));
-          proposal_listener_bindings_.AddBinding(
-              this, proposal.listener.NewRequest());
-
-          proposal_publisher_->Propose(std::move(proposal));
-
-          Await("suggestion_proposal_received", [this] {
-            Await("proposal_was_accepted", [this] {
-              proposal_was_accepted_.Pass();
-              Signal(kSuggestionTestModuleDone);
-            });
-          });
-        });
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-                 view_provider_request)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {
-    views1_view_provider_ = std::move(view_provider_request);
-  }
-
-  // Called by ModuleDriver.
-  TestPoint stopped_{"Root module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
-  // |fuchsia::modular::ProposalListener|
-  void OnProposalAccepted(std::string proposal_id,
-                          fidl::StringPtr story_id) override {
-    Signal("proposal_was_accepted");
-  }
-
- private:
-  modular::ModuleHost* const module_host_;
-  fuchsia::modular::ModuleContextPtr module_context_;
-  fuchsia::modular::ProposalPublisherPtr proposal_publisher_;
-  fidl::BindingSet<fuchsia::modular::ProposalListener>
-      proposal_listener_bindings_;
-
-  // We keep the view provider around so that story shell can hold a view for
-  // us, but don't do anything with it.
-  fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
-      views1_view_provider_;
-  fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider> app_view_provider_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/suggestion/suggestion_test_session_shell.cc b/tests/suggestion/suggestion_test_session_shell.cc
deleted file mode 100644
index 1f1ec76..0000000
--- a/tests/suggestion/suggestion_test_session_shell.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fidl/cpp/binding_set.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/testing/component_main.h"
-#include "peridot/lib/testing/session_shell_base.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/suggestion/defs.h"
-
-using modular::testing::Await;
-using modular::testing::Signal;
-using modular::testing::TestPoint;
-
-namespace {
-
-const char kStoryName[] = "story";
-
-// Cf. README.md for what this test does and how.
-class TestApp : fuchsia::modular::NextListener,
-                public modular::testing::SessionShellBase {
- public:
-  TestApp(component::StartupContext* const startup_context)
-      : SessionShellBase(startup_context) {
-    TestInit(__FILE__);
-
-    startup_context->ConnectToEnvironmentService(puppet_master_.NewRequest());
-
-    session_shell_context()->GetSuggestionProvider(
-        suggestion_provider_.NewRequest());
-
-    suggestion_provider_->SubscribeToNext(
-        suggestion_listener_bindings_.AddBinding(this),
-        20 /* arbitrarily chosen */);
-
-    CreateStory();
-  }
-
-  ~TestApp() override = default;
-
- private:
-  void CreateStory() {
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("root");
-    add_mod.intent.action = kSuggestionTestAction;
-    add_mod.intent.handler = kSuggestionTestModule;
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-    commands.push_back(std::move(command));
-
-    puppet_master_->ControlStory(kStoryName, story_puppet_master_.NewRequest());
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) { StartStory(); });
-
-    Await(kSuggestionTestModuleDone, [this] {
-      story_controller_->Stop([this] {
-        story_controller_.Unbind();
-        Signal(modular::testing::kTestShutdown);
-      });
-    });
-  }
-
-  void StartStory() {
-    story_provider()->GetController(kStoryName, story_controller_.NewRequest());
-    story_controller_.set_error_handler([](zx_status_t status) {
-      FXL_LOG(ERROR) << "Story controller for story " << kStoryName
-                     << " died. Does this story exist?";
-    });
-    story_controller_->RequestStart();
-  }
-
-  TestPoint received_suggestion_{
-      "SuggestionTestSessionShell received suggestion"};
-
-  // |fuchsia::modular::NextListener|
-  void OnNextResults(
-      std::vector<fuchsia::modular::Suggestion> suggestions) override {
-    for (auto& suggestion : suggestions) {
-      auto& display = suggestion.display;
-      if (display.headline == "foo" && display.subheadline == "bar" &&
-          display.details == "baz") {
-        modular::testing::GetStore()->Put("suggestion_proposal_received", "",
-                                          [] {});
-        received_suggestion_.Pass();
-        fuchsia::modular::Interaction interaction;
-        interaction.type = fuchsia::modular::InteractionType::SELECTED;
-        suggestion_provider_->NotifyInteraction(suggestion.uuid, interaction);
-        break;
-      }
-    }
-  }
-
-  // |fuchsia::modular::NextListener|
-  void OnProcessingChange(bool processing) override {}
-
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-  fuchsia::modular::StoryControllerPtr story_controller_;
-  fuchsia::modular::SuggestionProviderPtr suggestion_provider_;
-  fidl::BindingSet<fuchsia::modular::NextListener>
-      suggestion_listener_bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  modular::testing::ComponentMain<TestApp>();
-  return 0;
-}
diff --git a/tests/trigger/BUILD.gn b/tests/trigger/BUILD.gn
deleted file mode 100644
index beca454..0000000
--- a/tests/trigger/BUILD.gn
+++ /dev/null
@@ -1,105 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-import("//peridot/build/executable_package.gni")
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
-
-executable_package("trigger_test_session_shell") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/trigger_test_session_shell.cmx"
-      dest = "trigger_test_session_shell.cmx"
-    },
-  ]
-
-  sources = [
-    "trigger_test_session_shell.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.testing.runner",
-    "//garnet/public/lib/callback",
-    "//garnet/public/lib/fidl/cpp",
-    "//garnet/public/lib/fxl",
-    "//peridot/lib/rapidjson",
-    "//peridot/lib/testing:component_main",
-    "//peridot/lib/testing:session_shell_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-  ]
-}
-
-executable_package("trigger_test_module") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/trigger_test_module.cmx"
-      dest = "trigger_test_module.cmx"
-    },
-  ]
-
-  sources = [
-    "trigger_test_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    ":trigger_test_service",
-    "//garnet/public/lib/callback",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/public/lib/message_queue/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("trigger_test_agent") {
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/trigger_test_agent.cmx"
-      dest = "trigger_test_agent.cmx"
-    },
-  ]
-
-  sources = [
-    "trigger_test_agent.cc",
-  ]
-
-  deps = [
-    ":defs",
-    ":trigger_test_service",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:agent_driver",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-fidl("trigger_test_service") {
-  cpp_legacy_callbacks = true
-
-  name = "test.peridot.tests.trigger"
-
-  sources = [
-    "trigger_test_service.fidl",
-  ]
-}
diff --git a/tests/trigger/README.md b/tests/trigger/README.md
deleted file mode 100644
index 62ad5b3..0000000
--- a/tests/trigger/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# trigger integration test
-
-This test verifies that Agents are woken up on triggers for:
-  1. New messages on a queue.
-  2. An explicitly deleted message queue.
-  3. A message queue being deleted as part of story tear down.
-
-The general structure of the test is a session shell is created, which
-in turn creates a story and adds the test module to it.
-
-The test module then verifies (1) and (2) by interacting with the
-test agent. It also creates a message queue that it does not delete
-explicitly and hands the token to the session shell.
-
-Once (1) and (2) have been verified, the session shell deletes the story
-and waits for the token it was handed by the module to appear in the
-test store. This signals that the agent was woken by the deletion trigger
-for that queue.
diff --git a/tests/trigger/defs.h b/tests/trigger/defs.h
deleted file mode 100644
index 11a4a37..0000000
--- a/tests/trigger/defs.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PERIDOT_TESTS_TRIGGER_DEFS_H_
-#define PERIDOT_TESTS_TRIGGER_DEFS_H_
-
-namespace {
-
-// This is how long we wait for the test to finish before we timeout and tear
-// down our test.
-constexpr int kTimeoutMilliseconds = 10000;
-
-// Package URLs of the test components used here.
-constexpr char kTestAgent[] =
-    "fuchsia-pkg://fuchsia.com/trigger_test_agent#meta/trigger_test_agent.cmx";
-
-const char kModuleUrl[] =
-    "fuchsia-pkg://fuchsia.com/trigger_test_module#meta/trigger_test_module.cmx";
-
-const char kModuleAction[] = "trigger_test_action";
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_TRIGGER_DEFS_H_
diff --git a/tests/trigger/meta/trigger_test_agent.cmx b/tests/trigger/meta/trigger_test_agent.cmx
deleted file mode 100644
index 12bf3ba..0000000
--- a/tests/trigger/meta/trigger_test_agent.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.AgentContext",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/trigger/meta/trigger_test_module.cmx b/tests/trigger/meta/trigger_test_module.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/trigger/meta/trigger_test_module.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/trigger/meta/trigger_test_session_shell.cmx b/tests/trigger/meta/trigger_test_session_shell.cmx
deleted file mode 100644
index 5d578b5..0000000
--- a/tests/trigger/meta/trigger_test_session_shell.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.sys.Environment",
-            "fuchsia.sys.Launcher",
-            "fuchsia.sys.Loader",
-            "fuchsia.testing.runner.TestRunner",
-            "fuchsia.testing.runner.TestRunnerStore",
-            "fuchsia.tracelink.Registry",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.ui.viewsv1.ViewManager",
-            "fuchsia.ui.viewsv1.ViewSnapshot"
-        ]
-    }
-}
diff --git a/tests/trigger/trigger_test_agent.cc b/tests/trigger/trigger_test_agent.cc
deleted file mode 100644
index 2ac9cb3..0000000
--- a/tests/trigger/trigger_test_agent.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/agent_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/fxl/logging.h>
-#include <test/peridot/tests/trigger/cpp/fidl.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/trigger/defs.h"
-
-using ::modular::testing::TestPoint;
-using ::test::peridot::tests::trigger::TriggerTestService;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestApp : TriggerTestService {
- public:
-  TestPoint initialized_{"Trigger test agent initialized"};
-
-  TestApp(modular::AgentHost* const agent_host)
-      : agent_context_(agent_host->agent_context()) {
-    modular::testing::Init(agent_host->startup_context(), __FILE__);
-    agent_context_->GetComponentContext(component_context_.NewRequest());
-
-    // Create a message queue and schedule a task to be run on receiving a
-    // message on it. This message queue is passed to the module.
-    component_context_->ObtainMessageQueue("Trigger Queue",
-                                           msg_queue_.NewRequest());
-    fuchsia::modular::TaskInfo task_info;
-    task_info.task_id = "message_queue_message";
-    task_info.trigger_condition.set_message_on_queue("Trigger Queue");
-    task_info.persistent = true;
-    agent_host->agent_context()->ScheduleTask(std::move(task_info));
-
-    agent_services_.AddService<TriggerTestService>(
-        [this](fidl::InterfaceRequest<TriggerTestService> request) {
-          service_bindings_.AddBinding(this, std::move(request));
-        });
-
-    initialized_.Pass();
-  }
-
-  // Called by AgentDriver.
-  void Connect(fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services) {
-    agent_services_.AddBinding(std::move(services));
-    modular::testing::GetStore()->Put("trigger_test_agent_connected", "",
-                                      [] {});
-  }
-
-  // Called by AgentDriver.
-  void RunTask(fidl::StringPtr task_id, const std::function<void()>& callback) {
-    modular::testing::GetStore()->Put(task_id, "", callback);
-  }
-
-  // Called by AgentDriver.
-  void Terminate(const std::function<void()>& done) {
-    modular::testing::GetStore()->Put("trigger_test_agent_stopped", "",
-                                      [done] { done(); });
-    modular::testing::Done(done);
-  }
-
- private:
-  // |TriggerTestService|
-  void GetMessageQueueToken(GetMessageQueueTokenCallback callback) override {
-    msg_queue_->GetToken(
-        [callback](fidl::StringPtr token) { callback(token); });
-  }
-
-  // |TriggerTestService|
-  void ObserveMessageQueueDeletion(std::string queue_token) override {
-    fuchsia::modular::TaskInfo task_info;
-    task_info.task_id = queue_token;
-    task_info.trigger_condition.set_queue_deleted(queue_token);
-    task_info.persistent = true;
-    agent_context_->ScheduleTask(std::move(task_info));
-    modular::testing::GetStore()->Put("trigger_test_agent_token_received", "",
-                                      [] {});
-  }
-
-  component::ServiceNamespace agent_services_;
-
-  fuchsia::modular::ComponentContextPtr component_context_;
-  fuchsia::modular::AgentContext* const agent_context_;
-  fuchsia::modular::MessageQueuePtr msg_queue_;
-
-  fidl::BindingSet<TriggerTestService> service_bindings_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::AgentDriver<TestApp> driver(context.get(), [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/trigger/trigger_test_module.cc b/tests/trigger/trigger_test_module.cc
deleted file mode 100644
index 53fdaec..0000000
--- a/tests/trigger/trigger_test_module.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <lib/app_driver/cpp/module_driver.h>
-#include <lib/async-loop/cpp/loop.h>
-#include <lib/async/cpp/task.h>
-#include <lib/async/default.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/message_queue/cpp/message_sender_client.h>
-#include <test/peridot/tests/trigger/cpp/fidl.h>
-
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/trigger/defs.h"
-
-using ::modular::testing::Await;
-using ::modular::testing::Signal;
-using ::modular::testing::TestPoint;
-using ::test::peridot::tests::trigger::TriggerTestServicePtr;
-
-namespace {
-
-// Cf. README.md for what this test does and how.
-class TestModule {
- public:
-  TestPoint initialized_{"Root module initialized"};
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/) {
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    initialized_.Pass();
-
-    // Exercise fuchsia::modular::ComponentContext.ConnectToAgent()
-    module_host->module_context()->GetComponentContext(
-        component_context_.NewRequest());
-
-    fuchsia::sys::ServiceProviderPtr agent_services;
-    component_context_->ConnectToAgent(kTestAgent, agent_services.NewRequest(),
-                                       agent_controller_.NewRequest());
-    component::ConnectToService(agent_services.get(),
-                                agent_service_.NewRequest());
-
-    // The message queue that is used to verify deletion triggers from explicit
-    // deletes.
-    component_context_->ObtainMessageQueue("explicit_test",
-                                           explicit_msg_queue_.NewRequest());
-    // The message queue that is used to verify deletion triggers from deletes
-    // when the module's namespace is torn down. The test session shell will
-    // verify that the agent is notified of this queues deletion.
-    component_context_->ObtainMessageQueue("implicit_test",
-                                           implicit_msg_queue_.NewRequest());
-    implicit_msg_queue_->GetToken([this](fidl::StringPtr token) {
-      modular::testing::GetStore()->Put("trigger_test_module_queue_token",
-                                        token, [] {});
-      agent_service_->ObserveMessageQueueDeletion(token);
-      explicit_msg_queue_->GetToken([this](fidl::StringPtr token) {
-        explicit_queue_token_ = token;
-        agent_service_->ObserveMessageQueueDeletion(std::move(token));
-
-        TestMessageQueueMessageTrigger();
-      });
-    });
-  }
-
-  TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
-      : TestModule(
-            module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
-
-  TestPoint received_trigger_token_{"Received trigger token"};
-  TestPoint agent_connected_{"fuchsia::modular::Agent accepted connection"};
-  TestPoint agent_stopped_{"fuchsia::modular::Agent stopped"};
-  TestPoint task_triggered_{"fuchsia::modular::Agent task triggered"};
-  void TestMessageQueueMessageTrigger() {
-    Await("trigger_test_agent_connected", [this] {
-      agent_connected_.Pass();
-      agent_service_->GetMessageQueueToken([this](fidl::StringPtr token) {
-        received_trigger_token_.Pass();
-
-        // Stop the agent.
-        agent_controller_.Unbind();
-
-        Await("trigger_test_agent_stopped", [this, token] {
-          agent_stopped_.Pass();
-
-          // Send a message to the stopped agent which should
-          // trigger it.
-          component_context_->GetMessageSender(token,
-                                               message_sender_.NewRequest());
-          message_sender_.Send("Time to wake up...");
-
-          Await("message_queue_message", [this] {
-            task_triggered_.Pass();
-            Await("trigger_test_agent_stopped",
-                  [this] { TestMessageQueueDeletionTrigger(); });
-          });
-        });
-      });
-    });
-  }
-
-  TestPoint queue_deleted_{"Message queue deletion task triggered."};
-  void TestMessageQueueDeletionTrigger() {
-    fuchsia::sys::ServiceProviderPtr agent_services;
-    component_context_->ConnectToAgent(kTestAgent, agent_services.NewRequest(),
-                                       agent_controller_.NewRequest());
-    component::ConnectToService(agent_services.get(),
-                                agent_service_.NewRequest());
-
-    // First wait for the agent to connect, and then kill it.
-    Await("trigger_test_agent_connected", [this] {
-      Await("trigger_test_agent_token_received", [this] {
-        agent_controller_.Unbind();
-        Await("trigger_test_agent_stopped", [this] {
-          // When the agent has stopped, delete the message queue and verify
-          // that the agent is woken up and notified.
-          component_context_->DeleteMessageQueue("explicit_test");
-          Await(explicit_queue_token_, [this] {
-            queue_deleted_.Pass();
-            Signal("trigger_test_module_done");
-          });
-        });
-      });
-    });
-  }
-
-  TestPoint stopped_{"Root module stopped"};
-  // Called by ModuleDriver.
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  fuchsia::modular::AgentControllerPtr agent_controller_;
-  TriggerTestServicePtr agent_service_;
-  fuchsia::modular::ComponentContextPtr component_context_;
-  // The queue used for observing explicit queue deletion.
-  fuchsia::modular::MessageQueuePtr explicit_msg_queue_;
-  std::string explicit_queue_token_;
-  // The queue used for observing queue deletion when module's namespace is torn
-  // down.
-  fuchsia::modular::MessageQueuePtr implicit_msg_queue_;
-  modular::MessageSenderClient message_sender_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestModule);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  async::Loop loop(&kAsyncLoopConfigAttachToThread);
-  auto context = component::StartupContext::CreateFromStartupInfo();
-  modular::ModuleDriver<TestModule> driver(context.get(),
-                                           [&loop] { loop.Quit(); });
-  loop.Run();
-  return 0;
-}
diff --git a/tests/trigger/trigger_test_service.fidl b/tests/trigger/trigger_test_service.fidl
deleted file mode 100644
index e7ac5c3..0000000
--- a/tests/trigger/trigger_test_service.fidl
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-library test.peridot.tests.trigger;
-
-// Cf. README.md for what this test does and how.
-[Discoverable]
-interface TriggerTestService {
-    1: GetMessageQueueToken() -> (string message_queue_token);
-    2: ObserveMessageQueueDeletion(string token);
-};
diff --git a/tests/trigger/trigger_test_session_shell.cc b/tests/trigger/trigger_test_session_shell.cc
deleted file mode 100644
index 9aa7b2c..0000000
--- a/tests/trigger/trigger_test_session_shell.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-
-#include <fuchsia/modular/cpp/fidl.h>
-#include <fuchsia/ui/viewsv1token/cpp/fidl.h>
-#include <lib/callback/scoped_callback.h>
-#include <lib/component/cpp/connect.h>
-#include <lib/component/cpp/startup_context.h>
-#include <lib/fidl/cpp/binding.h>
-#include <lib/fxl/logging.h>
-#include <lib/fxl/macros.h>
-
-#include "peridot/lib/testing/component_main.h"
-#include "peridot/lib/testing/session_shell_base.h"
-#include "peridot/public/lib/integration_testing/cpp/reporting.h"
-#include "peridot/public/lib/integration_testing/cpp/testing.h"
-#include "peridot/tests/common/defs.h"
-#include "peridot/tests/trigger/defs.h"
-
-using ::modular::testing::Await;
-using ::modular::testing::Signal;
-using ::modular::testing::TestPoint;
-
-namespace {
-
-const char kStoryName[] = "story";
-
-class TestApp : public modular::testing::SessionShellBase {
- public:
-  TestApp(component::StartupContext* const startup_context)
-      : SessionShellBase(startup_context), weak_ptr_factory_(this) {
-    TestInit(__FILE__);
-
-    startup_context->ConnectToEnvironmentService(puppet_master_.NewRequest());
-
-    CreateStory();
-  }
-
-  ~TestApp() override = default;
-
- private:
-  TestPoint story_create_{"Created story."};
-
-  void CreateStory() {
-    std::vector<fuchsia::modular::StoryCommand> commands;
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("root");
-
-    add_mod.intent.action = kModuleAction;
-    add_mod.intent.handler = kModuleUrl;
-
-    fuchsia::modular::StoryCommand command;
-    command.set_add_mod(std::move(add_mod));
-    commands.push_back(std::move(command));
-
-    puppet_master_->ControlStory(kStoryName, story_puppet_master_.NewRequest());
-    story_puppet_master_->Enqueue(std::move(commands));
-    story_puppet_master_->Execute(
-        [this](fuchsia::modular::ExecuteResult result) {
-          story_create_.Pass();
-          StartStory();
-        });
-  }
-
-  TestPoint got_queue_token_{"Got message queue token."};
-  TestPoint module_finished_{"Trigger test module finished work."};
-  TestPoint story_was_deleted_{"Story was deleted."};
-  TestPoint agent_executed_delete_task_{
-      "fuchsia::modular::Agent executed message queue task."};
-  void StartStory() {
-    story_provider()->GetController(kStoryName, story_controller_.NewRequest());
-    story_controller_.set_error_handler([this](zx_status_t status) {
-      FXL_LOG(ERROR) << "Story controller for story " << kStoryName
-                     << " died. Does this story exist?";
-    });
-
-    story_controller_->RequestStart();
-
-    // Retrieve the message queue token for the messsage queue that the module
-    // created.
-    modular::testing::GetStore()->Get(
-        "trigger_test_module_queue_token", [this](fidl::StringPtr value) {
-          got_queue_token_.Pass();
-          // Wait for the module to finish its test cases for communicating
-          // with the agent.
-          Await("trigger_test_module_done", [this, value] {
-            module_finished_.Pass();
-            // Delete the story to trigger the deletion of the message
-            // queue that the module created.
-            puppet_master_->DeleteStory(kStoryName, [this, value]() {
-              story_was_deleted_.Pass();
-              // Verify that the agent task was triggered, by checking
-              // that the agent wrote the message queue token to the
-              // test store.
-              Await(value, [this] {
-                agent_executed_delete_task_.Pass();
-                Signal(modular::testing::kTestShutdown);
-              });
-            });
-          });
-        });
-  }
-
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-  fuchsia::modular::StoryControllerPtr story_controller_;
-
-  fxl::WeakPtrFactory<TestApp> weak_ptr_factory_;
-
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  modular::testing::ComponentMain<TestApp>();
-  return 0;
-}
diff --git a/third_party/.nolint b/third_party/.nolint
deleted file mode 100644
index e69de29..0000000
--- a/third_party/.nolint
+++ /dev/null
diff --git a/third_party/bup/BUILD.gn b/third_party/bup/BUILD.gn
deleted file mode 100644
index af1cc73..0000000
--- a/third_party/bup/BUILD.gn
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//peridot/build/tests_package.gni")
-
-visibility = [ "//peridot/*" ]
-
-source_set("bup") {
-  sources = [
-    "bupsplit.cc",
-    "bupsplit.h",
-  ]
-
-  public_deps = [
-    "//garnet/public/lib/fxl",
-  ]
-}
-
-executable("bupsplit_unittest") {
-  testonly = true
-
-  sources = [
-    "bupsplit_unittest.cc",
-  ]
-
-  deps = [
-    ":bup",
-    "//third_party/googletest:gtest_main",
-  ]
-}
-
-tests_package("bup_tests") {
-  deps = [
-    ":bupsplit_unittest",
-  ]
-}
diff --git a/third_party/bup/LICENSE b/third_party/bup/LICENSE
deleted file mode 100644
index 8651d36..0000000
--- a/third_party/bup/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright 2011 Avery Pennarun. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-   1. Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-   2. Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in
-      the documentation and/or other materials provided with the
-      distribution.
-
-THIS SOFTWARE IS PROVIDED BY AVERY PENNARUN ``AS IS'' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/third_party/bup/README.fuchsia b/third_party/bup/README.fuchsia
deleted file mode 100644
index ad33309..0000000
--- a/third_party/bup/README.fuchsia
+++ /dev/null
@@ -1,12 +0,0 @@
-Name: Bup
-URL: https://github.com/apenwarr/bup
-License: BSD
-License File: LICENSE
-
-This repository has the relevant components from Bup copied to handle rolling
-hashes.
-
-The code has been modified to:
-- Change from C to C++.
-- Allow to add data in multiple passes.
-- Have a minimal and maximal size for chunks.
diff --git a/third_party/bup/bupsplit.cc b/third_party/bup/bupsplit.cc
deleted file mode 100644
index 0ffe76e..0000000
--- a/third_party/bup/bupsplit.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2011 Avery Pennarun. All rights reserved.
- *
- * (This license applies to bupsplit.c and bupsplit.h only.)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *    1. Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *
- *    2. Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY AVERY PENNARUN ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "peridot/third_party/bup/bupsplit.h"
-
-#include <memory.h>
-#include <stdint.h>
-
-namespace bup {
-
-namespace {
-
-// According to librsync/rollsum.h:
-// "We should make this something other than zero to improve the
-// checksum algorithm: tridge suggests a prime number."
-// apenwarr: I unscientifically tried 0 and 7919, and they both ended up
-// slightly worse than the librsync value of 31 for my arbitrary test data.
-constexpr uint8_t kRollsumCharOffset = 31;
-
-}  // namespace
-
-RollSumSplit::RollSumSplit(size_t min_length, size_t max_length)
-    : min_length_(min_length), max_length_(max_length) {
-  Reset();
-}
-
-RollSumSplit::RollSumSplit(const RollSumSplit& other) = default;
-
-void RollSumSplit::Reset() {
-  current_length_ = 0u;
-  s1_ = kWindowSize * kRollsumCharOffset;
-  s2_ = kWindowSize * (kWindowSize - 1) * kRollsumCharOffset;
-  window_index_ = 0;
-  memset(window_, 0, kWindowSize);
-}
-
-size_t RollSumSplit::Feed(fxl::StringView buffer, size_t* bits) {
-  for (size_t i = 0; i < buffer.size(); i++) {
-    Roll(buffer[i]);
-    ++current_length_;
-    if (current_length_ >= min_length_ &&
-        ((s2_ & (kBlobSize - 1)) == ((~0) & (kBlobSize - 1)) ||
-         current_length_ >= max_length_)) {
-      if (bits) {
-        uint32_t rsum = Digest();
-        *bits = kBlobBits;
-        rsum >>= kBlobBits;
-        while ((rsum >>= 1) & 1) {
-          (*bits)++;
-        }
-      }
-      current_length_ = 0;
-      return i + 1;
-    }
-  }
-  return 0;
-}
-
-void RollSumSplit::Add(uint8_t drop, uint8_t add) {
-  s1_ += add - drop;
-  s2_ += s1_ - (kWindowSize * (drop + kRollsumCharOffset));
-}
-
-void RollSumSplit::Roll(uint8_t c) {
-  Add(window_[window_index_], c);
-  window_[window_index_] = c;
-  window_index_ = (window_index_ + 1) % kWindowSize;
-}
-
-uint32_t RollSumSplit::Digest() {
-  return (s1_ << 16) | (s2_ & 0xffff);
-}
-
-}  // namespace bup
diff --git a/third_party/bup/bupsplit.h b/third_party/bup/bupsplit.h
deleted file mode 100644
index e49c34e..0000000
--- a/third_party/bup/bupsplit.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2011 Avery Pennarun. All rights reserved.
- *
- * (This license applies to bupsplit.c and bupsplit.h only.)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *    1. Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *
- *    2. Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY AVERY PENNARUN ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef PERIDOT_BIN_LEDGER_THIRD_PARTY_BUP_BUPSPLIT_H_
-#define PERIDOT_BIN_LEDGER_THIRD_PARTY_BUP_BUPSPLIT_H_
-
-#include <stdint.h>
-
-#include <lib/fxl/macros.h>
-#include <lib/fxl/strings/string_view.h>
-
-namespace bup {
-
-constexpr uint8_t kBlobBits = 13;
-constexpr uint16_t kBlobSize = 1 << kBlobBits;
-constexpr uint8_t kWindowBits = 7;
-constexpr uint16_t kWindowSize = 1 << (kWindowBits - 1);
-
-// Splits data into chunks between |min_length| and |max_length| of size that
-// are "good" for de-duplication.
-//
-// It achieves that by calculating a rolling hash of the window of
-// |kWindowBits|. The split points are selected when the last |kBlobBits| of the
-// current hash are all 1s. This ensures that if data is removed or inserted in
-// the middle of data, only the 2 split points following the change are
-// modified, and all others stay identical.
-class RollSumSplit {
- public:
-  // |min_length| is the minimal size of a chunk.
-  // |max_length| is the maximal size of a chunk.
-  RollSumSplit(size_t min_length, size_t max_length);
-
-  // Copy constructor.
-  RollSumSplit(const RollSumSplit& other);
-
-  // Reset the state of the rolling hash.
-  void Reset();
-
-  // Returns a non-zero value indicating the size of the prefix that is the next
-  // cut, or 0 if all data was consumed without finding the next cut.
-  // If |bits| is not null, and a cut has been found, |*bits| will be the number
-  // of trailing 1s in the current hash. It will always be greater of equals to
-  // |kBlobBits|.
-  size_t Feed(fxl::StringView buffer, size_t* bits);
-
- private:
-  void Add(uint8_t drop, uint8_t add);
-  void Roll(uint8_t c);
-  uint32_t Digest();
-
-  const size_t min_length_;
-  const size_t max_length_;
-  size_t current_length_;
-  uint64_t s1_, s2_;
-  uint8_t window_[kWindowSize];
-  size_t window_index_;
-};
-
-}  // namespace bup
-
-#endif  // PERIDOT_BIN_LEDGER_THIRD_PARTY_BUP_BUPSPLIT_H_
diff --git a/third_party/bup/bupsplit_unittest.cc b/third_party/bup/bupsplit_unittest.cc
deleted file mode 100644
index ef6280c..0000000
--- a/third_party/bup/bupsplit_unittest.cc
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "peridot/third_party/bup/bupsplit.h"
-
-#include <stdlib.h>
-#include <limits>
-
-#include <lib/fxl/logging.h>
-
-#include "gtest/gtest.h"
-
-namespace bup {
-namespace {
-
-class RollSumSplitTest : public ::testing::Test {
- protected:
-  void SetUp() override { srand(0); }
-};
-
-std::string GetValue(size_t size) {
-  std::string value(size, '\0');
-  for (size_t i = 0; i < value.size(); ++i) {
-    value[i] = rand();
-  }
-  return value;
-}
-
-TEST_F(RollSumSplitTest, CheckMinMax) {
-  const size_t min = 4 * 1024;
-  const size_t max = 8 * 1024;
-
-  RollSumSplit rh(min, max);
-
-  std::string value = GetValue(1024 * 1024);
-  fxl::StringView view = value;
-  while (!view.empty()) {
-    size_t index = rh.Feed(view, nullptr);
-    if (index > 0) {
-      EXPECT_TRUE(index >= min);
-      EXPECT_TRUE(index <= max);
-      view = view.substr(index);
-    } else {
-      EXPECT_TRUE(view.size() <= max);
-      view = "";
-    }
-  }
-}
-
-// Verifies that results are the same when we feed all data at once and when we
-// feed the data byte-by-byte.
-TEST_F(RollSumSplitTest, CheckSameResult) {
-  struct Cut {
-    size_t size;
-    size_t bits;
-  };
-
-  RollSumSplit rh(4 * 1024, 64 * 1024 - 1);
-
-  std::string value = GetValue(1024 * 1024);
-  fxl::StringView view = value;
-  std::vector<Cut> feed_all_cuts;
-  while (!view.empty()) {
-    Cut cut;
-    cut.size = rh.Feed(view, &cut.bits);
-    if (cut.size) {
-      view = view.substr(cut.size);
-      feed_all_cuts.push_back(cut);
-    } else {
-      view = "";
-    }
-  }
-
-  view = value;
-  rh.Reset();
-  std::vector<Cut> feed_by_byte_cuts;
-  size_t index = 0;
-  for (size_t i = 0; i < view.size(); ++i) {
-    Cut cut;
-    size_t count = rh.Feed(view.substr(i, 1), &cut.bits);
-    ++index;
-    if (count) {
-      cut.size = index;
-      feed_by_byte_cuts.push_back(cut);
-      index = 0;
-    }
-  }
-
-  ASSERT_EQ(feed_all_cuts.size(), feed_by_byte_cuts.size());
-  EXPECT_GT(feed_all_cuts.size(), 0u);
-  for (size_t i = 0; i < feed_all_cuts.size(); ++i) {
-    EXPECT_EQ(feed_all_cuts[i].size, feed_by_byte_cuts[i].size);
-    EXPECT_EQ(feed_all_cuts[i].bits, feed_by_byte_cuts[i].bits);
-  }
-}
-
-// Check that the roll sum hash only depends on the last |kWindowSize|
-// characters.
-TEST_F(RollSumSplitTest, CheckWindowed) {
-  RollSumSplit r1(0, std::numeric_limits<size_t>::max());
-  RollSumSplit r2(0, std::numeric_limits<size_t>::max());
-
-  // Try different initial feeds for the first hasher until finding the case
-  // where the 2 hashes do not agree at least once while consuming the
-  // |kWindowSize| characters.
-  bool finished = false;
-  for (size_t initial_feed = 1026; !finished; ++initial_feed) {
-    r1.Reset();
-    r2.Reset();
-
-    r1.Feed(GetValue(initial_feed), nullptr);
-
-    // Feed kWindowSize characters.
-    std::string value = GetValue(kWindowSize);
-    fxl::StringView view = value;
-    for (size_t i = 0; i < view.size(); ++i) {
-      auto f1 = r1.Feed(view.substr(i, 1), nullptr);
-      auto f2 = r2.Feed(view.substr(i, 1), nullptr);
-      finished = finished || (f1 != f2);
-    }
-    value = GetValue(1024 * 1024);
-    EXPECT_EQ(r1.Feed(value, nullptr), r2.Feed(value, nullptr));
-  }
-}
-
-}  // namespace
-}  // namespace bup
diff --git a/third_party/modp_b64/BUILD.gn b/third_party/modp_b64/BUILD.gn
deleted file mode 100644
index c883c46..0000000
--- a/third_party/modp_b64/BUILD.gn
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (c) 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.
-
-visibility = [ "//peridot/*" ]
-
-static_library("modp_b64") {
-  sources = [
-    "modp_b64.cc",
-    "modp_b64.h",
-    "modp_b64_data.h",
-  ]
-
-  deps = [
-    "//garnet/public/lib/fxl",
-  ]
-}
diff --git a/third_party/modp_b64/LICENSE b/third_party/modp_b64/LICENSE
deleted file mode 100644
index 55af76f..0000000
--- a/third_party/modp_b64/LICENSE
+++ /dev/null
@@ -1,33 +0,0 @@
- * MODP_B64 - High performance base64 encoder/decoder
- * Version 1.3 -- 17-Mar-2006
- * http://modp.com/release/base64
- *
- * Copyright (c) 2005, 2006  Nick Galbreath -- nickg [at] modp [dot] com
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *   Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- *   Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- *   Neither the name of the modp.com nor the names of its
- *   contributors may be used to endorse or promote products derived from
- *   this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/third_party/modp_b64/README.fuchsia b/third_party/modp_b64/README.fuchsia
deleted file mode 100644
index 9da0eeb..0000000
--- a/third_party/modp_b64/README.fuchsia
+++ /dev/null
@@ -1,16 +0,0 @@
-Name: modp_b64
-URL: https://github.com/client9/stringencoders
-License: BSD
-License File: LICENSE
-
-The modp_b64.c file was modified to remove the inclusion of modp's config.h
-and to fix compilation errors that occur under VC8.  The file was renamed
-modp_b64.cc to force it to be compiled as C++ so that the inclusion of
-basictypes.h could be possible.
-
-The modp_b64.cc and modp_b64.h files were modified to make them safe on
-64-bit systems.
-The modp_b64.cc was modified to avoid misaligned read/write on
-little-endian hardware.
-
-modp_b64 was modified to produce base64url.
diff --git a/third_party/modp_b64/modp_b64.cc b/third_party/modp_b64/modp_b64.cc
deleted file mode 100644
index dbfa0bb..0000000
--- a/third_party/modp_b64/modp_b64.cc
+++ /dev/null
@@ -1,260 +0,0 @@
-/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4 -*- */
-/* vi: set expandtab shiftwidth=4 tabstop=4: */
-/**
- * \file
- * <PRE>
- * MODP_B64 - High performance base64 encoder/decoder
- * Version 1.3 -- 17-Mar-2006
- * http://modp.com/release/base64
- *
- * Copyright &copy; 2005, 2006  Nick Galbreath -- nickg [at] modp [dot] com
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *   Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- *   Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- *   Neither the name of the modp.com nor the names of its
- *   contributors may be used to endorse or promote products derived from
- *   this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This is the standard "new" BSD license:
- * http://www.opensource.org/licenses/bsd-license.php
- * </PRE>
- */
-
-/* public header */
-#include "modp_b64.h"
-
-/*
- * If you are ripping this out of the library, comment out the next
- * line and uncomment the next lines as approrpiate
- */
-#include <lib/fxl/build_config.h>
-
-#ifndef ARCH_CPU_LITTLE_ENDIAN
-
-/* if on motoral, sun, ibm; uncomment this */
-#define WORDS_BIGENDIAN 1
-
-#else
-
-/* else for Intel, Amd; uncomment this */
-#undef WORDS_BIGENDIAN
-
-#endif  // ARCH_CPU_LITTLE_ENDIAN
-
-#include "modp_b64_data.h"
-
-#define BADCHAR 0x01FFFFFF
-
-/**
- * you can control if we use padding by commenting out this
- * next line.  However, I highly recommend you use padding and not
- * using it should only be for compatability with a 3rd party.
- * Also, 'no padding' is not tested!
- */
-#define DOPAD 1
-
-/*
- * if we aren't doing padding
- * set the pad character to NULL
- */
-#ifndef DOPAD
-#undef CHARPAD
-#define CHARPAD '\0'
-#endif
-
-size_t modp_b64_encode(char* dest, const char* str, size_t len)
-{
-    size_t i = 0;
-    uint8_t* p = (uint8_t*) dest;
-
-    /* unsigned here is important! */
-    uint8_t t1, t2, t3;
-
-    if (len > 2) {
-        for (; i < len - 2; i += 3) {
-            t1 = str[i]; t2 = str[i+1]; t3 = str[i+2];
-            *p++ = e0[t1];
-            *p++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
-            *p++ = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)];
-            *p++ = e2[t3];
-        }
-    }
-
-    switch (len - i) {
-    case 0:
-        break;
-    case 1:
-        t1 = str[i];
-        *p++ = e0[t1];
-        *p++ = e1[(t1 & 0x03) << 4];
-        *p++ = CHARPAD;
-        *p++ = CHARPAD;
-        break;
-    default: /* case 2 */
-        t1 = str[i]; t2 = str[i+1];
-        *p++ = e0[t1];
-        *p++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
-        *p++ = e2[(t2 & 0x0F) << 2];
-        *p++ = CHARPAD;
-    }
-
-    *p = '\0';
-    return p - (uint8_t*)dest;
-}
-
-#ifdef WORDS_BIGENDIAN   /* BIG ENDIAN -- SUN / IBM / MOTOROLA */
-int modp_b64_decode(char* dest, const char* src, int len)
-{
-    if (len == 0) return 0;
-
-#ifdef DOPAD
-    /* if padding is used, then the message must be at least
-       4 chars and be a multiple of 4.
-       there can be at most 2 pad chars at the end */
-    if (len < 4 || (len % 4 != 0)) return MODP_B64_ERROR;
-    if (src[len-1] == CHARPAD) {
-        len--;
-        if (src[len -1] == CHARPAD) {
-            len--;
-        }
-    }
-#endif  /* DOPAD */
-
-    size_t i;
-    int leftover = len % 4;
-    size_t chunks = (leftover == 0) ? len / 4 - 1 : len /4;
-
-    uint8_t* p = (uint8_t*) dest;
-    uint32_t x = 0;
-    uint32_t* destInt = (uint32_t*) p;
-    uint32_t* srcInt = (uint32_t*) src;
-    uint32_t y = *srcInt++;
-    for (i = 0; i < chunks; ++i) {
-        x = d0[y >> 24 & 0xff] | d1[y >> 16 & 0xff] |
-            d2[y >> 8 & 0xff] | d3[y & 0xff];
-
-        if (x >= BADCHAR)  return MODP_B64_ERROR;
-        *destInt = x << 8;
-        p += 3;
-        destInt = (uint32_t*)p;
-        y = *srcInt++;
-    }
-
-    switch (leftover) {
-    case 0:
-        x = d0[y >> 24 & 0xff] | d1[y >> 16 & 0xff] |
-            d2[y >>  8 & 0xff] | d3[y & 0xff];
-        if (x >= BADCHAR)  return MODP_B64_ERROR;
-        *p++ = ((uint8_t*)&x)[1];
-        *p++ = ((uint8_t*)&x)[2];
-        *p = ((uint8_t*)&x)[3];
-        return (chunks+1)*3;
-    case 1:
-        x = d3[y >> 24];
-        *p =  (uint8_t)x;
-        break;
-    case 2:
-        x = d3[y >> 24] *64 + d3[(y >> 16) & 0xff];
-        *p =  (uint8_t)(x >> 4);
-        break;
-    default:  /* case 3 */
-        x = (d3[y >> 24] *64 + d3[(y >> 16) & 0xff])*64 +
-            d3[(y >> 8) & 0xff];
-        *p++ = (uint8_t) (x >> 10);
-        *p = (uint8_t) (x >> 2);
-        break;
-    }
-
-    if (x >= BADCHAR) return MODP_B64_ERROR;
-    return 3*chunks + (6*leftover)/8;
-}
-
-#else /* LITTLE  ENDIAN -- INTEL AND FRIENDS */
-
-size_t modp_b64_decode(char* dest, const char* src, size_t len)
-{
-    if (len == 0) return 0;
-
-#ifdef DOPAD
-    /*
-     * if padding is used, then the message must be at least
-     * 4 chars and be a multiple of 4
-     */
-    if (len < 4 || (len % 4 != 0)) return MODP_B64_ERROR; /* error */
-    /* there can be at most 2 pad chars at the end */
-    if (src[len-1] == CHARPAD) {
-        len--;
-        if (src[len -1] == CHARPAD) {
-            len--;
-        }
-    }
-#endif
-
-    size_t i;
-    int leftover = len % 4;
-    size_t chunks = (leftover == 0) ? len / 4 - 1 : len /4;
-
-    uint8_t* p = (uint8_t*)dest;
-    uint32_t x = 0;
-    const uint8_t* y = (uint8_t*)src;
-    for (i = 0; i < chunks; ++i, y += 4) {
-        x = d0[y[0]] | d1[y[1]] | d2[y[2]] | d3[y[3]];
-        if (x >= BADCHAR) return MODP_B64_ERROR;
-        *p++ =  ((uint8_t*)(&x))[0];
-        *p++ =  ((uint8_t*)(&x))[1];
-        *p++ =  ((uint8_t*)(&x))[2];
-    }
-
-    switch (leftover) {
-    case 0:
-        x = d0[y[0]] | d1[y[1]] | d2[y[2]] | d3[y[3]];
-
-        if (x >= BADCHAR) return MODP_B64_ERROR;
-        *p++ =  ((uint8_t*)(&x))[0];
-        *p++ =  ((uint8_t*)(&x))[1];
-        *p =    ((uint8_t*)(&x))[2];
-        return (chunks+1)*3;
-        break;
-    case 1:  /* with padding this is an impossible case */
-        x = d0[y[0]];
-        *p = *((uint8_t*)(&x)); // i.e. first char/byte in int
-        break;
-    case 2: // * case 2, 1  output byte */
-        x = d0[y[0]] | d1[y[1]];
-        *p = *((uint8_t*)(&x)); // i.e. first char
-        break;
-    default: /* case 3, 2 output bytes */
-        x = d0[y[0]] | d1[y[1]] | d2[y[2]];  /* 0x3c */
-        *p++ =  ((uint8_t*)(&x))[0];
-        *p =  ((uint8_t*)(&x))[1];
-        break;
-    }
-
-    if (x >= BADCHAR) return MODP_B64_ERROR;
-
-    return 3*chunks + (6*leftover)/8;
-}
-
-#endif  /* if bigendian / else / endif */
diff --git a/third_party/modp_b64/modp_b64.h b/third_party/modp_b64/modp_b64.h
deleted file mode 100644
index 3270e5f..0000000
--- a/third_party/modp_b64/modp_b64.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4 -*- */
-/* vi: set expandtab shiftwidth=4 tabstop=4: */
-
-/**
- * \file
- * <PRE>
- * High performance base64 encoder / decoder
- * Version 1.3 -- 17-Mar-2006
- *
- * Copyright &copy; 2005, 2006, Nick Galbreath -- nickg [at] modp [dot] com
- * All rights reserved.
- *
- * http://modp.com/release/base64
- *
- * Released under bsd license.  See modp_b64.c for details.
- * </pre>
- *
- * The default implementation is the standard b64 encoding with padding.
- * It's easy to change this to use "URL safe" characters and to remove
- * padding.  See the modp_b64.c source code for details.
- *
- */
-
-#ifndef MODP_B64
-#define MODP_B64
-
-#include <stddef.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * Encode a raw binary string into base 64.
- * src contains the bytes
- * len contains the number of bytes in the src
- * dest should be allocated by the caller to contain
- *   at least modp_b64_encode_len(len) bytes (see below)
- *   This will contain the null-terminated b64 encoded result
- * returns length of the destination string plus the ending null byte
- *    i.e.  the result will be equal to strlen(dest) + 1
- *
- * Example
- * 
- * \code
- * char* src = ...;
- * int srclen = ...; //the length of number of bytes in src
- * char* dest = (char*) malloc(modp_b64_encode_len);
- * int len = modp_b64_encode(dest, src, sourcelen);
- * if (len == -1) {
- *   printf("Error\n");
- * } else {
- *   printf("b64 = %s\n", dest);
- * }
- * \endcode
- *
- */
-size_t modp_b64_encode(char* dest, const char* str, size_t len);
-
-/**
- * Decode a base64 encoded string
- *
- * src should contain exactly len bytes of b64 characters.
- *     if src contains -any- non-base characters (such as white
- *     space, -1 is returned.
- *
- * dest should be allocated by the caller to contain at least
- *    len * 3 / 4 bytes.
- *
- * Returns the length (strlen) of the output, or -1 if unable to
- * decode
- *
- * \code
- * char* src = ...;
- * int srclen = ...; // or if you don't know use strlen(src)
- * char* dest = (char*) malloc(modp_b64_decode_len(srclen));
- * int len = modp_b64_decode(dest, src, sourcelen);
- * if (len == -1) { error }
- * \endcode
- */
-size_t modp_b64_decode(char* dest, const char* src, size_t len);
-
-/**
- * Given a source string of length len, this returns the amount of
- * memory the destination string should have.
- *
- * remember, this is integer math
- * 3 bytes turn into 4 chars
- * ceiling[len / 3] * 4 + 1
- *
- * +1 is for any extra null.
- */
-#define modp_b64_encode_len(A) ((A+2)/3 * 4 + 1)
-
-/**
- * Given a base64 string of length len,
- *   this returns the amount of memory required for output string
- *  It maybe be more than the actual number of bytes written.
- * NOTE: remember this is integer math
- * this allocates a bit more memory than traditional versions of b64
- * decode  4 chars turn into 3 bytes
- * floor[len * 3/4] + 2
- */
-#define modp_b64_decode_len(A) (A / 4 * 3 + 2)
-
-/**
- * Will return the strlen of the output from encoding.
- * This may be less than the required number of bytes allocated.
- *
- * This allows you to 'deserialized' a struct
- * \code
- * char* b64encoded = "...";
- * int len = strlen(b64encoded);
- *
- * struct datastuff foo;
- * if (modp_b64_encode_strlen(sizeof(struct datastuff)) != len) {
- *    // wrong size
- *    return false;
- * } else {
- *    // safe to do;
- *    if (modp_b64_decode((char*) &foo, b64encoded, len) == -1) {
- *      // bad characters
- *      return false;
- *    }
- * }
- * // foo is filled out now
- * \endcode
- */
-#define modp_b64_encode_strlen(A) ((A + 2)/ 3 * 4)
-
-#define MODP_B64_ERROR ((size_t)-1)
-
-#ifdef __cplusplus
-}
-
-#include <string>
-
-inline std::string& modp_b64_encode(std::string& s)
-{
-    std::string x(modp_b64_encode_len(s.size()), '\0');
-    size_t d = modp_b64_encode(const_cast<char*>(x.data()), s.data(), (int)s.size());
-    x.erase(d, std::string::npos);
-    s.swap(x);
-    return s;
-}
-
-/**
- * base 64 decode a string (self-modifing)
- * On failure, the string is empty.
- *
- * This function is for C++ only (duh)
- *
- * \param[in,out] s the string to be decoded
- * \return a reference to the input string
- */
-inline std::string& modp_b64_decode(std::string& s)
-{
-    std::string x(modp_b64_decode_len(s.size()), '\0');
-    size_t d = modp_b64_decode(const_cast<char*>(x.data()), s.data(), (int)s.size());
-    if (d == MODP_B64_ERROR) {
-        x.clear();
-    } else {
-        x.erase(d, std::string::npos);
-    }
-    s.swap(x);
-    return s;
-}
-
-#endif /* __cplusplus */
-
-#endif /* MODP_B64 */
diff --git a/third_party/modp_b64/modp_b64_data.h b/third_party/modp_b64/modp_b64_data.h
deleted file mode 100644
index ce3d68a..0000000
--- a/third_party/modp_b64/modp_b64_data.h
+++ /dev/null
@@ -1,481 +0,0 @@
-#include <stdint.h>
-
-#define CHAR62 '-'
-#define CHAR63 '_'
-#define CHARPAD '='
-static const char e0[256] = {
- 'A',  'A',  'A',  'A',  'B',  'B',  'B',  'B',  'C',  'C',
- 'C',  'C',  'D',  'D',  'D',  'D',  'E',  'E',  'E',  'E',
- 'F',  'F',  'F',  'F',  'G',  'G',  'G',  'G',  'H',  'H',
- 'H',  'H',  'I',  'I',  'I',  'I',  'J',  'J',  'J',  'J',
- 'K',  'K',  'K',  'K',  'L',  'L',  'L',  'L',  'M',  'M',
- 'M',  'M',  'N',  'N',  'N',  'N',  'O',  'O',  'O',  'O',
- 'P',  'P',  'P',  'P',  'Q',  'Q',  'Q',  'Q',  'R',  'R',
- 'R',  'R',  'S',  'S',  'S',  'S',  'T',  'T',  'T',  'T',
- 'U',  'U',  'U',  'U',  'V',  'V',  'V',  'V',  'W',  'W',
- 'W',  'W',  'X',  'X',  'X',  'X',  'Y',  'Y',  'Y',  'Y',
- 'Z',  'Z',  'Z',  'Z',  'a',  'a',  'a',  'a',  'b',  'b',
- 'b',  'b',  'c',  'c',  'c',  'c',  'd',  'd',  'd',  'd',
- 'e',  'e',  'e',  'e',  'f',  'f',  'f',  'f',  'g',  'g',
- 'g',  'g',  'h',  'h',  'h',  'h',  'i',  'i',  'i',  'i',
- 'j',  'j',  'j',  'j',  'k',  'k',  'k',  'k',  'l',  'l',
- 'l',  'l',  'm',  'm',  'm',  'm',  'n',  'n',  'n',  'n',
- 'o',  'o',  'o',  'o',  'p',  'p',  'p',  'p',  'q',  'q',
- 'q',  'q',  'r',  'r',  'r',  'r',  's',  's',  's',  's',
- 't',  't',  't',  't',  'u',  'u',  'u',  'u',  'v',  'v',
- 'v',  'v',  'w',  'w',  'w',  'w',  'x',  'x',  'x',  'x',
- 'y',  'y',  'y',  'y',  'z',  'z',  'z',  'z',  '0',  '0',
- '0',  '0',  '1',  '1',  '1',  '1',  '2',  '2',  '2',  '2',
- '3',  '3',  '3',  '3',  '4',  '4',  '4',  '4',  '5',  '5',
- '5',  '5',  '6',  '6',  '6',  '6',  '7',  '7',  '7',  '7',
- '8',  '8',  '8',  '8',  '9',  '9',  '9',  '9',  '-',  '-',
- '-',  '-',  '_',  '_',  '_',  '_'
-};
-
-static const char e1[256] = {
- 'A',  'B',  'C',  'D',  'E',  'F',  'G',  'H',  'I',  'J',
- 'K',  'L',  'M',  'N',  'O',  'P',  'Q',  'R',  'S',  'T',
- 'U',  'V',  'W',  'X',  'Y',  'Z',  'a',  'b',  'c',  'd',
- 'e',  'f',  'g',  'h',  'i',  'j',  'k',  'l',  'm',  'n',
- 'o',  'p',  'q',  'r',  's',  't',  'u',  'v',  'w',  'x',
- 'y',  'z',  '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
- '8',  '9',  '-',  '_',  'A',  'B',  'C',  'D',  'E',  'F',
- 'G',  'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',  'P',
- 'Q',  'R',  'S',  'T',  'U',  'V',  'W',  'X',  'Y',  'Z',
- 'a',  'b',  'c',  'd',  'e',  'f',  'g',  'h',  'i',  'j',
- 'k',  'l',  'm',  'n',  'o',  'p',  'q',  'r',  's',  't',
- 'u',  'v',  'w',  'x',  'y',  'z',  '0',  '1',  '2',  '3',
- '4',  '5',  '6',  '7',  '8',  '9',  '-',  '_',  'A',  'B',
- 'C',  'D',  'E',  'F',  'G',  'H',  'I',  'J',  'K',  'L',
- 'M',  'N',  'O',  'P',  'Q',  'R',  'S',  'T',  'U',  'V',
- 'W',  'X',  'Y',  'Z',  'a',  'b',  'c',  'd',  'e',  'f',
- 'g',  'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',  'p',
- 'q',  'r',  's',  't',  'u',  'v',  'w',  'x',  'y',  'z',
- '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',  '8',  '9',
- '-',  '_',  'A',  'B',  'C',  'D',  'E',  'F',  'G',  'H',
- 'I',  'J',  'K',  'L',  'M',  'N',  'O',  'P',  'Q',  'R',
- 'S',  'T',  'U',  'V',  'W',  'X',  'Y',  'Z',  'a',  'b',
- 'c',  'd',  'e',  'f',  'g',  'h',  'i',  'j',  'k',  'l',
- 'm',  'n',  'o',  'p',  'q',  'r',  's',  't',  'u',  'v',
- 'w',  'x',  'y',  'z',  '0',  '1',  '2',  '3',  '4',  '5',
- '6',  '7',  '8',  '9',  '-',  '_'
-};
-
-static const char e2[256] = {
- 'A',  'B',  'C',  'D',  'E',  'F',  'G',  'H',  'I',  'J',
- 'K',  'L',  'M',  'N',  'O',  'P',  'Q',  'R',  'S',  'T',
- 'U',  'V',  'W',  'X',  'Y',  'Z',  'a',  'b',  'c',  'd',
- 'e',  'f',  'g',  'h',  'i',  'j',  'k',  'l',  'm',  'n',
- 'o',  'p',  'q',  'r',  's',  't',  'u',  'v',  'w',  'x',
- 'y',  'z',  '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
- '8',  '9',  '-',  '_',  'A',  'B',  'C',  'D',  'E',  'F',
- 'G',  'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',  'P',
- 'Q',  'R',  'S',  'T',  'U',  'V',  'W',  'X',  'Y',  'Z',
- 'a',  'b',  'c',  'd',  'e',  'f',  'g',  'h',  'i',  'j',
- 'k',  'l',  'm',  'n',  'o',  'p',  'q',  'r',  's',  't',
- 'u',  'v',  'w',  'x',  'y',  'z',  '0',  '1',  '2',  '3',
- '4',  '5',  '6',  '7',  '8',  '9',  '-',  '_',  'A',  'B',
- 'C',  'D',  'E',  'F',  'G',  'H',  'I',  'J',  'K',  'L',
- 'M',  'N',  'O',  'P',  'Q',  'R',  'S',  'T',  'U',  'V',
- 'W',  'X',  'Y',  'Z',  'a',  'b',  'c',  'd',  'e',  'f',
- 'g',  'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',  'p',
- 'q',  'r',  's',  't',  'u',  'v',  'w',  'x',  'y',  'z',
- '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',  '8',  '9',
- '-',  '_',  'A',  'B',  'C',  'D',  'E',  'F',  'G',  'H',
- 'I',  'J',  'K',  'L',  'M',  'N',  'O',  'P',  'Q',  'R',
- 'S',  'T',  'U',  'V',  'W',  'X',  'Y',  'Z',  'a',  'b',
- 'c',  'd',  'e',  'f',  'g',  'h',  'i',  'j',  'k',  'l',
- 'm',  'n',  'o',  'p',  'q',  'r',  's',  't',  'u',  'v',
- 'w',  'x',  'y',  'z',  '0',  '1',  '2',  '3',  '4',  '5',
- '6',  '7',  '8',  '9',  '-',  '_'
-};
-
-
-
-#ifdef WORDS_BIGENDIAN
-
-
-/* SPECIAL DECODE TABLES FOR BIG ENDIAN (IBM/MOTOROLA/SUN) CPUS */
-
-static const uint32_t d0[256] = {
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x00f80000, 0x01ffffff, 0x00f80000, 0x01ffffff, 0x00fc0000,
-0x00d00000, 0x00d40000, 0x00d80000, 0x00dc0000, 0x00e00000, 0x00e40000,
-0x00e80000, 0x00ec0000, 0x00f00000, 0x00f40000, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x00000000,
-0x00040000, 0x00080000, 0x000c0000, 0x00100000, 0x00140000, 0x00180000,
-0x001c0000, 0x00200000, 0x00240000, 0x00280000, 0x002c0000, 0x00300000,
-0x00340000, 0x00380000, 0x003c0000, 0x00400000, 0x00440000, 0x00480000,
-0x004c0000, 0x00500000, 0x00540000, 0x00580000, 0x005c0000, 0x00600000,
-0x00640000, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x00fc0000,
-0x01ffffff, 0x00680000, 0x006c0000, 0x00700000, 0x00740000, 0x00780000,
-0x007c0000, 0x00800000, 0x00840000, 0x00880000, 0x008c0000, 0x00900000,
-0x00940000, 0x00980000, 0x009c0000, 0x00a00000, 0x00a40000, 0x00a80000,
-0x00ac0000, 0x00b00000, 0x00b40000, 0x00b80000, 0x00bc0000, 0x00c00000,
-0x00c40000, 0x00c80000, 0x00cc0000, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff
-};
-
-
-static const uint32_t d1[256] = {
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x0003e000, 0x01ffffff, 0x0003e000, 0x01ffffff, 0x0003f000,
-0x00034000, 0x00035000, 0x00036000, 0x00037000, 0x00038000, 0x00039000,
-0x0003a000, 0x0003b000, 0x0003c000, 0x0003d000, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x00000000,
-0x00001000, 0x00002000, 0x00003000, 0x00004000, 0x00005000, 0x00006000,
-0x00007000, 0x00008000, 0x00009000, 0x0000a000, 0x0000b000, 0x0000c000,
-0x0000d000, 0x0000e000, 0x0000f000, 0x00010000, 0x00011000, 0x00012000,
-0x00013000, 0x00014000, 0x00015000, 0x00016000, 0x00017000, 0x00018000,
-0x00019000, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x0003f000,
-0x01ffffff, 0x0001a000, 0x0001b000, 0x0001c000, 0x0001d000, 0x0001e000,
-0x0001f000, 0x00020000, 0x00021000, 0x00022000, 0x00023000, 0x00024000,
-0x00025000, 0x00026000, 0x00027000, 0x00028000, 0x00029000, 0x0002a000,
-0x0002b000, 0x0002c000, 0x0002d000, 0x0002e000, 0x0002f000, 0x00030000,
-0x00031000, 0x00032000, 0x00033000, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff
-};
-
-
-static const uint32_t d2[256] = {
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x00000f80, 0x01ffffff, 0x00000f80, 0x01ffffff, 0x00000fc0,
-0x00000d00, 0x00000d40, 0x00000d80, 0x00000dc0, 0x00000e00, 0x00000e40,
-0x00000e80, 0x00000ec0, 0x00000f00, 0x00000f40, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x00000000,
-0x00000040, 0x00000080, 0x000000c0, 0x00000100, 0x00000140, 0x00000180,
-0x000001c0, 0x00000200, 0x00000240, 0x00000280, 0x000002c0, 0x00000300,
-0x00000340, 0x00000380, 0x000003c0, 0x00000400, 0x00000440, 0x00000480,
-0x000004c0, 0x00000500, 0x00000540, 0x00000580, 0x000005c0, 0x00000600,
-0x00000640, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x00000fc0,
-0x01ffffff, 0x00000680, 0x000006c0, 0x00000700, 0x00000740, 0x00000780,
-0x000007c0, 0x00000800, 0x00000840, 0x00000880, 0x000008c0, 0x00000900,
-0x00000940, 0x00000980, 0x000009c0, 0x00000a00, 0x00000a40, 0x00000a80,
-0x00000ac0, 0x00000b00, 0x00000b40, 0x00000b80, 0x00000bc0, 0x00000c00,
-0x00000c40, 0x00000c80, 0x00000cc0, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff
-};
-
-
-static const uint32_t d3[256] = {
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x0000003e, 0x01ffffff, 0x0000003e, 0x01ffffff, 0x0000003f,
-0x00000034, 0x00000035, 0x00000036, 0x00000037, 0x00000038, 0x00000039,
-0x0000003a, 0x0000003b, 0x0000003c, 0x0000003d, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x00000000,
-0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006,
-0x00000007, 0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
-0x0000000d, 0x0000000e, 0x0000000f, 0x00000010, 0x00000011, 0x00000012,
-0x00000013, 0x00000014, 0x00000015, 0x00000016, 0x00000017, 0x00000018,
-0x00000019, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x0000003f,
-0x01ffffff, 0x0000001a, 0x0000001b, 0x0000001c, 0x0000001d, 0x0000001e,
-0x0000001f, 0x00000020, 0x00000021, 0x00000022, 0x00000023, 0x00000024,
-0x00000025, 0x00000026, 0x00000027, 0x00000028, 0x00000029, 0x0000002a,
-0x0000002b, 0x0000002c, 0x0000002d, 0x0000002e, 0x0000002f, 0x00000030,
-0x00000031, 0x00000032, 0x00000033, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff
-};
-
-
-#else
-
-
-/* SPECIAL DECODE TABLES FOR LITTLE ENDIAN (INTEL) CPUS */
-
-static const uint32_t d0[256] = {
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x000000f8, 0x01ffffff, 0x000000f8, 0x01ffffff, 0x000000fc,
-0x000000d0, 0x000000d4, 0x000000d8, 0x000000dc, 0x000000e0, 0x000000e4,
-0x000000e8, 0x000000ec, 0x000000f0, 0x000000f4, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x00000000,
-0x00000004, 0x00000008, 0x0000000c, 0x00000010, 0x00000014, 0x00000018,
-0x0000001c, 0x00000020, 0x00000024, 0x00000028, 0x0000002c, 0x00000030,
-0x00000034, 0x00000038, 0x0000003c, 0x00000040, 0x00000044, 0x00000048,
-0x0000004c, 0x00000050, 0x00000054, 0x00000058, 0x0000005c, 0x00000060,
-0x00000064, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x000000fc,
-0x01ffffff, 0x00000068, 0x0000006c, 0x00000070, 0x00000074, 0x00000078,
-0x0000007c, 0x00000080, 0x00000084, 0x00000088, 0x0000008c, 0x00000090,
-0x00000094, 0x00000098, 0x0000009c, 0x000000a0, 0x000000a4, 0x000000a8,
-0x000000ac, 0x000000b0, 0x000000b4, 0x000000b8, 0x000000bc, 0x000000c0,
-0x000000c4, 0x000000c8, 0x000000cc, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff
-};
-
-
-static const uint32_t d1[256] = {
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x0000e003, 0x01ffffff, 0x0000e003, 0x01ffffff, 0x0000f003,
-0x00004003, 0x00005003, 0x00006003, 0x00007003, 0x00008003, 0x00009003,
-0x0000a003, 0x0000b003, 0x0000c003, 0x0000d003, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x00000000,
-0x00001000, 0x00002000, 0x00003000, 0x00004000, 0x00005000, 0x00006000,
-0x00007000, 0x00008000, 0x00009000, 0x0000a000, 0x0000b000, 0x0000c000,
-0x0000d000, 0x0000e000, 0x0000f000, 0x00000001, 0x00001001, 0x00002001,
-0x00003001, 0x00004001, 0x00005001, 0x00006001, 0x00007001, 0x00008001,
-0x00009001, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x0000f003,
-0x01ffffff, 0x0000a001, 0x0000b001, 0x0000c001, 0x0000d001, 0x0000e001,
-0x0000f001, 0x00000002, 0x00001002, 0x00002002, 0x00003002, 0x00004002,
-0x00005002, 0x00006002, 0x00007002, 0x00008002, 0x00009002, 0x0000a002,
-0x0000b002, 0x0000c002, 0x0000d002, 0x0000e002, 0x0000f002, 0x00000003,
-0x00001003, 0x00002003, 0x00003003, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff
-};
-
-
-static const uint32_t d2[256] = {
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x00800f00, 0x01ffffff, 0x00800f00, 0x01ffffff, 0x00c00f00,
-0x00000d00, 0x00400d00, 0x00800d00, 0x00c00d00, 0x00000e00, 0x00400e00,
-0x00800e00, 0x00c00e00, 0x00000f00, 0x00400f00, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x00000000,
-0x00400000, 0x00800000, 0x00c00000, 0x00000100, 0x00400100, 0x00800100,
-0x00c00100, 0x00000200, 0x00400200, 0x00800200, 0x00c00200, 0x00000300,
-0x00400300, 0x00800300, 0x00c00300, 0x00000400, 0x00400400, 0x00800400,
-0x00c00400, 0x00000500, 0x00400500, 0x00800500, 0x00c00500, 0x00000600,
-0x00400600, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x00c00f00,
-0x01ffffff, 0x00800600, 0x00c00600, 0x00000700, 0x00400700, 0x00800700,
-0x00c00700, 0x00000800, 0x00400800, 0x00800800, 0x00c00800, 0x00000900,
-0x00400900, 0x00800900, 0x00c00900, 0x00000a00, 0x00400a00, 0x00800a00,
-0x00c00a00, 0x00000b00, 0x00400b00, 0x00800b00, 0x00c00b00, 0x00000c00,
-0x00400c00, 0x00800c00, 0x00c00c00, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff
-};
-
-
-static const uint32_t d3[256] = {
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x003e0000, 0x01ffffff, 0x003e0000, 0x01ffffff, 0x003f0000,
-0x00340000, 0x00350000, 0x00360000, 0x00370000, 0x00380000, 0x00390000,
-0x003a0000, 0x003b0000, 0x003c0000, 0x003d0000, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x00000000,
-0x00010000, 0x00020000, 0x00030000, 0x00040000, 0x00050000, 0x00060000,
-0x00070000, 0x00080000, 0x00090000, 0x000a0000, 0x000b0000, 0x000c0000,
-0x000d0000, 0x000e0000, 0x000f0000, 0x00100000, 0x00110000, 0x00120000,
-0x00130000, 0x00140000, 0x00150000, 0x00160000, 0x00170000, 0x00180000,
-0x00190000, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x003f0000,
-0x01ffffff, 0x001a0000, 0x001b0000, 0x001c0000, 0x001d0000, 0x001e0000,
-0x001f0000, 0x00200000, 0x00210000, 0x00220000, 0x00230000, 0x00240000,
-0x00250000, 0x00260000, 0x00270000, 0x00280000, 0x00290000, 0x002a0000,
-0x002b0000, 0x002c0000, 0x002d0000, 0x002e0000, 0x002f0000, 0x00300000,
-0x00310000, 0x00320000, 0x00330000, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff,
-0x01ffffff, 0x01ffffff, 0x01ffffff, 0x01ffffff
-};
-
-
-#endif
diff --git a/web/cloud_dashboard/.clang-format b/web/cloud_dashboard/.clang-format
deleted file mode 100644
index fbcf2d7..0000000
--- a/web/cloud_dashboard/.clang-format
+++ /dev/null
@@ -1,4 +0,0 @@
-Language:        JavaScript
-BasedOnStyle:    Google
-ColumnLimit:     80
-ReflowComments:  false
diff --git a/web/cloud_dashboard/.firebaserc b/web/cloud_dashboard/.firebaserc
deleted file mode 100644
index 9f910ec..0000000
--- a/web/cloud_dashboard/.firebaserc
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "projects": {
-    "default": "fuchsia-ledger"
-  }
-}
diff --git a/web/cloud_dashboard/.gitignore b/web/cloud_dashboard/.gitignore
deleted file mode 100644
index 4b2c73e..0000000
--- a/web/cloud_dashboard/.gitignore
+++ /dev/null
@@ -1,18 +0,0 @@
-# See http://help.github.com/ignore-files/ for more about ignoring files.
-
-# compiled output
-/dist
-/tmp
-/out-tsc
-
-# dependencies
-/node_modules
-
-# misc
-/.sass-cache
-/connect.lock
-/coverage
-/libpeerconnection.log
-npm-debug.log
-testem.log
-/typings
diff --git a/web/cloud_dashboard/README.md b/web/cloud_dashboard/README.md
deleted file mode 100644
index d4580b7..0000000
--- a/web/cloud_dashboard/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Cloud dashboard
-
-Web dashboard allowing a signed-in user to inspect their Ledger state and
-trigger cloud erase if needed.
-
-This project is built using Angular and was scaffolded using
-[Angular CLI] version 6.0.8.
-
-## Prerequisites
-
- - make sure you have [nodejs] installed
- - install [Angular CLI]: `npm install -g @angular/cli`
- - install [Firebase CLI]: `npm install -g firebase-tools`
- - run `npm install` in the `cloud_dashboard` directory
-
-## Development workflow
-
- - run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The
-   app will automatically reload if you change any of the source files
- - run `ng test` to execute the unit tests via [Karma]
-
-To get more help on the Angular CLI use `ng help` or go check out the [Angular
-CLI README]
-
-## Deployment
-
-Run `firebase login` at least once. Then:
-
- - run `ng build --prod` to build the project. The build artifacts will be stored
-   in the `dist/` directory
- - run `firebase deploy`
-
-[Angular CLI]: https://github.com/angular/angular-cli
-[nodejs]: https://nodejs.org
-[Karma]: https://karma-runner.github.io
-[Angular CLI README]: https://github.com/angular/angular-cli/blob/master/README.md
-[Firebase CLI]: https://firebase.google.com/docs/cli/
diff --git a/web/cloud_dashboard/angular.json b/web/cloud_dashboard/angular.json
deleted file mode 100644
index b655ad1..0000000
--- a/web/cloud_dashboard/angular.json
+++ /dev/null
@@ -1,127 +0,0 @@
-{
-  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
-  "version": 1,
-  "newProjectRoot": "projects",
-  "projects": {
-    "cloud_dashboard": {
-      "root": "",
-      "sourceRoot": "src",
-      "projectType": "application",
-      "prefix": "app",
-      "schematics": {},
-      "architect": {
-        "build": {
-          "builder": "@angular-devkit/build-angular:browser",
-          "options": {
-            "outputPath": "dist/cloud_dashboard",
-            "index": "src/index.html",
-            "main": "src/main.ts",
-            "polyfills": "src/polyfills.ts",
-            "tsConfig": "src/tsconfig.app.json",
-            "assets": [
-              "src/favicon.ico",
-              "src/assets"
-            ],
-            "styles": [
-              "src/styles.css"
-            ],
-            "scripts": []
-          },
-          "configurations": {
-            "production": {
-              "fileReplacements": [
-                {
-                  "replace": "src/environments/environment.ts",
-                  "with": "src/environments/environment.prod.ts"
-                }
-              ],
-              "optimization": true,
-              "outputHashing": "all",
-              "sourceMap": false,
-              "extractCss": true,
-              "namedChunks": false,
-              "aot": true,
-              "extractLicenses": true,
-              "vendorChunk": false,
-              "buildOptimizer": true
-            }
-          }
-        },
-        "serve": {
-          "builder": "@angular-devkit/build-angular:dev-server",
-          "options": {
-            "browserTarget": "cloud_dashboard:build"
-          },
-          "configurations": {
-            "production": {
-              "browserTarget": "cloud_dashboard:build:production"
-            }
-          }
-        },
-        "extract-i18n": {
-          "builder": "@angular-devkit/build-angular:extract-i18n",
-          "options": {
-            "browserTarget": "cloud_dashboard:build"
-          }
-        },
-        "test": {
-          "builder": "@angular-devkit/build-angular:karma",
-          "options": {
-            "main": "src/test.ts",
-            "polyfills": "src/polyfills.ts",
-            "tsConfig": "src/tsconfig.spec.json",
-            "karmaConfig": "src/karma.conf.js",
-            "styles": [
-              "src/styles.css"
-            ],
-            "scripts": [],
-            "assets": [
-              "src/favicon.ico",
-              "src/assets"
-            ]
-          }
-        },
-        "lint": {
-          "builder": "@angular-devkit/build-angular:tslint",
-          "options": {
-            "tsConfig": [
-              "src/tsconfig.app.json",
-              "src/tsconfig.spec.json"
-            ],
-            "exclude": [
-              "**/node_modules/**"
-            ]
-          }
-        }
-      }
-    },
-    "cloud_dashboard-e2e": {
-      "root": "e2e/",
-      "projectType": "application",
-      "architect": {
-        "e2e": {
-          "builder": "@angular-devkit/build-angular:protractor",
-          "options": {
-            "protractorConfig": "e2e/protractor.conf.js",
-            "devServerTarget": "cloud_dashboard:serve"
-          },
-          "configurations": {
-            "production": {
-              "devServerTarget": "cloud_dashboard:serve:production"
-            }
-          }
-        },
-        "lint": {
-          "builder": "@angular-devkit/build-angular:tslint",
-          "options": {
-            "tsConfig": "e2e/tsconfig.e2e.json",
-            "exclude": [
-              "**/node_modules/**"
-            ]
-          }
-        }
-      }
-    }
-  },
-  "defaultProject": "cloud_dashboard"
-}
\ No newline at end of file
diff --git a/web/cloud_dashboard/firebase.json b/web/cloud_dashboard/firebase.json
deleted file mode 100644
index c26470b..0000000
--- a/web/cloud_dashboard/firebase.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "hosting": {
-    "public": "dist/cloud_dashboard",
-    "rewrites": [ {
-        "source": "**",
-        "destination": "/index.html"
-    } ]
-  }
-}
diff --git a/web/cloud_dashboard/package-lock.json b/web/cloud_dashboard/package-lock.json
deleted file mode 100644
index 2e5e9c0..0000000
--- a/web/cloud_dashboard/package-lock.json
+++ /dev/null
@@ -1,11304 +0,0 @@
-{
-  "name": "cloud_dashboard",
-  "version": "0.0.0",
-  "lockfileVersion": 1,
-  "requires": true,
-  "dependencies": {
-    "@angular-devkit/architect": {
-      "version": "0.6.8",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.6.8.tgz",
-      "integrity": "sha512-ZKTm/zC61iY9IBHOEAKoMSzZpvhkmv+1O/HHzpHEuR551jCzu6vSyCmMY9Z7GBcccscCV+hjeSMwgFrFRcqlkw==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/core": "0.6.8",
-        "rxjs": "^6.0.0"
-      }
-    },
-    "@angular-devkit/build-angular": {
-      "version": "0.6.8",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.6.8.tgz",
-      "integrity": "sha512-VGqYAk8jpISraz2UHfsDre270NOUmV0CTSZw2p9sm5g/XIr5m+IHetFZz3gpoAr9+If2aFTs8Rt3sGdCRzwBqA==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/architect": "0.6.8",
-        "@angular-devkit/build-optimizer": "0.6.8",
-        "@angular-devkit/core": "0.6.8",
-        "@ngtools/webpack": "6.0.8",
-        "ajv": "~6.4.0",
-        "autoprefixer": "^8.4.1",
-        "cache-loader": "^1.2.2",
-        "chalk": "~2.2.2",
-        "circular-dependency-plugin": "^5.0.2",
-        "clean-css": "^4.1.11",
-        "copy-webpack-plugin": "^4.5.1",
-        "file-loader": "^1.1.11",
-        "glob": "^7.0.3",
-        "html-webpack-plugin": "^3.0.6",
-        "istanbul": "^0.4.5",
-        "istanbul-instrumenter-loader": "^3.0.1",
-        "karma-source-map-support": "^1.2.0",
-        "less": "^3.0.4",
-        "less-loader": "^4.1.0",
-        "license-webpack-plugin": "^1.3.1",
-        "lodash": "^4.17.4",
-        "memory-fs": "^0.4.1",
-        "mini-css-extract-plugin": "~0.4.0",
-        "minimatch": "^3.0.4",
-        "node-sass": "^4.9.0",
-        "opn": "^5.1.0",
-        "parse5": "^4.0.0",
-        "portfinder": "^1.0.13",
-        "postcss": "^6.0.22",
-        "postcss-import": "^11.1.0",
-        "postcss-loader": "^2.1.5",
-        "postcss-url": "^7.3.2",
-        "raw-loader": "^0.5.1",
-        "resolve": "^1.5.0",
-        "rxjs": "^6.0.0",
-        "sass-loader": "^7.0.1",
-        "silent-error": "^1.1.0",
-        "source-map-support": "^0.5.0",
-        "stats-webpack-plugin": "^0.6.2",
-        "style-loader": "^0.21.0",
-        "stylus": "^0.54.5",
-        "stylus-loader": "^3.0.2",
-        "tree-kill": "^1.2.0",
-        "uglifyjs-webpack-plugin": "^1.2.5",
-        "url-loader": "^1.0.1",
-        "webpack": "~4.8.1",
-        "webpack-dev-middleware": "^3.1.3",
-        "webpack-dev-server": "^3.1.4",
-        "webpack-merge": "^4.1.2",
-        "webpack-sources": "^1.1.0",
-        "webpack-subresource-integrity": "^1.1.0-rc.4"
-      }
-    },
-    "@angular-devkit/build-optimizer": {
-      "version": "0.6.8",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.6.8.tgz",
-      "integrity": "sha512-of5syQbv3uNPp4AQkfRecfnp8AE8kvffbfYi+FFPZ6OGr7e59T1fGwk6+Zgb2qQFQg8HO2tzWI/uygtLIqmbmw==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "^1.1.0",
-        "source-map": "^0.5.6",
-        "typescript": "~2.9.1",
-        "webpack-sources": "^1.1.0"
-      },
-      "dependencies": {
-        "typescript": {
-          "version": "2.9.2",
-          "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
-          "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
-          "dev": true
-        }
-      }
-    },
-    "@angular-devkit/core": {
-      "version": "0.6.8",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.6.8.tgz",
-      "integrity": "sha512-rkIa1OSVWTt4g9leLSK/PsqOj3HZbDKHbZjqlslyfVa3AyCeiumFoOgViOVXlYgPX3HHDbE5uH24nyUWSD8uww==",
-      "dev": true,
-      "requires": {
-        "ajv": "~6.4.0",
-        "chokidar": "^2.0.3",
-        "rxjs": "^6.0.0",
-        "source-map": "^0.5.6"
-      }
-    },
-    "@angular-devkit/schematics": {
-      "version": "0.6.8",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.6.8.tgz",
-      "integrity": "sha512-R4YqAUdo62wtrhX/5HSRGSKXNTWqfQb66ZE6m8jj6GEJNFKdNXMdxOchxr07LCiKTxfh1w6G3nGzxIsu/+D4KA==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/core": "0.6.8",
-        "rxjs": "^6.0.0"
-      }
-    },
-    "@angular/animations": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-6.0.7.tgz",
-      "integrity": "sha512-yOig45sxzpEmlXy+eFgh2v2yxoE/Hh9rn7BX82uj71yobSpCYoe58AEOay1cu0FCcLi/P5qltHepDrRRxNxPMw==",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "@angular/cdk": {
-      "version": "6.3.2",
-      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-6.3.2.tgz",
-      "integrity": "sha512-iicOzxDRxRbsmu7QG6bQZOG3jWiZp6wwxGVmWWdodOPoPWLaWrx3EAKmbNvAZDT7DdwafOHu8m4qWPSVfsVb5A==",
-      "requires": {
-        "tslib": "^1.7.1"
-      }
-    },
-    "@angular/cli": {
-      "version": "6.0.8",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-6.0.8.tgz",
-      "integrity": "sha512-DhH1Zq5Yonthw6zh6W07fhf+9XrAZbD1fcQ0MrmbxlieCfLlTAdBqyK2LavFCKwSZkUMLF6UHM3+jiNRVZSSIg==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/architect": "0.6.8",
-        "@angular-devkit/core": "0.6.8",
-        "@angular-devkit/schematics": "0.6.8",
-        "@schematics/angular": "0.6.8",
-        "@schematics/update": "0.6.8",
-        "opn": "~5.3.0",
-        "resolve": "^1.1.7",
-        "rxjs": "^6.0.0",
-        "semver": "^5.1.0",
-        "silent-error": "^1.0.0",
-        "symbol-observable": "^1.2.0",
-        "yargs-parser": "^10.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
-          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
-          "dev": true
-        },
-        "yargs-parser": {
-          "version": "10.1.0",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
-          "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
-          "dev": true,
-          "requires": {
-            "camelcase": "^4.1.0"
-          }
-        }
-      }
-    },
-    "@angular/common": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-6.0.7.tgz",
-      "integrity": "sha512-MUCCs3FLwqyp5wuvkUTHVGMTd3bNGDxD5IJNvaLgVliGe4r0IlETRXYqyRPs7gdVFPbiJ97P1DUONArj9xL9XA==",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "@angular/compiler": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-6.0.7.tgz",
-      "integrity": "sha512-J9I2U4NiWIBXl0ZOJkBW5G7xXhphggSirTwFLD4yKCTeJXgyldZytJZRkDUx1uouZtI2/PycvaOZoRr85N67AA==",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "@angular/compiler-cli": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-6.0.7.tgz",
-      "integrity": "sha512-nDIo4TtE3oXgZiQ5vJEcr5fi3FuXRDJQSOeOQinpCrtEt3s4pU5WAX5DLFGPSD2C/EXRDvHZgF9OTJeu5U4ErQ==",
-      "dev": true,
-      "requires": {
-        "chokidar": "^1.4.2",
-        "minimist": "^1.2.0",
-        "reflect-metadata": "^0.1.2",
-        "tsickle": "^0.29.0"
-      },
-      "dependencies": {
-        "anymatch": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
-          "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
-          "dev": true,
-          "requires": {
-            "micromatch": "^2.1.5",
-            "normalize-path": "^2.0.0"
-          }
-        },
-        "arr-diff": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
-          "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.0.1"
-          }
-        },
-        "array-unique": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
-          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
-          "dev": true
-        },
-        "braces": {
-          "version": "1.8.5",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
-          "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
-          "dev": true,
-          "requires": {
-            "expand-range": "^1.8.1",
-            "preserve": "^0.2.0",
-            "repeat-element": "^1.1.2"
-          }
-        },
-        "chokidar": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
-          "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
-          "dev": true,
-          "requires": {
-            "anymatch": "^1.3.0",
-            "async-each": "^1.0.0",
-            "fsevents": "^1.0.0",
-            "glob-parent": "^2.0.0",
-            "inherits": "^2.0.1",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^2.0.0",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.0.0"
-          }
-        },
-        "expand-brackets": {
-          "version": "0.1.5",
-          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
-          "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
-          "dev": true,
-          "requires": {
-            "is-posix-bracket": "^0.1.0"
-          }
-        },
-        "extglob": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
-          "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        },
-        "glob-parent": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
-          "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
-          "dev": true,
-          "requires": {
-            "is-glob": "^2.0.0"
-          }
-        },
-        "is-extglob": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        },
-        "micromatch": {
-          "version": "2.3.11",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
-          "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^2.0.0",
-            "array-unique": "^0.2.1",
-            "braces": "^1.8.2",
-            "expand-brackets": "^0.1.4",
-            "extglob": "^0.3.1",
-            "filename-regex": "^2.0.0",
-            "is-extglob": "^1.0.0",
-            "is-glob": "^2.0.1",
-            "kind-of": "^3.0.2",
-            "normalize-path": "^2.0.1",
-            "object.omit": "^2.0.0",
-            "parse-glob": "^3.0.4",
-            "regex-cache": "^0.4.2"
-          }
-        },
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        }
-      }
-    },
-    "@angular/core": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-6.0.7.tgz",
-      "integrity": "sha512-aZ0NvbYsMGqg0zUu7+9vuDxnGzwe++RsBBhlwHZHz1ZZwJmU6VJhUhaI+MuKC7rHyFFr9vUxvJ7ilhGaK2+J7A==",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "@angular/forms": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-6.0.7.tgz",
-      "integrity": "sha512-bFRdWxLmTiG7z0yZaq22oBHTgVSpJwUJEbZ5ieu21JqTgIDYne+YR/xCJrPj+P2S5NDlEK84g/4y4GoNt/thhQ==",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "@angular/http": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/http/-/http-6.0.7.tgz",
-      "integrity": "sha512-zk/kjsfEXjEQIRpmsjuJO5wgFNxj7JGY6Bq0nianZuyCuj/mlm0zflww2NLX4O22IMnvVSun2Kx+kDY44n4hfw==",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "@angular/language-service": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-6.0.7.tgz",
-      "integrity": "sha512-R96kTy9Hpy5QPHirJz+5JjnzjJZdwbGwZ6rpq79Fe15RYaYfMjFTAAhmmOgWrnTFBug0QWBWyKV7950JcJIr3Q==",
-      "dev": true
-    },
-    "@angular/material": {
-      "version": "6.3.2",
-      "resolved": "https://registry.npmjs.org/@angular/material/-/material-6.3.2.tgz",
-      "integrity": "sha512-v5k6wyIDrEePU6NNtO/024LInIoZKvDJiO4nIfrXjOHjeHh6eHEtDRmaJUA/CruxX2ICdYkof7NfXvkrFn3wZA==",
-      "requires": {
-        "parse5": "^5.0.0",
-        "tslib": "^1.7.1"
-      },
-      "dependencies": {
-        "parse5": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.0.0.tgz",
-          "integrity": "sha512-0ywuiUOnpWWeil5grH2rxjyTJoeQVwyBuO2si6QIU9dWtj2npjuyK1HaY1RbLnVfDhEbhyAPNUBKRK0Xj2xE0w==",
-          "optional": true
-        }
-      }
-    },
-    "@angular/platform-browser": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-6.0.7.tgz",
-      "integrity": "sha512-CASH1CDr2DD+aBrWN9qpDDFTI3H6p/oqH23h28bEV+LZl7F57r4sj8KXKgaE+mcrOFRQqXTAlPoq3hRCLmhtVA==",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "@angular/platform-browser-dynamic": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.0.7.tgz",
-      "integrity": "sha512-8G45A9w8UJvX3vPEHqeJHt/sd0zu6w1M+rsnOCo78r35SjsLbrmDNhc4VkLZFJ+iNjgPWtNtdpeXQqtTHE46yw==",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "@angular/router": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/@angular/router/-/router-6.0.7.tgz",
-      "integrity": "sha512-KuQBeIgfiwV3bLafepMhYVJQIAF8cTckCudFh5Z0OqckJgGsWSgtvEdtBctPi+lzt7OQBi7Ym2rOv3X0dOvu0Q==",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "@firebase/app": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.3.3.tgz",
-      "integrity": "sha512-V5fMC2Ysx1TlHD6x7vj7EOtoyJSU/ts+fp9qxt0E3TA+DbWgKFrkcL+o2jZhi30h0sXKV7oW0vh67YZdZylqOg==",
-      "requires": {
-        "@firebase/app-types": "0.3.2",
-        "@firebase/util": "0.2.1",
-        "dom-storage": "2.1.0",
-        "tslib": "1.9.0",
-        "xmlhttprequest": "1.8.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.9.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
-          "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
-        }
-      }
-    },
-    "@firebase/app-types": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.3.2.tgz",
-      "integrity": "sha512-ZD8lTgW07NGgo75bTyBJA8Lt9+NweNzot7lrsBtIvfciwUzaFJLsv2EShqjBeuhF7RpG6YFucJ6m67w5buCtzw=="
-    },
-    "@firebase/auth": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.7.0.tgz",
-      "integrity": "sha512-OUjjtq91VFALUjVYp9meHMNtG40mibzkPKIWKAVkc3zucXORShxsDBGRlXjrVSENrQDr7FLrOF2kWCZXwvjiFQ==",
-      "requires": {
-        "@firebase/auth-types": "0.3.4"
-      }
-    },
-    "@firebase/auth-types": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.3.4.tgz",
-      "integrity": "sha512-0r3gSQk9jw5orFHCTUIgao0zan6dHt2J0BO3t/uEzbod+uwqvUn/gh+yg+kK6HX92Fg8E7y030KX4Bw/aXt0Ew=="
-    },
-    "@firebase/database": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.3.4.tgz",
-      "integrity": "sha512-xsQPk4MJq8KuuEq0QXYVWsQc+ksMeoYpmiYWM9UWIoT20PqmZ2WHmxLkVW7xFnM55wsawJ2FtW/Nan9uMhS1nw==",
-      "requires": {
-        "@firebase/database-types": "0.3.2",
-        "@firebase/logger": "0.1.1",
-        "@firebase/util": "0.2.1",
-        "faye-websocket": "0.11.1",
-        "tslib": "1.9.0"
-      },
-      "dependencies": {
-        "faye-websocket": {
-          "version": "0.11.1",
-          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
-          "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
-          "requires": {
-            "websocket-driver": ">=0.5.1"
-          }
-        },
-        "tslib": {
-          "version": "1.9.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
-          "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
-        }
-      }
-    },
-    "@firebase/database-types": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.3.2.tgz",
-      "integrity": "sha512-9ZYdvYQ6r3aaHJarhUM5Hf6lQWu3ZJme+RR0o8qfBb9L04TL3uNjt+AJFku1ysVPntTn+9GqJjiIB2/OC3JtwA=="
-    },
-    "@firebase/firestore": {
-      "version": "0.5.6",
-      "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-0.5.6.tgz",
-      "integrity": "sha512-0D8HRi3S9sF+dDN2O7JwYe/tXSoQRwgO/q4DhbgS+Btd0KPgz+I/+TP6kEqA4g74PgpX06ND6LWvfE5eIUXcyA==",
-      "requires": {
-        "@firebase/firestore-types": "0.4.3",
-        "@firebase/logger": "0.1.1",
-        "@firebase/webchannel-wrapper": "0.2.8",
-        "grpc": "1.11.3",
-        "tslib": "1.9.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.9.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
-          "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
-        }
-      }
-    },
-    "@firebase/firestore-types": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-0.4.3.tgz",
-      "integrity": "sha512-QdFBhH0Bcw7TRodN6nJ1pQq0AGAgMfpIUQguKcogTE/2L/lAECxbUfTWtBcGenKcSKpae5xJuuhGZxaPGkQv7A=="
-    },
-    "@firebase/functions": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.3.0.tgz",
-      "integrity": "sha512-bCJmcniVbCdPcydI+CdeEkDidlBnJRsc667ETvljwfnp+df4Em2ZSqcEG8DApzuyd+uI+rYFCvwX5FS4pkFkcA==",
-      "requires": {
-        "@firebase/functions-types": "0.2.0",
-        "@firebase/messaging-types": "0.2.3",
-        "isomorphic-fetch": "2.2.1",
-        "tslib": "1.9.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.9.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
-          "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
-        }
-      }
-    },
-    "@firebase/functions-types": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.2.0.tgz",
-      "integrity": "sha512-q1FB3YKEAnWd+FpIL5Xn0B1BXO2IowrAdrSViXkFxNZVpp9iCzQ8Ytcbr3V1xUr3dnmoW/V7zkZJZGuwBgiVhw=="
-    },
-    "@firebase/logger": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.1.tgz",
-      "integrity": "sha512-5jn3HHbEfdOwychyIEIkP1cik+MW/vvoOavTOzwDkH+fv6Bx+HBUOzh09M7sCYzXFtKzjbUax9+g39mJNBLklQ=="
-    },
-    "@firebase/messaging": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.3.5.tgz",
-      "integrity": "sha512-+FkrW+li/QOqSXUGipOEvqPUSy1/ZH7zibB63UtRHy3LSwxn5PZ6lKgaeCVkWZBwCHm92riHrjR0cpRhE4+4SQ==",
-      "requires": {
-        "@firebase/messaging-types": "0.2.3",
-        "@firebase/util": "0.2.1",
-        "tslib": "1.9.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.9.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
-          "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
-        }
-      }
-    },
-    "@firebase/messaging-types": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.2.3.tgz",
-      "integrity": "sha512-avwCgZzcx2uxIW/wT3p3G/EyHftIrvMyiTS7AA7dxDlzfx+8dpAeTsb1+jsHJT4F6foSh5HG17Nw8sDzYuxH1Q=="
-    },
-    "@firebase/polyfill": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.3.tgz",
-      "integrity": "sha512-xs8IZf1WEbufYXyfV8YjmiFZOaujRRq0T03NteihYfuGVTTym7z5SmvLvEHLEUjf2fgeobPEzZ2JgrCQHS+QHw==",
-      "requires": {
-        "core-js": "2.5.5",
-        "promise-polyfill": "7.1.2",
-        "whatwg-fetch": "2.0.4"
-      },
-      "dependencies": {
-        "core-js": {
-          "version": "2.5.5",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
-          "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs="
-        }
-      }
-    },
-    "@firebase/storage": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.2.3.tgz",
-      "integrity": "sha512-2sq5jckWszW53gfQMkPNc7EumJ92oErRhzGJANbVzBumwR8qwKZU8/I+/uV9SPK1tVmSUc3S21jdoW5oOJVEuA==",
-      "requires": {
-        "@firebase/storage-types": "0.2.3",
-        "tslib": "1.9.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.9.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
-          "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
-        }
-      }
-    },
-    "@firebase/storage-types": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.2.3.tgz",
-      "integrity": "sha512-RaZeam2LgsB7xwAtOQr4G0Geoyf7D5TnLF3a12By6Rh0Z9PqBSlWn0SVYGW3SkmxIdqvWZMZvCyamUlqQvQzWw=="
-    },
-    "@firebase/util": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.1.tgz",
-      "integrity": "sha512-KPNcIK5+bUUBMII87NqGu+tRUnMcY95xujS2z0QyAfoQCKe11DMHICv3M6uweiLSXqdQwrMTyFtiql1q+0UOYQ==",
-      "requires": {
-        "tslib": "1.9.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.9.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
-          "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
-        }
-      }
-    },
-    "@firebase/webchannel-wrapper": {
-      "version": "0.2.8",
-      "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.8.tgz",
-      "integrity": "sha512-ToJbeJnxDc3O325FvcKVb3yHO1hvgHjCFvhKol6Z17GiB7vL104POjFQT4RnlLiAGSRCBAMxinDec9y9vQYdyg=="
-    },
-    "@ngtools/webpack": {
-      "version": "6.0.8",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-6.0.8.tgz",
-      "integrity": "sha512-jorGpTd82ILbyUwg4JQekovHFaYwSMlZan4f7x+sd3+2WgyL3Z1+ZbVSGKvXZWKS/mAVx7eLkRikzJkuC4FgHw==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/core": "0.6.8",
-        "tree-kill": "^1.0.0",
-        "webpack-sources": "^1.1.0"
-      }
-    },
-    "@schematics/angular": {
-      "version": "0.6.8",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.6.8.tgz",
-      "integrity": "sha512-9kRphqTYG5Df/I8fvnT1zMsw0YNDPO9tl18tQZXj4am4raT7l9UCr+WkwJdlBoA5pwG6baWE9sL0iGWV/bzF/g==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/core": "0.6.8",
-        "@angular-devkit/schematics": "0.6.8",
-        "typescript": ">=2.6.2 <2.8"
-      }
-    },
-    "@schematics/update": {
-      "version": "0.6.8",
-      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.6.8.tgz",
-      "integrity": "sha512-1Uq7LYnwL2wBwGVCgNz76QAR13ghAk+2vDDHOi+VX5+usHManxydrpoMGeX66OBPd+y5D3D2MFb+8mYHE7mygg==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/core": "0.6.8",
-        "@angular-devkit/schematics": "0.6.8",
-        "npm-registry-client": "^8.5.1",
-        "rxjs": "^6.0.0",
-        "semver": "^5.3.0",
-        "semver-intersect": "^1.1.2"
-      }
-    },
-    "@types/jasmine": {
-      "version": "2.8.8",
-      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.8.tgz",
-      "integrity": "sha512-OJSUxLaxXsjjhob2DBzqzgrkLmukM3+JMpRp0r0E4HTdT1nwDCWhaswjYxazPij6uOdzHCJfNbDjmQ1/rnNbCg==",
-      "dev": true
-    },
-    "@types/jasminewd2": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz",
-      "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==",
-      "dev": true,
-      "requires": {
-        "@types/jasmine": "*"
-      }
-    },
-    "@types/node": {
-      "version": "8.9.5",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz",
-      "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==",
-      "dev": true
-    },
-    "@types/q": {
-      "version": "0.0.32",
-      "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz",
-      "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=",
-      "dev": true
-    },
-    "@types/selenium-webdriver": {
-      "version": "2.53.43",
-      "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz",
-      "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==",
-      "dev": true
-    },
-    "@webassemblyjs/ast": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.4.3.tgz",
-      "integrity": "sha512-S6npYhPcTHDYe9nlsKa9CyWByFi8Vj8HovcAgtmMAQZUOczOZbQ8CnwMYKYC5HEZzxEE+oY0jfQk4cVlI3J59Q==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/helper-wasm-bytecode": "1.4.3",
-        "@webassemblyjs/wast-parser": "1.4.3",
-        "debug": "^3.1.0",
-        "webassemblyjs": "1.4.3"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.4.3.tgz",
-      "integrity": "sha512-3zTkSFswwZOPNHnzkP9ONq4bjJSeKVMcuahGXubrlLmZP8fmTIJ58dW7h/zOVWiFSuG2em3/HH3BlCN7wyu9Rw==",
-      "dev": true
-    },
-    "@webassemblyjs/helper-buffer": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.4.3.tgz",
-      "integrity": "sha512-e8+KZHh+RV8MUvoSRtuT1sFXskFnWG9vbDy47Oa166xX+l0dD5sERJ21g5/tcH8Yo95e9IN3u7Jc3NbhnUcSkw==",
-      "dev": true,
-      "requires": {
-        "debug": "^3.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "@webassemblyjs/helper-code-frame": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.4.3.tgz",
-      "integrity": "sha512-9FgHEtNsZQYaKrGCtsjswBil48Qp1agrzRcPzCbQloCoaTbOXLJ9IRmqT+uEZbenpULLRNFugz3I4uw18hJM8w==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/wast-printer": "1.4.3"
-      }
-    },
-    "@webassemblyjs/helper-fsm": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.4.3.tgz",
-      "integrity": "sha512-JINY76U+702IRf7ePukOt037RwmtH59JHvcdWbTTyHi18ixmQ+uOuNhcdCcQHTquDAH35/QgFlp3Y9KqtyJsCQ==",
-      "dev": true
-    },
-    "@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.4.3.tgz",
-      "integrity": "sha512-I7bS+HaO0K07Io89qhJv+z1QipTpuramGwUSDkwEaficbSvCcL92CUZEtgykfNtk5wb0CoLQwWlmXTwGbNZUeQ==",
-      "dev": true
-    },
-    "@webassemblyjs/helper-wasm-section": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.4.3.tgz",
-      "integrity": "sha512-p0yeeO/h2r30PyjnJX9xXSR6EDcvJd/jC6xa/Pxg4lpfcNi7JUswOpqDToZQ55HMMVhXDih/yqkaywHWGLxqyQ==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.4.3",
-        "@webassemblyjs/helper-buffer": "1.4.3",
-        "@webassemblyjs/helper-wasm-bytecode": "1.4.3",
-        "@webassemblyjs/wasm-gen": "1.4.3",
-        "debug": "^3.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "@webassemblyjs/leb128": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.4.3.tgz",
-      "integrity": "sha512-4u0LJLSPzuRDWHwdqsrThYn+WqMFVqbI2ltNrHvZZkzFPO8XOZ0HFQ5eVc4jY/TNHgXcnwrHjONhPGYuuf//KQ==",
-      "dev": true,
-      "requires": {
-        "leb": "^0.3.0"
-      }
-    },
-    "@webassemblyjs/validation": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/validation/-/validation-1.4.3.tgz",
-      "integrity": "sha512-R+rRMKfhd9mq0rj2mhU9A9NKI2l/Rw65vIYzz4lui7eTKPcCu1l7iZNi4b9Gen8D42Sqh/KGiaQNk/x5Tn/iBQ==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.4.3"
-      }
-    },
-    "@webassemblyjs/wasm-edit": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.4.3.tgz",
-      "integrity": "sha512-qzuwUn771PV6/LilqkXcS0ozJYAeY/OKbXIWU3a8gexuqb6De2p4ya/baBeH5JQ2WJdfhWhSvSbu86Vienttpw==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.4.3",
-        "@webassemblyjs/helper-buffer": "1.4.3",
-        "@webassemblyjs/helper-wasm-bytecode": "1.4.3",
-        "@webassemblyjs/helper-wasm-section": "1.4.3",
-        "@webassemblyjs/wasm-gen": "1.4.3",
-        "@webassemblyjs/wasm-opt": "1.4.3",
-        "@webassemblyjs/wasm-parser": "1.4.3",
-        "@webassemblyjs/wast-printer": "1.4.3",
-        "debug": "^3.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "@webassemblyjs/wasm-gen": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.4.3.tgz",
-      "integrity": "sha512-eR394T8dHZfpLJ7U/Z5pFSvxl1L63JdREebpv9gYc55zLhzzdJPAuxjBYT4XqevUdW67qU2s0nNA3kBuNJHbaQ==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.4.3",
-        "@webassemblyjs/helper-wasm-bytecode": "1.4.3",
-        "@webassemblyjs/leb128": "1.4.3"
-      }
-    },
-    "@webassemblyjs/wasm-opt": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.4.3.tgz",
-      "integrity": "sha512-7Gp+nschuKiDuAL1xmp4Xz0rgEbxioFXw4nCFYEmy+ytynhBnTeGc9W9cB1XRu1w8pqRU2lbj2VBBA4cL5Z2Kw==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.4.3",
-        "@webassemblyjs/helper-buffer": "1.4.3",
-        "@webassemblyjs/wasm-gen": "1.4.3",
-        "@webassemblyjs/wasm-parser": "1.4.3",
-        "debug": "^3.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "@webassemblyjs/wasm-parser": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.4.3.tgz",
-      "integrity": "sha512-KXBjtlwA3BVukR/yWHC9GF+SCzBcgj0a7lm92kTOaa4cbjaTaa47bCjXw6cX4SGQpkncB9PU2hHGYVyyI7wFRg==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.4.3",
-        "@webassemblyjs/helper-wasm-bytecode": "1.4.3",
-        "@webassemblyjs/leb128": "1.4.3",
-        "@webassemblyjs/wasm-parser": "1.4.3",
-        "webassemblyjs": "1.4.3"
-      }
-    },
-    "@webassemblyjs/wast-parser": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.4.3.tgz",
-      "integrity": "sha512-QhCsQzqV0CpsEkRYyTzQDilCNUZ+5j92f+g35bHHNqS22FppNTywNFfHPq8ZWZfYCgbectc+PoghD+xfzVFh1Q==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.4.3",
-        "@webassemblyjs/floating-point-hex-parser": "1.4.3",
-        "@webassemblyjs/helper-code-frame": "1.4.3",
-        "@webassemblyjs/helper-fsm": "1.4.3",
-        "long": "^3.2.0",
-        "webassemblyjs": "1.4.3"
-      }
-    },
-    "@webassemblyjs/wast-printer": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.4.3.tgz",
-      "integrity": "sha512-EgXk4anf8jKmuZJsqD8qy5bz2frEQhBvZruv+bqwNoLWUItjNSFygk8ywL3JTEz9KtxTlAmqTXNrdD1d9gNDtg==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.4.3",
-        "@webassemblyjs/wast-parser": "1.4.3",
-        "long": "^3.2.0"
-      }
-    },
-    "@webpack-contrib/schema-utils": {
-      "version": "1.0.0-beta.0",
-      "resolved": "https://registry.npmjs.org/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz",
-      "integrity": "sha512-LonryJP+FxQQHsjGBi6W786TQB1Oym+agTpY0c+Kj8alnIw+DLUJb6SI8Y1GHGhLCH1yPRrucjObUmxNICQ1pg==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.1.0",
-        "ajv-keywords": "^3.1.0",
-        "chalk": "^2.3.2",
-        "strip-ansi": "^4.0.0",
-        "text-table": "^0.2.0",
-        "webpack-log": "^1.1.2"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "2.4.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
-          "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^3.0.0"
-          }
-        }
-      }
-    },
-    "abbrev": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
-      "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
-      "dev": true
-    },
-    "accepts": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
-      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
-      "dev": true,
-      "requires": {
-        "mime-types": "~2.1.18",
-        "negotiator": "0.6.1"
-      }
-    },
-    "acorn": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz",
-      "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==",
-      "dev": true
-    },
-    "acorn-dynamic-import": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
-      "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
-      "dev": true,
-      "requires": {
-        "acorn": "^5.0.0"
-      }
-    },
-    "adm-zip": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz",
-      "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=",
-      "dev": true
-    },
-    "after": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
-      "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
-      "dev": true
-    },
-    "agent-base": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
-      "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
-      "dev": true,
-      "requires": {
-        "es6-promisify": "^5.0.0"
-      }
-    },
-    "ajv": {
-      "version": "6.4.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz",
-      "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=",
-      "dev": true,
-      "requires": {
-        "fast-deep-equal": "^1.0.0",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.3.0",
-        "uri-js": "^3.0.2"
-      }
-    },
-    "ajv-keywords": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
-      "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
-      "dev": true
-    },
-    "align-text": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
-      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
-      "requires": {
-        "kind-of": "^3.0.2",
-        "longest": "^1.0.1",
-        "repeat-string": "^1.5.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "amdefine": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
-      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
-      "dev": true
-    },
-    "angularfire2": {
-      "version": "5.0.0-rc.11",
-      "resolved": "https://registry.npmjs.org/angularfire2/-/angularfire2-5.0.0-rc.11.tgz",
-      "integrity": "sha512-Jr6uEquMRuJSgYTw8YxNkDwpkvg2CDJtLlQD0AdMXYoUAwcgsIE4ar7qatIJ2/fwX12TO+oPooCyr0G4GjdwXQ=="
-    },
-    "ansi-html": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
-      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
-      "dev": true
-    },
-    "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "requires": {
-        "color-convert": "^1.9.0"
-      }
-    },
-    "anymatch": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-      "dev": true,
-      "requires": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
-      }
-    },
-    "app-root-path": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz",
-      "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=",
-      "dev": true
-    },
-    "append-transform": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz",
-      "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==",
-      "dev": true,
-      "requires": {
-        "default-require-extensions": "^2.0.0"
-      }
-    },
-    "aproba": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
-      "dev": true
-    },
-    "are-we-there-yet": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
-      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
-      "dev": true,
-      "requires": {
-        "delegates": "^1.0.0",
-        "readable-stream": "^2.0.6"
-      }
-    },
-    "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true
-    },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true
-    },
-    "array-find-index": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
-      "dev": true
-    },
-    "array-flatten": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz",
-      "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=",
-      "dev": true
-    },
-    "array-includes": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
-      "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.2",
-        "es-abstract": "^1.7.0"
-      }
-    },
-    "array-slice": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
-      "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
-      "dev": true
-    },
-    "array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dev": true,
-      "requires": {
-        "array-uniq": "^1.0.1"
-      }
-    },
-    "array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-      "dev": true
-    },
-    "array-unique": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true
-    },
-    "arraybuffer.slice": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz",
-      "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=",
-      "dev": true
-    },
-    "arrify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
-      "dev": true
-    },
-    "asap": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
-      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
-      "dev": true,
-      "optional": true
-    },
-    "ascli": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz",
-      "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=",
-      "requires": {
-        "colour": "~0.7.1",
-        "optjs": "~3.2.2"
-      }
-    },
-    "asn1": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
-      "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
-      "dev": true
-    },
-    "asn1.js": {
-      "version": "4.10.1",
-      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
-      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "assert": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
-      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
-      "dev": true,
-      "requires": {
-        "util": "0.10.3"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
-          "dev": true
-        },
-        "util": {
-          "version": "0.10.3",
-          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
-          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
-          "dev": true,
-          "requires": {
-            "inherits": "2.0.1"
-          }
-        }
-      }
-    },
-    "assert-plus": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-      "dev": true
-    },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true
-    },
-    "async": {
-      "version": "1.5.2",
-      "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
-      "dev": true
-    },
-    "async-each": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
-      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
-      "dev": true
-    },
-    "async-foreach": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
-      "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
-      "dev": true,
-      "optional": true
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true
-    },
-    "atob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
-      "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=",
-      "dev": true
-    },
-    "autoprefixer": {
-      "version": "8.6.4",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.4.tgz",
-      "integrity": "sha512-9D0OoxWCqq9Okp9wD+igaCf6ZaNjYNFSCKxgMLAxAGqXwpapaZ+D0PBv265VHQLgam8a7gld4E6KgJJM6SKfQQ==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^3.2.8",
-        "caniuse-lite": "^1.0.30000859",
-        "normalize-range": "^0.1.2",
-        "num2fraction": "^1.2.2",
-        "postcss": "^6.0.23",
-        "postcss-value-parser": "^3.2.3"
-      }
-    },
-    "aws-sign2": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
-      "dev": true
-    },
-    "aws4": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
-      "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
-      "dev": true
-    },
-    "babel-code-frame": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
-      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
-      "dev": true,
-      "requires": {
-        "chalk": "^1.1.3",
-        "esutils": "^2.0.2",
-        "js-tokens": "^3.0.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true
-        }
-      }
-    },
-    "babel-generator": {
-      "version": "6.26.1",
-      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
-      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
-      "dev": true,
-      "requires": {
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "detect-indent": "^4.0.0",
-        "jsesc": "^1.3.0",
-        "lodash": "^4.17.4",
-        "source-map": "^0.5.7",
-        "trim-right": "^1.0.1"
-      }
-    },
-    "babel-messages": {
-      "version": "6.23.0",
-      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
-      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-runtime": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
-      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-      "dev": true,
-      "requires": {
-        "core-js": "^2.4.0",
-        "regenerator-runtime": "^0.11.0"
-      }
-    },
-    "babel-template": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
-      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "lodash": "^4.17.4"
-      }
-    },
-    "babel-traverse": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
-      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "^6.26.0",
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "debug": "^2.6.8",
-        "globals": "^9.18.0",
-        "invariant": "^2.2.2",
-        "lodash": "^4.17.4"
-      }
-    },
-    "babel-types": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
-      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.4",
-        "to-fast-properties": "^1.0.3"
-      }
-    },
-    "babylon": {
-      "version": "6.18.0",
-      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
-      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
-      "dev": true
-    },
-    "backo2": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
-      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
-      "dev": true
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
-    },
-    "base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
-      "requires": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "base64-arraybuffer": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
-      "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
-      "dev": true
-    },
-    "base64-js": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
-      "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
-      "dev": true
-    },
-    "base64id": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
-      "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
-      "dev": true
-    },
-    "batch": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
-      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
-      "dev": true
-    },
-    "bcrypt-pbkdf": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "tweetnacl": "^0.14.3"
-      }
-    },
-    "better-assert": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
-      "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
-      "dev": true,
-      "requires": {
-        "callsite": "1.0.0"
-      }
-    },
-    "big.js": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
-      "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
-      "dev": true
-    },
-    "binary-extensions": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
-      "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
-      "dev": true
-    },
-    "blob": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
-      "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
-      "dev": true
-    },
-    "block-stream": {
-      "version": "0.0.9",
-      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
-      "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "inherits": "~2.0.0"
-      }
-    },
-    "blocking-proxy": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz",
-      "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==",
-      "dev": true,
-      "requires": {
-        "minimist": "^1.2.0"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        }
-      }
-    },
-    "bluebird": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
-      "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
-      "dev": true
-    },
-    "bn.js": {
-      "version": "4.11.8",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
-      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
-      "dev": true
-    },
-    "body-parser": {
-      "version": "1.18.2",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
-      "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
-      "dev": true,
-      "requires": {
-        "bytes": "3.0.0",
-        "content-type": "~1.0.4",
-        "debug": "2.6.9",
-        "depd": "~1.1.1",
-        "http-errors": "~1.6.2",
-        "iconv-lite": "0.4.19",
-        "on-finished": "~2.3.0",
-        "qs": "6.5.1",
-        "raw-body": "2.3.2",
-        "type-is": "~1.6.15"
-      },
-      "dependencies": {
-        "qs": {
-          "version": "6.5.1",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
-          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
-          "dev": true
-        }
-      }
-    },
-    "bonjour": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
-      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
-      "dev": true,
-      "requires": {
-        "array-flatten": "^2.1.0",
-        "deep-equal": "^1.0.1",
-        "dns-equal": "^1.0.0",
-        "dns-txt": "^2.0.2",
-        "multicast-dns": "^6.0.1",
-        "multicast-dns-service-types": "^1.1.0"
-      }
-    },
-    "boolbase": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
-      "dev": true
-    },
-    "boom": {
-      "version": "2.10.1",
-      "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
-      "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
-      "dev": true,
-      "requires": {
-        "hoek": "2.x.x"
-      }
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-      "dev": true,
-      "requires": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "brorand": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
-      "dev": true
-    },
-    "browserify-aes": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
-      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
-      "dev": true,
-      "requires": {
-        "buffer-xor": "^1.0.3",
-        "cipher-base": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.3",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "browserify-cipher": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
-      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
-      "dev": true,
-      "requires": {
-        "browserify-aes": "^1.0.4",
-        "browserify-des": "^1.0.0",
-        "evp_bytestokey": "^1.0.0"
-      }
-    },
-    "browserify-des": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz",
-      "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "des.js": "^1.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
-    "browserify-rsa": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
-      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "randombytes": "^2.0.1"
-      }
-    },
-    "browserify-sign": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
-      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.1",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.2",
-        "elliptic": "^6.0.0",
-        "inherits": "^2.0.1",
-        "parse-asn1": "^5.0.0"
-      }
-    },
-    "browserify-zlib": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
-      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
-      "dev": true,
-      "requires": {
-        "pako": "~1.0.5"
-      }
-    },
-    "browserslist": {
-      "version": "3.2.8",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
-      "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
-      "dev": true,
-      "requires": {
-        "caniuse-lite": "^1.0.30000844",
-        "electron-to-chromium": "^1.3.47"
-      }
-    },
-    "buffer": {
-      "version": "4.9.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
-      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
-      "dev": true,
-      "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4",
-        "isarray": "^1.0.0"
-      }
-    },
-    "buffer-from": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz",
-      "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==",
-      "dev": true
-    },
-    "buffer-indexof": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
-      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
-      "dev": true
-    },
-    "buffer-xor": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
-      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
-      "dev": true
-    },
-    "builtin-modules": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
-      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
-      "dev": true
-    },
-    "builtin-status-codes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
-      "dev": true
-    },
-    "builtins": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
-      "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
-      "dev": true
-    },
-    "bytebuffer": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz",
-      "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=",
-      "requires": {
-        "long": "~3"
-      }
-    },
-    "bytes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
-      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
-      "dev": true
-    },
-    "cacache": {
-      "version": "10.0.4",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
-      "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
-      "dev": true,
-      "requires": {
-        "bluebird": "^3.5.1",
-        "chownr": "^1.0.1",
-        "glob": "^7.1.2",
-        "graceful-fs": "^4.1.11",
-        "lru-cache": "^4.1.1",
-        "mississippi": "^2.0.0",
-        "mkdirp": "^0.5.1",
-        "move-concurrently": "^1.0.1",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^2.6.2",
-        "ssri": "^5.2.4",
-        "unique-filename": "^1.1.0",
-        "y18n": "^4.0.0"
-      }
-    },
-    "cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
-      "requires": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      }
-    },
-    "cache-loader": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz",
-      "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "^1.1.0",
-        "mkdirp": "^0.5.1",
-        "neo-async": "^2.5.0",
-        "schema-utils": "^0.4.2"
-      }
-    },
-    "callsite": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
-      "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
-      "dev": true
-    },
-    "camel-case": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
-      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
-      "dev": true,
-      "requires": {
-        "no-case": "^2.2.0",
-        "upper-case": "^1.1.1"
-      }
-    },
-    "camelcase": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
-      "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
-    },
-    "camelcase-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
-      "dev": true,
-      "requires": {
-        "camelcase": "^2.0.0",
-        "map-obj": "^1.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
-          "dev": true
-        }
-      }
-    },
-    "caniuse-lite": {
-      "version": "1.0.30000864",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000864.tgz",
-      "integrity": "sha512-8fuGh8n3MIQ7oBkO/ck7J4LXhV5Sz5aLyFmfpChWpK+rJhqYrOsGDdbBVDdyKIRBWamZpy6iM4OmLCFVudOOhg==",
-      "dev": true
-    },
-    "caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
-      "dev": true
-    },
-    "center-align": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
-      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
-      "requires": {
-        "align-text": "^0.1.3",
-        "lazy-cache": "^1.0.3"
-      }
-    },
-    "chalk": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz",
-      "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^3.1.0",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^4.0.0"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
-          "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "4.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
-          "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
-          "dev": true,
-          "requires": {
-            "has-flag": "^2.0.0"
-          }
-        }
-      }
-    },
-    "chokidar": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
-      "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
-      "dev": true,
-      "requires": {
-        "anymatch": "^2.0.0",
-        "async-each": "^1.0.0",
-        "braces": "^2.3.0",
-        "fsevents": "^1.2.2",
-        "glob-parent": "^3.1.0",
-        "inherits": "^2.0.1",
-        "is-binary-path": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "lodash.debounce": "^4.0.8",
-        "normalize-path": "^2.1.1",
-        "path-is-absolute": "^1.0.0",
-        "readdirp": "^2.0.0",
-        "upath": "^1.0.5"
-      }
-    },
-    "chownr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
-      "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=",
-      "dev": true
-    },
-    "chrome-trace-event": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz",
-      "integrity": "sha512-sjndyZHrrWiu4RY7AkHgjn80GfAM2ZSzUkZLV/Js59Ldmh6JDThf0SUmOHU53rFu2rVxxfCzJ30Ukcfch3Gb/A==",
-      "dev": true
-    },
-    "cipher-base": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
-      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "circular-dependency-plugin": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz",
-      "integrity": "sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA==",
-      "dev": true
-    },
-    "class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
-    "clean-css": {
-      "version": "4.1.11",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
-      "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
-      "dev": true,
-      "requires": {
-        "source-map": "0.5.x"
-      }
-    },
-    "cliui": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
-      "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
-      "requires": {
-        "center-align": "^0.1.1",
-        "right-align": "^0.1.1",
-        "wordwrap": "0.0.2"
-      },
-      "dependencies": {
-        "wordwrap": {
-          "version": "0.0.2",
-          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
-          "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
-        }
-      }
-    },
-    "clone": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
-      "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
-      "dev": true
-    },
-    "clone-deep": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
-      "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==",
-      "dev": true,
-      "requires": {
-        "for-own": "^1.0.0",
-        "is-plain-object": "^2.0.4",
-        "kind-of": "^6.0.0",
-        "shallow-clone": "^1.0.0"
-      }
-    },
-    "co": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
-      "dev": true
-    },
-    "code-point-at": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
-      "dev": true
-    },
-    "codelyzer": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.2.1.tgz",
-      "integrity": "sha512-CKwfgpfkqi9dyzy4s6ELaxJ54QgJ6A8iTSsM4bzHbLuTpbKncvNc3DUlCvpnkHBhK47gEf4qFsWoYqLrJPhy6g==",
-      "dev": true,
-      "requires": {
-        "app-root-path": "^2.0.1",
-        "css-selector-tokenizer": "^0.7.0",
-        "cssauron": "^1.4.0",
-        "semver-dsl": "^1.0.1",
-        "source-map": "^0.5.6",
-        "sprintf-js": "^1.0.3"
-      }
-    },
-    "collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
-      "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      }
-    },
-    "color-convert": {
-      "version": "1.9.2",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
-      "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
-      "dev": true,
-      "requires": {
-        "color-name": "1.1.1"
-      }
-    },
-    "color-name": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
-      "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
-      "dev": true
-    },
-    "colors": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
-      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
-      "dev": true
-    },
-    "colour": {
-      "version": "0.7.1",
-      "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz",
-      "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g="
-    },
-    "combine-lists": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz",
-      "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.5.0"
-      }
-    },
-    "combined-stream": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
-      "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
-      "dev": true,
-      "requires": {
-        "delayed-stream": "~1.0.0"
-      }
-    },
-    "commander": {
-      "version": "2.16.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz",
-      "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==",
-      "dev": true
-    },
-    "commondir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
-      "dev": true
-    },
-    "compare-versions": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.3.0.tgz",
-      "integrity": "sha512-MAAAIOdi2s4Gl6rZ76PNcUa9IOYB+5ICdT41o5uMRf09aEu/F9RK+qhe8RjXNPwcTjGV7KU7h2P/fljThFVqyQ==",
-      "dev": true
-    },
-    "component-bind": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
-      "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
-      "dev": true
-    },
-    "component-emitter": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
-      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
-      "dev": true
-    },
-    "component-inherit": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
-      "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
-      "dev": true
-    },
-    "compressible": {
-      "version": "2.0.14",
-      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz",
-      "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=",
-      "dev": true,
-      "requires": {
-        "mime-db": ">= 1.34.0 < 2"
-      },
-      "dependencies": {
-        "mime-db": {
-          "version": "1.34.0",
-          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz",
-          "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=",
-          "dev": true
-        }
-      }
-    },
-    "compression": {
-      "version": "1.7.2",
-      "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz",
-      "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.4",
-        "bytes": "3.0.0",
-        "compressible": "~2.0.13",
-        "debug": "2.6.9",
-        "on-headers": "~1.0.1",
-        "safe-buffer": "5.1.1",
-        "vary": "~1.1.2"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
-          "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
-          "dev": true
-        }
-      }
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-    },
-    "concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "connect": {
-      "version": "3.6.6",
-      "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
-      "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
-      "dev": true,
-      "requires": {
-        "debug": "2.6.9",
-        "finalhandler": "1.1.0",
-        "parseurl": "~1.3.2",
-        "utils-merge": "1.0.1"
-      },
-      "dependencies": {
-        "finalhandler": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
-          "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
-          "dev": true,
-          "requires": {
-            "debug": "2.6.9",
-            "encodeurl": "~1.0.1",
-            "escape-html": "~1.0.3",
-            "on-finished": "~2.3.0",
-            "parseurl": "~1.3.2",
-            "statuses": "~1.3.1",
-            "unpipe": "~1.0.0"
-          }
-        },
-        "statuses": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
-          "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
-          "dev": true
-        }
-      }
-    },
-    "connect-history-api-fallback": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
-      "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=",
-      "dev": true
-    },
-    "console-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
-      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
-      "dev": true,
-      "requires": {
-        "date-now": "^0.1.4"
-      }
-    },
-    "console-control-strings": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
-      "dev": true
-    },
-    "constants-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
-      "dev": true
-    },
-    "content-disposition": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
-      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
-      "dev": true
-    },
-    "content-type": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
-      "dev": true
-    },
-    "convert-source-map": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
-      "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
-      "dev": true
-    },
-    "cookie": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
-      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
-      "dev": true
-    },
-    "cookie-signature": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
-      "dev": true
-    },
-    "copy-concurrently": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
-      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.1.1",
-        "fs-write-stream-atomic": "^1.0.8",
-        "iferr": "^0.1.5",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.0"
-      }
-    },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true
-    },
-    "copy-webpack-plugin": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz",
-      "integrity": "sha512-zmC33E8FFSq3AbflTvqvPvBo621H36Afsxlui91d+QyZxPIuXghfnTsa1CuqiAaCPgJoSUWfTFbKJnadZpKEbQ==",
-      "dev": true,
-      "requires": {
-        "cacache": "^10.0.4",
-        "find-cache-dir": "^1.0.0",
-        "globby": "^7.1.1",
-        "is-glob": "^4.0.0",
-        "loader-utils": "^1.1.0",
-        "minimatch": "^3.0.4",
-        "p-limit": "^1.0.0",
-        "serialize-javascript": "^1.4.0"
-      }
-    },
-    "core-js": {
-      "version": "2.5.7",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
-      "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
-    },
-    "cosmiconfig": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz",
-      "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==",
-      "dev": true,
-      "requires": {
-        "is-directory": "^0.3.1",
-        "js-yaml": "^3.4.3",
-        "minimist": "^1.2.0",
-        "object-assign": "^4.1.0",
-        "os-homedir": "^1.0.1",
-        "parse-json": "^2.2.0",
-        "require-from-string": "^1.1.0"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        }
-      }
-    },
-    "create-ecdh": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
-      "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "elliptic": "^6.0.0"
-      }
-    },
-    "create-hash": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
-      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "inherits": "^2.0.1",
-        "md5.js": "^1.3.4",
-        "ripemd160": "^2.0.1",
-        "sha.js": "^2.4.0"
-      }
-    },
-    "create-hmac": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
-      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.3",
-        "create-hash": "^1.1.0",
-        "inherits": "^2.0.1",
-        "ripemd160": "^2.0.0",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "cross-spawn": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
-      "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "lru-cache": "^4.0.1",
-        "which": "^1.2.9"
-      }
-    },
-    "cryptiles": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
-      "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "boom": "2.x.x"
-      }
-    },
-    "crypto-browserify": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
-      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
-      "dev": true,
-      "requires": {
-        "browserify-cipher": "^1.0.0",
-        "browserify-sign": "^4.0.0",
-        "create-ecdh": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.0",
-        "diffie-hellman": "^5.0.0",
-        "inherits": "^2.0.1",
-        "pbkdf2": "^3.0.3",
-        "public-encrypt": "^4.0.0",
-        "randombytes": "^2.0.0",
-        "randomfill": "^1.0.3"
-      }
-    },
-    "css-parse": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz",
-      "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=",
-      "dev": true
-    },
-    "css-select": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
-      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
-      "dev": true,
-      "requires": {
-        "boolbase": "~1.0.0",
-        "css-what": "2.1",
-        "domutils": "1.5.1",
-        "nth-check": "~1.0.1"
-      }
-    },
-    "css-selector-tokenizer": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz",
-      "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=",
-      "dev": true,
-      "requires": {
-        "cssesc": "^0.1.0",
-        "fastparse": "^1.1.1",
-        "regexpu-core": "^1.0.0"
-      }
-    },
-    "css-what": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
-      "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
-      "dev": true
-    },
-    "cssauron": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
-      "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=",
-      "dev": true,
-      "requires": {
-        "through": "X.X.X"
-      }
-    },
-    "cssesc": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
-      "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
-      "dev": true
-    },
-    "cuint": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz",
-      "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=",
-      "dev": true
-    },
-    "currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
-      "dev": true,
-      "requires": {
-        "array-find-index": "^1.0.1"
-      }
-    },
-    "custom-event": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
-      "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
-      "dev": true
-    },
-    "cyclist": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
-      "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
-      "dev": true
-    },
-    "d": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
-      "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
-      "dev": true,
-      "requires": {
-        "es5-ext": "^0.10.9"
-      }
-    },
-    "dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "date-now": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
-      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
-      "dev": true
-    },
-    "debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
-    },
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true
-    },
-    "deep-equal": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
-      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
-      "dev": true
-    },
-    "deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
-      "dev": true
-    },
-    "default-require-extensions": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
-      "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=",
-      "dev": true,
-      "requires": {
-        "strip-bom": "^3.0.0"
-      },
-      "dependencies": {
-        "strip-bom": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
-          "dev": true
-        }
-      }
-    },
-    "define-properties": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
-      "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
-      "dev": true,
-      "requires": {
-        "foreach": "^2.0.5",
-        "object-keys": "^1.0.8"
-      }
-    },
-    "define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
-      "requires": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "del": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
-      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
-      "dev": true,
-      "requires": {
-        "globby": "^6.1.0",
-        "is-path-cwd": "^1.0.0",
-        "is-path-in-cwd": "^1.0.0",
-        "p-map": "^1.1.1",
-        "pify": "^3.0.0",
-        "rimraf": "^2.2.8"
-      },
-      "dependencies": {
-        "globby": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-          "dev": true,
-          "requires": {
-            "array-union": "^1.0.1",
-            "glob": "^7.0.3",
-            "object-assign": "^4.0.1",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          },
-          "dependencies": {
-            "pify": {
-              "version": "2.3.0",
-              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-              "dev": true
-            }
-          }
-        }
-      }
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
-    },
-    "delegates": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
-      "dev": true
-    },
-    "depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-      "dev": true
-    },
-    "des.js": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
-      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "destroy": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
-      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
-      "dev": true
-    },
-    "detect-indent": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
-      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
-      "dev": true,
-      "requires": {
-        "repeating": "^2.0.0"
-      }
-    },
-    "detect-node": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz",
-      "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=",
-      "dev": true
-    },
-    "di": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
-      "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
-      "dev": true
-    },
-    "diff": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
-      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
-      "dev": true
-    },
-    "diffie-hellman": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
-      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "miller-rabin": "^4.0.0",
-        "randombytes": "^2.0.0"
-      }
-    },
-    "dir-glob": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
-      "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
-      "dev": true,
-      "requires": {
-        "arrify": "^1.0.1",
-        "path-type": "^3.0.0"
-      }
-    },
-    "dns-equal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
-      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
-      "dev": true
-    },
-    "dns-packet": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
-      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
-      "dev": true,
-      "requires": {
-        "ip": "^1.1.0",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "dns-txt": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
-      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
-      "dev": true,
-      "requires": {
-        "buffer-indexof": "^1.0.0"
-      }
-    },
-    "dom-converter": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz",
-      "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=",
-      "dev": true,
-      "requires": {
-        "utila": "~0.3"
-      },
-      "dependencies": {
-        "utila": {
-          "version": "0.3.3",
-          "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
-          "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
-          "dev": true
-        }
-      }
-    },
-    "dom-serialize": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
-      "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
-      "dev": true,
-      "requires": {
-        "custom-event": "~1.0.0",
-        "ent": "~2.2.0",
-        "extend": "^3.0.0",
-        "void-elements": "^2.0.0"
-      }
-    },
-    "dom-serializer": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
-      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
-      "dev": true,
-      "requires": {
-        "domelementtype": "~1.1.1",
-        "entities": "~1.1.1"
-      },
-      "dependencies": {
-        "domelementtype": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
-          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
-          "dev": true
-        }
-      }
-    },
-    "dom-storage": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz",
-      "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q=="
-    },
-    "domain-browser": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
-      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
-      "dev": true
-    },
-    "domelementtype": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
-      "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
-      "dev": true
-    },
-    "domhandler": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
-      "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
-      "dev": true,
-      "requires": {
-        "domelementtype": "1"
-      }
-    },
-    "domutils": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
-      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
-      "dev": true,
-      "requires": {
-        "dom-serializer": "0",
-        "domelementtype": "1"
-      }
-    },
-    "duplexify": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
-      "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "ecc-jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
-      "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "jsbn": "~0.1.0"
-      }
-    },
-    "ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
-      "dev": true
-    },
-    "ejs": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
-      "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
-      "dev": true
-    },
-    "electron-to-chromium": {
-      "version": "1.3.51",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.51.tgz",
-      "integrity": "sha1-akK0nar38ipbN7mR2vlJ8029ubU=",
-      "dev": true
-    },
-    "elliptic": {
-      "version": "6.4.0",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
-      "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.4.0",
-        "brorand": "^1.0.1",
-        "hash.js": "^1.0.0",
-        "hmac-drbg": "^1.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.0"
-      }
-    },
-    "emojis-list": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
-      "dev": true
-    },
-    "encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
-      "dev": true
-    },
-    "encoding": {
-      "version": "0.1.12",
-      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
-      "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
-      "requires": {
-        "iconv-lite": "~0.4.13"
-      }
-    },
-    "end-of-stream": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
-      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
-      "dev": true,
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "engine.io": {
-      "version": "1.8.3",
-      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz",
-      "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=",
-      "dev": true,
-      "requires": {
-        "accepts": "1.3.3",
-        "base64id": "1.0.0",
-        "cookie": "0.3.1",
-        "debug": "2.3.3",
-        "engine.io-parser": "1.3.2",
-        "ws": "1.1.2"
-      },
-      "dependencies": {
-        "accepts": {
-          "version": "1.3.3",
-          "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
-          "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=",
-          "dev": true,
-          "requires": {
-            "mime-types": "~2.1.11",
-            "negotiator": "0.6.1"
-          }
-        },
-        "debug": {
-          "version": "2.3.3",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
-          "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
-          "dev": true,
-          "requires": {
-            "ms": "0.7.2"
-          }
-        },
-        "ms": {
-          "version": "0.7.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
-          "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
-          "dev": true
-        }
-      }
-    },
-    "engine.io-client": {
-      "version": "1.8.3",
-      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz",
-      "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=",
-      "dev": true,
-      "requires": {
-        "component-emitter": "1.2.1",
-        "component-inherit": "0.0.3",
-        "debug": "2.3.3",
-        "engine.io-parser": "1.3.2",
-        "has-cors": "1.1.0",
-        "indexof": "0.0.1",
-        "parsejson": "0.0.3",
-        "parseqs": "0.0.5",
-        "parseuri": "0.0.5",
-        "ws": "1.1.2",
-        "xmlhttprequest-ssl": "1.5.3",
-        "yeast": "0.1.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.3.3",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
-          "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
-          "dev": true,
-          "requires": {
-            "ms": "0.7.2"
-          }
-        },
-        "ms": {
-          "version": "0.7.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
-          "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
-          "dev": true
-        }
-      }
-    },
-    "engine.io-parser": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz",
-      "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=",
-      "dev": true,
-      "requires": {
-        "after": "0.8.2",
-        "arraybuffer.slice": "0.0.6",
-        "base64-arraybuffer": "0.1.5",
-        "blob": "0.0.4",
-        "has-binary": "0.1.7",
-        "wtf-8": "1.0.0"
-      }
-    },
-    "enhanced-resolve": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
-      "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "memory-fs": "^0.4.0",
-        "tapable": "^1.0.0"
-      }
-    },
-    "ent": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
-      "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
-      "dev": true
-    },
-    "entities": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
-      "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
-      "dev": true
-    },
-    "errno": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
-      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
-      "dev": true,
-      "requires": {
-        "prr": "~1.0.1"
-      }
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "es-abstract": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
-      "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
-      "dev": true,
-      "requires": {
-        "es-to-primitive": "^1.1.1",
-        "function-bind": "^1.1.1",
-        "has": "^1.0.1",
-        "is-callable": "^1.1.3",
-        "is-regex": "^1.0.4"
-      }
-    },
-    "es-to-primitive": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
-      "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
-      "dev": true,
-      "requires": {
-        "is-callable": "^1.1.1",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.1"
-      }
-    },
-    "es5-ext": {
-      "version": "0.10.45",
-      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz",
-      "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==",
-      "dev": true,
-      "requires": {
-        "es6-iterator": "~2.0.3",
-        "es6-symbol": "~3.1.1",
-        "next-tick": "1"
-      }
-    },
-    "es6-iterator": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
-      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.35",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "es6-promise": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
-      "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
-      "dev": true
-    },
-    "es6-promisify": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
-      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
-      "dev": true,
-      "requires": {
-        "es6-promise": "^4.0.3"
-      }
-    },
-    "es6-symbol": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
-      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "~0.10.14"
-      }
-    },
-    "escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
-      "dev": true
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
-    },
-    "escodegen": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
-      "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
-      "dev": true,
-      "requires": {
-        "esprima": "^2.7.1",
-        "estraverse": "^1.9.1",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1",
-        "source-map": "~0.2.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.2.0",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
-          "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
-        }
-      }
-    },
-    "eslint-scope": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
-      "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
-      "dev": true,
-      "requires": {
-        "esrecurse": "^4.1.0",
-        "estraverse": "^4.1.1"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-          "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-          "dev": true
-        }
-      }
-    },
-    "esprima": {
-      "version": "2.7.3",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
-      "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
-      "dev": true
-    },
-    "esrecurse": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^4.1.0"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-          "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-          "dev": true
-        }
-      }
-    },
-    "estraverse": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
-      "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
-      "dev": true
-    },
-    "esutils": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
-      "dev": true
-    },
-    "etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
-      "dev": true
-    },
-    "eventemitter3": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
-      "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
-      "dev": true
-    },
-    "events": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
-      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
-      "dev": true
-    },
-    "eventsource": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
-      "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
-      "dev": true,
-      "requires": {
-        "original": ">=0.0.5"
-      }
-    },
-    "evp_bytestokey": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
-      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
-      "dev": true,
-      "requires": {
-        "md5.js": "^1.3.4",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "execa": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
-      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
-      "dev": true,
-      "requires": {
-        "cross-spawn": "^5.0.1",
-        "get-stream": "^3.0.0",
-        "is-stream": "^1.1.0",
-        "npm-run-path": "^2.0.0",
-        "p-finally": "^1.0.0",
-        "signal-exit": "^3.0.0",
-        "strip-eof": "^1.0.0"
-      },
-      "dependencies": {
-        "cross-spawn": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
-          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^4.0.1",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          }
-        }
-      }
-    },
-    "exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
-      "dev": true
-    },
-    "expand-braces": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz",
-      "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
-      "dev": true,
-      "requires": {
-        "array-slice": "^0.2.3",
-        "array-unique": "^0.2.1",
-        "braces": "^0.1.2"
-      },
-      "dependencies": {
-        "array-unique": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
-          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
-          "dev": true
-        },
-        "braces": {
-          "version": "0.1.5",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz",
-          "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
-          "dev": true,
-          "requires": {
-            "expand-range": "^0.1.0"
-          }
-        },
-        "expand-range": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz",
-          "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
-          "dev": true,
-          "requires": {
-            "is-number": "^0.1.1",
-            "repeat-string": "^0.2.2"
-          }
-        },
-        "is-number": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz",
-          "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=",
-          "dev": true
-        },
-        "repeat-string": {
-          "version": "0.2.2",
-          "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz",
-          "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=",
-          "dev": true
-        }
-      }
-    },
-    "expand-brackets": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "expand-range": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
-      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
-      "dev": true,
-      "requires": {
-        "fill-range": "^2.1.0"
-      },
-      "dependencies": {
-        "fill-range": {
-          "version": "2.2.4",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
-          "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
-          "dev": true,
-          "requires": {
-            "is-number": "^2.1.0",
-            "isobject": "^2.0.0",
-            "randomatic": "^3.0.0",
-            "repeat-element": "^1.1.2",
-            "repeat-string": "^1.5.2"
-          }
-        },
-        "is-number": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
-          "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        },
-        "isobject": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-          "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-          "dev": true,
-          "requires": {
-            "isarray": "1.0.0"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "express": {
-      "version": "4.16.3",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
-      "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.5",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.18.2",
-        "content-disposition": "0.5.2",
-        "content-type": "~1.0.4",
-        "cookie": "0.3.1",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "1.1.1",
-        "fresh": "0.5.2",
-        "merge-descriptors": "1.0.1",
-        "methods": "~1.1.2",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.2",
-        "path-to-regexp": "0.1.7",
-        "proxy-addr": "~2.0.3",
-        "qs": "6.5.1",
-        "range-parser": "~1.2.0",
-        "safe-buffer": "5.1.1",
-        "send": "0.16.2",
-        "serve-static": "1.13.2",
-        "setprototypeof": "1.1.0",
-        "statuses": "~1.4.0",
-        "type-is": "~1.6.16",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
-      },
-      "dependencies": {
-        "array-flatten": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
-          "dev": true
-        },
-        "qs": {
-          "version": "6.5.1",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
-          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
-          "dev": true
-        },
-        "safe-buffer": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
-          "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
-          "dev": true
-        }
-      }
-    },
-    "extend": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
-      "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
-      "dev": true
-    },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
-      "requires": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "extglob": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
-      "requires": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-      "dev": true
-    },
-    "fast-deep-equal": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
-      "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
-      "dev": true
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-      "dev": true
-    },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-      "dev": true
-    },
-    "fastparse": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz",
-      "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=",
-      "dev": true
-    },
-    "faye-websocket": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
-      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
-      "dev": true,
-      "requires": {
-        "websocket-driver": ">=0.5.1"
-      }
-    },
-    "file-loader": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz",
-      "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "^1.0.2",
-        "schema-utils": "^0.4.5"
-      }
-    },
-    "filename-regex": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
-      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
-      "dev": true
-    },
-    "fileset": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
-      "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
-      "dev": true,
-      "requires": {
-        "glob": "^7.0.3",
-        "minimatch": "^3.0.3"
-      }
-    },
-    "fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "finalhandler": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
-      "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
-      "dev": true,
-      "requires": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.2",
-        "statuses": "~1.4.0",
-        "unpipe": "~1.0.0"
-      }
-    },
-    "find-cache-dir": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
-      "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
-      "dev": true,
-      "requires": {
-        "commondir": "^1.0.1",
-        "make-dir": "^1.0.0",
-        "pkg-dir": "^2.0.0"
-      }
-    },
-    "find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-      "dev": true,
-      "requires": {
-        "locate-path": "^2.0.0"
-      }
-    },
-    "firebase": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/firebase/-/firebase-5.2.0.tgz",
-      "integrity": "sha512-mWrQihqNXLhQWr1TuORN82wwoKDy5Z4OJyUSlv2wp9EaH0m6AkivFoVjHyEHzU54krP940z5PGF3d4nMlRs1gA==",
-      "requires": {
-        "@firebase/app": "0.3.3",
-        "@firebase/auth": "0.7.0",
-        "@firebase/database": "0.3.4",
-        "@firebase/firestore": "0.5.6",
-        "@firebase/functions": "0.3.0",
-        "@firebase/messaging": "0.3.5",
-        "@firebase/polyfill": "0.3.3",
-        "@firebase/storage": "0.2.3"
-      }
-    },
-    "flush-write-stream": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
-      "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.4"
-      }
-    },
-    "follow-redirects": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz",
-      "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==",
-      "dev": true,
-      "requires": {
-        "debug": "^3.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true
-    },
-    "for-own": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
-      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.1"
-      }
-    },
-    "foreach": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
-      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
-      "dev": true
-    },
-    "forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "dev": true
-    },
-    "form-data": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
-      "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
-      "dev": true,
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "1.0.6",
-        "mime-types": "^2.1.12"
-      }
-    },
-    "forwarded": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
-      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
-      "dev": true
-    },
-    "fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
-      "requires": {
-        "map-cache": "^0.2.2"
-      }
-    },
-    "fresh": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
-      "dev": true
-    },
-    "from2": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
-      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0"
-      }
-    },
-    "fs-access": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
-      "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
-      "dev": true,
-      "requires": {
-        "null-check": "^1.0.0"
-      }
-    },
-    "fs-write-stream-atomic": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
-      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "iferr": "^0.1.5",
-        "imurmurhash": "^0.1.4",
-        "readable-stream": "1 || 2"
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-    },
-    "fsevents": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
-      "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "nan": "^2.9.2",
-        "node-pre-gyp": "^0.10.0"
-      },
-      "dependencies": {
-        "abbrev": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "bundled": true,
-          "dev": true
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "are-we-there-yet": {
-          "version": "1.1.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "delegates": "^1.0.0",
-            "readable-stream": "^2.0.6"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "chownr": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "bundled": true,
-          "dev": true
-        },
-        "console-control-strings": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "debug": {
-          "version": "2.6.9",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "deep-extend": {
-          "version": "0.5.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "delegates": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "detect-libc": {
-          "version": "1.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "fs-minipass": {
-          "version": "1.2.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "gauge": {
-          "version": "2.7.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "aproba": "^1.0.3",
-            "console-control-strings": "^1.0.0",
-            "has-unicode": "^2.0.0",
-            "object-assign": "^4.1.0",
-            "signal-exit": "^3.0.0",
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wide-align": "^1.1.0"
-          }
-        },
-        "glob": {
-          "version": "7.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "has-unicode": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "iconv-lite": {
-          "version": "0.4.21",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safer-buffer": "^2.1.0"
-          }
-        },
-        "ignore-walk": {
-          "version": "3.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimatch": "^3.0.4"
-          }
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "once": "^1.3.0",
-            "wrappy": "1"
-          }
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "bundled": true,
-          "dev": true
-        },
-        "ini": {
-          "version": "1.3.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "0.0.8",
-          "bundled": true,
-          "dev": true
-        },
-        "minipass": {
-          "version": "2.2.4",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "safe-buffer": "^5.1.1",
-            "yallist": "^3.0.0"
-          }
-        },
-        "minizlib": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.1",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "minimist": "0.0.8"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "needle": {
-          "version": "2.2.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "debug": "^2.1.2",
-            "iconv-lite": "^0.4.4",
-            "sax": "^1.2.4"
-          }
-        },
-        "node-pre-gyp": {
-          "version": "0.10.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "detect-libc": "^1.0.2",
-            "mkdirp": "^0.5.1",
-            "needle": "^2.2.0",
-            "nopt": "^4.0.1",
-            "npm-packlist": "^1.1.6",
-            "npmlog": "^4.0.2",
-            "rc": "^1.1.7",
-            "rimraf": "^2.6.1",
-            "semver": "^5.3.0",
-            "tar": "^4"
-          }
-        },
-        "nopt": {
-          "version": "4.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "abbrev": "1",
-            "osenv": "^0.1.4"
-          }
-        },
-        "npm-bundled": {
-          "version": "1.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "npm-packlist": {
-          "version": "1.1.10",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ignore-walk": "^3.0.1",
-            "npm-bundled": "^1.0.1"
-          }
-        },
-        "npmlog": {
-          "version": "4.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "are-we-there-yet": "~1.1.2",
-            "console-control-strings": "~1.1.0",
-            "gauge": "~2.7.3",
-            "set-blocking": "~2.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "once": {
-          "version": "1.4.0",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "wrappy": "1"
-          }
-        },
-        "os-homedir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "osenv": {
-          "version": "0.1.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "os-homedir": "^1.0.0",
-            "os-tmpdir": "^1.0.0"
-          }
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "process-nextick-args": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "rc": {
-          "version": "1.2.7",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "deep-extend": "^0.5.1",
-            "ini": "~1.3.0",
-            "minimist": "^1.2.0",
-            "strip-json-comments": "~2.0.1"
-          },
-          "dependencies": {
-            "minimist": {
-              "version": "1.2.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            }
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "glob": "^7.0.5"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.1",
-          "bundled": true,
-          "dev": true
-        },
-        "safer-buffer": {
-          "version": "2.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "sax": {
-          "version": "1.2.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "semver": {
-          "version": "5.5.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "signal-exit": {
-          "version": "3.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "tar": {
-          "version": "4.4.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chownr": "^1.0.1",
-            "fs-minipass": "^1.2.5",
-            "minipass": "^2.2.4",
-            "minizlib": "^1.1.0",
-            "mkdirp": "^0.5.0",
-            "safe-buffer": "^5.1.1",
-            "yallist": "^3.0.2"
-          }
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "wide-align": {
-          "version": "1.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "string-width": "^1.0.2"
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true
-        },
-        "yallist": {
-          "version": "3.0.2",
-          "bundled": true,
-          "dev": true
-        }
-      }
-    },
-    "fstream": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
-      "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "inherits": "~2.0.0",
-        "mkdirp": ">=0.5 0",
-        "rimraf": "2"
-      }
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "gauge": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
-      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.0.3",
-        "console-control-strings": "^1.0.0",
-        "has-unicode": "^2.0.0",
-        "object-assign": "^4.1.0",
-        "signal-exit": "^3.0.0",
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wide-align": "^1.1.0"
-      }
-    },
-    "gaze": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
-      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "globule": "^1.0.0"
-      }
-    },
-    "get-caller-file": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
-      "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
-      "dev": true
-    },
-    "get-stdin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
-      "dev": true
-    },
-    "get-stream": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
-      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
-      "dev": true
-    },
-    "get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true
-    },
-    "getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "glob": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
-      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-base": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
-      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
-      "dev": true,
-      "requires": {
-        "glob-parent": "^2.0.0",
-        "is-glob": "^2.0.0"
-      },
-      "dependencies": {
-        "glob-parent": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
-          "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
-          "dev": true,
-          "requires": {
-            "is-glob": "^2.0.0"
-          }
-        },
-        "is-extglob": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        }
-      }
-    },
-    "glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-      "dev": true,
-      "requires": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      },
-      "dependencies": {
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
-      }
-    },
-    "globals": {
-      "version": "9.18.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
-      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
-      "dev": true
-    },
-    "globby": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
-      "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
-      "dev": true,
-      "requires": {
-        "array-union": "^1.0.1",
-        "dir-glob": "^2.0.0",
-        "glob": "^7.1.2",
-        "ignore": "^3.3.5",
-        "pify": "^3.0.0",
-        "slash": "^1.0.0"
-      }
-    },
-    "globule": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
-      "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "glob": "~7.1.1",
-        "lodash": "~4.17.10",
-        "minimatch": "~3.0.2"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.1.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
-      "dev": true
-    },
-    "grpc": {
-      "version": "1.11.3",
-      "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.11.3.tgz",
-      "integrity": "sha512-7fJ40USpnP7hxGK0uRoEhJz6unA5VUdwInfwAY2rK2+OVxdDJSdTZQ/8/M+1tW68pHZYgHvg2ohvJ+clhW3ANg==",
-      "requires": {
-        "lodash": "^4.15.0",
-        "nan": "^2.0.0",
-        "node-pre-gyp": "^0.10.0",
-        "protobufjs": "^5.0.0"
-      },
-      "dependencies": {
-        "abbrev": {
-          "version": "1.1.1",
-          "bundled": true
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "bundled": true
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "bundled": true
-        },
-        "are-we-there-yet": {
-          "version": "1.1.4",
-          "bundled": true,
-          "requires": {
-            "delegates": "^1.0.0",
-            "readable-stream": "^2.0.6"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.0",
-          "bundled": true
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "bundled": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "chownr": {
-          "version": "1.0.1",
-          "bundled": true
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "bundled": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "bundled": true
-        },
-        "console-control-strings": {
-          "version": "1.1.0",
-          "bundled": true
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "bundled": true
-        },
-        "debug": {
-          "version": "2.6.9",
-          "bundled": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "deep-extend": {
-          "version": "0.5.1",
-          "bundled": true
-        },
-        "delegates": {
-          "version": "1.0.0",
-          "bundled": true
-        },
-        "detect-libc": {
-          "version": "1.0.3",
-          "bundled": true
-        },
-        "fs-minipass": {
-          "version": "1.2.5",
-          "bundled": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "bundled": true
-        },
-        "gauge": {
-          "version": "2.7.4",
-          "bundled": true,
-          "requires": {
-            "aproba": "^1.0.3",
-            "console-control-strings": "^1.0.0",
-            "has-unicode": "^2.0.0",
-            "object-assign": "^4.1.0",
-            "signal-exit": "^3.0.0",
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wide-align": "^1.1.0"
-          }
-        },
-        "glob": {
-          "version": "7.1.2",
-          "bundled": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "has-unicode": {
-          "version": "2.0.1",
-          "bundled": true
-        },
-        "iconv-lite": {
-          "version": "0.4.19",
-          "bundled": true
-        },
-        "ignore-walk": {
-          "version": "3.0.1",
-          "bundled": true,
-          "requires": {
-            "minimatch": "^3.0.4"
-          }
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "bundled": true,
-          "requires": {
-            "once": "^1.3.0",
-            "wrappy": "1"
-          }
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "bundled": true
-        },
-        "ini": {
-          "version": "1.3.5",
-          "bundled": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "bundled": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "bundled": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "bundled": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "1.2.0",
-          "bundled": true
-        },
-        "minipass": {
-          "version": "2.2.4",
-          "bundled": true,
-          "requires": {
-            "safe-buffer": "^5.1.1",
-            "yallist": "^3.0.0"
-          }
-        },
-        "minizlib": {
-          "version": "1.1.0",
-          "bundled": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.1",
-          "bundled": true,
-          "requires": {
-            "minimist": "0.0.8"
-          },
-          "dependencies": {
-            "minimist": {
-              "version": "0.0.8",
-              "bundled": true
-            }
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "bundled": true
-        },
-        "needle": {
-          "version": "2.2.1",
-          "bundled": true,
-          "requires": {
-            "debug": "^2.1.2",
-            "iconv-lite": "^0.4.4",
-            "sax": "^1.2.4"
-          }
-        },
-        "node-pre-gyp": {
-          "version": "0.10.0",
-          "bundled": true,
-          "requires": {
-            "detect-libc": "^1.0.2",
-            "mkdirp": "^0.5.1",
-            "needle": "^2.2.0",
-            "nopt": "^4.0.1",
-            "npm-packlist": "^1.1.6",
-            "npmlog": "^4.0.2",
-            "rc": "^1.1.7",
-            "rimraf": "^2.6.1",
-            "semver": "^5.3.0",
-            "tar": "^4"
-          }
-        },
-        "nopt": {
-          "version": "4.0.1",
-          "bundled": true,
-          "requires": {
-            "abbrev": "1",
-            "osenv": "^0.1.4"
-          }
-        },
-        "npm-bundled": {
-          "version": "1.0.3",
-          "bundled": true
-        },
-        "npm-packlist": {
-          "version": "1.1.10",
-          "bundled": true,
-          "requires": {
-            "ignore-walk": "^3.0.1",
-            "npm-bundled": "^1.0.1"
-          }
-        },
-        "npmlog": {
-          "version": "4.1.2",
-          "bundled": true,
-          "requires": {
-            "are-we-there-yet": "~1.1.2",
-            "console-control-strings": "~1.1.0",
-            "gauge": "~2.7.3",
-            "set-blocking": "~2.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "bundled": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "bundled": true
-        },
-        "once": {
-          "version": "1.4.0",
-          "bundled": true,
-          "requires": {
-            "wrappy": "1"
-          }
-        },
-        "os-homedir": {
-          "version": "1.0.2",
-          "bundled": true
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "bundled": true
-        },
-        "osenv": {
-          "version": "0.1.5",
-          "bundled": true,
-          "requires": {
-            "os-homedir": "^1.0.0",
-            "os-tmpdir": "^1.0.0"
-          }
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "bundled": true
-        },
-        "process-nextick-args": {
-          "version": "2.0.0",
-          "bundled": true
-        },
-        "rc": {
-          "version": "1.2.7",
-          "bundled": true,
-          "requires": {
-            "deep-extend": "^0.5.1",
-            "ini": "~1.3.0",
-            "minimist": "^1.2.0",
-            "strip-json-comments": "~2.0.1"
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "bundled": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.2",
-          "bundled": true,
-          "requires": {
-            "glob": "^7.0.5"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.1",
-          "bundled": true
-        },
-        "sax": {
-          "version": "1.2.4",
-          "bundled": true
-        },
-        "semver": {
-          "version": "5.5.0",
-          "bundled": true
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "bundled": true
-        },
-        "signal-exit": {
-          "version": "3.0.2",
-          "bundled": true
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "bundled": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "bundled": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "bundled": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "bundled": true
-        },
-        "tar": {
-          "version": "4.4.2",
-          "bundled": true,
-          "requires": {
-            "chownr": "^1.0.1",
-            "fs-minipass": "^1.2.5",
-            "minipass": "^2.2.4",
-            "minizlib": "^1.1.0",
-            "mkdirp": "^0.5.0",
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.2"
-          },
-          "dependencies": {
-            "safe-buffer": {
-              "version": "5.1.2",
-              "bundled": true
-            }
-          }
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "bundled": true
-        },
-        "wide-align": {
-          "version": "1.1.2",
-          "bundled": true,
-          "requires": {
-            "string-width": "^1.0.2"
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "bundled": true
-        },
-        "yallist": {
-          "version": "3.0.2",
-          "bundled": true
-        }
-      }
-    },
-    "handle-thing": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
-      "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
-      "dev": true
-    },
-    "handlebars": {
-      "version": "4.0.11",
-      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
-      "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
-      "dev": true,
-      "requires": {
-        "async": "^1.4.0",
-        "optimist": "^0.6.1",
-        "source-map": "^0.4.4",
-        "uglify-js": "^2.6"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
-          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
-          "dev": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
-        },
-        "uglify-js": {
-          "version": "2.8.29",
-          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
-          "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "source-map": "~0.5.1",
-            "uglify-to-browserify": "~1.0.0",
-            "yargs": "~3.10.0"
-          },
-          "dependencies": {
-            "source-map": {
-              "version": "0.5.7",
-              "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-              "dev": true,
-              "optional": true
-            }
-          }
-        }
-      }
-    },
-    "har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
-      "dev": true
-    },
-    "har-validator": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
-      "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
-      "dev": true,
-      "requires": {
-        "ajv": "^5.1.0",
-        "har-schema": "^2.0.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "5.5.2",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
-          "dev": true,
-          "requires": {
-            "co": "^4.6.0",
-            "fast-deep-equal": "^1.0.0",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.3.0"
-          }
-        }
-      }
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "has-binary": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz",
-      "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=",
-      "dev": true,
-      "requires": {
-        "isarray": "0.0.1"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
-        }
-      }
-    },
-    "has-cors": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
-      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
-      "dev": true
-    },
-    "has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
-    },
-    "has-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
-      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
-      "dev": true
-    },
-    "has-unicode": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
-      "dev": true
-    },
-    "has-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
-      "requires": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "has-values": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "hash-base": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
-      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "hash.js": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.4.tgz",
-      "integrity": "sha512-A6RlQvvZEtFS5fLU43IDu0QUmBy+fDO9VMdTXvufKwIkt/rFfvICAViCax5fbDO4zdNzaC3/27ZhKUok5bAJyw==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "hawk": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
-      "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "boom": "2.x.x",
-        "cryptiles": "2.x.x",
-        "hoek": "2.x.x",
-        "sntp": "1.x.x"
-      }
-    },
-    "he": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
-      "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
-      "dev": true
-    },
-    "hmac-drbg": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
-      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
-      "dev": true,
-      "requires": {
-        "hash.js": "^1.0.3",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "hoek": {
-      "version": "2.16.3",
-      "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
-      "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
-      "dev": true
-    },
-    "hosted-git-info": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz",
-      "integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A==",
-      "dev": true
-    },
-    "hpack.js": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
-      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "obuf": "^1.0.0",
-        "readable-stream": "^2.0.1",
-        "wbuf": "^1.1.0"
-      }
-    },
-    "html-entities": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
-      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
-      "dev": true
-    },
-    "html-minifier": {
-      "version": "3.5.18",
-      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.18.tgz",
-      "integrity": "sha512-sczoq/9zeXiKZMj8tsQzHJE7EyjrpMHvblTLuh9o8h5923a6Ts5uQ/3YdY+xIqJYRjzHQPlrHjfjh0BtwPJG0g==",
-      "dev": true,
-      "requires": {
-        "camel-case": "3.0.x",
-        "clean-css": "4.1.x",
-        "commander": "2.16.x",
-        "he": "1.1.x",
-        "param-case": "2.1.x",
-        "relateurl": "0.2.x",
-        "uglify-js": "3.4.x"
-      }
-    },
-    "html-webpack-plugin": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
-      "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
-      "dev": true,
-      "requires": {
-        "html-minifier": "^3.2.3",
-        "loader-utils": "^0.2.16",
-        "lodash": "^4.17.3",
-        "pretty-error": "^2.0.2",
-        "tapable": "^1.0.0",
-        "toposort": "^1.0.0",
-        "util.promisify": "1.0.0"
-      },
-      "dependencies": {
-        "loader-utils": {
-          "version": "0.2.17",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
-          "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
-          "dev": true,
-          "requires": {
-            "big.js": "^3.1.3",
-            "emojis-list": "^2.0.0",
-            "json5": "^0.5.0",
-            "object-assign": "^4.0.1"
-          }
-        }
-      }
-    },
-    "htmlparser2": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
-      "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
-      "dev": true,
-      "requires": {
-        "domelementtype": "1",
-        "domhandler": "2.1",
-        "domutils": "1.1",
-        "readable-stream": "1.0"
-      },
-      "dependencies": {
-        "domutils": {
-          "version": "1.1.6",
-          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz",
-          "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
-          "dev": true,
-          "requires": {
-            "domelementtype": "1"
-          }
-        },
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
-        },
-        "readable-stream": {
-          "version": "1.0.34",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.1",
-            "isarray": "0.0.1",
-            "string_decoder": "~0.10.x"
-          }
-        },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
-          "dev": true
-        }
-      }
-    },
-    "http-deceiver": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
-      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
-      "dev": true
-    },
-    "http-errors": {
-      "version": "1.6.3",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
-      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
-      "dev": true,
-      "requires": {
-        "depd": "~1.1.2",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.1.0",
-        "statuses": ">= 1.4.0 < 2"
-      }
-    },
-    "http-parser-js": {
-      "version": "0.4.13",
-      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz",
-      "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc="
-    },
-    "http-proxy": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
-      "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
-      "dev": true,
-      "requires": {
-        "eventemitter3": "^3.0.0",
-        "follow-redirects": "^1.0.0",
-        "requires-port": "^1.0.0"
-      }
-    },
-    "http-proxy-middleware": {
-      "version": "0.18.0",
-      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
-      "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==",
-      "dev": true,
-      "requires": {
-        "http-proxy": "^1.16.2",
-        "is-glob": "^4.0.0",
-        "lodash": "^4.17.5",
-        "micromatch": "^3.1.9"
-      }
-    },
-    "http-signature": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
-      }
-    },
-    "https-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
-      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
-      "dev": true
-    },
-    "https-proxy-agent": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
-      "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
-      "dev": true,
-      "requires": {
-        "agent-base": "^4.1.0",
-        "debug": "^3.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "iconv-lite": {
-      "version": "0.4.19",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
-      "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
-    },
-    "ieee754": {
-      "version": "1.1.12",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
-      "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
-      "dev": true
-    },
-    "iferr": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
-      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
-      "dev": true
-    },
-    "ignore": {
-      "version": "3.3.10",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
-      "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
-      "dev": true
-    },
-    "image-size": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
-      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
-      "dev": true,
-      "optional": true
-    },
-    "immediate": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
-      "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
-      "dev": true
-    },
-    "import-local": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
-      "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==",
-      "dev": true,
-      "requires": {
-        "pkg-dir": "^2.0.0",
-        "resolve-cwd": "^2.0.0"
-      }
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
-    },
-    "in-publish": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
-      "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
-      "dev": true,
-      "optional": true
-    },
-    "indent-string": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
-      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
-      "dev": true,
-      "requires": {
-        "repeating": "^2.0.0"
-      }
-    },
-    "indexof": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
-      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
-      "dev": true
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-    },
-    "ini": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
-      "dev": true
-    },
-    "internal-ip": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz",
-      "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=",
-      "dev": true,
-      "requires": {
-        "meow": "^3.3.0"
-      }
-    },
-    "invariant": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
-      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
-      "dev": true,
-      "requires": {
-        "loose-envify": "^1.0.0"
-      }
-    },
-    "invert-kv": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
-      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
-      "dev": true
-    },
-    "ip": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
-      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
-      "dev": true
-    },
-    "ipaddr.js": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
-      "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=",
-      "dev": true
-    },
-    "is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true
-    },
-    "is-binary-path": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-      "dev": true,
-      "requires": {
-        "binary-extensions": "^1.0.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
-    },
-    "is-builtin-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
-      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
-      "dev": true,
-      "requires": {
-        "builtin-modules": "^1.0.0"
-      }
-    },
-    "is-callable": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
-      "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
-      "dev": true
-    },
-    "is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-date-object": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
-      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
-      "dev": true
-    },
-    "is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-      "dev": true,
-      "requires": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "is-directory": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
-      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
-      "dev": true
-    },
-    "is-dotfile": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
-      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
-      "dev": true
-    },
-    "is-equal-shallow": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
-      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
-      "dev": true,
-      "requires": {
-        "is-primitive": "^2.0.0"
-      }
-    },
-    "is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
-    },
-    "is-finite": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
-      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
-      "dev": true,
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
-    },
-    "is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-      "dev": true,
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
-    },
-    "is-glob": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
-      "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-path-cwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
-      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
-      "dev": true
-    },
-    "is-path-in-cwd": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
-      "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
-      "dev": true,
-      "requires": {
-        "is-path-inside": "^1.0.0"
-      }
-    },
-    "is-path-inside": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
-      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
-      "dev": true,
-      "requires": {
-        "path-is-inside": "^1.0.1"
-      }
-    },
-    "is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "is-posix-bracket": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
-      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
-      "dev": true
-    },
-    "is-primitive": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
-      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
-      "dev": true
-    },
-    "is-regex": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
-      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.1"
-      }
-    },
-    "is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
-    },
-    "is-symbol": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
-      "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
-      "dev": true
-    },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
-    },
-    "is-utf8": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
-      "dev": true
-    },
-    "is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true
-    },
-    "is-wsl": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
-      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
-      "dev": true
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
-    },
-    "isbinaryfile": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz",
-      "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=",
-      "dev": true
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true
-    },
-    "isomorphic-fetch": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
-      "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
-      "requires": {
-        "node-fetch": "^1.0.1",
-        "whatwg-fetch": ">=0.10.0"
-      }
-    },
-    "isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
-      "dev": true
-    },
-    "istanbul": {
-      "version": "0.4.5",
-      "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
-      "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
-      "dev": true,
-      "requires": {
-        "abbrev": "1.0.x",
-        "async": "1.x",
-        "escodegen": "1.8.x",
-        "esprima": "2.7.x",
-        "glob": "^5.0.15",
-        "handlebars": "^4.0.1",
-        "js-yaml": "3.x",
-        "mkdirp": "0.5.x",
-        "nopt": "3.x",
-        "once": "1.x",
-        "resolve": "1.1.x",
-        "supports-color": "^3.1.0",
-        "which": "^1.1.1",
-        "wordwrap": "^1.0.0"
-      },
-      "dependencies": {
-        "glob": {
-          "version": "5.0.15",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
-          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
-          "dev": true,
-          "requires": {
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "2 || 3",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
-          "dev": true
-        },
-        "resolve": {
-          "version": "1.1.7",
-          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
-          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
-          "dev": true,
-          "requires": {
-            "has-flag": "^1.0.0"
-          }
-        }
-      }
-    },
-    "istanbul-api": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz",
-      "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==",
-      "dev": true,
-      "requires": {
-        "async": "^2.1.4",
-        "compare-versions": "^3.1.0",
-        "fileset": "^2.0.2",
-        "istanbul-lib-coverage": "^1.2.0",
-        "istanbul-lib-hook": "^1.2.0",
-        "istanbul-lib-instrument": "^1.10.1",
-        "istanbul-lib-report": "^1.1.4",
-        "istanbul-lib-source-maps": "^1.2.4",
-        "istanbul-reports": "^1.3.0",
-        "js-yaml": "^3.7.0",
-        "mkdirp": "^0.5.1",
-        "once": "^1.4.0"
-      },
-      "dependencies": {
-        "async": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
-          "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.17.10"
-          }
-        }
-      }
-    },
-    "istanbul-instrumenter-loader": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz",
-      "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==",
-      "dev": true,
-      "requires": {
-        "convert-source-map": "^1.5.0",
-        "istanbul-lib-instrument": "^1.7.3",
-        "loader-utils": "^1.1.0",
-        "schema-utils": "^0.3.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "5.5.2",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
-          "dev": true,
-          "requires": {
-            "co": "^4.6.0",
-            "fast-deep-equal": "^1.0.0",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.3.0"
-          }
-        },
-        "schema-utils": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
-          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
-          "dev": true,
-          "requires": {
-            "ajv": "^5.0.0"
-          }
-        }
-      }
-    },
-    "istanbul-lib-coverage": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz",
-      "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==",
-      "dev": true
-    },
-    "istanbul-lib-hook": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz",
-      "integrity": "sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg==",
-      "dev": true,
-      "requires": {
-        "append-transform": "^1.0.0"
-      }
-    },
-    "istanbul-lib-instrument": {
-      "version": "1.10.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz",
-      "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==",
-      "dev": true,
-      "requires": {
-        "babel-generator": "^6.18.0",
-        "babel-template": "^6.16.0",
-        "babel-traverse": "^6.18.0",
-        "babel-types": "^6.18.0",
-        "babylon": "^6.18.0",
-        "istanbul-lib-coverage": "^1.2.0",
-        "semver": "^5.3.0"
-      }
-    },
-    "istanbul-lib-report": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz",
-      "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==",
-      "dev": true,
-      "requires": {
-        "istanbul-lib-coverage": "^1.2.0",
-        "mkdirp": "^0.5.1",
-        "path-parse": "^1.0.5",
-        "supports-color": "^3.1.2"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
-          "dev": true,
-          "requires": {
-            "has-flag": "^1.0.0"
-          }
-        }
-      }
-    },
-    "istanbul-lib-source-maps": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz",
-      "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==",
-      "dev": true,
-      "requires": {
-        "debug": "^3.1.0",
-        "istanbul-lib-coverage": "^1.2.0",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.6.1",
-        "source-map": "^0.5.3"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "istanbul-reports": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz",
-      "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==",
-      "dev": true,
-      "requires": {
-        "handlebars": "^4.0.3"
-      }
-    },
-    "jasmine": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz",
-      "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=",
-      "dev": true,
-      "requires": {
-        "exit": "^0.1.2",
-        "glob": "^7.0.6",
-        "jasmine-core": "~2.8.0"
-      },
-      "dependencies": {
-        "jasmine-core": {
-          "version": "2.8.0",
-          "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz",
-          "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=",
-          "dev": true
-        }
-      }
-    },
-    "jasmine-core": {
-      "version": "2.99.1",
-      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz",
-      "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=",
-      "dev": true
-    },
-    "jasmine-spec-reporter": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz",
-      "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==",
-      "dev": true,
-      "requires": {
-        "colors": "1.1.2"
-      }
-    },
-    "jasminewd2": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz",
-      "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=",
-      "dev": true
-    },
-    "js-base64": {
-      "version": "2.4.5",
-      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz",
-      "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==",
-      "dev": true,
-      "optional": true
-    },
-    "js-tokens": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
-      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
-      "dev": true
-    },
-    "js-yaml": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
-      "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
-      "dev": true,
-      "requires": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "dependencies": {
-        "esprima": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
-          "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
-          "dev": true
-        }
-      }
-    },
-    "jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
-      "dev": true,
-      "optional": true
-    },
-    "jsesc": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
-      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
-      "dev": true
-    },
-    "json-schema": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-      "dev": true
-    },
-    "json-schema-traverse": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
-      "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
-      "dev": true
-    },
-    "json-stable-stringify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
-      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "jsonify": "~0.0.0"
-      }
-    },
-    "json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-      "dev": true
-    },
-    "json3": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
-      "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
-      "dev": true
-    },
-    "json5": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
-      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
-      "dev": true
-    },
-    "jsonify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
-      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
-      "dev": true,
-      "optional": true
-    },
-    "jsprim": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.2.3",
-        "verror": "1.10.0"
-      }
-    },
-    "jszip": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz",
-      "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==",
-      "dev": true,
-      "requires": {
-        "core-js": "~2.3.0",
-        "es6-promise": "~3.0.2",
-        "lie": "~3.1.0",
-        "pako": "~1.0.2",
-        "readable-stream": "~2.0.6"
-      },
-      "dependencies": {
-        "core-js": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz",
-          "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=",
-          "dev": true
-        },
-        "es6-promise": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz",
-          "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=",
-          "dev": true
-        },
-        "process-nextick-args": {
-          "version": "1.0.7",
-          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
-          "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
-          "dev": true
-        },
-        "readable-stream": {
-          "version": "2.0.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
-          "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.1",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~1.0.6",
-            "string_decoder": "~0.10.x",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
-          "dev": true
-        }
-      }
-    },
-    "karma": {
-      "version": "1.7.1",
-      "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz",
-      "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==",
-      "dev": true,
-      "requires": {
-        "bluebird": "^3.3.0",
-        "body-parser": "^1.16.1",
-        "chokidar": "^1.4.1",
-        "colors": "^1.1.0",
-        "combine-lists": "^1.0.0",
-        "connect": "^3.6.0",
-        "core-js": "^2.2.0",
-        "di": "^0.0.1",
-        "dom-serialize": "^2.2.0",
-        "expand-braces": "^0.1.1",
-        "glob": "^7.1.1",
-        "graceful-fs": "^4.1.2",
-        "http-proxy": "^1.13.0",
-        "isbinaryfile": "^3.0.0",
-        "lodash": "^3.8.0",
-        "log4js": "^0.6.31",
-        "mime": "^1.3.4",
-        "minimatch": "^3.0.2",
-        "optimist": "^0.6.1",
-        "qjobs": "^1.1.4",
-        "range-parser": "^1.2.0",
-        "rimraf": "^2.6.0",
-        "safe-buffer": "^5.0.1",
-        "socket.io": "1.7.3",
-        "source-map": "^0.5.3",
-        "tmp": "0.0.31",
-        "useragent": "^2.1.12"
-      },
-      "dependencies": {
-        "anymatch": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
-          "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
-          "dev": true,
-          "requires": {
-            "micromatch": "^2.1.5",
-            "normalize-path": "^2.0.0"
-          }
-        },
-        "arr-diff": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
-          "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.0.1"
-          }
-        },
-        "array-unique": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
-          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
-          "dev": true
-        },
-        "braces": {
-          "version": "1.8.5",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
-          "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
-          "dev": true,
-          "requires": {
-            "expand-range": "^1.8.1",
-            "preserve": "^0.2.0",
-            "repeat-element": "^1.1.2"
-          }
-        },
-        "chokidar": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
-          "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
-          "dev": true,
-          "requires": {
-            "anymatch": "^1.3.0",
-            "async-each": "^1.0.0",
-            "fsevents": "^1.0.0",
-            "glob-parent": "^2.0.0",
-            "inherits": "^2.0.1",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^2.0.0",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.0.0"
-          }
-        },
-        "expand-brackets": {
-          "version": "0.1.5",
-          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
-          "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
-          "dev": true,
-          "requires": {
-            "is-posix-bracket": "^0.1.0"
-          }
-        },
-        "extglob": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
-          "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        },
-        "glob-parent": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
-          "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
-          "dev": true,
-          "requires": {
-            "is-glob": "^2.0.0"
-          }
-        },
-        "is-extglob": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        },
-        "lodash": {
-          "version": "3.10.1",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
-          "dev": true
-        },
-        "micromatch": {
-          "version": "2.3.11",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
-          "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^2.0.0",
-            "array-unique": "^0.2.1",
-            "braces": "^1.8.2",
-            "expand-brackets": "^0.1.4",
-            "extglob": "^0.3.1",
-            "filename-regex": "^2.0.0",
-            "is-extglob": "^1.0.0",
-            "is-glob": "^2.0.1",
-            "kind-of": "^3.0.2",
-            "normalize-path": "^2.0.1",
-            "object.omit": "^2.0.0",
-            "parse-glob": "^3.0.4",
-            "regex-cache": "^0.4.2"
-          }
-        }
-      }
-    },
-    "karma-chrome-launcher": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
-      "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==",
-      "dev": true,
-      "requires": {
-        "fs-access": "^1.0.0",
-        "which": "^1.2.1"
-      }
-    },
-    "karma-coverage-istanbul-reporter": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.1.tgz",
-      "integrity": "sha512-UcgrHkFehI5+ivMouD8NH/UOHiX4oCAtwaANylzPFdcAuD52fnCUuelacq2gh8tZ4ydhU3+xiXofSq7j5Ehygw==",
-      "dev": true,
-      "requires": {
-        "istanbul-api": "^1.3.1",
-        "minimatch": "^3.0.4"
-      }
-    },
-    "karma-jasmine": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz",
-      "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=",
-      "dev": true
-    },
-    "karma-jasmine-html-reporter": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz",
-      "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=",
-      "dev": true,
-      "requires": {
-        "karma-jasmine": "^1.0.2"
-      }
-    },
-    "karma-source-map-support": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz",
-      "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==",
-      "dev": true,
-      "requires": {
-        "source-map-support": "^0.5.5"
-      }
-    },
-    "killable": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz",
-      "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=",
-      "dev": true
-    },
-    "kind-of": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-      "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
-      "dev": true
-    },
-    "lazy-cache": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
-      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
-    },
-    "lcid": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
-      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
-      "dev": true,
-      "requires": {
-        "invert-kv": "^1.0.0"
-      }
-    },
-    "leb": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/leb/-/leb-0.3.0.tgz",
-      "integrity": "sha1-Mr7p+tFoMo1q6oUi2DP0GA7tHaM=",
-      "dev": true
-    },
-    "less": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/less/-/less-3.5.0.tgz",
-      "integrity": "sha512-fLbJGxtoCV2FTDGeXlUXXUZ8sgMej2c5u8om8inOZt5M3tzXqF/aS7W0txWhCN6iA6qPtPGGzj0sp/vd8ztl6Q==",
-      "dev": true,
-      "requires": {
-        "errno": "^0.1.1",
-        "graceful-fs": "^4.1.2",
-        "image-size": "~0.5.0",
-        "mime": "^1.4.1",
-        "mkdirp": "^0.5.0",
-        "promise": "^7.1.1",
-        "request": "^2.83.0",
-        "source-map": "~0.6.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "less-loader": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz",
-      "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==",
-      "dev": true,
-      "requires": {
-        "clone": "^2.1.1",
-        "loader-utils": "^1.1.0",
-        "pify": "^3.0.0"
-      }
-    },
-    "levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      }
-    },
-    "license-webpack-plugin": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.3.1.tgz",
-      "integrity": "sha512-NqAFodJdpBUuf1iD+Ij8hQvF0rCFKlO2KaieoQzAPhFgzLCtJnC7Z7x5gQbGNjoe++wOKAtAmwVEIBLqq2Yp1A==",
-      "dev": true,
-      "requires": {
-        "ejs": "^2.5.7"
-      }
-    },
-    "lie": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
-      "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=",
-      "dev": true,
-      "requires": {
-        "immediate": "~3.0.5"
-      }
-    },
-    "load-json-file": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
-      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
-    "loader-runner": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz",
-      "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=",
-      "dev": true
-    },
-    "loader-utils": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
-      "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
-      "dev": true,
-      "requires": {
-        "big.js": "^3.1.3",
-        "emojis-list": "^2.0.0",
-        "json5": "^0.5.0"
-      }
-    },
-    "locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-      "dev": true,
-      "requires": {
-        "p-locate": "^2.0.0",
-        "path-exists": "^3.0.0"
-      }
-    },
-    "lodash": {
-      "version": "4.17.10",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
-      "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
-    },
-    "lodash.assign": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
-      "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
-      "dev": true,
-      "optional": true
-    },
-    "lodash.clonedeep": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
-      "dev": true
-    },
-    "lodash.debounce": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
-      "dev": true
-    },
-    "lodash.mergewith": {
-      "version": "4.6.1",
-      "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
-      "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
-      "dev": true,
-      "optional": true
-    },
-    "lodash.tail": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
-      "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=",
-      "dev": true
-    },
-    "log-symbols": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
-      "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.0.1"
-      }
-    },
-    "log4js": {
-      "version": "0.6.38",
-      "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz",
-      "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "~1.0.2",
-        "semver": "~4.3.3"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
-        },
-        "readable-stream": {
-          "version": "1.0.34",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.1",
-            "isarray": "0.0.1",
-            "string_decoder": "~0.10.x"
-          }
-        },
-        "semver": {
-          "version": "4.3.6",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
-          "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
-          "dev": true
-        },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
-          "dev": true
-        }
-      }
-    },
-    "loglevel": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
-      "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
-      "dev": true
-    },
-    "loglevelnext": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz",
-      "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==",
-      "dev": true,
-      "requires": {
-        "es6-symbol": "^3.1.1",
-        "object.assign": "^4.1.0"
-      }
-    },
-    "long": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
-      "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s="
-    },
-    "longest": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
-      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
-    },
-    "loose-envify": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
-      "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
-      "dev": true,
-      "requires": {
-        "js-tokens": "^3.0.0"
-      }
-    },
-    "loud-rejection": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
-      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
-      "dev": true,
-      "requires": {
-        "currently-unhandled": "^0.4.1",
-        "signal-exit": "^3.0.0"
-      }
-    },
-    "lower-case": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
-      "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
-      "dev": true
-    },
-    "lru-cache": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
-      "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
-      "dev": true,
-      "requires": {
-        "pseudomap": "^1.0.2",
-        "yallist": "^2.1.2"
-      }
-    },
-    "make-dir": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
-      "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
-      "dev": true,
-      "requires": {
-        "pify": "^3.0.0"
-      }
-    },
-    "make-error": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz",
-      "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==",
-      "dev": true
-    },
-    "map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true
-    },
-    "map-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
-      "dev": true
-    },
-    "map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
-      "requires": {
-        "object-visit": "^1.0.0"
-      }
-    },
-    "math-random": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
-      "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
-      "dev": true
-    },
-    "md5.js": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
-      "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=",
-      "dev": true,
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
-    "media-typer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
-      "dev": true
-    },
-    "mem": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
-      "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
-      "dev": true,
-      "requires": {
-        "mimic-fn": "^1.0.0"
-      }
-    },
-    "memory-fs": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
-      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
-      "dev": true,
-      "requires": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "meow": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
-      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
-      "dev": true,
-      "requires": {
-        "camelcase-keys": "^2.0.0",
-        "decamelize": "^1.1.2",
-        "loud-rejection": "^1.0.0",
-        "map-obj": "^1.0.1",
-        "minimist": "^1.1.3",
-        "normalize-package-data": "^2.3.4",
-        "object-assign": "^4.0.1",
-        "read-pkg-up": "^1.0.1",
-        "redent": "^1.0.0",
-        "trim-newlines": "^1.0.0"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        }
-      }
-    },
-    "merge-descriptors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
-      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
-      "dev": true
-    },
-    "methods": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
-      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
-      "dev": true
-    },
-    "micromatch": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      }
-    },
-    "miller-rabin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
-      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      }
-    },
-    "mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-      "dev": true
-    },
-    "mime-db": {
-      "version": "1.33.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
-      "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
-      "dev": true
-    },
-    "mime-types": {
-      "version": "2.1.18",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
-      "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
-      "dev": true,
-      "requires": {
-        "mime-db": "~1.33.0"
-      }
-    },
-    "mimic-fn": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
-      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
-      "dev": true
-    },
-    "mini-css-extract-plugin": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.1.tgz",
-      "integrity": "sha512-XWuB3G61Rtasq/gLe7cp5cuozehE6hN+E4sxCamRR/WDiHTg+f7ZIAS024r8UJQffY+e2gGELXQZgQoFDfNDCg==",
-      "dev": true,
-      "requires": {
-        "@webpack-contrib/schema-utils": "^1.0.0-beta.0",
-        "loader-utils": "^1.1.0",
-        "webpack-sources": "^1.1.0"
-      }
-    },
-    "minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
-      "dev": true
-    },
-    "minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
-      "dev": true
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
-      "dev": true
-    },
-    "mississippi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
-      "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==",
-      "dev": true,
-      "requires": {
-        "concat-stream": "^1.5.0",
-        "duplexify": "^3.4.2",
-        "end-of-stream": "^1.1.0",
-        "flush-write-stream": "^1.0.0",
-        "from2": "^2.1.0",
-        "parallel-transform": "^1.1.0",
-        "pump": "^2.0.1",
-        "pumpify": "^1.3.3",
-        "stream-each": "^1.1.0",
-        "through2": "^2.0.0"
-      }
-    },
-    "mixin-deep": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
-      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "mixin-object": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
-      "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
-      "dev": true,
-      "requires": {
-        "for-in": "^0.1.3",
-        "is-extendable": "^0.1.1"
-      },
-      "dependencies": {
-        "for-in": {
-          "version": "0.1.8",
-          "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
-          "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=",
-          "dev": true
-        }
-      }
-    },
-    "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-      "dev": true,
-      "requires": {
-        "minimist": "0.0.8"
-      }
-    },
-    "move-concurrently": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
-      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.1.1",
-        "copy-concurrently": "^1.0.0",
-        "fs-write-stream-atomic": "^1.0.8",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.3"
-      }
-    },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "multicast-dns": {
-      "version": "6.2.3",
-      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
-      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
-      "dev": true,
-      "requires": {
-        "dns-packet": "^1.3.1",
-        "thunky": "^1.0.2"
-      }
-    },
-    "multicast-dns-service-types": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
-      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
-      "dev": true
-    },
-    "nan": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
-      "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
-    },
-    "nanomatch": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      }
-    },
-    "negotiator": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
-      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
-      "dev": true
-    },
-    "neo-async": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz",
-      "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==",
-      "dev": true
-    },
-    "next-tick": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
-      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
-      "dev": true
-    },
-    "no-case": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
-      "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
-      "dev": true,
-      "requires": {
-        "lower-case": "^1.1.1"
-      }
-    },
-    "node-fetch": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
-      "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
-      "requires": {
-        "encoding": "^0.1.11",
-        "is-stream": "^1.0.1"
-      }
-    },
-    "node-forge": {
-      "version": "0.7.5",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
-      "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==",
-      "dev": true
-    },
-    "node-gyp": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.7.0.tgz",
-      "integrity": "sha512-qDQE/Ft9xXP6zphwx4sD0t+VhwV7yFaloMpfbL2QnnDZcyaiakWlLdtFGGQfTAwpFHdpbRhRxVhIHN1OKAjgbg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "fstream": "^1.0.0",
-        "glob": "^7.0.3",
-        "graceful-fs": "^4.1.2",
-        "mkdirp": "^0.5.0",
-        "nopt": "2 || 3",
-        "npmlog": "0 || 1 || 2 || 3 || 4",
-        "osenv": "0",
-        "request": ">=2.9.0 <2.82.0",
-        "rimraf": "2",
-        "semver": "~5.3.0",
-        "tar": "^2.0.0",
-        "which": "1"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "4.11.8",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
-          "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "co": "^4.6.0",
-            "json-stable-stringify": "^1.0.1"
-          }
-        },
-        "assert-plus": {
-          "version": "0.2.0",
-          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
-          "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
-          "dev": true,
-          "optional": true
-        },
-        "aws-sign2": {
-          "version": "0.6.0",
-          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
-          "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
-          "dev": true,
-          "optional": true
-        },
-        "form-data": {
-          "version": "2.1.4",
-          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
-          "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "asynckit": "^0.4.0",
-            "combined-stream": "^1.0.5",
-            "mime-types": "^2.1.12"
-          }
-        },
-        "har-schema": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
-          "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
-          "dev": true,
-          "optional": true
-        },
-        "har-validator": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
-          "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ajv": "^4.9.1",
-            "har-schema": "^1.0.5"
-          }
-        },
-        "http-signature": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
-          "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "assert-plus": "^0.2.0",
-            "jsprim": "^1.2.2",
-            "sshpk": "^1.7.0"
-          }
-        },
-        "performance-now": {
-          "version": "0.2.0",
-          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
-          "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
-          "dev": true,
-          "optional": true
-        },
-        "qs": {
-          "version": "6.4.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
-          "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
-          "dev": true,
-          "optional": true
-        },
-        "request": {
-          "version": "2.81.0",
-          "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
-          "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "aws-sign2": "~0.6.0",
-            "aws4": "^1.2.1",
-            "caseless": "~0.12.0",
-            "combined-stream": "~1.0.5",
-            "extend": "~3.0.0",
-            "forever-agent": "~0.6.1",
-            "form-data": "~2.1.1",
-            "har-validator": "~4.2.1",
-            "hawk": "~3.1.3",
-            "http-signature": "~1.1.0",
-            "is-typedarray": "~1.0.0",
-            "isstream": "~0.1.2",
-            "json-stringify-safe": "~5.0.1",
-            "mime-types": "~2.1.7",
-            "oauth-sign": "~0.8.1",
-            "performance-now": "^0.2.0",
-            "qs": "~6.4.0",
-            "safe-buffer": "^5.0.1",
-            "stringstream": "~0.0.4",
-            "tough-cookie": "~2.3.0",
-            "tunnel-agent": "^0.6.0",
-            "uuid": "^3.0.0"
-          }
-        },
-        "semver": {
-          "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
-          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "node-libs-browser": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
-      "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
-      "dev": true,
-      "requires": {
-        "assert": "^1.1.1",
-        "browserify-zlib": "^0.2.0",
-        "buffer": "^4.3.0",
-        "console-browserify": "^1.1.0",
-        "constants-browserify": "^1.0.0",
-        "crypto-browserify": "^3.11.0",
-        "domain-browser": "^1.1.1",
-        "events": "^1.0.0",
-        "https-browserify": "^1.0.0",
-        "os-browserify": "^0.3.0",
-        "path-browserify": "0.0.0",
-        "process": "^0.11.10",
-        "punycode": "^1.2.4",
-        "querystring-es3": "^0.2.0",
-        "readable-stream": "^2.3.3",
-        "stream-browserify": "^2.0.1",
-        "stream-http": "^2.7.2",
-        "string_decoder": "^1.0.0",
-        "timers-browserify": "^2.0.4",
-        "tty-browserify": "0.0.0",
-        "url": "^0.11.0",
-        "util": "^0.10.3",
-        "vm-browserify": "0.0.4"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true
-        }
-      }
-    },
-    "node-sass": {
-      "version": "4.9.1",
-      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.1.tgz",
-      "integrity": "sha512-m6H1I6cHXsHsJ7BIWdnJsz9S9gVMyh+/H2cOTXgl2/2WqyyWlBcl4PHJcqrXo5RZVCfCUFqOtjPN0+0XbVHR5Q==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "async-foreach": "^0.1.3",
-        "chalk": "^1.1.1",
-        "cross-spawn": "^3.0.0",
-        "gaze": "^1.0.0",
-        "get-stdin": "^4.0.1",
-        "glob": "^7.0.3",
-        "in-publish": "^2.0.0",
-        "lodash.assign": "^4.2.0",
-        "lodash.clonedeep": "^4.3.2",
-        "lodash.mergewith": "^4.6.0",
-        "meow": "^3.7.0",
-        "mkdirp": "^0.5.1",
-        "nan": "^2.10.0",
-        "node-gyp": "^3.3.1",
-        "npmlog": "^4.0.0",
-        "request": "2.87.0",
-        "sass-graph": "^2.2.4",
-        "stdout-stream": "^1.4.0",
-        "true-case-path": "^1.0.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true,
-          "optional": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "nopt": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
-      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
-      "dev": true,
-      "requires": {
-        "abbrev": "1"
-      }
-    },
-    "normalize-package-data": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
-      "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^2.1.4",
-        "is-builtin-module": "^1.0.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "normalize-path": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-      "dev": true,
-      "requires": {
-        "remove-trailing-separator": "^1.0.1"
-      }
-    },
-    "normalize-range": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
-      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
-      "dev": true
-    },
-    "npm-package-arg": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz",
-      "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^2.6.0",
-        "osenv": "^0.1.5",
-        "semver": "^5.5.0",
-        "validate-npm-package-name": "^3.0.0"
-      }
-    },
-    "npm-registry-client": {
-      "version": "8.5.1",
-      "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.5.1.tgz",
-      "integrity": "sha512-7rjGF2eA7hKDidGyEWmHTiKfXkbrcQAsGL/Rh4Rt3x3YNRNHhwaTzVJfW3aNvvlhg4G62VCluif0sLCb/i51Hg==",
-      "dev": true,
-      "requires": {
-        "concat-stream": "^1.5.2",
-        "graceful-fs": "^4.1.6",
-        "normalize-package-data": "~1.0.1 || ^2.0.0",
-        "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0",
-        "npmlog": "2 || ^3.1.0 || ^4.0.0",
-        "once": "^1.3.3",
-        "request": "^2.74.0",
-        "retry": "^0.10.0",
-        "safe-buffer": "^5.1.1",
-        "semver": "2 >=2.2.1 || 3.x || 4 || 5",
-        "slide": "^1.1.3",
-        "ssri": "^5.2.4"
-      }
-    },
-    "npm-run-path": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
-      "dev": true,
-      "requires": {
-        "path-key": "^2.0.0"
-      }
-    },
-    "npmlog": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
-      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
-      "dev": true,
-      "requires": {
-        "are-we-there-yet": "~1.1.2",
-        "console-control-strings": "~1.1.0",
-        "gauge": "~2.7.3",
-        "set-blocking": "~2.0.0"
-      }
-    },
-    "nth-check": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
-      "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
-      "dev": true,
-      "requires": {
-        "boolbase": "~1.0.0"
-      }
-    },
-    "null-check": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
-      "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=",
-      "dev": true
-    },
-    "num2fraction": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
-      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
-      "dev": true
-    },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-      "dev": true
-    },
-    "oauth-sign": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
-      "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
-      "dev": true
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true
-    },
-    "object-component": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
-      "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
-      "dev": true
-    },
-    "object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
-      "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "object-keys": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
-      "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
-      "dev": true
-    },
-    "object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.assign": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
-      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.2",
-        "function-bind": "^1.1.1",
-        "has-symbols": "^1.0.0",
-        "object-keys": "^1.0.11"
-      }
-    },
-    "object.getownpropertydescriptors": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
-      "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.2",
-        "es-abstract": "^1.5.1"
-      }
-    },
-    "object.omit": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
-      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
-      "dev": true,
-      "requires": {
-        "for-own": "^0.1.4",
-        "is-extendable": "^0.1.1"
-      },
-      "dependencies": {
-        "for-own": {
-          "version": "0.1.5",
-          "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
-          "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
-          "dev": true,
-          "requires": {
-            "for-in": "^1.0.1"
-          }
-        }
-      }
-    },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "obuf": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
-      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
-      "dev": true
-    },
-    "on-finished": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
-      "dev": true,
-      "requires": {
-        "ee-first": "1.1.1"
-      }
-    },
-    "on-headers": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
-      "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
-      "dev": true
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "opn": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
-      "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
-      "dev": true,
-      "requires": {
-        "is-wsl": "^1.1.0"
-      }
-    },
-    "optimist": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
-      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
-      "dev": true,
-      "requires": {
-        "minimist": "~0.0.1",
-        "wordwrap": "~0.0.2"
-      },
-      "dependencies": {
-        "wordwrap": {
-          "version": "0.0.3",
-          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
-          "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
-          "dev": true
-        }
-      }
-    },
-    "optionator": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
-      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
-      "dev": true,
-      "requires": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.4",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "wordwrap": "~1.0.0"
-      }
-    },
-    "options": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
-      "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=",
-      "dev": true
-    },
-    "optjs": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz",
-      "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4="
-    },
-    "original": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz",
-      "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==",
-      "dev": true,
-      "requires": {
-        "url-parse": "~1.4.0"
-      }
-    },
-    "os-browserify": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
-      "dev": true
-    },
-    "os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-      "dev": true
-    },
-    "os-locale": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
-      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "lcid": "^1.0.0"
-      }
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true
-    },
-    "osenv": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
-      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
-      "dev": true,
-      "requires": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.0"
-      }
-    },
-    "p-finally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
-      "dev": true
-    },
-    "p-limit": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-      "dev": true,
-      "requires": {
-        "p-try": "^1.0.0"
-      }
-    },
-    "p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-      "dev": true,
-      "requires": {
-        "p-limit": "^1.1.0"
-      }
-    },
-    "p-map": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
-      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
-      "dev": true
-    },
-    "p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-      "dev": true
-    },
-    "pako": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
-      "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
-      "dev": true
-    },
-    "parallel-transform": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
-      "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
-      "dev": true,
-      "requires": {
-        "cyclist": "~0.2.2",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.1.5"
-      }
-    },
-    "param-case": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
-      "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
-      "dev": true,
-      "requires": {
-        "no-case": "^2.2.0"
-      }
-    },
-    "parse-asn1": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
-      "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
-      "dev": true,
-      "requires": {
-        "asn1.js": "^4.0.0",
-        "browserify-aes": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3"
-      }
-    },
-    "parse-glob": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
-      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
-      "dev": true,
-      "requires": {
-        "glob-base": "^0.3.0",
-        "is-dotfile": "^1.0.0",
-        "is-extglob": "^1.0.0",
-        "is-glob": "^2.0.0"
-      },
-      "dependencies": {
-        "is-extglob": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        }
-      }
-    },
-    "parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-      "dev": true,
-      "requires": {
-        "error-ex": "^1.2.0"
-      }
-    },
-    "parse5": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
-      "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
-      "dev": true
-    },
-    "parsejson": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz",
-      "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=",
-      "dev": true,
-      "requires": {
-        "better-assert": "~1.0.0"
-      }
-    },
-    "parseqs": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
-      "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
-      "dev": true,
-      "requires": {
-        "better-assert": "~1.0.0"
-      }
-    },
-    "parseuri": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
-      "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
-      "dev": true,
-      "requires": {
-        "better-assert": "~1.0.0"
-      }
-    },
-    "parseurl": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
-      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
-      "dev": true
-    },
-    "pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true
-    },
-    "path-browserify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
-      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
-      "dev": true
-    },
-    "path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
-      "dev": true
-    },
-    "path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-      "dev": true
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
-    },
-    "path-is-inside": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
-      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
-      "dev": true
-    },
-    "path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
-      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
-      "dev": true
-    },
-    "path-to-regexp": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
-      "dev": true
-    },
-    "path-type": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
-      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
-      "dev": true,
-      "requires": {
-        "pify": "^3.0.0"
-      }
-    },
-    "pbkdf2": {
-      "version": "3.0.16",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz",
-      "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==",
-      "dev": true,
-      "requires": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true
-    },
-    "pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-      "dev": true
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "dev": true
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dev": true,
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
-    "pkg-dir": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
-      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
-      "dev": true,
-      "requires": {
-        "find-up": "^2.1.0"
-      }
-    },
-    "portfinder": {
-      "version": "1.0.13",
-      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz",
-      "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=",
-      "dev": true,
-      "requires": {
-        "async": "^1.5.2",
-        "debug": "^2.2.0",
-        "mkdirp": "0.5.x"
-      }
-    },
-    "posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-      "dev": true
-    },
-    "postcss": {
-      "version": "6.0.23",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-      "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.4.1",
-        "source-map": "^0.6.1",
-        "supports-color": "^5.4.0"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "2.4.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
-          "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-import": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz",
-      "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==",
-      "dev": true,
-      "requires": {
-        "postcss": "^6.0.1",
-        "postcss-value-parser": "^3.2.3",
-        "read-cache": "^1.0.0",
-        "resolve": "^1.1.7"
-      }
-    },
-    "postcss-load-config": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz",
-      "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=",
-      "dev": true,
-      "requires": {
-        "cosmiconfig": "^2.1.0",
-        "object-assign": "^4.1.0",
-        "postcss-load-options": "^1.2.0",
-        "postcss-load-plugins": "^2.3.0"
-      }
-    },
-    "postcss-load-options": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz",
-      "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=",
-      "dev": true,
-      "requires": {
-        "cosmiconfig": "^2.1.0",
-        "object-assign": "^4.1.0"
-      }
-    },
-    "postcss-load-plugins": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz",
-      "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=",
-      "dev": true,
-      "requires": {
-        "cosmiconfig": "^2.1.1",
-        "object-assign": "^4.1.0"
-      }
-    },
-    "postcss-loader": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.5.tgz",
-      "integrity": "sha512-pV7kB5neJ0/1tZ8L1uGOBNTVBCSCXQoIsZMsrwvO8V2rKGa2tBl/f80GGVxow2jJnRJ2w1ocx693EKhZAb9Isg==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "^1.1.0",
-        "postcss": "^6.0.0",
-        "postcss-load-config": "^1.2.0",
-        "schema-utils": "^0.4.0"
-      }
-    },
-    "postcss-url": {
-      "version": "7.3.2",
-      "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz",
-      "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==",
-      "dev": true,
-      "requires": {
-        "mime": "^1.4.1",
-        "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.0",
-        "postcss": "^6.0.1",
-        "xxhashjs": "^0.2.1"
-      }
-    },
-    "postcss-value-parser": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
-      "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=",
-      "dev": true
-    },
-    "prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-      "dev": true
-    },
-    "preserve": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
-      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
-      "dev": true
-    },
-    "pretty-error": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
-      "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
-      "dev": true,
-      "requires": {
-        "renderkid": "^2.0.1",
-        "utila": "~0.4"
-      }
-    },
-    "process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
-      "dev": true
-    },
-    "process-nextick-args": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
-      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
-      "dev": true
-    },
-    "promise": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
-      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "asap": "~2.0.3"
-      }
-    },
-    "promise-inflight": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
-      "dev": true
-    },
-    "promise-polyfill": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz",
-      "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ=="
-    },
-    "protobufjs": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz",
-      "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==",
-      "requires": {
-        "ascli": "~1",
-        "bytebuffer": "~5",
-        "glob": "^7.0.5",
-        "yargs": "^3.10.0"
-      }
-    },
-    "protractor": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.3.2.tgz",
-      "integrity": "sha512-pw4uwwiy5lHZjIguxNpkEwJJa7hVz+bJsvaTI+IbXlfn2qXwzbF8eghW/RmrZwE2sGx82I8etb8lVjQ+JrjejA==",
-      "dev": true,
-      "requires": {
-        "@types/node": "^6.0.46",
-        "@types/q": "^0.0.32",
-        "@types/selenium-webdriver": "~2.53.39",
-        "blocking-proxy": "^1.0.0",
-        "chalk": "^1.1.3",
-        "glob": "^7.0.3",
-        "jasmine": "2.8.0",
-        "jasminewd2": "^2.1.0",
-        "optimist": "~0.6.0",
-        "q": "1.4.1",
-        "saucelabs": "^1.5.0",
-        "selenium-webdriver": "3.6.0",
-        "source-map-support": "~0.4.0",
-        "webdriver-js-extender": "^1.0.0",
-        "webdriver-manager": "^12.0.6"
-      },
-      "dependencies": {
-        "@types/node": {
-          "version": "6.0.113",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.113.tgz",
-          "integrity": "sha512-f9XXUWFqryzjkZA1EqFvJHSFyqyasV17fq8zCDIzbRV4ctL7RrJGKvG+lcex86Rjbzd1GrER9h9VmF5sSjV0BQ==",
-          "dev": true
-        },
-        "adm-zip": {
-          "version": "0.4.11",
-          "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz",
-          "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "del": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
-          "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
-          "dev": true,
-          "requires": {
-            "globby": "^5.0.0",
-            "is-path-cwd": "^1.0.0",
-            "is-path-in-cwd": "^1.0.0",
-            "object-assign": "^4.0.1",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0",
-            "rimraf": "^2.2.8"
-          }
-        },
-        "globby": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
-          "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
-          "dev": true,
-          "requires": {
-            "array-union": "^1.0.1",
-            "arrify": "^1.0.0",
-            "glob": "^7.0.3",
-            "object-assign": "^4.0.1",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        },
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        },
-        "source-map-support": {
-          "version": "0.4.18",
-          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
-          "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
-          "dev": true,
-          "requires": {
-            "source-map": "^0.5.6"
-          }
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true
-        },
-        "webdriver-manager": {
-          "version": "12.1.0",
-          "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz",
-          "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==",
-          "dev": true,
-          "requires": {
-            "adm-zip": "^0.4.9",
-            "chalk": "^1.1.1",
-            "del": "^2.2.0",
-            "glob": "^7.0.3",
-            "ini": "^1.3.4",
-            "minimist": "^1.2.0",
-            "q": "^1.4.1",
-            "request": "^2.87.0",
-            "rimraf": "^2.5.2",
-            "semver": "^5.3.0",
-            "xml2js": "^0.4.17"
-          }
-        }
-      }
-    },
-    "proxy-addr": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
-      "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
-      "dev": true,
-      "requires": {
-        "forwarded": "~0.1.2",
-        "ipaddr.js": "1.6.0"
-      }
-    },
-    "prr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
-      "dev": true
-    },
-    "pseudomap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
-      "dev": true
-    },
-    "public-encrypt": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz",
-      "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "parse-asn1": "^5.0.0",
-        "randombytes": "^2.0.1"
-      }
-    },
-    "pump": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
-      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "pumpify": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
-      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
-      "dev": true,
-      "requires": {
-        "duplexify": "^3.6.0",
-        "inherits": "^2.0.3",
-        "pump": "^2.0.0"
-      }
-    },
-    "punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true
-    },
-    "q": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
-      "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
-      "dev": true
-    },
-    "qjobs": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
-      "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
-      "dev": true
-    },
-    "qs": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
-      "dev": true
-    },
-    "querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
-      "dev": true
-    },
-    "querystring-es3": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
-      "dev": true
-    },
-    "querystringify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz",
-      "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==",
-      "dev": true
-    },
-    "randomatic": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
-      "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
-      "dev": true,
-      "requires": {
-        "is-number": "^4.0.0",
-        "kind-of": "^6.0.0",
-        "math-random": "^1.0.1"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
-          "dev": true
-        }
-      }
-    },
-    "randombytes": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
-      "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "randomfill": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
-      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
-      "dev": true,
-      "requires": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "range-parser": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
-      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
-      "dev": true
-    },
-    "raw-body": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
-      "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
-      "dev": true,
-      "requires": {
-        "bytes": "3.0.0",
-        "http-errors": "1.6.2",
-        "iconv-lite": "0.4.19",
-        "unpipe": "1.0.0"
-      },
-      "dependencies": {
-        "depd": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
-          "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
-          "dev": true
-        },
-        "http-errors": {
-          "version": "1.6.2",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
-          "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
-          "dev": true,
-          "requires": {
-            "depd": "1.1.1",
-            "inherits": "2.0.3",
-            "setprototypeof": "1.0.3",
-            "statuses": ">= 1.3.1 < 2"
-          }
-        },
-        "setprototypeof": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
-          "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
-          "dev": true
-        }
-      }
-    },
-    "raw-loader": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
-      "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=",
-      "dev": true
-    },
-    "read-cache": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
-      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
-      "dev": true,
-      "requires": {
-        "pify": "^2.3.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
-    "read-pkg": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
-      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
-      "dev": true,
-      "requires": {
-        "load-json-file": "^1.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^1.0.0"
-      },
-      "dependencies": {
-        "path-type": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
-          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
-    "read-pkg-up": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
-      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
-      "dev": true,
-      "requires": {
-        "find-up": "^1.0.0",
-        "read-pkg": "^1.0.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
-          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
-          "dev": true,
-          "requires": {
-            "path-exists": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "path-exists": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
-          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
-          "dev": true,
-          "requires": {
-            "pinkie-promise": "^2.0.0"
-          }
-        }
-      }
-    },
-    "readable-stream": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-      "dev": true,
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "readdirp": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
-      "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "minimatch": "^3.0.2",
-        "readable-stream": "^2.0.2",
-        "set-immediate-shim": "^1.0.1"
-      }
-    },
-    "redent": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
-      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
-      "dev": true,
-      "requires": {
-        "indent-string": "^2.1.0",
-        "strip-indent": "^1.0.1"
-      }
-    },
-    "reflect-metadata": {
-      "version": "0.1.12",
-      "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz",
-      "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==",
-      "dev": true
-    },
-    "regenerate": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
-      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
-      "dev": true
-    },
-    "regenerator-runtime": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
-      "dev": true
-    },
-    "regex-cache": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
-      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
-      "dev": true,
-      "requires": {
-        "is-equal-shallow": "^0.1.3"
-      }
-    },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "regexpu-core": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
-      "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
-      "dev": true,
-      "requires": {
-        "regenerate": "^1.2.1",
-        "regjsgen": "^0.2.0",
-        "regjsparser": "^0.1.4"
-      }
-    },
-    "regjsgen": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
-      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
-      "dev": true
-    },
-    "regjsparser": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
-      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
-      "dev": true,
-      "requires": {
-        "jsesc": "~0.5.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
-          "dev": true
-        }
-      }
-    },
-    "relateurl": {
-      "version": "0.2.7",
-      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
-      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
-      "dev": true
-    },
-    "remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
-      "dev": true
-    },
-    "renderkid": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz",
-      "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=",
-      "dev": true,
-      "requires": {
-        "css-select": "^1.1.0",
-        "dom-converter": "~0.1",
-        "htmlparser2": "~3.3.0",
-        "strip-ansi": "^3.0.0",
-        "utila": "~0.3"
-      },
-      "dependencies": {
-        "utila": {
-          "version": "0.3.3",
-          "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
-          "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
-          "dev": true
-        }
-      }
-    },
-    "repeat-element": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
-      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
-      "dev": true
-    },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
-    },
-    "repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-      "dev": true,
-      "requires": {
-        "is-finite": "^1.0.0"
-      }
-    },
-    "request": {
-      "version": "2.87.0",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
-      "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
-      "dev": true,
-      "requires": {
-        "aws-sign2": "~0.7.0",
-        "aws4": "^1.6.0",
-        "caseless": "~0.12.0",
-        "combined-stream": "~1.0.5",
-        "extend": "~3.0.1",
-        "forever-agent": "~0.6.1",
-        "form-data": "~2.3.1",
-        "har-validator": "~5.0.3",
-        "http-signature": "~1.2.0",
-        "is-typedarray": "~1.0.0",
-        "isstream": "~0.1.2",
-        "json-stringify-safe": "~5.0.1",
-        "mime-types": "~2.1.17",
-        "oauth-sign": "~0.8.2",
-        "performance-now": "^2.1.0",
-        "qs": "~6.5.1",
-        "safe-buffer": "^5.1.1",
-        "tough-cookie": "~2.3.3",
-        "tunnel-agent": "^0.6.0",
-        "uuid": "^3.1.0"
-      }
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true
-    },
-    "require-from-string": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz",
-      "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=",
-      "dev": true
-    },
-    "require-main-filename": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
-      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
-      "dev": true
-    },
-    "requires-port": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
-      "dev": true
-    },
-    "resolve": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
-      "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
-      "dev": true,
-      "requires": {
-        "path-parse": "^1.0.5"
-      }
-    },
-    "resolve-cwd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
-      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
-      "dev": true,
-      "requires": {
-        "resolve-from": "^3.0.0"
-      }
-    },
-    "resolve-from": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
-      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
-      "dev": true
-    },
-    "resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-      "dev": true
-    },
-    "ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true
-    },
-    "retry": {
-      "version": "0.10.1",
-      "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
-      "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=",
-      "dev": true
-    },
-    "right-align": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
-      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
-      "requires": {
-        "align-text": "^0.1.1"
-      }
-    },
-    "rimraf": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
-      "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
-      "dev": true,
-      "requires": {
-        "glob": "^7.0.5"
-      }
-    },
-    "ripemd160": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
-      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
-      "dev": true,
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
-    "run-queue": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
-      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.1.1"
-      }
-    },
-    "rxjs": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz",
-      "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "dev": true,
-      "requires": {
-        "ret": "~0.1.10"
-      }
-    },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
-    },
-    "sass-graph": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
-      "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "glob": "^7.0.0",
-        "lodash": "^4.0.0",
-        "scss-tokenizer": "^0.2.3",
-        "yargs": "^7.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
-          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
-          "dev": true,
-          "optional": true
-        },
-        "cliui": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-          "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wrap-ansi": "^2.0.0"
-          }
-        },
-        "y18n": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
-          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
-          "dev": true,
-          "optional": true
-        },
-        "yargs": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
-          "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "camelcase": "^3.0.0",
-            "cliui": "^3.2.0",
-            "decamelize": "^1.1.1",
-            "get-caller-file": "^1.0.1",
-            "os-locale": "^1.4.0",
-            "read-pkg-up": "^1.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^1.0.1",
-            "set-blocking": "^2.0.0",
-            "string-width": "^1.0.2",
-            "which-module": "^1.0.0",
-            "y18n": "^3.2.1",
-            "yargs-parser": "^5.0.0"
-          }
-        }
-      }
-    },
-    "sass-loader": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.0.3.tgz",
-      "integrity": "sha512-iaSFtQcGo4SSgDw5Aes5p4VTrA5jCGSA7sGmhPIcOloBlgI1VktM2MUrk2IHHjbNagckXlPz+HWq1vAAPrcYxA==",
-      "dev": true,
-      "requires": {
-        "clone-deep": "^2.0.1",
-        "loader-utils": "^1.0.1",
-        "lodash.tail": "^4.1.1",
-        "neo-async": "^2.5.0",
-        "pify": "^3.0.0"
-      }
-    },
-    "saucelabs": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz",
-      "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==",
-      "dev": true,
-      "requires": {
-        "https-proxy-agent": "^2.2.1"
-      }
-    },
-    "sax": {
-      "version": "0.5.8",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
-      "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=",
-      "dev": true
-    },
-    "schema-utils": {
-      "version": "0.4.5",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz",
-      "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.1.0",
-        "ajv-keywords": "^3.1.0"
-      }
-    },
-    "scss-tokenizer": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
-      "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "js-base64": "^2.1.8",
-        "source-map": "^0.4.2"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
-          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
-        }
-      }
-    },
-    "select-hose": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
-      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
-      "dev": true
-    },
-    "selenium-webdriver": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz",
-      "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==",
-      "dev": true,
-      "requires": {
-        "jszip": "^3.1.3",
-        "rimraf": "^2.5.4",
-        "tmp": "0.0.30",
-        "xml2js": "^0.4.17"
-      },
-      "dependencies": {
-        "tmp": {
-          "version": "0.0.30",
-          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz",
-          "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=",
-          "dev": true,
-          "requires": {
-            "os-tmpdir": "~1.0.1"
-          }
-        }
-      }
-    },
-    "selfsigned": {
-      "version": "1.10.3",
-      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz",
-      "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==",
-      "dev": true,
-      "requires": {
-        "node-forge": "0.7.5"
-      }
-    },
-    "semver": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
-      "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
-      "dev": true
-    },
-    "semver-dsl": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz",
-      "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=",
-      "dev": true,
-      "requires": {
-        "semver": "^5.3.0"
-      }
-    },
-    "semver-intersect": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz",
-      "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=",
-      "dev": true,
-      "requires": {
-        "semver": "^5.0.0"
-      }
-    },
-    "send": {
-      "version": "0.16.2",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
-      "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
-      "dev": true,
-      "requires": {
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "destroy": "~1.0.4",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "fresh": "0.5.2",
-        "http-errors": "~1.6.2",
-        "mime": "1.4.1",
-        "ms": "2.0.0",
-        "on-finished": "~2.3.0",
-        "range-parser": "~1.2.0",
-        "statuses": "~1.4.0"
-      },
-      "dependencies": {
-        "mime": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
-          "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
-          "dev": true
-        }
-      }
-    },
-    "serialize-javascript": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz",
-      "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==",
-      "dev": true
-    },
-    "serve-index": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
-      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.4",
-        "batch": "0.6.1",
-        "debug": "2.6.9",
-        "escape-html": "~1.0.3",
-        "http-errors": "~1.6.2",
-        "mime-types": "~2.1.17",
-        "parseurl": "~1.3.2"
-      }
-    },
-    "serve-static": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
-      "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
-      "dev": true,
-      "requires": {
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.2",
-        "send": "0.16.2"
-      }
-    },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
-    },
-    "set-immediate-shim": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
-      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
-      "dev": true
-    },
-    "set-value": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
-      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "setimmediate": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
-      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
-      "dev": true
-    },
-    "setprototypeof": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
-      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
-      "dev": true
-    },
-    "sha.js": {
-      "version": "2.4.11",
-      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
-      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "shallow-clone": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
-      "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
-      "dev": true,
-      "requires": {
-        "is-extendable": "^0.1.1",
-        "kind-of": "^5.0.0",
-        "mixin-object": "^2.0.1"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-      "dev": true,
-      "requires": {
-        "shebang-regex": "^1.0.0"
-      }
-    },
-    "shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-      "dev": true
-    },
-    "signal-exit": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
-      "dev": true
-    },
-    "silent-error": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz",
-      "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.2.0"
-      }
-    },
-    "slash": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
-      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
-      "dev": true
-    },
-    "slide": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
-      "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
-      "dev": true
-    },
-    "snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
-      "requires": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.2.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "sntp": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
-      "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "hoek": "2.x.x"
-      }
-    },
-    "socket.io": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz",
-      "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=",
-      "dev": true,
-      "requires": {
-        "debug": "2.3.3",
-        "engine.io": "1.8.3",
-        "has-binary": "0.1.7",
-        "object-assign": "4.1.0",
-        "socket.io-adapter": "0.5.0",
-        "socket.io-client": "1.7.3",
-        "socket.io-parser": "2.3.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.3.3",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
-          "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
-          "dev": true,
-          "requires": {
-            "ms": "0.7.2"
-          }
-        },
-        "ms": {
-          "version": "0.7.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
-          "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
-          "dev": true
-        },
-        "object-assign": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz",
-          "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=",
-          "dev": true
-        }
-      }
-    },
-    "socket.io-adapter": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz",
-      "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=",
-      "dev": true,
-      "requires": {
-        "debug": "2.3.3",
-        "socket.io-parser": "2.3.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.3.3",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
-          "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
-          "dev": true,
-          "requires": {
-            "ms": "0.7.2"
-          }
-        },
-        "ms": {
-          "version": "0.7.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
-          "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
-          "dev": true
-        }
-      }
-    },
-    "socket.io-client": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz",
-      "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=",
-      "dev": true,
-      "requires": {
-        "backo2": "1.0.2",
-        "component-bind": "1.0.0",
-        "component-emitter": "1.2.1",
-        "debug": "2.3.3",
-        "engine.io-client": "1.8.3",
-        "has-binary": "0.1.7",
-        "indexof": "0.0.1",
-        "object-component": "0.0.3",
-        "parseuri": "0.0.5",
-        "socket.io-parser": "2.3.1",
-        "to-array": "0.1.4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.3.3",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
-          "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
-          "dev": true,
-          "requires": {
-            "ms": "0.7.2"
-          }
-        },
-        "ms": {
-          "version": "0.7.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
-          "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
-          "dev": true
-        }
-      }
-    },
-    "socket.io-parser": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz",
-      "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=",
-      "dev": true,
-      "requires": {
-        "component-emitter": "1.1.2",
-        "debug": "2.2.0",
-        "isarray": "0.0.1",
-        "json3": "3.3.2"
-      },
-      "dependencies": {
-        "component-emitter": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz",
-          "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=",
-          "dev": true
-        },
-        "debug": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
-          "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
-          "dev": true,
-          "requires": {
-            "ms": "0.7.1"
-          }
-        },
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
-        },
-        "ms": {
-          "version": "0.7.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
-          "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
-          "dev": true
-        }
-      }
-    },
-    "sockjs": {
-      "version": "0.3.19",
-      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
-      "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
-      "dev": true,
-      "requires": {
-        "faye-websocket": "^0.10.0",
-        "uuid": "^3.0.1"
-      }
-    },
-    "sockjs-client": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz",
-      "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.6.6",
-        "eventsource": "0.1.6",
-        "faye-websocket": "~0.11.0",
-        "inherits": "^2.0.1",
-        "json3": "^3.3.2",
-        "url-parse": "^1.1.8"
-      },
-      "dependencies": {
-        "faye-websocket": {
-          "version": "0.11.1",
-          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
-          "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
-          "dev": true,
-          "requires": {
-            "websocket-driver": ">=0.5.1"
-          }
-        }
-      }
-    },
-    "source-list-map": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz",
-      "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==",
-      "dev": true
-    },
-    "source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true
-    },
-    "source-map-resolve": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
-      "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
-      "dev": true,
-      "requires": {
-        "atob": "^2.1.1",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "source-map-support": {
-      "version": "0.5.6",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz",
-      "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "source-map-url": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-      "dev": true
-    },
-    "spdx-correct": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
-      "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
-      "dev": true,
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-exceptions": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
-      "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
-      "dev": true
-    },
-    "spdx-expression-parse": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
-      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
-      "dev": true,
-      "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-license-ids": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
-      "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
-      "dev": true
-    },
-    "spdy": {
-      "version": "3.4.7",
-      "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
-      "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.6.8",
-        "handle-thing": "^1.2.5",
-        "http-deceiver": "^1.2.7",
-        "safe-buffer": "^5.0.1",
-        "select-hose": "^2.0.0",
-        "spdy-transport": "^2.0.18"
-      }
-    },
-    "spdy-transport": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz",
-      "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==",
-      "dev": true,
-      "requires": {
-        "debug": "^2.6.8",
-        "detect-node": "^2.0.3",
-        "hpack.js": "^2.1.6",
-        "obuf": "^1.1.1",
-        "readable-stream": "^2.2.9",
-        "safe-buffer": "^5.0.1",
-        "wbuf": "^1.7.2"
-      }
-    },
-    "split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.0"
-      }
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "sshpk": {
-      "version": "1.14.2",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
-      "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
-      "dev": true,
-      "requires": {
-        "asn1": "~0.2.3",
-        "assert-plus": "^1.0.0",
-        "bcrypt-pbkdf": "^1.0.0",
-        "dashdash": "^1.12.0",
-        "ecc-jsbn": "~0.1.1",
-        "getpass": "^0.1.1",
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.0.2",
-        "tweetnacl": "~0.14.0"
-      }
-    },
-    "ssri": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
-      "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
-      "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
-    "stats-webpack-plugin": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.6.2.tgz",
-      "integrity": "sha1-LFlJtTHgf4eojm6k3PrFOqjHWis=",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.17.4"
-      }
-    },
-    "statuses": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-      "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
-      "dev": true
-    },
-    "stdout-stream": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz",
-      "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "stream-browserify": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
-      "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
-      "dev": true,
-      "requires": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "stream-each": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz",
-      "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "stream-http": {
-      "version": "2.8.3",
-      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
-      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
-      "dev": true,
-      "requires": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.3.6",
-        "to-arraybuffer": "^1.0.0",
-        "xtend": "^4.0.0"
-      }
-    },
-    "stream-shift": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
-      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
-      "dev": true
-    },
-    "string-width": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-      "dev": true,
-      "requires": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      }
-    },
-    "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "stringstream": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz",
-      "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==",
-      "dev": true,
-      "optional": true
-    },
-    "strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "strip-bom": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
-      "dev": true,
-      "requires": {
-        "is-utf8": "^0.2.0"
-      }
-    },
-    "strip-eof": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
-      "dev": true
-    },
-    "strip-indent": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
-      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
-      "dev": true,
-      "requires": {
-        "get-stdin": "^4.0.1"
-      }
-    },
-    "style-loader": {
-      "version": "0.21.0",
-      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz",
-      "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "^1.1.0",
-        "schema-utils": "^0.4.5"
-      }
-    },
-    "stylus": {
-      "version": "0.54.5",
-      "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz",
-      "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=",
-      "dev": true,
-      "requires": {
-        "css-parse": "1.7.x",
-        "debug": "*",
-        "glob": "7.0.x",
-        "mkdirp": "0.5.x",
-        "sax": "0.5.x",
-        "source-map": "0.1.x"
-      },
-      "dependencies": {
-        "glob": {
-          "version": "7.0.6",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
-          "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.2",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "source-map": {
-          "version": "0.1.43",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
-          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
-          "dev": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
-        }
-      }
-    },
-    "stylus-loader": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz",
-      "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "^1.0.2",
-        "lodash.clonedeep": "^4.5.0",
-        "when": "~3.6.x"
-      }
-    },
-    "supports-color": {
-      "version": "5.4.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
-      "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
-      "dev": true,
-      "requires": {
-        "has-flag": "^3.0.0"
-      }
-    },
-    "symbol-observable": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
-      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
-      "dev": true
-    },
-    "tapable": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz",
-      "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==",
-      "dev": true
-    },
-    "tar": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
-      "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "block-stream": "*",
-        "fstream": "^1.0.2",
-        "inherits": "2"
-      }
-    },
-    "text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "dev": true
-    },
-    "through2": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
-      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.1.5",
-        "xtend": "~4.0.1"
-      }
-    },
-    "thunky": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz",
-      "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=",
-      "dev": true
-    },
-    "timers-browserify": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
-      "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
-      "dev": true,
-      "requires": {
-        "setimmediate": "^1.0.4"
-      }
-    },
-    "tmp": {
-      "version": "0.0.31",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz",
-      "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=",
-      "dev": true,
-      "requires": {
-        "os-tmpdir": "~1.0.1"
-      }
-    },
-    "to-array": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
-      "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
-      "dev": true
-    },
-    "to-arraybuffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
-      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
-      "dev": true
-    },
-    "to-fast-properties": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
-      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
-      "dev": true
-    },
-    "to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      }
-    },
-    "toposort": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
-      "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
-      "dev": true
-    },
-    "tough-cookie": {
-      "version": "2.3.4",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
-      "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
-      "dev": true,
-      "requires": {
-        "punycode": "^1.4.1"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true
-        }
-      }
-    },
-    "tree-kill": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz",
-      "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==",
-      "dev": true
-    },
-    "trim-newlines": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
-      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
-      "dev": true
-    },
-    "trim-right": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
-      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
-      "dev": true
-    },
-    "true-case-path": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz",
-      "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "glob": "^6.0.4"
-      },
-      "dependencies": {
-        "glob": {
-          "version": "6.0.4",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
-          "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "2 || 3",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        }
-      }
-    },
-    "ts-node": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-5.0.1.tgz",
-      "integrity": "sha512-XK7QmDcNHVmZkVtkiwNDWiERRHPyU8nBqZB1+iv2UhOG0q3RQ9HsZ2CMqISlFbxjrYFGfG2mX7bW4dAyxBVzUw==",
-      "dev": true,
-      "requires": {
-        "arrify": "^1.0.0",
-        "chalk": "^2.3.0",
-        "diff": "^3.1.0",
-        "make-error": "^1.1.1",
-        "minimist": "^1.2.0",
-        "mkdirp": "^0.5.1",
-        "source-map-support": "^0.5.3",
-        "yn": "^2.0.0"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "2.4.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
-          "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        }
-      }
-    },
-    "tsickle": {
-      "version": "0.29.0",
-      "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.29.0.tgz",
-      "integrity": "sha512-JpID0Lv8/irRtPmqJJxb5fCwfZhjZeKmav9Zna7UjqVuJoSbI49Wue/c2PPybX1SbRrjl7bbI/JsCl0dSUJygA==",
-      "dev": true,
-      "requires": {
-        "minimist": "^1.2.0",
-        "mkdirp": "^0.5.1",
-        "source-map": "^0.6.0",
-        "source-map-support": "^0.5.0"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "tslib": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
-      "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
-    },
-    "tslint": {
-      "version": "5.9.1",
-      "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz",
-      "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "^6.22.0",
-        "builtin-modules": "^1.1.1",
-        "chalk": "^2.3.0",
-        "commander": "^2.12.1",
-        "diff": "^3.2.0",
-        "glob": "^7.1.1",
-        "js-yaml": "^3.7.0",
-        "minimatch": "^3.0.4",
-        "resolve": "^1.3.2",
-        "semver": "^5.3.0",
-        "tslib": "^1.8.0",
-        "tsutils": "^2.12.1"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "2.4.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
-          "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        }
-      }
-    },
-    "tsutils": {
-      "version": "2.27.2",
-      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.2.tgz",
-      "integrity": "sha512-qf6rmT84TFMuxAKez2pIfR8UCai49iQsfB7YWVjV1bKpy/d0PWT5rEOSM6La9PiHZ0k1RRZQiwVdVJfQ3BPHgg==",
-      "dev": true,
-      "requires": {
-        "tslib": "^1.8.1"
-      }
-    },
-    "tty-browserify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
-      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
-      "dev": true
-    },
-    "tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
-      "dev": true,
-      "optional": true
-    },
-    "type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "~1.1.2"
-      }
-    },
-    "type-is": {
-      "version": "1.6.16",
-      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
-      "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
-      "dev": true,
-      "requires": {
-        "media-typer": "0.3.0",
-        "mime-types": "~2.1.18"
-      }
-    },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
-      "dev": true
-    },
-    "typescript": {
-      "version": "2.7.2",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz",
-      "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==",
-      "dev": true
-    },
-    "uglify-js": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.3.tgz",
-      "integrity": "sha512-RbOgGjF04sFUNSi8xGOTB9AmtVmMmVVAL5a7lxIgJ8urejJen+priq0ooRIHHa8AXI/dSvNF9yYMz9OP4PhybQ==",
-      "dev": true,
-      "requires": {
-        "commander": "~2.16.0",
-        "source-map": "~0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "uglify-to-browserify": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
-      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
-      "dev": true,
-      "optional": true
-    },
-    "uglifyjs-webpack-plugin": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz",
-      "integrity": "sha512-1VicfKhCYHLS8m1DCApqBhoulnASsEoJ/BvpUpP4zoNAPpKzdH+ghk0olGJMmwX2/jprK2j3hAHdUbczBSy2FA==",
-      "dev": true,
-      "requires": {
-        "cacache": "^10.0.4",
-        "find-cache-dir": "^1.0.0",
-        "schema-utils": "^0.4.5",
-        "serialize-javascript": "^1.4.0",
-        "source-map": "^0.6.1",
-        "uglify-es": "^3.3.4",
-        "webpack-sources": "^1.1.0",
-        "worker-farm": "^1.5.2"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "2.13.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
-          "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        },
-        "uglify-es": {
-          "version": "3.3.9",
-          "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
-          "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
-          "dev": true,
-          "requires": {
-            "commander": "~2.13.0",
-            "source-map": "~0.6.1"
-          }
-        }
-      }
-    },
-    "ultron": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
-      "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=",
-      "dev": true
-    },
-    "union-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
-      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^0.4.3"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "set-value": {
-          "version": "0.4.3",
-          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
-          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-extendable": "^0.1.1",
-            "is-plain-object": "^2.0.1",
-            "to-object-path": "^0.3.0"
-          }
-        }
-      }
-    },
-    "unique-filename": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz",
-      "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=",
-      "dev": true,
-      "requires": {
-        "unique-slug": "^2.0.0"
-      }
-    },
-    "unique-slug": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz",
-      "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=",
-      "dev": true,
-      "requires": {
-        "imurmurhash": "^0.1.4"
-      }
-    },
-    "unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
-      "dev": true
-    },
-    "unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "dev": true,
-      "requires": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "has-value": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-          "dev": true,
-          "requires": {
-            "get-value": "^2.0.3",
-            "has-values": "^0.1.4",
-            "isobject": "^2.0.0"
-          },
-          "dependencies": {
-            "isobject": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-              "dev": true,
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            }
-          }
-        },
-        "has-values": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-          "dev": true
-        }
-      }
-    },
-    "upath": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
-      "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
-      "dev": true
-    },
-    "upper-case": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
-      "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
-      "dev": true
-    },
-    "uri-js": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz",
-      "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=",
-      "dev": true,
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "dev": true
-    },
-    "url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "dev": true,
-      "requires": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
-          "dev": true
-        }
-      }
-    },
-    "url-join": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz",
-      "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=",
-      "dev": true
-    },
-    "url-loader": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.0.1.tgz",
-      "integrity": "sha512-rAonpHy7231fmweBKUFe0bYnlGDty77E+fm53NZdij7j/YOpyGzc7ttqG1nAXl3aRs0k41o0PC3TvGXQiw2Zvw==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "^1.1.0",
-        "mime": "^2.0.3",
-        "schema-utils": "^0.4.3"
-      },
-      "dependencies": {
-        "mime": {
-          "version": "2.3.1",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
-          "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
-          "dev": true
-        }
-      }
-    },
-    "url-parse": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz",
-      "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==",
-      "dev": true,
-      "requires": {
-        "querystringify": "^2.0.0",
-        "requires-port": "^1.0.0"
-      }
-    },
-    "use": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
-      "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.2"
-      }
-    },
-    "useragent": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
-      "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==",
-      "dev": true,
-      "requires": {
-        "lru-cache": "4.1.x",
-        "tmp": "0.0.x"
-      }
-    },
-    "util": {
-      "version": "0.10.4",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
-      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
-      "dev": true,
-      "requires": {
-        "inherits": "2.0.3"
-      }
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
-    },
-    "util.promisify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
-      "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.2",
-        "object.getownpropertydescriptors": "^2.0.3"
-      }
-    },
-    "utila": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
-      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
-      "dev": true
-    },
-    "utils-merge": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
-      "dev": true
-    },
-    "uuid": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
-      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
-      "dev": true
-    },
-    "validate-npm-package-license": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
-      "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
-      "dev": true,
-      "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "validate-npm-package-name": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
-      "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
-      "dev": true,
-      "requires": {
-        "builtins": "^1.0.3"
-      }
-    },
-    "vary": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
-      "dev": true
-    },
-    "verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
-      }
-    },
-    "vm-browserify": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
-      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
-      "dev": true,
-      "requires": {
-        "indexof": "0.0.1"
-      }
-    },
-    "void-elements": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
-      "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
-      "dev": true
-    },
-    "watchpack": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
-      "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
-      "dev": true,
-      "requires": {
-        "chokidar": "^2.0.2",
-        "graceful-fs": "^4.1.2",
-        "neo-async": "^2.5.0"
-      }
-    },
-    "wbuf": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
-      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
-      "dev": true,
-      "requires": {
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "webassemblyjs": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/webassemblyjs/-/webassemblyjs-1.4.3.tgz",
-      "integrity": "sha512-4lOV1Lv6olz0PJkDGQEp82HempAn147e6BXijWDzz9g7/2nSebVP9GVg62Fz5ZAs55mxq13GA0XLyvY8XkyDjg==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.4.3",
-        "@webassemblyjs/validation": "1.4.3",
-        "@webassemblyjs/wasm-parser": "1.4.3",
-        "@webassemblyjs/wast-parser": "1.4.3",
-        "long": "^3.2.0"
-      }
-    },
-    "webdriver-js-extender": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz",
-      "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=",
-      "dev": true,
-      "requires": {
-        "@types/selenium-webdriver": "^2.53.35",
-        "selenium-webdriver": "^2.53.2"
-      },
-      "dependencies": {
-        "sax": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz",
-          "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=",
-          "dev": true
-        },
-        "selenium-webdriver": {
-          "version": "2.53.3",
-          "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz",
-          "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=",
-          "dev": true,
-          "requires": {
-            "adm-zip": "0.4.4",
-            "rimraf": "^2.2.8",
-            "tmp": "0.0.24",
-            "ws": "^1.0.1",
-            "xml2js": "0.4.4"
-          }
-        },
-        "tmp": {
-          "version": "0.0.24",
-          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz",
-          "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=",
-          "dev": true
-        },
-        "xml2js": {
-          "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz",
-          "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=",
-          "dev": true,
-          "requires": {
-            "sax": "0.6.x",
-            "xmlbuilder": ">=1.0.0"
-          }
-        }
-      }
-    },
-    "webpack": {
-      "version": "4.8.3",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.8.3.tgz",
-      "integrity": "sha512-/hfAjBISycdK597lxONjKEFX7dSIU1PsYwC3XlXUXoykWBlv9QV5HnO+ql3HvrrgfBJ7WXdnjO9iGPR2aAc5sw==",
-      "dev": true,
-      "requires": {
-        "@webassemblyjs/ast": "1.4.3",
-        "@webassemblyjs/wasm-edit": "1.4.3",
-        "@webassemblyjs/wasm-parser": "1.4.3",
-        "acorn": "^5.0.0",
-        "acorn-dynamic-import": "^3.0.0",
-        "ajv": "^6.1.0",
-        "ajv-keywords": "^3.1.0",
-        "chrome-trace-event": "^0.1.1",
-        "enhanced-resolve": "^4.0.0",
-        "eslint-scope": "^3.7.1",
-        "loader-runner": "^2.3.0",
-        "loader-utils": "^1.1.0",
-        "memory-fs": "~0.4.1",
-        "micromatch": "^3.1.8",
-        "mkdirp": "~0.5.0",
-        "neo-async": "^2.5.0",
-        "node-libs-browser": "^2.0.0",
-        "schema-utils": "^0.4.4",
-        "tapable": "^1.0.0",
-        "uglifyjs-webpack-plugin": "^1.2.4",
-        "watchpack": "^1.5.0",
-        "webpack-sources": "^1.0.1"
-      }
-    },
-    "webpack-core": {
-      "version": "0.6.9",
-      "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz",
-      "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=",
-      "dev": true,
-      "requires": {
-        "source-list-map": "~0.1.7",
-        "source-map": "~0.4.1"
-      },
-      "dependencies": {
-        "source-list-map": {
-          "version": "0.1.8",
-          "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz",
-          "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
-          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
-          "dev": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
-        }
-      }
-    },
-    "webpack-dev-middleware": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.1.3.tgz",
-      "integrity": "sha512-I6Mmy/QjWU/kXwCSFGaiOoL5YEQIVmbb0o45xMoCyQAg/mClqZVTcsX327sPfekDyJWpCxb+04whNyLOIxpJdQ==",
-      "dev": true,
-      "requires": {
-        "loud-rejection": "^1.6.0",
-        "memory-fs": "~0.4.1",
-        "mime": "^2.1.0",
-        "path-is-absolute": "^1.0.0",
-        "range-parser": "^1.0.3",
-        "url-join": "^4.0.0",
-        "webpack-log": "^1.0.1"
-      },
-      "dependencies": {
-        "mime": {
-          "version": "2.3.1",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
-          "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
-          "dev": true
-        }
-      }
-    },
-    "webpack-dev-server": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.4.tgz",
-      "integrity": "sha512-itcIUDFkHuj1/QQxzUFOEXXmxOj5bku2ScLEsOFPapnq2JRTm58gPdtnBphBJOKL2+M3p6+xygL64bI+3eyzzw==",
-      "dev": true,
-      "requires": {
-        "ansi-html": "0.0.7",
-        "array-includes": "^3.0.3",
-        "bonjour": "^3.5.0",
-        "chokidar": "^2.0.0",
-        "compression": "^1.5.2",
-        "connect-history-api-fallback": "^1.3.0",
-        "debug": "^3.1.0",
-        "del": "^3.0.0",
-        "express": "^4.16.2",
-        "html-entities": "^1.2.0",
-        "http-proxy-middleware": "~0.18.0",
-        "import-local": "^1.0.0",
-        "internal-ip": "1.2.0",
-        "ip": "^1.1.5",
-        "killable": "^1.0.0",
-        "loglevel": "^1.4.1",
-        "opn": "^5.1.0",
-        "portfinder": "^1.0.9",
-        "selfsigned": "^1.9.1",
-        "serve-index": "^1.7.2",
-        "sockjs": "0.3.19",
-        "sockjs-client": "1.1.4",
-        "spdy": "^3.4.1",
-        "strip-ansi": "^3.0.0",
-        "supports-color": "^5.1.0",
-        "webpack-dev-middleware": "3.1.3",
-        "webpack-log": "^1.1.2",
-        "yargs": "11.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-          "dev": true
-        },
-        "camelcase": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
-          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
-          "dev": true
-        },
-        "cliui": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
-          "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
-          "dev": true,
-          "requires": {
-            "string-width": "^2.1.1",
-            "strip-ansi": "^4.0.0",
-            "wrap-ansi": "^2.0.0"
-          },
-          "dependencies": {
-            "strip-ansi": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^3.0.0"
-              }
-            }
-          }
-        },
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
-        "os-locale": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
-          "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
-          "dev": true,
-          "requires": {
-            "execa": "^0.7.0",
-            "lcid": "^1.0.0",
-            "mem": "^1.1.0"
-          }
-        },
-        "string-width": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
-          "dev": true,
-          "requires": {
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^4.0.0"
-          },
-          "dependencies": {
-            "strip-ansi": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^3.0.0"
-              }
-            }
-          }
-        },
-        "which-module": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-          "dev": true
-        },
-        "y18n": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
-          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
-          "dev": true
-        },
-        "yargs": {
-          "version": "11.0.0",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz",
-          "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==",
-          "dev": true,
-          "requires": {
-            "cliui": "^4.0.0",
-            "decamelize": "^1.1.1",
-            "find-up": "^2.1.0",
-            "get-caller-file": "^1.0.1",
-            "os-locale": "^2.0.0",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^1.0.1",
-            "set-blocking": "^2.0.0",
-            "string-width": "^2.0.0",
-            "which-module": "^2.0.0",
-            "y18n": "^3.2.1",
-            "yargs-parser": "^9.0.2"
-          }
-        },
-        "yargs-parser": {
-          "version": "9.0.2",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz",
-          "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=",
-          "dev": true,
-          "requires": {
-            "camelcase": "^4.1.0"
-          }
-        }
-      }
-    },
-    "webpack-log": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz",
-      "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.1.0",
-        "log-symbols": "^2.1.0",
-        "loglevelnext": "^1.0.1",
-        "uuid": "^3.1.0"
-      }
-    },
-    "webpack-merge": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.3.tgz",
-      "integrity": "sha512-zxwAIGK7nKdu5CIZL0BjTQoq3elV0t0MfB7rUC1zj668geid52abs6hN/ACwZdK6LeMS8dC9B6WmtF978zH5mg==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.17.5"
-      }
-    },
-    "webpack-sources": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz",
-      "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==",
-      "dev": true,
-      "requires": {
-        "source-list-map": "^2.0.0",
-        "source-map": "~0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "webpack-subresource-integrity": {
-      "version": "1.1.0-rc.4",
-      "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.4.tgz",
-      "integrity": "sha1-xcTj1pD50vZKlVDgeodn+Xlqpdg=",
-      "dev": true,
-      "requires": {
-        "webpack-core": "^0.6.8"
-      }
-    },
-    "websocket-driver": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
-      "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
-      "requires": {
-        "http-parser-js": ">=0.4.0",
-        "websocket-extensions": ">=0.1.1"
-      }
-    },
-    "websocket-extensions": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
-      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg=="
-    },
-    "whatwg-fetch": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
-      "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="
-    },
-    "when": {
-      "version": "3.6.4",
-      "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz",
-      "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=",
-      "dev": true
-    },
-    "which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "which-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
-      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
-      "dev": true,
-      "optional": true
-    },
-    "wide-align": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
-      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.2 || 2"
-      }
-    },
-    "window-size": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
-      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
-    },
-    "wordwrap": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
-      "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
-      "dev": true
-    },
-    "worker-farm": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
-      "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
-      "dev": true,
-      "requires": {
-        "errno": "~0.1.7"
-      }
-    },
-    "wrap-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1"
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-    },
-    "ws": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz",
-      "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=",
-      "dev": true,
-      "requires": {
-        "options": ">=0.0.5",
-        "ultron": "1.0.x"
-      }
-    },
-    "wtf-8": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz",
-      "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=",
-      "dev": true
-    },
-    "xml2js": {
-      "version": "0.4.19",
-      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
-      "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
-      "dev": true,
-      "requires": {
-        "sax": ">=0.6.0",
-        "xmlbuilder": "~9.0.1"
-      },
-      "dependencies": {
-        "sax": {
-          "version": "1.2.4",
-          "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-          "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
-          "dev": true
-        }
-      }
-    },
-    "xmlbuilder": {
-      "version": "9.0.7",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
-      "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
-      "dev": true
-    },
-    "xmlhttprequest": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
-      "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
-    },
-    "xmlhttprequest-ssl": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz",
-      "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=",
-      "dev": true
-    },
-    "xtend": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
-      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
-      "dev": true
-    },
-    "xxhashjs": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz",
-      "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==",
-      "dev": true,
-      "requires": {
-        "cuint": "^0.2.2"
-      }
-    },
-    "y18n": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
-      "dev": true
-    },
-    "yallist": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
-      "dev": true
-    },
-    "yargs": {
-      "version": "3.10.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
-      "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
-      "requires": {
-        "camelcase": "^1.0.2",
-        "cliui": "^2.1.0",
-        "decamelize": "^1.0.0",
-        "window-size": "0.1.0"
-      }
-    },
-    "yargs-parser": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
-      "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "camelcase": "^3.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
-          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "yeast": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
-      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
-      "dev": true
-    },
-    "yn": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz",
-      "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=",
-      "dev": true
-    },
-    "zone.js": {
-      "version": "0.8.26",
-      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz",
-      "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA=="
-    }
-  }
-}
diff --git a/web/cloud_dashboard/package.json b/web/cloud_dashboard/package.json
deleted file mode 100644
index 50f67a6..0000000
--- a/web/cloud_dashboard/package.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-  "name": "cloud_dashboard",
-  "version": "0.0.0",
-  "scripts": {
-    "ng": "ng",
-    "start": "ng serve",
-    "build": "ng build",
-    "test": "ng test",
-    "lint": "ng lint"
-  },
-  "private": true,
-  "dependencies": {
-    "@angular/animations": "^6.0.3",
-    "@angular/cdk": "^6.3.2",
-    "@angular/common": "^6.0.3",
-    "@angular/compiler": "^6.0.3",
-    "@angular/core": "^6.0.3",
-    "@angular/forms": "^6.0.3",
-    "@angular/http": "^6.0.3",
-    "@angular/material": "^6.3.2",
-    "@angular/platform-browser": "^6.0.3",
-    "@angular/platform-browser-dynamic": "^6.0.3",
-    "@angular/router": "^6.0.3",
-    "angularfire2": "^5.0.0-rc.11",
-    "core-js": "^2.5.4",
-    "firebase": "^5.2.0",
-    "rxjs": "^6.0.0",
-    "zone.js": "^0.8.26"
-  },
-  "devDependencies": {
-    "@angular/compiler-cli": "^6.0.3",
-    "@angular-devkit/build-angular": "~0.6.8",
-    "typescript": "~2.7.2",
-    "@angular/cli": "~6.0.8",
-    "@angular/language-service": "^6.0.3",
-    "@types/jasmine": "~2.8.6",
-    "@types/jasminewd2": "~2.0.3",
-    "@types/node": "~8.9.4",
-    "codelyzer": "~4.2.1",
-    "jasmine-core": "~2.99.1",
-    "jasmine-spec-reporter": "~4.2.1",
-    "karma": "~1.7.1",
-    "karma-chrome-launcher": "~2.2.0",
-    "karma-coverage-istanbul-reporter": "~2.0.0",
-    "karma-jasmine": "~1.1.1",
-    "karma-jasmine-html-reporter": "^0.2.2",
-    "protractor": "~5.3.0",
-    "ts-node": "~5.0.1",
-    "tslint": "~5.9.1"
-  }
-}
diff --git a/web/cloud_dashboard/src/app/app.component.css b/web/cloud_dashboard/src/app/app.component.css
deleted file mode 100644
index e69de29..0000000
--- a/web/cloud_dashboard/src/app/app.component.css
+++ /dev/null
diff --git a/web/cloud_dashboard/src/app/app.component.html b/web/cloud_dashboard/src/app/app.component.html
deleted file mode 100644
index a4cf904..0000000
--- a/web/cloud_dashboard/src/app/app.component.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<mat-toolbar color="primary">
-  <span>Ledger Cloud Dashboard</span>
-</mat-toolbar>
-<div class="lcd-container">
-  <div *ngIf="!authenticated">
-    <mat-card class="lcd-card">
-      <mat-card-content>
-        <h1>Authentication required</h1>
-        <p>Please authenticate in order to use the dashboard.</p>
-      </mat-card-content>
-      <mat-card-actions>
-        <button mat-raised-button color="accent" (click)="login()">Login</button>
-      </mat-card-actions>
-    </mat-card>
-  </div>
-
-  <div *ngIf="deleteInProgress">
-    <mat-card class="lcd-card">
-      <mat-card-content>
-        <h1>Delete in progress</h1>
-        <p>Please don't close the tab!!!</p>
-        <mat-progress-spinner mode="indeterminate"></mat-progress-spinner>
-        <p>Deleted documents: <b>{{ deletedDocumentCount }} </b></p>
-      </mat-card-content>
-    </mat-card>
-  </div>
-
-  <div *ngIf="authenticated && !deleteInProgress">
-    <!-- Info about the user -->
-    <mat-card class="lcd-card">
-      <mat-card-content>
-        <h1>User</h1>
-        <p>You are signed in as <b>{{ (user | async)?.email }}</b>
-          a.k.a <b>{{ uid }}</b> (Firebase user ID).</p>
-      </mat-card-content>
-      <mat-card-actions>
-        <button mat-raised-button color="accent" (click)="logout()">Logout</button>
-      </mat-card-actions>
-    </mat-card>
-
-    <!-- State -->
-    <mat-card class="lcd-card">
-      <mat-card-content>
-        <h1>State</h1>
-        <div *ngIf="loading">
-          <p>Loading the state.</p>
-        </div>
-        <div *ngIf="!loading && !version">
-          <p>Ledger is empty.</p>
-        </div>
-        <div *ngIf="!loading && version">
-          <p>Looking at serialization version <b>{{ version }}</b>.</p>
-          <p>There are <b>{{ (devices | async)?.length }}</b> devices syncing.</p>
-          <ul>
-            <li class="text" *ngFor="let device of devices | async">
-              {{device.id}}
-              <span *ngIf="device.connectionTimestamp">
-                -- Last connection at
-                {{device.connectionTimestamp | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>
-            </li>
-          </ul>
-          <p>Device IDs are opaque and meaningful only to Ledger.</p>
-        </div>
-      </mat-card-content>
-    </mat-card>
-
-    <!-- Cloud delete -->
-    <mat-card class="lcd-card">
-      <mat-card-content>
-        <h1>Reset Ledger state</h1>
-        <p><i>Why do we even have this lever?</i></p>
-        <p><b>This will also trigger erase of the local data, the next time each of
-            the devices sync</b></p>
-        <p>Collections to be erased:</p>
-        <ul *ngFor="let collection of allCollections">
-          <li>{{ collection.ref.path }}</li>
-        </ul>
-      </mat-card-content>
-      <mat-card-actions>
-        <button mat-raised-button color="warn" (click)="erase()">Permanently erase all my data</button>
-      </mat-card-actions>
-    </mat-card>
-  </div>
-</div>
diff --git a/web/cloud_dashboard/src/app/app.component.spec.ts b/web/cloud_dashboard/src/app/app.component.spec.ts
deleted file mode 100644
index 19b4416..0000000
--- a/web/cloud_dashboard/src/app/app.component.spec.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import {async, TestBed} from '@angular/core/testing';
-
-import {AppComponent} from './app.component';
-
-describe('AppComponent', () => {
-  beforeEach(async(() => {
-    TestBed
-        .configureTestingModule({
-          declarations: [AppComponent],
-        })
-        .compileComponents();
-  }));
-  it('should create the app', async(() => {
-       const fixture = TestBed.createComponent(AppComponent);
-       const app = fixture.debugElement.componentInstance;
-       expect(app).toBeTruthy();
-     }));
-  it(`should have as title 'app'`, async(() => {
-       const fixture = TestBed.createComponent(AppComponent);
-       const app = fixture.debugElement.componentInstance;
-       expect(app.title).toEqual('app');
-     }));
-  it('should render title in a h1 tag', async(() => {
-       const fixture = TestBed.createComponent(AppComponent);
-       fixture.detectChanges();
-       const compiled = fixture.debugElement.nativeElement;
-       expect(compiled.querySelector('h1').textContent)
-           .toContain('Welcome to cloud_dashboard!');
-     }));
-});
diff --git a/web/cloud_dashboard/src/app/app.component.ts b/web/cloud_dashboard/src/app/app.component.ts
deleted file mode 100644
index f152404..0000000
--- a/web/cloud_dashboard/src/app/app.component.ts
+++ /dev/null
@@ -1,191 +0,0 @@
-import {Component} from '@angular/core';
-import {AngularFireAuth} from 'angularfire2/auth';
-import {AngularFirestore, AngularFirestoreCollection, AngularFirestoreDocument, DocumentChangeAction, QueryDocumentSnapshot} from 'angularfire2/firestore';
-import * as firebase from 'firebase/app';
-import {from, Observable, Observer} from 'rxjs';
-import {bufferCount, concat, concatMap, map, mergeMap, take, tap, toArray} from 'rxjs/operators';
-
-@Component({
-  selector: 'app-root',
-  templateUrl: './app.component.html',
-  styleUrls: ['./app.component.css']
-})
-export class AppComponent {
-  readonly title = 'Ledger Cloud Dashboard';
-  readonly batchSize = 25;
-
-  authenticated = false;
-  uid = null;
-  version = '0';
-  loading = true;
-  deleteInProgress = false;
-
-  user: Observable<firebase.User>;
-  usersCollection: AngularFirestoreCollection;
-  userDocument: AngularFirestoreDocument<any>;
-  versionsCollection: AngularFirestoreCollection;
-  versionDocument: AngularFirestoreDocument<any>;
-  devicesCollection: AngularFirestoreCollection;
-  devices: Observable<any>;
-  allCollections: Array<AngularFirestoreCollection> = [];
-  deletedDocumentCount = 0;
-
-  constructor(public afAuth: AngularFireAuth, private db: AngularFirestore) {
-    this.user = afAuth.authState;
-
-    this.afAuth.authState.subscribe((state) => {
-      this.authenticated = state != null;
-      if (this.authenticated) {
-        this.uid = state.uid;
-        this.loadVersions();
-      }
-    });
-  }
-
-  login() {
-    let provider = new firebase.auth.GoogleAuthProvider();
-    provider.setCustomParameters({prompt: 'select_account'});
-    this.afAuth.auth.signInWithPopup(provider);
-  }
-
-  logout() {
-    this.afAuth.auth.signOut();
-  }
-
-  rootPath() {
-    return 'users/' + this.uid;
-  }
-
-  versionDocumentPath(version: number) {
-    let path = `${this.rootPath()}/${version}/default_document`;
-    console.log(path);
-    return path;
-  }
-
-  versionPath() {
-    return this.rootPath() + '/' + this.version;
-  }
-
-  userDevicesPath() {
-    return this.versionPath() + '/default_document/devices';
-  }
-
-  loadVersions() {
-    this.usersCollection = this.db.collection('users');
-    this.userDocument = this.usersCollection.doc(this.uid);
-    this.versionsCollection = this.userDocument.collection('versions');
-    this.versionsCollection.snapshotChanges()
-        .pipe(this.unwrap())
-        .subscribe(versionObjects => {
-          let nextVersion = '0';
-          for (const versionObject of versionObjects) {
-            if (Number(versionObject.id) > Number(nextVersion)) {
-              nextVersion = versionObject.id;
-            }
-          }
-          this.version = nextVersion;
-          this.versionDocument = this.versionsCollection.doc(this.version);
-          this.loading = false;
-          this.loadDevices();
-          this.loadAllCollections();
-        });
-  }
-
-  loadDevices() {
-    this.devicesCollection = this.versionDocument.collection('devices');
-    this.devices = this.devicesCollection.snapshotChanges().pipe(
-        map(actions => actions.map(a => {
-          const data = a.payload.doc.data();
-          const id = a.payload.doc.id;
-          return {id, ...data};
-        })));
-  }
-
-  // Assembles the list of all collections of the user.
-  loadAllCollections() {
-    const schema = {
-      'devices': {},
-      'namespaces': {'pages': {'commit-log': {}, 'objects': {}}}
-    };
-    this.loadNested(this.versionsCollection, schema)
-        .pipe(toArray())
-        .subscribe((result) => this.allCollections = result);
-  }
-
-  // Returns an observable which recursively streams nested collections under
-  // |collection| according to the given schema.
-  loadNested(collection: AngularFirestoreCollection, schema):
-      Observable<AngularFirestoreCollection> {
-    return collection.snapshotChanges().pipe(
-        this.unwrap(), take(1),
-
-        mergeMap(documents => {
-          let result = [from([collection])];
-          for (const document of documents) {
-            for (const subcollectionName in schema) {
-              const subcollection =
-                  collection.doc(document.id).collection(subcollectionName);
-              const subcollectionObservable =
-                  this.loadNested(subcollection, schema[subcollectionName]);
-              result.push(subcollectionObservable);
-            }
-          }
-          return result;
-        }),
-        mergeMap((a) => a));
-  }
-
-  // Pipeable operator which unwraps document snapshots so that they contain the
-  // key as |id| along with data fields.
-  unwrap() {
-    return map((actions: DocumentChangeAction<any>[]) => actions.map(a => {
-      const data = a.payload.doc.data();
-      const id = a.payload.doc.id;
-      return {id, ...data};
-    }))
-  }
-
-  erase() {
-    this.deleteInProgress = true;
-    this.deletedDocumentCount = 0;
-    this.eraseCollections(this.allCollections);
-  }
-
-  // Erases all documents in the given collection in batches.
-  eraseCollections(collections: Array<AngularFirestoreCollection>) {
-    from(collections)
-        .pipe(
-            concatMap(
-                collection => collection.snapshotChanges().pipe(
-                    take(1), concatMap((v) => v))),
-            bufferCount(this.batchSize),
-            concatMap((documents) => this.deleteDocs(documents)))
-        .subscribe(
-            (count: number) => {
-              this.deletedDocumentCount += count;
-            },
-            (err) => {
-              console.log(err);
-            },
-            () => {
-              this.deleteInProgress = false;
-              this.loadVersions();
-            });
-  }
-
-  // Returns an Observable which deletes the given documents and streams the
-  // number of deleted documents.
-  deleteDocs(documents: DocumentChangeAction<any>[]): Observable<number> {
-    let result = Observable.create((o: Observer<number>) => {
-      let batch = this.db.firestore.batch();
-      for (const document in documents) {
-        batch.delete(documents[document].payload.doc.ref);
-      }
-      batch.commit().then(() => {
-        o.next(documents.length);
-        o.complete();
-      });
-    });
-    return result;
-  }
-}
diff --git a/web/cloud_dashboard/src/app/app.module.ts b/web/cloud_dashboard/src/app/app.module.ts
deleted file mode 100644
index a870ec2..0000000
--- a/web/cloud_dashboard/src/app/app.module.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import {NgModule} from '@angular/core';
-import {MatButtonModule, MatCardModule, MatProgressSpinnerModule, MatToolbarModule} from '@angular/material';
-import {BrowserModule} from '@angular/platform-browser';
-import {AngularFireModule} from 'angularfire2';
-import {AngularFireAuthModule} from 'angularfire2/auth';
-import {AngularFirestoreModule} from 'angularfire2/firestore';
-
-import {environment} from '../environments/environment';
-
-import {AppComponent} from './app.component';
-
-@NgModule({
-  declarations: [AppComponent],
-  imports: [
-    BrowserModule,                                          //
-    AngularFireModule.initializeApp(environment.firebase),  //
-    AngularFirestoreModule,                                 //
-    AngularFireAuthModule,                                  //
-    MatButtonModule,                                        //
-    MatCardModule,                                          //
-    MatProgressSpinnerModule,                               //
-    MatToolbarModule                                        //
-  ],
-  providers: [],
-  bootstrap: [AppComponent]
-})
-export class AppModule {
-}
diff --git a/web/cloud_dashboard/src/assets/.gitkeep b/web/cloud_dashboard/src/assets/.gitkeep
deleted file mode 100644
index e69de29..0000000
--- a/web/cloud_dashboard/src/assets/.gitkeep
+++ /dev/null
diff --git a/web/cloud_dashboard/src/browserslist b/web/cloud_dashboard/src/browserslist
deleted file mode 100644
index 8e09ab4..0000000
--- a/web/cloud_dashboard/src/browserslist
+++ /dev/null
@@ -1,9 +0,0 @@
-# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers
-# For additional information regarding the format and rule options, please see:
-# https://github.com/browserslist/browserslist#queries
-# For IE 9-11 support, please uncomment the last line of the file and adjust as needed
-> 0.5%
-last 2 versions
-Firefox ESR
-not dead
-# IE 9-11
\ No newline at end of file
diff --git a/web/cloud_dashboard/src/environments/environment.prod.ts b/web/cloud_dashboard/src/environments/environment.prod.ts
deleted file mode 100644
index c840f72..0000000
--- a/web/cloud_dashboard/src/environments/environment.prod.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import {firebase} from './firebase';
-
-export const environment = {
-  production: true,
-  firebase: firebase
-};
diff --git a/web/cloud_dashboard/src/environments/environment.ts b/web/cloud_dashboard/src/environments/environment.ts
deleted file mode 100644
index a66860e..0000000
--- a/web/cloud_dashboard/src/environments/environment.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-// This file can be replaced during build by using the `fileReplacements` array.
-// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`.
-// The list of file replacements can be found in `angular.json`.
-
-import {firebase} from './firebase';
-
-export const environment = {
-  production: false,
-  firebase: firebase
-};
diff --git a/web/cloud_dashboard/src/environments/firebase.ts b/web/cloud_dashboard/src/environments/firebase.ts
deleted file mode 100644
index bf5ff62..0000000
--- a/web/cloud_dashboard/src/environments/firebase.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export const firebase = {
-  apiKey: 'AIzaSyDzzuJILOn6riFPTXC36HlH6CEdliLapDA',
-  authDomain: 'fuchsia-ledger.firebaseapp.com',
-  databaseURL: 'https://fuchsia-ledger.firebaseio.com',
-  projectId: 'fuchsia-ledger',
-  storageBucket: 'fuchsia-ledger.appspot.com',
-  messagingSenderId: '191622714118'
-};
diff --git a/web/cloud_dashboard/src/favicon.ico b/web/cloud_dashboard/src/favicon.ico
deleted file mode 100644
index 8081c7c..0000000
--- a/web/cloud_dashboard/src/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/web/cloud_dashboard/src/index.html b/web/cloud_dashboard/src/index.html
deleted file mode 100644
index b70f171..0000000
--- a/web/cloud_dashboard/src/index.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!doctype html>
-<html lang="en">
-<head>
-  <meta charset="utf-8">
-  <title>CloudDashboard</title>
-  <base href="/">
-
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-  <link rel="icon" type="image/x-icon" href="favicon.ico">
-  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
-</head>
-<body>
-  <app-root></app-root>
-</body>
-</html>
diff --git a/web/cloud_dashboard/src/karma.conf.js b/web/cloud_dashboard/src/karma.conf.js
deleted file mode 100644
index b6e0042..0000000
--- a/web/cloud_dashboard/src/karma.conf.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Karma configuration file, see link for more information
-// https://karma-runner.github.io/1.0/config/configuration-file.html
-
-module.exports = function (config) {
-  config.set({
-    basePath: '',
-    frameworks: ['jasmine', '@angular-devkit/build-angular'],
-    plugins: [
-      require('karma-jasmine'),
-      require('karma-chrome-launcher'),
-      require('karma-jasmine-html-reporter'),
-      require('karma-coverage-istanbul-reporter'),
-      require('@angular-devkit/build-angular/plugins/karma')
-    ],
-    client: {
-      clearContext: false // leave Jasmine Spec Runner output visible in browser
-    },
-    coverageIstanbulReporter: {
-      dir: require('path').join(__dirname, '../coverage'),
-      reports: ['html', 'lcovonly'],
-      fixWebpackSourcePaths: true
-    },
-    reporters: ['progress', 'kjhtml'],
-    port: 9876,
-    colors: true,
-    logLevel: config.LOG_INFO,
-    autoWatch: true,
-    browsers: ['Chrome'],
-    singleRun: false
-  });
-};
\ No newline at end of file
diff --git a/web/cloud_dashboard/src/main.ts b/web/cloud_dashboard/src/main.ts
deleted file mode 100644
index b4badaa..0000000
--- a/web/cloud_dashboard/src/main.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import {enableProdMode} from '@angular/core';
-import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
-
-import {AppModule} from './app/app.module';
-import {environment} from './environments/environment';
-
-if (environment.production) {
-  enableProdMode();
-}
-
-platformBrowserDynamic().bootstrapModule(AppModule).catch(
-    err => console.log(err));
diff --git a/web/cloud_dashboard/src/polyfills.ts b/web/cloud_dashboard/src/polyfills.ts
deleted file mode 100644
index 663fa6d..0000000
--- a/web/cloud_dashboard/src/polyfills.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * This file includes polyfills needed by Angular and is loaded before the app.
- * You can add your own extra polyfills to this file.
- *
- * This file is divided into 2 sections:
- *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
- *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
- *      file.
- *
- * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
- * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
- * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
- *
- * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
- */
-
-/***************************************************************************************************
- * BROWSER POLYFILLS
- */
-
-/** IE9, IE10 and IE11 requires all of the following polyfills. **/
-// import 'core-js/es6/symbol';
-// import 'core-js/es6/object';
-// import 'core-js/es6/function';
-// import 'core-js/es6/parse-int';
-// import 'core-js/es6/parse-float';
-// import 'core-js/es6/number';
-// import 'core-js/es6/math';
-// import 'core-js/es6/string';
-// import 'core-js/es6/date';
-// import 'core-js/es6/array';
-// import 'core-js/es6/regexp';
-// import 'core-js/es6/map';
-// import 'core-js/es6/weak-map';
-// import 'core-js/es6/set';
-
-/** IE10 and IE11 requires the following for NgClass support on SVG elements */
-// import 'classlist.js';  // Run `npm install --save classlist.js`.
-
-/** IE10 and IE11 requires the following for the Reflect API. */
-// import 'core-js/es6/reflect';
-
-
-/** Evergreen browsers require these. **/
-// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
-import 'core-js/es7/reflect';
-
-
-/**
- * Web Animations `@angular/platform-browser/animations`
- * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.
- * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).
- **/
-// import 'web-animations-js';  // Run `npm install --save web-animations-js`.
-
-/**
- * By default, zone.js will patch all possible macroTask and DomEvents
- * user can disable parts of macroTask/DomEvents patch by setting following flags
- */
-
-// (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
-// (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
-// (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
-
-/*
- * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
- * with the following flag, it will bypass `zone.js` patch for IE/Edge
- */
-// (window as any).__Zone_enable_cross_context_check = true;
-
-/***************************************************************************************************
- * Zone JS is required by default for Angular itself.
- */
-import 'zone.js/dist/zone'; // Included with Angular CLI.
-
-
-
-/***************************************************************************************************
- * APPLICATION IMPORTS
- */
diff --git a/web/cloud_dashboard/src/styles.css b/web/cloud_dashboard/src/styles.css
deleted file mode 100644
index f927449..0000000
--- a/web/cloud_dashboard/src/styles.css
+++ /dev/null
@@ -1,16 +0,0 @@
-/* You can add global styles to this file, and also import other style files */
-
-@import '~@angular/material/prebuilt-themes/indigo-pink.css';
-
-body {
-  margin: 0;
-}
-
-.lcd-container {
-  max-width: 1280px;
-  margin: 0 auto;
-}
-
-.lcd-card {
-  margin: 10px;
-}
diff --git a/web/cloud_dashboard/src/test.ts b/web/cloud_dashboard/src/test.ts
deleted file mode 100644
index ef0aef5..0000000
--- a/web/cloud_dashboard/src/test.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-// This file is required by karma.conf.js and loads recursively all the .spec and framework files
-
-import 'zone.js/dist/zone-testing';
-import {getTestBed} from '@angular/core/testing';
-import {BrowserDynamicTestingModule, platformBrowserDynamicTesting} from '@angular/platform-browser-dynamic/testing';
-
-declare const require: any;
-
-// First, initialize the Angular testing environment.
-getTestBed().initTestEnvironment(
-    BrowserDynamicTestingModule, platformBrowserDynamicTesting());
-// Then we find all the tests.
-const context = require.context('./', true, /\.spec\.ts$/);
-// And load the modules.
-context.keys().map(context);
diff --git a/web/cloud_dashboard/src/tsconfig.app.json b/web/cloud_dashboard/src/tsconfig.app.json
deleted file mode 100644
index 722c370..0000000
--- a/web/cloud_dashboard/src/tsconfig.app.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "extends": "../tsconfig.json",
-  "compilerOptions": {
-    "outDir": "../out-tsc/app",
-    "module": "es2015",
-    "types": []
-  },
-  "exclude": [
-    "src/test.ts",
-    "**/*.spec.ts"
-  ]
-}
diff --git a/web/cloud_dashboard/src/tsconfig.spec.json b/web/cloud_dashboard/src/tsconfig.spec.json
deleted file mode 100644
index 8f7cede..0000000
--- a/web/cloud_dashboard/src/tsconfig.spec.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "extends": "../tsconfig.json",
-  "compilerOptions": {
-    "outDir": "../out-tsc/spec",
-    "module": "commonjs",
-    "types": [
-      "jasmine",
-      "node"
-    ]
-  },
-  "files": [
-    "test.ts",
-    "polyfills.ts"
-  ],
-  "include": [
-    "**/*.spec.ts",
-    "**/*.d.ts"
-  ]
-}
diff --git a/web/cloud_dashboard/src/tslint.json b/web/cloud_dashboard/src/tslint.json
deleted file mode 100644
index 52e2c1a..0000000
--- a/web/cloud_dashboard/src/tslint.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "extends": "../tslint.json",
-    "rules": {
-        "directive-selector": [
-            true,
-            "attribute",
-            "app",
-            "camelCase"
-        ],
-        "component-selector": [
-            true,
-            "element",
-            "app",
-            "kebab-case"
-        ]
-    }
-}
diff --git a/web/cloud_dashboard/tsconfig.json b/web/cloud_dashboard/tsconfig.json
deleted file mode 100644
index ef44e28..0000000
--- a/web/cloud_dashboard/tsconfig.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  "compileOnSave": false,
-  "compilerOptions": {
-    "baseUrl": "./",
-    "outDir": "./dist/out-tsc",
-    "sourceMap": true,
-    "declaration": false,
-    "moduleResolution": "node",
-    "emitDecoratorMetadata": true,
-    "experimentalDecorators": true,
-    "target": "es5",
-    "typeRoots": [
-      "node_modules/@types"
-    ],
-    "lib": [
-      "es2017",
-      "dom"
-    ]
-  }
-}
diff --git a/web/cloud_dashboard/tslint.json b/web/cloud_dashboard/tslint.json
deleted file mode 100644
index 3ea984c..0000000
--- a/web/cloud_dashboard/tslint.json
+++ /dev/null
@@ -1,130 +0,0 @@
-{
-  "rulesDirectory": [
-    "node_modules/codelyzer"
-  ],
-  "rules": {
-    "arrow-return-shorthand": true,
-    "callable-types": true,
-    "class-name": true,
-    "comment-format": [
-      true,
-      "check-space"
-    ],
-    "curly": true,
-    "deprecation": {
-      "severity": "warn"
-    },
-    "eofline": true,
-    "forin": true,
-    "import-blacklist": [
-      true,
-      "rxjs/Rx"
-    ],
-    "import-spacing": true,
-    "indent": [
-      true,
-      "spaces"
-    ],
-    "interface-over-type-literal": true,
-    "label-position": true,
-    "max-line-length": [
-      true,
-      140
-    ],
-    "member-access": false,
-    "member-ordering": [
-      true,
-      {
-        "order": [
-          "static-field",
-          "instance-field",
-          "static-method",
-          "instance-method"
-        ]
-      }
-    ],
-    "no-arg": true,
-    "no-bitwise": true,
-    "no-console": [
-      true,
-      "debug",
-      "info",
-      "time",
-      "timeEnd",
-      "trace"
-    ],
-    "no-construct": true,
-    "no-debugger": true,
-    "no-duplicate-super": true,
-    "no-empty": false,
-    "no-empty-interface": true,
-    "no-eval": true,
-    "no-inferrable-types": [
-      true,
-      "ignore-params"
-    ],
-    "no-misused-new": true,
-    "no-non-null-assertion": true,
-    "no-shadowed-variable": true,
-    "no-string-literal": false,
-    "no-string-throw": true,
-    "no-switch-case-fall-through": true,
-    "no-trailing-whitespace": true,
-    "no-unnecessary-initializer": true,
-    "no-unused-expression": true,
-    "no-use-before-declare": true,
-    "no-var-keyword": true,
-    "object-literal-sort-keys": false,
-    "one-line": [
-      true,
-      "check-open-brace",
-      "check-catch",
-      "check-else",
-      "check-whitespace"
-    ],
-    "prefer-const": true,
-    "quotemark": [
-      true,
-      "single"
-    ],
-    "radix": true,
-    "semicolon": [
-      true,
-      "always"
-    ],
-    "triple-equals": [
-      true,
-      "allow-null-check"
-    ],
-    "typedef-whitespace": [
-      true,
-      {
-        "call-signature": "nospace",
-        "index-signature": "nospace",
-        "parameter": "nospace",
-        "property-declaration": "nospace",
-        "variable-declaration": "nospace"
-      }
-    ],
-    "unified-signatures": true,
-    "variable-name": false,
-    "whitespace": [
-      true,
-      "check-branch",
-      "check-decl",
-      "check-operator",
-      "check-separator",
-      "check-type"
-    ],
-    "no-output-on-prefix": true,
-    "use-input-property-decorator": true,
-    "use-output-property-decorator": true,
-    "use-host-property-decorator": true,
-    "no-input-rename": true,
-    "no-output-rename": true,
-    "use-life-cycle-interface": true,
-    "use-pipe-transform-interface": true,
-    "component-class-suffix": true,
-    "directive-class-suffix": true
-  }
-}
