diff --git a/bin/sessionmgr/sessionmgr_impl.cc b/bin/sessionmgr/sessionmgr_impl.cc
index 6330dd0..ad00f1b 100644
--- a/bin/sessionmgr/sessionmgr_impl.cc
+++ b/bin/sessionmgr/sessionmgr_impl.cc
@@ -765,7 +765,7 @@
   session_shell_app_->services().ConnectToService(view_provider.NewRequest());
   view_provider->CreateView(view_owner.NewRequest(), nullptr);
   session_shell_view_host_->ConnectView(std::move(view_owner));
-}  // namespace modular
+}
 
 void SessionmgrImpl::TerminateSessionShell(const std::function<void()>& done) {
   session_shell_app_->Teardown(kBasicTimeout, [this, done] {
diff --git a/bin/sessionmgr/story_runner/story_controller_impl.cc b/bin/sessionmgr/story_runner/story_controller_impl.cc
index 487e4eb..3adaa11 100644
--- a/bin/sessionmgr/story_runner/story_controller_impl.cc
+++ b/bin/sessionmgr/story_runner/story_controller_impl.cc
@@ -389,6 +389,12 @@
         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) {
@@ -401,6 +407,10 @@
             });
   }
 
+  // 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.
@@ -408,10 +418,8 @@
       return;
     }
 
-    // We only add a module to story shell if its either a root module or its
-    // anchor is already known to story shell.
-
     if (module_data_.module_path.size() == 1) {
+      // This is a root module; pass it's view on to the story shell.
       ConnectViewToStoryShell(flow, "");
       return;
     }
@@ -439,11 +447,12 @@
       module_data_.surface_relation->Clone(surface_relation_clone.get());
     }
 
-    story_controller_impl_->pending_views_.emplace(
+    story_controller_impl_->pending_story_shell_views_.emplace(
         ModulePathToSurfaceID(module_data_.module_path),
-        PendingView{module_data_.module_path, std::move(manifest_clone),
-                    std::move(surface_relation_clone),
-                    module_data_.module_source, std::move(view_owner_)});
+        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,
@@ -463,7 +472,7 @@
                                                      std::move(surface_info));
 
     story_controller_impl_->connected_views_.emplace(surface_id);
-    story_controller_impl_->ProcessPendingViews();
+    story_controller_impl_->ProcessPendingStoryShellViews();
     story_controller_impl_->story_shell_->FocusSurface(surface_id);
   }
 
@@ -554,8 +563,8 @@
 
     story_controller_impl_->DetachView([cont] { cont(false); });
 
-    async::PostDelayedTask(
-        async_get_default_dispatcher(), [cont] { cont(true); }, kBasicTimeout);
+    async::PostDelayedTask(async_get_default_dispatcher(),
+                           [cont] { cont(true); }, kBasicTimeout);
   }
 
   void StopStory() {
@@ -855,7 +864,7 @@
             std::move(module_controller_request_),
             std::move(view_owner_request_), [this, flow] {
               // LaunchModuleInShellCall above already calls
-              // ProcessPendingViews(). NOTE(thatguy): This
+              // ProcessPendingStoryShellViews(). NOTE(thatguy): This
               // cannot be moved into LaunchModuleCall, because
               // LaunchModuleInShellCall uses LaunchModuleCall
               // as the very first step of its operation. This
@@ -864,7 +873,7 @@
               // surface-relation parent (which we do as the
               // second part of LaunchModuleInShellCall).  So
               // we must defer to here.
-              story_controller_impl_->ProcessPendingViews();
+              story_controller_impl_->ProcessPendingStoryShellViews();
             }));
       }
     }
@@ -1153,7 +1162,8 @@
                           });
   FXL_DCHECK(fit != running_mod_infos_.end());
   fit->module_controller_impl.release();
-  pending_views_.erase(ModulePathToSurfaceID(fit->module_data->module_path));
+  pending_story_shell_views_.erase(
+      ModulePathToSurfaceID(fit->module_data->module_path));
   running_mod_infos_.erase(fit);
 }
 
@@ -1243,7 +1253,7 @@
       nullptr /* view_owner_request */, std::move(callback)));
 }
 
-void StoryControllerImpl::ProcessPendingViews() {
+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
@@ -1257,7 +1267,7 @@
 
   std::vector<fidl::StringPtr> added_keys;
 
-  for (auto& kv : pending_views_) {
+  for (auto& kv : pending_story_shell_views_) {
     auto* const running_mod_info = FindRunningModInfo(kv.second.module_path);
     if (!running_mod_info) {
       continue;
@@ -1292,9 +1302,9 @@
 
   if (added_keys.size()) {
     for (auto& key : added_keys) {
-      pending_views_.erase(key);
+      pending_story_shell_views_.erase(key);
     }
-    ProcessPendingViews();
+    ProcessPendingStoryShellViews();
   }
 }
 
@@ -1491,10 +1501,8 @@
   auto* anchor = FindRunningModInfo(
       ParentModulePath(running_mod_info->module_data->module_path));
 
-  // Traverse up until there is a non-embedded module. We recognize
-  // non-embedded modules by having a non-null SurfaceRelation. If the root
-  // module is there at all, it has a non-null surface relation.
-  while (anchor && !anchor->module_data->surface_relation) {
+  // Traverse up until there is a non-embedded module.
+  while (anchor && anchor->module_data->is_embedded) {
     anchor =
         FindRunningModInfo(ParentModulePath(anchor->module_data->module_path));
   }
@@ -1570,4 +1578,4 @@
   }
 }
 
-}  // namespace modular
+}  // 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
index 1560544..dbd22b2 100644
--- a/bin/sessionmgr/story_runner/story_controller_impl.h
+++ b/bin/sessionmgr/story_runner/story_controller_impl.h
@@ -148,6 +148,54 @@
   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;
