diff --git a/mojo/public/cpp/bindings/binding.h b/mojo/public/cpp/bindings/binding.h
index 5f33a61..2510a31 100644
--- a/mojo/public/cpp/bindings/binding.h
+++ b/mojo/public/cpp/bindings/binding.h
@@ -41,15 +41,6 @@
 //     Binding<Foo> binding_;
 //   };
 //
-//   class MyFooFactory : public InterfaceFactory<Foo> {
-//    public:
-//     void Create(..., InterfaceRequest<Foo> request) override {
-//       auto f = new FooImpl(request.Pass());
-//       // Do something to manage the lifetime of |f|. Use StrongBinding<> to
-//       // delete FooImpl on connection errors.
-//     }
-//   };
-//
 // The caller may specify a |MojoAsyncWaiter| to be used by the connection when
 // waiting for calls to arrive. Normally it is fine to use the default waiter.
 // However, the caller may provide their own implementation if needed. The
diff --git a/mojo/public/cpp/bindings/strong_binding.h b/mojo/public/cpp/bindings/strong_binding.h
index 3ccbb75..c6ba5cf 100644
--- a/mojo/public/cpp/bindings/strong_binding.h
+++ b/mojo/public/cpp/bindings/strong_binding.h
@@ -42,14 +42,6 @@
 //    private:
 //     StrongBinding<Foo> binding_;
 //   };
-//
-//   class MyFooFactory : public InterfaceFactory<Foo> {
-//    public:
-//     void Create(..., InterfaceRequest<Foo> request) override {
-//       new StronglyBound(request.Pass());  // The binding now owns the
-//                                           // instance of StronglyBound.
-//     }
-//   };
 template <typename Interface>
 class StrongBinding {
  public:
diff --git a/services/keyboard/linux/keyboard_service_impl.h b/services/keyboard/linux/keyboard_service_impl.h
index 6ac6a89..d493de9 100644
--- a/services/keyboard/linux/keyboard_service_impl.h
+++ b/services/keyboard/linux/keyboard_service_impl.h
@@ -6,7 +6,6 @@
 #define SERVICES_KEYBOARD_LINUX_KEYBOARD_SERVICE_IMPL_H_
 
 #include "base/macros.h"
-#include "mojo/public/cpp/application/interface_factory.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/public/interfaces/application/shell.mojom.h"
 #include "mojo/services/keyboard/interfaces/keyboard.mojom.h"
diff --git a/services/native_viewport/native_viewport_impl.cc b/services/native_viewport/native_viewport_impl.cc
index 7307714..46961ba 100644
--- a/services/native_viewport/native_viewport_impl.cc
+++ b/services/native_viewport/native_viewport_impl.cc
@@ -12,7 +12,6 @@
 #include "mojo/converters/geometry/geometry_type_converters.h"
 #include "mojo/converters/native_viewport/surface_configuration_type_converters.h"
 #include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/interface_factory.h"
 #include "services/gles2/gpu_state.h"
 #include "services/native_viewport/platform_viewport_headless.h"
 #include "ui/events/event.h"
diff --git a/services/test_service/test_request_tracker_application.cc b/services/test_service/test_request_tracker_application.cc
index ed23d44..b1f0715 100644
--- a/services/test_service/test_request_tracker_application.cc
+++ b/services/test_service/test_request_tracker_application.cc
@@ -29,30 +29,24 @@
     ApplicationConnection* connection) {
   // Every instance of the service and recorder shares the context.
   // Note, this app is single-threaded, so this is thread safe.
-  connection->AddService<TestTimeService>(this);
-  connection->AddService<TestRequestTracker>(this);
-  connection->AddService<TestTrackedRequestService>(this);
+  connection->GetServiceProviderImpl().AddService<TestTimeService>(
+      [this](const ConnectionContext& connection_context,
+             InterfaceRequest<TestTimeService> request) {
+        new TestTimeServiceImpl(app_impl_, request.Pass());
+      });
+  connection->GetServiceProviderImpl().AddService<TestRequestTracker>(
+      [this](const ConnectionContext& connection_context,
+             InterfaceRequest<TestRequestTracker> request) {
+        new TestRequestTrackerImpl(request.Pass(), &context_);
+      });
+  connection->GetServiceProviderImpl().AddService<TestTrackedRequestService>(
+      [this](const ConnectionContext& connection_context,
+             InterfaceRequest<TestTrackedRequestService> request) {
+        new TestTrackedRequestServiceImpl(request.Pass(), &context_);
+      });
   return true;
 }
 
