diff --git a/tests/chain/BUILD.gn b/tests/chain/BUILD.gn
deleted file mode 100644
index 2001b7a..0000000
--- a/tests/chain/BUILD.gn
+++ /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.
-
-import("//peridot/build/executable_package.gni")
-
-executable_package("chain_test_session_shell") {
-  deprecated_bare_package_url = "//build"
-
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/chain_test_session_shell.cmx"
-      dest = "chain_test_session_shell.cmx"
-    },
-  ]
-  
-  sources = [
-    "chain_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/public/lib/integration_testing/cpp",
-    "//peridot/lib/testing:component_main",
-    "//peridot/lib/testing:session_shell_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/context/cpp:formatting",
-    "//peridot/tests/common:defs",
-  ]
-
-#
-}
-
-executable_package("chain_test_module") {
-  deprecated_bare_package_url = "//build"
-
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/chain_test_module.cmx"
-      dest = "chain_test_module.cmx"
-    },
-  ]
-
-  sources = [
-    "chain_test_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/lib/testing:component_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/tests/common:defs",
-    "//zircon/public/lib/async-loop-cpp",
-  ]
-}
-
-executable_package("chain_test_child_module") {
-  deprecated_bare_package_url = "//build"
-
-  testonly = true
-
-  meta = [
-    {
-      path = "meta/chain_test_child_module.cmx"
-      dest = "chain_test_child_module.cmx"
-    },
-  ]
-
-  sources = [
-    "chain_test_child_module.cc",
-  ]
-
-  deps = [
-    ":defs",
-    "//garnet/public/fidl/fuchsia.ui.viewsv1",
-    "//garnet/public/lib/fsl",
-    "//peridot/public/lib/integration_testing/cpp",
-    "//peridot/lib/testing:component_base",
-    "//peridot/public/fidl/fuchsia.modular",
-    "//peridot/public/lib/app_driver/cpp:module_driver",
-    "//peridot/tests/common:defs",
-  ]
-}
-
-source_set("defs") {
-  testonly = true
-
-  sources = [
-    "defs.h",
-  ]
-}
diff --git a/tests/chain/README.md b/tests/chain/README.md
deleted file mode 100644
index bef045a..0000000
--- a/tests/chain/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# chain integration test
-
-Tests starting Modules with a fuchsia::modular::Intent and the subsequent initialization of the
-Module's Links based on the values of intent.parameters.
diff --git a/tests/chain/chain_test_child_module.cc b/tests/chain/chain_test_child_module.cc
deleted file mode 100644
index 4d9bb41..0000000
--- a/tests/chain/chain_test_child_module.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 <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/fsl/vmo/strings.h>
-#include <lib/fxl/functional/make_copyable.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/chain/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_{"Child module initialized"};
-
-  TestModule(modular::ModuleHost* module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_context_(module_host->module_context()) {
-    module_context_->GetComponentContext(component_context_.NewRequest());
-    component_context_->GetEntityResolver(entity_resolver_.NewRequest());
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-
-    initialized_.Pass();
-
-    // Verify that the three nouns we got passed from chain_test_module appear
-    // in Links we have access to, and that their contents are correct.
-    VerifyLinkOne();
-  }
-
-  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_{"Child module stopped"};
-
-  // Called from ModuleDriver.
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  TestPoint link_one_correct_{"Link one value is correct."};
-
-  void VerifyLinkOne() {
-    module_context_->GetLink("one", link_one_.NewRequest());
-    link_one_->GetEntity([this](const fidl::StringPtr& entity_reference) {
-      FXL_LOG(INFO) << "*******************: " << entity_reference;
-      if (!entity_reference) {
-        VerifyLinkTwo();
-        return;
-      }
-      entity_resolver_->ResolveEntity(entity_reference, entity_.NewRequest());
-      entity_->GetData(
-          "myType", [this](std::unique_ptr<fuchsia::mem::Buffer> content) {
-            std::string content_string;
-            FXL_CHECK(fsl::StringFromVmo(*content, &content_string));
-            FXL_LOG(INFO) << "*******************: " << content_string;
-            if (content_string == "1337") {
-              link_one_correct_.Pass();
-            }
-
-            VerifyLinkTwo();
-          });
-    });
-  }
-
-  TestPoint link_two_correct_{"Link two value is correct."};
-
-  void VerifyLinkTwo() {
-    module_context_->GetLink("two", link_two_.NewRequest());
-    link_two_->Get(nullptr,
-                   [this](std::unique_ptr<fuchsia::mem::Buffer> content) {
-                     std::string content_string;
-                     FXL_CHECK(fsl::StringFromVmo(*content, &content_string));
-                     if (content_string == "\"12345\"") {
-                       link_two_correct_.Pass();
-                     }
-
-                     VerifyLinkThree();
-                   });
-  }
-
-  TestPoint link_three_correct_{"Link three value is correct."};
-
-  void VerifyLinkThree() {
-    module_context_->GetLink("three", link_three_.NewRequest());
-    link_three_->Get(nullptr,
-                     [this](std::unique_ptr<fuchsia::mem::Buffer> content) {
-                       std::string content_string;
-                       FXL_CHECK(fsl::StringFromVmo(*content, &content_string));
-                       if (content_string == "\"67890\"") {
-                         link_three_correct_.Pass();
-                       }
-
-                       VerifyLinkFour();
-                     });
-  }
-
-  TestPoint link_four_correct_{"Link four value is correct."};
-
-  void VerifyLinkFour() {
-    // Check that we did get a default link as specified by the
-    // fuchsia::modular::Intent.
-    module_context_->GetLink("four", default_link_.NewRequest());
-    default_link_->Get(
-        nullptr, [this](std::unique_ptr<fuchsia::mem::Buffer> content) {
-          std::string content_string;
-          FXL_CHECK(fsl::StringFromVmo(*content, &content_string));
-          if (content_string == "\"1337\"") {
-            link_four_correct_.Pass();
-          }
-
-          Signal(modular::testing::kTestShutdown);
-        });
-  }
-
-  fuchsia::modular::ComponentContextPtr component_context_;
-  fuchsia::modular::EntityResolverPtr entity_resolver_;
-  fuchsia::modular::ModuleContext* module_context_;
-  fuchsia::modular::ModuleControllerPtr child_module_;
-  fuchsia::ui::viewsv1token::ViewOwnerPtr child_view_;
-
-  fuchsia::modular::LinkPtr link_one_;
-  fuchsia::modular::LinkPtr link_two_;
-  fuchsia::modular::LinkPtr link_three_;
-  fuchsia::modular::LinkPtr default_link_;
-
-  fuchsia::modular::EntityPtr entity_;
-
-  fidl::StringPtr entity_one_reference_;
-
-  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/chain/chain_test_module.cc b/tests/chain/chain_test_module.cc
deleted file mode 100644
index d637592..0000000
--- a/tests/chain/chain_test_module.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. 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 <fuchsia/ui/viewsv1token/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/functional/make_copyable.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/chain/defs.h"
-#include "peridot/tests/common/defs.h"
-
-using modular::testing::TestPoint;
-
-namespace {
-
-// 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_context_(module_host->module_context()) {
-    module_context_->GetComponentContext(component_context_.NewRequest());
-    modular::testing::Init(module_host->startup_context(), __FILE__);
-    initialized_.Pass();
-
-    // We'll use an fuchsia::modular::Entity stored on one of our Links, which
-    // will be used in the resolution process to choose a compatible Module.
-    // TODO(thatguy): We should be specifying type constraints when we create
-    // the fuchsia::modular::Link.
-    auto entity_data =
-        fidl::VectorPtr<fuchsia::modular::TypeToDataEntry>::New(1);
-    entity_data->at(0) = fuchsia::modular::TypeToDataEntry();
-    entity_data->at(0).type = "myType";
-    entity_data->at(0).data = "1337";
-
-    component_context_->CreateEntityWithData(
-        std::move(entity_data), [this](fidl::StringPtr reference) {
-          entity_one_reference_ = reference;
-          EmbedModule();
-        });
-  }
-
-  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_{"Parent module stopped"};
-  void Terminate(const std::function<void()>& done) {
-    stopped_.Pass();
-    modular::testing::Done(done);
-  }
-
- private:
-  TestPoint start_intent_{"Started child Intent"};
-
-  fuchsia::mem::Buffer VmoFromJson(const std::string& json) {
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(json, &vmo));
-    return std::move(vmo).ToTransport();
-  }
-
-  void EmbedModule() {
-    intent_.handler = kChildModuleUrl;
-    intent_.action = "action";
-    intent_.parameters.resize(4);
-
-    // We'll put three parameters "one", "two" and "three" on the
-    // fuchsia::modular::Intent.
-    //
-    // The first is used to match the Module, because we know that it expects
-    // a parameter named "one". The other two are extra and are going to be
-    // passed on to the Module regardless.
-    //
-    // The second parameter is set to a Link that we own with regular JSON
-    // content.
-    //
-    // The third parameter we expect to reference a Link created on our behalf
-    // by the Framework. We don't get access to that Link.
-    fuchsia::modular::IntentParameterData parameter_data;
-
-    intent_.parameters->at(0) = fuchsia::modular::IntentParameter();
-    intent_.parameters->at(0).name = "one";
-    intent_.parameters->at(0).data.set_entity_reference(entity_one_reference_);
-
-    module_context_->GetLink("bar", link_two_.NewRequest());
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString("\"12345\"", &vmo));
-    link_two_->Set(nullptr, std::move(vmo).ToTransport());
-    parameter_data = fuchsia::modular::IntentParameterData();
-    parameter_data.set_link_name("bar");
-    intent_.parameters->at(1) = fuchsia::modular::IntentParameter();
-    intent_.parameters->at(1).name = "two";
-    intent_.parameters->at(1).data = std::move(parameter_data);
-
-    parameter_data = fuchsia::modular::IntentParameterData();
-    parameter_data.set_json(VmoFromJson("\"67890\""));
-    intent_.parameters->at(2) = fuchsia::modular::IntentParameter();
-    intent_.parameters->at(2).name = "three";
-    intent_.parameters->at(2).data = std::move(parameter_data);
-
-    parameter_data = fuchsia::modular::IntentParameterData();
-    parameter_data.set_json(VmoFromJson("\"1337\""));
-    intent_.parameters->at(3) = fuchsia::modular::IntentParameter();
-    intent_.parameters->at(3).name = "four";
-    intent_.parameters->at(3).data = std::move(parameter_data);
-
-    // Sync to avoid race conditions between writing
-    link_two_->Sync([this] {
-      module_context_->EmbedModule(
-          "my child", std::move(intent_), child_module_.NewRequest(),
-          child_view_.NewRequest(),
-          [this](fuchsia::modular::StartModuleStatus status) {
-            FXL_CHECK(status == fuchsia::modular::StartModuleStatus::SUCCESS);
-            start_intent_.Pass();
-          });
-    });
-  }
-
-  fuchsia::modular::ComponentContextPtr component_context_;
-  fuchsia::modular::ModuleContext* module_context_;
-  fuchsia::modular::ModuleControllerPtr child_module_;
-  fuchsia::ui::viewsv1token::ViewOwnerPtr child_view_;
-
-  fidl::StringPtr entity_one_reference_;
-  fuchsia::modular::Intent intent_;
-
-  fuchsia::modular::LinkPtr link_two_;
-
-  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/chain/chain_test_session_shell.cc b/tests/chain/chain_test_session_shell.cc
deleted file mode 100644
index c6f56bb..0000000
--- a/tests/chain/chain_test_session_shell.cc
+++ /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.
-
-#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/formatting.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/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/chain/defs.h"
-#include "peridot/tests/common/defs.h"
-
-using modular::testing::Put;
-using modular::testing::TestPoint;
-
-namespace {
-
-const char kStoryName[] = "story";
-
-// 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());
-
-    CreateStory();
-  }
-
-  ~TestApp() override = default;
-
- private:
-  TestPoint create_story_{"CreateStory()"};
-
-  void CreateStory() {
-    puppet_master_->ControlStory("story", story_puppet_master_.NewRequest());
-
-    fidl::VectorPtr<fuchsia::modular::StoryCommand> commands;
-    fuchsia::modular::AddMod add_mod;
-    add_mod.mod_name.push_back("root");
-    add_mod.intent.action = "action";
-    add_mod.intent.handler = kModuleUrl;
-
-    fuchsia::modular::IntentParameterData data;
-    fsl::SizedVmo vmo;
-    FXL_CHECK(fsl::VmoFromString(R"("initial data for the story")", &vmo));
-    data.set_json(std::move(vmo).ToTransport());
-    fuchsia::modular::IntentParameter intent_parameter;
-    intent_parameter.name = "rootModuleParam1";
-    intent_parameter.data = std::move(data);
-    add_mod.intent.parameters.push_back(std::move(intent_parameter));
-
-    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();
-        });
-  }
-
-  void StartStory() {
-    // Request start of the new story.
-    story_provider()->GetController(kStoryName, story_controller_.NewRequest());
-    story_controller_->RequestStart();
-  }
-
-  fuchsia::modular::PuppetMasterPtr puppet_master_;
-  fuchsia::modular::StoryPuppetMasterPtr story_puppet_master_;
-  fidl::StringPtr story_id_;
-  fuchsia::modular::StoryControllerPtr story_controller_;
-  FXL_DISALLOW_COPY_AND_ASSIGN(TestApp);
-};
-
-}  // namespace
-
-int main(int /*argc*/, const char** /*argv*/) {
-  modular::testing::ComponentMain<TestApp>();
-  return 0;
-}
diff --git a/tests/chain/defs.h b/tests/chain/defs.h
deleted file mode 100644
index c316a2e..0000000
--- a/tests/chain/defs.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_TESTS_CHAIN_DEFS_H_
-#define PERIDOT_TESTS_CHAIN_DEFS_H_
-
-namespace {
-
-// Package URLs of the test components used here.
-constexpr char kModuleUrl[] =
-    "fuchsia-pkg://fuchsia.com/chain_test_module#meta/chain_test_module.cmx";
-constexpr char kChildModuleUrl[] =
-    "fuchsia-pkg://fuchsia.com/chain_test_child_module#meta/chain_test_child_module.cmx";
-
-}  // namespace
-
-#endif  // PERIDOT_TESTS_CHAIN_DEFS_H_
diff --git a/tests/chain/meta/chain_test_child_module.cmx b/tests/chain/meta/chain_test_child_module.cmx
deleted file mode 100644
index 16f817c..0000000
--- a/tests/chain/meta/chain_test_child_module.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.net.LegacySocketProvider",
-            "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"
-        ]
-    }
-}
\ No newline at end of file
diff --git a/tests/chain/meta/chain_test_module.cmx b/tests/chain/meta/chain_test_module.cmx
deleted file mode 100644
index 16f817c..0000000
--- a/tests/chain/meta/chain_test_module.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.net.LegacySocketProvider",
-            "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"
-        ]
-    }
-}
\ No newline at end of file
diff --git a/tests/chain/meta/chain_test_session_shell.cmx b/tests/chain/meta/chain_test_session_shell.cmx
deleted file mode 100644
index 16f817c..0000000
--- a/tests/chain/meta/chain_test_session_shell.cmx
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "program": {
-        "binary": "bin/app"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.modular.PuppetMaster",
-            "fuchsia.modular.SessionShellContext",
-            "fuchsia.net.LegacySocketProvider",
-            "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"
-        ]
-    }
-}
\ No newline at end of file
diff --git a/tests/modular_tests.json b/tests/modular_tests.json
index b682c0e..ce6d657 100644
--- a/tests/modular_tests.json
+++ b/tests/modular_tests.json
@@ -1,18 +1,6 @@
 {
   "tests": [
     {
-      "name": "chain",
-      "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/chain_test_session_shell#meta/chain_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": "clipboard",
       "exec": [
         "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
