diff --git a/bin/basemgr/basemgr_settings.cc b/bin/basemgr/basemgr_settings.cc
index 3cb9842..23a1612 100644
--- a/bin/basemgr/basemgr_settings.cc
+++ b/bin/basemgr/basemgr_settings.cc
@@ -16,12 +16,12 @@
 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");
+      "fuchsia-pkg://fuchsia.com/userpicker_base_shell#meta/"
+      "userpicker_base_shell.cmx");
   story_shell.url =
       command_line.GetOptionValueWithDefault("story_shell", "mondrian");
   sessionmgr.url = command_line.GetOptionValueWithDefault(
-      "sessionmgr",
-      "fuchsia-pkg://fuchsia.com/sessionmgr#meta/sessionmgr.cmx");
+      "sessionmgr", "fuchsia-pkg://fuchsia.com/sessionmgr#meta/sessionmgr.cmx");
   session_shell.url = command_line.GetOptionValueWithDefault(
       "session_shell", "ermine_session_shell");
   account_provider.url = command_line.GetOptionValueWithDefault(
@@ -30,6 +30,11 @@
   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", ""),
@@ -46,7 +51,9 @@
       &session_shell.args);
 
   if (test) {
-    base_shell.args.push_back("--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");
diff --git a/bin/basemgr/basemgr_settings.h b/bin/basemgr/basemgr_settings.h
index 1e91a06..45333c7 100644
--- a/bin/basemgr/basemgr_settings.h
+++ b/bin/basemgr/basemgr_settings.h
@@ -31,6 +31,7 @@
   bool disable_statistics;
   bool no_minfs;
   bool test;
+  bool run_base_shell_with_test_runner;
   bool enable_presenter;
 
  private:
diff --git a/bin/sessionctl/main.cc b/bin/sessionctl/main.cc
index ffa5a3d..4b387ef 100644
--- a/bin/sessionctl/main.cc
+++ b/bin/sessionctl/main.cc
@@ -123,9 +123,10 @@
   // See peridot/bin/sessionmgr/sessionmgr_impl.cc's definition of
   // kSessionCtlDir for "sessionctl". These must match.
   std::vector<DebugService> sessions;
-  FindDebugServicesForPath("/hub/c/sessionmgr.cmx/*/out/debug/sessionctl",
-                           kRegex, &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);
@@ -148,8 +149,8 @@
   auto request = basemgr.NewRequest().TakeChannel();
 
   std::vector<DebugService> services;
-  FindDebugServicesForPath("/hub/c/basemgr.cmx/*/out/debug/basemgr",
-                           "basemgr.cmx", &services);
+  FindDebugServicesForPath(modular::kBasemgrDebugServiceGlobPath, "basemgr.cmx",
+                           &services);
 
   if (services.empty()) {
     return nullptr;
diff --git a/bin/sessionctl/session_ctl_constants.h b/bin/sessionctl/session_ctl_constants.h
index 9bcc580..7ccc0c3 100644
--- a/bin/sessionctl/session_ctl_constants.h
+++ b/bin/sessionctl/session_ctl_constants.h
@@ -26,6 +26,11 @@
 // Internal error string returned from SessionCtlApp.ExecuteCommand() if
 // the user does not set a required flag.
 constexpr char kGetUsageErrorString[] = "GetUsage";
+
+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/packages/tests/modular_integration_tests b/packages/tests/modular_integration_tests
index db78459..d5a82d3 100644
--- a/packages/tests/modular_integration_tests
+++ b/packages/tests/modular_integration_tests
@@ -36,6 +36,7 @@
         "//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/session_shell:session_shell_test_session_shell",
+        "//peridot/tests/sessionctl:sessionctl_integration_tests"
     ]
 }
diff --git a/tests/sessionctl/BUILD.gn b/tests/sessionctl/BUILD.gn
new file mode 100644
index 0000000..e137c12
--- /dev/null
+++ b/tests/sessionctl/BUILD.gn
@@ -0,0 +1,35 @@
+# 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
new file mode 100644
index 0000000..131b6ec
--- /dev/null
+++ b/tests/sessionctl/README.md
@@ -0,0 +1,4 @@
+# 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
new file mode 100644
index 0000000..bbced21
--- /dev/null
+++ b/tests/sessionctl/meta/sessionctl_test.cmx
@@ -0,0 +1,36 @@
+{
+    "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.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"
+        ]
+    }
+}
diff --git a/tests/sessionctl/sessionctl_test.cc b/tests/sessionctl/sessionctl_test.cc
new file mode 100644
index 0000000..b6f762c
--- /dev/null
+++ b/tests/sessionctl/sessionctl_test.cc
@@ -0,0 +1,73 @@
+// 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
