diff --git a/apps/benchmark/benchmark_app.cc b/apps/benchmark/benchmark_app.cc
index 3e2ea0b..87b5ec3 100644
--- a/apps/benchmark/benchmark_app.cc
+++ b/apps/benchmark/benchmark_app.cc
@@ -19,11 +19,11 @@
 #include "base/strings/string_util.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/application/application_runner_chromium.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/bindings/interface_handle.h"
 #include "mojo/public/interfaces/application/service_provider.mojom.h"
 #include "mojo/services/tracing/interfaces/tracing.mojom.h"
@@ -31,18 +31,18 @@
 namespace benchmark {
 namespace {
 
-class BenchmarkApp : public mojo::ApplicationDelegate,
+class BenchmarkApp : public mojo::ApplicationImplBase,
                      public TraceCollectorClient::Receiver {
  public:
   BenchmarkApp() {}
   ~BenchmarkApp() override {}
 
-  // mojo:ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override {
+  // mojo:ApplicationImplBase:
+  void OnInitialize() override {
     // Parse command-line arguments.
-    if (!GetRunArgs(app->args(), &args_)) {
+    if (!GetRunArgs(args(), &args_)) {
       LOG(ERROR) << "Failed to parse the input arguments.";
-      mojo::ApplicationImpl::Terminate();
+      mojo::TerminateApplication(MOJO_RESULT_INVALID_ARGUMENT);
       return;
     }
 
@@ -57,8 +57,7 @@
     // Connect to trace collector, which will fetch the trace events produced by
     // the app being benchmarked.
     tracing::TraceCollectorPtr trace_collector;
-    mojo::ConnectToService(app->shell(), "mojo:tracing",
-                           GetProxy(&trace_collector));
+    mojo::ConnectToService(shell(), "mojo:tracing", GetProxy(&trace_collector));
     trace_collector_client_.reset(
         new TraceCollectorClient(this, trace_collector.Pass()));
     trace_collector_client_->Start(categories_str);
@@ -66,7 +65,7 @@
     // Start tracing the application with 1 sec of delay.
     base::MessageLoop::current()->PostDelayedTask(
         FROM_HERE, base::Bind(&BenchmarkApp::StartTracedApplication,
-                              base::Unretained(this), app),
+                              base::Unretained(this)),
         base::TimeDelta::FromSeconds(1));
   }
 
@@ -85,12 +84,12 @@
     return base::JoinString(unique_categories, ",");
   }
 
-  void StartTracedApplication(mojo::ApplicationImpl* app) {
+  void StartTracedApplication() {
     // Record the time origin for measurements just before connecting to the app
     // being benchmarked.
     time_origin_ = base::TimeTicks::FromInternalValue(MojoGetTimeTicksNow());
-    app->shell()->ConnectToApplication(
-        args_.app, GetProxy(&traced_app_connection_), nullptr);
+    shell()->ConnectToApplication(args_.app, GetProxy(&traced_app_connection_),
+                                  nullptr);
 
     // Post task to stop tracing when the time is up.
     base::MessageLoop::current()->PostDelayedTask(
@@ -122,7 +121,7 @@
     std::vector<Event> events;
     if (!GetEvents(trace_data, &events)) {
       LOG(ERROR) << "Failed to parse the trace data";
-      mojo::ApplicationImpl::Terminate();
+      mojo::TerminateApplication(MOJO_RESULT_UNKNOWN);
       return;
     }
 
@@ -147,7 +146,7 @@
     } else {
       printf("some measurements failed\n");
     }
-    mojo::ApplicationImpl::Terminate();
+    mojo::TerminateApplication(MOJO_RESULT_OK);
   }
 
  private:
@@ -162,8 +161,9 @@
 }  // namespace benchmark
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new benchmark::BenchmarkApp);
-  auto ret = runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  benchmark::BenchmarkApp benchmark_app;
+  auto ret = mojo::RunApplication(application_request, &benchmark_app);
   fflush(nullptr);
   return ret;
 }
