Done-ish?: ApplicationDelegate -> ApplicationImplBase conversion.

Still have to delete ApplicationDelegate, but I think uses are all gone.

R=vardhan@google.com

Review URL: https://codereview.chromium.org/2010283006 .
diff --git a/examples/native_run_app/native_run_app.cc b/examples/native_run_app/native_run_app.cc
index 9b0e554..b20a415 100644
--- a/examples/native_run_app/native_run_app.cc
+++ b/examples/native_run_app/native_run_app.cc
@@ -25,7 +25,6 @@
 #include "base/strings/string_util.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/connect.h"
 #include "mojo/public/cpp/application/run_application.h"
diff --git a/examples/recursive_content_handler/recursive_content_handler.cc b/examples/recursive_content_handler/recursive_content_handler.cc
index 77613d7..3030929 100644
--- a/examples/recursive_content_handler/recursive_content_handler.cc
+++ b/examples/recursive_content_handler/recursive_content_handler.cc
@@ -4,26 +4,25 @@
 
 #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/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"
 #include "mojo/services/content_handler/interfaces/content_handler.mojom.h"
 
 namespace mojo {
 namespace examples {
 
-class RecursiveContentHandler : public ApplicationDelegate,
+class RecursiveContentHandler : public ApplicationImplBase,
                                 public ContentHandlerFactory::ManagedDelegate {
  public:
   RecursiveContentHandler() {}
 
  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;
@@ -34,8 +33,9 @@
   CreateApplication(InterfaceRequest<Application> application_request,
                     URLResponsePtr response) override {
     LOG(INFO) << "RecursiveContentHandler called with url: " << response->url;
-    return make_handled_factory_holder(new mojo::ApplicationImpl(
-        new RecursiveContentHandler(), application_request.Pass()));
+    auto app = new RecursiveContentHandler();
+    app->Bind(application_request.Pass());
+    return make_handled_factory_holder(app);
   }
 
   DISALLOW_COPY_AND_ASSIGN(RecursiveContentHandler);
@@ -45,7 +45,7 @@
 }  // namespace mojo
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(
-      new mojo::examples::RecursiveContentHandler());
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  mojo::examples::RecursiveContentHandler recursive_content_handler;
+  return mojo::RunApplication(application_request, &recursive_content_handler);
 }
diff --git a/mojo/application/content_handler_factory.cc b/mojo/application/content_handler_factory.cc
index e27996a..40c7023 100644
--- a/mojo/application/content_handler_factory.cc
+++ b/mojo/application/content_handler_factory.cc
@@ -12,10 +12,7 @@
 #include "base/thread_task_runner_handle.h"
 #include "base/threading/platform_thread.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/message_pump/message_pump_mojo.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/services/content_handler/interfaces/content_handler.mojom.h"
 
diff --git a/mojo/common/trace_provider_impl.cc b/mojo/common/trace_provider_impl.cc
index 2139b7c..5fa2345 100644
--- a/mojo/common/trace_provider_impl.cc
+++ b/mojo/common/trace_provider_impl.cc
@@ -12,7 +12,6 @@
 #include "base/time/time.h"
 #include "base/trace_event/trace_config.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/public/cpp/application/application_impl.h"
 
 namespace mojo {
 
diff --git a/mojo/common/tracing_impl.cc b/mojo/common/tracing_impl.cc
index 827ac17..b6fc49c 100644
--- a/mojo/common/tracing_impl.cc
+++ b/mojo/common/tracing_impl.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 
 #include "base/trace_event/trace_event_impl.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/bindings/interface_handle.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
diff --git a/mojo/public/platform/native/platform_handle_private_apptest.cc b/mojo/public/platform/native/platform_handle_private_apptest.cc
index 28e1b47..054317e 100644
--- a/mojo/public/platform/native/platform_handle_private_apptest.cc
+++ b/mojo/public/platform/native/platform_handle_private_apptest.cc
@@ -8,7 +8,6 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/environment/logging.h"
 #include "mojo/public/cpp/system/macros.h"
diff --git a/mojo/services/flog/cpp/flog.h b/mojo/services/flog/cpp/flog.h
index 5badda1..dfa9e3b 100644
--- a/mojo/services/flog/cpp/flog.h
+++ b/mojo/services/flog/cpp/flog.h
@@ -8,7 +8,6 @@
 #include <atomic>
 #include <memory>
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/bindings/array.h"
 #include "mojo/public/cpp/bindings/message.h"
diff --git a/mojo/services/gfx/composition/cpp/frame_tracker_apptest.cc b/mojo/services/gfx/composition/cpp/frame_tracker_apptest.cc
index 0591ed0..940b915 100644
--- a/mojo/services/gfx/composition/cpp/frame_tracker_apptest.cc
+++ b/mojo/services/gfx/composition/cpp/frame_tracker_apptest.cc
@@ -4,7 +4,6 @@
 
 #include "mojo/services/gfx/composition/cpp/frame_tracker.h"
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/system/macros.h"
 
diff --git a/mojo/services/gfx/images/cpp/image_pipe_apptest.cc b/mojo/services/gfx/images/cpp/image_pipe_apptest.cc
index 01edf7d..f532072 100644
--- a/mojo/services/gfx/images/cpp/image_pipe_apptest.cc
+++ b/mojo/services/gfx/images/cpp/image_pipe_apptest.cc
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/environment/logging.h"
 #include "mojo/public/cpp/system/macros.h"
@@ -350,4 +349,4 @@
 }
 
 }  // namespace
-}  // namespace mojo
\ No newline at end of file
+}  // namespace mojo
diff --git a/mojo/ui/associates/view_inspector_client_apptest.cc b/mojo/ui/associates/view_inspector_client_apptest.cc
index 3584331..3ad62ba 100644
--- a/mojo/ui/associates/view_inspector_client_apptest.cc
+++ b/mojo/ui/associates/view_inspector_client_apptest.cc
@@ -7,7 +7,6 @@
 #include "base/bind.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/ui/associates/mock_view_inspector.h"
 #include "mojo/ui/associates/test_helpers.h"