@@ -184,7 +232,7 @@
   void NotifyOneStoryWatcher(
       const fuchsia::modular::storymodel::StoryModel& model,
       fuchsia::modular::StoryWatcher* watcher);
-  void ProcessPendingViews();
+  void ProcessPendingStoryShellViews();
   std::set<fuchsia::modular::LinkPath> GetActiveLinksInternal();
 
   bool IsExternalModule(const std::vector<std::string>& module_path);
@@ -202,6 +250,21 @@
   // 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.
@@ -240,57 +303,14 @@
   // not yet sent to story shell.
   std::set<fidl::StringPtr> connected_views_;
 
-  // Holds the view of a non-embedded running module (identified by its
-  // serialized module path) until its parent is connected to story shell. Story
-  // shell cannot display views whose parents are not yet displayed.
-  struct PendingView {
-    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;
-  };
-  std::map<std::string, PendingView> pending_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_;
 
-  // The first ingredient of a story: Modules. 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;
-  };
   std::vector<RunningModInfo> running_mod_infos_;
 
-  // 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 second ingredient of a story: Links. They connect Modules.
   fidl::BindingSet<Link, std::unique_ptr<LinkImpl>> link_impls_;
 
@@ -312,22 +332,6 @@
 
   fxl::WeakPtrFactory<StoryControllerImpl> weak_factory_;
 
-  // 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;
-
   FXL_DISALLOW_COPY_AND_ASSIGN(StoryControllerImpl);
 };
 
diff --git a/tests/common/common_null_module.cc b/tests/common/common_null_module.cc
index 1d212b2..c406863 100644
--- a/tests/common/common_null_module.cc
+++ b/tests/common/common_null_module.cc
@@ -18,26 +18,26 @@
 // The NullModule just sits there and does nothing until it's terminated.
 class NullModule {
  public:
-  TestPoint initialized_{"Null module initialized"};
-
   NullModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_host_(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*/)
+             fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
+                 view_provider_request)
       : NullModule(
             module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
+            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {
+    viewsv1_view_provider_ = std::move(view_provider_request);
+  }
 
   // Called by ModuleDriver.
-  TestPoint stopped_{"Null module stopped"};
   void Terminate(const std::function<void()>& done) {
     Signal(kCommonNullModuleStopped);
     stopped_.Pass();
@@ -45,7 +45,15 @@
   }
 
  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
diff --git a/tests/embed_shell/embed_shell_test_child_module.cc b/tests/embed_shell/embed_shell_test_child_module.cc
index cfc7129..fc77731 100644
--- a/tests/embed_shell/embed_shell_test_child_module.cc
+++ b/tests/embed_shell/embed_shell_test_child_module.cc
@@ -20,19 +20,22 @@
 class TestModule {
  public:
   TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_host_(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*/)
+             fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
+                 view_provider_request)
       : TestModule(
             module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
+            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) {
@@ -62,6 +65,13 @@
   }
 
   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);
diff --git a/tests/embed_shell/embed_shell_test_parent_module.cc b/tests/embed_shell/embed_shell_test_parent_module.cc
index f5f7a15..d1dbcee 100644
--- a/tests/embed_shell/embed_shell_test_parent_module.cc
+++ b/tests/embed_shell/embed_shell_test_parent_module.cc
@@ -27,20 +27,23 @@
 class TestModule {
  public:
   TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::app::ViewProvider> /*view_provider_request*/)
-      : module_host_(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*/)
+             fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
+                 view_provider_request)
       : TestModule(
             module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
+            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);
@@ -77,6 +80,12 @@
   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);
 };
 
diff --git a/tests/modular_tests.json b/tests/modular_tests.json
index a85e107..fa592ec 100644
--- a/tests/modular_tests.json
+++ b/tests/modular_tests.json
@@ -29,7 +29,6 @@
     },
     {
       "name": "embed_shell",
-      "disabled": true,
       "exec": [
         "basemgr",
         "--test",
@@ -94,7 +93,6 @@
     },
     {
       "name": "story_shell",
-      "disabled": true,
       "exec": [
         "fuchsia-pkg://fuchsia.com/basemgr#meta/basemgr.cmx",
         "--test",
diff --git a/tests/suggestion/suggestion_test_module.cc b/tests/suggestion/suggestion_test_module.cc
index 0d7b027..62a0757 100644
--- a/tests/suggestion/suggestion_test_module.cc
+++ b/tests/suggestion/suggestion_test_module.cc
@@ -29,9 +29,10 @@
   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) {
+             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();
 
@@ -80,11 +81,13 @@
   }
 
   TestModule(modular::ModuleHost* const module_host,
-             fidl::InterfaceRequest<
-                 fuchsia::ui::viewsv1::ViewProvider> /*view_provider_request*/)
+             fidl::InterfaceRequest<fuchsia::ui::viewsv1::ViewProvider>
+                 view_provider_request)
       : TestModule(
             module_host,
-            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {}
+            fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider>(nullptr)) {
+    views1_view_provider_ = std::move(view_provider_request);
+  }
 
   // Called by ModuleDriver.
   TestPoint stopped_{"Root module stopped"};
@@ -105,6 +108,12 @@
   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);
 };
 
