Add (optional) options to Run[Main]Application().

Using options, one can choose the message loop type in the "chromium"
implementation.

Convert a bunch more uses of ApplicationDelegate /
ApplicationRunner[Chromium] (again, until I got bored).

Many of the remaining cases require more refactoring.

R=vardhan@google.com

Review URL: https://codereview.chromium.org/2015643002 .
diff --git a/examples/apptest/example_service_application.cc b/examples/apptest/example_service_application.cc
index f358173..578bf59 100644
--- a/examples/apptest/example_service_application.cc
+++ b/examples/apptest/example_service_application.cc
@@ -4,10 +4,8 @@
 
 #include "examples/apptest/example_service_application.h"
 
-#include <memory>
-
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_runner.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "mojo/public/cpp/application/service_provider_impl.h"
 
 namespace mojo {
@@ -16,7 +14,7 @@
 
 ExampleServiceApplication::~ExampleServiceApplication() {}
 
-bool ExampleServiceApplication::ConfigureIncomingConnection(
+bool ExampleServiceApplication::OnAcceptConnection(
     ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<ExampleService>(
       [](const ConnectionContext& connection_context,
@@ -30,8 +28,7 @@
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunner runner(
-      std::unique_ptr<mojo::ExampleServiceApplication>(
-          new mojo::ExampleServiceApplication()));
-  return runner.Run(application_request);
+  mojo::ExampleServiceApplication example_service_application;
+  return mojo::RunMainApplication(application_request,
+                                  &example_service_application);
 }
diff --git a/examples/apptest/example_service_application.h b/examples/apptest/example_service_application.h
index bb22514..7947b00 100644
--- a/examples/apptest/example_service_application.h
+++ b/examples/apptest/example_service_application.h
@@ -6,20 +6,19 @@
 #define MOJO_EXAMPLES_TEST_EXAMPLE_SERVICE_APPLICATION_H_
 
 #include "examples/apptest/example_service_impl.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/public/cpp/system/macros.h"
 
 namespace mojo {
 
-class ExampleServiceApplication : public ApplicationDelegate {
+class ExampleServiceApplication : public ApplicationImplBase {
  public:
   ExampleServiceApplication();
   ~ExampleServiceApplication() override;
 
  private:
-  // ApplicationDelegate implementation.
-  bool ConfigureIncomingConnection(
-      ServiceProviderImpl* service_provider_impl) override;
+  // ApplicationImplBase override.
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override;
 
   MOJO_DISALLOW_COPY_AND_ASSIGN(ExampleServiceApplication);
 };
diff --git a/examples/audio_play_test/play_tone.cc b/examples/audio_play_test/play_tone.cc
index 025bdbb..ccbab46 100644
--- a/examples/audio_play_test/play_tone.cc
+++ b/examples/audio_play_test/play_tone.cc
@@ -6,10 +6,9 @@
 #include <memory>
 
 #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_runner.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"
 #include "mojo/services/media/audio/interfaces/audio_server.mojom.h"
 #include "mojo/services/media/audio/interfaces/audio_track.mojom.h"
@@ -36,13 +35,13 @@
   return ((usec * SAMP_FREQ) / 1000000) * FRAME_BYTES;
 }
 
-class PlayToneApp : public ApplicationDelegate {
+class PlayToneApp : public ApplicationImplBase {
  public:
-  ~PlayToneApp() override { Quit(); }
+  ~PlayToneApp() override { OnQuit(); }
 
-  // ApplicationDelegate
-  void Initialize(ApplicationImpl* app) override;
-  void Quit() override;
+  // ApplicationImplBase overrides:
+  void OnInitialize() override;
+  void OnQuit() override;
 
  private:
   void GenerateToneCbk(MediaResult res);
@@ -63,15 +62,15 @@
   bool     shutting_down_ = false;
 };
 
-void PlayToneApp::Quit() {
+void PlayToneApp::OnQuit() {
   timeline_consumer_.reset();
   audio_pipe_.reset();
   audio_track_.reset();
   audio_server_.reset();
 }
 
-void PlayToneApp::Initialize(ApplicationImpl* app) {
-  mojo::ConnectToService(app->shell(), "mojo:audio_server",
+void PlayToneApp::OnInitialize() {
+  mojo::ConnectToService(shell(), "mojo:audio_server",
                          GetProxy(&audio_server_));
   audio_server_.set_connection_error_handler([this]() {
     OnConnectionError("audio_server");
@@ -233,7 +232,7 @@
 }
 
 void PlayToneApp::Shutdown() {
-  Quit();
+  OnQuit();
   RunLoop::current()->Quit();
 }
 
@@ -243,8 +242,6 @@
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle app_request) {
-  mojo::ApplicationRunner runner(
-      std::unique_ptr<mojo::media::audio::examples::PlayToneApp>(
-          new mojo::media::audio::examples::PlayToneApp()));
-  return runner.Run(app_request);
+  mojo::media::audio::examples::PlayToneApp play_tone_app;
+  return mojo::RunMainApplication(app_request, &play_tone_app);
 }
diff --git a/examples/audio_play_test/play_wav.cc b/examples/audio_play_test/play_wav.cc
index f5f11ea..a05fe26 100644
--- a/examples/audio_play_test/play_wav.cc
+++ b/examples/audio_play_test/play_wav.cc
@@ -5,10 +5,9 @@
 #include <memory>
 
 #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_runner.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/system/data_pipe.h"
 #include "mojo/public/cpp/system/wait.h"
 #include "mojo/public/cpp/utility/run_loop.h"
@@ -49,13 +48,13 @@
 static constexpr uint32_t BUF_HI_WATER_USEC = 450000;
 static constexpr uint32_t CHUNK_SIZE_USEC   = 10000;
 
-class PlayWAVApp : public ApplicationDelegate {
+class PlayWAVApp : public ApplicationImplBase {
  public:
-  ~PlayWAVApp() override { Quit(); }
+  ~PlayWAVApp() override { OnQuit(); }
 
-  // ApplicationDelegate
-  void Initialize(ApplicationImpl* app) override;
-  void Quit() override;
+  // ApplicationImplBase overrides:
+  void OnInitialize() override;
+  void OnQuit() override;
 
  private:
   using AudioPipePtr = std::unique_ptr<CircularBufferMediaPipeAdapter>;
@@ -157,13 +156,13 @@
   8, 16,
 });
 
-void PlayWAVApp::Initialize(ApplicationImpl* app) {
-  ConnectToService(app->shell(), "mojo:audio_server", GetProxy(&audio_server_));
+void PlayWAVApp::OnInitialize() {
+  ConnectToService(shell(), "mojo:audio_server", GetProxy(&audio_server_));
   audio_server_.set_connection_error_handler([this]() {
     OnConnectionError("audio_server");
   });
 
-  ConnectToService(app->shell(), "mojo:network_service",
+  ConnectToService(shell(), "mojo:network_service",
                    GetProxy(&network_service_));
   audio_server_.set_connection_error_handler([this]() {
     OnConnectionError("network_service");
@@ -186,7 +185,7 @@
   url_loader_->Start(req.Pass(), URLLoader::StartCallback(cbk));
 }
 
-void PlayWAVApp::Quit() {
+void PlayWAVApp::OnQuit() {
   if (audio_packet_.packet()) {
     MOJO_DCHECK(audio_pipe_);
     audio_pipe_->CancelMediaPacket(&audio_packet_);
@@ -547,7 +546,7 @@
 // pattern for shutting down an app has been established, come back here and
 // remove all this junk.
 void PlayWAVApp::Shutdown() {
-  Quit();
+  OnQuit();
   RunLoop::current()->Quit();
 }
 
@@ -557,8 +556,6 @@
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle app_request) {
-  mojo::ApplicationRunner runner(
-      std::unique_ptr<mojo::media::audio::examples::PlayWAVApp>(
-          new mojo::media::audio::examples::PlayWAVApp()));
-  return runner.Run(app_request);
+  mojo::media::audio::examples::PlayWAVApp play_wav_app;
+  return mojo::RunMainApplication(app_request, &play_wav_app);
 }
diff --git a/examples/authentication_demo/google_authentication_demo.cc b/examples/authentication_demo/google_authentication_demo.cc
index 79a79d0..8b5bf06 100644
--- a/examples/authentication_demo/google_authentication_demo.cc
+++ b/examples/authentication_demo/google_authentication_demo.cc
@@ -5,25 +5,24 @@
 #include "base/bind.h"
 #include "base/logging.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_runner.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"
 #include "mojo/services/authentication/interfaces/authentication.mojom.h"
 
 namespace examples {
 namespace authentication {
 
-class GoogleAuthApp : public mojo::ApplicationDelegate {
+class GoogleAuthApp : public mojo::ApplicationImplBase {
  public:
   GoogleAuthApp() {}
 
   ~GoogleAuthApp() override {}
 
-  void Initialize(mojo::ApplicationImpl* app) override {
+  void OnInitialize() override {
     DLOG(INFO) << "Connecting to authentication service...";
-    mojo::ConnectToService(app->shell(), "mojo:authentication",
+    mojo::ConnectToService(shell(), "mojo:authentication",
                            GetProxy(&authentication_service_));
 
     mojo::Array<mojo::String> scopes;
@@ -128,8 +127,6 @@
 }  // namespace examples
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunner runner(
-      std::unique_ptr<examples::authentication::GoogleAuthApp>(
-          new examples::authentication::GoogleAuthApp()));
-  return runner.Run(application_request);
+  examples::authentication::GoogleAuthApp google_auth_app;
+  return mojo::RunMainApplication(application_request, &google_auth_app);
 }
diff --git a/examples/hello_mojo/hello_mojo_client.cc b/examples/hello_mojo/hello_mojo_client.cc
index 402174d..c0305a2 100644
--- a/examples/hello_mojo/hello_mojo_client.cc
+++ b/examples/hello_mojo/hello_mojo_client.cc
@@ -4,15 +4,13 @@
 
 #include <stdio.h>
 
-#include <memory>
 #include <string>
 
 #include "examples/hello_mojo/hello_mojo.mojom.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_runner.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/system/macros.h"
 #include "mojo/public/cpp/utility/run_loop.h"
 
@@ -20,13 +18,13 @@
 
 namespace {
 
-class HelloMojoClientApp : public mojo::ApplicationDelegate {
+class HelloMojoClientApp : public mojo::ApplicationImplBase {
  public:
   HelloMojoClientApp() {}
   ~HelloMojoClientApp() override {}
 
-  void Initialize(mojo::ApplicationImpl* application) override {
-    mojo::ConnectToService(application->shell(), "mojo:hello_mojo_server",
+  void OnInitialize() override {
+    mojo::ConnectToService(shell(), "mojo:hello_mojo_server",
                            GetProxy(&hello_mojo_));
 
     DoIt("hello");
@@ -48,7 +46,6 @@
 }  // namespace
 
 MojoResult MojoMain(MojoHandle application_request) {
-  return mojo::ApplicationRunner(std::unique_ptr<mojo::ApplicationDelegate>(
-                                     new HelloMojoClientApp()))
-      .Run(application_request);
+  HelloMojoClientApp hello_mojo_client_app;
+  return mojo::RunMainApplication(application_request, &hello_mojo_client_app);
 }
diff --git a/examples/hello_mojo/hello_mojo_server.cc b/examples/hello_mojo/hello_mojo_server.cc
index 6ad9a52..2cde005 100644
--- a/examples/hello_mojo/hello_mojo_server.cc
+++ b/examples/hello_mojo/hello_mojo_server.cc
@@ -2,14 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include <memory>
 #include <string>
 #include <utility>
 
 #include "examples/hello_mojo/hello_mojo.mojom.h"
 #include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_runner.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/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
@@ -37,13 +36,13 @@
   MOJO_DISALLOW_COPY_AND_ASSIGN(HelloMojoImpl);
 };
 
-class HelloMojoServerApp : public mojo::ApplicationDelegate {
+class HelloMojoServerApp : public mojo::ApplicationImplBase {
  public:
   HelloMojoServerApp() {}
   ~HelloMojoServerApp() override {}
 
-  // |mojo::ApplicationDelegate| implementation:
-  bool ConfigureIncomingConnection(
+  // |mojo::ApplicationImplBase| override:
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<HelloMojo>(
         [](const mojo::ConnectionContext& connection_context,
@@ -60,7 +59,6 @@
 }  // namespace
 
 MojoResult MojoMain(MojoHandle application_request) {
-  return mojo::ApplicationRunner(std::unique_ptr<mojo::ApplicationDelegate>(
-                                     new HelloMojoServerApp()))
-      .Run(application_request);
+  HelloMojoServerApp hello_mojo_server_app;
+  return mojo::RunMainApplication(application_request, &hello_mojo_server_app);
 }
diff --git a/examples/media_test/media_test.cc b/examples/media_test/media_test.cc
index 5d76004..d8f0858 100644
--- a/examples/media_test/media_test.cc
+++ b/examples/media_test/media_test.cc
@@ -14,15 +14,14 @@
 
 // static
 std::unique_ptr<MediaTest> MediaTest::Create(
-    mojo::ApplicationImpl* app,
+    mojo::Shell* shell,
     const std::string& input_file_name) {
-  return std::unique_ptr<MediaTest>(new MediaTest(app, input_file_name));
+  return std::unique_ptr<MediaTest>(new MediaTest(shell, input_file_name));
 }
 
-MediaTest::MediaTest(mojo::ApplicationImpl* app,
-                     const std::string& input_file_name) {
+MediaTest::MediaTest(mojo::Shell* shell, const std::string& input_file_name) {
   MediaFactoryPtr factory;
-  ConnectToService(app->shell(), "mojo:media_factory", GetProxy(&factory));
+  ConnectToService(shell, "mojo:media_factory", GetProxy(&factory));
 
   SeekingReaderPtr reader;
   factory->CreateNetworkReader(input_file_name, GetProxy(&reader));
diff --git a/examples/media_test/media_test.h b/examples/media_test/media_test.h
index ca16de2..57f76d0 100644
--- a/examples/media_test/media_test.h
+++ b/examples/media_test/media_test.h
@@ -6,12 +6,14 @@
 #define EXAMPLES_MEDIA_TEST_MEDIA_TEST_H_
 
 #include "base/macros.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/services/media/common/cpp/timeline_function.h"
 #include "mojo/services/media/control/interfaces/media_factory.mojom.h"
 #include "mojo/services/media/control/interfaces/media_player.mojom.h"
 
 namespace mojo {
+
+class Shell;
+
 namespace media {
 namespace examples {
 
@@ -22,7 +24,7 @@
 
   using UpdateCallback = std::function<void()>;
 
-  static std::unique_ptr<MediaTest> Create(mojo::ApplicationImpl* app,
+  static std::unique_ptr<MediaTest> Create(mojo::Shell* shell,
                                            const std::string& input_file_name);
 
   ~MediaTest();
@@ -54,7 +56,7 @@
   const MediaMetadataPtr& metadata() const;
 
  private:
-  MediaTest(mojo::ApplicationImpl* app, const std::string& input_file_name);
+  MediaTest(mojo::Shell* shell, const std::string& input_file_name);
 
   // Handles a status update from the player. When called with the default
   // argument values, initiates status updates.
diff --git a/examples/media_test/media_test_app.cc b/examples/media_test/media_test_app.cc
index ff4ba3d..3ce8e8a 100644
--- a/examples/media_test/media_test_app.cc
+++ b/examples/media_test/media_test_app.cc
@@ -7,27 +7,26 @@
 #include <iostream>
 
 #include "base/bind.h"
+#include "base/message_loop/message_loop.h"
 #include "examples/media_test/keystroke.h"
 #include "examples/media_test/media_test.h"
-#include "mojo/application/application_runner_chromium.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"
 
 namespace mojo {
 namespace media {
 namespace examples {
 
-class MediaTestApp : public mojo::ApplicationDelegate {
+class MediaTestApp : public mojo::ApplicationImplBase {
  public:
   MediaTestApp() {}
 
   ~MediaTestApp() override {}
 
-  // ApplicationDelegate implementation.
-  void Initialize(mojo::ApplicationImpl* app) override {
-    app_ = app;
-    ProcessArgs(app->args());
+  // ApplicationImplBase overrides.
+  void OnInitialize() override {
+    ProcessArgs(args());
 
     std::cout << std::endl << "MEDIA TEST" << std::endl << std::endl;
 
@@ -95,7 +94,7 @@
   // input_file_names_iter_.
   void CreateNewMediaTest() {
     MOJO_DCHECK(input_file_names_iter_ != input_file_names_.end());
-    media_test_ = MediaTest::Create(app_, *input_file_names_iter_);
+    media_test_ = MediaTest::Create(shell(), *input_file_names_iter_);
 
     metadata_shown_ = false;
     media_test_->RegisterUpdateCallback(
@@ -294,7 +293,6 @@
 
   const char* clear_line() const { return paint_ ? kClearLine : ""; }
 
-  mojo::ApplicationImpl* app_;
   std::unique_ptr<MediaTest> media_test_;
   std::deque<std::string> input_file_names_;
   decltype(input_file_names_.begin()) input_file_names_iter_;
@@ -315,7 +313,6 @@
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new mojo::media::examples::MediaTestApp);
-  return runner.Run(application_request);
+  mojo::media::examples::MediaTestApp media_test_app;
+  return mojo::RunMainApplication(application_request, &media_test_app);
 }
diff --git a/examples/native_run_app/native_run_app.cc b/examples/native_run_app/native_run_app.cc
index 1841ed8..090ba7e 100644
--- a/examples/native_run_app/native_run_app.cc
+++ b/examples/native_run_app/native_run_app.cc
@@ -22,11 +22,11 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/strings/string_split.h"
-#include "mojo/application/application_runner_chromium.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/application/service_provider_impl.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
@@ -220,21 +220,19 @@
   DISALLOW_COPY_AND_ASSIGN(TerminalClientImpl);
 };
 
-class NativeRunApp : public mojo::ApplicationDelegate {
+class NativeRunApp : public mojo::ApplicationImplBase {
  public:
-  NativeRunApp() : application_impl_(nullptr) {}
+  NativeRunApp() {}
   ~NativeRunApp() override {}
 
  private:
-  // |mojo::ApplicationDelegate|:
-  void Initialize(mojo::ApplicationImpl* application_impl) override {
-    DCHECK(!application_impl_);
-    application_impl_ = application_impl;
-    mojo::ConnectToService(application_impl_->shell(), "mojo:native_support",
+  // |mojo::ApplicationImplBase| overrides:
+  void OnInitialize() override {
+    mojo::ConnectToService(shell(), "mojo:native_support",
                            GetProxy(&native_support_process_));
   }
 
-  bool ConfigureIncomingConnection(
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<TerminalClient>(
         [this](const mojo::ConnectionContext& connection_context,
@@ -245,13 +243,12 @@
     return true;
   }
 
-  mojo::ApplicationImpl* application_impl_;
   native_support::ProcessPtr native_support_process_;
 
   DISALLOW_COPY_AND_ASSIGN(NativeRunApp);
 };
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new NativeRunApp());
-  return runner.Run(application_request);
+  NativeRunApp native_run_app;
+  return mojo::RunMainApplication(application_request, &native_run_app);
 }
diff --git a/examples/wget/wget.cc b/examples/wget/wget.cc
index 156eeb9..d333093 100644
--- a/examples/wget/wget.cc
+++ b/examples/wget/wget.cc
@@ -4,13 +4,10 @@
 
 #include <stdio.h>
 
-#include <memory>
-
 #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_runner.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/system/wait.h"
 #include "mojo/public/cpp/utility/run_loop.h"
 #include "mojo/services/network/interfaces/network_service.mojom.h"
@@ -75,12 +72,12 @@
 
 }  // namespace
 
-class WGetApp : public ApplicationDelegate {
+class WGetApp : public ApplicationImplBase {
  public:
-  void Initialize(ApplicationImpl* app) override {
-    ConnectToService(app->shell(), "mojo:network_service",
+  void OnInitialize() override {
+    ConnectToService(shell(), "mojo:network_service",
                      GetProxy(&network_service_));
-    Start(app->args());
+    Start(args());
   }
 
  private:
@@ -114,7 +111,6 @@
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunner runner(
-      std::unique_ptr<mojo::examples::WGetApp>(new mojo::examples::WGetApp()));
-  return runner.Run(application_request);
+  mojo::examples::WGetApp wget_app;
+  return mojo::RunMainApplication(application_request, &wget_app);
 }
diff --git a/mojo/application/BUILD.gn b/mojo/application/BUILD.gn
index f697dde..e8f7b21 100644
--- a/mojo/application/BUILD.gn
+++ b/mojo/application/BUILD.gn
@@ -7,6 +7,7 @@
     "application_runner_chromium.cc",
     "application_runner_chromium.h",
     "run_application.cc",
+    "run_application_options_chromium.h",
   ]
 
   public_deps = [
diff --git a/mojo/application/run_application.cc b/mojo/application/run_application.cc
index 5a67621..d06feb9 100644
--- a/mojo/application/run_application.cc
+++ b/mojo/application/run_application.cc
@@ -12,6 +12,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/threading/thread_local_storage.h"
 #include "build/build_config.h"
+#include "mojo/application/run_application_options_chromium.h"
 #include "mojo/message_pump/message_pump_mojo.h"
 #include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/public/cpp/system/message_pipe.h"
@@ -38,7 +39,8 @@
 }  // namespace
 
 MojoResult RunMainApplication(MojoHandle application_request_handle,
-                              ApplicationImplBase* application_impl) {
+                              ApplicationImplBase* application_impl,
+                              const RunApplicationOptions* options) {
   base::CommandLine::Init(0, nullptr);
   base::AtExitManager at_exit;
 
@@ -48,20 +50,28 @@
   base::debug::EnableInProcessStackDumping();
 #endif
 
-  return RunApplication(application_request_handle, application_impl);
+  return RunApplication(application_request_handle, application_impl, options);
 }
 
 MojoResult RunApplication(MojoHandle application_request_handle,
-                          ApplicationImplBase* application_impl) {
+                          ApplicationImplBase* application_impl,
+                          const RunApplicationOptions* options) {
   DCHECK(!g_current_result_holder.Get());
 
   ResultHolder result_holder;
   g_current_result_holder.Set(&result_holder);
 
-  std::unique_ptr<base::MessageLoop> loop;
-  // TODO(vtl): Support other types of message loops. (That's why I'm leaving
-  // |loop| as a unique_ptr.)
-  loop.reset(new base::MessageLoop(common::MessagePumpMojo::Create()));
+  // Note: If |options| is non-null, it better point to a
+  // |RunApplicationOptionsChromium|.
+  base::MessageLoop::Type message_loop_type =
+      options
+          ? static_cast<const RunApplicationOptionsChromium*>(options)
+                ->message_loop_type
+          : base::MessageLoop::TYPE_CUSTOM;
+  std::unique_ptr<base::MessageLoop> loop(
+      (message_loop_type == base::MessageLoop::TYPE_CUSTOM)
+          ? new base::MessageLoop(common::MessagePumpMojo::Create())
+          : new base::MessageLoop(message_loop_type));
   application_impl->Bind(InterfaceRequest<Application>(
       MakeScopedHandle(MessagePipeHandle(application_request_handle))));
   loop->Run();
diff --git a/mojo/application/run_application_options_chromium.h b/mojo/application/run_application_options_chromium.h
new file mode 100644
index 0000000..54a5578
--- /dev/null
+++ b/mojo/application/run_application_options_chromium.h
@@ -0,0 +1,27 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MOJO_APPLICATION_RUN_APPLICATION_OPTIONS_CHROMIUM_H_
+#define MOJO_APPLICATION_RUN_APPLICATION_OPTIONS_CHROMIUM_H_
+
+#include "base/message_loop/message_loop.h"
+#include "mojo/public/cpp/application/run_application.h"
+
+namespace mojo {
+
+// Options for the "chromium" implementation of |RunMainApplication()| and
+// |RunApplication()|.
+class RunApplicationOptionsChromium : public RunApplicationOptions {
+ public:
+  explicit RunApplicationOptionsChromium(
+      base::MessageLoop::Type message_loop_type)
+      : message_loop_type(message_loop_type) {}
+  ~RunApplicationOptionsChromium() {}
+
+  base::MessageLoop::Type message_loop_type;
+};
+
+}  // namespace mojo
+
+#endif  // MOJO_APPLICATION_RUN_APPLICATION_OPTIONS_CHROMIUM_H_
diff --git a/mojo/public/cpp/application/lib/run_application.cc b/mojo/public/cpp/application/lib/run_application.cc
index e34d245..570736a 100644
--- a/mojo/public/cpp/application/lib/run_application.cc
+++ b/mojo/public/cpp/application/lib/run_application.cc
@@ -61,12 +61,15 @@
 }  // namespace
 
 MojoResult RunMainApplication(MojoHandle application_request_handle,
-                              ApplicationImplBase* application_impl) {
-  return RunApplication(application_request_handle, application_impl);
+                              ApplicationImplBase* application_impl,
+                              const RunApplicationOptions* options) {
+  return RunApplication(application_request_handle, application_impl, options);
 }
 
 MojoResult RunApplication(MojoHandle application_request_handle,
-                          ApplicationImplBase* application_impl) {
+                          ApplicationImplBase* application_impl,
+                          const RunApplicationOptions* options) {
+  assert(!options);  // No options supported!
   assert(!GetCurrentResultHolder());
 
   ResultHolder result_holder;
diff --git a/mojo/public/cpp/application/run_application.h b/mojo/public/cpp/application/run_application.h
index 3f323d9..d22de41 100644
--- a/mojo/public/cpp/application/run_application.h
+++ b/mojo/public/cpp/application/run_application.h
@@ -12,6 +12,17 @@
 
 class ApplicationImplBase;
 
+// Base class for options to |RunMainApplication()| and |RunApplication()|. An
+// implementation of these functions may (but need not, in which case no options
+// are available) separately provide an implementation subclass, which would be
+// specific to that implementation. (The "standalone" implementation has no
+// options.)
+class RunApplicationOptions {
+ protected:
+  RunApplicationOptions() {}
+  ~RunApplicationOptions() {}
+};
+
 // |RunMainApplication()| and |RunApplication()| set up a message (run) loop and
 // run the provided application implementation. |RunMainApplication()| should be
 // used on the application's main thread (e.g., from |MojoMain()|) and may do
@@ -31,11 +42,15 @@
 // running a message loop of some sort).
 //
 // |*application_impl| must remain alive until the message loop starts running
-// (thus it may own itself).
+// (thus it may own itself). If |options| is non-null, then it must point to an
+// instance of an implementation-specific subclass of |RunApplicationOptions|;
+// |*options| must remain alive for the duration of the call.
 MojoResult RunMainApplication(MojoHandle application_request_handle,
-                              ApplicationImplBase* application_impl);
+                              ApplicationImplBase* application_impl,
+                              const RunApplicationOptions* options = nullptr);
 MojoResult RunApplication(MojoHandle application_request_handle,
-                          ApplicationImplBase* application_impl);
+                          ApplicationImplBase* application_impl,
+                          const RunApplicationOptions* options = nullptr);
 
 // |TerminateMainApplication()| and |TerminateApplication()| terminate the
 // application that is running on the current thread. They may only be called
diff --git a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_app.cc b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_app.cc
index e936ae5..a67a566 100644
--- a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_app.cc
+++ b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_app.cc
@@ -4,7 +4,7 @@
 
 #include "services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_app.h"
 
-#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/application/service_provider_impl.h"
 #include "services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_meta_factory_impl.h"
 
 namespace mojo {
@@ -13,14 +13,9 @@
 }
 
 AuthenticatingURLLoaderInterceptorApp::
-    ~AuthenticatingURLLoaderInterceptorApp() {
-}
+    ~AuthenticatingURLLoaderInterceptorApp() {}
 
-void AuthenticatingURLLoaderInterceptorApp::Initialize(ApplicationImpl* app) {
-  app_ = app;
-}
-
-bool AuthenticatingURLLoaderInterceptorApp::ConfigureIncomingConnection(
+bool AuthenticatingURLLoaderInterceptorApp::OnAcceptConnection(
     ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<
       AuthenticatingURLLoaderInterceptorMetaFactory>([this](
@@ -31,8 +26,8 @@
     if (app_url.is_valid()) {
       app_origin = app_url.GetOrigin();
     }
-    new AuthenticatingURLLoaderInterceptorMetaFactoryImpl(request.Pass(), app_,
-                                                          &tokens_[app_origin]);
+    new AuthenticatingURLLoaderInterceptorMetaFactoryImpl(
+        request.Pass(), shell(), &tokens_[app_origin]);
   });
   return true;
 }
diff --git a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_app.h b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_app.h
index 8af5c34..bfa0a0e 100644
--- a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_app.h
+++ b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_app.h
@@ -6,25 +6,21 @@
 #define SERVICES_AUTHENTICATING_URL_LOADER_INTERCEPTOR_AUTHENTICATING_URL_LOADER_INTERCEPTOR_APP_H_
 
 #include "base/macros.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/service_provider_impl.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/services/authenticating_url_loader_interceptor/interfaces/authenticating_url_loader_interceptor_meta_factory.mojom.h"
 #include "services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_meta_factory_impl.h"
 
 namespace mojo {
 
-class AuthenticatingURLLoaderInterceptorApp : public ApplicationDelegate {
+class AuthenticatingURLLoaderInterceptorApp : public ApplicationImplBase {
  public:
   AuthenticatingURLLoaderInterceptorApp();
   ~AuthenticatingURLLoaderInterceptorApp() override;
 
  private:
-  // ApplicationDelegate
-  void Initialize(ApplicationImpl* app) override;
-  bool ConfigureIncomingConnection(
-      ServiceProviderImpl* service_provider_impl) override;
+  // ApplicationImplBase override:
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override;
 
-  ApplicationImpl* app_;
   // Cache received tokens per origin of the connecting app and origin of the
   // loaded URL so that once a token has been requested it is not necessary to
   // do nultiple http connections to retrieve additional resources on the same
diff --git a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_factory.cc b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_factory.cc
index 38ac0e9..61f2e0a 100644
--- a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_factory.cc
+++ b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_factory.cc
@@ -9,7 +9,6 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/stl_util.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor.h"
 
@@ -20,15 +19,13 @@
         mojo::InterfaceRequest<URLLoaderInterceptorFactory> request,
         mojo::InterfaceHandle<authentication::AuthenticationService>
             authentication_service,
-        mojo::ApplicationImpl* app,
+        mojo::Shell* shell,
         std::map<GURL, std::string>* cached_tokens)
     : binding_(this, request.Pass()),
       authentication_service_(authentication::AuthenticationServicePtr::Create(
           std::move(authentication_service))),
-      app_(app),
       cached_tokens_(cached_tokens) {
-  ConnectToService(app_->shell(), "mojo:network_service",
-                   GetProxy(&network_service_));
+  ConnectToService(shell, "mojo:network_service", GetProxy(&network_service_));
   authentication_service_.set_connection_error_handler(
       [this]() { ClearAuthenticationService(); });
 }
diff --git a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_factory.h b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_factory.h
index 62a3d81..e962680 100644
--- a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_factory.h
+++ b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_factory.h
@@ -16,18 +16,19 @@
 
 namespace mojo {
 
-class ApplicationImpl;
-
 class AuthenticatingURLLoaderInterceptor;
+class Shell;
 
 class AuthenticatingURLLoaderInterceptorFactory
     : public URLLoaderInterceptorFactory {
  public:
+  // TODO(vtl): Maybe this should take an |ApplicationConnectorPtr| instead of a
+  // |Shell*|.
   AuthenticatingURLLoaderInterceptorFactory(
       mojo::InterfaceRequest<URLLoaderInterceptorFactory> request,
       mojo::InterfaceHandle<authentication::AuthenticationService>
           authentication_service,
-      mojo::ApplicationImpl* app,
+      mojo::Shell* shell,
       std::map<GURL, std::string>* cached_tokens);
   ~AuthenticatingURLLoaderInterceptorFactory() override;
 
@@ -61,7 +62,6 @@
 
   StrongBinding<URLLoaderInterceptorFactory> binding_;
   authentication::AuthenticationServicePtr authentication_service_;
-  ApplicationImpl* app_;
   std::map<GURL, std::string>* cached_tokens_;
   std::map<GURL, std::string> cached_accounts_;
   NetworkServicePtr network_service_;
diff --git a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_meta_factory_impl.cc b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_meta_factory_impl.cc
index 15b4541..be5c5de 100644
--- a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_meta_factory_impl.cc
+++ b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_meta_factory_impl.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_factory.h"
 
 namespace mojo {
@@ -15,14 +14,14 @@
     AuthenticatingURLLoaderInterceptorMetaFactoryImpl(
         mojo::InterfaceRequest<AuthenticatingURLLoaderInterceptorMetaFactory>
             request,
-        mojo::ApplicationImpl* app,
+        mojo::Shell* shell,
         std::map<GURL, std::string>* cached_tokens)
-    : binding_(this, request.Pass()), app_(app), cached_tokens_(cached_tokens) {
-}
+    : binding_(this, request.Pass()),
+      shell_(shell),
+      cached_tokens_(cached_tokens) {}
 
 AuthenticatingURLLoaderInterceptorMetaFactoryImpl::
-    ~AuthenticatingURLLoaderInterceptorMetaFactoryImpl() {
-}
+    ~AuthenticatingURLLoaderInterceptorMetaFactoryImpl() {}
 
 void AuthenticatingURLLoaderInterceptorMetaFactoryImpl::
     CreateURLLoaderInterceptorFactory(
@@ -30,7 +29,7 @@
         InterfaceHandle<authentication::AuthenticationService>
             authentication_service) {
   new AuthenticatingURLLoaderInterceptorFactory(
-      factory_request.Pass(), std::move(authentication_service), app_,
+      factory_request.Pass(), std::move(authentication_service), shell_,
       cached_tokens_);
 }
 
diff --git a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_meta_factory_impl.h b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_meta_factory_impl.h
index 5b3a047..8596c03 100644
--- a/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_meta_factory_impl.h
+++ b/services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_meta_factory_impl.h
@@ -16,7 +16,7 @@
 
 namespace mojo {
 
-class ApplicationImpl;
+class Shell;
 
 class AuthenticatingURLLoaderInterceptorMetaFactoryImpl
     : public AuthenticatingURLLoaderInterceptorMetaFactory {
@@ -24,7 +24,7 @@
   AuthenticatingURLLoaderInterceptorMetaFactoryImpl(
       mojo::InterfaceRequest<AuthenticatingURLLoaderInterceptorMetaFactory>
           request,
-      mojo::ApplicationImpl* app,
+      mojo::Shell* shell,
       std::map<GURL, std::string>* cached_tokens);
   ~AuthenticatingURLLoaderInterceptorMetaFactoryImpl() override;
 
@@ -36,7 +36,7 @@
           authentication_service) override;
 
   StrongBinding<AuthenticatingURLLoaderInterceptorMetaFactory> binding_;
-  ApplicationImpl* app_;
+  Shell* const shell_;
   std::map<GURL, std::string>* cached_tokens_;
 };
 
diff --git a/services/authenticating_url_loader_interceptor/main.cc b/services/authenticating_url_loader_interceptor/main.cc
index e375196..ff9548e 100644
--- a/services/authenticating_url_loader_interceptor/main.cc
+++ b/services/authenticating_url_loader_interceptor/main.cc
@@ -2,12 +2,11 @@
 // 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/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/authenticating_url_loader_interceptor/authenticating_url_loader_interceptor_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new mojo::AuthenticatingURLLoaderInterceptorApp);
-  return runner.Run(application_request);
+  mojo::AuthenticatingURLLoaderInterceptorApp app;
+  return mojo::RunMainApplication(application_request, &app);
 }
diff --git a/services/files/files_app.cc b/services/files/files_app.cc
index 368b5a0..b5e4f3b 100644
--- a/services/files/files_app.cc
+++ b/services/files/files_app.cc
@@ -4,6 +4,7 @@
 
 #include "services/files/files_app.h"
 
+#include "mojo/public/cpp/application/service_provider_impl.h"
 #include "mojo/services/files/interfaces/files.mojom.h"
 #include "services/files/files_impl.h"
 
@@ -13,8 +14,7 @@
 FilesApp::FilesApp() {}
 FilesApp::~FilesApp() {}
 
-bool FilesApp::ConfigureIncomingConnection(
-    ServiceProviderImpl* service_provider_impl) {
+bool FilesApp::OnAcceptConnection(ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<Files>(
       [](const ConnectionContext& connection_context,
          InterfaceRequest<Files> files_request) {
diff --git a/services/files/files_app.h b/services/files/files_app.h
index 3bd7810..70b022d 100644
--- a/services/files/files_app.h
+++ b/services/files/files_app.h
@@ -6,21 +6,19 @@
 #define SERVICES_FILES_FILES_APP_H_
 
 #include "base/macros.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/service_provider_impl.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 
 namespace mojo {
 namespace files {
 
-class FilesApp : public ApplicationDelegate {
+class FilesApp : public ApplicationImplBase {
  public:
   FilesApp();
   ~FilesApp() override;
 
  private:
-  // |ApplicationDelegate| override:
-  bool ConfigureIncomingConnection(
-      ServiceProviderImpl* service_provider_impl) override;
+  // |ApplicationImplBase| override:
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override;
 
   DISALLOW_COPY_AND_ASSIGN(FilesApp);
 };
diff --git a/services/files/main.cc b/services/files/main.cc
index 07effcf..500cd9e 100644
--- a/services/files/main.cc
+++ b/services/files/main.cc
@@ -2,11 +2,11 @@
 // 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/public/c/system/main.h"
+#include "mojo/public/cpp/application/run_application.h"
 #include "services/files/files_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new mojo::files::FilesApp());
-  return runner.Run(application_request);
+  mojo::files::FilesApp files_app;
+  return mojo::RunMainApplication(application_request, &files_app);
 }
diff --git a/services/keyboard/linux/main.cc b/services/keyboard/linux/main.cc
index b96e49f..4784487 100644
--- a/services/keyboard/linux/main.cc
+++ b/services/keyboard/linux/main.cc
@@ -3,12 +3,9 @@
 // found in the LICENSE file.
 
 #include "base/macros.h"
-#include "base/threading/sequenced_worker_pool.h"
-#include "mojo/application/application_runner_chromium.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/connect.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/services/native_viewport/interfaces/native_viewport_event_dispatcher.mojom.h"
 #include "services/keyboard/linux/keyboard_service_impl.h"
@@ -34,15 +31,14 @@
   DISALLOW_COPY_AND_ASSIGN(KeyboardServiceFactoryImpl);
 };
 
-class KeyboardServiceApp : public mojo::ApplicationDelegate {
+class KeyboardServiceApp : public mojo::ApplicationImplBase {
  public:
   KeyboardServiceApp() {}
   ~KeyboardServiceApp() override {}
 
  private:
-
-  // |ApplicationDelegate| override:
-  bool ConfigureIncomingConnection(
+  // |ApplicationImplBase| override:
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<KeyboardServiceFactory>([](
         const mojo::ConnectionContext& connection_context,
@@ -60,7 +56,6 @@
 }  // namespace keyboard
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new keyboard::KeyboardServiceApp());
-  return runner.Run(application_request);
+  keyboard::KeyboardServiceApp keyboard_service_app;
+  return mojo::RunMainApplication(application_request, &keyboard_service_app);
 }
diff --git a/services/media/audio/audio_server_app.cc b/services/media/audio/audio_server_app.cc
index ef268c9..0da6188 100644
--- a/services/media/audio/audio_server_app.cc
+++ b/services/media/audio/audio_server_app.cc
@@ -3,10 +3,9 @@
 // found in the LICENSE file.
 
 #include "base/logging.h"
-#include "mojo/application/application_runner_chromium.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/run_application.h"
+#include "mojo/public/cpp/application/service_provider_impl.h"
 #include "services/media/audio/audio_server_app.h"
 
 namespace mojo {
@@ -14,13 +13,12 @@
 namespace audio {
 
 AudioServerApp::AudioServerApp() {}
+
 AudioServerApp::~AudioServerApp() {}
 
-void AudioServerApp::Initialize(ApplicationImpl* app) {
-  server_impl_.Initialize();
-}
+void AudioServerApp::OnInitialize() {}
 
-bool AudioServerApp::ConfigureIncomingConnection(
+bool AudioServerApp::OnAcceptConnection(
     ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<AudioServer>(
       [this](const ConnectionContext& connection_context,
@@ -30,15 +28,11 @@
   return true;
 }
 
-void AudioServerApp::Quit() {
-}
-
 }  // namespace audio
 }  // namespace media
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle app_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new mojo::media::audio::AudioServerApp);
-  return runner.Run(app_request);
+  mojo::media::audio::AudioServerApp audio_server_app;
+  return mojo::RunMainApplication(app_request, &audio_server_app);
 }
diff --git a/services/media/audio/audio_server_app.h b/services/media/audio/audio_server_app.h
index 87f6a39..6de3b15 100644
--- a/services/media/audio/audio_server_app.h
+++ b/services/media/audio/audio_server_app.h
@@ -6,7 +6,7 @@
 #define SERVICES_MEDIA_AUDIO_AUDIO_SERVER_APP_H_
 
 #include "mojo/common/binding_set.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/services/media/audio/interfaces/audio_server.mojom.h"
 #include "services/media/audio/audio_server_impl.h"
 
@@ -14,16 +14,14 @@
 namespace media {
 namespace audio {
 
-class AudioServerApp : public ApplicationDelegate {
+class AudioServerApp : public ApplicationImplBase {
  public:
   AudioServerApp();
   ~AudioServerApp() override;
 
-  // ApplicationDelegate
-  void Initialize(ApplicationImpl* app) override;
-  bool ConfigureIncomingConnection(
-      ServiceProviderImpl* service_provider_impl) override;
-  void Quit() override;
+  // ApplicationImplBase overrides:
+  void OnInitialize() override;
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override;
 
  private:
   AudioServerImpl server_impl_;
diff --git a/services/native_support/main.cc b/services/native_support/main.cc
index 912ebc6..e174a31 100644
--- a/services/native_support/main.cc
+++ b/services/native_support/main.cc
@@ -6,9 +6,10 @@
 #include "base/memory/ref_counted.h"
 #include "base/message_loop/message_loop.h"
 #include "base/threading/sequenced_worker_pool.h"
-#include "mojo/application/application_runner_chromium.h"
+#include "mojo/application/run_application_options_chromium.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/services/native_support/interfaces/process.mojom.h"
 #include "services/native_support/process_impl.h"
@@ -18,17 +19,18 @@
 // TODO(vtl): Having to manually choose an arbitrary number is dumb.
 const size_t kMaxWorkerThreads = 16;
 
-class NativeSupportApp : public mojo::ApplicationDelegate {
+class NativeSupportApp : public mojo::ApplicationImplBase {
  public:
   NativeSupportApp() {}
   ~NativeSupportApp() override {
-    if (worker_pool_)
-      worker_pool_->Shutdown();
+    // TODO(vtl): Doing this here is a bit of a hack, but we may not
+    // consistently call |OnQuit()|.
+    OnQuit();
   }
 
  private:
-  // |mojo::ApplicationDelegate| override:
-  bool ConfigureIncomingConnection(
+  // |mojo::ApplicationImplBase| overrides:
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<Process>([this](
         const mojo::ConnectionContext& connection_context,
@@ -42,6 +44,13 @@
     return true;
   }
 
+  void OnQuit() override {
+    if (worker_pool_) {
+      worker_pool_->Shutdown();
+      worker_pool_ = nullptr;
+    }
+  }
+
   scoped_refptr<base::SequencedWorkerPool> worker_pool_;
 
   DISALLOW_COPY_AND_ASSIGN(NativeSupportApp);
@@ -50,9 +59,9 @@
 }  // namespace native_support
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new native_support::NativeSupportApp());
+  native_support::NativeSupportApp native_support_app;
   // We need an I/O message loop, since we'll want to watch FDs.
-  runner.set_message_loop_type(base::MessageLoop::TYPE_IO);
-  return runner.Run(application_request);
+  mojo::RunApplicationOptionsChromium options(base::MessageLoop::TYPE_IO);
+  return mojo::RunMainApplication(application_request, &native_support_app,
+                                  &options);
 }
diff --git a/services/prediction/prediction_service_impl.cc b/services/prediction/prediction_service_impl.cc
index 42bf597..ce26d6e 100644
--- a/services/prediction/prediction_service_impl.cc
+++ b/services/prediction/prediction_service_impl.cc
@@ -4,8 +4,9 @@
 
 #include "services/prediction/prediction_service_impl.h"
 
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/public/c/system/main.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"
 
 namespace prediction {
@@ -30,24 +31,27 @@
   callback.Run(prediction_list.Pass());
 }
 
-PredictionServiceDelegate::PredictionServiceDelegate() {}
+// TODO(vtl): Maybe this (and MojoMain()) should go in a different file?
+class PredictionServiceApp : public mojo::ApplicationImplBase {
+ public:
+  PredictionServiceApp() {}
+  ~PredictionServiceApp() override {}
 
-PredictionServiceDelegate::~PredictionServiceDelegate() {}
-
-bool PredictionServiceDelegate::ConfigureIncomingConnection(
-    mojo::ServiceProviderImpl* service_provider_impl) {
-  service_provider_impl->AddService<PredictionService>(
-      [](const mojo::ConnectionContext& connection_context,
-         mojo::InterfaceRequest<PredictionService> prediction_service_request) {
-        new PredictionServiceImpl(prediction_service_request.Pass());
-      });
-  return true;
-}
+  // mojo::ApplicationImplBase override:
+  bool OnAcceptConnection(
+      mojo::ServiceProviderImpl* service_provider_impl) override {
+    service_provider_impl->AddService<PredictionService>([](
+        const mojo::ConnectionContext& connection_context,
+        mojo::InterfaceRequest<PredictionService> prediction_service_request) {
+      new PredictionServiceImpl(prediction_service_request.Pass());
+    });
+    return true;
+  }
+};
 
 }  // namespace prediction
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new prediction::PredictionServiceDelegate());
-  return runner.Run(application_request);
+  prediction::PredictionServiceApp prediction_service_app;
+  return mojo::RunMainApplication(application_request, &prediction_service_app);
 }
diff --git a/services/prediction/prediction_service_impl.h b/services/prediction/prediction_service_impl.h
index dc02b87..b1d9944 100644
--- a/services/prediction/prediction_service_impl.h
+++ b/services/prediction/prediction_service_impl.h
@@ -6,7 +6,6 @@
 #define SERVICES_PREDICTION_PREDICTION_SERVICE_IMPL_H_
 
 #include "base/memory/scoped_ptr.h"
-#include "mojo/public/cpp/application/application_delegate.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/services/prediction/interfaces/prediction.mojom.h"
 #include "services/prediction/dictionary_service.h"
@@ -32,16 +31,6 @@
   DISALLOW_COPY_AND_ASSIGN(PredictionServiceImpl);
 };
 
-class PredictionServiceDelegate : public mojo::ApplicationDelegate {
- public:
-  PredictionServiceDelegate();
-  ~PredictionServiceDelegate() override;
-
-  // mojo::ApplicationDelegate implementation
-  bool ConfigureIncomingConnection(
-      mojo::ServiceProviderImpl* service_provider_impl) override;
-};
-
 }  // namespace prediction
 
 #endif  // SERVICES_PREDICTION_PREDICTION_SERVICE_IMPL_H_