-void TestRequestTrackerApplication::Create(
-    const ConnectionContext& connection_context,
-    InterfaceRequest<TestTimeService> request) {
-  new TestTimeServiceImpl(app_impl_, request.Pass());
-}
-
-void TestRequestTrackerApplication::Create(
-    const ConnectionContext& connection_context,
-    InterfaceRequest<TestRequestTracker> request) {
-  new TestRequestTrackerImpl(request.Pass(), &context_);
-}
-
-void TestRequestTrackerApplication::Create(
-    const ConnectionContext& connection_context,
-    InterfaceRequest<TestTrackedRequestService> request) {
-  new TestTrackedRequestServiceImpl(request.Pass(), &context_);
-}
-
 }  // namespace test
 }  // namespace mojo
 
diff --git a/services/test_service/test_request_tracker_application.h b/services/test_service/test_request_tracker_application.h
index c169c90..d936c48 100644
--- a/services/test_service/test_request_tracker_application.h
+++ b/services/test_service/test_request_tracker_application.h
@@ -6,7 +6,6 @@
 #define SERVICES_TEST_SERVICE_TEST_REQUEST_TRACKER_APPLICATION_H_
 
 #include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/interface_factory.h"
 #include "mojo/public/cpp/system/macros.h"
 #include "services/test_service/test_request_tracker_impl.h"
 
@@ -16,11 +15,7 @@
 class TestTimeService;
 
 // Embeds TestRequestTracker mojo services into an application.