diff --git a/examples/echo/echo_benchmark.cc b/examples/echo/echo_benchmark.cc
index 30e8044..3d4f27d 100644
--- a/examples/echo/echo_benchmark.cc
+++ b/examples/echo/echo_benchmark.cc
@@ -8,12 +8,12 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "examples/echo/echo.mojom.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/common/tracing_impl.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/utility/run_loop.h"
 
 namespace mojo {
@@ -24,24 +24,24 @@
 
 static const base::TimeDelta kDelayTime = base::TimeDelta::FromMicroseconds(50);
 
-class EchoClientDelegate;
+class EchoClientApp;
 
 class EchoResponse {
  public:
-  EchoResponse(EchoClientDelegate* echo, int idx, bool traced)
-      : echoDelegate_(echo), idx_(idx), traced_(traced) {}
+  EchoResponse(EchoClientApp* echo, int idx, bool traced)
+      : echo_client_app_(echo), idx_(idx), traced_(traced) {}
 
   void Run(const String& value) const;
 
  private:
-  EchoClientDelegate* echoDelegate_;
+  EchoClientApp* echo_client_app_;
   int idx_;
   bool traced_;
 };
 
-class EchoClientDelegate : public ApplicationDelegate {
+class EchoClientApp : public ApplicationImplBase {
  public:
-  EchoClientDelegate()
+  EchoClientApp()
       : warmup_(true),
         num_clients_(1),
         num_active_clients_(1),
@@ -49,25 +49,24 @@
         ending_(false),
         benchmark_duration_(base::TimeDelta::FromSeconds(10)) {}
 
-  void Initialize(ApplicationImpl* app) override {
-    tracing_.Initialize(app->shell(), &app->args());
+  void OnInitialize() override {
+    tracing_.Initialize(shell(), &args());
 
-    ParseArguments(app);
+    ParseArguments();
 
     for (int i = 0; i < num_clients_; i++) {
       EchoPtr echo;
       if (use_dart_server_) {
-        ConnectToService(app->shell(), "mojo:dart_echo_server",
-                         GetProxy(&echo));
+        ConnectToService(shell(), "mojo:dart_echo_server", GetProxy(&echo));
       } else {
-        ConnectToService(app->shell(), "mojo:echo_server", GetProxy(&echo));
+        ConnectToService(shell(), "mojo:echo_server", GetProxy(&echo));
       }
       echoClients_.push_back(echo.Pass());
     }
     BeginEcho(0);
     base::MessageLoop::current()->PostDelayedTask(
         FROM_HERE,
-        base::Bind(&EchoClientDelegate::EndWarmup, base::Unretained(this)),
+        base::Bind(&EchoClientApp::EndWarmup, base::Unretained(this)),
         kWarmupTime);
   }
 
@@ -77,12 +76,10 @@
       idx = 0;
     }
     base::MessageLoop::current()->PostDelayedTask(
-        FROM_HERE,
-        base::Bind(&EchoClientDelegate::Run, base::Unretained(this), idx),
+        FROM_HERE, base::Bind(&EchoClientApp::Run, base::Unretained(this), idx),
         kDelayTime);
     base::MessageLoop::current()->PostDelayedTask(
-        FROM_HERE,
-        base::Bind(&EchoClientDelegate::EndRun, base::Unretained(this)),
+        FROM_HERE, base::Bind(&EchoClientApp::EndRun, base::Unretained(this)),
         benchmark_duration_);
   }
 
@@ -129,10 +126,10 @@
     return false;
   }
 
-  void ParseArguments(ApplicationImpl* app) {
+  void ParseArguments() {
     int benchmark_duration_seconds = 0;
-    for (size_t i = 0; i < app->args().size(); i++) {
-      const std::string& argument = app->args()[i];
+    for (size_t i = 0; i < args().size(); i++) {
+      const std::string& argument = args()[i];
       if (GetBoolArgument(argument, "--dart-server", &use_dart_server_)) {
         continue;
       }
@@ -167,15 +164,15 @@
 };
 
 void EchoResponse::Run(const String& value) const {
-  echoDelegate_->EndEcho(idx_, traced_);
-  echoDelegate_->BeginEcho(idx_ + 1);
+  echo_client_app_->EndEcho(idx_, traced_);
+  echo_client_app_->BeginEcho(idx_ + 1);
 }
 
 }  // namespace examples
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new mojo::examples::EchoClientDelegate);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  mojo::examples::EchoClientApp echo_client_app;
+  return mojo::RunApplication(application_request, &echo_client_app);
 }
diff --git a/examples/forwarding_content_handler/forwarding_content_handler.cc b/examples/forwarding_content_handler/forwarding_content_handler.cc
index cfc284a..e6d3531 100644
--- a/examples/forwarding_content_handler/forwarding_content_handler.cc
+++ b/examples/forwarding_content_handler/forwarding_content_handler.cc
@@ -6,11 +6,12 @@
 
 #include "base/macros.h"
 #include "base/memory/scoped_ptr.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/application/content_handler_factory.h"
 #include "mojo/data_pipe_utils/data_pipe_utils.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/application/service_provider_impl.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/utility/run_loop.h"
@@ -51,15 +52,14 @@
   ShellPtr shell_;
 };
 