diff --git a/mojo/ui/associates/view_tree_hit_tester_client_apptest.cc b/mojo/ui/associates/view_tree_hit_tester_client_apptest.cc
index c59ad0c..5b3ec39 100644
--- a/mojo/ui/associates/view_tree_hit_tester_client_apptest.cc
+++ b/mojo/ui/associates/view_tree_hit_tester_client_apptest.cc
@@ -9,7 +9,6 @@
 #include "base/bind.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/ui/associates/mock_hit_tester.h"
 #include "mojo/ui/associates/mock_view_inspector.h"
diff --git a/services/dart/content_handler_app.cc b/services/dart/content_handler_app.cc
index 380cd92..1babd38 100644
--- a/services/dart/content_handler_app.cc
+++ b/services/dart/content_handler_app.cc
@@ -10,8 +10,8 @@
 #include "base/threading/platform_thread.h"
 #include "base/trace_event/trace_event.h"
 #include "mojo/dart/embedder/dart_controller.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/application/service_provider_impl.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/services/tracing/interfaces/tracing.mojom.h"
@@ -130,51 +130,51 @@
   return run_on_message_loop_;
 }
 
-void DartContentHandlerApp::Initialize(mojo::ApplicationImpl* app) {
+void DartContentHandlerApp::OnInitialize() {
   // Tracing of content handler and controller.
-  tracing_.Initialize(app->shell(), &app->args());
+  tracing_.Initialize(shell(), &args());
   // Tracing of isolates and VM.
-  dart_tracing_.Initialize(app->shell());
+  dart_tracing_.Initialize(shell());
 
   // TODO(qsr): This has no effect for now, as the tracing infrastructure
   // doesn't allow to trace anything before the tracing app connects to the
   // application.
   TRACE_EVENT0("dart_content_handler", "DartContentHandler::Initialize");
 
-  default_strict_ = app->HasArg(kEnableStrictMode);
+  default_strict_ = HasArg(kEnableStrictMode);
   content_handler_.set_handler_task_runner(
       base::MessageLoop::current()->task_runner());
   strict_content_handler_.set_handler_task_runner(
       base::MessageLoop::current()->task_runner());
-  mojo::ConnectToService(app->shell(), "mojo:url_response_disk_cache",
+  mojo::ConnectToService(shell(), "mojo:url_response_disk_cache",
                          GetProxy(&url_response_disk_cache_));
-  service_connector_ = new ContentHandlerAppServiceConnector(app);
+  service_connector_ = new ContentHandlerAppServiceConnector(shell());
 
-  if (app->HasArg(kRunOnMessageLoop)) {
+  if (HasArg(kRunOnMessageLoop)) {
     run_on_message_loop_ = true;
   }
 
   bool enable_observatory = true;
-  if (app->HasArg(kDisableObservatory)) {
+  if (HasArg(kDisableObservatory)) {
     enable_observatory = false;
   }
 
   bool enable_dart_timeline = false;
-  if (app->HasArg(kDartTimeline)) {
+  if (HasArg(kDartTimeline)) {
     enable_dart_timeline = true;
   }
 
   std::vector<const char*> extra_args;
 
-  if (app->HasArg(kPauseIsolatesOnStart)) {
+  if (HasArg(kPauseIsolatesOnStart)) {
     extra_args.push_back(kPauseIsolatesOnStart);
   }
 
-  if (app->HasArg(kPauseIsolatesOnExit)) {
+  if (HasArg(kPauseIsolatesOnExit)) {
     extra_args.push_back(kPauseIsolatesOnExit);
   }
 
-  if (app->HasArg(kCompleteTimeline)) {
+  if (HasArg(kCompleteTimeline)) {
     extra_args.push_back(kCompleteTimeline);
   }
 
@@ -182,7 +182,7 @@
       service_connector_, default_strict_, enable_observatory,
       enable_dart_timeline, extra_args.data(), extra_args.size());
 
-  if (app->HasArg(kTraceStartup)) {
+  if (HasArg(kTraceStartup)) {
     DartTimelineController::EnableAll();
   }
   if (!success) {
@@ -190,7 +190,7 @@
   }
 }
 
-bool DartContentHandlerApp::ConfigureIncomingConnection(
+bool DartContentHandlerApp::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   bool strict = HasStrictQueryParam(
       service_provider_impl->connection_context().connection_url);
diff --git a/services/dart/content_handler_app.h b/services/dart/content_handler_app.h
index a3ae756..30c5ed1 100644
--- a/services/dart/content_handler_app.h
+++ b/services/dart/content_handler_app.h
@@ -8,7 +8,7 @@
 #include "base/bind.h"
 #include "mojo/application/content_handler_factory.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/url_response_disk_cache/interfaces/url_response_disk_cache.mojom.h"
 #include "services/dart/content_handler_app_service_connector.h"
 #include "services/dart/dart_tracing.h"
@@ -38,7 +38,7 @@
   DISALLOW_COPY_AND_ASSIGN(DartContentHandler);
 };
 
-class DartContentHandlerApp : public mojo::ApplicationDelegate {
+class DartContentHandlerApp : public mojo::ApplicationImplBase {
  public:
   DartContentHandlerApp();
 
@@ -51,11 +51,9 @@
   bool run_on_message_loop() const;
 
  private:
-  // Overridden from mojo::ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override;
-
-  // Overridden from ApplicationDelegate:
-  bool ConfigureIncomingConnection(
+  // Overridden from mojo::ApplicationImplBase:
+  void OnInitialize() override;
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
   mojo::TracingImpl tracing_;
@@ -69,6 +67,7 @@
 
   DISALLOW_COPY_AND_ASSIGN(DartContentHandlerApp);
 };
-}
+
+}  // namespace dart
 
 #endif  // SERVICES_DART_CONTENT_HANDLER_APP_H_
diff --git a/services/dart/content_handler_app_service_connector.cc b/services/dart/content_handler_app_service_connector.cc
index f79c122..3844ef6 100644
--- a/services/dart/content_handler_app_service_connector.cc
+++ b/services/dart/content_handler_app_service_connector.cc
@@ -4,6 +4,7 @@
 
 #include "services/dart/content_handler_app_service_connector.h"
 
+#include "base/bind.h"
 #include "base/location.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
@@ -18,16 +19,15 @@
 void ContentHandlerAppServiceConnector::Connect(
     std::string application_name,
     mojo::InterfaceRequest<Interface> interface_request) {
-  mojo::ConnectToService(content_handler_app_->shell(), application_name,
-                         interface_request.Pass());
+  mojo::ConnectToService(shell_, application_name, interface_request.Pass());
 }
 
 ContentHandlerAppServiceConnector::ContentHandlerAppServiceConnector(
-    mojo::ApplicationImpl* content_handler_app)
-        : runner_(base::MessageLoop::current()->task_runner()),
-          content_handler_app_(content_handler_app),
-          weak_ptr_factory_(this) {
-  CHECK(content_handler_app != nullptr);
+    mojo::Shell* shell)
+    : runner_(base::MessageLoop::current()->task_runner()),
+      shell_(shell),
+      weak_ptr_factory_(this) {
+  CHECK(shell != nullptr);
   CHECK(runner_.get() != nullptr);
   CHECK(runner_.get()->BelongsToCurrentThread());
 }
diff --git a/services/dart/content_handler_app_service_connector.h b/services/dart/content_handler_app_service_connector.h
index a45a0ec..447b5c3 100644
--- a/services/dart/content_handler_app_service_connector.h
+++ b/services/dart/content_handler_app_service_connector.h
@@ -5,13 +5,13 @@
 #ifndef SERVICES_DART_CONTENT_HANDLER_APP_SERVICE_CONNECTOR_H_
 #define SERVICES_DART_CONTENT_HANDLER_APP_SERVICE_CONNECTOR_H_
 
-#include "base/bind.h"
 #include "base/memory/ref_counted.h"
-#include "base/memory/scoped_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/message_loop/message_loop.h"
 #include "mojo/dart/embedder/dart_controller.h"
-#include "mojo/public/cpp/application/application_impl.h"
+
+namespace mojo {
+class Shell;
+}  // namespace mojo
 
 namespace dart {
 
@@ -22,8 +22,9 @@
  public:
   // Call this only on the same thread as the content_handler_runner. This is
   // checked in the body of the constructor.
-  explicit ContentHandlerAppServiceConnector(
-      mojo::ApplicationImpl* content_handler_app);
+  // TODO(vtl): Maybe this should take an
+  // |InterfaceHandle<ApplicationConnector>| instead of a |Shell*|.
+  explicit ContentHandlerAppServiceConnector(mojo::Shell* shell);
 
   // Must be called on the same thread that constructed |this|.
   ~ContentHandlerAppServiceConnector() override;
@@ -38,7 +39,7 @@
                mojo::InterfaceRequest<Interface> interface_request);
 
   scoped_refptr<base::SingleThreadTaskRunner> runner_;
-  mojo::ApplicationImpl* content_handler_app_;
+  mojo::Shell* shell_;
   base::WeakPtrFactory<ContentHandlerAppServiceConnector> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ContentHandlerAppServiceConnector);
diff --git a/services/dart/content_handler_main.cc b/services/dart/content_handler_main.cc
index f415b40..5512e0e 100644
--- a/services/dart/content_handler_main.cc
+++ b/services/dart/content_handler_main.cc
@@ -1,11 +1,14 @@
 // Copyright 2014 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.
-#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/dart/content_handler_app.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new dart::DartContentHandlerApp);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  dart::DartContentHandlerApp dart_content_handler_app;
+  return mojo::RunApplication(application_request, &dart_content_handler_app);
 }
diff --git a/services/dart/dart_tracing.cc b/services/dart/dart_tracing.cc
index bf5b9a7..a527a1f 100644
--- a/services/dart/dart_tracing.cc
+++ b/services/dart/dart_tracing.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "dart/runtime/include/dart_tools_api.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/bindings/interface_handle.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
diff --git a/services/gfx/compositor/compositor_app.cc b/services/gfx/compositor/compositor_app.cc
index 7f52199..9a85deb 100644
--- a/services/gfx/compositor/compositor_app.cc
+++ b/services/gfx/compositor/compositor_app.cc
@@ -7,10 +7,8 @@
 #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/gfx/compositor/compositor_impl.h"
 
diff --git a/services/gfx/compositor/tests/scheduling_apptest.cc b/services/gfx/compositor/tests/scheduling_apptest.cc
index d116e61..55f4edd 100644
--- a/services/gfx/compositor/tests/scheduling_apptest.cc
+++ b/services/gfx/compositor/tests/scheduling_apptest.cc
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connect.h"
 #include "mojo/public/cpp/bindings/synchronous_interface_ptr.h"
diff --git a/services/java_handler/java_handler.cc b/services/java_handler/java_handler.cc
index 177eee1..64d7bfd 100644
--- a/services/java_handler/java_handler.cc
+++ b/services/java_handler/java_handler.cc
@@ -18,11 +18,12 @@
 #include "jni/JavaHandler_jni.h"
 #include "mojo/android/system/base_run_loop.h"
 #include "mojo/android/system/core_impl.h"
-#include "mojo/application/application_runner_chromium.h"
 #include "mojo/application/content_handler_factory.h"
+#include "mojo/environment/scoped_chromium_init.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"
 
 using base::android::AttachCurrentThread;
 using base::android::ScopedJavaLocalRef;
@@ -89,10 +90,10 @@
       application_request.PassMessagePipe().release().value());
 }
 
-void JavaHandler::Initialize(mojo::ApplicationImpl* app) {
-  tracing_.Initialize(app->shell(), &app->args());
+void JavaHandler::OnInitialize() {
+  tracing_.Initialize(shell(), &args());
   handler_task_runner_ = base::MessageLoop::current()->task_runner();
-  mojo::ConnectToService(app->shell(), "mojo:url_response_disk_cache",
+  mojo::ConnectToService(shell(), "mojo:url_response_disk_cache",
                          GetProxy(&url_response_disk_cache_));
 }
 
@@ -118,7 +119,7 @@
       });
 }
 
-bool JavaHandler::ConfigureIncomingConnection(
+bool JavaHandler::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<mojo::ContentHandler>(
       mojo::ContentHandlerFactory::GetInterfaceRequestHandler(this));
@@ -133,8 +134,9 @@
 }  // namespace services
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new services::android::JavaHandler());
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  services::android::JavaHandler java_handler;
+  return mojo::RunApplication(application_request, &java_handler);
 }
 
 JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
diff --git a/services/java_handler/java_handler.h b/services/java_handler/java_handler.h
index 6412ca0..d4febd7 100644
--- a/services/java_handler/java_handler.h
+++ b/services/java_handler/java_handler.h
@@ -11,23 +11,23 @@
 #include "base/single_thread_task_runner.h"
 #include "mojo/application/content_handler_factory.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/content_handler/interfaces/content_handler.mojom.h"
 #include "mojo/services/url_response_disk_cache/interfaces/url_response_disk_cache.mojom.h"
 
 namespace services {
 namespace android {
 
-class JavaHandler : public mojo::ApplicationDelegate,
+class JavaHandler : public mojo::ApplicationImplBase,
                     public mojo::ContentHandlerFactory::Delegate {
  public:
   JavaHandler();
   ~JavaHandler();
 
  private:
-  // ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override;
-  bool ConfigureIncomingConnection(
+  // ApplicationImplBase:
+  void OnInitialize() override;
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
   // ContentHandlerFactory::Delegate:
diff --git a/services/js/pingpong_apptest.cc b/services/js/pingpong_apptest.cc
index d76e055..ba74b36 100644
--- a/services/js/pingpong_apptest.cc
+++ b/services/js/pingpong_apptest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/bindings/binding.h"
 #include "services/js/test/js_application_test_base.h"
 #include "services/js/test/pingpong_service.mojom.h"
 
diff --git a/services/js/test/js_application_test_base.h b/services/js/test/js_application_test_base.h
index 726755d..a5b9172 100644
--- a/services/js/test/js_application_test_base.h
+++ b/services/js/test/js_application_test_base.h
@@ -7,7 +7,6 @@
 
 #include "base/files/file_path.h"
 #include "base/path_service.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 
 namespace js {
diff --git a/services/log/log_impl_unittest.cc b/services/log/log_impl_unittest.cc
index de6ff9b..2b259e4 100644
--- a/services/log/log_impl_unittest.cc
+++ b/services/log/log_impl_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/message_loop/message_loop.h"
 #include "base/test/test_timeouts.h"
 #include "mojo/public/c/environment/logger.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/application_test_base.h"
 #include "mojo/public/cpp/application/connection_context.h"
 #include "mojo/public/cpp/system/time.h"
diff --git a/services/media/factory_service/audio_track_controller.cc b/services/media/factory_service/audio_track_controller.cc
index 5db316c..5d557c8 100644
--- a/services/media/factory_service/audio_track_controller.cc
+++ b/services/media/factory_service/audio_track_controller.cc
@@ -15,13 +15,12 @@
 namespace mojo {
 namespace media {
 
-AudioTrackController::AudioTrackController(const String& url,
-                                           ApplicationImpl* app) {
+AudioTrackController::AudioTrackController(const String& url, Shell* shell) {
   // TODO(dalesat): Handle connection errors.
-  DCHECK(app);
+  DCHECK(shell);
 
   AudioServerPtr audio_server;
-  ConnectToService(app->shell(), url, GetProxy(&audio_server));
+  ConnectToService(shell, url, GetProxy(&audio_server));
   audio_server->CreateTrack(GetProxy(&audio_track_));
 }
 
diff --git a/services/media/factory_service/audio_track_controller.h b/services/media/factory_service/audio_track_controller.h
index 0674e41..da87bbb 100644
--- a/services/media/factory_service/audio_track_controller.h
+++ b/services/media/factory_service/audio_track_controller.h
@@ -5,12 +5,14 @@
 #ifndef SERVICES_MEDIA_FACTORY_SERVICE_AUDIO_TRACK_CONTROLLER_H_
 #define SERVICES_MEDIA_FACTORY_SERVICE_AUDIO_TRACK_CONTROLLER_H_
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/services/media/audio/interfaces/audio_track.mojom.h"
 #include "mojo/services/media/common/interfaces/media_transport.mojom.h"
 #include "services/media/framework/types/stream_type.h"
 
 namespace mojo {
+
+class Shell;
+
 namespace media {
 
 // Controls an audio track.
@@ -20,7 +22,7 @@
       std::unique_ptr<std::vector<std::unique_ptr<StreamTypeSet>>>)>;
   using ConfigureCallback = std::function<void(MediaConsumerPtr)>;
 
-  AudioTrackController(const String& url, ApplicationImpl* app);
+  AudioTrackController(const String& url, Shell* shell);
 
   ~AudioTrackController();
 
diff --git a/services/media/factory_service/factory_service.cc b/services/media/factory_service/factory_service.cc
index 5d87ad4..d99d53e 100644
--- a/services/media/factory_service/factory_service.cc
+++ b/services/media/factory_service/factory_service.cc
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 #include "services/media/factory_service/factory_service.h"
+
+#include "mojo/public/cpp/application/service_provider_impl.h"
 #include "services/media/factory_service/media_decoder_impl.h"
 #include "services/media/factory_service/media_demux_impl.h"
 #include "services/media/factory_service/media_player_impl.h"
@@ -18,7 +20,7 @@
 
 MediaFactoryService::~MediaFactoryService() {}
 
-bool MediaFactoryService::ConfigureIncomingConnection(
+bool MediaFactoryService::OnAcceptConnection(
     ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<MediaFactory>(
       [this](const ConnectionContext& connection_context,
diff --git a/services/media/factory_service/factory_service.h b/services/media/factory_service/factory_service.h
index c87e271..0955092 100644
--- a/services/media/factory_service/factory_service.h
+++ b/services/media/factory_service/factory_service.h
@@ -6,8 +6,6 @@
 #define MOJO_SERVICES_MEDIA_FACTORY_FACTORY_SERVICE_H_
 
 #include "mojo/common/binding_set.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/services/media/control/interfaces/media_factory.mojom.h"
 #include "services/util/cpp/factory_service_base.h"
 
@@ -21,9 +19,8 @@
 
   ~MediaFactoryService() override;
 
-  // ApplicationDelegate implementation.
-  bool ConfigureIncomingConnection(
-      ServiceProviderImpl* service_provider_impl) override;
+  // ApplicationImplBase override.
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override;
 
   // MediaFactory implementation.
   void CreatePlayer(InterfaceHandle<SeekingReader> reader,
diff --git a/services/media/factory_service/main.cc b/services/media/factory_service/main.cc
index 6f516ef..edb82a4 100644
--- a/services/media/factory_service/main.cc
+++ b/services/media/factory_service/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/media/factory_service/factory_service.h"
 
 MojoResult MojoMain(MojoHandle application_request) {
-  mojo::ApplicationRunnerChromium runner(new mojo::media::MediaFactoryService);
-  return runner.Run(application_request);
+  mojo::ScopedChromiumInit init;
+  mojo::media::MediaFactoryService media_factory_service;
+  return mojo::RunApplication(application_request, &media_factory_service);
 }
diff --git a/services/media/factory_service/media_player_impl.cc b/services/media/factory_service/media_player_impl.cc
index dcaa5f6..c8f8bcc 100644
--- a/services/media/factory_service/media_player_impl.cc
+++ b/services/media/factory_service/media_player_impl.cc
@@ -38,7 +38,7 @@
 
   state_ = State::kWaiting;
 
-  ConnectToService(app()->shell(), "mojo:media_factory", GetProxy(&factory_));
+  ConnectToService(owner->shell(), "mojo:media_factory", GetProxy(&factory_));
 
   factory_->CreateDemux(reader.Pass(), GetProxy(&demux_));
   HandleDemuxMetadataUpdates();
diff --git a/services/media/factory_service/media_player_impl.h b/services/media/factory_service/media_player_impl.h
index 6ee1061..195b76e 100644
--- a/services/media/factory_service/media_player_impl.h
+++ b/services/media/factory_service/media_player_impl.h
@@ -8,7 +8,6 @@
 #include <limits>
 #include <vector>
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/services/media/common/cpp/timeline.h"
 #include "mojo/services/media/common/cpp/timeline_function.h"
diff --git a/services/media/factory_service/media_sink_impl.cc b/services/media/factory_service/media_sink_impl.cc
index e6bbeec..dc58543 100644
--- a/services/media/factory_service/media_sink_impl.cc
+++ b/services/media/factory_service/media_sink_impl.cc
@@ -67,7 +67,7 @@
   // An AudioTrackController knows how to talk to an audio track, interrogating
   // it for supported stream types and configuring it for the chosen stream
   // type.
-  controller_.reset(new AudioTrackController(destination_url, app()));
+  controller_.reset(new AudioTrackController(destination_url, owner->shell()));
 
   controller_->GetSupportedMediaTypes([this, consumer_ref, producer_ref,
                                        captured_stream_type](
diff --git a/services/media/factory_service/media_sink_impl.h b/services/media/factory_service/media_sink_impl.h
index 29992f5..1eec79b 100644
--- a/services/media/factory_service/media_sink_impl.h
+++ b/services/media/factory_service/media_sink_impl.h
@@ -7,7 +7,6 @@
 
 #include <memory>
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/services/media/control/interfaces/media_sink.mojom.h"
 #include "mojo/services/media/core/interfaces/timeline_controller.mojom.h"
diff --git a/services/media/factory_service/network_reader_impl.cc b/services/media/factory_service/network_reader_impl.cc
index b0d89a2..8ae97ad 100644
--- a/services/media/factory_service/network_reader_impl.cc
+++ b/services/media/factory_service/network_reader_impl.cc
@@ -31,7 +31,7 @@
       url_(url) {
   NetworkServicePtr network_service;
 
-  ConnectToService(app()->shell(), "mojo:network_service",
+  ConnectToService(owner->shell(), "mojo:network_service",
                    GetProxy(&network_service));
 
   network_service->CreateURLLoader(GetProxy(&url_loader_));
diff --git a/services/media/framework/parts/reader.h b/services/media/framework/parts/reader.h
index 895c3ec..d128d9d 100644
--- a/services/media/framework/parts/reader.h
+++ b/services/media/framework/parts/reader.h
@@ -8,7 +8,6 @@
 #include <limits>
 #include <memory>
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "services/media/framework/result.h"
 
 namespace mojo {
diff --git a/services/ui/view_manager/tests/view_manager_test.cc b/services/ui/view_manager/tests/view_manager_test.cc
index 13e30c6..799cea3 100644
--- a/services/ui/view_manager/tests/view_manager_test.cc
+++ b/services/ui/view_manager/tests/view_manager_test.cc
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/public/cpp/application/connect.h"
+#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/services/ui/views/interfaces/view_manager.mojom.h"
 #include "mojo/services/ui/views/interfaces/views.mojom.h"
 #include "services/ui/view_manager/tests/mock_view_associate.h"
diff --git a/services/ui/view_manager/view_associate_table.h b/services/ui/view_manager/view_associate_table.h
index 4952498..67d12e1 100644
--- a/services/ui/view_manager/view_associate_table.h
+++ b/services/ui/view_manager/view_associate_table.h
@@ -12,7 +12,6 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "mojo/common/binding_set.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/services/ui/views/interfaces/view_associates.mojom.h"
 #include "mojo/services/ui/views/interfaces/view_manager.mojom.h"
 
diff --git a/services/util/cpp/factory_service_base.cc b/services/util/cpp/factory_service_base.cc
index cc00c1b..8558014 100644
--- a/services/util/cpp/factory_service_base.cc
+++ b/services/util/cpp/factory_service_base.cc
@@ -19,9 +19,5 @@
 
 FactoryServiceBase::~FactoryServiceBase() {}
 
-void FactoryServiceBase::Initialize(ApplicationImpl* app) {
-  app_ = app;
-}
-
 }  // namespace util
 }  // namespace mojo
diff --git a/services/util/cpp/factory_service_base.h b/services/util/cpp/factory_service_base.h
index 33b46e7..4098a43 100644
--- a/services/util/cpp/factory_service_base.h
+++ b/services/util/cpp/factory_service_base.h
@@ -9,13 +9,12 @@
 #include <unordered_set>
 
 #include "base/logging.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"
 
 namespace mojo {
 namespace util {
 
-class FactoryServiceBase : public ApplicationDelegate {
+class FactoryServiceBase : public ApplicationImplBase {
  public:
   // Provides common behavior for all objects created by the factory service.
   class ProductBase : public std::enable_shared_from_this<ProductBase> {
@@ -23,13 +22,10 @@
     virtual ~ProductBase();
 
    protected:
-    ProductBase(FactoryServiceBase* owner);
+    explicit ProductBase(FactoryServiceBase* owner);
 
-    // Returns the ApplicationImpl.
-    ApplicationImpl* app() {
-      DCHECK(owner_->app());
-      return owner_->app();
-    }
+    // Returns the owner.
+    FactoryServiceBase* owner() { return owner_; }
 
     // Tells the factory service to release this product.
     void ReleaseFromOwner() {
@@ -72,11 +68,6 @@
 
   ~FactoryServiceBase() override;
 
-  ApplicationImpl* app() { return app_; }
-
-  // ApplicationDelegate implementation.
-  void Initialize(ApplicationImpl* app) override;
-
  protected:
   template <typename ProductImpl>
   void AddProduct(std::shared_ptr<ProductImpl> product) {
@@ -84,7 +75,6 @@
   }
 
  private:
-  ApplicationImpl* app_;
   std::unordered_set<std::shared_ptr<ProductBase>> products_;
 };
 
diff --git a/shell/android/android_handler.cc b/shell/android/android_handler.cc
index cf709f0..5fec25f 100644
--- a/shell/android/android_handler.cc
+++ b/shell/android/android_handler.cc
@@ -19,8 +19,8 @@
 #include "jni/AndroidHandler_jni.h"
 #include "mojo/data_pipe_utils/data_pipe_utils.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/service_provider_impl.h"
 #include "shell/android/run_android_application_function.h"
 #include "shell/native_application_support.h"
 
@@ -122,13 +122,13 @@
       reinterpret_cast<jlong>(run_android_application_fn));
 }
 
-void AndroidHandler::Initialize(mojo::ApplicationImpl* app) {
+void AndroidHandler::OnInitialize() {
   handler_task_runner_ = base::MessageLoop::current()->task_runner();
-  mojo::ConnectToService(app->shell(), "mojo:url_response_disk_cache",
+  mojo::ConnectToService(shell(), "mojo:url_response_disk_cache",
                          GetProxy(&url_response_disk_cache_));
 }
 
-bool AndroidHandler::ConfigureIncomingConnection(
+bool AndroidHandler::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<mojo::ContentHandler>(
       mojo::ContentHandlerFactory::GetInterfaceRequestHandler(this));
diff --git a/shell/android/android_handler.h b/shell/android/android_handler.h
index e31c014..20db98c 100644
--- a/shell/android/android_handler.h
+++ b/shell/android/android_handler.h
@@ -9,7 +9,7 @@
 
 #include "base/single_thread_task_runner.h"
 #include "mojo/application/content_handler_factory.h"
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/services/content_handler/interfaces/content_handler.mojom.h"
 #include "mojo/services/url_response_disk_cache/interfaces/url_response_disk_cache.mojom.h"
 
@@ -19,16 +19,16 @@
 
 namespace shell {
 
-class AndroidHandler : public mojo::ApplicationDelegate,
+class AndroidHandler : public mojo::ApplicationImplBase,
                        public mojo::ContentHandlerFactory::Delegate {
  public:
   AndroidHandler();
   ~AndroidHandler();
 
  private:
-  // mojo::ApplicationDelegate:
-  void Initialize(mojo::ApplicationImpl* app) override;
-  bool ConfigureIncomingConnection(
+  // mojo::ApplicationImplBase:
+  void OnInitialize() override;
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
   // mojo::ContentHandlerFactory::Delegate:
diff --git a/shell/android/android_handler_loader.cc b/shell/android/android_handler_loader.cc
index 9909a85..153898f 100644
--- a/shell/android/android_handler_loader.cc
+++ b/shell/android/android_handler_loader.cc
@@ -6,18 +6,15 @@
 
 namespace shell {
 
-AndroidHandlerLoader::AndroidHandlerLoader() {
-}
+AndroidHandlerLoader::AndroidHandlerLoader() {}
 
-AndroidHandlerLoader::~AndroidHandlerLoader() {
-}
+AndroidHandlerLoader::~AndroidHandlerLoader() {}
 
 void AndroidHandlerLoader::Load(
     const GURL& url,
     mojo::InterfaceRequest<mojo::Application> application_request) {
   DCHECK(application_request.is_pending());
-  application_.reset(
-      new mojo::ApplicationImpl(&android_handler_, application_request.Pass()));
+  android_handler_.Bind(application_request.Pass());
 }
 
 }  // namespace shell
diff --git a/shell/android/android_handler_loader.h b/shell/android/android_handler_loader.h
index 4e782a5..0a63b6f 100644
--- a/shell/android/android_handler_loader.h
+++ b/shell/android/android_handler_loader.h
@@ -5,10 +5,7 @@
 #ifndef SHELL_ANDROID_ANDROID_HANDLER_LOADER_H_
 #define SHELL_ANDROID_ANDROID_HANDLER_LOADER_H_
 
-#include "base/containers/scoped_ptr_hash_map.h"
 #include "base/macros.h"
-#include "base/memory/scoped_ptr.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "shell/android/android_handler.h"
 #include "shell/application_manager/application_loader.h"
 
@@ -26,7 +23,6 @@
       mojo::InterfaceRequest<mojo::Application> application_request) override;
 
   AndroidHandler android_handler_;
-  scoped_ptr<mojo::ApplicationImpl> application_;
 
   DISALLOW_COPY_AND_ASSIGN(AndroidHandlerLoader);
 };
diff --git a/shell/android/native_viewport_application_loader.cc b/shell/android/native_viewport_application_loader.cc
index 646b9df..29d4dbc 100644
--- a/shell/android/native_viewport_application_loader.cc
+++ b/shell/android/native_viewport_application_loader.cc
@@ -4,7 +4,7 @@
 
 #include "shell/android/native_viewport_application_loader.h"
 
-#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/application/service_provider_impl.h"
 #include "services/gles2/gpu_state.h"
 #include "services/native_viewport/native_viewport_impl.h"
 
@@ -13,28 +13,26 @@
 
 namespace shell {
 
-NativeViewportApplicationLoader::NativeViewportApplicationLoader() {
-}
+NativeViewportApplicationLoader::NativeViewportApplicationLoader() {}
 
-NativeViewportApplicationLoader::~NativeViewportApplicationLoader() {
-}
+NativeViewportApplicationLoader::~NativeViewportApplicationLoader() {}
 
 void NativeViewportApplicationLoader::Load(
     const GURL& url,
     InterfaceRequest<mojo::Application> application_request) {
   DCHECK(application_request.is_pending());
-  app_.reset(new mojo::ApplicationImpl(this, application_request.Pass()));
+  Bind(application_request.Pass());
 }
 
-bool NativeViewportApplicationLoader::ConfigureIncomingConnection(
+bool NativeViewportApplicationLoader::OnAcceptConnection(
     mojo::ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<mojo::NativeViewport>(
       [this](const ConnectionContext& connection_context,
              InterfaceRequest<mojo::NativeViewport> native_viewport_request) {
         if (!gpu_state_)
           gpu_state_ = new gles2::GpuState();
-        new native_viewport::NativeViewportImpl(
-            app_->shell(), false, gpu_state_, native_viewport_request.Pass());
+        new native_viewport::NativeViewportImpl(shell(), false, gpu_state_,
+                                                native_viewport_request.Pass());
       });
   service_provider_impl->AddService<mojo::Gpu>(
       [this](const ConnectionContext& connection_context,
diff --git a/shell/android/native_viewport_application_loader.h b/shell/android/native_viewport_application_loader.h
index 1087848..1afc3f8 100644
--- a/shell/android/native_viewport_application_loader.h
+++ b/shell/android/native_viewport_application_loader.h
@@ -5,7 +5,7 @@
 #ifndef MOJO_SHELL_ANDROID_NATIVE_VIEWPORT_APPLICATION_LOADER_H_
 #define MOJO_SHELL_ANDROID_NATIVE_VIEWPORT_APPLICATION_LOADER_H_
 
-#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl_base.h"
 #include "mojo/services/gpu/interfaces/gpu.mojom.h"
 #include "mojo/services/native_viewport/interfaces/native_viewport.mojom.h"
 #include "services/gles2/gpu_impl.h"
@@ -15,14 +15,10 @@
 class GpuState;
 }
 
-namespace mojo {
-class ApplicationImpl;
-}  // namespace mojo
-
 namespace shell {
 
 class NativeViewportApplicationLoader : public ApplicationLoader,
-                                        public mojo::ApplicationDelegate {
+                                        public mojo::ApplicationImplBase {
  public:
   NativeViewportApplicationLoader();
   ~NativeViewportApplicationLoader();
@@ -33,12 +29,11 @@
       const GURL& url,
       mojo::InterfaceRequest<mojo::Application> application_request) override;
 
-  // mojo::ApplicationDelegate implementation.
-  bool ConfigureIncomingConnection(
+  // mojo::ApplicationImplBase override.
+  bool OnAcceptConnection(
       mojo::ServiceProviderImpl* service_provider_impl) override;
 
   scoped_refptr<gles2::GpuState> gpu_state_;
-  scoped_ptr<mojo::ApplicationImpl> app_;
 
   DISALLOW_COPY_AND_ASSIGN(NativeViewportApplicationLoader);
 };
diff --git a/shell/application_manager/application_manager_unittest.cc b/shell/application_manager/application_manager_unittest.cc
index 0c32de3..2fd9ed7 100644
--- a/shell/application_manager/application_manager_unittest.cc
+++ b/shell/application_manager/application_manager_unittest.cc
@@ -11,8 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/scoped_vector.h"
 #include "base/message_loop/message_loop.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/service_provider_impl.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
@@ -22,11 +21,11 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using mojo::Application;
-using mojo::ApplicationDelegate;
-using mojo::ApplicationImpl;
+using mojo::ApplicationImplBase;
 using mojo::Callback;
 using mojo::ConnectionContext;
 using mojo::InterfaceRequest;
+using mojo::ServiceProviderImpl;
 using mojo::StrongBinding;
 
 namespace shell {
@@ -97,31 +96,30 @@
 };
 
 class TestApplicationLoader : public ApplicationLoader,
-                              public ApplicationDelegate {
+                              public ApplicationImplBase {
  public:
   TestApplicationLoader() : context_(nullptr), num_loads_(0) {}
 
   ~TestApplicationLoader() override {
     if (context_)
       ++context_->num_loader_deletes;
-    test_app_.reset();
   }
 
   void set_context(TestContext* context) { context_ = context; }
   int num_loads() const { return num_loads_; }
-  const std::vector<std::string>& GetArgs() const { return test_app_->args(); }
 
  private:
   // ApplicationLoader implementation.
   void Load(const GURL& url,
             InterfaceRequest<Application> application_request) override {
     ++num_loads_;
-    test_app_.reset(new ApplicationImpl(this, application_request.Pass()));
+    if (application_binding().is_bound())
+      application_binding().Close();
+    Bind(application_request.Pass());
   }
 
-  // ApplicationDelegate implementation.
-  bool ConfigureIncomingConnection(
-      mojo::ServiceProviderImpl* service_provider_impl) override {
+  // ApplicationImplBase override.
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override {
     service_provider_impl->AddService<TestService>(
         [this](const ConnectionContext& connection_context,
                InterfaceRequest<TestService> request) {
@@ -130,7 +128,6 @@
     return true;
   }
 
-  scoped_ptr<ApplicationImpl> test_app_;
   TestContext* context_;
   int num_loads_;
   DISALLOW_COPY_AND_ASSIGN(TestApplicationLoader);
@@ -293,7 +290,7 @@
   StrongBinding<TestB> binding_;
 };
 
-class Tester : public ApplicationDelegate, public ApplicationLoader {
+class Tester : public ApplicationImplBase, public ApplicationLoader {
  public:
   Tester(TesterContext* context, const std::string& requestor_url)
       : context_(context), requestor_url_(requestor_url) {}
@@ -302,11 +299,10 @@
  private:
   void Load(const GURL& url,
             InterfaceRequest<Application> application_request) override {
-    app_.reset(new ApplicationImpl(this, application_request.Pass()));
+    Bind(application_request.Pass());
   }
 
-  bool ConfigureIncomingConnection(
-      mojo::ServiceProviderImpl* service_provider_impl) override {
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override {
     const std::string& remote_url =
         service_provider_impl->connection_context().remote_url;
     if (!requestor_url_.empty() && requestor_url_ != remote_url) {
@@ -327,7 +323,7 @@
           [this](const ConnectionContext& connection_context,
                  InterfaceRequest<TestA> test_a_request) {
             mojo::InterfaceHandle<mojo::ServiceProvider> incoming_sp_handle;
-            app_->shell()->ConnectToApplication(
+            shell()->ConnectToApplication(
                 kTestBURLString, GetProxy(&incoming_sp_handle), nullptr);
             a_bindings_.push_back(new TestAImpl(
                 incoming_sp_handle.Pass(), context_, test_a_request.Pass()));
@@ -337,7 +333,6 @@
   }
 
   TesterContext* context_;
-  scoped_ptr<ApplicationImpl> app_;
   std::string requestor_url_;
   ScopedVector<TestAImpl> a_bindings_;
 };
@@ -368,32 +363,25 @@
   std::map<GURL, GURL> mappings_;
 };
 
-class TestExternal : public ApplicationDelegate {
+class TestExternal : public ApplicationImplBase {
  public:
   TestExternal() : configure_incoming_connection_called_(false) {}
 
-  void Initialize(ApplicationImpl* app) override {
-    initialize_args_ = app->args();
-    base::MessageLoop::current()->Quit();
-  }
+  void OnInitialize() override { base::MessageLoop::current()->Quit(); }
 
-  bool ConfigureIncomingConnection(
-      mojo::ServiceProviderImpl* service_provider_impl) override {
+  bool OnAcceptConnection(ServiceProviderImpl* service_provider_impl) override {
     configure_incoming_connection_called_ = true;
     base::MessageLoop::current()->Quit();
     return true;
   }
 
-  const std::vector<std::string>& initialize_args() const {
-    return initialize_args_;
-  }
+  const std::vector<std::string>& initialize_args() const { return args(); }
 
   bool configure_incoming_connection_called() const {
     return configure_incoming_connection_called_;
   }
 
  private:
-  std::vector<std::string> initialize_args_;
   bool configure_incoming_connection_called_;
 };
 
@@ -462,7 +450,7 @@
   TestClient test_client(test_service.Pass());
   test_client.Test("test");
   loop_.Run();
-  std::vector<std::string> app_args = loader->GetArgs();
+  std::vector<std::string> app_args = loader->args();
   EXPECT_EQ(0U, app_args.size());
 }
 
@@ -482,7 +470,7 @@
   TestClient test_client(test_service.Pass());
   test_client.Test("test");
   loop_.Run();
-  std::vector<std::string> app_args = loader->GetArgs();
+  std::vector<std::string> app_args = loader->args();
   ASSERT_EQ(args.size() + 1, app_args.size());
   EXPECT_EQ(args[0], app_args[1]);
   EXPECT_EQ(args[1], app_args[2]);
@@ -505,7 +493,7 @@
   TestClient test_client(test_service.Pass());
   test_client.Test("test");
   loop_.Run();
-  std::vector<std::string> app_args = loader->GetArgs();
+  std::vector<std::string> app_args = loader->args();
   ASSERT_EQ(args.size() + 1, app_args.size());
   EXPECT_EQ(args[0], app_args[1]);
 }
@@ -529,7 +517,7 @@
   TestClient test_client(test_service.Pass());
   test_client.Test("test");
   loop_.Run();
-  std::vector<std::string> app_args = loader->GetArgs();
+  std::vector<std::string> app_args = loader->args();
   ASSERT_EQ(args1.size() + args2.size() + 1, app_args.size());
   EXPECT_EQ(args1[0], app_args[1]);
   EXPECT_EQ(args2[0], app_args[2]);
@@ -559,7 +547,7 @@
     TestClient test_client(test_service.Pass());
     test_client.Test("test");
     loop_.Run();
-    std::vector<std::string> app_args = loader->GetArgs();
+    std::vector<std::string> app_args = loader->args();
     ASSERT_EQ(args.size() + args2.size() + 1, app_args.size());
     EXPECT_EQ(args[0], app_args[1]);
     EXPECT_EQ(args[1], app_args[2]);
@@ -573,7 +561,7 @@
     TestClient test_client(test_service.Pass());
     test_client.Test("test");
     loop_.Run();
-    std::vector<std::string> app_args = loader->GetArgs();
+    std::vector<std::string> app_args = loader->args();
     ASSERT_EQ(args.size() + args2.size() + 1, app_args.size());
     EXPECT_EQ(args[0], app_args[1]);
     EXPECT_EQ(args[1], app_args[2]);
diff --git a/shell/context.cc b/shell/context.cc
index 3154c8a..9751b03 100644
--- a/shell/context.cc
+++ b/shell/context.cc
@@ -26,8 +26,6 @@
 #include "mojo/edk/embedder/embedder.h"
 #include "mojo/edk/embedder/multiprocess_embedder.h"
 #include "mojo/edk/embedder/simple_platform_support.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/services/tracing/interfaces/trace_provider_registry.mojom.h"
 #include "mojo/services/tracing/interfaces/tracing.mojom.h"
diff --git a/shell/url_response_disk_cache_loader.h b/shell/url_response_disk_cache_loader.h
index 2969351..8f2b7d2 100644
--- a/shell/url_response_disk_cache_loader.h
+++ b/shell/url_response_disk_cache_loader.h
@@ -7,7 +7,6 @@
 
 #include "base/macros.h"
 #include "base/task_runner.h"
-#include "mojo/public/cpp/application/application_impl.h"
 #include "services/url_response_disk_cache/url_response_disk_cache_app.h"
 #include "shell/application_manager/application_loader.h"