-class TestRequestTrackerApplication
-    : public ApplicationDelegate,
-      public InterfaceFactory<TestTimeService>,
-      public InterfaceFactory<TestRequestTracker>,
-      public InterfaceFactory<TestTrackedRequestService> {
+class TestRequestTrackerApplication : public ApplicationDelegate {
  public:
   TestRequestTrackerApplication();
   ~TestRequestTrackerApplication() override;
@@ -30,18 +25,6 @@
   // ApplicationDelegate methods:
   bool ConfigureIncomingConnection(ApplicationConnection* connection) override;
 
-  // InterfaceFactory<TestTimeService> methods:
-  void Create(const ConnectionContext& connection_context,
-              InterfaceRequest<TestTimeService> request) override;
-
-  // InterfaceFactory<TestRequestTracker> methods:
-  void Create(const ConnectionContext& connection_context,
-              InterfaceRequest<TestRequestTracker> request) override;
-
-  // InterfaceFactory<TestTrackedRequestService> methods:
-  void Create(const ConnectionContext& connection_context,
-              InterfaceRequest<TestTrackedRequestService> request) override;
-
  private:
   ApplicationImpl* app_impl_;
   TrackingContext context_;
diff --git a/services/test_service/test_service_application.cc b/services/test_service/test_service_application.cc
index 509ddac..bf362d3 100644
--- a/services/test_service/test_service_application.cc
+++ b/services/test_service/test_service_application.cc
@@ -29,22 +29,20 @@
 
 bool TestServiceApplication::ConfigureIncomingConnection(
     ApplicationConnection* connection) {
-  connection->AddService<TestService>(this);
-  connection->AddService<TestTimeService>(this);
+  connection->GetServiceProviderImpl().AddService<TestService>(
+      [this](const ConnectionContext& connection_context,
+             InterfaceRequest<TestService> request) {
+        new TestServiceImpl(app_impl_, this, request.Pass());
+        AddRef();
+      });
+  connection->GetServiceProviderImpl().AddService<TestTimeService>(
+      [this](const ConnectionContext& connection_context,
+             InterfaceRequest<TestTimeService> request) {
+        new TestTimeServiceImpl(app_impl_, request.Pass());
+      });
   return true;
 }
 
-void TestServiceApplication::Create(const ConnectionContext& connection_context,
-                                    InterfaceRequest<TestService> request) {
-  new TestServiceImpl(app_impl_, this, request.Pass());
-  AddRef();
-}
-
-void TestServiceApplication::Create(const ConnectionContext& connection_context,
-                                    InterfaceRequest<TestTimeService> request) {
-  new TestTimeServiceImpl(app_impl_, request.Pass());
-}
-
 void TestServiceApplication::AddRef() {
   assert(ref_count_ >= 0);
   ref_count_++;
diff --git a/services/test_service/test_service_application.h b/services/test_service/test_service_application.h
index 1839311..625e4bb 100644
--- a/services/test_service/test_service_application.h
+++ b/services/test_service/test_service_application.h
@@ -6,7 +6,6 @@
 #define SERVICES_TEST_SERVICE_TEST_SERVICE_APPLICATION_H_
 
 #include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/interface_factory.h"
 #include "mojo/public/cpp/system/macros.h"
 
 namespace mojo {
@@ -16,9 +15,7 @@
 class TestService;
 class TestTimeService;
 
-class TestServiceApplication : public ApplicationDelegate,
-                               public InterfaceFactory<TestService>,
-                               public InterfaceFactory<TestTimeService> {
+class TestServiceApplication : public ApplicationDelegate {
  public:
   TestServiceApplication();
   ~TestServiceApplication() override;
@@ -28,14 +25,6 @@
   // ApplicationDelegate implementation.
   bool ConfigureIncomingConnection(ApplicationConnection* connection) override;
 
-  // InterfaceFactory<TestService> implementation.
-  void Create(const ConnectionContext& connection_context,
-              InterfaceRequest<TestService> request) override;
-
-  // InterfaceFactory<TestTimeService> implementation.
-  void Create(const ConnectionContext& connection_context,
-              InterfaceRequest<TestTimeService> request) override;
-
   void AddRef();
   void ReleaseRef();
 
diff --git a/services/tracing/tracing_app.cc b/services/tracing/tracing_app.cc
index 915ed03..0413158 100644
--- a/services/tracing/tracing_app.cc
+++ b/services/tracing/tracing_app.cc
@@ -17,25 +17,26 @@
 
 bool TracingApp::ConfigureIncomingConnection(
     mojo::ApplicationConnection* connection) {
-  connection->AddService<TraceCollector>(this);
+  connection->GetServiceProviderImpl().AddService<TraceCollector>(
+      [this](const mojo::ConnectionContext& connection_context,
+             mojo::InterfaceRequest<TraceCollector> trace_collector_request) {
+        if (collector_binding_.is_bound()) {
+          LOG(ERROR) << "Another application is already connected to tracing.";
+          return;
+        }
+
+        collector_binding_.Bind(trace_collector_request.Pass());
+      });
+  connection->GetServiceProviderImpl().AddService<TraceProviderRegistry>(
+      [this](const mojo::ConnectionContext& connection_context,
+             mojo::InterfaceRequest<TraceProviderRegistry>
+                 trace_provider_registry_request) {
+        provider_registry_bindings_.AddBinding(
+            this, trace_provider_registry_request.Pass());
+      });
   return true;
 }
 
-void TracingApp::Create(const mojo::ConnectionContext& connection_context,
-                        mojo::InterfaceRequest<TraceCollector> request) {
-  if (collector_binding_.is_bound()) {
-    LOG(ERROR) << "Another application is already connected to tracing.";
-    return;
-  }
-
-  collector_binding_.Bind(request.Pass());
-}
-
-void TracingApp::Create(const mojo::ConnectionContext& connection_context,
-                        mojo::InterfaceRequest<TraceProviderRegistry> request) {
-  provider_registry_bindings_.AddBinding(this, request.Pass());
-}
-
 void TracingApp::Start(mojo::ScopedDataPipeProducerHandle stream,
                        const mojo::String& categories) {
   tracing_categories_ = categories;
diff --git a/services/tracing/tracing_app.h b/services/tracing/tracing_app.h
index 24395e0..70c010e 100644
--- a/services/tracing/tracing_app.h
+++ b/services/tracing/tracing_app.h
@@ -21,8 +21,6 @@
 namespace tracing {
 
 class TracingApp : public mojo::ApplicationDelegate,
-                   public mojo::InterfaceFactory<TraceCollector>,
-                   public mojo::InterfaceFactory<TraceProviderRegistry>,
                    public TraceCollector,
                    public TraceProviderRegistry {
  public:
@@ -34,14 +32,6 @@
   bool ConfigureIncomingConnection(
       mojo::ApplicationConnection* connection) override;
 
-  // mojo::InterfaceFactory<TraceCollector> implementation.
-  void Create(const mojo::ConnectionContext& connection_context,
-              mojo::InterfaceRequest<TraceCollector> request) override;
-
-  // mojo::InterfaceFactory<TraceProviderRegistry> implementation.
-  void Create(const mojo::ConnectionContext& connection_context,
-              mojo::InterfaceRequest<TraceProviderRegistry> request) override;
-
   // TraceCollector implementation.
   void Start(mojo::ScopedDataPipeProducerHandle stream,
              const mojo::String& categories) override;
diff --git a/services/ui/input_manager/input_manager_app.cc b/services/ui/input_manager/input_manager_app.cc
index b6adffb..0d2917d 100644
--- a/services/ui/input_manager/input_manager_app.cc
+++ b/services/ui/input_manager/input_manager_app.cc
@@ -34,14 +34,14 @@
 
 bool InputManagerApp::ConfigureIncomingConnection(
     mojo::ApplicationConnection* connection) {
-  connection->AddService<mojo::ui::ViewAssociate>(this);
+  connection->GetServiceProviderImpl().AddService<mojo::ui::ViewAssociate>(
+      [this](const mojo::ConnectionContext& connection_context,
+             mojo::InterfaceRequest<mojo::ui::ViewAssociate>
+                 view_associate_request) {
+        input_associates_.AddBinding(new InputAssociate(),
+                                     view_associate_request.Pass());
+      });
   return true;
 }
 
-void InputManagerApp::Create(
-    const mojo::ConnectionContext& connection_context,
-    mojo::InterfaceRequest<mojo::ui::ViewAssociate> request) {
-  input_associates.AddBinding(new InputAssociate(), request.Pass());
-}
-
 }  // namespace input_manager
diff --git a/services/ui/input_manager/input_manager_app.h b/services/ui/input_manager/input_manager_app.h
index 764487b..5c8a817 100644
--- a/services/ui/input_manager/input_manager_app.h
+++ b/services/ui/input_manager/input_manager_app.h
@@ -11,14 +11,12 @@
 #include "mojo/common/strong_binding_set.h"
 #include "mojo/common/tracing_impl.h"
 #include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/interface_factory.h"
 #include "mojo/services/ui/views/interfaces/view_associates.mojom.h"
 
 namespace input_manager {
 
 // Input manager application entry point.
-class InputManagerApp : public mojo::ApplicationDelegate,
-                        public mojo::InterfaceFactory<mojo::ui::ViewAssociate> {
+class InputManagerApp : public mojo::ApplicationDelegate {
  public:
   InputManagerApp();
   ~InputManagerApp() override;
@@ -29,14 +27,10 @@
   bool ConfigureIncomingConnection(
       mojo::ApplicationConnection* connection) override;
 
-  // |InterfaceFactory<ViewAssociate>|:
-  void Create(const mojo::ConnectionContext& connection_context,
-              mojo::InterfaceRequest<mojo::ui::ViewAssociate> request) override;
-
   mojo::ApplicationImpl* app_impl_;
   mojo::TracingImpl tracing_;
 
-  mojo::StrongBindingSet<mojo::ui::ViewAssociate> input_associates;
+  mojo::StrongBindingSet<mojo::ui::ViewAssociate> input_associates_;
 
   DISALLOW_COPY_AND_ASSIGN(InputManagerApp);
 };
diff --git a/services/ui/launcher/launcher_app.cc b/services/ui/launcher/launcher_app.cc
index d0f1377..9a6fe1f 100644
--- a/services/ui/launcher/launcher_app.cc
+++ b/services/ui/launcher/launcher_app.cc
@@ -42,16 +42,15 @@
   if (connection->GetServiceProviderImpl()
           .connection_context()
           .remote_url.empty()) {
-    connection->AddService<Launcher>(this);
+    connection->GetServiceProviderImpl().AddService<Launcher>(
+        [this](const mojo::ConnectionContext& connection_context,
+               mojo::InterfaceRequest<Launcher> launcher_request) {
+          bindings_.AddBinding(this, launcher_request.Pass());
+        });
   }
   return true;
 }
 
-void LauncherApp::Create(const mojo::ConnectionContext& connection_context,
-                         mojo::InterfaceRequest<Launcher> request) {
-  bindings_.AddBinding(this, request.Pass());
-}
-
 void LauncherApp::Launch(const mojo::String& application_url) {
   uint32_t next_id = next_id_++;
   std::unique_ptr<LaunchInstance> instance(new LaunchInstance(
diff --git a/services/ui/launcher/launcher_app.h b/services/ui/launcher/launcher_app.h
index 153641d..f6a65d1 100644
--- a/services/ui/launcher/launcher_app.h
+++ b/services/ui/launcher/launcher_app.h
@@ -16,9 +16,7 @@
 
 namespace launcher {
 
-class LauncherApp : public mojo::ApplicationDelegate,
-                    public mojo::InterfaceFactory<Launcher>,
-                    public Launcher {
+class LauncherApp : public mojo::ApplicationDelegate, public Launcher {
  public:
   LauncherApp();
   ~LauncherApp() override;
@@ -29,10 +27,6 @@
   bool ConfigureIncomingConnection(
       mojo::ApplicationConnection* connection) override;
 
-  // mojo::InterfaceRequest<Launcher> implementation
-  void Create(const mojo::ConnectionContext& connection_context,
-              mojo::InterfaceRequest<Launcher> request) override;
-
   // |Launcher|:
   void Launch(const mojo::String& application_url) override;
 
diff --git a/services/ui/view_manager/view_manager_app.cc b/services/ui/view_manager/view_manager_app.cc
index 63ebbba..ae5c2eb 100644
--- a/services/ui/view_manager/view_manager_app.cc
+++ b/services/ui/view_manager/view_manager_app.cc
@@ -61,18 +61,16 @@
 
 bool ViewManagerApp::ConfigureIncomingConnection(
     mojo::ApplicationConnection* connection) {
-  connection->AddService<mojo::ui::ViewManager>(this);
+  connection->GetServiceProviderImpl().AddService<mojo::ui::ViewManager>([this](
+      const mojo::ConnectionContext& connection_context,
+      mojo::InterfaceRequest<mojo::ui::ViewManager> view_manager_request) {
+    DCHECK(registry_);
+    view_managers_.AddBinding(new ViewManagerImpl(registry_.get()),
+                              view_manager_request.Pass());
+  });
   return true;
 }
 
-void ViewManagerApp::Create(
-    const mojo::ConnectionContext& connection_context,
-    mojo::InterfaceRequest<mojo::ui::ViewManager> request) {
-  DCHECK(registry_);
-  view_managers_.AddBinding(new ViewManagerImpl(registry_.get()),
-                            request.Pass());
-}
-
 void ViewManagerApp::OnCompositorConnectionError() {
   LOG(ERROR) << "Exiting due to compositor connection error.";
   Shutdown();
diff --git a/services/ui/view_manager/view_manager_app.h b/services/ui/view_manager/view_manager_app.h
index 2088435..39c32cc 100644
--- a/services/ui/view_manager/view_manager_app.h
+++ b/services/ui/view_manager/view_manager_app.h
@@ -18,8 +18,7 @@
 namespace view_manager {
 
 // View manager application entry point.
-class ViewManagerApp : public mojo::ApplicationDelegate,
-                       public mojo::InterfaceFactory<mojo::ui::ViewManager> {
+class ViewManagerApp : public mojo::ApplicationDelegate {
  public:
   ViewManagerApp();
   ~ViewManagerApp() override;
@@ -30,10 +29,6 @@
   bool ConfigureIncomingConnection(
       mojo::ApplicationConnection* connection) override;
 
-  // |InterfaceFactory<ViewManager>|:
-  void Create(const mojo::ConnectionContext& connection_context,
-              mojo::InterfaceRequest<mojo::ui::ViewManager> request) override;
-
   void OnCompositorConnectionError();
   void OnAssociateConnectionError(const std::string& url);
 
diff --git a/services/url_response_disk_cache/url_response_disk_cache_app.cc b/services/url_response_disk_cache/url_response_disk_cache_app.cc
index e63d15f..a2f6ed8 100644
--- a/services/url_response_disk_cache/url_response_disk_cache_app.cc
+++ b/services/url_response_disk_cache/url_response_disk_cache_app.cc
@@ -25,15 +25,13 @@
 
 bool URLResponseDiskCacheApp::ConfigureIncomingConnection(
     ApplicationConnection* connection) {
-  connection->AddService<URLResponseDiskCache>(this);
+  connection->GetServiceProviderImpl().AddService<URLResponseDiskCache>([this](
+      const ConnectionContext& connection_context,
+      InterfaceRequest<URLResponseDiskCache> request) {
+    new URLResponseDiskCacheImpl(task_runner_, delegate_, db_,
+                                 connection_context.remote_url, request.Pass());
+  });
   return true;
 }
 
-void URLResponseDiskCacheApp::Create(
-    const ConnectionContext& connection_context,
-    InterfaceRequest<URLResponseDiskCache> request) {
-  new URLResponseDiskCacheImpl(task_runner_, delegate_, db_,
-                               connection_context.remote_url, request.Pass());
-}
-
 }  // namespace mojo
diff --git a/services/url_response_disk_cache/url_response_disk_cache_app.h b/services/url_response_disk_cache/url_response_disk_cache_app.h
index 7e0715c..52d4e14 100644
--- a/services/url_response_disk_cache/url_response_disk_cache_app.h
+++ b/services/url_response_disk_cache/url_response_disk_cache_app.h
@@ -12,15 +12,13 @@
 #include "mojo/public/cpp/application/application_connection.h"
 #include "mojo/public/cpp/application/application_delegate.h"
 #include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/interface_factory.h"
 #include "mojo/services/url_response_disk_cache/interfaces/url_response_disk_cache.mojom.h"
 #include "services/url_response_disk_cache/url_response_disk_cache_db.h"
 #include "services/url_response_disk_cache/url_response_disk_cache_delegate.h"
 
 namespace mojo {
 
-class URLResponseDiskCacheApp : public ApplicationDelegate,
-                                public InterfaceFactory<URLResponseDiskCache> {
+class URLResponseDiskCacheApp : public ApplicationDelegate {
  public:
   explicit URLResponseDiskCacheApp(scoped_refptr<base::TaskRunner> task_runner,
                                    URLResponseDiskCacheDelegate* delegate);
@@ -31,10 +29,6 @@
   void Initialize(ApplicationImpl* app) override;
   bool ConfigureIncomingConnection(ApplicationConnection* connection) override;
 
-  // InterfaceFactory<URLResponseDiskCache>:
-  void Create(const ConnectionContext& connection_context,
-              InterfaceRequest<URLResponseDiskCache> request) override;
-
   scoped_refptr<base::TaskRunner> task_runner_;
   scoped_refptr<URLResponseDiskCacheDB> db_;
   URLResponseDiskCacheDelegate* delegate_;
diff --git a/shell/android/native_viewport_application_loader.cc b/shell/android/native_viewport_application_loader.cc
index ea9bc9b..359f004 100644
--- a/shell/android/native_viewport_application_loader.cc
+++ b/shell/android/native_viewport_application_loader.cc
@@ -29,26 +29,22 @@
 
 bool NativeViewportApplicationLoader::ConfigureIncomingConnection(
     ApplicationConnection* connection) {
-  connection->AddService<mojo::NativeViewport>(this);
-  connection->AddService<mojo::Gpu>(this);
+  connection->GetServiceProviderImpl().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_.get(), false, gpu_state_,
+                                                native_viewport_request.Pass());
+      });
+  connection->GetServiceProviderImpl().AddService<mojo::Gpu>(
+      [this](const ConnectionContext& connection_context,
+             InterfaceRequest<mojo::Gpu> gpu_request) {
+        if (!gpu_state_)
+          gpu_state_ = new gles2::GpuState();
+        new gles2::GpuImpl(gpu_request.Pass(), gpu_state_);
+      });
   return true;
 }
 
-void NativeViewportApplicationLoader::Create(
-    const ConnectionContext& connection_context,
-    InterfaceRequest<mojo::NativeViewport> request) {
-  if (!gpu_state_)
-    gpu_state_ = new gles2::GpuState;
-  new native_viewport::NativeViewportImpl(app_.get(), false, gpu_state_,
-                                          request.Pass());
-}
-
-void NativeViewportApplicationLoader::Create(
-    const ConnectionContext& connection_context,
-    InterfaceRequest<mojo::Gpu> request) {
-  if (!gpu_state_)
-    gpu_state_ = new gles2::GpuState;
-  new gles2::GpuImpl(request.Pass(), gpu_state_);
-}
-
 }  // namespace shell
diff --git a/shell/android/native_viewport_application_loader.h b/shell/android/native_viewport_application_loader.h
index 861a691..a1663b1 100644
--- a/shell/android/native_viewport_application_loader.h
+++ b/shell/android/native_viewport_application_loader.h
@@ -6,7 +6,6 @@
 #define MOJO_SHELL_ANDROID_NATIVE_VIEWPORT_APPLICATION_LOADER_H_
 
 #include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/interface_factory.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"
@@ -22,11 +21,8 @@
 
 namespace shell {
 
-class NativeViewportApplicationLoader
-    : public ApplicationLoader,
-      public mojo::ApplicationDelegate,
-      public mojo::InterfaceFactory<mojo::NativeViewport>,
-      public mojo::InterfaceFactory<mojo::Gpu> {
+class NativeViewportApplicationLoader : public ApplicationLoader,
+                                        public mojo::ApplicationDelegate {
  public:
   NativeViewportApplicationLoader();
   ~NativeViewportApplicationLoader();
@@ -41,14 +37,6 @@
   bool ConfigureIncomingConnection(
       mojo::ApplicationConnection* connection) override;
 
-  // mojo::InterfaceFactory<mojo::NativeViewport> implementation.
-  void Create(const mojo::ConnectionContext& connection_context,
-              mojo::InterfaceRequest<mojo::NativeViewport> request) override;
-
-  // mojo::InterfaceFactory<mojo::Gpu> implementation.
-  void Create(const mojo::ConnectionContext& connection_context,
-              mojo::InterfaceRequest<mojo::Gpu> request) override;
-
   scoped_refptr<gles2::GpuState> gpu_state_;
   scoped_ptr<mojo::ApplicationImpl> app_;
 
diff --git a/shell/application_manager/application_manager_unittest.cc b/shell/application_manager/application_manager_unittest.cc
index 8ea79c0..c8c677e 100644
--- a/shell/application_manager/application_manager_unittest.cc
+++ b/shell/application_manager/application_manager_unittest.cc
@@ -15,7 +15,6 @@
 #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/interface_factory.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/public/interfaces/application/service_provider.mojom.h"
 #include "shell/application_manager/application_loader.h"
@@ -28,7 +27,6 @@
 using mojo::ApplicationImpl;
 using mojo::Callback;
 using mojo::ConnectionContext;
-using mojo::InterfaceFactory;
 using mojo::InterfaceRequest;
 using mojo::StrongBinding;
 
@@ -100,8 +98,7 @@
 };
 
 class TestApplicationLoader : public ApplicationLoader,
-                              public ApplicationDelegate,
-                              public InterfaceFactory<TestService> {
+                              public ApplicationDelegate {
  public:
   TestApplicationLoader() : context_(nullptr), num_loads_(0) {}
 
@@ -125,16 +122,14 @@
 
   // ApplicationDelegate implementation.
   bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
-    connection->AddService(this);
+    connection->GetServiceProviderImpl().AddService<TestService>(
+        [this](const ConnectionContext& connection_context,
+               InterfaceRequest<TestService> request) {
+          new TestServiceImpl(context_, request.Pass());
+        });
     return true;
   }
 
-  // InterfaceFactory implementation.
-  void Create(const ConnectionContext& connection_context,
-              InterfaceRequest<TestService> request) override {
-    new TestServiceImpl(context_, request.Pass());
-  }
-
   scoped_ptr<ApplicationImpl> test_app_;
   TestContext* context_;
   int num_loads_;
@@ -298,10 +293,7 @@
   StrongBinding<TestB> binding_;
 };
 
-class Tester : public ApplicationDelegate,
-               public ApplicationLoader,
-               public InterfaceFactory<TestA>,
-               public InterfaceFactory<TestB> {
+class Tester : public ApplicationDelegate, public ApplicationLoader {
  public:
   Tester(TesterContext* context, const std::string& requestor_url)
       : context_(context), requestor_url_(requestor_url) {}
@@ -323,27 +315,26 @@
       return false;
     }
     // If we're coming from A, then add B, otherwise A.
-    if (remote_url == kTestAURLString)
-      connection->AddService<TestB>(this);
-    else
-      connection->AddService<TestA>(this);
+    if (remote_url == kTestAURLString) {
+      connection->GetServiceProviderImpl().AddService<TestB>(
+          [this](const ConnectionContext& connection_context,
+                 InterfaceRequest<TestB> test_b_request) {
+            new TestBImpl(context_, test_b_request.Pass());
+          });
+    } else {
+      connection->GetServiceProviderImpl().AddService<TestA>(
+          [this](const ConnectionContext& connection_context,
+                 InterfaceRequest<TestA> test_a_request) {
+            mojo::InterfaceHandle<mojo::ServiceProvider> incoming_sp_handle;
+            app_->shell()->ConnectToApplication(
+                kTestBURLString, GetProxy(&incoming_sp_handle), nullptr);
+            a_bindings_.push_back(new TestAImpl(
+                incoming_sp_handle.Pass(), context_, test_a_request.Pass()));
+          });
+    }
     return true;
   }
 
-  void Create(const ConnectionContext& connection_context,
-              InterfaceRequest<TestA> request) override {
-    mojo::InterfaceHandle<mojo::ServiceProvider> incoming_sp_handle;
-    app_->shell()->ConnectToApplication(kTestBURLString,
-                                        GetProxy(&incoming_sp_handle), nullptr);
-    a_bindings_.push_back(
-        new TestAImpl(incoming_sp_handle.Pass(), context_, request.Pass()));
-  }
-
-  void Create(const ConnectionContext& connection_context,
-              InterfaceRequest<TestB> request) override {
-    new TestBImpl(context_, request.Pass());
-  }
-
   TesterContext* context_;
   scoped_ptr<ApplicationImpl> app_;
   std::string requestor_url_;
diff --git a/shell/test/pingable_app.cc b/shell/test/pingable_app.cc
index 2436a7d..f4520f6 100644
--- a/shell/test/pingable_app.cc
+++ b/shell/test/pingable_app.cc
@@ -8,7 +8,6 @@
 #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/interface_factory.h"
 #include "mojo/public/cpp/bindings/callback.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
@@ -39,8 +38,7 @@
   std::string connection_url_;
 };
 
-class PingableApp : public mojo::ApplicationDelegate,
-                    public mojo::InterfaceFactory<Pingable> {
+class PingableApp : public mojo::ApplicationDelegate {
  public:
   PingableApp() {}
   ~PingableApp() override {}
@@ -53,17 +51,15 @@
 
   bool ConfigureIncomingConnection(
       mojo::ApplicationConnection* connection) override {
-    connection->AddService(this);
+    connection->GetServiceProviderImpl().AddService<Pingable>(
+        [this](const mojo::ConnectionContext& connection_context,
+               mojo::InterfaceRequest<Pingable> pingable_request) {
+          new PingableImpl(pingable_request.Pass(), app_url_,
+                           connection_context.connection_url);
+        });
     return true;
   }
 
-  // InterfaceFactory<Pingable>:
-  void Create(const mojo::ConnectionContext& connection_context,
-              mojo::InterfaceRequest<Pingable> request) override {
-    new PingableImpl(request.Pass(), app_url_,
-                     connection_context.connection_url);
-  }
-
   std::string app_url_;
 };
 
diff --git a/ui/ozone/platform/drm/mojo/drm_ipc_init_helper.cc b/ui/ozone/platform/drm/mojo/drm_ipc_init_helper.cc
index ecbd1a9..5182396 100644
--- a/ui/ozone/platform/drm/mojo/drm_ipc_init_helper.cc
+++ b/ui/ozone/platform/drm/mojo/drm_ipc_init_helper.cc
@@ -14,24 +14,6 @@
 
 namespace ui {
 
-class InterfaceFactoryDrmHost
-    : public mojo::InterfaceFactory<mojo::OzoneDrmHost> {
-  // mojo::InterfaceFactory implementation.
-  void Create(const mojo::ConnectionContext& connection_context,
-              mojo::InterfaceRequest<mojo::OzoneDrmHost> request) override {
-    new MojoDrmHostImpl(request.Pass());
-  }
-};
-
-class InterfaceFactoryDrmGpu
-    : public mojo::InterfaceFactory<mojo::OzoneDrmGpu> {
-  // mojo::InterfaceFactory<OzoneDrmGpu> implementation.
-  void Create(const mojo::ConnectionContext& connection_context,
-              mojo::InterfaceRequest<mojo::OzoneDrmGpu> request) override {
-    new MojoDrmGpuImpl(request.Pass());
-  }
-};
-
 class DrmIpcInitHelperMojo : public IpcInitHelperMojo {
  public:
   DrmIpcInitHelperMojo();
@@ -68,13 +50,21 @@
 
 bool DrmIpcInitHelperMojo::HostConfigureIncomingConnection(
     mojo::ApplicationConnection* connection) {
-  connection->AddService<mojo::OzoneDrmHost>(new InterfaceFactoryDrmHost());
+  connection->GetServiceProviderImpl().AddService<mojo::OzoneDrmHost>(
+      [](const mojo::ConnectionContext& connection_context,
+         mojo::InterfaceRequest<mojo::OzoneDrmHost> request) {
+        new MojoDrmHostImpl(request.Pass());
+      });
   return true;
 }
 
 bool DrmIpcInitHelperMojo::GpuConfigureIncomingConnection(
     mojo::ApplicationConnection* connection) {
-  connection->AddService<mojo::OzoneDrmGpu>(new InterfaceFactoryDrmGpu());
+  connection->GetServiceProviderImpl().AddService<mojo::OzoneDrmGpu>(
+      [](const mojo::ConnectionContext& connection_context,
+         mojo::InterfaceRequest<mojo::OzoneDrmGpu> request) {
+        new MojoDrmGpuImpl(request.Pass());
+      });
   return true;
 }
 