-class ForwardingContentHandler : public ApplicationDelegate,
+class ForwardingContentHandler : public ApplicationImplBase,
                                  public ContentHandlerFactory::ManagedDelegate {
  public:
   ForwardingContentHandler() {}
 
  private:
-  // Overridden from ApplicationDelegate:
-  bool ConfigureIncomingConnection(
-      ServiceProviderImpl* service_provider_impl) override {
+  // Overridden from ApplicationImplBase:
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<ContentHandler>(
         ContentHandlerFactory::GetInterfaceRequestHandler(this));
     return true;
@@ -87,7 +87,7 @@
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new mojo::examples::ForwardingContentHandler());
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  mojo::examples::ForwardingContentHandler forwarding_content_handler;
+  return mojo::RunApplication(application_request, &forwarding_content_handler);
 }
diff --git a/examples/trace_me/trace_me_app.cc b/examples/trace_me/trace_me_app.cc
index 81887cf..6ab1913 100644
--- a/examples/trace_me/trace_me_app.cc
+++ b/examples/trace_me/trace_me_app.cc
@@ -8,11 +8,11 @@
 #include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/common/tracing_impl.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/application/service_provider_impl.h"
 
 // This is an example app that uses implementation of tracing from mojo/common
@@ -44,16 +44,16 @@
                                                 kDoWorkDelay);
 }
 
-class TraceMeApp : public mojo::ApplicationDelegate {
+class TraceMeApp : public mojo::ApplicationImplBase {
  public:
   TraceMeApp() {}
   ~TraceMeApp() override {}
 
-  // mojo:ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override {
+  // mojo:ApplicationImplBase:
+  void OnInitialize() override {
     // Allow TracingImpl to connect to the central tracing service, advertising
     // its ability to provide trace events.
-    tracing_.Initialize(app->shell(), &app->args());
+    tracing_.Initialize(shell(), &args());
 
     TRACE_EVENT0("trace_me", "initialized");
 
@@ -61,8 +61,8 @@
         FROM_HERE, base::Bind(&DoWork), kDoWorkDelay);
   }
 
-  // mojo:ApplicationDelegate:
-  bool ConfigureIncomingConnection(
+  // mojo:ApplicationImplBase:
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     TRACE_EVENT0("trace_me", "connected");
     return true;
@@ -76,6 +76,7 @@
 }  // namespace examples
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new examples::TraceMeApp);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  examples::TraceMeApp trace_me_app;
+  return mojo::RunApplication(application_request, &trace_me_app);
 }
diff --git a/mojo/application/run_application.cc b/mojo/application/run_application.cc
index ea067d4..9f84b9e 100644
--- a/mojo/application/run_application.cc
+++ b/mojo/application/run_application.cc
@@ -10,6 +10,7 @@
 #include "base/command_line.h"
 #include "base/debug/stack_trace.h"
 #include "base/lazy_instance.h"
+#include "base/logging.h"
 #include "base/message_loop/message_loop.h"
 #include "base/threading/thread_local.h"
 #include "build/build_config.h"
@@ -73,7 +74,15 @@
 }
 
 void TerminateApplication(MojoResult result) {
-  DCHECK(base::MessageLoop::current()->is_running());
+  // TODO(vtl): Rather than asserting |...->is_running()|, just assert that we
+  // have one, since we may be called during message loop teardown. (The
+  // HandleWatcher is notified of the message loop's pending destruction, and
+  // triggers connection errors.) I should think about this some more.
+  DCHECK(base::MessageLoop::current());
+  if (!base::MessageLoop::current()->is_running()) {
+    DLOG(WARNING) << "TerminateApplication() with message loop not running";
+    return;
+  }
   base::MessageLoop::current()->Quit();
 
   ResultHolder* result_holder = g_current_result_holder.Pointer()->Get();
diff --git a/services/debugger/debugger.cc b/services/debugger/debugger.cc
index e642f1a..689e0c2 100644
--- a/services/debugger/debugger.cc
+++ b/services/debugger/debugger.cc
@@ -8,12 +8,12 @@
 #include "base/debug/profiler.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/data_pipe_utils/data_pipe_utils.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/services/http_server/cpp/http_server_util.h"
 #include "mojo/services/http_server/interfaces/http_server.mojom.h"
@@ -29,26 +29,24 @@
 
 namespace debugger {
 
-class Debugger : public mojo::ApplicationDelegate,
+class Debugger : public mojo::ApplicationImplBase,
                  public http_server::HttpHandler {
  public:
-  Debugger() : is_tracing_(false), app_(nullptr), handler_binding_(this) {}
+  Debugger() : is_tracing_(false), handler_binding_(this) {}
   ~Debugger() override {}
 
  private:
-  // mojo::ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override {
-    app_ = app;
-
+  // mojo::ApplicationImplBase:
+  void OnInitialize() override {
     // Format: --args-for="app_url command_port"
-    if (app->args().size() < 2) {
+    if (args().size() < 2) {
       LOG(ERROR) << "--args-for required to specify command_port";
-      mojo::ApplicationImpl::Terminate();
+      mojo::TerminateApplication(MOJO_RESULT_INVALID_ARGUMENT);
       return;
     }
-    base::StringToUint(app->args()[1], &command_port_);
+    base::StringToUint(args()[1], &command_port_);
     http_server::HttpServerFactoryPtr http_server_factory;
-    mojo::ConnectToService(app->shell(), "mojo:http_server",
+    mojo::ConnectToService(shell(), "mojo:http_server",
                            GetProxy(&http_server_factory));
 
     mojo::NetAddressPtr local_address(mojo::NetAddress::New());
@@ -118,8 +116,7 @@
     }
 
     if (!tracing_) {
-      mojo::ConnectToService(app_->shell(), "mojo:tracing",
-                             GetProxy(&tracing_));
+      mojo::ConnectToService(shell(), "mojo:tracing", GetProxy(&tracing_));
     }
     is_tracing_ = true;
     mojo::DataPipe pipe;
@@ -146,7 +143,6 @@
   }
 
   bool is_tracing_;
-  mojo::ApplicationImpl* app_;
   tracing::TraceCollectorPtr tracing_;
   uint32_t command_port_;
 
@@ -161,7 +157,7 @@
 }  // namespace debugger
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new debugger::Debugger);
-  runner.set_message_loop_type(base::MessageLoop::TYPE_IO);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  debugger::Debugger debugger_app;
+  return mojo::RunApplication(application_request, &debugger_app);
 }
diff --git a/services/gfx/compositor/compositor_app.cc b/services/gfx/compositor/compositor_app.cc
index bd05c8a..7f52199 100644
--- a/services/gfx/compositor/compositor_app.cc
+++ b/services/gfx/compositor/compositor_app.cc
@@ -16,25 +16,23 @@
 
 namespace compositor {
 
-CompositorApp::CompositorApp() : app_impl_(nullptr) {}
+CompositorApp::CompositorApp() {}
 
 CompositorApp::~CompositorApp() {}
 
-void CompositorApp::Initialize(mojo::ApplicationImpl* app_impl) {
-  app_impl_ = app_impl;
-
+void CompositorApp::OnInitialize() {
   auto command_line = base::CommandLine::ForCurrentProcess();
-  command_line->InitFromArgv(app_impl_->args());
+  command_line->InitFromArgv(args());
   logging::LoggingSettings settings;
   settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
   logging::InitLogging(settings);
 
-  tracing_.Initialize(app_impl_->shell(), &app_impl_->args());
+  tracing_.Initialize(shell(), &args());
 
   engine_.reset(new CompositorEngine());
 }
 
-bool CompositorApp::ConfigureIncomingConnection(
+bool CompositorApp::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<mojo::gfx::composition::Compositor>(
       [this](const mojo::ConnectionContext& connection_context,
diff --git a/services/gfx/compositor/compositor_app.h b/services/gfx/compositor/compositor_app.h
index ceb0428..892ba2e 100644
--- a/services/gfx/compositor/compositor_app.h
+++ b/services/gfx/compositor/compositor_app.h
@@ -8,28 +8,26 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "base/memory/scoped_ptr.h"
 #include "mojo/common/strong_binding_set.h"
 #include "mojo/common/tracing_impl.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/services/gfx/composition/interfaces/compositor.mojom.h"
 #include "services/gfx/compositor/compositor_engine.h"
 
 namespace compositor {
 
 // Compositor application entry point.
-class CompositorApp : public mojo::ApplicationDelegate {
+class CompositorApp : public mojo::ApplicationImplBase {
  public:
   CompositorApp();
   ~CompositorApp() override;
 
  private:
-  // |ApplicationDelegate|:
-  void Initialize(mojo::ApplicationImpl* app_impl) override;
-  bool ConfigureIncomingConnection(
+  // |ApplicationImplBase|:
+  void OnInitialize() override;
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
-  mojo::ApplicationImpl* app_impl_;
   mojo::TracingImpl tracing_;
 
   mojo::StrongBindingSet<mojo::gfx::composition::Compositor>
diff --git a/services/gfx/compositor/main.cc b/services/gfx/compositor/main.cc
index e03e9ca..f3d9354 100644
--- a/services/gfx/compositor/main.cc
+++ b/services/gfx/compositor/main.cc
@@ -2,11 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/application/application_runner_chromium.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/gfx/compositor/compositor_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new compositor::CompositorApp);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  compositor::CompositorApp compositor_app;
+  return mojo::RunApplication(application_request, &compositor_app);
 }
diff --git a/services/http_server/http_server_app.cc b/services/http_server/http_server_app.cc
index c6d6b3c..780dd9c 100644
--- a/services/http_server/http_server_app.cc
+++ b/services/http_server/http_server_app.cc
@@ -20,7 +20,7 @@
   ~HttpServerApp() override {}
 
  private:
-  // ApplicationDelegate:
+  // ApplicationImplBase:
   bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<HttpServerFactory>([this](
diff --git a/services/ui/input_manager/input_manager_app.cc b/services/ui/input_manager/input_manager_app.cc
index d75969c..62d8ab7 100644
--- a/services/ui/input_manager/input_manager_app.cc
+++ b/services/ui/input_manager/input_manager_app.cc
@@ -7,32 +7,27 @@
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/common/tracing_impl.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/service_provider_impl.h"
 #include "services/ui/input_manager/input_associate.h"
 
 namespace input_manager {
 
-InputManagerApp::InputManagerApp() : app_impl_(nullptr) {}
+InputManagerApp::InputManagerApp() {}
 
 InputManagerApp::~InputManagerApp() {}
 
-void InputManagerApp::Initialize(mojo::ApplicationImpl* app_impl) {
-  app_impl_ = app_impl;
-
+void InputManagerApp::OnInitialize() {
   auto command_line = base::CommandLine::ForCurrentProcess();
-  command_line->InitFromArgv(app_impl_->args());
+  command_line->InitFromArgv(args());
   logging::LoggingSettings settings;
   settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
   logging::InitLogging(settings);
 
-  tracing_.Initialize(app_impl->shell(), &app_impl->args());
+  tracing_.Initialize(shell(), &args());
 }
 
-bool InputManagerApp::ConfigureIncomingConnection(
+bool InputManagerApp::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<mojo::ui::ViewAssociate>([this](
       const mojo::ConnectionContext& connection_context,
diff --git a/services/ui/input_manager/input_manager_app.h b/services/ui/input_manager/input_manager_app.h
index d0c13ac..36eb65e 100644
--- a/services/ui/input_manager/input_manager_app.h
+++ b/services/ui/input_manager/input_manager_app.h
@@ -5,29 +5,26 @@
 #ifndef SERVICES_UI_INPUT_MANAGER_INPUT_MANAGER_APP_H_
 #define SERVICES_UI_INPUT_MANAGER_INPUT_MANAGER_APP_H_
 
-#include <memory>
-
 #include "base/macros.h"
 #include "mojo/common/strong_binding_set.h"
 #include "mojo/common/tracing_impl.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/services/ui/views/interfaces/view_associates.mojom.h"
 
 namespace input_manager {
 
 // Input manager application entry point.
-class InputManagerApp : public mojo::ApplicationDelegate {
+class InputManagerApp : public mojo::ApplicationImplBase {
  public:
   InputManagerApp();
   ~InputManagerApp() override;
 
  private:
-  // |ApplicationDelegate|:
-  void Initialize(mojo::ApplicationImpl* app_impl) override;
-  bool ConfigureIncomingConnection(
+  // |ApplicationImplBase|:
+  void OnInitialize() override;
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
-  mojo::ApplicationImpl* app_impl_;
   mojo::TracingImpl tracing_;
 
   mojo::StrongBindingSet<mojo::ui::ViewAssociate> input_associates_;
diff --git a/services/ui/input_manager/main.cc b/services/ui/input_manager/main.cc
index 286f898..ed3768a 100644
--- a/services/ui/input_manager/main.cc
+++ b/services/ui/input_manager/main.cc
@@ -2,11 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/application/application_runner_chromium.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/ui/input_manager/input_manager_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new input_manager::InputManagerApp);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  input_manager::InputManagerApp input_manager_app;
+  return mojo::RunApplication(application_request, &input_manager_app);
 }
diff --git a/services/ui/launcher/launch_instance.cc b/services/ui/launcher/launch_instance.cc
index ce3149e..6a95fdc 100644
--- a/services/ui/launcher/launch_instance.cc
+++ b/services/ui/launcher/launch_instance.cc
@@ -5,25 +5,18 @@
 #include "services/ui/launcher/launch_instance.h"
 
 #include "base/bind.h"
-#include "base/command_line.h"
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/application/application_runner_chromium.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/connect.h"
 #include "services/ui/launcher/launcher_view_tree.h"
 
 namespace launcher {
 
-LaunchInstance::LaunchInstance(mojo::ApplicationImpl* app_impl,
-                               mojo::NativeViewportPtr viewport,
+LaunchInstance::LaunchInstance(mojo::NativeViewportPtr viewport,
                                mojo::ui::ViewProviderPtr view_provider,
                                mojo::gfx::composition::Compositor* compositor,
                                mojo::ui::ViewManager* view_manager,
                                const base::Closure& shutdown_callback)
-    : app_impl_(app_impl),
-      viewport_(viewport.Pass()),
+    : viewport_(viewport.Pass()),
       view_provider_(view_provider.Pass()),
       compositor_(compositor),
       view_manager_(view_manager),
diff --git a/services/ui/launcher/launch_instance.h b/services/ui/launcher/launch_instance.h
index 9e63db0..7f94617 100644
--- a/services/ui/launcher/launch_instance.h
+++ b/services/ui/launcher/launch_instance.h
@@ -8,8 +8,6 @@
 #include <memory>
 
 #include "base/callback.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/services/gfx/composition/interfaces/compositor.mojom.h"
 #include "mojo/services/native_viewport/interfaces/native_viewport.mojom.h"
@@ -23,8 +21,7 @@
 
 class LaunchInstance : public mojo::NativeViewportEventDispatcher {
  public:
-  LaunchInstance(mojo::ApplicationImpl* app_impl,
-                 mojo::NativeViewportPtr viewport,
+  LaunchInstance(mojo::NativeViewportPtr viewport,
                  mojo::ui::ViewProviderPtr view_provider,
                  mojo::gfx::composition::Compositor* compositor,
                  mojo::ui::ViewManager* view_manager,
@@ -44,12 +41,11 @@
   void OnViewportMetricsChanged(mojo::ViewportMetricsPtr metrics);
   void RequestUpdatedViewportMetrics();
 
-  mojo::ApplicationImpl* app_impl_;
   mojo::NativeViewportPtr viewport_;
   mojo::ui::ViewProviderPtr view_provider_;
 
-  mojo::gfx::composition::Compositor* compositor_;
-  mojo::ui::ViewManager* view_manager_;
+  mojo::gfx::composition::Compositor* const compositor_;
+  mojo::ui::ViewManager* const view_manager_;
   base::Closure shutdown_callback_;
 
   mojo::Binding<NativeViewportEventDispatcher>
diff --git a/services/ui/launcher/launcher_app.cc b/services/ui/launcher/launcher_app.cc
index b29f831..0359d95 100644
--- a/services/ui/launcher/launcher_app.cc
+++ b/services/ui/launcher/launcher_app.cc
@@ -8,29 +8,25 @@
 #include "base/logging.h"
 #include "base/strings/string_split.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/common/tracing_impl.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/application/service_provider_impl.h"
 
 namespace launcher {
 
-LauncherApp::LauncherApp() : app_impl_(nullptr), next_id_(0u) {}
+LauncherApp::LauncherApp() : next_id_(0u) {}
 
 LauncherApp::~LauncherApp() {}
 
-void LauncherApp::Initialize(mojo::ApplicationImpl* app_impl) {
-  app_impl_ = app_impl;
-
+void LauncherApp::OnInitialize() {
   auto command_line = base::CommandLine::ForCurrentProcess();
-  command_line->InitFromArgv(app_impl_->args());
+  command_line->InitFromArgv(args());
   logging::LoggingSettings settings;
   settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
   logging::InitLogging(settings);
 
-  tracing_.Initialize(app_impl_->shell(), &app_impl_->args());
+  tracing_.Initialize(shell(), &args());
   TRACE_EVENT0("launcher", __func__);
 
   InitCompositor();
@@ -43,14 +39,14 @@
 }
 
 void LauncherApp::InitCompositor() {
-  mojo::ConnectToService(app_impl_->shell(), "mojo:compositor_service",
+  mojo::ConnectToService(shell(), "mojo:compositor_service",
                          GetProxy(&compositor_));
   compositor_.set_connection_error_handler(base::Bind(
       &LauncherApp::OnCompositorConnectionError, base::Unretained(this)));
 }
 
 void LauncherApp::InitViewManager() {
-  mojo::ConnectToService(app_impl_->shell(), "mojo:view_manager_service",
+  mojo::ConnectToService(shell(), "mojo:view_manager_service",
                          GetProxy(&view_manager_));
   view_manager_.set_connection_error_handler(base::Bind(
       &LauncherApp::OnViewManagerConnectionError, base::Unretained(this)));
@@ -76,7 +72,7 @@
     // Connect to the ViewAssociate.
     DVLOG(2) << "Connecting to ViewAssociate " << url;
     mojo::ui::ViewAssociatePtr view_associate;
-    mojo::ConnectToService(app_impl_->shell(), url, GetProxy(&view_associate));
+    mojo::ConnectToService(shell(), url, GetProxy(&view_associate));
 
     // Wire up the associate to the ViewManager.
     mojo::ui::ViewAssociateOwnerPtr view_associate_owner;
@@ -91,7 +87,7 @@
   view_manager_->FinishedRegisteringViewAssociates();
 }
 
-bool LauncherApp::ConfigureIncomingConnection(
+bool LauncherApp::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   // Only present the launcher interface to the shell.
   if (service_provider_impl->connection_context().remote_url.empty()) {
@@ -108,15 +104,15 @@
   DVLOG(1) << "Launching " << application_url;
 
   mojo::NativeViewportPtr viewport;
-  mojo::ConnectToService(app_impl_->shell(), "mojo:native_viewport_service",
+  mojo::ConnectToService(shell(), "mojo:native_viewport_service",
                          GetProxy(&viewport));
 
   mojo::ui::ViewProviderPtr view_provider;
-  mojo::ConnectToService(app_impl_->shell(), application_url,
-                         GetProxy(&view_provider));
+  mojo::ConnectToService(shell(), application_url, GetProxy(&view_provider));
 
   LaunchInternal(viewport.Pass(), view_provider.Pass());
 }
+
 void LauncherApp::LaunchOnViewport(
     mojo::InterfaceHandle<mojo::NativeViewport> viewport,
     mojo::InterfaceHandle<mojo::ui::ViewProvider> view_provider) {
@@ -128,7 +124,7 @@
                                  mojo::ui::ViewProviderPtr view_provider) {
   uint32_t next_id = next_id_++;
   std::unique_ptr<LaunchInstance> instance(new LaunchInstance(
-      app_impl_, viewport.Pass(), view_provider.Pass(), compositor_.get(),
+      viewport.Pass(), view_provider.Pass(), compositor_.get(),
       view_manager_.get(), base::Bind(&LauncherApp::OnLaunchTermination,
                                       base::Unretained(this), next_id)));
   instance->Launch();
@@ -138,23 +134,23 @@
 void LauncherApp::OnLaunchTermination(uint32_t id) {
   launch_instances_.erase(id);
   if (launch_instances_.empty()) {
-    app_impl_->Terminate();
+    mojo::TerminateApplication(MOJO_RESULT_OK);
   }
 }
 
 void LauncherApp::OnCompositorConnectionError() {
   LOG(ERROR) << "Exiting due to compositor connection error.";
-  app_impl_->Terminate();
+  mojo::TerminateApplication(MOJO_RESULT_UNKNOWN);
 }
 
 void LauncherApp::OnViewManagerConnectionError() {
   LOG(ERROR) << "Exiting due to view manager connection error.";
-  app_impl_->Terminate();
+  mojo::TerminateApplication(MOJO_RESULT_UNKNOWN);
 }
 
 void LauncherApp::OnViewAssociateConnectionError() {
   LOG(ERROR) << "Exiting due to view associate connection error.";
-  app_impl_->Terminate();
+  mojo::TerminateApplication(MOJO_RESULT_UNKNOWN);
 };
 
 }  // namespace launcher
diff --git a/services/ui/launcher/launcher_app.h b/services/ui/launcher/launcher_app.h
index e15ca4e..ab7d7ad 100644
--- a/services/ui/launcher/launcher_app.h
+++ b/services/ui/launcher/launcher_app.h
@@ -7,27 +7,28 @@
 
 #include <memory>
 #include <unordered_map>
+#include <vector>
 
 #include "mojo/common/binding_set.h"
 #include "mojo/common/tracing_impl.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "services/ui/launcher/launch_instance.h"
 #include "services/ui/launcher/launcher.mojom.h"
 
 namespace launcher {
 
-class LauncherApp : public mojo::ApplicationDelegate, public Launcher {
+class LauncherApp : public mojo::ApplicationImplBase, public Launcher {
  public:
   LauncherApp();
   ~LauncherApp() override;
 
  private:
-  // |ApplicationDelegate|:
-  void Initialize(mojo::ApplicationImpl* app_impl) override;
+  // |ApplicationImplBase|:
+  void OnInitialize() override;
   void InitCompositor();
   void InitViewManager();
   void InitViewAssociates(const std::string& associate_urls_command_line_param);
-  bool ConfigureIncomingConnection(
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
   // |Launcher|:
@@ -44,7 +45,6 @@
   void OnViewManagerConnectionError();
   void OnViewAssociateConnectionError();
 
-  mojo::ApplicationImpl* app_impl_;
   mojo::TracingImpl tracing_;
 
   mojo::BindingSet<Launcher> bindings_;
diff --git a/services/ui/launcher/main.cc b/services/ui/launcher/main.cc
index fa82e08..9ba77ad 100644
--- a/services/ui/launcher/main.cc
+++ b/services/ui/launcher/main.cc
@@ -2,11 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/application/application_runner_chromium.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/ui/launcher/launcher_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new launcher::LauncherApp);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  launcher::LauncherApp launcher_app;
+  return mojo::RunApplication(application_request, &launcher_app);
 }
diff --git a/services/ui/view_manager/main.cc b/services/ui/view_manager/main.cc
index dbfdade..f278090 100644
--- a/services/ui/view_manager/main.cc
+++ b/services/ui/view_manager/main.cc
@@ -2,11 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/application/application_runner_chromium.h"
+#include "mojo/environment/scoped_chromium_init.h"
 #include "mojo/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/ui/view_manager/view_manager_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new view_manager::ViewManagerApp);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  view_manager::ViewManagerApp view_manager_app;
+  return mojo::RunApplication(application_request, &view_manager_app);
 }
diff --git a/services/ui/view_manager/view_manager_app.cc b/services/ui/view_manager/view_manager_app.cc
index 7a80178..ff5a201 100644
--- a/services/ui/view_manager/view_manager_app.cc
+++ b/services/ui/view_manager/view_manager_app.cc
@@ -4,40 +4,33 @@
 
 #include "services/ui/view_manager/view_manager_app.h"
 
-#include <string>
-#include <vector>
-
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/common/tracing_impl.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/application/service_provider_impl.h"
 #include "services/ui/view_manager/view_manager_impl.h"
 
 namespace view_manager {
 
-ViewManagerApp::ViewManagerApp() : app_impl_(nullptr) {}
+ViewManagerApp::ViewManagerApp() {}
 
 ViewManagerApp::~ViewManagerApp() {}
 
-void ViewManagerApp::Initialize(mojo::ApplicationImpl* app_impl) {
-  app_impl_ = app_impl;
-
+void ViewManagerApp::OnInitialize() {
   auto command_line = base::CommandLine::ForCurrentProcess();
-  command_line->InitFromArgv(app_impl_->args());
+  command_line->InitFromArgv(args());
   logging::LoggingSettings settings;
   settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
   logging::InitLogging(settings);
 
-  tracing_.Initialize(app_impl_->shell(), &app_impl_->args());
+  tracing_.Initialize(shell(), &args());
 
   // Connect to compositor.
   mojo::gfx::composition::CompositorPtr compositor;
-  mojo::ConnectToService(app_impl_->shell(), "mojo:compositor_service",
+  mojo::ConnectToService(shell(), "mojo:compositor_service",
                          GetProxy(&compositor));
   compositor.set_connection_error_handler(base::Bind(
       &ViewManagerApp::OnCompositorConnectionError, base::Unretained(this)));
@@ -46,7 +39,7 @@
   registry_.reset(new ViewRegistry(compositor.Pass()));
 }
 
-bool ViewManagerApp::ConfigureIncomingConnection(
+bool ViewManagerApp::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<mojo::ui::ViewManager>([this](
       const mojo::ConnectionContext& connection_context,
@@ -64,7 +57,7 @@
 }
 
 void ViewManagerApp::Shutdown() {
-  app_impl_->Terminate();
+  mojo::TerminateApplication(MOJO_RESULT_OK);
 }
 
 }  // namespace view_manager
diff --git a/services/ui/view_manager/view_manager_app.h b/services/ui/view_manager/view_manager_app.h
index 05e0844..f28ae7e 100644
--- a/services/ui/view_manager/view_manager_app.h
+++ b/services/ui/view_manager/view_manager_app.h
@@ -10,7 +10,7 @@
 #include "base/macros.h"
 #include "mojo/common/strong_binding_set.h"
 #include "mojo/common/tracing_impl.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/services/gfx/composition/interfaces/compositor.mojom.h"
 #include "mojo/services/ui/views/interfaces/view_manager.mojom.h"
 #include "services/ui/view_manager/view_registry.h"
@@ -18,22 +18,21 @@
 namespace view_manager {
 
 // View manager application entry point.
-class ViewManagerApp : public mojo::ApplicationDelegate {
+class ViewManagerApp : public mojo::ApplicationImplBase {
  public:
   ViewManagerApp();
   ~ViewManagerApp() override;
 
  private:
-  // |ApplicationDelegate|:
-  void Initialize(mojo::ApplicationImpl* app_impl) override;
-  bool ConfigureIncomingConnection(
+  // |ApplicationImplBase|:
+  void OnInitialize() override;
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
   void OnCompositorConnectionError();
 
   void Shutdown();
 
-  mojo::ApplicationImpl* app_impl_;
   mojo::TracingImpl tracing_;
 
   mojo::StrongBindingSet<mojo::ui::ViewManager> view_managers_;
