diff --git a/benchmarks/mojo_rtt_benchmark/lib/echo_server.dart b/benchmarks/mojo_rtt_benchmark/lib/echo_server.dart
index c242255..b905305 100644
--- a/benchmarks/mojo_rtt_benchmark/lib/echo_server.dart
+++ b/benchmarks/mojo_rtt_benchmark/lib/echo_server.dart
@@ -15,7 +15,7 @@
 
   EchoImpl(this._application, MojoMessagePipeEndpoint endpoint) {
     _stub = new EchoStub.fromEndpoint(endpoint, this);
-    _stub.onError = _errorHandler;
+    _stub.ctrl.onError = _errorHandler;
   }
 
   echoString(String value, [Function responseFactory]) =>
diff --git a/mojo/dart/apptests/test_apps/echo/lib/main.dart b/mojo/dart/apptests/test_apps/echo/lib/main.dart
index 76ad196..9f8cb8d 100644
--- a/mojo/dart/apptests/test_apps/echo/lib/main.dart
+++ b/mojo/dart/apptests/test_apps/echo/lib/main.dart
@@ -45,7 +45,7 @@
     // It is not allowed to do an unbind in the midst of handling an event, so
     // it is delayed until popping back out to the event loop.
     Timer.run(() {
-      final endpoint = stub.unbind();
+      final endpoint = stub.ctrl.unbind();
       new EchoServiceImpl(app, endpoint);
     });
   }
diff --git a/mojo/dart/apptests/test_apps/pingpong/lib/main.dart b/mojo/dart/apptests/test_apps/pingpong/lib/main.dart
index e450290..1787e15 100644
--- a/mojo/dart/apptests/test_apps/pingpong/lib/main.dart
+++ b/mojo/dart/apptests/test_apps/pingpong/lib/main.dart
@@ -102,7 +102,7 @@
 
   getPingPongServiceDelayed(PingPongServiceStub serviceStub) {
     Timer.run(() {
-      var endpoint = serviceStub.unbind();
+      var endpoint = serviceStub.ctrl.unbind();
       new Timer(const Duration(milliseconds: 10), () {
         var targetServiceProxy = new PingPongServiceProxy.unbound();
         _application.connectToService(
@@ -110,7 +110,7 @@
 
         // Pass along the interface request to another implementation of the
         // service.
-        serviceStub.bind(endpoint);
+        serviceStub.ctrl.bind(endpoint);
         targetServiceProxy.getPingPongService(serviceStub);
         targetServiceProxy.close();
       });
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/dart_to_cpp/dart_to_cpp.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/dart_to_cpp/dart_to_cpp.mojom.dart
index 43dae20..3fa894a 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/dart_to_cpp/dart_to_cpp.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/dart_to_cpp/dart_to_cpp.mojom.dart
@@ -893,9 +893,9 @@
   void echoResponse(EchoArgsList list);
 }
 
-
-class _CppSideProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _CppSideProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _CppSideProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -909,7 +909,6 @@
 
   String get serviceName => CppSide.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -926,9 +925,9 @@
   }
 }
 
-
-class CppSideProxy extends bindings.Proxy
-                              implements CppSide {
+class CppSideProxy
+    extends bindings.Proxy
+    implements CppSide {
   CppSideProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _CppSideProxyControl.fromEndpoint(endpoint));
@@ -992,29 +991,24 @@
   }
 }
 
-
-class CppSideStub extends bindings.Stub {
+class _CppSideStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<CppSide> {
   CppSide _impl;
 
-  CppSideStub.fromEndpoint(
+  _CppSideStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [CppSide impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CppSideStub.fromHandle(
+  _CppSideStubControl.fromHandle(
       core.MojoHandle handle, [CppSide impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CppSideStub.unbound([this._impl]) : super.unbound();
-
-  static CppSideStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CppSideStub"));
-    return new CppSideStub.fromEndpoint(endpoint);
-  }
+  _CppSideStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -1068,9 +1062,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "CppSideStub($superString)";
+    return "_CppSideStubControl($superString)";
   }
 
   int get version => 0;
@@ -1084,6 +1079,44 @@
   }
 }
 
+class CppSideStub
+    extends bindings.Stub<CppSide>
+    implements CppSide {
+  CppSideStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [CppSide impl])
+      : super(new _CppSideStubControl.fromEndpoint(endpoint, impl));
+
+  CppSideStub.fromHandle(
+      core.MojoHandle handle, [CppSide impl])
+      : super(new _CppSideStubControl.fromHandle(handle, impl));
+
+  CppSideStub.unbound([CppSide impl])
+      : super(new _CppSideStubControl.unbound(impl));
+
+  static CppSideStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CppSideStub"));
+    return new CppSideStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _CppSideStubControl.serviceDescription;
+
+
+  void startTest() {
+    return impl.startTest();
+  }
+  void testFinished() {
+    return impl.testFinished();
+  }
+  void pingResponse() {
+    return impl.pingResponse();
+  }
+  void echoResponse(EchoArgsList list) {
+    return impl.echoResponse(list);
+  }
+}
+
 const int _dartSideMethodSetClientName = 0;
 const int _dartSideMethodPingName = 1;
 const int _dartSideMethodEchoName = 2;
@@ -1106,9 +1139,9 @@
   void echo(int numIterations, EchoArgs arg);
 }
 
-
-class _DartSideProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _DartSideProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _DartSideProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1122,7 +1155,6 @@
 
   String get serviceName => DartSide.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1139,9 +1171,9 @@
   }
 }
 
-
-class DartSideProxy extends bindings.Proxy
-                              implements DartSide {
+class DartSideProxy
+    extends bindings.Proxy
+    implements DartSide {
   DartSideProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _DartSideProxyControl.fromEndpoint(endpoint));
@@ -1198,29 +1230,24 @@
   }
 }
 
-
-class DartSideStub extends bindings.Stub {
+class _DartSideStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<DartSide> {
   DartSide _impl;
 
-  DartSideStub.fromEndpoint(
+  _DartSideStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [DartSide impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  DartSideStub.fromHandle(
+  _DartSideStubControl.fromHandle(
       core.MojoHandle handle, [DartSide impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  DartSideStub.unbound([this._impl]) : super.unbound();
-
-  static DartSideStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For DartSideStub"));
-    return new DartSideStub.fromEndpoint(endpoint);
-  }
+  _DartSideStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -1273,9 +1300,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "DartSideStub($superString)";
+    return "_DartSideStubControl($superString)";
   }
 
   int get version => 0;
@@ -1289,6 +1317,41 @@
   }
 }
 
+class DartSideStub
+    extends bindings.Stub<DartSide>
+    implements DartSide {
+  DartSideStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [DartSide impl])
+      : super(new _DartSideStubControl.fromEndpoint(endpoint, impl));
+
+  DartSideStub.fromHandle(
+      core.MojoHandle handle, [DartSide impl])
+      : super(new _DartSideStubControl.fromHandle(handle, impl));
+
+  DartSideStub.unbound([DartSide impl])
+      : super(new _DartSideStubControl.unbound(impl));
+
+  static DartSideStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DartSideStub"));
+    return new DartSideStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _DartSideStubControl.serviceDescription;
+
+
+  void setClient(Object cppSide) {
+    return impl.setClient(cppSide);
+  }
+  void ping() {
+    return impl.ping();
+  }
+  void echo(int numIterations, EchoArgs arg) {
+    return impl.echo(numIterations, arg);
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/imported/sample_import.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/imported/sample_import.mojom.dart
index bd716d0..7429067 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/imported/sample_import.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/imported/sample_import.mojom.dart
@@ -360,9 +360,9 @@
   void doSomething();
 }
 
-
-class _ImportedInterfaceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ImportedInterfaceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ImportedInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -376,7 +376,6 @@
 
   String get serviceName => ImportedInterface.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -393,9 +392,9 @@
   }
 }
 
-
-class ImportedInterfaceProxy extends bindings.Proxy
-                              implements ImportedInterface {
+class ImportedInterfaceProxy
+    extends bindings.Proxy
+    implements ImportedInterface {
   ImportedInterfaceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ImportedInterfaceProxyControl.fromEndpoint(endpoint));
@@ -431,29 +430,24 @@
   }
 }
 
-
-class ImportedInterfaceStub extends bindings.Stub {
+class _ImportedInterfaceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ImportedInterface> {
   ImportedInterface _impl;
 
-  ImportedInterfaceStub.fromEndpoint(
+  _ImportedInterfaceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ImportedInterface impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ImportedInterfaceStub.fromHandle(
+  _ImportedInterfaceStubControl.fromHandle(
       core.MojoHandle handle, [ImportedInterface impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ImportedInterfaceStub.unbound([this._impl]) : super.unbound();
-
-  static ImportedInterfaceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ImportedInterfaceStub"));
-    return new ImportedInterfaceStub.fromEndpoint(endpoint);
-  }
+  _ImportedInterfaceStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -496,9 +490,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ImportedInterfaceStub($superString)";
+    return "_ImportedInterfaceStubControl($superString)";
   }
 
   int get version => 0;
@@ -512,6 +507,35 @@
   }
 }
 
+class ImportedInterfaceStub
+    extends bindings.Stub<ImportedInterface>
+    implements ImportedInterface {
+  ImportedInterfaceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ImportedInterface impl])
+      : super(new _ImportedInterfaceStubControl.fromEndpoint(endpoint, impl));
+
+  ImportedInterfaceStub.fromHandle(
+      core.MojoHandle handle, [ImportedInterface impl])
+      : super(new _ImportedInterfaceStubControl.fromHandle(handle, impl));
+
+  ImportedInterfaceStub.unbound([ImportedInterface impl])
+      : super(new _ImportedInterfaceStubControl.unbound(impl));
+
+  static ImportedInterfaceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ImportedInterfaceStub"));
+    return new ImportedInterfaceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ImportedInterfaceStubControl.serviceDescription;
+
+
+  void doSomething() {
+    return impl.doSomething();
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/math/math_calculator.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/math/math_calculator.mojom.dart
index 5e3f3cd..dca6540 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/math/math_calculator.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/math/math_calculator.mojom.dart
@@ -454,9 +454,9 @@
   dynamic multiply(double value,[Function responseFactory = null]);
 }
 
-
-class _CalculatorProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _CalculatorProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _CalculatorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -470,7 +470,6 @@
 
   String get serviceName => Calculator.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _calculatorMethodClearName:
@@ -547,9 +546,9 @@
   }
 }
 
-
-class CalculatorProxy extends bindings.Proxy
-                              implements Calculator {
+class CalculatorProxy
+    extends bindings.Proxy
+    implements Calculator {
   CalculatorProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _CalculatorProxyControl.fromEndpoint(endpoint));
@@ -602,29 +601,24 @@
   }
 }
 
-
-class CalculatorStub extends bindings.Stub {
+class _CalculatorStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Calculator> {
   Calculator _impl;
 
-  CalculatorStub.fromEndpoint(
+  _CalculatorStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Calculator impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CalculatorStub.fromHandle(
+  _CalculatorStubControl.fromHandle(
       core.MojoHandle handle, [Calculator impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CalculatorStub.unbound([this._impl]) : super.unbound();
-
-  static CalculatorStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CalculatorStub"));
-    return new CalculatorStub.fromEndpoint(endpoint);
-  }
+  _CalculatorStubControl.unbound([this._impl]) : super.unbound();
 
 
   CalculatorClearResponseParams _calculatorClearResponseParamsFactory(double value) {
@@ -743,9 +737,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "CalculatorStub($superString)";
+    return "_CalculatorStubControl($superString)";
   }
 
   int get version => 0;
@@ -759,6 +754,41 @@
   }
 }
 
+class CalculatorStub
+    extends bindings.Stub<Calculator>
+    implements Calculator {
+  CalculatorStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Calculator impl])
+      : super(new _CalculatorStubControl.fromEndpoint(endpoint, impl));
+
+  CalculatorStub.fromHandle(
+      core.MojoHandle handle, [Calculator impl])
+      : super(new _CalculatorStubControl.fromHandle(handle, impl));
+
+  CalculatorStub.unbound([Calculator impl])
+      : super(new _CalculatorStubControl.unbound(impl));
+
+  static CalculatorStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CalculatorStub"));
+    return new CalculatorStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _CalculatorStubControl.serviceDescription;
+
+
+  dynamic clear([Function responseFactory = null]) {
+    return impl.clear(responseFactory);
+  }
+  dynamic add(double value,[Function responseFactory = null]) {
+    return impl.add(value,responseFactory);
+  }
+  dynamic multiply(double value,[Function responseFactory = null]) {
+    return impl.multiply(value,responseFactory);
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/examples/echo.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/examples/echo.mojom.dart
index 8c57cab..eafa459 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/examples/echo.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/examples/echo.mojom.dart
@@ -179,9 +179,9 @@
   dynamic echoString(String value,[Function responseFactory = null]);
 }
 
-
-class _EchoProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _EchoProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _EchoProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -195,7 +195,6 @@
 
   String get serviceName => Echo.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _echoMethodEchoStringName:
@@ -232,9 +231,9 @@
   }
 }
 
-
-class EchoProxy extends bindings.Proxy
-                              implements Echo {
+class EchoProxy
+    extends bindings.Proxy
+    implements Echo {
   EchoProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _EchoProxyControl.fromEndpoint(endpoint));
@@ -270,29 +269,24 @@
   }
 }
 
-
-class EchoStub extends bindings.Stub {
+class _EchoStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Echo> {
   Echo _impl;
 
-  EchoStub.fromEndpoint(
+  _EchoStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Echo impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  EchoStub.fromHandle(
+  _EchoStubControl.fromHandle(
       core.MojoHandle handle, [Echo impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  EchoStub.unbound([this._impl]) : super.unbound();
-
-  static EchoStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For EchoStub"));
-    return new EchoStub.fromEndpoint(endpoint);
-  }
+  _EchoStubControl.unbound([this._impl]) : super.unbound();
 
 
   EchoEchoStringResponseParams _echoEchoStringResponseParamsFactory(String value) {
@@ -359,9 +353,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "EchoStub($superString)";
+    return "_EchoStubControl($superString)";
   }
 
   int get version => 0;
@@ -375,6 +370,35 @@
   }
 }
 
+class EchoStub
+    extends bindings.Stub<Echo>
+    implements Echo {
+  EchoStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Echo impl])
+      : super(new _EchoStubControl.fromEndpoint(endpoint, impl));
+
+  EchoStub.fromHandle(
+      core.MojoHandle handle, [Echo impl])
+      : super(new _EchoStubControl.fromHandle(handle, impl));
+
+  EchoStub.unbound([Echo impl])
+      : super(new _EchoStubControl.unbound(impl));
+
+  static EchoStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For EchoStub"));
+    return new EchoStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _EchoStubControl.serviceDescription;
+
+
+  dynamic echoString(String value,[Function responseFactory = null]) {
+    return impl.echoString(value,responseFactory);
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_structs.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_structs.mojom.dart
index e278849..72b3d85 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_structs.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_structs.mojom.dart
@@ -6007,9 +6007,9 @@
   dynamic someMethod(RectPair pair,[Function responseFactory = null]);
 }
 
-
-class _SomeInterfaceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SomeInterfaceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SomeInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -6023,7 +6023,6 @@
 
   String get serviceName => SomeInterface.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _someInterfaceMethodSomeMethodName:
@@ -6060,9 +6059,9 @@
   }
 }
 
-
-class SomeInterfaceProxy extends bindings.Proxy
-                              implements SomeInterface {
+class SomeInterfaceProxy
+    extends bindings.Proxy
+    implements SomeInterface {
   SomeInterfaceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SomeInterfaceProxyControl.fromEndpoint(endpoint));
@@ -6098,29 +6097,24 @@
   }
 }
 
-
-class SomeInterfaceStub extends bindings.Stub {
+class _SomeInterfaceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<SomeInterface> {
   SomeInterface _impl;
 
-  SomeInterfaceStub.fromEndpoint(
+  _SomeInterfaceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [SomeInterface impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SomeInterfaceStub.fromHandle(
+  _SomeInterfaceStubControl.fromHandle(
       core.MojoHandle handle, [SomeInterface impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SomeInterfaceStub.unbound([this._impl]) : super.unbound();
-
-  static SomeInterfaceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SomeInterfaceStub"));
-    return new SomeInterfaceStub.fromEndpoint(endpoint);
-  }
+  _SomeInterfaceStubControl.unbound([this._impl]) : super.unbound();
 
 
   SomeInterfaceSomeMethodResponseParams _someInterfaceSomeMethodResponseParamsFactory(RectPair otherPair) {
@@ -6187,9 +6181,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SomeInterfaceStub($superString)";
+    return "_SomeInterfaceStubControl($superString)";
   }
 
   int get version => 0;
@@ -6203,6 +6198,35 @@
   }
 }
 
+class SomeInterfaceStub
+    extends bindings.Stub<SomeInterface>
+    implements SomeInterface {
+  SomeInterfaceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [SomeInterface impl])
+      : super(new _SomeInterfaceStubControl.fromEndpoint(endpoint, impl));
+
+  SomeInterfaceStub.fromHandle(
+      core.MojoHandle handle, [SomeInterface impl])
+      : super(new _SomeInterfaceStubControl.fromHandle(handle, impl));
+
+  SomeInterfaceStub.unbound([SomeInterface impl])
+      : super(new _SomeInterfaceStubControl.unbound(impl));
+
+  static SomeInterfaceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SomeInterfaceStub"));
+    return new SomeInterfaceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SomeInterfaceStubControl.serviceDescription;
+
+
+  dynamic someMethod(RectPair pair,[Function responseFactory = null]) {
+    return impl.someMethod(pair,responseFactory);
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_unions.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_unions.mojom.dart
index 46bf438..338f1d9 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_unions.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/test_unions.mojom.dart
@@ -2971,9 +2971,9 @@
   dynamic getIntValue([Function responseFactory = null]);
 }
 
-
-class _SmallCacheProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SmallCacheProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SmallCacheProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -2987,7 +2987,6 @@
 
   String get serviceName => SmallCache.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _smallCacheMethodGetIntValueName:
@@ -3024,9 +3023,9 @@
   }
 }
 
-
-class SmallCacheProxy extends bindings.Proxy
-                              implements SmallCache {
+class SmallCacheProxy
+    extends bindings.Proxy
+    implements SmallCache {
   SmallCacheProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SmallCacheProxyControl.fromEndpoint(endpoint));
@@ -3071,29 +3070,24 @@
   }
 }
 
-
-class SmallCacheStub extends bindings.Stub {
+class _SmallCacheStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<SmallCache> {
   SmallCache _impl;
 
-  SmallCacheStub.fromEndpoint(
+  _SmallCacheStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [SmallCache impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SmallCacheStub.fromHandle(
+  _SmallCacheStubControl.fromHandle(
       core.MojoHandle handle, [SmallCache impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SmallCacheStub.unbound([this._impl]) : super.unbound();
-
-  static SmallCacheStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SmallCacheStub"));
-    return new SmallCacheStub.fromEndpoint(endpoint);
-  }
+  _SmallCacheStubControl.unbound([this._impl]) : super.unbound();
 
 
   SmallCacheGetIntValueResponseParams _smallCacheGetIntValueResponseParamsFactory(int intValue) {
@@ -3163,9 +3157,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SmallCacheStub($superString)";
+    return "_SmallCacheStubControl($superString)";
   }
 
   int get version => 0;
@@ -3179,6 +3174,38 @@
   }
 }
 
+class SmallCacheStub
+    extends bindings.Stub<SmallCache>
+    implements SmallCache {
+  SmallCacheStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [SmallCache impl])
+      : super(new _SmallCacheStubControl.fromEndpoint(endpoint, impl));
+
+  SmallCacheStub.fromHandle(
+      core.MojoHandle handle, [SmallCache impl])
+      : super(new _SmallCacheStubControl.fromHandle(handle, impl));
+
+  SmallCacheStub.unbound([SmallCache impl])
+      : super(new _SmallCacheStubControl.unbound(impl));
+
+  static SmallCacheStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SmallCacheStub"));
+    return new SmallCacheStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SmallCacheStubControl.serviceDescription;
+
+
+  void setIntValue(int intValue) {
+    return impl.setIntValue(intValue);
+  }
+  dynamic getIntValue([Function responseFactory = null]) {
+    return impl.getIntValue(responseFactory);
+  }
+}
+
 const int _unionInterfaceMethodEchoName = 0;
 
 class _UnionInterfaceServiceDescription implements service_describer.ServiceDescription {
@@ -3197,9 +3224,9 @@
   dynamic echo(PodUnion inVal,[Function responseFactory = null]);
 }
 
-
-class _UnionInterfaceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _UnionInterfaceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _UnionInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -3213,7 +3240,6 @@
 
   String get serviceName => UnionInterface.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _unionInterfaceMethodEchoName:
@@ -3250,9 +3276,9 @@
   }
 }
 
-
-class UnionInterfaceProxy extends bindings.Proxy
-                              implements UnionInterface {
+class UnionInterfaceProxy
+    extends bindings.Proxy
+    implements UnionInterface {
   UnionInterfaceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _UnionInterfaceProxyControl.fromEndpoint(endpoint));
@@ -3288,29 +3314,24 @@
   }
 }
 
-
-class UnionInterfaceStub extends bindings.Stub {
+class _UnionInterfaceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<UnionInterface> {
   UnionInterface _impl;
 
-  UnionInterfaceStub.fromEndpoint(
+  _UnionInterfaceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [UnionInterface impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UnionInterfaceStub.fromHandle(
+  _UnionInterfaceStubControl.fromHandle(
       core.MojoHandle handle, [UnionInterface impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UnionInterfaceStub.unbound([this._impl]) : super.unbound();
-
-  static UnionInterfaceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UnionInterfaceStub"));
-    return new UnionInterfaceStub.fromEndpoint(endpoint);
-  }
+  _UnionInterfaceStubControl.unbound([this._impl]) : super.unbound();
 
 
   UnionInterfaceEchoResponseParams _unionInterfaceEchoResponseParamsFactory(PodUnion outVal) {
@@ -3377,9 +3398,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "UnionInterfaceStub($superString)";
+    return "_UnionInterfaceStubControl($superString)";
   }
 
   int get version => 0;
@@ -3393,6 +3415,35 @@
   }
 }
 
+class UnionInterfaceStub
+    extends bindings.Stub<UnionInterface>
+    implements UnionInterface {
+  UnionInterfaceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [UnionInterface impl])
+      : super(new _UnionInterfaceStubControl.fromEndpoint(endpoint, impl));
+
+  UnionInterfaceStub.fromHandle(
+      core.MojoHandle handle, [UnionInterface impl])
+      : super(new _UnionInterfaceStubControl.fromHandle(handle, impl));
+
+  UnionInterfaceStub.unbound([UnionInterface impl])
+      : super(new _UnionInterfaceStubControl.unbound(impl));
+
+  static UnionInterfaceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UnionInterfaceStub"));
+    return new UnionInterfaceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _UnionInterfaceStubControl.serviceDescription;
+
+
+  dynamic echo(PodUnion inVal,[Function responseFactory = null]) {
+    return impl.echo(inVal,responseFactory);
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/validation_test_interfaces.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/validation_test_interfaces.mojom.dart
index c3d72e9..0c60d12 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/validation_test_interfaces.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/validation_test_interfaces.mojom.dart
@@ -3368,9 +3368,9 @@
   static const String serviceName = null;
 }
 
-
-class _InterfaceAProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _InterfaceAProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _InterfaceAProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -3384,7 +3384,6 @@
 
   String get serviceName => InterfaceA.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -3401,9 +3400,9 @@
   }
 }
 
-
-class InterfaceAProxy extends bindings.Proxy
-                              implements InterfaceA {
+class InterfaceAProxy
+    extends bindings.Proxy
+    implements InterfaceA {
   InterfaceAProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _InterfaceAProxyControl.fromEndpoint(endpoint));
@@ -3430,29 +3429,24 @@
 
 }
 
-
-class InterfaceAStub extends bindings.Stub {
+class _InterfaceAStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<InterfaceA> {
   InterfaceA _impl;
 
-  InterfaceAStub.fromEndpoint(
+  _InterfaceAStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [InterfaceA impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InterfaceAStub.fromHandle(
+  _InterfaceAStubControl.fromHandle(
       core.MojoHandle handle, [InterfaceA impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InterfaceAStub.unbound([this._impl]) : super.unbound();
-
-  static InterfaceAStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InterfaceAStub"));
-    return new InterfaceAStub.fromEndpoint(endpoint);
-  }
+  _InterfaceAStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -3492,9 +3486,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "InterfaceAStub($superString)";
+    return "_InterfaceAStubControl($superString)";
   }
 
   int get version => 0;
@@ -3508,6 +3503,32 @@
   }
 }
 
+class InterfaceAStub
+    extends bindings.Stub<InterfaceA>
+    implements InterfaceA {
+  InterfaceAStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [InterfaceA impl])
+      : super(new _InterfaceAStubControl.fromEndpoint(endpoint, impl));
+
+  InterfaceAStub.fromHandle(
+      core.MojoHandle handle, [InterfaceA impl])
+      : super(new _InterfaceAStubControl.fromHandle(handle, impl));
+
+  InterfaceAStub.unbound([InterfaceA impl])
+      : super(new _InterfaceAStubControl.unbound(impl));
+
+  static InterfaceAStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InterfaceAStub"));
+    return new InterfaceAStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _InterfaceAStubControl.serviceDescription;
+
+
+}
+
 const int _boundsCheckTestInterfaceMethodMethod0Name = 0;
 const int _boundsCheckTestInterfaceMethodMethod1Name = 1;
 
@@ -3531,9 +3552,9 @@
   void method1(int param0);
 }
 
-
-class _BoundsCheckTestInterfaceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _BoundsCheckTestInterfaceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _BoundsCheckTestInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -3547,7 +3568,6 @@
 
   String get serviceName => BoundsCheckTestInterface.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _boundsCheckTestInterfaceMethodMethod0Name:
@@ -3584,9 +3604,9 @@
   }
 }
 
-
-class BoundsCheckTestInterfaceProxy extends bindings.Proxy
-                              implements BoundsCheckTestInterface {
+class BoundsCheckTestInterfaceProxy
+    extends bindings.Proxy
+    implements BoundsCheckTestInterface {
   BoundsCheckTestInterfaceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _BoundsCheckTestInterfaceProxyControl.fromEndpoint(endpoint));
@@ -3632,29 +3652,24 @@
   }
 }
 
-
-class BoundsCheckTestInterfaceStub extends bindings.Stub {
+class _BoundsCheckTestInterfaceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<BoundsCheckTestInterface> {
   BoundsCheckTestInterface _impl;
 
-  BoundsCheckTestInterfaceStub.fromEndpoint(
+  _BoundsCheckTestInterfaceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [BoundsCheckTestInterface impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  BoundsCheckTestInterfaceStub.fromHandle(
+  _BoundsCheckTestInterfaceStubControl.fromHandle(
       core.MojoHandle handle, [BoundsCheckTestInterface impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  BoundsCheckTestInterfaceStub.unbound([this._impl]) : super.unbound();
-
-  static BoundsCheckTestInterfaceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For BoundsCheckTestInterfaceStub"));
-    return new BoundsCheckTestInterfaceStub.fromEndpoint(endpoint);
-  }
+  _BoundsCheckTestInterfaceStubControl.unbound([this._impl]) : super.unbound();
 
 
   BoundsCheckTestInterfaceMethod0ResponseParams _boundsCheckTestInterfaceMethod0ResponseParamsFactory(int param0) {
@@ -3726,9 +3741,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "BoundsCheckTestInterfaceStub($superString)";
+    return "_BoundsCheckTestInterfaceStubControl($superString)";
   }
 
   int get version => 0;
@@ -3742,6 +3758,38 @@
   }
 }
 
+class BoundsCheckTestInterfaceStub
+    extends bindings.Stub<BoundsCheckTestInterface>
+    implements BoundsCheckTestInterface {
+  BoundsCheckTestInterfaceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [BoundsCheckTestInterface impl])
+      : super(new _BoundsCheckTestInterfaceStubControl.fromEndpoint(endpoint, impl));
+
+  BoundsCheckTestInterfaceStub.fromHandle(
+      core.MojoHandle handle, [BoundsCheckTestInterface impl])
+      : super(new _BoundsCheckTestInterfaceStubControl.fromHandle(handle, impl));
+
+  BoundsCheckTestInterfaceStub.unbound([BoundsCheckTestInterface impl])
+      : super(new _BoundsCheckTestInterfaceStubControl.unbound(impl));
+
+  static BoundsCheckTestInterfaceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For BoundsCheckTestInterfaceStub"));
+    return new BoundsCheckTestInterfaceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _BoundsCheckTestInterfaceStubControl.serviceDescription;
+
+
+  dynamic method0(int param0,[Function responseFactory = null]) {
+    return impl.method0(param0,responseFactory);
+  }
+  void method1(int param0) {
+    return impl.method1(param0);
+  }
+}
+
 const int _conformanceTestInterfaceMethodMethod0Name = 0;
 const int _conformanceTestInterfaceMethodMethod1Name = 1;
 const int _conformanceTestInterfaceMethodMethod2Name = 2;
@@ -3790,9 +3838,9 @@
   void method15(StructH param0);
 }
 
-
-class _ConformanceTestInterfaceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ConformanceTestInterfaceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ConformanceTestInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -3806,7 +3854,6 @@
 
   String get serviceName => ConformanceTestInterface.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _conformanceTestInterfaceMethodMethod12Name:
@@ -3843,9 +3890,9 @@
   }
 }
 
-
-class ConformanceTestInterfaceProxy extends bindings.Proxy
-                              implements ConformanceTestInterface {
+class ConformanceTestInterfaceProxy
+    extends bindings.Proxy
+    implements ConformanceTestInterface {
   ConformanceTestInterfaceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ConformanceTestInterfaceProxyControl.fromEndpoint(endpoint));
@@ -4037,29 +4084,24 @@
   }
 }
 
-
-class ConformanceTestInterfaceStub extends bindings.Stub {
+class _ConformanceTestInterfaceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ConformanceTestInterface> {
   ConformanceTestInterface _impl;
 
-  ConformanceTestInterfaceStub.fromEndpoint(
+  _ConformanceTestInterfaceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ConformanceTestInterface impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ConformanceTestInterfaceStub.fromHandle(
+  _ConformanceTestInterfaceStubControl.fromHandle(
       core.MojoHandle handle, [ConformanceTestInterface impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ConformanceTestInterfaceStub.unbound([this._impl]) : super.unbound();
-
-  static ConformanceTestInterfaceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ConformanceTestInterfaceStub"));
-    return new ConformanceTestInterfaceStub.fromEndpoint(endpoint);
-  }
+  _ConformanceTestInterfaceStubControl.unbound([this._impl]) : super.unbound();
 
 
   ConformanceTestInterfaceMethod12ResponseParams _conformanceTestInterfaceMethod12ResponseParamsFactory(double param0) {
@@ -4201,9 +4243,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ConformanceTestInterfaceStub($superString)";
+    return "_ConformanceTestInterfaceStubControl($superString)";
   }
 
   int get version => 0;
@@ -4217,6 +4260,80 @@
   }
 }
 
+class ConformanceTestInterfaceStub
+    extends bindings.Stub<ConformanceTestInterface>
+    implements ConformanceTestInterface {
+  ConformanceTestInterfaceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ConformanceTestInterface impl])
+      : super(new _ConformanceTestInterfaceStubControl.fromEndpoint(endpoint, impl));
+
+  ConformanceTestInterfaceStub.fromHandle(
+      core.MojoHandle handle, [ConformanceTestInterface impl])
+      : super(new _ConformanceTestInterfaceStubControl.fromHandle(handle, impl));
+
+  ConformanceTestInterfaceStub.unbound([ConformanceTestInterface impl])
+      : super(new _ConformanceTestInterfaceStubControl.unbound(impl));
+
+  static ConformanceTestInterfaceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ConformanceTestInterfaceStub"));
+    return new ConformanceTestInterfaceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ConformanceTestInterfaceStubControl.serviceDescription;
+
+
+  void method0(double param0) {
+    return impl.method0(param0);
+  }
+  void method1(StructA param0) {
+    return impl.method1(param0);
+  }
+  void method2(StructB param0, StructA param1) {
+    return impl.method2(param0, param1);
+  }
+  void method3(List<bool> param0) {
+    return impl.method3(param0);
+  }
+  void method4(StructC param0, List<int> param1) {
+    return impl.method4(param0, param1);
+  }
+  void method5(StructE param0, core.MojoDataPipeProducer param1) {
+    return impl.method5(param0, param1);
+  }
+  void method6(List<List<int>> param0) {
+    return impl.method6(param0);
+  }
+  void method7(StructF param0, List<List<int>> param1) {
+    return impl.method7(param0, param1);
+  }
+  void method8(List<List<String>> param0) {
+    return impl.method8(param0);
+  }
+  void method9(List<List<core.MojoHandle>> param0) {
+    return impl.method9(param0);
+  }
+  void method10(Map<String, int> param0) {
+    return impl.method10(param0);
+  }
+  void method11(StructG param0) {
+    return impl.method11(param0);
+  }
+  dynamic method12(double param0,[Function responseFactory = null]) {
+    return impl.method12(param0,responseFactory);
+  }
+  void method13(Object param0, int param1, Object param2) {
+    return impl.method13(param0, param1, param2);
+  }
+  void method14(UnionA param0) {
+    return impl.method14(param0);
+  }
+  void method15(StructH param0) {
+    return impl.method15(param0);
+  }
+}
+
 const int _integrationTestInterfaceMethodMethod0Name = 0;
 
 class _IntegrationTestInterfaceServiceDescription implements service_describer.ServiceDescription {
@@ -4235,9 +4352,9 @@
   dynamic method0(BasicStruct param0,[Function responseFactory = null]);
 }
 
-
-class _IntegrationTestInterfaceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _IntegrationTestInterfaceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _IntegrationTestInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -4251,7 +4368,6 @@
 
   String get serviceName => IntegrationTestInterface.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _integrationTestInterfaceMethodMethod0Name:
@@ -4288,9 +4404,9 @@
   }
 }
 
-
-class IntegrationTestInterfaceProxy extends bindings.Proxy
-                              implements IntegrationTestInterface {
+class IntegrationTestInterfaceProxy
+    extends bindings.Proxy
+    implements IntegrationTestInterface {
   IntegrationTestInterfaceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _IntegrationTestInterfaceProxyControl.fromEndpoint(endpoint));
@@ -4326,29 +4442,24 @@
   }
 }
 
-
-class IntegrationTestInterfaceStub extends bindings.Stub {
+class _IntegrationTestInterfaceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<IntegrationTestInterface> {
   IntegrationTestInterface _impl;
 
-  IntegrationTestInterfaceStub.fromEndpoint(
+  _IntegrationTestInterfaceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [IntegrationTestInterface impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  IntegrationTestInterfaceStub.fromHandle(
+  _IntegrationTestInterfaceStubControl.fromHandle(
       core.MojoHandle handle, [IntegrationTestInterface impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  IntegrationTestInterfaceStub.unbound([this._impl]) : super.unbound();
-
-  static IntegrationTestInterfaceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For IntegrationTestInterfaceStub"));
-    return new IntegrationTestInterfaceStub.fromEndpoint(endpoint);
-  }
+  _IntegrationTestInterfaceStubControl.unbound([this._impl]) : super.unbound();
 
 
   IntegrationTestInterfaceMethod0ResponseParams _integrationTestInterfaceMethod0ResponseParamsFactory(List<int> param0) {
@@ -4415,9 +4526,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "IntegrationTestInterfaceStub($superString)";
+    return "_IntegrationTestInterfaceStubControl($superString)";
   }
 
   int get version => 0;
@@ -4431,6 +4543,35 @@
   }
 }
 
+class IntegrationTestInterfaceStub
+    extends bindings.Stub<IntegrationTestInterface>
+    implements IntegrationTestInterface {
+  IntegrationTestInterfaceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [IntegrationTestInterface impl])
+      : super(new _IntegrationTestInterfaceStubControl.fromEndpoint(endpoint, impl));
+
+  IntegrationTestInterfaceStub.fromHandle(
+      core.MojoHandle handle, [IntegrationTestInterface impl])
+      : super(new _IntegrationTestInterfaceStubControl.fromHandle(handle, impl));
+
+  IntegrationTestInterfaceStub.unbound([IntegrationTestInterface impl])
+      : super(new _IntegrationTestInterfaceStubControl.unbound(impl));
+
+  static IntegrationTestInterfaceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For IntegrationTestInterfaceStub"));
+    return new IntegrationTestInterfaceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _IntegrationTestInterfaceStubControl.serviceDescription;
+
+
+  dynamic method0(BasicStruct param0,[Function responseFactory = null]) {
+    return impl.method0(param0,responseFactory);
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/versioning/versioning_test_client.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/versioning/versioning_test_client.mojom.dart
index e88afa0..302ece5 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/versioning/versioning_test_client.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/mojo/test/versioning/versioning_test_client.mojom.dart
@@ -805,9 +805,9 @@
   dynamic listEmployeeIds([Function responseFactory = null]);
 }
 
-
-class _HumanResourceDatabaseProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _HumanResourceDatabaseProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _HumanResourceDatabaseProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -821,7 +821,6 @@
 
   String get serviceName => HumanResourceDatabase.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _humanResourceDatabaseMethodAddEmployeeName:
@@ -918,9 +917,9 @@
   }
 }
 
-
-class HumanResourceDatabaseProxy extends bindings.Proxy
-                              implements HumanResourceDatabase {
+class HumanResourceDatabaseProxy
+    extends bindings.Proxy
+    implements HumanResourceDatabase {
   HumanResourceDatabaseProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _HumanResourceDatabaseProxyControl.fromEndpoint(endpoint));
@@ -984,29 +983,24 @@
   }
 }
 
-
-class HumanResourceDatabaseStub extends bindings.Stub {
+class _HumanResourceDatabaseStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<HumanResourceDatabase> {
   HumanResourceDatabase _impl;
 
-  HumanResourceDatabaseStub.fromEndpoint(
+  _HumanResourceDatabaseStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [HumanResourceDatabase impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HumanResourceDatabaseStub.fromHandle(
+  _HumanResourceDatabaseStubControl.fromHandle(
       core.MojoHandle handle, [HumanResourceDatabase impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HumanResourceDatabaseStub.unbound([this._impl]) : super.unbound();
-
-  static HumanResourceDatabaseStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HumanResourceDatabaseStub"));
-    return new HumanResourceDatabaseStub.fromEndpoint(endpoint);
-  }
+  _HumanResourceDatabaseStubControl.unbound([this._impl]) : super.unbound();
 
 
   HumanResourceDatabaseAddEmployeeResponseParams _humanResourceDatabaseAddEmployeeResponseParamsFactory(bool success) {
@@ -1153,9 +1147,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "HumanResourceDatabaseStub($superString)";
+    return "_HumanResourceDatabaseStubControl($superString)";
   }
 
   int get version => 2;
@@ -1169,6 +1164,44 @@
   }
 }
 
+class HumanResourceDatabaseStub
+    extends bindings.Stub<HumanResourceDatabase>
+    implements HumanResourceDatabase {
+  HumanResourceDatabaseStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [HumanResourceDatabase impl])
+      : super(new _HumanResourceDatabaseStubControl.fromEndpoint(endpoint, impl));
+
+  HumanResourceDatabaseStub.fromHandle(
+      core.MojoHandle handle, [HumanResourceDatabase impl])
+      : super(new _HumanResourceDatabaseStubControl.fromHandle(handle, impl));
+
+  HumanResourceDatabaseStub.unbound([HumanResourceDatabase impl])
+      : super(new _HumanResourceDatabaseStubControl.unbound(impl));
+
+  static HumanResourceDatabaseStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HumanResourceDatabaseStub"));
+    return new HumanResourceDatabaseStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _HumanResourceDatabaseStubControl.serviceDescription;
+
+
+  dynamic addEmployee(Employee employee,[Function responseFactory = null]) {
+    return impl.addEmployee(employee,responseFactory);
+  }
+  dynamic queryEmployee(int id,bool retrieveFingerPrint,[Function responseFactory = null]) {
+    return impl.queryEmployee(id,retrieveFingerPrint,responseFactory);
+  }
+  dynamic attachFingerPrint(int id,List<int> fingerPrint,[Function responseFactory = null]) {
+    return impl.attachFingerPrint(id,fingerPrint,responseFactory);
+  }
+  dynamic listEmployeeIds([Function responseFactory = null]) {
+    return impl.listEmployeeIds(responseFactory);
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/regression_tests/regression_tests.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/regression_tests/regression_tests.mojom.dart
index 505f69e..7098e20 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/regression_tests/regression_tests.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/regression_tests/regression_tests.mojom.dart
@@ -1942,9 +1942,9 @@
   dynamic withParameterAndEmptyResponse(bool b,[Function responseFactory = null]);
 }
 
-
-class _CheckMethodWithEmptyResponseProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _CheckMethodWithEmptyResponseProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _CheckMethodWithEmptyResponseProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1958,7 +1958,6 @@
 
   String get serviceName => CheckMethodWithEmptyResponse.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _checkMethodWithEmptyResponseMethodWithoutParameterAndEmptyResponseName:
@@ -2015,9 +2014,9 @@
   }
 }
 
-
-class CheckMethodWithEmptyResponseProxy extends bindings.Proxy
-                              implements CheckMethodWithEmptyResponse {
+class CheckMethodWithEmptyResponseProxy
+    extends bindings.Proxy
+    implements CheckMethodWithEmptyResponse {
   CheckMethodWithEmptyResponseProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _CheckMethodWithEmptyResponseProxyControl.fromEndpoint(endpoint));
@@ -2061,29 +2060,24 @@
   }
 }
 
-
-class CheckMethodWithEmptyResponseStub extends bindings.Stub {
+class _CheckMethodWithEmptyResponseStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<CheckMethodWithEmptyResponse> {
   CheckMethodWithEmptyResponse _impl;
 
-  CheckMethodWithEmptyResponseStub.fromEndpoint(
+  _CheckMethodWithEmptyResponseStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [CheckMethodWithEmptyResponse impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CheckMethodWithEmptyResponseStub.fromHandle(
+  _CheckMethodWithEmptyResponseStubControl.fromHandle(
       core.MojoHandle handle, [CheckMethodWithEmptyResponse impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CheckMethodWithEmptyResponseStub.unbound([this._impl]) : super.unbound();
-
-  static CheckMethodWithEmptyResponseStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CheckMethodWithEmptyResponseStub"));
-    return new CheckMethodWithEmptyResponseStub.fromEndpoint(endpoint);
-  }
+  _CheckMethodWithEmptyResponseStubControl.unbound([this._impl]) : super.unbound();
 
 
   CheckMethodWithEmptyResponseWithoutParameterAndEmptyResponseResponseParams _checkMethodWithEmptyResponseWithoutParameterAndEmptyResponseResponseParamsFactory() {
@@ -2173,9 +2167,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "CheckMethodWithEmptyResponseStub($superString)";
+    return "_CheckMethodWithEmptyResponseStubControl($superString)";
   }
 
   int get version => 0;
@@ -2189,6 +2184,38 @@
   }
 }
 
+class CheckMethodWithEmptyResponseStub
+    extends bindings.Stub<CheckMethodWithEmptyResponse>
+    implements CheckMethodWithEmptyResponse {
+  CheckMethodWithEmptyResponseStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [CheckMethodWithEmptyResponse impl])
+      : super(new _CheckMethodWithEmptyResponseStubControl.fromEndpoint(endpoint, impl));
+
+  CheckMethodWithEmptyResponseStub.fromHandle(
+      core.MojoHandle handle, [CheckMethodWithEmptyResponse impl])
+      : super(new _CheckMethodWithEmptyResponseStubControl.fromHandle(handle, impl));
+
+  CheckMethodWithEmptyResponseStub.unbound([CheckMethodWithEmptyResponse impl])
+      : super(new _CheckMethodWithEmptyResponseStubControl.unbound(impl));
+
+  static CheckMethodWithEmptyResponseStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CheckMethodWithEmptyResponseStub"));
+    return new CheckMethodWithEmptyResponseStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _CheckMethodWithEmptyResponseStubControl.serviceDescription;
+
+
+  dynamic withoutParameterAndEmptyResponse([Function responseFactory = null]) {
+    return impl.withoutParameterAndEmptyResponse(responseFactory);
+  }
+  dynamic withParameterAndEmptyResponse(bool b,[Function responseFactory = null]) {
+    return impl.withParameterAndEmptyResponse(b,responseFactory);
+  }
+}
+
 const int _checkNameCollisionMethodWithNameCollisionName = 0;
 
 class _CheckNameCollisionServiceDescription implements service_describer.ServiceDescription {
@@ -2207,9 +2234,9 @@
   dynamic withNameCollision(bool message,bool response,[Function responseFactory = null]);
 }
 
-
-class _CheckNameCollisionProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _CheckNameCollisionProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _CheckNameCollisionProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -2223,7 +2250,6 @@
 
   String get serviceName => CheckNameCollision.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _checkNameCollisionMethodWithNameCollisionName:
@@ -2260,9 +2286,9 @@
   }
 }
 
-
-class CheckNameCollisionProxy extends bindings.Proxy
-                              implements CheckNameCollision {
+class CheckNameCollisionProxy
+    extends bindings.Proxy
+    implements CheckNameCollision {
   CheckNameCollisionProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _CheckNameCollisionProxyControl.fromEndpoint(endpoint));
@@ -2299,29 +2325,24 @@
   }
 }
 
-
-class CheckNameCollisionStub extends bindings.Stub {
+class _CheckNameCollisionStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<CheckNameCollision> {
   CheckNameCollision _impl;
 
-  CheckNameCollisionStub.fromEndpoint(
+  _CheckNameCollisionStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [CheckNameCollision impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CheckNameCollisionStub.fromHandle(
+  _CheckNameCollisionStubControl.fromHandle(
       core.MojoHandle handle, [CheckNameCollision impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CheckNameCollisionStub.unbound([this._impl]) : super.unbound();
-
-  static CheckNameCollisionStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CheckNameCollisionStub"));
-    return new CheckNameCollisionStub.fromEndpoint(endpoint);
-  }
+  _CheckNameCollisionStubControl.unbound([this._impl]) : super.unbound();
 
 
   CheckNameCollisionWithNameCollisionResponseParams _checkNameCollisionWithNameCollisionResponseParamsFactory(bool message, bool response) {
@@ -2389,9 +2410,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "CheckNameCollisionStub($superString)";
+    return "_CheckNameCollisionStubControl($superString)";
   }
 
   int get version => 0;
@@ -2405,6 +2427,35 @@
   }
 }
 
+class CheckNameCollisionStub
+    extends bindings.Stub<CheckNameCollision>
+    implements CheckNameCollision {
+  CheckNameCollisionStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [CheckNameCollision impl])
+      : super(new _CheckNameCollisionStubControl.fromEndpoint(endpoint, impl));
+
+  CheckNameCollisionStub.fromHandle(
+      core.MojoHandle handle, [CheckNameCollision impl])
+      : super(new _CheckNameCollisionStubControl.fromHandle(handle, impl));
+
+  CheckNameCollisionStub.unbound([CheckNameCollision impl])
+      : super(new _CheckNameCollisionStubControl.unbound(impl));
+
+  static CheckNameCollisionStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CheckNameCollisionStub"));
+    return new CheckNameCollisionStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _CheckNameCollisionStubControl.serviceDescription;
+
+
+  dynamic withNameCollision(bool message,bool response,[Function responseFactory = null]) {
+    return impl.withNameCollision(message,response,responseFactory);
+  }
+}
+
 const int _checkEnumCapsMethodSetEnumWithInternalAllCapsName = 0;
 
 class _CheckEnumCapsServiceDescription implements service_describer.ServiceDescription {
@@ -2423,9 +2474,9 @@
   void setEnumWithInternalAllCaps(EnumWithInternalAllCaps e);
 }
 
-
-class _CheckEnumCapsProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _CheckEnumCapsProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _CheckEnumCapsProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -2439,7 +2490,6 @@
 
   String get serviceName => CheckEnumCaps.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -2456,9 +2506,9 @@
   }
 }
 
-
-class CheckEnumCapsProxy extends bindings.Proxy
-                              implements CheckEnumCaps {
+class CheckEnumCapsProxy
+    extends bindings.Proxy
+    implements CheckEnumCaps {
   CheckEnumCapsProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _CheckEnumCapsProxyControl.fromEndpoint(endpoint));
@@ -2495,29 +2545,24 @@
   }
 }
 
-
-class CheckEnumCapsStub extends bindings.Stub {
+class _CheckEnumCapsStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<CheckEnumCaps> {
   CheckEnumCaps _impl;
 
-  CheckEnumCapsStub.fromEndpoint(
+  _CheckEnumCapsStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [CheckEnumCaps impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CheckEnumCapsStub.fromHandle(
+  _CheckEnumCapsStubControl.fromHandle(
       core.MojoHandle handle, [CheckEnumCaps impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CheckEnumCapsStub.unbound([this._impl]) : super.unbound();
-
-  static CheckEnumCapsStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CheckEnumCapsStub"));
-    return new CheckEnumCapsStub.fromEndpoint(endpoint);
-  }
+  _CheckEnumCapsStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -2562,9 +2607,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "CheckEnumCapsStub($superString)";
+    return "_CheckEnumCapsStubControl($superString)";
   }
 
   int get version => 0;
@@ -2578,6 +2624,35 @@
   }
 }
 
+class CheckEnumCapsStub
+    extends bindings.Stub<CheckEnumCaps>
+    implements CheckEnumCaps {
+  CheckEnumCapsStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [CheckEnumCaps impl])
+      : super(new _CheckEnumCapsStubControl.fromEndpoint(endpoint, impl));
+
+  CheckEnumCapsStub.fromHandle(
+      core.MojoHandle handle, [CheckEnumCaps impl])
+      : super(new _CheckEnumCapsStubControl.fromHandle(handle, impl));
+
+  CheckEnumCapsStub.unbound([CheckEnumCaps impl])
+      : super(new _CheckEnumCapsStubControl.unbound(impl));
+
+  static CheckEnumCapsStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CheckEnumCapsStub"));
+    return new CheckEnumCapsStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _CheckEnumCapsStubControl.serviceDescription;
+
+
+  void setEnumWithInternalAllCaps(EnumWithInternalAllCaps e) {
+    return impl.setEnumWithInternalAllCaps(e);
+  }
+}
+
 const int _testInterfaceMethodSomeMessageName = 0;
 
 class _TestInterfaceServiceDescription implements service_describer.ServiceDescription {
@@ -2596,9 +2671,9 @@
   void someMessage();
 }
 
-
-class _TestInterfaceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _TestInterfaceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _TestInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -2612,7 +2687,6 @@
 
   String get serviceName => TestInterface.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -2629,9 +2703,9 @@
   }
 }
 
-
-class TestInterfaceProxy extends bindings.Proxy
-                              implements TestInterface {
+class TestInterfaceProxy
+    extends bindings.Proxy
+    implements TestInterface {
   TestInterfaceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _TestInterfaceProxyControl.fromEndpoint(endpoint));
@@ -2667,29 +2741,24 @@
   }
 }
 
-
-class TestInterfaceStub extends bindings.Stub {
+class _TestInterfaceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<TestInterface> {
   TestInterface _impl;
 
-  TestInterfaceStub.fromEndpoint(
+  _TestInterfaceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [TestInterface impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TestInterfaceStub.fromHandle(
+  _TestInterfaceStubControl.fromHandle(
       core.MojoHandle handle, [TestInterface impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TestInterfaceStub.unbound([this._impl]) : super.unbound();
-
-  static TestInterfaceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TestInterfaceStub"));
-    return new TestInterfaceStub.fromEndpoint(endpoint);
-  }
+  _TestInterfaceStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -2732,9 +2801,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "TestInterfaceStub($superString)";
+    return "_TestInterfaceStubControl($superString)";
   }
 
   int get version => 0;
@@ -2748,6 +2818,35 @@
   }
 }
 
+class TestInterfaceStub
+    extends bindings.Stub<TestInterface>
+    implements TestInterface {
+  TestInterfaceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [TestInterface impl])
+      : super(new _TestInterfaceStubControl.fromEndpoint(endpoint, impl));
+
+  TestInterfaceStub.fromHandle(
+      core.MojoHandle handle, [TestInterface impl])
+      : super(new _TestInterfaceStubControl.fromHandle(handle, impl));
+
+  TestInterfaceStub.unbound([TestInterface impl])
+      : super(new _TestInterfaceStubControl.unbound(impl));
+
+  static TestInterfaceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TestInterfaceStub"));
+    return new TestInterfaceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _TestInterfaceStubControl.serviceDescription;
+
+
+  void someMessage() {
+    return impl.someMessage();
+  }
+}
+
 const int _regression551MethodGetName = 0;
 
 class _Regression551ServiceDescription implements service_describer.ServiceDescription {
@@ -2766,9 +2865,9 @@
   dynamic get(List<String> keyPrefixes,[Function responseFactory = null]);
 }
 
-
-class _Regression551ProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _Regression551ProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _Regression551ProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -2782,7 +2881,6 @@
 
   String get serviceName => Regression551.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _regression551MethodGetName:
@@ -2819,9 +2917,9 @@
   }
 }
 
-
-class Regression551Proxy extends bindings.Proxy
-                              implements Regression551 {
+class Regression551Proxy
+    extends bindings.Proxy
+    implements Regression551 {
   Regression551Proxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _Regression551ProxyControl.fromEndpoint(endpoint));
@@ -2857,29 +2955,24 @@
   }
 }
 
-
-class Regression551Stub extends bindings.Stub {
+class _Regression551StubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Regression551> {
   Regression551 _impl;
 
-  Regression551Stub.fromEndpoint(
+  _Regression551StubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Regression551 impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  Regression551Stub.fromHandle(
+  _Regression551StubControl.fromHandle(
       core.MojoHandle handle, [Regression551 impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  Regression551Stub.unbound([this._impl]) : super.unbound();
-
-  static Regression551Stub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For Regression551Stub"));
-    return new Regression551Stub.fromEndpoint(endpoint);
-  }
+  _Regression551StubControl.unbound([this._impl]) : super.unbound();
 
 
   Regression551GetResponseParams _regression551GetResponseParamsFactory(int result) {
@@ -2946,9 +3039,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "Regression551Stub($superString)";
+    return "_Regression551StubControl($superString)";
   }
 
   int get version => 0;
@@ -2962,6 +3056,35 @@
   }
 }
 
+class Regression551Stub
+    extends bindings.Stub<Regression551>
+    implements Regression551 {
+  Regression551Stub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Regression551 impl])
+      : super(new _Regression551StubControl.fromEndpoint(endpoint, impl));
+
+  Regression551Stub.fromHandle(
+      core.MojoHandle handle, [Regression551 impl])
+      : super(new _Regression551StubControl.fromHandle(handle, impl));
+
+  Regression551Stub.unbound([Regression551 impl])
+      : super(new _Regression551StubControl.unbound(impl));
+
+  static Regression551Stub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For Regression551Stub"));
+    return new Regression551Stub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _Regression551StubControl.serviceDescription;
+
+
+  dynamic get(List<String> keyPrefixes,[Function responseFactory = null]) {
+    return impl.get(keyPrefixes,responseFactory);
+  }
+}
+
 const int _serviceNameMethodServiceNameName = 0;
 
 class _ServiceNameServiceDescription implements service_describer.ServiceDescription {
@@ -2980,9 +3103,9 @@
   dynamic serviceName_([Function responseFactory = null]);
 }
 
-
-class _ServiceNameProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ServiceNameProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ServiceNameProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -2996,7 +3119,6 @@
 
   String get serviceName => ServiceName.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _serviceNameMethodServiceNameName:
@@ -3033,9 +3155,9 @@
   }
 }
 
-
-class ServiceNameProxy extends bindings.Proxy
-                              implements ServiceName {
+class ServiceNameProxy
+    extends bindings.Proxy
+    implements ServiceName {
   ServiceNameProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ServiceNameProxyControl.fromEndpoint(endpoint));
@@ -3070,29 +3192,24 @@
   }
 }
 
-
-class ServiceNameStub extends bindings.Stub {
+class _ServiceNameStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ServiceName> {
   ServiceName _impl;
 
-  ServiceNameStub.fromEndpoint(
+  _ServiceNameStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ServiceName impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceNameStub.fromHandle(
+  _ServiceNameStubControl.fromHandle(
       core.MojoHandle handle, [ServiceName impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceNameStub.unbound([this._impl]) : super.unbound();
-
-  static ServiceNameStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceNameStub"));
-    return new ServiceNameStub.fromEndpoint(endpoint);
-  }
+  _ServiceNameStubControl.unbound([this._impl]) : super.unbound();
 
 
   ServiceNameServiceNameResponseParams _serviceNameServiceNameResponseParamsFactory(String serviceName_) {
@@ -3157,9 +3274,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ServiceNameStub($superString)";
+    return "_ServiceNameStubControl($superString)";
   }
 
   int get version => 0;
@@ -3173,6 +3291,35 @@
   }
 }
 
+class ServiceNameStub
+    extends bindings.Stub<ServiceName>
+    implements ServiceName {
+  ServiceNameStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ServiceName impl])
+      : super(new _ServiceNameStubControl.fromEndpoint(endpoint, impl));
+
+  ServiceNameStub.fromHandle(
+      core.MojoHandle handle, [ServiceName impl])
+      : super(new _ServiceNameStubControl.fromHandle(handle, impl));
+
+  ServiceNameStub.unbound([ServiceName impl])
+      : super(new _ServiceNameStubControl.unbound(impl));
+
+  static ServiceNameStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceNameStub"));
+    return new ServiceNameStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ServiceNameStubControl.serviceDescription;
+
+
+  dynamic serviceName_([Function responseFactory = null]) {
+    return impl.serviceName_(responseFactory);
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_factory.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_factory.mojom.dart
index 59f7373..4f001ba 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_factory.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_factory.mojom.dart
@@ -1102,9 +1102,9 @@
   dynamic getName([Function responseFactory = null]);
 }
 
-
-class _NamedObjectProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _NamedObjectProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _NamedObjectProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1118,7 +1118,6 @@
 
   String get serviceName => NamedObject.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _namedObjectMethodGetNameName:
@@ -1155,9 +1154,9 @@
   }
 }
 
-
-class NamedObjectProxy extends bindings.Proxy
-                              implements NamedObject {
+class NamedObjectProxy
+    extends bindings.Proxy
+    implements NamedObject {
   NamedObjectProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _NamedObjectProxyControl.fromEndpoint(endpoint));
@@ -1202,29 +1201,24 @@
   }
 }
 
-
-class NamedObjectStub extends bindings.Stub {
+class _NamedObjectStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<NamedObject> {
   NamedObject _impl;
 
-  NamedObjectStub.fromEndpoint(
+  _NamedObjectStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [NamedObject impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NamedObjectStub.fromHandle(
+  _NamedObjectStubControl.fromHandle(
       core.MojoHandle handle, [NamedObject impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NamedObjectStub.unbound([this._impl]) : super.unbound();
-
-  static NamedObjectStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NamedObjectStub"));
-    return new NamedObjectStub.fromEndpoint(endpoint);
-  }
+  _NamedObjectStubControl.unbound([this._impl]) : super.unbound();
 
 
   NamedObjectGetNameResponseParams _namedObjectGetNameResponseParamsFactory(String name) {
@@ -1294,9 +1288,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "NamedObjectStub($superString)";
+    return "_NamedObjectStubControl($superString)";
   }
 
   int get version => 0;
@@ -1310,6 +1305,38 @@
   }
 }
 
+class NamedObjectStub
+    extends bindings.Stub<NamedObject>
+    implements NamedObject {
+  NamedObjectStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [NamedObject impl])
+      : super(new _NamedObjectStubControl.fromEndpoint(endpoint, impl));
+
+  NamedObjectStub.fromHandle(
+      core.MojoHandle handle, [NamedObject impl])
+      : super(new _NamedObjectStubControl.fromHandle(handle, impl));
+
+  NamedObjectStub.unbound([NamedObject impl])
+      : super(new _NamedObjectStubControl.unbound(impl));
+
+  static NamedObjectStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NamedObjectStub"));
+    return new NamedObjectStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _NamedObjectStubControl.serviceDescription;
+
+
+  void setName(String name) {
+    return impl.setName(name);
+  }
+  dynamic getName([Function responseFactory = null]) {
+    return impl.getName(responseFactory);
+  }
+}
+
 const int _factoryMethodDoStuffName = 0;
 const int _factoryMethodDoStuff2Name = 1;
 const int _factoryMethodCreateNamedObjectName = 2;
@@ -1336,9 +1363,9 @@
   dynamic takeImportedInterface(Object obj,[Function responseFactory = null]);
 }
 
-
-class _FactoryProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _FactoryProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _FactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1352,7 +1379,6 @@
 
   String get serviceName => Factory.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _factoryMethodDoStuffName:
@@ -1449,9 +1475,9 @@
   }
 }
 
-
-class FactoryProxy extends bindings.Proxy
-                              implements Factory {
+class FactoryProxy
+    extends bindings.Proxy
+    implements Factory {
   FactoryProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _FactoryProxyControl.fromEndpoint(endpoint));
@@ -1525,29 +1551,24 @@
   }
 }
 
-
-class FactoryStub extends bindings.Stub {
+class _FactoryStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Factory> {
   Factory _impl;
 
-  FactoryStub.fromEndpoint(
+  _FactoryStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Factory impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  FactoryStub.fromHandle(
+  _FactoryStubControl.fromHandle(
       core.MojoHandle handle, [Factory impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  FactoryStub.unbound([this._impl]) : super.unbound();
-
-  static FactoryStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For FactoryStub"));
-    return new FactoryStub.fromEndpoint(endpoint);
-  }
+  _FactoryStubControl.unbound([this._impl]) : super.unbound();
 
 
   FactoryDoStuffResponseParams _factoryDoStuffResponseParamsFactory(Response response, String text) {
@@ -1701,9 +1722,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "FactoryStub($superString)";
+    return "_FactoryStubControl($superString)";
   }
 
   int get version => 0;
@@ -1717,6 +1739,47 @@
   }
 }
 
+class FactoryStub
+    extends bindings.Stub<Factory>
+    implements Factory {
+  FactoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Factory impl])
+      : super(new _FactoryStubControl.fromEndpoint(endpoint, impl));
+
+  FactoryStub.fromHandle(
+      core.MojoHandle handle, [Factory impl])
+      : super(new _FactoryStubControl.fromHandle(handle, impl));
+
+  FactoryStub.unbound([Factory impl])
+      : super(new _FactoryStubControl.unbound(impl));
+
+  static FactoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For FactoryStub"));
+    return new FactoryStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _FactoryStubControl.serviceDescription;
+
+
+  dynamic doStuff(Request request,core.MojoMessagePipeEndpoint pipe,[Function responseFactory = null]) {
+    return impl.doStuff(request,pipe,responseFactory);
+  }
+  dynamic doStuff2(core.MojoDataPipeConsumer pipe,[Function responseFactory = null]) {
+    return impl.doStuff2(pipe,responseFactory);
+  }
+  void createNamedObject(Object obj) {
+    return impl.createNamedObject(obj);
+  }
+  dynamic requestImportedInterface(Object obj,[Function responseFactory = null]) {
+    return impl.requestImportedInterface(obj,responseFactory);
+  }
+  dynamic takeImportedInterface(Object obj,[Function responseFactory = null]) {
+    return impl.takeImportedInterface(obj,responseFactory);
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_interfaces.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_interfaces.mojom.dart
index 64d2a7d..df23be6 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_interfaces.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_interfaces.mojom.dart
@@ -1372,9 +1372,9 @@
   dynamic echoInt(int a,[Function responseFactory = null]);
 }
 
-
-class _ProviderProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ProviderProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ProviderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1388,7 +1388,6 @@
 
   String get serviceName => Provider.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _providerMethodEchoStringName:
@@ -1505,9 +1504,9 @@
   }
 }
 
-
-class ProviderProxy extends bindings.Proxy
-                              implements Provider {
+class ProviderProxy
+    extends bindings.Proxy
+    implements Provider {
   ProviderProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ProviderProxyControl.fromEndpoint(endpoint));
@@ -1580,29 +1579,24 @@
   }
 }
 
-
-class ProviderStub extends bindings.Stub {
+class _ProviderStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Provider> {
   Provider _impl;
 
-  ProviderStub.fromEndpoint(
+  _ProviderStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Provider impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ProviderStub.fromHandle(
+  _ProviderStubControl.fromHandle(
       core.MojoHandle handle, [Provider impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ProviderStub.unbound([this._impl]) : super.unbound();
-
-  static ProviderStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ProviderStub"));
-    return new ProviderStub.fromEndpoint(endpoint);
-  }
+  _ProviderStubControl.unbound([this._impl]) : super.unbound();
 
 
   ProviderEchoStringResponseParams _providerEchoStringResponseParamsFactory(String a) {
@@ -1778,9 +1772,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ProviderStub($superString)";
+    return "_ProviderStubControl($superString)";
   }
 
   int get version => 0;
@@ -1794,6 +1789,47 @@
   }
 }
 
+class ProviderStub
+    extends bindings.Stub<Provider>
+    implements Provider {
+  ProviderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Provider impl])
+      : super(new _ProviderStubControl.fromEndpoint(endpoint, impl));
+
+  ProviderStub.fromHandle(
+      core.MojoHandle handle, [Provider impl])
+      : super(new _ProviderStubControl.fromHandle(handle, impl));
+
+  ProviderStub.unbound([Provider impl])
+      : super(new _ProviderStubControl.unbound(impl));
+
+  static ProviderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ProviderStub"));
+    return new ProviderStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ProviderStubControl.serviceDescription;
+
+
+  dynamic echoString(String a,[Function responseFactory = null]) {
+    return impl.echoString(a,responseFactory);
+  }
+  dynamic echoStrings(String a,String b,[Function responseFactory = null]) {
+    return impl.echoStrings(a,b,responseFactory);
+  }
+  dynamic echoMessagePipeHandle(core.MojoMessagePipeEndpoint a,[Function responseFactory = null]) {
+    return impl.echoMessagePipeHandle(a,responseFactory);
+  }
+  dynamic echoEnum(Enum a,[Function responseFactory = null]) {
+    return impl.echoEnum(a,responseFactory);
+  }
+  dynamic echoInt(int a,[Function responseFactory = null]) {
+    return impl.echoInt(a,responseFactory);
+  }
+}
+
 const int _integerAccessorMethodGetIntegerName = 0;
 const int _integerAccessorMethodSetIntegerName = 1;
 
@@ -1814,9 +1850,9 @@
   void setInteger(int data, Enum type);
 }
 
-
-class _IntegerAccessorProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _IntegerAccessorProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _IntegerAccessorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1830,7 +1866,6 @@
 
   String get serviceName => IntegerAccessor.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _integerAccessorMethodGetIntegerName:
@@ -1867,9 +1902,9 @@
   }
 }
 
-
-class IntegerAccessorProxy extends bindings.Proxy
-                              implements IntegerAccessor {
+class IntegerAccessorProxy
+    extends bindings.Proxy
+    implements IntegerAccessor {
   IntegerAccessorProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _IntegerAccessorProxyControl.fromEndpoint(endpoint));
@@ -1915,29 +1950,24 @@
   }
 }
 
-
-class IntegerAccessorStub extends bindings.Stub {
+class _IntegerAccessorStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<IntegerAccessor> {
   IntegerAccessor _impl;
 
-  IntegerAccessorStub.fromEndpoint(
+  _IntegerAccessorStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [IntegerAccessor impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  IntegerAccessorStub.fromHandle(
+  _IntegerAccessorStubControl.fromHandle(
       core.MojoHandle handle, [IntegerAccessor impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  IntegerAccessorStub.unbound([this._impl]) : super.unbound();
-
-  static IntegerAccessorStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For IntegerAccessorStub"));
-    return new IntegerAccessorStub.fromEndpoint(endpoint);
-  }
+  _IntegerAccessorStubControl.unbound([this._impl]) : super.unbound();
 
 
   IntegerAccessorGetIntegerResponseParams _integerAccessorGetIntegerResponseParamsFactory(int data, Enum type) {
@@ -2008,9 +2038,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "IntegerAccessorStub($superString)";
+    return "_IntegerAccessorStubControl($superString)";
   }
 
   int get version => 3;
@@ -2024,6 +2055,38 @@
   }
 }
 
+class IntegerAccessorStub
+    extends bindings.Stub<IntegerAccessor>
+    implements IntegerAccessor {
+  IntegerAccessorStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [IntegerAccessor impl])
+      : super(new _IntegerAccessorStubControl.fromEndpoint(endpoint, impl));
+
+  IntegerAccessorStub.fromHandle(
+      core.MojoHandle handle, [IntegerAccessor impl])
+      : super(new _IntegerAccessorStubControl.fromHandle(handle, impl));
+
+  IntegerAccessorStub.unbound([IntegerAccessor impl])
+      : super(new _IntegerAccessorStubControl.unbound(impl));
+
+  static IntegerAccessorStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For IntegerAccessorStub"));
+    return new IntegerAccessorStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _IntegerAccessorStubControl.serviceDescription;
+
+
+  dynamic getInteger([Function responseFactory = null]) {
+    return impl.getInteger(responseFactory);
+  }
+  void setInteger(int data, Enum type) {
+    return impl.setInteger(data, type);
+  }
+}
+
 const int _sampleInterfaceMethodSampleMethod1Name = 1;
 const int _sampleInterfaceMethodSampleMethod0Name = 0;
 const int _sampleInterfaceMethodSampleMethod2Name = 2;
@@ -2046,9 +2109,9 @@
   void sampleMethod2();
 }
 
-
-class _SampleInterfaceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SampleInterfaceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SampleInterfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -2062,7 +2125,6 @@
 
   String get serviceName => SampleInterface.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _sampleInterfaceMethodSampleMethod1Name:
@@ -2099,9 +2161,9 @@
   }
 }
 
-
-class SampleInterfaceProxy extends bindings.Proxy
-                              implements SampleInterface {
+class SampleInterfaceProxy
+    extends bindings.Proxy
+    implements SampleInterface {
   SampleInterfaceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SampleInterfaceProxyControl.fromEndpoint(endpoint));
@@ -2156,29 +2218,24 @@
   }
 }
 
-
-class SampleInterfaceStub extends bindings.Stub {
+class _SampleInterfaceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<SampleInterface> {
   SampleInterface _impl;
 
-  SampleInterfaceStub.fromEndpoint(
+  _SampleInterfaceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [SampleInterface impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SampleInterfaceStub.fromHandle(
+  _SampleInterfaceStubControl.fromHandle(
       core.MojoHandle handle, [SampleInterface impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SampleInterfaceStub.unbound([this._impl]) : super.unbound();
-
-  static SampleInterfaceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SampleInterfaceStub"));
-    return new SampleInterfaceStub.fromEndpoint(endpoint);
-  }
+  _SampleInterfaceStubControl.unbound([this._impl]) : super.unbound();
 
 
   SampleInterfaceSampleMethod1ResponseParams _sampleInterfaceSampleMethod1ResponseParamsFactory(String out1, Enum out2) {
@@ -2252,9 +2309,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SampleInterfaceStub($superString)";
+    return "_SampleInterfaceStubControl($superString)";
   }
 
   int get version => 0;
@@ -2268,6 +2326,41 @@
   }
 }
 
+class SampleInterfaceStub
+    extends bindings.Stub<SampleInterface>
+    implements SampleInterface {
+  SampleInterfaceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [SampleInterface impl])
+      : super(new _SampleInterfaceStubControl.fromEndpoint(endpoint, impl));
+
+  SampleInterfaceStub.fromHandle(
+      core.MojoHandle handle, [SampleInterface impl])
+      : super(new _SampleInterfaceStubControl.fromHandle(handle, impl));
+
+  SampleInterfaceStub.unbound([SampleInterface impl])
+      : super(new _SampleInterfaceStubControl.unbound(impl));
+
+  static SampleInterfaceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SampleInterfaceStub"));
+    return new SampleInterfaceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SampleInterfaceStubControl.serviceDescription;
+
+
+  dynamic sampleMethod1(int in1,String in2,[Function responseFactory = null]) {
+    return impl.sampleMethod1(in1,in2,responseFactory);
+  }
+  void sampleMethod0() {
+    return impl.sampleMethod0();
+  }
+  void sampleMethod2() {
+    return impl.sampleMethod2();
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_service.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_service.mojom.dart
index cebd725..6acaaee 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_service.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/sample/sample_service.mojom.dart
@@ -1761,9 +1761,9 @@
   static const int kFavoriteBaz = 1;
 }
 
-
-class _ServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1777,7 +1777,6 @@
 
   String get serviceName => Service.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _serviceMethodFrobinateName:
@@ -1814,9 +1813,9 @@
   }
 }
 
-
-class ServiceProxy extends bindings.Proxy
-                              implements Service {
+class ServiceProxy
+    extends bindings.Proxy
+    implements Service {
   ServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ServiceProxyControl.fromEndpoint(endpoint));
@@ -1864,29 +1863,24 @@
   }
 }
 
-
-class ServiceStub extends bindings.Stub {
+class _ServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Service> {
   Service _impl;
 
-  ServiceStub.fromEndpoint(
+  _ServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Service impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceStub.fromHandle(
+  _ServiceStubControl.fromHandle(
       core.MojoHandle handle, [Service impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceStub.unbound([this._impl]) : super.unbound();
-
-  static ServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceStub"));
-    return new ServiceStub.fromEndpoint(endpoint);
-  }
+  _ServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
   ServiceFrobinateResponseParams _serviceFrobinateResponseParamsFactory(int result) {
@@ -1958,9 +1952,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ServiceStub($superString)";
+    return "_ServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -1974,6 +1969,38 @@
   }
 }
 
+class ServiceStub
+    extends bindings.Stub<Service>
+    implements Service {
+  ServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Service impl])
+      : super(new _ServiceStubControl.fromEndpoint(endpoint, impl));
+
+  ServiceStub.fromHandle(
+      core.MojoHandle handle, [Service impl])
+      : super(new _ServiceStubControl.fromHandle(handle, impl));
+
+  ServiceStub.unbound([Service impl])
+      : super(new _ServiceStubControl.unbound(impl));
+
+  static ServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceStub"));
+    return new ServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ServiceStubControl.serviceDescription;
+
+
+  dynamic frobinate(Foo foo,ServiceBazOptions baz,Object port,[Function responseFactory = null]) {
+    return impl.frobinate(foo,baz,port,responseFactory);
+  }
+  void getPort(Object port) {
+    return impl.getPort(port);
+  }
+}
+
 const int _portMethodPostMessageName = 0;
 
 class _PortServiceDescription implements service_describer.ServiceDescription {
@@ -1992,9 +2019,9 @@
   void postMessage(String messageText, Object port);
 }
 
-
-class _PortProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _PortProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _PortProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -2008,7 +2035,6 @@
 
   String get serviceName => Port.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -2025,9 +2051,9 @@
   }
 }
 
-
-class PortProxy extends bindings.Proxy
-                              implements Port {
+class PortProxy
+    extends bindings.Proxy
+    implements Port {
   PortProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _PortProxyControl.fromEndpoint(endpoint));
@@ -2065,29 +2091,24 @@
   }
 }
 
-
-class PortStub extends bindings.Stub {
+class _PortStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Port> {
   Port _impl;
 
-  PortStub.fromEndpoint(
+  _PortStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Port impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  PortStub.fromHandle(
+  _PortStubControl.fromHandle(
       core.MojoHandle handle, [Port impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  PortStub.unbound([this._impl]) : super.unbound();
-
-  static PortStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For PortStub"));
-    return new PortStub.fromEndpoint(endpoint);
-  }
+  _PortStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -2132,9 +2153,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "PortStub($superString)";
+    return "_PortStubControl($superString)";
   }
 
   int get version => 0;
@@ -2148,6 +2170,35 @@
   }
 }
 
+class PortStub
+    extends bindings.Stub<Port>
+    implements Port {
+  PortStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Port impl])
+      : super(new _PortStubControl.fromEndpoint(endpoint, impl));
+
+  PortStub.fromHandle(
+      core.MojoHandle handle, [Port impl])
+      : super(new _PortStubControl.fromHandle(handle, impl));
+
+  PortStub.unbound([Port impl])
+      : super(new _PortStubControl.unbound(impl));
+
+  static PortStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PortStub"));
+    return new PortStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _PortStubControl.serviceDescription;
+
+
+  void postMessage(String messageText, Object port) {
+    return impl.postMessage(messageText, port);
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/test/echo_service.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/test/echo_service.mojom.dart
index c88ac53..0a3846a 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/test/echo_service.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/test/echo_service.mojom.dart
@@ -459,9 +459,9 @@
   void quit();
 }
 
-
-class _EchoServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _EchoServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _EchoServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -475,7 +475,6 @@
 
   String get serviceName => EchoService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _echoServiceMethodEchoStringName:
@@ -532,9 +531,9 @@
   }
 }
 
-
-class EchoServiceProxy extends bindings.Proxy
-                              implements EchoService {
+class EchoServiceProxy
+    extends bindings.Proxy
+    implements EchoService {
   EchoServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _EchoServiceProxyControl.fromEndpoint(endpoint));
@@ -598,29 +597,24 @@
   }
 }
 
-
-class EchoServiceStub extends bindings.Stub {
+class _EchoServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<EchoService> {
   EchoService _impl;
 
-  EchoServiceStub.fromEndpoint(
+  _EchoServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [EchoService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  EchoServiceStub.fromHandle(
+  _EchoServiceStubControl.fromHandle(
       core.MojoHandle handle, [EchoService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  EchoServiceStub.unbound([this._impl]) : super.unbound();
-
-  static EchoServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For EchoServiceStub"));
-    return new EchoServiceStub.fromEndpoint(endpoint);
-  }
+  _EchoServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
   EchoServiceEchoStringResponseParams _echoServiceEchoStringResponseParamsFactory(String value) {
@@ -720,9 +714,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "EchoServiceStub($superString)";
+    return "_EchoServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -736,6 +731,44 @@
   }
 }
 
+class EchoServiceStub
+    extends bindings.Stub<EchoService>
+    implements EchoService {
+  EchoServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [EchoService impl])
+      : super(new _EchoServiceStubControl.fromEndpoint(endpoint, impl));
+
+  EchoServiceStub.fromHandle(
+      core.MojoHandle handle, [EchoService impl])
+      : super(new _EchoServiceStubControl.fromHandle(handle, impl));
+
+  EchoServiceStub.unbound([EchoService impl])
+      : super(new _EchoServiceStubControl.unbound(impl));
+
+  static EchoServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For EchoServiceStub"));
+    return new EchoServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _EchoServiceStubControl.serviceDescription;
+
+
+  dynamic echoString(String value,[Function responseFactory = null]) {
+    return impl.echoString(value,responseFactory);
+  }
+  dynamic delayedEchoString(String value,int millis,[Function responseFactory = null]) {
+    return impl.delayedEchoString(value,millis,responseFactory);
+  }
+  void swap() {
+    return impl.swap();
+  }
+  void quit() {
+    return impl.quit();
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/_mojo_for_test_only/lib/test/pingpong_service.mojom.dart b/mojo/dart/packages/_mojo_for_test_only/lib/test/pingpong_service.mojom.dart
index 425f5fb..8581059 100644
--- a/mojo/dart/packages/_mojo_for_test_only/lib/test/pingpong_service.mojom.dart
+++ b/mojo/dart/packages/_mojo_for_test_only/lib/test/pingpong_service.mojom.dart
@@ -776,9 +776,9 @@
   void quit();
 }
 
-
-class _PingPongServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _PingPongServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _PingPongServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -792,7 +792,6 @@
 
   String get serviceName => PingPongService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _pingPongServiceMethodPingTargetUrlName:
@@ -849,9 +848,9 @@
   }
 }
 
-
-class PingPongServiceProxy extends bindings.Proxy
-                              implements PingPongService {
+class PingPongServiceProxy
+    extends bindings.Proxy
+    implements PingPongService {
   PingPongServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _PingPongServiceProxyControl.fromEndpoint(endpoint));
@@ -947,29 +946,24 @@
   }
 }
 
-
-class PingPongServiceStub extends bindings.Stub {
+class _PingPongServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<PingPongService> {
   PingPongService _impl;
 
-  PingPongServiceStub.fromEndpoint(
+  _PingPongServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [PingPongService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  PingPongServiceStub.fromHandle(
+  _PingPongServiceStubControl.fromHandle(
       core.MojoHandle handle, [PingPongService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  PingPongServiceStub.unbound([this._impl]) : super.unbound();
-
-  static PingPongServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For PingPongServiceStub"));
-    return new PingPongServiceStub.fromEndpoint(endpoint);
-  }
+  _PingPongServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
   PingPongServicePingTargetUrlResponseParams _pingPongServicePingTargetUrlResponseParamsFactory(bool ok) {
@@ -1086,9 +1080,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "PingPongServiceStub($superString)";
+    return "_PingPongServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -1102,6 +1097,53 @@
   }
 }
 
+class PingPongServiceStub
+    extends bindings.Stub<PingPongService>
+    implements PingPongService {
+  PingPongServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [PingPongService impl])
+      : super(new _PingPongServiceStubControl.fromEndpoint(endpoint, impl));
+
+  PingPongServiceStub.fromHandle(
+      core.MojoHandle handle, [PingPongService impl])
+      : super(new _PingPongServiceStubControl.fromHandle(handle, impl));
+
+  PingPongServiceStub.unbound([PingPongService impl])
+      : super(new _PingPongServiceStubControl.unbound(impl));
+
+  static PingPongServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PingPongServiceStub"));
+    return new PingPongServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _PingPongServiceStubControl.serviceDescription;
+
+
+  void setClient(Object client) {
+    return impl.setClient(client);
+  }
+  void ping(int pingValue) {
+    return impl.ping(pingValue);
+  }
+  dynamic pingTargetUrl(String url,int count,[Function responseFactory = null]) {
+    return impl.pingTargetUrl(url,count,responseFactory);
+  }
+  dynamic pingTargetService(Object service,int count,[Function responseFactory = null]) {
+    return impl.pingTargetService(service,count,responseFactory);
+  }
+  void getPingPongService(Object service) {
+    return impl.getPingPongService(service);
+  }
+  void getPingPongServiceDelayed(Object service) {
+    return impl.getPingPongServiceDelayed(service);
+  }
+  void quit() {
+    return impl.quit();
+  }
+}
+
 const int _pingPongClientMethodPongName = 0;
 
 class _PingPongClientServiceDescription implements service_describer.ServiceDescription {
@@ -1120,9 +1162,9 @@
   void pong(int pongValue);
 }
 
-
-class _PingPongClientProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _PingPongClientProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _PingPongClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1136,7 +1178,6 @@
 
   String get serviceName => PingPongClient.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1153,9 +1194,9 @@
   }
 }
 
-
-class PingPongClientProxy extends bindings.Proxy
-                              implements PingPongClient {
+class PingPongClientProxy
+    extends bindings.Proxy
+    implements PingPongClient {
   PingPongClientProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _PingPongClientProxyControl.fromEndpoint(endpoint));
@@ -1192,29 +1233,24 @@
   }
 }
 
-
-class PingPongClientStub extends bindings.Stub {
+class _PingPongClientStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<PingPongClient> {
   PingPongClient _impl;
 
-  PingPongClientStub.fromEndpoint(
+  _PingPongClientStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [PingPongClient impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  PingPongClientStub.fromHandle(
+  _PingPongClientStubControl.fromHandle(
       core.MojoHandle handle, [PingPongClient impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  PingPongClientStub.unbound([this._impl]) : super.unbound();
-
-  static PingPongClientStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For PingPongClientStub"));
-    return new PingPongClientStub.fromEndpoint(endpoint);
-  }
+  _PingPongClientStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -1259,9 +1295,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "PingPongClientStub($superString)";
+    return "_PingPongClientStubControl($superString)";
   }
 
   int get version => 0;
@@ -1275,6 +1312,35 @@
   }
 }
 
+class PingPongClientStub
+    extends bindings.Stub<PingPongClient>
+    implements PingPongClient {
+  PingPongClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [PingPongClient impl])
+      : super(new _PingPongClientStubControl.fromEndpoint(endpoint, impl));
+
+  PingPongClientStub.fromHandle(
+      core.MojoHandle handle, [PingPongClient impl])
+      : super(new _PingPongClientStubControl.fromHandle(handle, impl));
+
+  PingPongClientStub.unbound([PingPongClient impl])
+      : super(new _PingPongClientStubControl.unbound(impl));
+
+  static PingPongClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PingPongClientStub"));
+    return new PingPongClientStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _PingPongClientStubControl.serviceDescription;
+
+
+  void pong(int pongValue) {
+    return impl.pong(pongValue);
+  }
+}
+
 
 mojom_types.RuntimeTypeInfo getRuntimeTypeInfo() => _runtimeTypeInfo ??
     _initRuntimeTypeInfo();
diff --git a/mojo/dart/packages/mojo/lib/mojo/application.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/application.mojom.dart
index 26c6537..ec7bd28 100644
--- a/mojo/dart/packages/mojo/lib/mojo/application.mojom.dart
+++ b/mojo/dart/packages/mojo/lib/mojo/application.mojom.dart
@@ -315,9 +315,9 @@
   void requestQuit();
 }
 
-
-class _ApplicationProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ApplicationProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ApplicationProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -331,7 +331,6 @@
 
   String get serviceName => Application.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -348,9 +347,9 @@
   }
 }
 
-
-class ApplicationProxy extends bindings.Proxy
-                              implements Application {
+class ApplicationProxy
+    extends bindings.Proxy
+    implements Application {
   ApplicationProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ApplicationProxyControl.fromEndpoint(endpoint));
@@ -411,29 +410,24 @@
   }
 }
 
-
-class ApplicationStub extends bindings.Stub {
+class _ApplicationStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Application> {
   Application _impl;
 
-  ApplicationStub.fromEndpoint(
+  _ApplicationStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Application impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ApplicationStub.fromHandle(
+  _ApplicationStubControl.fromHandle(
       core.MojoHandle handle, [Application impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ApplicationStub.unbound([this._impl]) : super.unbound();
-
-  static ApplicationStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ApplicationStub"));
-    return new ApplicationStub.fromEndpoint(endpoint);
-  }
+  _ApplicationStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -486,9 +480,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ApplicationStub($superString)";
+    return "_ApplicationStubControl($superString)";
   }
 
   int get version => 0;
@@ -502,5 +497,40 @@
   }
 }
 
+class ApplicationStub
+    extends bindings.Stub<Application>
+    implements Application {
+  ApplicationStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Application impl])
+      : super(new _ApplicationStubControl.fromEndpoint(endpoint, impl));
+
+  ApplicationStub.fromHandle(
+      core.MojoHandle handle, [Application impl])
+      : super(new _ApplicationStubControl.fromHandle(handle, impl));
+
+  ApplicationStub.unbound([Application impl])
+      : super(new _ApplicationStubControl.unbound(impl));
+
+  static ApplicationStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ApplicationStub"));
+    return new ApplicationStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ApplicationStubControl.serviceDescription;
+
+
+  void initialize(Object shell, List<String> args, String url) {
+    return impl.initialize(shell, args, url);
+  }
+  void acceptConnection(String requestorUrl, Object services, Object exposedServices, String resolvedUrl) {
+    return impl.acceptConnection(requestorUrl, services, exposedServices, resolvedUrl);
+  }
+  void requestQuit() {
+    return impl.requestQuit();
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo/lib/mojo/application_connector.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/application_connector.mojom.dart
index 4550496..677be80 100644
--- a/mojo/dart/packages/mojo/lib/mojo/application_connector.mojom.dart
+++ b/mojo/dart/packages/mojo/lib/mojo/application_connector.mojom.dart
@@ -198,9 +198,9 @@
   void duplicate(Object applicationConnectorRequest);
 }
 
-
-class _ApplicationConnectorProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ApplicationConnectorProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ApplicationConnectorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -214,7 +214,6 @@
 
   String get serviceName => ApplicationConnector.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -231,9 +230,9 @@
   }
 }
 
-
-class ApplicationConnectorProxy extends bindings.Proxy
-                              implements ApplicationConnector {
+class ApplicationConnectorProxy
+    extends bindings.Proxy
+    implements ApplicationConnector {
   ApplicationConnectorProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ApplicationConnectorProxyControl.fromEndpoint(endpoint));
@@ -282,29 +281,24 @@
   }
 }
 
-
-class ApplicationConnectorStub extends bindings.Stub {
+class _ApplicationConnectorStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ApplicationConnector> {
   ApplicationConnector _impl;
 
-  ApplicationConnectorStub.fromEndpoint(
+  _ApplicationConnectorStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ApplicationConnector impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ApplicationConnectorStub.fromHandle(
+  _ApplicationConnectorStubControl.fromHandle(
       core.MojoHandle handle, [ApplicationConnector impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ApplicationConnectorStub.unbound([this._impl]) : super.unbound();
-
-  static ApplicationConnectorStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ApplicationConnectorStub"));
-    return new ApplicationConnectorStub.fromEndpoint(endpoint);
-  }
+  _ApplicationConnectorStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -354,9 +348,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ApplicationConnectorStub($superString)";
+    return "_ApplicationConnectorStubControl($superString)";
   }
 
   int get version => 0;
@@ -370,5 +365,37 @@
   }
 }
 
+class ApplicationConnectorStub
+    extends bindings.Stub<ApplicationConnector>
+    implements ApplicationConnector {
+  ApplicationConnectorStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ApplicationConnector impl])
+      : super(new _ApplicationConnectorStubControl.fromEndpoint(endpoint, impl));
+
+  ApplicationConnectorStub.fromHandle(
+      core.MojoHandle handle, [ApplicationConnector impl])
+      : super(new _ApplicationConnectorStubControl.fromHandle(handle, impl));
+
+  ApplicationConnectorStub.unbound([ApplicationConnector impl])
+      : super(new _ApplicationConnectorStubControl.unbound(impl));
+
+  static ApplicationConnectorStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ApplicationConnectorStub"));
+    return new ApplicationConnectorStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ApplicationConnectorStubControl.serviceDescription;
+
+
+  void connectToApplication(String applicationUrl, Object services, Object exposedServices) {
+    return impl.connectToApplication(applicationUrl, services, exposedServices);
+  }
+  void duplicate(Object applicationConnectorRequest) {
+    return impl.duplicate(applicationConnectorRequest);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo/lib/mojo/bindings/types/service_describer.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/bindings/types/service_describer.mojom.dart
index 7078340..4fb4907 100644
--- a/mojo/dart/packages/mojo/lib/mojo/bindings/types/service_describer.mojom.dart
+++ b/mojo/dart/packages/mojo/lib/mojo/bindings/types/service_describer.mojom.dart
@@ -574,9 +574,9 @@
   void describeService(String interfaceName, Object descriptionRequest);
 }
 
-
-class _ServiceDescriberProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ServiceDescriberProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ServiceDescriberProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -590,7 +590,6 @@
 
   String get serviceName => ServiceDescriber.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -607,9 +606,9 @@
   }
 }
 
-
-class ServiceDescriberProxy extends bindings.Proxy
-                              implements ServiceDescriber {
+class ServiceDescriberProxy
+    extends bindings.Proxy
+    implements ServiceDescriber {
   ServiceDescriberProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ServiceDescriberProxyControl.fromEndpoint(endpoint));
@@ -647,29 +646,24 @@
   }
 }
 
-
-class ServiceDescriberStub extends bindings.Stub {
+class _ServiceDescriberStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ServiceDescriber> {
   ServiceDescriber _impl;
 
-  ServiceDescriberStub.fromEndpoint(
+  _ServiceDescriberStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ServiceDescriber impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceDescriberStub.fromHandle(
+  _ServiceDescriberStubControl.fromHandle(
       core.MojoHandle handle, [ServiceDescriber impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceDescriberStub.unbound([this._impl]) : super.unbound();
-
-  static ServiceDescriberStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceDescriberStub"));
-    return new ServiceDescriberStub.fromEndpoint(endpoint);
-  }
+  _ServiceDescriberStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -714,9 +708,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ServiceDescriberStub($superString)";
+    return "_ServiceDescriberStubControl($superString)";
   }
 
   int get version => 0;
@@ -730,6 +725,35 @@
   }
 }
 
+class ServiceDescriberStub
+    extends bindings.Stub<ServiceDescriber>
+    implements ServiceDescriber {
+  ServiceDescriberStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ServiceDescriber impl])
+      : super(new _ServiceDescriberStubControl.fromEndpoint(endpoint, impl));
+
+  ServiceDescriberStub.fromHandle(
+      core.MojoHandle handle, [ServiceDescriber impl])
+      : super(new _ServiceDescriberStubControl.fromHandle(handle, impl));
+
+  ServiceDescriberStub.unbound([ServiceDescriber impl])
+      : super(new _ServiceDescriberStubControl.unbound(impl));
+
+  static ServiceDescriberStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceDescriberStub"));
+    return new ServiceDescriberStub.fromEndpoint(endpoint);
+  }
+
+  static ServiceDescription get serviceDescription =>
+      _ServiceDescriberStubControl.serviceDescription;
+
+
+  void describeService(String interfaceName, Object descriptionRequest) {
+    return impl.describeService(interfaceName, descriptionRequest);
+  }
+}
+
 const int _serviceDescriptionMethodGetTopLevelInterfaceName = 0;
 const int _serviceDescriptionMethodGetTypeDefinitionName = 1;
 const int _serviceDescriptionMethodGetAllTypeDefinitionsName = 2;
@@ -752,9 +776,9 @@
   dynamic getAllTypeDefinitions([Function responseFactory = null]);
 }
 
-
-class _ServiceDescriptionProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ServiceDescriptionProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ServiceDescriptionProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -768,7 +792,6 @@
 
   String get serviceName => ServiceDescription.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _serviceDescriptionMethodGetTopLevelInterfaceName:
@@ -845,9 +868,9 @@
   }
 }
 
-
-class ServiceDescriptionProxy extends bindings.Proxy
-                              implements ServiceDescription {
+class ServiceDescriptionProxy
+    extends bindings.Proxy
+    implements ServiceDescription {
   ServiceDescriptionProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ServiceDescriptionProxyControl.fromEndpoint(endpoint));
@@ -899,29 +922,24 @@
   }
 }
 
-
-class ServiceDescriptionStub extends bindings.Stub {
+class _ServiceDescriptionStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ServiceDescription> {
   ServiceDescription _impl;
 
-  ServiceDescriptionStub.fromEndpoint(
+  _ServiceDescriptionStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ServiceDescription impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceDescriptionStub.fromHandle(
+  _ServiceDescriptionStubControl.fromHandle(
       core.MojoHandle handle, [ServiceDescription impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceDescriptionStub.unbound([this._impl]) : super.unbound();
-
-  static ServiceDescriptionStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceDescriptionStub"));
-    return new ServiceDescriptionStub.fromEndpoint(endpoint);
-  }
+  _ServiceDescriptionStubControl.unbound([this._impl]) : super.unbound();
 
 
   ServiceDescriptionGetTopLevelInterfaceResponseParams _serviceDescriptionGetTopLevelInterfaceResponseParamsFactory(mojom_types_mojom.MojomInterface mojomInterface) {
@@ -1038,9 +1056,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ServiceDescriptionStub($superString)";
+    return "_ServiceDescriptionStubControl($superString)";
   }
 
   int get version => 0;
@@ -1054,5 +1073,40 @@
   }
 }
 
+class ServiceDescriptionStub
+    extends bindings.Stub<ServiceDescription>
+    implements ServiceDescription {
+  ServiceDescriptionStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ServiceDescription impl])
+      : super(new _ServiceDescriptionStubControl.fromEndpoint(endpoint, impl));
+
+  ServiceDescriptionStub.fromHandle(
+      core.MojoHandle handle, [ServiceDescription impl])
+      : super(new _ServiceDescriptionStubControl.fromHandle(handle, impl));
+
+  ServiceDescriptionStub.unbound([ServiceDescription impl])
+      : super(new _ServiceDescriptionStubControl.unbound(impl));
+
+  static ServiceDescriptionStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceDescriptionStub"));
+    return new ServiceDescriptionStub.fromEndpoint(endpoint);
+  }
+
+  static ServiceDescription get serviceDescription =>
+      _ServiceDescriptionStubControl.serviceDescription;
+
+
+  dynamic getTopLevelInterface([Function responseFactory = null]) {
+    return impl.getTopLevelInterface(responseFactory);
+  }
+  dynamic getTypeDefinition(String typeKey,[Function responseFactory = null]) {
+    return impl.getTypeDefinition(typeKey,responseFactory);
+  }
+  dynamic getAllTypeDefinitions([Function responseFactory = null]) {
+    return impl.getAllTypeDefinitions(responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo/lib/mojo/service_provider.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/service_provider.mojom.dart
index 979c6fb..9f859f7 100644
--- a/mojo/dart/packages/mojo/lib/mojo/service_provider.mojom.dart
+++ b/mojo/dart/packages/mojo/lib/mojo/service_provider.mojom.dart
@@ -111,9 +111,9 @@
   void connectToService_(String interfaceName, core.MojoMessagePipeEndpoint pipe);
 }
 
-
-class _ServiceProviderProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ServiceProviderProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ServiceProviderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -127,7 +127,6 @@
 
   String get serviceName => ServiceProvider.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -144,9 +143,9 @@
   }
 }
 
-
-class ServiceProviderProxy extends bindings.Proxy
-                              implements ServiceProvider {
+class ServiceProviderProxy
+    extends bindings.Proxy
+    implements ServiceProvider {
   ServiceProviderProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ServiceProviderProxyControl.fromEndpoint(endpoint));
@@ -184,29 +183,24 @@
   }
 }
 
-
-class ServiceProviderStub extends bindings.Stub {
+class _ServiceProviderStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ServiceProvider> {
   ServiceProvider _impl;
 
-  ServiceProviderStub.fromEndpoint(
+  _ServiceProviderStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ServiceProvider impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceProviderStub.fromHandle(
+  _ServiceProviderStubControl.fromHandle(
       core.MojoHandle handle, [ServiceProvider impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceProviderStub.unbound([this._impl]) : super.unbound();
-
-  static ServiceProviderStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceProviderStub"));
-    return new ServiceProviderStub.fromEndpoint(endpoint);
-  }
+  _ServiceProviderStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -251,9 +245,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ServiceProviderStub($superString)";
+    return "_ServiceProviderStubControl($superString)";
   }
 
   int get version => 0;
@@ -267,5 +262,34 @@
   }
 }
 
+class ServiceProviderStub
+    extends bindings.Stub<ServiceProvider>
+    implements ServiceProvider {
+  ServiceProviderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ServiceProvider impl])
+      : super(new _ServiceProviderStubControl.fromEndpoint(endpoint, impl));
+
+  ServiceProviderStub.fromHandle(
+      core.MojoHandle handle, [ServiceProvider impl])
+      : super(new _ServiceProviderStubControl.fromHandle(handle, impl));
+
+  ServiceProviderStub.unbound([ServiceProvider impl])
+      : super(new _ServiceProviderStubControl.unbound(impl));
+
+  static ServiceProviderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceProviderStub"));
+    return new ServiceProviderStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ServiceProviderStubControl.serviceDescription;
+
+
+  void connectToService_(String interfaceName, core.MojoMessagePipeEndpoint pipe) {
+    return impl.connectToService_(interfaceName, pipe);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo/lib/mojo/shell.mojom.dart b/mojo/dart/packages/mojo/lib/mojo/shell.mojom.dart
index b8d45d5..83e15a8 100644
--- a/mojo/dart/packages/mojo/lib/mojo/shell.mojom.dart
+++ b/mojo/dart/packages/mojo/lib/mojo/shell.mojom.dart
@@ -199,9 +199,9 @@
   void createApplicationConnector(Object applicationConnectorRequest);
 }
 
-
-class _ShellProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ShellProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ShellProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -215,7 +215,6 @@
 
   String get serviceName => Shell.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -232,9 +231,9 @@
   }
 }
 
-
-class ShellProxy extends bindings.Proxy
-                              implements Shell {
+class ShellProxy
+    extends bindings.Proxy
+    implements Shell {
   ShellProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ShellProxyControl.fromEndpoint(endpoint));
@@ -283,29 +282,24 @@
   }
 }
 
-
-class ShellStub extends bindings.Stub {
+class _ShellStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Shell> {
   Shell _impl;
 
-  ShellStub.fromEndpoint(
+  _ShellStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Shell impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ShellStub.fromHandle(
+  _ShellStubControl.fromHandle(
       core.MojoHandle handle, [Shell impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ShellStub.unbound([this._impl]) : super.unbound();
-
-  static ShellStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ShellStub"));
-    return new ShellStub.fromEndpoint(endpoint);
-  }
+  _ShellStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -355,9 +349,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ShellStub($superString)";
+    return "_ShellStubControl($superString)";
   }
 
   int get version => 0;
@@ -371,5 +366,37 @@
   }
 }
 
+class ShellStub
+    extends bindings.Stub<Shell>
+    implements Shell {
+  ShellStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Shell impl])
+      : super(new _ShellStubControl.fromEndpoint(endpoint, impl));
+
+  ShellStub.fromHandle(
+      core.MojoHandle handle, [Shell impl])
+      : super(new _ShellStubControl.fromHandle(handle, impl));
+
+  ShellStub.unbound([Shell impl])
+      : super(new _ShellStubControl.unbound(impl));
+
+  static ShellStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ShellStub"));
+    return new ShellStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ShellStubControl.serviceDescription;
+
+
+  void connectToApplication(String applicationUrl, Object services, Object exposedServices) {
+    return impl.connectToApplication(applicationUrl, services, exposedServices);
+  }
+  void createApplicationConnector(Object applicationConnectorRequest) {
+    return impl.createApplicationConnector(applicationConnectorRequest);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo/lib/src/application.dart b/mojo/dart/packages/mojo/lib/src/application.dart
index ba19009..4cc7d87 100644
--- a/mojo/dart/packages/mojo/lib/src/application.dart
+++ b/mojo/dart/packages/mojo/lib/src/application.dart
@@ -13,13 +13,13 @@
       Application application, core.MojoMessagePipeEndpoint endpoint) {
     _application = application;
     _stub = new application_mojom.ApplicationStub.fromEndpoint(endpoint, this);
-    _stub.onError = ((_) => close());
+    _stub.ctrl.onError = ((_) => close());
   }
 
   _ApplicationImpl.fromHandle(Application application, core.MojoHandle handle) {
     _application = application;
     _stub = new application_mojom.ApplicationStub.fromHandle(handle, this);
-    _stub.onError = ((_) => close());
+    _stub.ctrl.onError = ((_) => close());
   }
 
   _ApplicationImpl.fromStub(Application application,
@@ -27,11 +27,11 @@
     _application = application;
     _stub = applicationStub;
     _stub.impl = this;
-    _stub.onError = ((_) => close());
+    _stub.ctrl.onError = ((_) => close());
   }
 
   set onError(core.ErrorHandler f) {
-    _stub.onError = f;
+    _stub.ctrl.onError = f;
   }
 
   void initialize(
diff --git a/mojo/dart/packages/mojo/lib/src/application_connection.dart b/mojo/dart/packages/mojo/lib/src/application_connection.dart
index da1a28a..fe8562e 100644
--- a/mojo/dart/packages/mojo/lib/src/application_connection.dart
+++ b/mojo/dart/packages/mojo/lib/src/application_connection.dart
@@ -14,13 +14,13 @@
 
   LocalServiceProvider(this.connection, this._stub) {
     _stub.impl = this;
-    if (!_stub.isOpen) {
+    if (!_stub.ctrl.isOpen) {
       throw new core.MojoApiError("The service provider stub must be open");
     }
   }
 
   set onError(Function f) {
-    _stub.onError = f;
+    _stub.ctrl.onError = f;
   }
 
   Future close({bool immediate: false}) => _stub.close(immediate: immediate);
diff --git a/mojo/dart/packages/mojo/lib/src/codec.dart b/mojo/dart/packages/mojo/lib/src/codec.dart
index 5fd7ac6..46d82b5 100644
--- a/mojo/dart/packages/mojo/lib/src/codec.dart
+++ b/mojo/dart/packages/mojo/lib/src/codec.dart
@@ -218,15 +218,15 @@
       return;
     }
     if (interface is Stub) {
-      if (interface.isBound) {
+      if (interface.ctrl.isBound) {
         throw new MojoCodecError(
             'Cannot encode a bound stub for an interface');
       }
       var pipe = new core.MojoMessagePipe();
-      interface.bind(pipe.endpoints[0]);
+      interface.ctrl.bind(pipe.endpoints[0]);
       encodeMessagePipeHandle(pipe.endpoints[1], offset, nullable);
       // Set the version to the version in the stub.
-      encodeUint32(interface.version, offset + kSerializedHandleSize);
+      encodeUint32(interface.ctrl.version, offset + kSerializedHandleSize);
     } else if (interface is Proxy) {
       if (!interface.ctrl.isBound) {
         throw new MojoCodecError(
@@ -260,18 +260,18 @@
       request.ctrl.beginHandlingEvents();
       encodeMessagePipeHandle(pipe.endpoints[1], offset, nullable);
     } else if (request is Stub) {
-      if (!request.isBound) {
+      if (!request.ctrl.isBound) {
         throw new MojoCodecError(
             'Cannot encode an unbound stub for an interface request');
       }
-      if (!request.isOpen) {
+      if (!request.ctrl.isOpen) {
         // Make sure that we are listening so that state for the stub is
         // cleaned up when the message is sent and the handle is closed.
-        request.beginHandlingEvents();
+        request.ctrl.beginHandlingEvents();
       }
-      encodeMessagePipeHandle(request.endpoint, offset, nullable);
+      encodeMessagePipeHandle(request.ctrl.endpoint, offset, nullable);
       // Set the version to the current version of the stub.
-      encodeUint32(request.version, offset + kSerializedHandleSize);
+      encodeUint32(request.ctrl.version, offset + kSerializedHandleSize);
     }
   }
 
diff --git a/mojo/dart/packages/mojo/lib/src/control_message.dart b/mojo/dart/packages/mojo/lib/src/control_message.dart
index e5cd582..407800a 100644
--- a/mojo/dart/packages/mojo/lib/src/control_message.dart
+++ b/mojo/dart/packages/mojo/lib/src/control_message.dart
@@ -15,19 +15,19 @@
   static bool _isRunOrClose(ServiceMessage message) =>
       (message.header.type == icm.kRunOrClosePipeMessageId);
 
-  static Future<Message> handleMessage(Stub stub,
+  static Future<Message> handleMessage(StubControl stubControl,
                                        int interface_version,
                                        ServiceMessage message) {
     assert(isControlMessage(message));
     if (_isRun(message)) {
-      return _handleRun(stub, interface_version, message);
+      return _handleRun(stubControl, interface_version, message);
     } else {
       assert(_isRunOrClose(message));
-      return _handleRunOrClose(stub, interface_version, message);
+      return _handleRunOrClose(stubControl, interface_version, message);
     }
   }
 
-  static Future<Message> _handleRun(Stub stub,
+  static Future<Message> _handleRun(StubControl stubControl,
                                     int interface_version,
                                     ServiceMessage message) {
     // Construct RunMessage response.
@@ -38,13 +38,13 @@
     response.queryVersionResult.version = interface_version;
     // Return response.
     return new Future.value(
-        stub.buildResponseWithId(response,
-                                 icm.kRunMessageId,
-                                 message.header.requestId,
-                                 MessageHeader.kMessageIsResponse));
+        stubControl.buildResponseWithId(response,
+                                        icm.kRunMessageId,
+                                        message.header.requestId,
+                                        MessageHeader.kMessageIsResponse));
   }
 
-  static Future _handleRunOrClose(Stub stub,
+  static Future _handleRunOrClose(StubControl stubControl,
                                   int interface_version,
                                   ServiceMessage message) {
     // Deserialize message.
@@ -53,7 +53,7 @@
     var requiredVersion = params.requireVersion.version;
     if (interface_version < requiredVersion) {
       // Stub does not implement required version. Close the pipe immediately.
-      stub.close(immediate: true);
+      stubControl.close(immediate: true);
     }
     return null;
   }
diff --git a/mojo/dart/packages/mojo/lib/src/proxy.dart b/mojo/dart/packages/mojo/lib/src/proxy.dart
index d1d6c0b..ea1afac 100644
--- a/mojo/dart/packages/mojo/lib/src/proxy.dart
+++ b/mojo/dart/packages/mojo/lib/src/proxy.dart
@@ -44,14 +44,14 @@
 /// Generated Proxy classes have a factory Proxy.connectToService which takes
 /// a ServiceConnector, a url, and optionally a service name and returns a
 /// bound Proxy. For example, every class extending the Application base class
-/// in package:mojo/application.dart inherits and implementation of the
+/// in package:mojo/application.dart inherits an implementation of the
 /// ServiceConnector interface.
 abstract class ServiceConnector {
   /// Connects [proxy] to the service called [serviceName] that lives at [url].
   void connectToService(String url, Proxy proxy, [String serviceName]);
 }
 
-class ProxyMessageHandler extends core.MojoEventHandler {
+abstract class ProxyMessageHandler extends core.MojoEventHandler {
   HashMap<int, Completer> _completerMap = new HashMap<int, Completer>();
   Completer _errorCompleter = new Completer();
   Set<Completer> _errorCompleters;
@@ -70,7 +70,7 @@
   /// The function that handles responses to sent proxy message. It should be
   /// implemented by the generated ProxyControl classes that extend
   /// [ProxyMessageHandler].
-  void handleResponse(ServiceMessage msg) {}
+  void handleResponse(ServiceMessage msg);
 
   /// If there is an error in using this proxy, this future completes with
   /// a ProxyError.
@@ -173,6 +173,7 @@
   // Need a getter for this for access in subclasses.
   HashMap<int, Completer> get completerMap => _completerMap;
 
+  @override
   String toString() {
     var superString = super.toString();
     return "ProxyMessageHandler(${superString})";
diff --git a/mojo/dart/packages/mojo/lib/src/stub.dart b/mojo/dart/packages/mojo/lib/src/stub.dart
index 2b95ea7..a076533 100644
--- a/mojo/dart/packages/mojo/lib/src/stub.dart
+++ b/mojo/dart/packages/mojo/lib/src/stub.dart
@@ -4,22 +4,61 @@
 
 part of bindings;
 
-abstract class Stub extends core.MojoEventHandler {
+/// Generated StubControl classes implement this interface.
+/// StubControl objects are accessible through the [ctrl] field on Stubs.
+abstract class StubControl<T> implements StubMessageHandler {
+  T impl;
+}
+
+/// Generated Stub classes extend this base class.
+class Stub<T> {
+  // In general it's probalby better to avoid adding fields and methods to this
+  // class. Names added to this class have to be mangled by Mojo bindings
+  // generation to avoid name conflicts.
+
+  /// Proxies control the StubMessageHandler by way of this [StubControl]
+  /// object.
+  final StubControl<T> ctrl;
+
+  Stub(this.ctrl);
+
+  /// This is a convenience method that simply forwards to ctrl.close().
+  /// If a Mojo interface has a method 'close', its name will be mangled to be
+  /// 'close_'.
+  Future close({bool immediate: false}) => ctrl.close(immediate: immediate);
+
+  /// This getter and setter pair is for convenience and simply forwards to
+  /// ctrl.impl. If a Mojo interface has a method 'close', its name will be
+  /// mangled to be 'impl_'.
+  T get impl => ctrl.impl;
+  set impl(T impl) {
+    ctrl.impl = impl;
+  }
+}
+
+abstract class StubMessageHandler extends core.MojoEventHandler {
   int _outstandingResponseFutures = 0;
   bool _isClosing = false;
   Completer _closeCompleter;
 
-  Stub.fromEndpoint(core.MojoMessagePipeEndpoint endpoint,
-                    {bool autoBegin: true})
+  StubMessageHandler.fromEndpoint(core.MojoMessagePipeEndpoint endpoint,
+                                  {bool autoBegin: true})
       : super.fromEndpoint(endpoint, autoBegin: autoBegin);
 
-  Stub.fromHandle(core.MojoHandle handle, {bool autoBegin: true})
+  StubMessageHandler.fromHandle(core.MojoHandle handle, {bool autoBegin: true})
       : super.fromHandle(handle, autoBegin: autoBegin);
 
-  Stub.unbound() : super.unbound();
+  StubMessageHandler.unbound() : super.unbound();
 
+  /// Generated StubControl classes implement this method to route messages to
+  /// the correct implementation method.
   dynamic handleMessage(ServiceMessage message);
 
+  /// Generated StubControl classes implement this getter to return the version
+  /// of the mojom interface for which the bindings are generated.
+  int get version;
+
+  @override
   void handleRead() {
     var result = endpoint.queryAndRead();
     if ((result.data == null) || (result.dataLength == 0)) {
@@ -64,29 +103,7 @@
     }
   }
 
-  void _sendResponse(Message response) {
-    if (isOpen) {
-      endpoint.write(
-          response.buffer, response.buffer.lengthInBytes, response.handles);
-      // FailedPrecondition is only used to indicate that the other end of
-      // the pipe has been closed. We can ignore the close here and wait for
-      // the PeerClosed signal on the event stream.
-      assert((endpoint.status == core.MojoResult.kOk) ||
-          (endpoint.status == core.MojoResult.kFailedPrecondition));
-      if (_isClosing && (_outstandingResponseFutures == 0)) {
-        // This was the final response future for which we needed to send
-        // a response. It is safe to close.
-        super.close().then((_) {
-          if (_isClosing) {
-            _isClosing = false;
-            _closeCompleter.complete(null);
-            _closeCompleter = null;
-          }
-        });
-      }
-    }
-  }
-
+  @override
   void handleWrite() {
     throw 'Unexpected write signal in client.';
   }
@@ -128,15 +145,37 @@
     return response.serializeWithHeader(header);
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "Stub(${superString})";
+    return "StubMessageHandler(${superString})";
   }
 
-  int get version;
-
   /// Returns a service description, which exposes the mojom type information
   /// of the service being stubbed.
   /// Note: The description is null or incomplete if type info is unavailable.
   service_describer.ServiceDescription get description => null;
+
+  void _sendResponse(Message response) {
+    if (isOpen) {
+      endpoint.write(
+          response.buffer, response.buffer.lengthInBytes, response.handles);
+      // FailedPrecondition is only used to indicate that the other end of
+      // the pipe has been closed. We can ignore the close here and wait for
+      // the PeerClosed signal on the event stream.
+      assert((endpoint.status == core.MojoResult.kOk) ||
+          (endpoint.status == core.MojoResult.kFailedPrecondition));
+      if (_isClosing && (_outstandingResponseFutures == 0)) {
+        // This was the final response future for which we needed to send
+        // a response. It is safe to close.
+        super.close().then((_) {
+          if (_isClosing) {
+            _isClosing = false;
+            _closeCompleter.complete(null);
+            _closeCompleter = null;
+          }
+        });
+      }
+    }
+  }
 }
diff --git a/mojo/dart/packages/mojo_services/lib/activity/activity.mojom.dart b/mojo/dart/packages/mojo_services/lib/activity/activity.mojom.dart
index 7c93b28..8a05850 100644
--- a/mojo/dart/packages/mojo_services/lib/activity/activity.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/activity/activity.mojom.dart
@@ -1689,9 +1689,9 @@
   void setRequestedOrientation(ScreenOrientation orientation);
 }
 
-
-class _ActivityProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ActivityProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ActivityProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1705,7 +1705,6 @@
 
   String get serviceName => Activity.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1722,9 +1721,9 @@
   }
 }
 
-
-class ActivityProxy extends bindings.Proxy
-                              implements Activity {
+class ActivityProxy
+    extends bindings.Proxy
+    implements Activity {
   ActivityProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ActivityProxyControl.fromEndpoint(endpoint));
@@ -1810,29 +1809,24 @@
   }
 }
 
-
-class ActivityStub extends bindings.Stub {
+class _ActivityStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Activity> {
   Activity _impl;
 
-  ActivityStub.fromEndpoint(
+  _ActivityStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Activity impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ActivityStub.fromHandle(
+  _ActivityStubControl.fromHandle(
       core.MojoHandle handle, [Activity impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ActivityStub.unbound([this._impl]) : super.unbound();
-
-  static ActivityStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ActivityStub"));
-    return new ActivityStub.fromEndpoint(endpoint);
-  }
+  _ActivityStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -1900,9 +1894,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ActivityStub($superString)";
+    return "_ActivityStubControl($superString)";
   }
 
   int get version => 0;
@@ -1916,6 +1911,50 @@
   }
 }
 
+class ActivityStub
+    extends bindings.Stub<Activity>
+    implements Activity {
+  ActivityStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Activity impl])
+      : super(new _ActivityStubControl.fromEndpoint(endpoint, impl));
+
+  ActivityStub.fromHandle(
+      core.MojoHandle handle, [Activity impl])
+      : super(new _ActivityStubControl.fromHandle(handle, impl));
+
+  ActivityStub.unbound([Activity impl])
+      : super(new _ActivityStubControl.unbound(impl));
+
+  static ActivityStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ActivityStub"));
+    return new ActivityStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ActivityStubControl.serviceDescription;
+
+
+  void getUserFeedback(Object userFeedback) {
+    return impl.getUserFeedback(userFeedback);
+  }
+  void startActivity(Intent intent) {
+    return impl.startActivity(intent);
+  }
+  void finishCurrentActivity() {
+    return impl.finishCurrentActivity();
+  }
+  void setTaskDescription(TaskDescription description) {
+    return impl.setTaskDescription(description);
+  }
+  void setSystemUiVisibility(SystemUiVisibility visibility) {
+    return impl.setSystemUiVisibility(visibility);
+  }
+  void setRequestedOrientation(ScreenOrientation orientation) {
+    return impl.setRequestedOrientation(orientation);
+  }
+}
+
 const int _pathServiceMethodGetAppDataDirName = 0;
 const int _pathServiceMethodGetFilesDirName = 1;
 const int _pathServiceMethodGetCacheDirName = 2;
@@ -1938,9 +1977,9 @@
   dynamic getCacheDir([Function responseFactory = null]);
 }
 
-
-class _PathServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _PathServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _PathServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1954,7 +1993,6 @@
 
   String get serviceName => PathService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _pathServiceMethodGetAppDataDirName:
@@ -2031,9 +2069,9 @@
   }
 }
 
-
-class PathServiceProxy extends bindings.Proxy
-                              implements PathService {
+class PathServiceProxy
+    extends bindings.Proxy
+    implements PathService {
   PathServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _PathServiceProxyControl.fromEndpoint(endpoint));
@@ -2084,29 +2122,24 @@
   }
 }
 
-
-class PathServiceStub extends bindings.Stub {
+class _PathServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<PathService> {
   PathService _impl;
 
-  PathServiceStub.fromEndpoint(
+  _PathServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [PathService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  PathServiceStub.fromHandle(
+  _PathServiceStubControl.fromHandle(
       core.MojoHandle handle, [PathService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  PathServiceStub.unbound([this._impl]) : super.unbound();
-
-  static PathServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For PathServiceStub"));
-    return new PathServiceStub.fromEndpoint(endpoint);
-  }
+  _PathServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
   PathServiceGetAppDataDirResponseParams _pathServiceGetAppDataDirResponseParamsFactory(String path) {
@@ -2221,9 +2254,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "PathServiceStub($superString)";
+    return "_PathServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -2237,6 +2271,41 @@
   }
 }
 
+class PathServiceStub
+    extends bindings.Stub<PathService>
+    implements PathService {
+  PathServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [PathService impl])
+      : super(new _PathServiceStubControl.fromEndpoint(endpoint, impl));
+
+  PathServiceStub.fromHandle(
+      core.MojoHandle handle, [PathService impl])
+      : super(new _PathServiceStubControl.fromHandle(handle, impl));
+
+  PathServiceStub.unbound([PathService impl])
+      : super(new _PathServiceStubControl.unbound(impl));
+
+  static PathServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PathServiceStub"));
+    return new PathServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _PathServiceStubControl.serviceDescription;
+
+
+  dynamic getAppDataDir([Function responseFactory = null]) {
+    return impl.getAppDataDir(responseFactory);
+  }
+  dynamic getFilesDir([Function responseFactory = null]) {
+    return impl.getFilesDir(responseFactory);
+  }
+  dynamic getCacheDir([Function responseFactory = null]) {
+    return impl.getCacheDir(responseFactory);
+  }
+}
+
 const int _userFeedbackMethodPerformHapticFeedbackName = 0;
 const int _userFeedbackMethodPerformAuralFeedbackName = 1;
 
@@ -2257,9 +2326,9 @@
   void performAuralFeedback(AuralFeedbackType type);
 }
 
-
-class _UserFeedbackProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _UserFeedbackProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _UserFeedbackProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -2273,7 +2342,6 @@
 
   String get serviceName => UserFeedback.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -2290,9 +2358,9 @@
   }
 }
 
-
-class UserFeedbackProxy extends bindings.Proxy
-                              implements UserFeedback {
+class UserFeedbackProxy
+    extends bindings.Proxy
+    implements UserFeedback {
   UserFeedbackProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _UserFeedbackProxyControl.fromEndpoint(endpoint));
@@ -2339,29 +2407,24 @@
   }
 }
 
-
-class UserFeedbackStub extends bindings.Stub {
+class _UserFeedbackStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<UserFeedback> {
   UserFeedback _impl;
 
-  UserFeedbackStub.fromEndpoint(
+  _UserFeedbackStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [UserFeedback impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UserFeedbackStub.fromHandle(
+  _UserFeedbackStubControl.fromHandle(
       core.MojoHandle handle, [UserFeedback impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UserFeedbackStub.unbound([this._impl]) : super.unbound();
-
-  static UserFeedbackStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UserFeedbackStub"));
-    return new UserFeedbackStub.fromEndpoint(endpoint);
-  }
+  _UserFeedbackStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -2411,9 +2474,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "UserFeedbackStub($superString)";
+    return "_UserFeedbackStubControl($superString)";
   }
 
   int get version => 0;
@@ -2427,5 +2491,37 @@
   }
 }
 
+class UserFeedbackStub
+    extends bindings.Stub<UserFeedback>
+    implements UserFeedback {
+  UserFeedbackStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [UserFeedback impl])
+      : super(new _UserFeedbackStubControl.fromEndpoint(endpoint, impl));
+
+  UserFeedbackStub.fromHandle(
+      core.MojoHandle handle, [UserFeedback impl])
+      : super(new _UserFeedbackStubControl.fromHandle(handle, impl));
+
+  UserFeedbackStub.unbound([UserFeedback impl])
+      : super(new _UserFeedbackStubControl.unbound(impl));
+
+  static UserFeedbackStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UserFeedbackStub"));
+    return new UserFeedbackStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _UserFeedbackStubControl.serviceDescription;
+
+
+  void performHapticFeedback(HapticFeedbackType type) {
+    return impl.performHapticFeedback(type);
+  }
+  void performAuralFeedback(AuralFeedbackType type) {
+    return impl.performAuralFeedback(type);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/authentication/authentication.mojom.dart b/mojo/dart/packages/mojo_services/lib/authentication/authentication.mojom.dart
index 7aea7ff..6692be8 100644
--- a/mojo/dart/packages/mojo_services/lib/authentication/authentication.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/authentication/authentication.mojom.dart
@@ -811,9 +811,9 @@
   dynamic addAccount(String deviceCode,[Function responseFactory = null]);
 }
 
-
-class _AuthenticationServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _AuthenticationServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _AuthenticationServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -827,7 +827,6 @@
 
   String get serviceName => AuthenticationService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _authenticationServiceMethodSelectAccountName:
@@ -924,9 +923,9 @@
   }
 }
 
-
-class AuthenticationServiceProxy extends bindings.Proxy
-                              implements AuthenticationService {
+class AuthenticationServiceProxy
+    extends bindings.Proxy
+    implements AuthenticationService {
   AuthenticationServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _AuthenticationServiceProxyControl.fromEndpoint(endpoint));
@@ -1000,29 +999,24 @@
   }
 }
 
-
-class AuthenticationServiceStub extends bindings.Stub {
+class _AuthenticationServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<AuthenticationService> {
   AuthenticationService _impl;
 
-  AuthenticationServiceStub.fromEndpoint(
+  _AuthenticationServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [AuthenticationService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AuthenticationServiceStub.fromHandle(
+  _AuthenticationServiceStubControl.fromHandle(
       core.MojoHandle handle, [AuthenticationService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AuthenticationServiceStub.unbound([this._impl]) : super.unbound();
-
-  static AuthenticationServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AuthenticationServiceStub"));
-    return new AuthenticationServiceStub.fromEndpoint(endpoint);
-  }
+  _AuthenticationServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
   AuthenticationServiceSelectAccountResponseParams _authenticationServiceSelectAccountResponseParamsFactory(String username, String error) {
@@ -1181,9 +1175,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "AuthenticationServiceStub($superString)";
+    return "_AuthenticationServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -1197,5 +1192,46 @@
   }
 }
 
+class AuthenticationServiceStub
+    extends bindings.Stub<AuthenticationService>
+    implements AuthenticationService {
+  AuthenticationServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [AuthenticationService impl])
+      : super(new _AuthenticationServiceStubControl.fromEndpoint(endpoint, impl));
+
+  AuthenticationServiceStub.fromHandle(
+      core.MojoHandle handle, [AuthenticationService impl])
+      : super(new _AuthenticationServiceStubControl.fromHandle(handle, impl));
+
+  AuthenticationServiceStub.unbound([AuthenticationService impl])
+      : super(new _AuthenticationServiceStubControl.unbound(impl));
+
+  static AuthenticationServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AuthenticationServiceStub"));
+    return new AuthenticationServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _AuthenticationServiceStubControl.serviceDescription;
+
+
+  dynamic selectAccount(bool returnLastSelected,[Function responseFactory = null]) {
+    return impl.selectAccount(returnLastSelected,responseFactory);
+  }
+  dynamic getOAuth2Token(String username,List<String> scopes,[Function responseFactory = null]) {
+    return impl.getOAuth2Token(username,scopes,responseFactory);
+  }
+  void clearOAuth2Token(String token) {
+    return impl.clearOAuth2Token(token);
+  }
+  dynamic getOAuth2DeviceCode(List<String> scopes,[Function responseFactory = null]) {
+    return impl.getOAuth2DeviceCode(scopes,responseFactory);
+  }
+  dynamic addAccount(String deviceCode,[Function responseFactory = null]) {
+    return impl.addAccount(deviceCode,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/contacts/contacts.mojom.dart b/mojo/dart/packages/mojo_services/lib/contacts/contacts.mojom.dart
index 398eb08..a806606 100644
--- a/mojo/dart/packages/mojo_services/lib/contacts/contacts.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/contacts/contacts.mojom.dart
@@ -768,9 +768,9 @@
   dynamic getPhoto(int id,bool highResolution,[Function responseFactory = null]);
 }
 
-
-class _ContactsServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ContactsServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ContactsServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -784,7 +784,6 @@
 
   String get serviceName => ContactsService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _contactsServiceMethodGetCountName:
@@ -881,9 +880,9 @@
   }
 }
 
-
-class ContactsServiceProxy extends bindings.Proxy
-                              implements ContactsService {
+class ContactsServiceProxy
+    extends bindings.Proxy
+    implements ContactsService {
   ContactsServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ContactsServiceProxyControl.fromEndpoint(endpoint));
@@ -949,29 +948,24 @@
   }
 }
 
-
-class ContactsServiceStub extends bindings.Stub {
+class _ContactsServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ContactsService> {
   ContactsService _impl;
 
-  ContactsServiceStub.fromEndpoint(
+  _ContactsServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ContactsService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ContactsServiceStub.fromHandle(
+  _ContactsServiceStubControl.fromHandle(
       core.MojoHandle handle, [ContactsService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ContactsServiceStub.unbound([this._impl]) : super.unbound();
-
-  static ContactsServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ContactsServiceStub"));
-    return new ContactsServiceStub.fromEndpoint(endpoint);
-  }
+  _ContactsServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
   ContactsServiceGetCountResponseParams _contactsServiceGetCountResponseParamsFactory(int count) {
@@ -1119,9 +1113,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ContactsServiceStub($superString)";
+    return "_ContactsServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -1135,5 +1130,43 @@
   }
 }
 
+class ContactsServiceStub
+    extends bindings.Stub<ContactsService>
+    implements ContactsService {
+  ContactsServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ContactsService impl])
+      : super(new _ContactsServiceStubControl.fromEndpoint(endpoint, impl));
+
+  ContactsServiceStub.fromHandle(
+      core.MojoHandle handle, [ContactsService impl])
+      : super(new _ContactsServiceStubControl.fromHandle(handle, impl));
+
+  ContactsServiceStub.unbound([ContactsService impl])
+      : super(new _ContactsServiceStubControl.unbound(impl));
+
+  static ContactsServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ContactsServiceStub"));
+    return new ContactsServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ContactsServiceStubControl.serviceDescription;
+
+
+  dynamic getCount(String filter,[Function responseFactory = null]) {
+    return impl.getCount(filter,responseFactory);
+  }
+  dynamic get(String filter,int offset,int limit,[Function responseFactory = null]) {
+    return impl.get(filter,offset,limit,responseFactory);
+  }
+  dynamic getEmails(int id,[Function responseFactory = null]) {
+    return impl.getEmails(id,responseFactory);
+  }
+  dynamic getPhoto(int id,bool highResolution,[Function responseFactory = null]) {
+    return impl.getPhoto(id,highResolution,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/http_server/http_server.mojom.dart b/mojo/dart/packages/mojo_services/lib/http_server/http_server.mojom.dart
index 290846c..576abeb 100644
--- a/mojo/dart/packages/mojo_services/lib/http_server/http_server.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/http_server/http_server.mojom.dart
@@ -461,9 +461,9 @@
   dynamic getPort([Function responseFactory = null]);
 }
 
-
-class _HttpServerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _HttpServerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _HttpServerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -477,7 +477,6 @@
 
   String get serviceName => HttpServer.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _httpServerMethodSetHandlerName:
@@ -534,9 +533,9 @@
   }
 }
 
-
-class HttpServerProxy extends bindings.Proxy
-                              implements HttpServer {
+class HttpServerProxy
+    extends bindings.Proxy
+    implements HttpServer {
   HttpServerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _HttpServerProxyControl.fromEndpoint(endpoint));
@@ -581,29 +580,24 @@
   }
 }
 
-
-class HttpServerStub extends bindings.Stub {
+class _HttpServerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<HttpServer> {
   HttpServer _impl;
 
-  HttpServerStub.fromEndpoint(
+  _HttpServerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [HttpServer impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpServerStub.fromHandle(
+  _HttpServerStubControl.fromHandle(
       core.MojoHandle handle, [HttpServer impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpServerStub.unbound([this._impl]) : super.unbound();
-
-  static HttpServerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpServerStub"));
-    return new HttpServerStub.fromEndpoint(endpoint);
-  }
+  _HttpServerStubControl.unbound([this._impl]) : super.unbound();
 
 
   HttpServerSetHandlerResponseParams _httpServerSetHandlerResponseParamsFactory(bool success) {
@@ -695,9 +689,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "HttpServerStub($superString)";
+    return "_HttpServerStubControl($superString)";
   }
 
   int get version => 0;
@@ -711,6 +706,38 @@
   }
 }
 
+class HttpServerStub
+    extends bindings.Stub<HttpServer>
+    implements HttpServer {
+  HttpServerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [HttpServer impl])
+      : super(new _HttpServerStubControl.fromEndpoint(endpoint, impl));
+
+  HttpServerStub.fromHandle(
+      core.MojoHandle handle, [HttpServer impl])
+      : super(new _HttpServerStubControl.fromHandle(handle, impl));
+
+  HttpServerStub.unbound([HttpServer impl])
+      : super(new _HttpServerStubControl.unbound(impl));
+
+  static HttpServerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerStub"));
+    return new HttpServerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _HttpServerStubControl.serviceDescription;
+
+
+  dynamic setHandler(String pattern,Object handler,[Function responseFactory = null]) {
+    return impl.setHandler(pattern,handler,responseFactory);
+  }
+  dynamic getPort([Function responseFactory = null]) {
+    return impl.getPort(responseFactory);
+  }
+}
+
 const int _httpHandlerMethodHandleRequestName = 0;
 
 class _HttpHandlerServiceDescription implements service_describer.ServiceDescription {
@@ -729,9 +756,9 @@
   dynamic handleRequest(http_request_mojom.HttpRequest request,[Function responseFactory = null]);
 }
 
-
-class _HttpHandlerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _HttpHandlerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _HttpHandlerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -745,7 +772,6 @@
 
   String get serviceName => HttpHandler.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _httpHandlerMethodHandleRequestName:
@@ -782,9 +808,9 @@
   }
 }
 
-
-class HttpHandlerProxy extends bindings.Proxy
-                              implements HttpHandler {
+class HttpHandlerProxy
+    extends bindings.Proxy
+    implements HttpHandler {
   HttpHandlerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _HttpHandlerProxyControl.fromEndpoint(endpoint));
@@ -820,29 +846,24 @@
   }
 }
 
-
-class HttpHandlerStub extends bindings.Stub {
+class _HttpHandlerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<HttpHandler> {
   HttpHandler _impl;
 
-  HttpHandlerStub.fromEndpoint(
+  _HttpHandlerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [HttpHandler impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpHandlerStub.fromHandle(
+  _HttpHandlerStubControl.fromHandle(
       core.MojoHandle handle, [HttpHandler impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpHandlerStub.unbound([this._impl]) : super.unbound();
-
-  static HttpHandlerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpHandlerStub"));
-    return new HttpHandlerStub.fromEndpoint(endpoint);
-  }
+  _HttpHandlerStubControl.unbound([this._impl]) : super.unbound();
 
 
   HttpHandlerHandleRequestResponseParams _httpHandlerHandleRequestResponseParamsFactory(http_response_mojom.HttpResponse response) {
@@ -909,9 +930,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "HttpHandlerStub($superString)";
+    return "_HttpHandlerStubControl($superString)";
   }
 
   int get version => 0;
@@ -925,5 +947,34 @@
   }
 }
 
+class HttpHandlerStub
+    extends bindings.Stub<HttpHandler>
+    implements HttpHandler {
+  HttpHandlerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [HttpHandler impl])
+      : super(new _HttpHandlerStubControl.fromEndpoint(endpoint, impl));
+
+  HttpHandlerStub.fromHandle(
+      core.MojoHandle handle, [HttpHandler impl])
+      : super(new _HttpHandlerStubControl.fromHandle(handle, impl));
+
+  HttpHandlerStub.unbound([HttpHandler impl])
+      : super(new _HttpHandlerStubControl.unbound(impl));
+
+  static HttpHandlerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpHandlerStub"));
+    return new HttpHandlerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _HttpHandlerStubControl.serviceDescription;
+
+
+  dynamic handleRequest(http_request_mojom.HttpRequest request,[Function responseFactory = null]) {
+    return impl.handleRequest(request,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/http_server/http_server_factory.mojom.dart b/mojo/dart/packages/mojo_services/lib/http_server/http_server_factory.mojom.dart
index fd0b2d2..0c3f234 100644
--- a/mojo/dart/packages/mojo_services/lib/http_server/http_server_factory.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/http_server/http_server_factory.mojom.dart
@@ -114,9 +114,9 @@
   void createHttpServer(Object serverRequest, net_address_mojom.NetAddress localAddress);
 }
 
-
-class _HttpServerFactoryProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _HttpServerFactoryProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _HttpServerFactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -130,7 +130,6 @@
 
   String get serviceName => HttpServerFactory.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -147,9 +146,9 @@
   }
 }
 
-
-class HttpServerFactoryProxy extends bindings.Proxy
-                              implements HttpServerFactory {
+class HttpServerFactoryProxy
+    extends bindings.Proxy
+    implements HttpServerFactory {
   HttpServerFactoryProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _HttpServerFactoryProxyControl.fromEndpoint(endpoint));
@@ -187,29 +186,24 @@
   }
 }
 
-
-class HttpServerFactoryStub extends bindings.Stub {
+class _HttpServerFactoryStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<HttpServerFactory> {
   HttpServerFactory _impl;
 
-  HttpServerFactoryStub.fromEndpoint(
+  _HttpServerFactoryStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [HttpServerFactory impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpServerFactoryStub.fromHandle(
+  _HttpServerFactoryStubControl.fromHandle(
       core.MojoHandle handle, [HttpServerFactory impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpServerFactoryStub.unbound([this._impl]) : super.unbound();
-
-  static HttpServerFactoryStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpServerFactoryStub"));
-    return new HttpServerFactoryStub.fromEndpoint(endpoint);
-  }
+  _HttpServerFactoryStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -254,9 +248,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "HttpServerFactoryStub($superString)";
+    return "_HttpServerFactoryStubControl($superString)";
   }
 
   int get version => 0;
@@ -270,5 +265,34 @@
   }
 }
 
+class HttpServerFactoryStub
+    extends bindings.Stub<HttpServerFactory>
+    implements HttpServerFactory {
+  HttpServerFactoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [HttpServerFactory impl])
+      : super(new _HttpServerFactoryStubControl.fromEndpoint(endpoint, impl));
+
+  HttpServerFactoryStub.fromHandle(
+      core.MojoHandle handle, [HttpServerFactory impl])
+      : super(new _HttpServerFactoryStubControl.fromHandle(handle, impl));
+
+  HttpServerFactoryStub.unbound([HttpServerFactory impl])
+      : super(new _HttpServerFactoryStubControl.unbound(impl));
+
+  static HttpServerFactoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerFactoryStub"));
+    return new HttpServerFactoryStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _HttpServerFactoryStubControl.serviceDescription;
+
+
+  void createHttpServer(Object serverRequest, net_address_mojom.NetAddress localAddress) {
+    return impl.createHttpServer(serverRequest, localAddress);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/icu_data/icu_data.mojom.dart b/mojo/dart/packages/mojo_services/lib/icu_data/icu_data.mojom.dart
index f5766f7..2e67a73 100644
--- a/mojo/dart/packages/mojo_services/lib/icu_data/icu_data.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/icu_data/icu_data.mojom.dart
@@ -170,9 +170,9 @@
   dynamic map(String sha1hash,[Function responseFactory = null]);
 }
 
-
-class _IcuDataProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _IcuDataProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _IcuDataProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -186,7 +186,6 @@
 
   String get serviceName => IcuData.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _icuDataMethodMapName:
@@ -223,9 +222,9 @@
   }
 }
 
-
-class IcuDataProxy extends bindings.Proxy
-                              implements IcuData {
+class IcuDataProxy
+    extends bindings.Proxy
+    implements IcuData {
   IcuDataProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _IcuDataProxyControl.fromEndpoint(endpoint));
@@ -261,29 +260,24 @@
   }
 }
 
-
-class IcuDataStub extends bindings.Stub {
+class _IcuDataStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<IcuData> {
   IcuData _impl;
 
-  IcuDataStub.fromEndpoint(
+  _IcuDataStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [IcuData impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  IcuDataStub.fromHandle(
+  _IcuDataStubControl.fromHandle(
       core.MojoHandle handle, [IcuData impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  IcuDataStub.unbound([this._impl]) : super.unbound();
-
-  static IcuDataStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For IcuDataStub"));
-    return new IcuDataStub.fromEndpoint(endpoint);
-  }
+  _IcuDataStubControl.unbound([this._impl]) : super.unbound();
 
 
   IcuDataMapResponseParams _icuDataMapResponseParamsFactory(core.MojoSharedBuffer icuData) {
@@ -350,9 +344,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "IcuDataStub($superString)";
+    return "_IcuDataStubControl($superString)";
   }
 
   int get version => 0;
@@ -366,5 +361,34 @@
   }
 }
 
+class IcuDataStub
+    extends bindings.Stub<IcuData>
+    implements IcuData {
+  IcuDataStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [IcuData impl])
+      : super(new _IcuDataStubControl.fromEndpoint(endpoint, impl));
+
+  IcuDataStub.fromHandle(
+      core.MojoHandle handle, [IcuData impl])
+      : super(new _IcuDataStubControl.fromHandle(handle, impl));
+
+  IcuDataStub.unbound([IcuData impl])
+      : super(new _IcuDataStubControl.unbound(impl));
+
+  static IcuDataStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For IcuDataStub"));
+    return new IcuDataStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _IcuDataStubControl.serviceDescription;
+
+
+  dynamic map(String sha1hash,[Function responseFactory = null]) {
+    return impl.map(sha1hash,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/input/input.mojom.dart b/mojo/dart/packages/mojo_services/lib/input/input.mojom.dart
index 3bf43d9..337451c 100644
--- a/mojo/dart/packages/mojo_services/lib/input/input.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/input/input.mojom.dart
@@ -214,9 +214,9 @@
   dynamic onBackButton([Function responseFactory = null]);
 }
 
-
-class _InputClientProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _InputClientProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _InputClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -230,7 +230,6 @@
 
   String get serviceName => InputClient.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _inputClientMethodOnBackButtonName:
@@ -267,9 +266,9 @@
   }
 }
 
-
-class InputClientProxy extends bindings.Proxy
-                              implements InputClient {
+class InputClientProxy
+    extends bindings.Proxy
+    implements InputClient {
   InputClientProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _InputClientProxyControl.fromEndpoint(endpoint));
@@ -304,29 +303,24 @@
   }
 }
 
-
-class InputClientStub extends bindings.Stub {
+class _InputClientStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<InputClient> {
   InputClient _impl;
 
-  InputClientStub.fromEndpoint(
+  _InputClientStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [InputClient impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InputClientStub.fromHandle(
+  _InputClientStubControl.fromHandle(
       core.MojoHandle handle, [InputClient impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InputClientStub.unbound([this._impl]) : super.unbound();
-
-  static InputClientStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InputClientStub"));
-    return new InputClientStub.fromEndpoint(endpoint);
-  }
+  _InputClientStubControl.unbound([this._impl]) : super.unbound();
 
 
   InputClientOnBackButtonResponseParams _inputClientOnBackButtonResponseParamsFactory() {
@@ -390,9 +384,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "InputClientStub($superString)";
+    return "_InputClientStubControl($superString)";
   }
 
   int get version => 0;
@@ -406,6 +401,35 @@
   }
 }
 
+class InputClientStub
+    extends bindings.Stub<InputClient>
+    implements InputClient {
+  InputClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [InputClient impl])
+      : super(new _InputClientStubControl.fromEndpoint(endpoint, impl));
+
+  InputClientStub.fromHandle(
+      core.MojoHandle handle, [InputClient impl])
+      : super(new _InputClientStubControl.fromHandle(handle, impl));
+
+  InputClientStub.unbound([InputClient impl])
+      : super(new _InputClientStubControl.unbound(impl));
+
+  static InputClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputClientStub"));
+    return new InputClientStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _InputClientStubControl.serviceDescription;
+
+
+  dynamic onBackButton([Function responseFactory = null]) {
+    return impl.onBackButton(responseFactory);
+  }
+}
+
 const int _inputServiceMethodSetClientName = 0;
 
 class _InputServiceServiceDescription implements service_describer.ServiceDescription {
@@ -424,9 +448,9 @@
   void setClient(Object client);
 }
 
-
-class _InputServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _InputServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _InputServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -440,7 +464,6 @@
 
   String get serviceName => InputService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -457,9 +480,9 @@
   }
 }
 
-
-class InputServiceProxy extends bindings.Proxy
-                              implements InputService {
+class InputServiceProxy
+    extends bindings.Proxy
+    implements InputService {
   InputServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _InputServiceProxyControl.fromEndpoint(endpoint));
@@ -496,29 +519,24 @@
   }
 }
 
-
-class InputServiceStub extends bindings.Stub {
+class _InputServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<InputService> {
   InputService _impl;
 
-  InputServiceStub.fromEndpoint(
+  _InputServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [InputService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InputServiceStub.fromHandle(
+  _InputServiceStubControl.fromHandle(
       core.MojoHandle handle, [InputService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InputServiceStub.unbound([this._impl]) : super.unbound();
-
-  static InputServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InputServiceStub"));
-    return new InputServiceStub.fromEndpoint(endpoint);
-  }
+  _InputServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -563,9 +581,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "InputServiceStub($superString)";
+    return "_InputServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -579,5 +598,34 @@
   }
 }
 
+class InputServiceStub
+    extends bindings.Stub<InputService>
+    implements InputService {
+  InputServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [InputService impl])
+      : super(new _InputServiceStubControl.fromEndpoint(endpoint, impl));
+
+  InputServiceStub.fromHandle(
+      core.MojoHandle handle, [InputService impl])
+      : super(new _InputServiceStubControl.fromHandle(handle, impl));
+
+  InputServiceStub.unbound([InputService impl])
+      : super(new _InputServiceStubControl.unbound(impl));
+
+  static InputServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputServiceStub"));
+    return new InputServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _InputServiceStubControl.serviceDescription;
+
+
+  void setClient(Object client) {
+    return impl.setClient(client);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/keyboard/keyboard.mojom.dart b/mojo/dart/packages/mojo_services/lib/keyboard/keyboard.mojom.dart
index 6f547c5..0dc03ad 100644
--- a/mojo/dart/packages/mojo_services/lib/keyboard/keyboard.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/keyboard/keyboard.mojom.dart
@@ -1465,9 +1465,9 @@
   void submit(SubmitAction action);
 }
 
-
-class _KeyboardClientProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _KeyboardClientProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _KeyboardClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1481,7 +1481,6 @@
 
   String get serviceName => KeyboardClient.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1498,9 +1497,9 @@
   }
 }
 
-
-class KeyboardClientProxy extends bindings.Proxy
-                              implements KeyboardClient {
+class KeyboardClientProxy
+    extends bindings.Proxy
+    implements KeyboardClient {
   KeyboardClientProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _KeyboardClientProxyControl.fromEndpoint(endpoint));
@@ -1612,29 +1611,24 @@
   }
 }
 
-
-class KeyboardClientStub extends bindings.Stub {
+class _KeyboardClientStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<KeyboardClient> {
   KeyboardClient _impl;
 
-  KeyboardClientStub.fromEndpoint(
+  _KeyboardClientStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [KeyboardClient impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  KeyboardClientStub.fromHandle(
+  _KeyboardClientStubControl.fromHandle(
       core.MojoHandle handle, [KeyboardClient impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  KeyboardClientStub.unbound([this._impl]) : super.unbound();
-
-  static KeyboardClientStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For KeyboardClientStub"));
-    return new KeyboardClientStub.fromEndpoint(endpoint);
-  }
+  _KeyboardClientStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -1714,9 +1708,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "KeyboardClientStub($superString)";
+    return "_KeyboardClientStubControl($superString)";
   }
 
   int get version => 0;
@@ -1730,6 +1725,56 @@
   }
 }
 
+class KeyboardClientStub
+    extends bindings.Stub<KeyboardClient>
+    implements KeyboardClient {
+  KeyboardClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [KeyboardClient impl])
+      : super(new _KeyboardClientStubControl.fromEndpoint(endpoint, impl));
+
+  KeyboardClientStub.fromHandle(
+      core.MojoHandle handle, [KeyboardClient impl])
+      : super(new _KeyboardClientStubControl.fromHandle(handle, impl));
+
+  KeyboardClientStub.unbound([KeyboardClient impl])
+      : super(new _KeyboardClientStubControl.unbound(impl));
+
+  static KeyboardClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For KeyboardClientStub"));
+    return new KeyboardClientStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _KeyboardClientStubControl.serviceDescription;
+
+
+  void commitCompletion(CompletionData completion) {
+    return impl.commitCompletion(completion);
+  }
+  void commitCorrection(CorrectionData correction) {
+    return impl.commitCorrection(correction);
+  }
+  void commitText(String text, int newCursorPosition) {
+    return impl.commitText(text, newCursorPosition);
+  }
+  void deleteSurroundingText(int beforeLength, int afterLength) {
+    return impl.deleteSurroundingText(beforeLength, afterLength);
+  }
+  void setComposingRegion(int start, int end) {
+    return impl.setComposingRegion(start, end);
+  }
+  void setComposingText(String text, int newCursorPosition) {
+    return impl.setComposingText(text, newCursorPosition);
+  }
+  void setSelection(int start, int end) {
+    return impl.setSelection(start, end);
+  }
+  void submit(SubmitAction action) {
+    return impl.submit(action);
+  }
+}
+
 const int _keyboardServiceMethodShowName = 0;
 const int _keyboardServiceMethodShowByRequestName = 1;
 const int _keyboardServiceMethodHideName = 2;
@@ -1756,9 +1801,9 @@
   void setSelection(int start, int end);
 }
 
-
-class _KeyboardServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _KeyboardServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _KeyboardServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1772,7 +1817,6 @@
 
   String get serviceName => KeyboardService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1789,9 +1833,9 @@
   }
 }
 
-
-class KeyboardServiceProxy extends bindings.Proxy
-                              implements KeyboardService {
+class KeyboardServiceProxy
+    extends bindings.Proxy
+    implements KeyboardService {
   KeyboardServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _KeyboardServiceProxyControl.fromEndpoint(endpoint));
@@ -1868,29 +1912,24 @@
   }
 }
 
-
-class KeyboardServiceStub extends bindings.Stub {
+class _KeyboardServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<KeyboardService> {
   KeyboardService _impl;
 
-  KeyboardServiceStub.fromEndpoint(
+  _KeyboardServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [KeyboardService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  KeyboardServiceStub.fromHandle(
+  _KeyboardServiceStubControl.fromHandle(
       core.MojoHandle handle, [KeyboardService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  KeyboardServiceStub.unbound([this._impl]) : super.unbound();
-
-  static KeyboardServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For KeyboardServiceStub"));
-    return new KeyboardServiceStub.fromEndpoint(endpoint);
-  }
+  _KeyboardServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -1951,9 +1990,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "KeyboardServiceStub($superString)";
+    return "_KeyboardServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -1967,6 +2007,47 @@
   }
 }
 
+class KeyboardServiceStub
+    extends bindings.Stub<KeyboardService>
+    implements KeyboardService {
+  KeyboardServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [KeyboardService impl])
+      : super(new _KeyboardServiceStubControl.fromEndpoint(endpoint, impl));
+
+  KeyboardServiceStub.fromHandle(
+      core.MojoHandle handle, [KeyboardService impl])
+      : super(new _KeyboardServiceStubControl.fromHandle(handle, impl));
+
+  KeyboardServiceStub.unbound([KeyboardService impl])
+      : super(new _KeyboardServiceStubControl.unbound(impl));
+
+  static KeyboardServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For KeyboardServiceStub"));
+    return new KeyboardServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _KeyboardServiceStubControl.serviceDescription;
+
+
+  void show(Object client, KeyboardType type) {
+    return impl.show(client, type);
+  }
+  void showByRequest() {
+    return impl.showByRequest();
+  }
+  void hide() {
+    return impl.hide();
+  }
+  void setText(String text) {
+    return impl.setText(text);
+  }
+  void setSelection(int start, int end) {
+    return impl.setSelection(start, end);
+  }
+}
+
 const int _keyboardServiceFactoryMethodCreateKeyboardServiceName = 0;
 
 class _KeyboardServiceFactoryServiceDescription implements service_describer.ServiceDescription {
@@ -1985,9 +2066,9 @@
   void createKeyboardService(Object keyEventDispatcher, Object serviceRequest);
 }
 
-
-class _KeyboardServiceFactoryProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _KeyboardServiceFactoryProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _KeyboardServiceFactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -2001,7 +2082,6 @@
 
   String get serviceName => KeyboardServiceFactory.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -2018,9 +2098,9 @@
   }
 }
 
-
-class KeyboardServiceFactoryProxy extends bindings.Proxy
-                              implements KeyboardServiceFactory {
+class KeyboardServiceFactoryProxy
+    extends bindings.Proxy
+    implements KeyboardServiceFactory {
   KeyboardServiceFactoryProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _KeyboardServiceFactoryProxyControl.fromEndpoint(endpoint));
@@ -2058,29 +2138,24 @@
   }
 }
 
-
-class KeyboardServiceFactoryStub extends bindings.Stub {
+class _KeyboardServiceFactoryStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<KeyboardServiceFactory> {
   KeyboardServiceFactory _impl;
 
-  KeyboardServiceFactoryStub.fromEndpoint(
+  _KeyboardServiceFactoryStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [KeyboardServiceFactory impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  KeyboardServiceFactoryStub.fromHandle(
+  _KeyboardServiceFactoryStubControl.fromHandle(
       core.MojoHandle handle, [KeyboardServiceFactory impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  KeyboardServiceFactoryStub.unbound([this._impl]) : super.unbound();
-
-  static KeyboardServiceFactoryStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For KeyboardServiceFactoryStub"));
-    return new KeyboardServiceFactoryStub.fromEndpoint(endpoint);
-  }
+  _KeyboardServiceFactoryStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -2125,9 +2200,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "KeyboardServiceFactoryStub($superString)";
+    return "_KeyboardServiceFactoryStubControl($superString)";
   }
 
   int get version => 0;
@@ -2141,5 +2217,34 @@
   }
 }
 
+class KeyboardServiceFactoryStub
+    extends bindings.Stub<KeyboardServiceFactory>
+    implements KeyboardServiceFactory {
+  KeyboardServiceFactoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [KeyboardServiceFactory impl])
+      : super(new _KeyboardServiceFactoryStubControl.fromEndpoint(endpoint, impl));
+
+  KeyboardServiceFactoryStub.fromHandle(
+      core.MojoHandle handle, [KeyboardServiceFactory impl])
+      : super(new _KeyboardServiceFactoryStubControl.fromHandle(handle, impl));
+
+  KeyboardServiceFactoryStub.unbound([KeyboardServiceFactory impl])
+      : super(new _KeyboardServiceFactoryStubControl.unbound(impl));
+
+  static KeyboardServiceFactoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For KeyboardServiceFactoryStub"));
+    return new KeyboardServiceFactoryStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _KeyboardServiceFactoryStubControl.serviceDescription;
+
+
+  void createKeyboardService(Object keyEventDispatcher, Object serviceRequest) {
+    return impl.createKeyboardService(keyEventDispatcher, serviceRequest);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/asset_bundle/asset_bundle.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/asset_bundle/asset_bundle.mojom.dart
index fc50d4b..b857068 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/asset_bundle/asset_bundle.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/asset_bundle/asset_bundle.mojom.dart
@@ -254,9 +254,9 @@
   dynamic getAsStream(String assetName,[Function responseFactory = null]);
 }
 
-
-class _AssetBundleProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _AssetBundleProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _AssetBundleProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -270,7 +270,6 @@
 
   String get serviceName => AssetBundle.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _assetBundleMethodGetAsStreamName:
@@ -307,9 +306,9 @@
   }
 }
 
-
-class AssetBundleProxy extends bindings.Proxy
-                              implements AssetBundle {
+class AssetBundleProxy
+    extends bindings.Proxy
+    implements AssetBundle {
   AssetBundleProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _AssetBundleProxyControl.fromEndpoint(endpoint));
@@ -345,29 +344,24 @@
   }
 }
 
-
-class AssetBundleStub extends bindings.Stub {
+class _AssetBundleStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<AssetBundle> {
   AssetBundle _impl;
 
-  AssetBundleStub.fromEndpoint(
+  _AssetBundleStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [AssetBundle impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AssetBundleStub.fromHandle(
+  _AssetBundleStubControl.fromHandle(
       core.MojoHandle handle, [AssetBundle impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AssetBundleStub.unbound([this._impl]) : super.unbound();
-
-  static AssetBundleStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AssetBundleStub"));
-    return new AssetBundleStub.fromEndpoint(endpoint);
-  }
+  _AssetBundleStubControl.unbound([this._impl]) : super.unbound();
 
 
   AssetBundleGetAsStreamResponseParams _assetBundleGetAsStreamResponseParamsFactory(core.MojoDataPipeConsumer assetData) {
@@ -434,9 +428,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "AssetBundleStub($superString)";
+    return "_AssetBundleStubControl($superString)";
   }
 
   int get version => 0;
@@ -450,6 +445,35 @@
   }
 }
 
+class AssetBundleStub
+    extends bindings.Stub<AssetBundle>
+    implements AssetBundle {
+  AssetBundleStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [AssetBundle impl])
+      : super(new _AssetBundleStubControl.fromEndpoint(endpoint, impl));
+
+  AssetBundleStub.fromHandle(
+      core.MojoHandle handle, [AssetBundle impl])
+      : super(new _AssetBundleStubControl.fromHandle(handle, impl));
+
+  AssetBundleStub.unbound([AssetBundle impl])
+      : super(new _AssetBundleStubControl.unbound(impl));
+
+  static AssetBundleStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AssetBundleStub"));
+    return new AssetBundleStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _AssetBundleStubControl.serviceDescription;
+
+
+  dynamic getAsStream(String assetName,[Function responseFactory = null]) {
+    return impl.getAsStream(assetName,responseFactory);
+  }
+}
+
 const int _assetUnpackerMethodUnpackZipStreamName = 0;
 
 class _AssetUnpackerServiceDescription implements service_describer.ServiceDescription {
@@ -468,9 +492,9 @@
   void unpackZipStream(core.MojoDataPipeConsumer zippedAssets, Object assetBundle);
 }
 
-
-class _AssetUnpackerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _AssetUnpackerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _AssetUnpackerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -484,7 +508,6 @@
 
   String get serviceName => AssetUnpacker.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -501,9 +524,9 @@
   }
 }
 
-
-class AssetUnpackerProxy extends bindings.Proxy
-                              implements AssetUnpacker {
+class AssetUnpackerProxy
+    extends bindings.Proxy
+    implements AssetUnpacker {
   AssetUnpackerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _AssetUnpackerProxyControl.fromEndpoint(endpoint));
@@ -541,29 +564,24 @@
   }
 }
 
-
-class AssetUnpackerStub extends bindings.Stub {
+class _AssetUnpackerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<AssetUnpacker> {
   AssetUnpacker _impl;
 
-  AssetUnpackerStub.fromEndpoint(
+  _AssetUnpackerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [AssetUnpacker impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AssetUnpackerStub.fromHandle(
+  _AssetUnpackerStubControl.fromHandle(
       core.MojoHandle handle, [AssetUnpacker impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AssetUnpackerStub.unbound([this._impl]) : super.unbound();
-
-  static AssetUnpackerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AssetUnpackerStub"));
-    return new AssetUnpackerStub.fromEndpoint(endpoint);
-  }
+  _AssetUnpackerStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -608,9 +626,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "AssetUnpackerStub($superString)";
+    return "_AssetUnpackerStubControl($superString)";
   }
 
   int get version => 0;
@@ -624,5 +643,34 @@
   }
 }
 
+class AssetUnpackerStub
+    extends bindings.Stub<AssetUnpacker>
+    implements AssetUnpacker {
+  AssetUnpackerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [AssetUnpacker impl])
+      : super(new _AssetUnpackerStubControl.fromEndpoint(endpoint, impl));
+
+  AssetUnpackerStub.fromHandle(
+      core.MojoHandle handle, [AssetUnpacker impl])
+      : super(new _AssetUnpackerStubControl.fromHandle(handle, impl));
+
+  AssetUnpackerStub.unbound([AssetUnpacker impl])
+      : super(new _AssetUnpackerStubControl.unbound(impl));
+
+  static AssetUnpackerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AssetUnpackerStub"));
+    return new AssetUnpackerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _AssetUnpackerStubControl.serviceDescription;
+
+
+  void unpackZipStream(core.MojoDataPipeConsumer zippedAssets, Object assetBundle) {
+    return impl.unpackZipStream(zippedAssets, assetBundle);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/authenticating_url_loader_interceptor_meta_factory.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/authenticating_url_loader_interceptor_meta_factory.mojom.dart
index 1e3d91c..e7ae665 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/authenticating_url_loader_interceptor_meta_factory.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/authenticating_url_loader_interceptor_meta_factory.mojom.dart
@@ -113,9 +113,9 @@
   void createUrlLoaderInterceptorFactory(Object factoryRequest, Object authenticationService);
 }
 
-
-class _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -129,7 +129,6 @@
 
   String get serviceName => AuthenticatingUrlLoaderInterceptorMetaFactory.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -146,9 +145,9 @@
   }
 }
 
-
-class AuthenticatingUrlLoaderInterceptorMetaFactoryProxy extends bindings.Proxy
-                              implements AuthenticatingUrlLoaderInterceptorMetaFactory {
+class AuthenticatingUrlLoaderInterceptorMetaFactoryProxy
+    extends bindings.Proxy
+    implements AuthenticatingUrlLoaderInterceptorMetaFactory {
   AuthenticatingUrlLoaderInterceptorMetaFactoryProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _AuthenticatingUrlLoaderInterceptorMetaFactoryProxyControl.fromEndpoint(endpoint));
@@ -186,29 +185,24 @@
   }
 }
 
-
-class AuthenticatingUrlLoaderInterceptorMetaFactoryStub extends bindings.Stub {
+class _AuthenticatingUrlLoaderInterceptorMetaFactoryStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<AuthenticatingUrlLoaderInterceptorMetaFactory> {
   AuthenticatingUrlLoaderInterceptorMetaFactory _impl;
 
-  AuthenticatingUrlLoaderInterceptorMetaFactoryStub.fromEndpoint(
+  _AuthenticatingUrlLoaderInterceptorMetaFactoryStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [AuthenticatingUrlLoaderInterceptorMetaFactory impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AuthenticatingUrlLoaderInterceptorMetaFactoryStub.fromHandle(
+  _AuthenticatingUrlLoaderInterceptorMetaFactoryStubControl.fromHandle(
       core.MojoHandle handle, [AuthenticatingUrlLoaderInterceptorMetaFactory impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AuthenticatingUrlLoaderInterceptorMetaFactoryStub.unbound([this._impl]) : super.unbound();
-
-  static AuthenticatingUrlLoaderInterceptorMetaFactoryStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AuthenticatingUrlLoaderInterceptorMetaFactoryStub"));
-    return new AuthenticatingUrlLoaderInterceptorMetaFactoryStub.fromEndpoint(endpoint);
-  }
+  _AuthenticatingUrlLoaderInterceptorMetaFactoryStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -253,9 +247,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "AuthenticatingUrlLoaderInterceptorMetaFactoryStub($superString)";
+    return "_AuthenticatingUrlLoaderInterceptorMetaFactoryStubControl($superString)";
   }
 
   int get version => 0;
@@ -269,5 +264,34 @@
   }
 }
 
+class AuthenticatingUrlLoaderInterceptorMetaFactoryStub
+    extends bindings.Stub<AuthenticatingUrlLoaderInterceptorMetaFactory>
+    implements AuthenticatingUrlLoaderInterceptorMetaFactory {
+  AuthenticatingUrlLoaderInterceptorMetaFactoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [AuthenticatingUrlLoaderInterceptorMetaFactory impl])
+      : super(new _AuthenticatingUrlLoaderInterceptorMetaFactoryStubControl.fromEndpoint(endpoint, impl));
+
+  AuthenticatingUrlLoaderInterceptorMetaFactoryStub.fromHandle(
+      core.MojoHandle handle, [AuthenticatingUrlLoaderInterceptorMetaFactory impl])
+      : super(new _AuthenticatingUrlLoaderInterceptorMetaFactoryStubControl.fromHandle(handle, impl));
+
+  AuthenticatingUrlLoaderInterceptorMetaFactoryStub.unbound([AuthenticatingUrlLoaderInterceptorMetaFactory impl])
+      : super(new _AuthenticatingUrlLoaderInterceptorMetaFactoryStubControl.unbound(impl));
+
+  static AuthenticatingUrlLoaderInterceptorMetaFactoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AuthenticatingUrlLoaderInterceptorMetaFactoryStub"));
+    return new AuthenticatingUrlLoaderInterceptorMetaFactoryStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _AuthenticatingUrlLoaderInterceptorMetaFactoryStubControl.serviceDescription;
+
+
+  void createUrlLoaderInterceptorFactory(Object factoryRequest, Object authenticationService) {
+    return impl.createUrlLoaderInterceptorFactory(factoryRequest, authenticationService);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/camera.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/camera.mojom.dart
index a422cbc..dd65cb6 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/camera.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/camera.mojom.dart
@@ -576,9 +576,9 @@
   dynamic getPhoto(int index,[Function responseFactory = null]);
 }
 
-
-class _CameraRollServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _CameraRollServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _CameraRollServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -592,7 +592,6 @@
 
   String get serviceName => CameraRollService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _cameraRollServiceMethodGetCountName:
@@ -649,9 +648,9 @@
   }
 }
 
-
-class CameraRollServiceProxy extends bindings.Proxy
-                              implements CameraRollService {
+class CameraRollServiceProxy
+    extends bindings.Proxy
+    implements CameraRollService {
   CameraRollServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _CameraRollServiceProxyControl.fromEndpoint(endpoint));
@@ -704,29 +703,24 @@
   }
 }
 
-
-class CameraRollServiceStub extends bindings.Stub {
+class _CameraRollServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<CameraRollService> {
   CameraRollService _impl;
 
-  CameraRollServiceStub.fromEndpoint(
+  _CameraRollServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [CameraRollService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CameraRollServiceStub.fromHandle(
+  _CameraRollServiceStubControl.fromHandle(
       core.MojoHandle handle, [CameraRollService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CameraRollServiceStub.unbound([this._impl]) : super.unbound();
-
-  static CameraRollServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CameraRollServiceStub"));
-    return new CameraRollServiceStub.fromEndpoint(endpoint);
-  }
+  _CameraRollServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
   CameraRollServiceGetCountResponseParams _cameraRollServiceGetCountResponseParamsFactory(int numPhotos) {
@@ -821,9 +815,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "CameraRollServiceStub($superString)";
+    return "_CameraRollServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -837,6 +832,41 @@
   }
 }
 
+class CameraRollServiceStub
+    extends bindings.Stub<CameraRollService>
+    implements CameraRollService {
+  CameraRollServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [CameraRollService impl])
+      : super(new _CameraRollServiceStubControl.fromEndpoint(endpoint, impl));
+
+  CameraRollServiceStub.fromHandle(
+      core.MojoHandle handle, [CameraRollService impl])
+      : super(new _CameraRollServiceStubControl.fromHandle(handle, impl));
+
+  CameraRollServiceStub.unbound([CameraRollService impl])
+      : super(new _CameraRollServiceStubControl.unbound(impl));
+
+  static CameraRollServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CameraRollServiceStub"));
+    return new CameraRollServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _CameraRollServiceStubControl.serviceDescription;
+
+
+  void update() {
+    return impl.update();
+  }
+  dynamic getCount([Function responseFactory = null]) {
+    return impl.getCount(responseFactory);
+  }
+  dynamic getPhoto(int index,[Function responseFactory = null]) {
+    return impl.getPhoto(index,responseFactory);
+  }
+}
+
 const int _cameraServiceMethodGetLatestFrameName = 0;
 
 class _CameraServiceServiceDescription implements service_describer.ServiceDescription {
@@ -855,9 +885,9 @@
   dynamic getLatestFrame([Function responseFactory = null]);
 }
 
-
-class _CameraServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _CameraServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _CameraServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -871,7 +901,6 @@
 
   String get serviceName => CameraService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _cameraServiceMethodGetLatestFrameName:
@@ -908,9 +937,9 @@
   }
 }
 
-
-class CameraServiceProxy extends bindings.Proxy
-                              implements CameraService {
+class CameraServiceProxy
+    extends bindings.Proxy
+    implements CameraService {
   CameraServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _CameraServiceProxyControl.fromEndpoint(endpoint));
@@ -945,29 +974,24 @@
   }
 }
 
-
-class CameraServiceStub extends bindings.Stub {
+class _CameraServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<CameraService> {
   CameraService _impl;
 
-  CameraServiceStub.fromEndpoint(
+  _CameraServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [CameraService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CameraServiceStub.fromHandle(
+  _CameraServiceStubControl.fromHandle(
       core.MojoHandle handle, [CameraService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CameraServiceStub.unbound([this._impl]) : super.unbound();
-
-  static CameraServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CameraServiceStub"));
-    return new CameraServiceStub.fromEndpoint(endpoint);
-  }
+  _CameraServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
   CameraServiceGetLatestFrameResponseParams _cameraServiceGetLatestFrameResponseParamsFactory(core.MojoDataPipeConsumer content) {
@@ -1032,9 +1056,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "CameraServiceStub($superString)";
+    return "_CameraServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -1048,5 +1073,34 @@
   }
 }
 
+class CameraServiceStub
+    extends bindings.Stub<CameraService>
+    implements CameraService {
+  CameraServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [CameraService impl])
+      : super(new _CameraServiceStubControl.fromEndpoint(endpoint, impl));
+
+  CameraServiceStub.fromHandle(
+      core.MojoHandle handle, [CameraService impl])
+      : super(new _CameraServiceStubControl.fromHandle(handle, impl));
+
+  CameraServiceStub.unbound([CameraService impl])
+      : super(new _CameraServiceStubControl.unbound(impl));
+
+  static CameraServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CameraServiceStub"));
+    return new CameraServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _CameraServiceStubControl.serviceDescription;
+
+
+  dynamic getLatestFrame([Function responseFactory = null]) {
+    return impl.getLatestFrame(responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/clipboard.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/clipboard.mojom.dart
index 6630ee0..9e75d49 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/clipboard.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/clipboard.mojom.dart
@@ -711,9 +711,9 @@
   static const String mimeTypeUrl = "text/url";
 }
 
-
-class _ClipboardProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ClipboardProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ClipboardProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -727,7 +727,6 @@
 
   String get serviceName => Clipboard.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _clipboardMethodGetSequenceNumberName:
@@ -804,9 +803,9 @@
   }
 }
 
-
-class ClipboardProxy extends bindings.Proxy
-                              implements Clipboard {
+class ClipboardProxy
+    extends bindings.Proxy
+    implements Clipboard {
   ClipboardProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ClipboardProxyControl.fromEndpoint(endpoint));
@@ -872,29 +871,24 @@
   }
 }
 
-
-class ClipboardStub extends bindings.Stub {
+class _ClipboardStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Clipboard> {
   Clipboard _impl;
 
-  ClipboardStub.fromEndpoint(
+  _ClipboardStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Clipboard impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ClipboardStub.fromHandle(
+  _ClipboardStubControl.fromHandle(
       core.MojoHandle handle, [Clipboard impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ClipboardStub.unbound([this._impl]) : super.unbound();
-
-  static ClipboardStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ClipboardStub"));
-    return new ClipboardStub.fromEndpoint(endpoint);
-  }
+  _ClipboardStubControl.unbound([this._impl]) : super.unbound();
 
 
   ClipboardGetSequenceNumberResponseParams _clipboardGetSequenceNumberResponseParamsFactory(int sequence) {
@@ -1020,9 +1014,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ClipboardStub($superString)";
+    return "_ClipboardStubControl($superString)";
   }
 
   int get version => 0;
@@ -1036,5 +1031,43 @@
   }
 }
 
+class ClipboardStub
+    extends bindings.Stub<Clipboard>
+    implements Clipboard {
+  ClipboardStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Clipboard impl])
+      : super(new _ClipboardStubControl.fromEndpoint(endpoint, impl));
+
+  ClipboardStub.fromHandle(
+      core.MojoHandle handle, [Clipboard impl])
+      : super(new _ClipboardStubControl.fromHandle(handle, impl));
+
+  ClipboardStub.unbound([Clipboard impl])
+      : super(new _ClipboardStubControl.unbound(impl));
+
+  static ClipboardStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ClipboardStub"));
+    return new ClipboardStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ClipboardStubControl.serviceDescription;
+
+
+  dynamic getSequenceNumber(ClipboardType clipboardType,[Function responseFactory = null]) {
+    return impl.getSequenceNumber(clipboardType,responseFactory);
+  }
+  dynamic getAvailableMimeTypes(ClipboardType clipboardTypes,[Function responseFactory = null]) {
+    return impl.getAvailableMimeTypes(clipboardTypes,responseFactory);
+  }
+  dynamic readMimeType(ClipboardType clipboardType,String mimeType,[Function responseFactory = null]) {
+    return impl.readMimeType(clipboardType,mimeType,responseFactory);
+  }
+  void writeClipboardData(ClipboardType clipboardType, Map<String, List<int>> data) {
+    return impl.writeClipboardData(clipboardType, data);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/content_handler.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/content_handler.mojom.dart
index 948da4f..b800ae8 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/content_handler.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/content_handler.mojom.dart
@@ -114,9 +114,9 @@
   void startApplication(Object application, url_response_mojom.UrlResponse response);
 }
 
-
-class _ContentHandlerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ContentHandlerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ContentHandlerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -130,7 +130,6 @@
 
   String get serviceName => ContentHandler.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -147,9 +146,9 @@
   }
 }
 
-
-class ContentHandlerProxy extends bindings.Proxy
-                              implements ContentHandler {
+class ContentHandlerProxy
+    extends bindings.Proxy
+    implements ContentHandler {
   ContentHandlerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ContentHandlerProxyControl.fromEndpoint(endpoint));
@@ -187,29 +186,24 @@
   }
 }
 
-
-class ContentHandlerStub extends bindings.Stub {
+class _ContentHandlerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ContentHandler> {
   ContentHandler _impl;
 
-  ContentHandlerStub.fromEndpoint(
+  _ContentHandlerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ContentHandler impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ContentHandlerStub.fromHandle(
+  _ContentHandlerStubControl.fromHandle(
       core.MojoHandle handle, [ContentHandler impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ContentHandlerStub.unbound([this._impl]) : super.unbound();
-
-  static ContentHandlerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ContentHandlerStub"));
-    return new ContentHandlerStub.fromEndpoint(endpoint);
-  }
+  _ContentHandlerStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -254,9 +248,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ContentHandlerStub($superString)";
+    return "_ContentHandlerStubControl($superString)";
   }
 
   int get version => 0;
@@ -270,5 +265,34 @@
   }
 }
 
+class ContentHandlerStub
+    extends bindings.Stub<ContentHandler>
+    implements ContentHandler {
+  ContentHandlerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ContentHandler impl])
+      : super(new _ContentHandlerStubControl.fromEndpoint(endpoint, impl));
+
+  ContentHandlerStub.fromHandle(
+      core.MojoHandle handle, [ContentHandler impl])
+      : super(new _ContentHandlerStubControl.fromHandle(handle, impl));
+
+  ContentHandlerStub.unbound([ContentHandler impl])
+      : super(new _ContentHandlerStubControl.unbound(impl));
+
+  static ContentHandlerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ContentHandlerStub"));
+    return new ContentHandlerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ContentHandlerStubControl.serviceDescription;
+
+
+  void startApplication(Object application, url_response_mojom.UrlResponse response) {
+    return impl.startApplication(application, response);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/cookie_store.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/cookie_store.mojom.dart
index 9aa64ce..d6db717 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/cookie_store.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/cookie_store.mojom.dart
@@ -331,9 +331,9 @@
   dynamic set(String url,String cookie,[Function responseFactory = null]);
 }
 
-
-class _CookieStoreProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _CookieStoreProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _CookieStoreProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -347,7 +347,6 @@
 
   String get serviceName => CookieStore.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _cookieStoreMethodGetName:
@@ -404,9 +403,9 @@
   }
 }
 
-
-class CookieStoreProxy extends bindings.Proxy
-                              implements CookieStore {
+class CookieStoreProxy
+    extends bindings.Proxy
+    implements CookieStore {
   CookieStoreProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _CookieStoreProxyControl.fromEndpoint(endpoint));
@@ -452,29 +451,24 @@
   }
 }
 
-
-class CookieStoreStub extends bindings.Stub {
+class _CookieStoreStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<CookieStore> {
   CookieStore _impl;
 
-  CookieStoreStub.fromEndpoint(
+  _CookieStoreStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [CookieStore impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CookieStoreStub.fromHandle(
+  _CookieStoreStubControl.fromHandle(
       core.MojoHandle handle, [CookieStore impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CookieStoreStub.unbound([this._impl]) : super.unbound();
-
-  static CookieStoreStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CookieStoreStub"));
-    return new CookieStoreStub.fromEndpoint(endpoint);
-  }
+  _CookieStoreStubControl.unbound([this._impl]) : super.unbound();
 
 
   CookieStoreGetResponseParams _cookieStoreGetResponseParamsFactory(String cookies) {
@@ -568,9 +562,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "CookieStoreStub($superString)";
+    return "_CookieStoreStubControl($superString)";
   }
 
   int get version => 0;
@@ -584,5 +579,37 @@
   }
 }
 
+class CookieStoreStub
+    extends bindings.Stub<CookieStore>
+    implements CookieStore {
+  CookieStoreStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [CookieStore impl])
+      : super(new _CookieStoreStubControl.fromEndpoint(endpoint, impl));
+
+  CookieStoreStub.fromHandle(
+      core.MojoHandle handle, [CookieStore impl])
+      : super(new _CookieStoreStubControl.fromHandle(handle, impl));
+
+  CookieStoreStub.unbound([CookieStore impl])
+      : super(new _CookieStoreStubControl.unbound(impl));
+
+  static CookieStoreStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CookieStoreStub"));
+    return new CookieStoreStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _CookieStoreStubControl.serviceDescription;
+
+
+  dynamic get(String url,[Function responseFactory = null]) {
+    return impl.get(url,responseFactory);
+  }
+  dynamic set(String url,String cookie,[Function responseFactory = null]) {
+    return impl.set(url,cookie,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/device_info.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/device_info.mojom.dart
index 9a4069c..1fa37c2 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/device_info.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/device_info.mojom.dart
@@ -248,9 +248,9 @@
   dynamic getDeviceType([Function responseFactory = null]);
 }
 
-
-class _DeviceInfoProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _DeviceInfoProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _DeviceInfoProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -264,7 +264,6 @@
 
   String get serviceName => DeviceInfo.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _deviceInfoMethodGetDeviceTypeName:
@@ -301,9 +300,9 @@
   }
 }
 
-
-class DeviceInfoProxy extends bindings.Proxy
-                              implements DeviceInfo {
+class DeviceInfoProxy
+    extends bindings.Proxy
+    implements DeviceInfo {
   DeviceInfoProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _DeviceInfoProxyControl.fromEndpoint(endpoint));
@@ -338,29 +337,24 @@
   }
 }
 
-
-class DeviceInfoStub extends bindings.Stub {
+class _DeviceInfoStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<DeviceInfo> {
   DeviceInfo _impl;
 
-  DeviceInfoStub.fromEndpoint(
+  _DeviceInfoStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [DeviceInfo impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  DeviceInfoStub.fromHandle(
+  _DeviceInfoStubControl.fromHandle(
       core.MojoHandle handle, [DeviceInfo impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  DeviceInfoStub.unbound([this._impl]) : super.unbound();
-
-  static DeviceInfoStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For DeviceInfoStub"));
-    return new DeviceInfoStub.fromEndpoint(endpoint);
-  }
+  _DeviceInfoStubControl.unbound([this._impl]) : super.unbound();
 
 
   DeviceInfoGetDeviceTypeResponseParams _deviceInfoGetDeviceTypeResponseParamsFactory(DeviceInfoDeviceType deviceType) {
@@ -425,9 +419,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "DeviceInfoStub($superString)";
+    return "_DeviceInfoStubControl($superString)";
   }
 
   int get version => 0;
@@ -441,5 +436,34 @@
   }
 }
 
+class DeviceInfoStub
+    extends bindings.Stub<DeviceInfo>
+    implements DeviceInfo {
+  DeviceInfoStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [DeviceInfo impl])
+      : super(new _DeviceInfoStubControl.fromEndpoint(endpoint, impl));
+
+  DeviceInfoStub.fromHandle(
+      core.MojoHandle handle, [DeviceInfo impl])
+      : super(new _DeviceInfoStubControl.fromHandle(handle, impl));
+
+  DeviceInfoStub.unbound([DeviceInfo impl])
+      : super(new _DeviceInfoStubControl.unbound(impl));
+
+  static DeviceInfoStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DeviceInfoStub"));
+    return new DeviceInfoStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _DeviceInfoStubControl.serviceDescription;
+
+
+  dynamic getDeviceType([Function responseFactory = null]) {
+    return impl.getDeviceType(responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/files/directory.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/files/directory.mojom.dart
index 5201126..17004ed 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/files/directory.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/files/directory.mojom.dart
@@ -1190,9 +1190,9 @@
   dynamic delete(String path,int deleteFlags,[Function responseFactory = null]);
 }
 
-
-class _DirectoryProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _DirectoryProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _DirectoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1206,7 +1206,6 @@
 
   String get serviceName => Directory.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _directoryMethodReadName:
@@ -1363,9 +1362,9 @@
   }
 }
 
-
-class DirectoryProxy extends bindings.Proxy
-                              implements Directory {
+class DirectoryProxy
+    extends bindings.Proxy
+    implements Directory {
   DirectoryProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _DirectoryProxyControl.fromEndpoint(endpoint));
@@ -1460,29 +1459,24 @@
   }
 }
 
-
-class DirectoryStub extends bindings.Stub {
+class _DirectoryStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Directory> {
   Directory _impl;
 
-  DirectoryStub.fromEndpoint(
+  _DirectoryStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Directory impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  DirectoryStub.fromHandle(
+  _DirectoryStubControl.fromHandle(
       core.MojoHandle handle, [Directory impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  DirectoryStub.unbound([this._impl]) : super.unbound();
-
-  static DirectoryStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For DirectoryStub"));
-    return new DirectoryStub.fromEndpoint(endpoint);
-  }
+  _DirectoryStubControl.unbound([this._impl]) : super.unbound();
 
 
   DirectoryReadResponseParams _directoryReadResponseParamsFactory(types_mojom.Error error, List<types_mojom.DirectoryEntry> directoryContents) {
@@ -1709,9 +1703,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "DirectoryStub($superString)";
+    return "_DirectoryStubControl($superString)";
   }
 
   int get version => 0;
@@ -1725,5 +1720,52 @@
   }
 }
 
+class DirectoryStub
+    extends bindings.Stub<Directory>
+    implements Directory {
+  DirectoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Directory impl])
+      : super(new _DirectoryStubControl.fromEndpoint(endpoint, impl));
+
+  DirectoryStub.fromHandle(
+      core.MojoHandle handle, [Directory impl])
+      : super(new _DirectoryStubControl.fromHandle(handle, impl));
+
+  DirectoryStub.unbound([Directory impl])
+      : super(new _DirectoryStubControl.unbound(impl));
+
+  static DirectoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For DirectoryStub"));
+    return new DirectoryStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _DirectoryStubControl.serviceDescription;
+
+
+  dynamic read([Function responseFactory = null]) {
+    return impl.read(responseFactory);
+  }
+  dynamic stat([Function responseFactory = null]) {
+    return impl.stat(responseFactory);
+  }
+  dynamic touch(types_mojom.TimespecOrNow atime,types_mojom.TimespecOrNow mtime,[Function responseFactory = null]) {
+    return impl.touch(atime,mtime,responseFactory);
+  }
+  dynamic openFile(String path,Object file,int openFlags,[Function responseFactory = null]) {
+    return impl.openFile(path,file,openFlags,responseFactory);
+  }
+  dynamic openDirectory(String path,Object directory,int openFlags,[Function responseFactory = null]) {
+    return impl.openDirectory(path,directory,openFlags,responseFactory);
+  }
+  dynamic rename(String path,String newPath,[Function responseFactory = null]) {
+    return impl.rename(path,newPath,responseFactory);
+  }
+  dynamic delete(String path,int deleteFlags,[Function responseFactory = null]) {
+    return impl.delete(path,deleteFlags,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/files/file.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/files/file.mojom.dart
index 90dcf99..3625e2b 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/files/file.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/files/file.mojom.dart
@@ -2361,9 +2361,9 @@
   dynamic ioctl(int request,List<int> inValues,[Function responseFactory = null]);
 }
 
-
-class _FileProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _FileProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _FileProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -2377,7 +2377,6 @@
 
   String get serviceName => File.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _fileMethodCloseName:
@@ -2674,9 +2673,9 @@
   }
 }
 
-
-class FileProxy extends bindings.Proxy
-                              implements File {
+class FileProxy
+    extends bindings.Proxy
+    implements File {
   FileProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _FileProxyControl.fromEndpoint(endpoint));
@@ -2838,29 +2837,24 @@
   }
 }
 
-
-class FileStub extends bindings.Stub {
+class _FileStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<File> {
   File _impl;
 
-  FileStub.fromEndpoint(
+  _FileStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [File impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  FileStub.fromHandle(
+  _FileStubControl.fromHandle(
       core.MojoHandle handle, [File impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  FileStub.unbound([this._impl]) : super.unbound();
-
-  static FileStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For FileStub"));
-    return new FileStub.fromEndpoint(endpoint);
-  }
+  _FileStubControl.unbound([this._impl]) : super.unbound();
 
 
   FileCloseResponseParams _fileCloseResponseParamsFactory(types_mojom.Error err) {
@@ -3277,9 +3271,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "FileStub($superString)";
+    return "_FileStubControl($superString)";
   }
 
   int get version => 0;
@@ -3293,5 +3288,73 @@
   }
 }
 
+class FileStub
+    extends bindings.Stub<File>
+    implements File {
+  FileStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [File impl])
+      : super(new _FileStubControl.fromEndpoint(endpoint, impl));
+
+  FileStub.fromHandle(
+      core.MojoHandle handle, [File impl])
+      : super(new _FileStubControl.fromHandle(handle, impl));
+
+  FileStub.unbound([File impl])
+      : super(new _FileStubControl.unbound(impl));
+
+  static FileStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For FileStub"));
+    return new FileStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _FileStubControl.serviceDescription;
+
+
+  dynamic close_([Function responseFactory = null]) {
+    return impl.close_(responseFactory);
+  }
+  dynamic read(int numBytesToRead,int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
+    return impl.read(numBytesToRead,offset,whence,responseFactory);
+  }
+  dynamic write(List<int> bytesToWrite,int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
+    return impl.write(bytesToWrite,offset,whence,responseFactory);
+  }
+  dynamic readToStream(core.MojoDataPipeProducer source,int offset,types_mojom.Whence whence,int numBytesToRead,[Function responseFactory = null]) {
+    return impl.readToStream(source,offset,whence,numBytesToRead,responseFactory);
+  }
+  dynamic writeFromStream(core.MojoDataPipeConsumer sink,int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
+    return impl.writeFromStream(sink,offset,whence,responseFactory);
+  }
+  dynamic tell([Function responseFactory = null]) {
+    return impl.tell(responseFactory);
+  }
+  dynamic seek(int offset,types_mojom.Whence whence,[Function responseFactory = null]) {
+    return impl.seek(offset,whence,responseFactory);
+  }
+  dynamic stat([Function responseFactory = null]) {
+    return impl.stat(responseFactory);
+  }
+  dynamic truncate(int size,[Function responseFactory = null]) {
+    return impl.truncate(size,responseFactory);
+  }
+  dynamic touch(types_mojom.TimespecOrNow atime,types_mojom.TimespecOrNow mtime,[Function responseFactory = null]) {
+    return impl.touch(atime,mtime,responseFactory);
+  }
+  dynamic dup(Object file,[Function responseFactory = null]) {
+    return impl.dup(file,responseFactory);
+  }
+  dynamic reopen(Object file,int openFlags,[Function responseFactory = null]) {
+    return impl.reopen(file,openFlags,responseFactory);
+  }
+  dynamic asBuffer([Function responseFactory = null]) {
+    return impl.asBuffer(responseFactory);
+  }
+  dynamic ioctl(int request,List<int> inValues,[Function responseFactory = null]) {
+    return impl.ioctl(request,inValues,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/files/files.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/files/files.mojom.dart
index 323c8af..d4f8347 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/files/files.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/files/files.mojom.dart
@@ -189,9 +189,9 @@
   dynamic openFileSystem(String fileSystem,Object directory,[Function responseFactory = null]);
 }
 
-
-class _FilesProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _FilesProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _FilesProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -205,7 +205,6 @@
 
   String get serviceName => Files.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _filesMethodOpenFileSystemName:
@@ -242,9 +241,9 @@
   }
 }
 
-
-class FilesProxy extends bindings.Proxy
-                              implements Files {
+class FilesProxy
+    extends bindings.Proxy
+    implements Files {
   FilesProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _FilesProxyControl.fromEndpoint(endpoint));
@@ -281,29 +280,24 @@
   }
 }
 
-
-class FilesStub extends bindings.Stub {
+class _FilesStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Files> {
   Files _impl;
 
-  FilesStub.fromEndpoint(
+  _FilesStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Files impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  FilesStub.fromHandle(
+  _FilesStubControl.fromHandle(
       core.MojoHandle handle, [Files impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  FilesStub.unbound([this._impl]) : super.unbound();
-
-  static FilesStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For FilesStub"));
-    return new FilesStub.fromEndpoint(endpoint);
-  }
+  _FilesStubControl.unbound([this._impl]) : super.unbound();
 
 
   FilesOpenFileSystemResponseParams _filesOpenFileSystemResponseParamsFactory(types_mojom.Error error) {
@@ -370,9 +364,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "FilesStub($superString)";
+    return "_FilesStubControl($superString)";
   }
 
   int get version => 0;
@@ -386,5 +381,34 @@
   }
 }
 
+class FilesStub
+    extends bindings.Stub<Files>
+    implements Files {
+  FilesStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Files impl])
+      : super(new _FilesStubControl.fromEndpoint(endpoint, impl));
+
+  FilesStub.fromHandle(
+      core.MojoHandle handle, [Files impl])
+      : super(new _FilesStubControl.fromHandle(handle, impl));
+
+  FilesStub.unbound([Files impl])
+      : super(new _FilesStubControl.unbound(impl));
+
+  static FilesStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For FilesStub"));
+    return new FilesStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _FilesStubControl.serviceDescription;
+
+
+  dynamic openFileSystem(String fileSystem,Object directory,[Function responseFactory = null]) {
+    return impl.openFileSystem(fileSystem,directory,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/geocoder.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/geocoder.mojom.dart
index 53bbafa..88bc5f6 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/geocoder.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/geocoder.mojom.dart
@@ -1104,9 +1104,9 @@
   dynamic locationToAddress(location_mojom.Location location,Options options,[Function responseFactory = null]);
 }
 
-
-class _GeocoderProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _GeocoderProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _GeocoderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1120,7 +1120,6 @@
 
   String get serviceName => Geocoder.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _geocoderMethodAddressToLocationName:
@@ -1177,9 +1176,9 @@
   }
 }
 
-
-class GeocoderProxy extends bindings.Proxy
-                              implements Geocoder {
+class GeocoderProxy
+    extends bindings.Proxy
+    implements Geocoder {
   GeocoderProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _GeocoderProxyControl.fromEndpoint(endpoint));
@@ -1226,29 +1225,24 @@
   }
 }
 
-
-class GeocoderStub extends bindings.Stub {
+class _GeocoderStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Geocoder> {
   Geocoder _impl;
 
-  GeocoderStub.fromEndpoint(
+  _GeocoderStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Geocoder impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  GeocoderStub.fromHandle(
+  _GeocoderStubControl.fromHandle(
       core.MojoHandle handle, [Geocoder impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  GeocoderStub.unbound([this._impl]) : super.unbound();
-
-  static GeocoderStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For GeocoderStub"));
-    return new GeocoderStub.fromEndpoint(endpoint);
-  }
+  _GeocoderStubControl.unbound([this._impl]) : super.unbound();
 
 
   GeocoderAddressToLocationResponseParams _geocoderAddressToLocationResponseParamsFactory(String status, List<Result> results) {
@@ -1344,9 +1338,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "GeocoderStub($superString)";
+    return "_GeocoderStubControl($superString)";
   }
 
   int get version => 0;
@@ -1360,5 +1355,37 @@
   }
 }
 
+class GeocoderStub
+    extends bindings.Stub<Geocoder>
+    implements Geocoder {
+  GeocoderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Geocoder impl])
+      : super(new _GeocoderStubControl.fromEndpoint(endpoint, impl));
+
+  GeocoderStub.fromHandle(
+      core.MojoHandle handle, [Geocoder impl])
+      : super(new _GeocoderStubControl.fromHandle(handle, impl));
+
+  GeocoderStub.unbound([Geocoder impl])
+      : super(new _GeocoderStubControl.unbound(impl));
+
+  static GeocoderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For GeocoderStub"));
+    return new GeocoderStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _GeocoderStubControl.serviceDescription;
+
+
+  dynamic addressToLocation(String address,Options options,[Function responseFactory = null]) {
+    return impl.addressToLocation(address,options,responseFactory);
+  }
+  dynamic locationToAddress(location_mojom.Location location,Options options,[Function responseFactory = null]) {
+    return impl.locationToAddress(location,options,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/compositor.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/compositor.mojom.dart
index 944fb02..28a3f4f 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/compositor.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/compositor.mojom.dart
@@ -288,9 +288,9 @@
   void createRenderer(Object contextProvider, Object renderer, String label);
 }
 
-
-class _CompositorProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _CompositorProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _CompositorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -304,7 +304,6 @@
 
   String get serviceName => Compositor.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _compositorMethodCreateSceneName:
@@ -341,9 +340,9 @@
   }
 }
 
-
-class CompositorProxy extends bindings.Proxy
-                              implements Compositor {
+class CompositorProxy
+    extends bindings.Proxy
+    implements Compositor {
   CompositorProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _CompositorProxyControl.fromEndpoint(endpoint));
@@ -392,29 +391,24 @@
   }
 }
 
-
-class CompositorStub extends bindings.Stub {
+class _CompositorStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Compositor> {
   Compositor _impl;
 
-  CompositorStub.fromEndpoint(
+  _CompositorStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Compositor impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CompositorStub.fromHandle(
+  _CompositorStubControl.fromHandle(
       core.MojoHandle handle, [Compositor impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  CompositorStub.unbound([this._impl]) : super.unbound();
-
-  static CompositorStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For CompositorStub"));
-    return new CompositorStub.fromEndpoint(endpoint);
-  }
+  _CompositorStubControl.unbound([this._impl]) : super.unbound();
 
 
   CompositorCreateSceneResponseParams _compositorCreateSceneResponseParamsFactory(scene_token_mojom.SceneToken sceneToken) {
@@ -486,9 +480,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "CompositorStub($superString)";
+    return "_CompositorStubControl($superString)";
   }
 
   int get version => 0;
@@ -502,5 +497,37 @@
   }
 }
 
+class CompositorStub
+    extends bindings.Stub<Compositor>
+    implements Compositor {
+  CompositorStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Compositor impl])
+      : super(new _CompositorStubControl.fromEndpoint(endpoint, impl));
+
+  CompositorStub.fromHandle(
+      core.MojoHandle handle, [Compositor impl])
+      : super(new _CompositorStubControl.fromHandle(handle, impl));
+
+  CompositorStub.unbound([Compositor impl])
+      : super(new _CompositorStubControl.unbound(impl));
+
+  static CompositorStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For CompositorStub"));
+    return new CompositorStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _CompositorStubControl.serviceDescription;
+
+
+  dynamic createScene(Object scene,String label,[Function responseFactory = null]) {
+    return impl.createScene(scene,label,responseFactory);
+  }
+  void createRenderer(Object contextProvider, Object renderer, String label) {
+    return impl.createRenderer(contextProvider, renderer, label);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/hit_tests.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/hit_tests.mojom.dart
index e2c47a2..15dbd14 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/hit_tests.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/hit_tests.mojom.dart
@@ -724,9 +724,9 @@
   dynamic hitTest(geometry_mojom.PointF point,[Function responseFactory = null]);
 }
 
-
-class _HitTesterProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _HitTesterProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _HitTesterProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -740,7 +740,6 @@
 
   String get serviceName => HitTester.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _hitTesterMethodHitTestName:
@@ -777,9 +776,9 @@
   }
 }
 
-
-class HitTesterProxy extends bindings.Proxy
-                              implements HitTester {
+class HitTesterProxy
+    extends bindings.Proxy
+    implements HitTester {
   HitTesterProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _HitTesterProxyControl.fromEndpoint(endpoint));
@@ -815,29 +814,24 @@
   }
 }
 
-
-class HitTesterStub extends bindings.Stub {
+class _HitTesterStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<HitTester> {
   HitTester _impl;
 
-  HitTesterStub.fromEndpoint(
+  _HitTesterStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [HitTester impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HitTesterStub.fromHandle(
+  _HitTesterStubControl.fromHandle(
       core.MojoHandle handle, [HitTester impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HitTesterStub.unbound([this._impl]) : super.unbound();
-
-  static HitTesterStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HitTesterStub"));
-    return new HitTesterStub.fromEndpoint(endpoint);
-  }
+  _HitTesterStubControl.unbound([this._impl]) : super.unbound();
 
 
   HitTesterHitTestResponseParams _hitTesterHitTestResponseParamsFactory(HitTestResult result) {
@@ -904,9 +898,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "HitTesterStub($superString)";
+    return "_HitTesterStubControl($superString)";
   }
 
   int get version => 0;
@@ -920,5 +915,34 @@
   }
 }
 
+class HitTesterStub
+    extends bindings.Stub<HitTester>
+    implements HitTester {
+  HitTesterStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [HitTester impl])
+      : super(new _HitTesterStubControl.fromEndpoint(endpoint, impl));
+
+  HitTesterStub.fromHandle(
+      core.MojoHandle handle, [HitTester impl])
+      : super(new _HitTesterStubControl.fromHandle(handle, impl));
+
+  HitTesterStub.unbound([HitTester impl])
+      : super(new _HitTesterStubControl.unbound(impl));
+
+  static HitTesterStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HitTesterStub"));
+    return new HitTesterStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _HitTesterStubControl.serviceDescription;
+
+
+  dynamic hitTest(geometry_mojom.PointF point,[Function responseFactory = null]) {
+    return impl.hitTest(point,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/renderers.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/renderers.mojom.dart
index 58f8038..37944ab 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/renderers.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/renderers.mojom.dart
@@ -265,9 +265,9 @@
   void getHitTester(Object hitTester);
 }
 
-
-class _RendererProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _RendererProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _RendererProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -281,7 +281,6 @@
 
   String get serviceName => Renderer.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -298,9 +297,9 @@
   }
 }
 
-
-class RendererProxy extends bindings.Proxy
-                              implements Renderer {
+class RendererProxy
+    extends bindings.Proxy
+    implements Renderer {
   RendererProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _RendererProxyControl.fromEndpoint(endpoint));
@@ -358,29 +357,24 @@
   }
 }
 
-
-class RendererStub extends bindings.Stub {
+class _RendererStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Renderer> {
   Renderer _impl;
 
-  RendererStub.fromEndpoint(
+  _RendererStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Renderer impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  RendererStub.fromHandle(
+  _RendererStubControl.fromHandle(
       core.MojoHandle handle, [Renderer impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  RendererStub.unbound([this._impl]) : super.unbound();
-
-  static RendererStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For RendererStub"));
-    return new RendererStub.fromEndpoint(endpoint);
-  }
+  _RendererStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -433,9 +427,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "RendererStub($superString)";
+    return "_RendererStubControl($superString)";
   }
 
   int get version => 0;
@@ -449,5 +444,40 @@
   }
 }
 
+class RendererStub
+    extends bindings.Stub<Renderer>
+    implements Renderer {
+  RendererStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Renderer impl])
+      : super(new _RendererStubControl.fromEndpoint(endpoint, impl));
+
+  RendererStub.fromHandle(
+      core.MojoHandle handle, [Renderer impl])
+      : super(new _RendererStubControl.fromHandle(handle, impl));
+
+  RendererStub.unbound([Renderer impl])
+      : super(new _RendererStubControl.unbound(impl));
+
+  static RendererStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For RendererStub"));
+    return new RendererStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _RendererStubControl.serviceDescription;
+
+
+  void setRootScene(scene_token_mojom.SceneToken sceneToken, int sceneVersion, geometry_mojom.Rect viewport) {
+    return impl.setRootScene(sceneToken, sceneVersion, viewport);
+  }
+  void clearRootScene() {
+    return impl.clearRootScene();
+  }
+  void getHitTester(Object hitTester) {
+    return impl.getHitTester(hitTester);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/resources.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/resources.mojom.dart
index b98173f..c1c86c7 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/resources.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/resources.mojom.dart
@@ -445,9 +445,9 @@
   void onMailboxTextureReleased();
 }
 
-
-class _MailboxTextureCallbackProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MailboxTextureCallbackProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MailboxTextureCallbackProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -461,7 +461,6 @@
 
   String get serviceName => MailboxTextureCallback.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -478,9 +477,9 @@
   }
 }
 
-
-class MailboxTextureCallbackProxy extends bindings.Proxy
-                              implements MailboxTextureCallback {
+class MailboxTextureCallbackProxy
+    extends bindings.Proxy
+    implements MailboxTextureCallback {
   MailboxTextureCallbackProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MailboxTextureCallbackProxyControl.fromEndpoint(endpoint));
@@ -516,29 +515,24 @@
   }
 }
 
-
-class MailboxTextureCallbackStub extends bindings.Stub {
+class _MailboxTextureCallbackStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MailboxTextureCallback> {
   MailboxTextureCallback _impl;
 
-  MailboxTextureCallbackStub.fromEndpoint(
+  _MailboxTextureCallbackStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MailboxTextureCallback impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MailboxTextureCallbackStub.fromHandle(
+  _MailboxTextureCallbackStubControl.fromHandle(
       core.MojoHandle handle, [MailboxTextureCallback impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MailboxTextureCallbackStub.unbound([this._impl]) : super.unbound();
-
-  static MailboxTextureCallbackStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MailboxTextureCallbackStub"));
-    return new MailboxTextureCallbackStub.fromEndpoint(endpoint);
-  }
+  _MailboxTextureCallbackStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -581,9 +575,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MailboxTextureCallbackStub($superString)";
+    return "_MailboxTextureCallbackStubControl($superString)";
   }
 
   int get version => 0;
@@ -597,5 +592,34 @@
   }
 }
 
+class MailboxTextureCallbackStub
+    extends bindings.Stub<MailboxTextureCallback>
+    implements MailboxTextureCallback {
+  MailboxTextureCallbackStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MailboxTextureCallback impl])
+      : super(new _MailboxTextureCallbackStubControl.fromEndpoint(endpoint, impl));
+
+  MailboxTextureCallbackStub.fromHandle(
+      core.MojoHandle handle, [MailboxTextureCallback impl])
+      : super(new _MailboxTextureCallbackStubControl.fromHandle(handle, impl));
+
+  MailboxTextureCallbackStub.unbound([MailboxTextureCallback impl])
+      : super(new _MailboxTextureCallbackStubControl.unbound(impl));
+
+  static MailboxTextureCallbackStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MailboxTextureCallbackStub"));
+    return new MailboxTextureCallbackStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MailboxTextureCallbackStubControl.serviceDescription;
+
+
+  void onMailboxTextureReleased() {
+    return impl.onMailboxTextureReleased();
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/scenes.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/scenes.mojom.dart
index 0c2a95e..ea32f42 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/scenes.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/scenes.mojom.dart
@@ -730,9 +730,9 @@
   void getScheduler(Object scheduler);
 }
 
-
-class _SceneProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SceneProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SceneProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -746,7 +746,6 @@
 
   String get serviceName => Scene.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -763,9 +762,9 @@
   }
 }
 
-
-class SceneProxy extends bindings.Proxy
-                              implements Scene {
+class SceneProxy
+    extends bindings.Proxy
+    implements Scene {
   SceneProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SceneProxyControl.fromEndpoint(endpoint));
@@ -832,29 +831,24 @@
   }
 }
 
-
-class SceneStub extends bindings.Stub {
+class _SceneStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Scene> {
   Scene _impl;
 
-  SceneStub.fromEndpoint(
+  _SceneStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Scene impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SceneStub.fromHandle(
+  _SceneStubControl.fromHandle(
       core.MojoHandle handle, [Scene impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SceneStub.unbound([this._impl]) : super.unbound();
-
-  static SceneStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SceneStub"));
-    return new SceneStub.fromEndpoint(endpoint);
-  }
+  _SceneStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -914,9 +908,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SceneStub($superString)";
+    return "_SceneStubControl($superString)";
   }
 
   int get version => 0;
@@ -930,6 +925,44 @@
   }
 }
 
+class SceneStub
+    extends bindings.Stub<Scene>
+    implements Scene {
+  SceneStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Scene impl])
+      : super(new _SceneStubControl.fromEndpoint(endpoint, impl));
+
+  SceneStub.fromHandle(
+      core.MojoHandle handle, [Scene impl])
+      : super(new _SceneStubControl.fromHandle(handle, impl));
+
+  SceneStub.unbound([Scene impl])
+      : super(new _SceneStubControl.unbound(impl));
+
+  static SceneStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SceneStub"));
+    return new SceneStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SceneStubControl.serviceDescription;
+
+
+  void setListener(Object listener) {
+    return impl.setListener(listener);
+  }
+  void update(SceneUpdate update) {
+    return impl.update(update);
+  }
+  void publish(SceneMetadata metadata) {
+    return impl.publish(metadata);
+  }
+  void getScheduler(Object scheduler) {
+    return impl.getScheduler(scheduler);
+  }
+}
+
 const int _sceneListenerMethodOnResourceUnavailableName = 0;
 
 class _SceneListenerServiceDescription implements service_describer.ServiceDescription {
@@ -948,9 +981,9 @@
   dynamic onResourceUnavailable(int resourceId,[Function responseFactory = null]);
 }
 
-
-class _SceneListenerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SceneListenerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SceneListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -964,7 +997,6 @@
 
   String get serviceName => SceneListener.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _sceneListenerMethodOnResourceUnavailableName:
@@ -1001,9 +1033,9 @@
   }
 }
 
-
-class SceneListenerProxy extends bindings.Proxy
-                              implements SceneListener {
+class SceneListenerProxy
+    extends bindings.Proxy
+    implements SceneListener {
   SceneListenerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SceneListenerProxyControl.fromEndpoint(endpoint));
@@ -1039,29 +1071,24 @@
   }
 }
 
-
-class SceneListenerStub extends bindings.Stub {
+class _SceneListenerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<SceneListener> {
   SceneListener _impl;
 
-  SceneListenerStub.fromEndpoint(
+  _SceneListenerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [SceneListener impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SceneListenerStub.fromHandle(
+  _SceneListenerStubControl.fromHandle(
       core.MojoHandle handle, [SceneListener impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SceneListenerStub.unbound([this._impl]) : super.unbound();
-
-  static SceneListenerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SceneListenerStub"));
-    return new SceneListenerStub.fromEndpoint(endpoint);
-  }
+  _SceneListenerStubControl.unbound([this._impl]) : super.unbound();
 
 
   SceneListenerOnResourceUnavailableResponseParams _sceneListenerOnResourceUnavailableResponseParamsFactory() {
@@ -1127,9 +1154,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SceneListenerStub($superString)";
+    return "_SceneListenerStubControl($superString)";
   }
 
   int get version => 0;
@@ -1143,5 +1171,34 @@
   }
 }
 
+class SceneListenerStub
+    extends bindings.Stub<SceneListener>
+    implements SceneListener {
+  SceneListenerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [SceneListener impl])
+      : super(new _SceneListenerStubControl.fromEndpoint(endpoint, impl));
+
+  SceneListenerStub.fromHandle(
+      core.MojoHandle handle, [SceneListener impl])
+      : super(new _SceneListenerStubControl.fromHandle(handle, impl));
+
+  SceneListenerStub.unbound([SceneListener impl])
+      : super(new _SceneListenerStubControl.unbound(impl));
+
+  static SceneListenerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SceneListenerStub"));
+    return new SceneListenerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SceneListenerStubControl.serviceDescription;
+
+
+  dynamic onResourceUnavailable(int resourceId,[Function responseFactory = null]) {
+    return impl.onResourceUnavailable(resourceId,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/scheduling.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/scheduling.mojom.dart
index d458eed..b6d5908 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/scheduling.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/gfx/composition/scheduling.mojom.dart
@@ -272,9 +272,9 @@
   dynamic scheduleFrame([Function responseFactory = null]);
 }
 
-
-class _SceneSchedulerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SceneSchedulerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SceneSchedulerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -288,7 +288,6 @@
 
   String get serviceName => SceneScheduler.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _sceneSchedulerMethodScheduleFrameName:
@@ -325,9 +324,9 @@
   }
 }
 
-
-class SceneSchedulerProxy extends bindings.Proxy
-                              implements SceneScheduler {
+class SceneSchedulerProxy
+    extends bindings.Proxy
+    implements SceneScheduler {
   SceneSchedulerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SceneSchedulerProxyControl.fromEndpoint(endpoint));
@@ -362,29 +361,24 @@
   }
 }
 
-
-class SceneSchedulerStub extends bindings.Stub {
+class _SceneSchedulerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<SceneScheduler> {
   SceneScheduler _impl;
 
-  SceneSchedulerStub.fromEndpoint(
+  _SceneSchedulerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [SceneScheduler impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SceneSchedulerStub.fromHandle(
+  _SceneSchedulerStubControl.fromHandle(
       core.MojoHandle handle, [SceneScheduler impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SceneSchedulerStub.unbound([this._impl]) : super.unbound();
-
-  static SceneSchedulerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SceneSchedulerStub"));
-    return new SceneSchedulerStub.fromEndpoint(endpoint);
-  }
+  _SceneSchedulerStubControl.unbound([this._impl]) : super.unbound();
 
 
   SceneSchedulerScheduleFrameResponseParams _sceneSchedulerScheduleFrameResponseParamsFactory(FrameInfo frameInfo) {
@@ -449,9 +443,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SceneSchedulerStub($superString)";
+    return "_SceneSchedulerStubControl($superString)";
   }
 
   int get version => 0;
@@ -465,5 +460,34 @@
   }
 }
 
+class SceneSchedulerStub
+    extends bindings.Stub<SceneScheduler>
+    implements SceneScheduler {
+  SceneSchedulerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [SceneScheduler impl])
+      : super(new _SceneSchedulerStubControl.fromEndpoint(endpoint, impl));
+
+  SceneSchedulerStub.fromHandle(
+      core.MojoHandle handle, [SceneScheduler impl])
+      : super(new _SceneSchedulerStubControl.fromHandle(handle, impl));
+
+  SceneSchedulerStub.unbound([SceneScheduler impl])
+      : super(new _SceneSchedulerStubControl.unbound(impl));
+
+  static SceneSchedulerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SceneSchedulerStub"));
+    return new SceneSchedulerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SceneSchedulerStubControl.serviceDescription;
+
+
+  dynamic scheduleFrame([Function responseFactory = null]) {
+    return impl.scheduleFrame(responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/host_resolver.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/host_resolver.mojom.dart
index 62c8f73..ca68ec8 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/host_resolver.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/host_resolver.mojom.dart
@@ -224,9 +224,9 @@
   dynamic getHostAddresses(String host,net_address_mojom.NetAddressFamily family,[Function responseFactory = null]);
 }
 
-
-class _HostResolverProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _HostResolverProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _HostResolverProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -240,7 +240,6 @@
 
   String get serviceName => HostResolver.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _hostResolverMethodGetHostAddressesName:
@@ -277,9 +276,9 @@
   }
 }
 
-
-class HostResolverProxy extends bindings.Proxy
-                              implements HostResolver {
+class HostResolverProxy
+    extends bindings.Proxy
+    implements HostResolver {
   HostResolverProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _HostResolverProxyControl.fromEndpoint(endpoint));
@@ -316,29 +315,24 @@
   }
 }
 
-
-class HostResolverStub extends bindings.Stub {
+class _HostResolverStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<HostResolver> {
   HostResolver _impl;
 
-  HostResolverStub.fromEndpoint(
+  _HostResolverStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [HostResolver impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HostResolverStub.fromHandle(
+  _HostResolverStubControl.fromHandle(
       core.MojoHandle handle, [HostResolver impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HostResolverStub.unbound([this._impl]) : super.unbound();
-
-  static HostResolverStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HostResolverStub"));
-    return new HostResolverStub.fromEndpoint(endpoint);
-  }
+  _HostResolverStubControl.unbound([this._impl]) : super.unbound();
 
 
   HostResolverGetHostAddressesResponseParams _hostResolverGetHostAddressesResponseParamsFactory(network_error_mojom.NetworkError result, List<net_address_mojom.NetAddress> addresses) {
@@ -406,9 +400,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "HostResolverStub($superString)";
+    return "_HostResolverStubControl($superString)";
   }
 
   int get version => 0;
@@ -422,5 +417,34 @@
   }
 }
 
+class HostResolverStub
+    extends bindings.Stub<HostResolver>
+    implements HostResolver {
+  HostResolverStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [HostResolver impl])
+      : super(new _HostResolverStubControl.fromEndpoint(endpoint, impl));
+
+  HostResolverStub.fromHandle(
+      core.MojoHandle handle, [HostResolver impl])
+      : super(new _HostResolverStubControl.fromHandle(handle, impl));
+
+  HostResolverStub.unbound([HostResolver impl])
+      : super(new _HostResolverStubControl.unbound(impl));
+
+  static HostResolverStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HostResolverStub"));
+    return new HostResolverStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _HostResolverStubControl.serviceDescription;
+
+
+  dynamic getHostAddresses(String host,net_address_mojom.NetAddressFamily family,[Function responseFactory = null]) {
+    return impl.getHostAddresses(host,family,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/http_connection.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/http_connection.mojom.dart
index 4a71887..2bfbbe4 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/http_connection.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/http_connection.mojom.dart
@@ -635,9 +635,9 @@
   dynamic setReceiveBufferSize(int size,[Function responseFactory = null]);
 }
 
-
-class _HttpConnectionProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _HttpConnectionProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _HttpConnectionProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -651,7 +651,6 @@
 
   String get serviceName => HttpConnection.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _httpConnectionMethodSetSendBufferSizeName:
@@ -708,9 +707,9 @@
   }
 }
 
-
-class HttpConnectionProxy extends bindings.Proxy
-                              implements HttpConnection {
+class HttpConnectionProxy
+    extends bindings.Proxy
+    implements HttpConnection {
   HttpConnectionProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _HttpConnectionProxyControl.fromEndpoint(endpoint));
@@ -755,29 +754,24 @@
   }
 }
 
-
-class HttpConnectionStub extends bindings.Stub {
+class _HttpConnectionStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<HttpConnection> {
   HttpConnection _impl;
 
-  HttpConnectionStub.fromEndpoint(
+  _HttpConnectionStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [HttpConnection impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpConnectionStub.fromHandle(
+  _HttpConnectionStubControl.fromHandle(
       core.MojoHandle handle, [HttpConnection impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpConnectionStub.unbound([this._impl]) : super.unbound();
-
-  static HttpConnectionStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpConnectionStub"));
-    return new HttpConnectionStub.fromEndpoint(endpoint);
-  }
+  _HttpConnectionStubControl.unbound([this._impl]) : super.unbound();
 
 
   HttpConnectionSetSendBufferSizeResponseParams _httpConnectionSetSendBufferSizeResponseParamsFactory(network_error_mojom.NetworkError result) {
@@ -871,9 +865,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "HttpConnectionStub($superString)";
+    return "_HttpConnectionStubControl($superString)";
   }
 
   int get version => 0;
@@ -887,6 +882,38 @@
   }
 }
 
+class HttpConnectionStub
+    extends bindings.Stub<HttpConnection>
+    implements HttpConnection {
+  HttpConnectionStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [HttpConnection impl])
+      : super(new _HttpConnectionStubControl.fromEndpoint(endpoint, impl));
+
+  HttpConnectionStub.fromHandle(
+      core.MojoHandle handle, [HttpConnection impl])
+      : super(new _HttpConnectionStubControl.fromHandle(handle, impl));
+
+  HttpConnectionStub.unbound([HttpConnection impl])
+      : super(new _HttpConnectionStubControl.unbound(impl));
+
+  static HttpConnectionStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpConnectionStub"));
+    return new HttpConnectionStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _HttpConnectionStubControl.serviceDescription;
+
+
+  dynamic setSendBufferSize(int size,[Function responseFactory = null]) {
+    return impl.setSendBufferSize(size,responseFactory);
+  }
+  dynamic setReceiveBufferSize(int size,[Function responseFactory = null]) {
+    return impl.setReceiveBufferSize(size,responseFactory);
+  }
+}
+
 const int _httpConnectionDelegateMethodOnReceivedRequestName = 0;
 const int _httpConnectionDelegateMethodOnReceivedWebSocketRequestName = 1;
 
@@ -907,9 +934,9 @@
   dynamic onReceivedWebSocketRequest(http_message_mojom.HttpRequest request,[Function responseFactory = null]);
 }
 
-
-class _HttpConnectionDelegateProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _HttpConnectionDelegateProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _HttpConnectionDelegateProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -923,7 +950,6 @@
 
   String get serviceName => HttpConnectionDelegate.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _httpConnectionDelegateMethodOnReceivedRequestName:
@@ -980,9 +1006,9 @@
   }
 }
 
-
-class HttpConnectionDelegateProxy extends bindings.Proxy
-                              implements HttpConnectionDelegate {
+class HttpConnectionDelegateProxy
+    extends bindings.Proxy
+    implements HttpConnectionDelegate {
   HttpConnectionDelegateProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _HttpConnectionDelegateProxyControl.fromEndpoint(endpoint));
@@ -1027,29 +1053,24 @@
   }
 }
 
-
-class HttpConnectionDelegateStub extends bindings.Stub {
+class _HttpConnectionDelegateStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<HttpConnectionDelegate> {
   HttpConnectionDelegate _impl;
 
-  HttpConnectionDelegateStub.fromEndpoint(
+  _HttpConnectionDelegateStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [HttpConnectionDelegate impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpConnectionDelegateStub.fromHandle(
+  _HttpConnectionDelegateStubControl.fromHandle(
       core.MojoHandle handle, [HttpConnectionDelegate impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpConnectionDelegateStub.unbound([this._impl]) : super.unbound();
-
-  static HttpConnectionDelegateStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpConnectionDelegateStub"));
-    return new HttpConnectionDelegateStub.fromEndpoint(endpoint);
-  }
+  _HttpConnectionDelegateStubControl.unbound([this._impl]) : super.unbound();
 
 
   HttpConnectionDelegateOnReceivedRequestResponseParams _httpConnectionDelegateOnReceivedRequestResponseParamsFactory(http_message_mojom.HttpResponse response) {
@@ -1145,9 +1166,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "HttpConnectionDelegateStub($superString)";
+    return "_HttpConnectionDelegateStubControl($superString)";
   }
 
   int get version => 0;
@@ -1161,5 +1183,37 @@
   }
 }
 
+class HttpConnectionDelegateStub
+    extends bindings.Stub<HttpConnectionDelegate>
+    implements HttpConnectionDelegate {
+  HttpConnectionDelegateStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [HttpConnectionDelegate impl])
+      : super(new _HttpConnectionDelegateStubControl.fromEndpoint(endpoint, impl));
+
+  HttpConnectionDelegateStub.fromHandle(
+      core.MojoHandle handle, [HttpConnectionDelegate impl])
+      : super(new _HttpConnectionDelegateStubControl.fromHandle(handle, impl));
+
+  HttpConnectionDelegateStub.unbound([HttpConnectionDelegate impl])
+      : super(new _HttpConnectionDelegateStubControl.unbound(impl));
+
+  static HttpConnectionDelegateStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpConnectionDelegateStub"));
+    return new HttpConnectionDelegateStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _HttpConnectionDelegateStubControl.serviceDescription;
+
+
+  dynamic onReceivedRequest(http_message_mojom.HttpRequest request,[Function responseFactory = null]) {
+    return impl.onReceivedRequest(request,responseFactory);
+  }
+  dynamic onReceivedWebSocketRequest(http_message_mojom.HttpRequest request,[Function responseFactory = null]) {
+    return impl.onReceivedWebSocketRequest(request,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/http_server.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/http_server.mojom.dart
index 2712cb6..9e8b19e 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/http_server.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/http_server.mojom.dart
@@ -112,9 +112,9 @@
   void onConnected(Object connection, Object delegate);
 }
 
-
-class _HttpServerDelegateProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _HttpServerDelegateProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _HttpServerDelegateProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -128,7 +128,6 @@
 
   String get serviceName => HttpServerDelegate.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -145,9 +144,9 @@
   }
 }
 
-
-class HttpServerDelegateProxy extends bindings.Proxy
-                              implements HttpServerDelegate {
+class HttpServerDelegateProxy
+    extends bindings.Proxy
+    implements HttpServerDelegate {
   HttpServerDelegateProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _HttpServerDelegateProxyControl.fromEndpoint(endpoint));
@@ -185,29 +184,24 @@
   }
 }
 
-
-class HttpServerDelegateStub extends bindings.Stub {
+class _HttpServerDelegateStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<HttpServerDelegate> {
   HttpServerDelegate _impl;
 
-  HttpServerDelegateStub.fromEndpoint(
+  _HttpServerDelegateStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [HttpServerDelegate impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpServerDelegateStub.fromHandle(
+  _HttpServerDelegateStubControl.fromHandle(
       core.MojoHandle handle, [HttpServerDelegate impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  HttpServerDelegateStub.unbound([this._impl]) : super.unbound();
-
-  static HttpServerDelegateStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For HttpServerDelegateStub"));
-    return new HttpServerDelegateStub.fromEndpoint(endpoint);
-  }
+  _HttpServerDelegateStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -252,9 +246,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "HttpServerDelegateStub($superString)";
+    return "_HttpServerDelegateStubControl($superString)";
   }
 
   int get version => 0;
@@ -268,5 +263,34 @@
   }
 }
 
+class HttpServerDelegateStub
+    extends bindings.Stub<HttpServerDelegate>
+    implements HttpServerDelegate {
+  HttpServerDelegateStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [HttpServerDelegate impl])
+      : super(new _HttpServerDelegateStubControl.fromEndpoint(endpoint, impl));
+
+  HttpServerDelegateStub.fromHandle(
+      core.MojoHandle handle, [HttpServerDelegate impl])
+      : super(new _HttpServerDelegateStubControl.fromHandle(handle, impl));
+
+  HttpServerDelegateStub.unbound([HttpServerDelegate impl])
+      : super(new _HttpServerDelegateStubControl.unbound(impl));
+
+  static HttpServerDelegateStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For HttpServerDelegateStub"));
+    return new HttpServerDelegateStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _HttpServerDelegateStubControl.serviceDescription;
+
+
+  void onConnected(Object connection, Object delegate) {
+    return impl.onConnected(connection, delegate);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/location_service.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/location_service.mojom.dart
index 6d28870..a17117e 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/location_service.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/location_service.mojom.dart
@@ -243,9 +243,9 @@
   dynamic getNextLocation(LocationServiceUpdatePriority priority,[Function responseFactory = null]);
 }
 
-
-class _LocationServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _LocationServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _LocationServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -259,7 +259,6 @@
 
   String get serviceName => LocationService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _locationServiceMethodGetNextLocationName:
@@ -296,9 +295,9 @@
   }
 }
 
-
-class LocationServiceProxy extends bindings.Proxy
-                              implements LocationService {
+class LocationServiceProxy
+    extends bindings.Proxy
+    implements LocationService {
   LocationServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _LocationServiceProxyControl.fromEndpoint(endpoint));
@@ -334,29 +333,24 @@
   }
 }
 
-
-class LocationServiceStub extends bindings.Stub {
+class _LocationServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<LocationService> {
   LocationService _impl;
 
-  LocationServiceStub.fromEndpoint(
+  _LocationServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [LocationService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  LocationServiceStub.fromHandle(
+  _LocationServiceStubControl.fromHandle(
       core.MojoHandle handle, [LocationService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  LocationServiceStub.unbound([this._impl]) : super.unbound();
-
-  static LocationServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For LocationServiceStub"));
-    return new LocationServiceStub.fromEndpoint(endpoint);
-  }
+  _LocationServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
   LocationServiceGetNextLocationResponseParams _locationServiceGetNextLocationResponseParamsFactory(location_mojom.Location location) {
@@ -423,9 +417,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "LocationServiceStub($superString)";
+    return "_LocationServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -439,5 +434,34 @@
   }
 }
 
+class LocationServiceStub
+    extends bindings.Stub<LocationService>
+    implements LocationService {
+  LocationServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [LocationService impl])
+      : super(new _LocationServiceStubControl.fromEndpoint(endpoint, impl));
+
+  LocationServiceStub.fromHandle(
+      core.MojoHandle handle, [LocationService impl])
+      : super(new _LocationServiceStubControl.fromHandle(handle, impl));
+
+  LocationServiceStub.unbound([LocationService impl])
+      : super(new _LocationServiceStubControl.unbound(impl));
+
+  static LocationServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For LocationServiceStub"));
+    return new LocationServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _LocationServiceStubControl.serviceDescription;
+
+
+  dynamic getNextLocation(LocationServiceUpdatePriority priority,[Function responseFactory = null]) {
+    return impl.getNextLocation(priority,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/audio_server.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/audio_server.mojom.dart
index bd61c73..f5deb76 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/audio_server.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/audio_server.mojom.dart
@@ -99,9 +99,9 @@
   void createTrack(Object track);
 }
 
-
-class _AudioServerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _AudioServerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _AudioServerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -115,7 +115,6 @@
 
   String get serviceName => AudioServer.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -132,9 +131,9 @@
   }
 }
 
-
-class AudioServerProxy extends bindings.Proxy
-                              implements AudioServer {
+class AudioServerProxy
+    extends bindings.Proxy
+    implements AudioServer {
   AudioServerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _AudioServerProxyControl.fromEndpoint(endpoint));
@@ -171,29 +170,24 @@
   }
 }
 
-
-class AudioServerStub extends bindings.Stub {
+class _AudioServerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<AudioServer> {
   AudioServer _impl;
 
-  AudioServerStub.fromEndpoint(
+  _AudioServerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [AudioServer impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AudioServerStub.fromHandle(
+  _AudioServerStubControl.fromHandle(
       core.MojoHandle handle, [AudioServer impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AudioServerStub.unbound([this._impl]) : super.unbound();
-
-  static AudioServerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AudioServerStub"));
-    return new AudioServerStub.fromEndpoint(endpoint);
-  }
+  _AudioServerStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -238,9 +232,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "AudioServerStub($superString)";
+    return "_AudioServerStubControl($superString)";
   }
 
   int get version => 0;
@@ -254,5 +249,34 @@
   }
 }
 
+class AudioServerStub
+    extends bindings.Stub<AudioServer>
+    implements AudioServer {
+  AudioServerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [AudioServer impl])
+      : super(new _AudioServerStubControl.fromEndpoint(endpoint, impl));
+
+  AudioServerStub.fromHandle(
+      core.MojoHandle handle, [AudioServer impl])
+      : super(new _AudioServerStubControl.fromHandle(handle, impl));
+
+  AudioServerStub.unbound([AudioServer impl])
+      : super(new _AudioServerStubControl.unbound(impl));
+
+  static AudioServerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AudioServerStub"));
+    return new AudioServerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _AudioServerStubControl.serviceDescription;
+
+
+  void createTrack(Object track) {
+    return impl.createTrack(track);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart
index 38cf4a8..184f34d 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart
@@ -586,9 +586,9 @@
   static const double kMaxGain = 20.0;
 }
 
-
-class _AudioTrackProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _AudioTrackProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _AudioTrackProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -602,7 +602,6 @@
 
   String get serviceName => AudioTrack.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _audioTrackMethodDescribeName:
@@ -639,9 +638,9 @@
   }
 }
 
-
-class AudioTrackProxy extends bindings.Proxy
-                              implements AudioTrack {
+class AudioTrackProxy
+    extends bindings.Proxy
+    implements AudioTrack {
   AudioTrackProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _AudioTrackProxyControl.fromEndpoint(endpoint));
@@ -707,29 +706,24 @@
   }
 }
 
-
-class AudioTrackStub extends bindings.Stub {
+class _AudioTrackStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<AudioTrack> {
   AudioTrack _impl;
 
-  AudioTrackStub.fromEndpoint(
+  _AudioTrackStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [AudioTrack impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AudioTrackStub.fromHandle(
+  _AudioTrackStubControl.fromHandle(
       core.MojoHandle handle, [AudioTrack impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  AudioTrackStub.unbound([this._impl]) : super.unbound();
-
-  static AudioTrackStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For AudioTrackStub"));
-    return new AudioTrackStub.fromEndpoint(endpoint);
-  }
+  _AudioTrackStubControl.unbound([this._impl]) : super.unbound();
 
 
   AudioTrackDescribeResponseParams _audioTrackDescribeResponseParamsFactory(AudioTrackDescriptor descriptor) {
@@ -809,9 +803,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "AudioTrackStub($superString)";
+    return "_AudioTrackStubControl($superString)";
   }
 
   int get version => 0;
@@ -825,5 +820,43 @@
   }
 }
 
+class AudioTrackStub
+    extends bindings.Stub<AudioTrack>
+    implements AudioTrack {
+  AudioTrackStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [AudioTrack impl])
+      : super(new _AudioTrackStubControl.fromEndpoint(endpoint, impl));
+
+  AudioTrackStub.fromHandle(
+      core.MojoHandle handle, [AudioTrack impl])
+      : super(new _AudioTrackStubControl.fromHandle(handle, impl));
+
+  AudioTrackStub.unbound([AudioTrack impl])
+      : super(new _AudioTrackStubControl.unbound(impl));
+
+  static AudioTrackStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For AudioTrackStub"));
+    return new AudioTrackStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _AudioTrackStubControl.serviceDescription;
+
+
+  dynamic describe([Function responseFactory = null]) {
+    return impl.describe(responseFactory);
+  }
+  void configure(AudioTrackConfiguration configuration, Object pipe) {
+    return impl.configure(configuration, pipe);
+  }
+  void getRateControl(Object rateControl) {
+    return impl.getRateControl(rateControl);
+  }
+  void setGain(double dbGain) {
+    return impl.setGain(dbGain);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_demux.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_demux.mojom.dart
index e777da4..a75dbfb 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_demux.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_demux.mojom.dart
@@ -792,9 +792,9 @@
   static const int kInitialMetadata = 0;
 }
 
-
-class _MediaDemuxProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MediaDemuxProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MediaDemuxProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -808,7 +808,6 @@
 
   String get serviceName => MediaDemux.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaDemuxMethodDescribeName:
@@ -925,9 +924,9 @@
   }
 }
 
-
-class MediaDemuxProxy extends bindings.Proxy
-                              implements MediaDemux {
+class MediaDemuxProxy
+    extends bindings.Proxy
+    implements MediaDemux {
   MediaDemuxProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MediaDemuxProxyControl.fromEndpoint(endpoint));
@@ -1007,29 +1006,24 @@
   }
 }
 
-
-class MediaDemuxStub extends bindings.Stub {
+class _MediaDemuxStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MediaDemux> {
   MediaDemux _impl;
 
-  MediaDemuxStub.fromEndpoint(
+  _MediaDemuxStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MediaDemux impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaDemuxStub.fromHandle(
+  _MediaDemuxStubControl.fromHandle(
       core.MojoHandle handle, [MediaDemux impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaDemuxStub.unbound([this._impl]) : super.unbound();
-
-  static MediaDemuxStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaDemuxStub"));
-    return new MediaDemuxStub.fromEndpoint(endpoint);
-  }
+  _MediaDemuxStubControl.unbound([this._impl]) : super.unbound();
 
 
   MediaDemuxDescribeResponseParams _mediaDemuxDescribeResponseParamsFactory(List<media_types_mojom.MediaType> streamTypes) {
@@ -1201,9 +1195,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MediaDemuxStub($superString)";
+    return "_MediaDemuxStubControl($superString)";
   }
 
   int get version => 0;
@@ -1217,5 +1212,49 @@
   }
 }
 
+class MediaDemuxStub
+    extends bindings.Stub<MediaDemux>
+    implements MediaDemux {
+  MediaDemuxStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MediaDemux impl])
+      : super(new _MediaDemuxStubControl.fromEndpoint(endpoint, impl));
+
+  MediaDemuxStub.fromHandle(
+      core.MojoHandle handle, [MediaDemux impl])
+      : super(new _MediaDemuxStubControl.fromHandle(handle, impl));
+
+  MediaDemuxStub.unbound([MediaDemux impl])
+      : super(new _MediaDemuxStubControl.unbound(impl));
+
+  static MediaDemuxStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaDemuxStub"));
+    return new MediaDemuxStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MediaDemuxStubControl.serviceDescription;
+
+
+  dynamic describe([Function responseFactory = null]) {
+    return impl.describe(responseFactory);
+  }
+  void getProducer(int streamIndex, Object producer) {
+    return impl.getProducer(streamIndex, producer);
+  }
+  dynamic getMetadata(int versionLastSeen,[Function responseFactory = null]) {
+    return impl.getMetadata(versionLastSeen,responseFactory);
+  }
+  dynamic prime([Function responseFactory = null]) {
+    return impl.prime(responseFactory);
+  }
+  dynamic flush([Function responseFactory = null]) {
+    return impl.flush(responseFactory);
+  }
+  dynamic seek(int position,[Function responseFactory = null]) {
+    return impl.seek(position,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_factory.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_factory.mojom.dart
index 5cb1536..f44aae4 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_factory.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_factory.mojom.dart
@@ -594,9 +594,9 @@
   void createNetworkReader(String url, Object reader);
 }
 
-
-class _MediaFactoryProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MediaFactoryProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MediaFactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -610,7 +610,6 @@
 
   String get serviceName => MediaFactory.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -627,9 +626,9 @@
   }
 }
 
-
-class MediaFactoryProxy extends bindings.Proxy
-                              implements MediaFactory {
+class MediaFactoryProxy
+    extends bindings.Proxy
+    implements MediaFactory {
   MediaFactoryProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MediaFactoryProxyControl.fromEndpoint(endpoint));
@@ -724,29 +723,24 @@
   }
 }
 
-
-class MediaFactoryStub extends bindings.Stub {
+class _MediaFactoryStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MediaFactory> {
   MediaFactory _impl;
 
-  MediaFactoryStub.fromEndpoint(
+  _MediaFactoryStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MediaFactory impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaFactoryStub.fromHandle(
+  _MediaFactoryStubControl.fromHandle(
       core.MojoHandle handle, [MediaFactory impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaFactoryStub.unbound([this._impl]) : super.unbound();
-
-  static MediaFactoryStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaFactoryStub"));
-    return new MediaFactoryStub.fromEndpoint(endpoint);
-  }
+  _MediaFactoryStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -816,9 +810,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MediaFactoryStub($superString)";
+    return "_MediaFactoryStubControl($superString)";
   }
 
   int get version => 0;
@@ -832,5 +827,49 @@
   }
 }
 
+class MediaFactoryStub
+    extends bindings.Stub<MediaFactory>
+    implements MediaFactory {
+  MediaFactoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MediaFactory impl])
+      : super(new _MediaFactoryStubControl.fromEndpoint(endpoint, impl));
+
+  MediaFactoryStub.fromHandle(
+      core.MojoHandle handle, [MediaFactory impl])
+      : super(new _MediaFactoryStubControl.fromHandle(handle, impl));
+
+  MediaFactoryStub.unbound([MediaFactory impl])
+      : super(new _MediaFactoryStubControl.unbound(impl));
+
+  static MediaFactoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaFactoryStub"));
+    return new MediaFactoryStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MediaFactoryStubControl.serviceDescription;
+
+
+  void createPlayer(Object reader, Object player) {
+    return impl.createPlayer(reader, player);
+  }
+  void createSource(Object reader, List<media_types_mojom.MediaTypeSet> allowedMediaTypes, Object source) {
+    return impl.createSource(reader, allowedMediaTypes, source);
+  }
+  void createSink(String destinationUrl, media_types_mojom.MediaType mediaType, Object sink) {
+    return impl.createSink(destinationUrl, mediaType, sink);
+  }
+  void createDemux(Object reader, Object demux) {
+    return impl.createDemux(reader, demux);
+  }
+  void createDecoder(media_types_mojom.MediaType inputMediaType, Object decoder) {
+    return impl.createDecoder(inputMediaType, decoder);
+  }
+  void createNetworkReader(String url, Object reader) {
+    return impl.createNetworkReader(url, reader);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart
index e08166b..f17de6b 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart
@@ -490,9 +490,9 @@
   static const int kInitialStatus = 0;
 }
 
-
-class _MediaPlayerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MediaPlayerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MediaPlayerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -506,7 +506,6 @@
 
   String get serviceName => MediaPlayer.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaPlayerMethodGetStatusName:
@@ -543,9 +542,9 @@
   }
 }
 
-
-class MediaPlayerProxy extends bindings.Proxy
-                              implements MediaPlayer {
+class MediaPlayerProxy
+    extends bindings.Proxy
+    implements MediaPlayer {
   MediaPlayerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MediaPlayerProxyControl.fromEndpoint(endpoint));
@@ -609,29 +608,24 @@
   }
 }
 
-
-class MediaPlayerStub extends bindings.Stub {
+class _MediaPlayerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MediaPlayer> {
   MediaPlayer _impl;
 
-  MediaPlayerStub.fromEndpoint(
+  _MediaPlayerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MediaPlayer impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaPlayerStub.fromHandle(
+  _MediaPlayerStubControl.fromHandle(
       core.MojoHandle handle, [MediaPlayer impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaPlayerStub.unbound([this._impl]) : super.unbound();
-
-  static MediaPlayerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaPlayerStub"));
-    return new MediaPlayerStub.fromEndpoint(endpoint);
-  }
+  _MediaPlayerStubControl.unbound([this._impl]) : super.unbound();
 
 
   MediaPlayerGetStatusResponseParams _mediaPlayerGetStatusResponseParamsFactory(int version, MediaPlayerStatus status) {
@@ -710,9 +704,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MediaPlayerStub($superString)";
+    return "_MediaPlayerStubControl($superString)";
   }
 
   int get version => 0;
@@ -726,5 +721,43 @@
   }
 }
 
+class MediaPlayerStub
+    extends bindings.Stub<MediaPlayer>
+    implements MediaPlayer {
+  MediaPlayerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MediaPlayer impl])
+      : super(new _MediaPlayerStubControl.fromEndpoint(endpoint, impl));
+
+  MediaPlayerStub.fromHandle(
+      core.MojoHandle handle, [MediaPlayer impl])
+      : super(new _MediaPlayerStubControl.fromHandle(handle, impl));
+
+  MediaPlayerStub.unbound([MediaPlayer impl])
+      : super(new _MediaPlayerStubControl.unbound(impl));
+
+  static MediaPlayerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaPlayerStub"));
+    return new MediaPlayerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MediaPlayerStubControl.serviceDescription;
+
+
+  void play() {
+    return impl.play();
+  }
+  void pause() {
+    return impl.pause();
+  }
+  void seek(int position) {
+    return impl.seek(position);
+  }
+  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
+    return impl.getStatus(versionLastSeen,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart
index 27cd180..8a1771b 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart
@@ -474,9 +474,9 @@
   static const int kInitialStatus = 0;
 }
 
-
-class _MediaSinkProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MediaSinkProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MediaSinkProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -490,7 +490,6 @@
 
   String get serviceName => MediaSink.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaSinkMethodGetStatusName:
@@ -527,9 +526,9 @@
   }
 }
 
-
-class MediaSinkProxy extends bindings.Proxy
-                              implements MediaSink {
+class MediaSinkProxy
+    extends bindings.Proxy
+    implements MediaSink {
   MediaSinkProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MediaSinkProxyControl.fromEndpoint(endpoint));
@@ -593,29 +592,24 @@
   }
 }
 
-
-class MediaSinkStub extends bindings.Stub {
+class _MediaSinkStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MediaSink> {
   MediaSink _impl;
 
-  MediaSinkStub.fromEndpoint(
+  _MediaSinkStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MediaSink impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaSinkStub.fromHandle(
+  _MediaSinkStubControl.fromHandle(
       core.MojoHandle handle, [MediaSink impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaSinkStub.unbound([this._impl]) : super.unbound();
-
-  static MediaSinkStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaSinkStub"));
-    return new MediaSinkStub.fromEndpoint(endpoint);
-  }
+  _MediaSinkStubControl.unbound([this._impl]) : super.unbound();
 
 
   MediaSinkGetStatusResponseParams _mediaSinkGetStatusResponseParamsFactory(int version, MediaSinkStatus status) {
@@ -694,9 +688,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MediaSinkStub($superString)";
+    return "_MediaSinkStubControl($superString)";
   }
 
   int get version => 0;
@@ -710,5 +705,43 @@
   }
 }
 
+class MediaSinkStub
+    extends bindings.Stub<MediaSink>
+    implements MediaSink {
+  MediaSinkStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MediaSink impl])
+      : super(new _MediaSinkStubControl.fromEndpoint(endpoint, impl));
+
+  MediaSinkStub.fromHandle(
+      core.MojoHandle handle, [MediaSink impl])
+      : super(new _MediaSinkStubControl.fromHandle(handle, impl));
+
+  MediaSinkStub.unbound([MediaSink impl])
+      : super(new _MediaSinkStubControl.unbound(impl));
+
+  static MediaSinkStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaSinkStub"));
+    return new MediaSinkStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MediaSinkStubControl.serviceDescription;
+
+
+  void getConsumer(Object consumer) {
+    return impl.getConsumer(consumer);
+  }
+  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
+    return impl.getStatus(versionLastSeen,responseFactory);
+  }
+  void play() {
+    return impl.play();
+  }
+  void pause() {
+    return impl.pause();
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart
index 42f3664..a664f37 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart
@@ -1190,9 +1190,9 @@
   static const int kInitialStatus = 0;
 }
 
-
-class _MediaSourceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MediaSourceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MediaSourceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1206,7 +1206,6 @@
 
   String get serviceName => MediaSource.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaSourceMethodGetStreamsName:
@@ -1343,9 +1342,9 @@
   }
 }
 
-
-class MediaSourceProxy extends bindings.Proxy
-                              implements MediaSource {
+class MediaSourceProxy
+    extends bindings.Proxy
+    implements MediaSource {
   MediaSourceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MediaSourceProxyControl.fromEndpoint(endpoint));
@@ -1444,29 +1443,24 @@
   }
 }
 
-
-class MediaSourceStub extends bindings.Stub {
+class _MediaSourceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MediaSource> {
   MediaSource _impl;
 
-  MediaSourceStub.fromEndpoint(
+  _MediaSourceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MediaSource impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaSourceStub.fromHandle(
+  _MediaSourceStubControl.fromHandle(
       core.MojoHandle handle, [MediaSource impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaSourceStub.unbound([this._impl]) : super.unbound();
-
-  static MediaSourceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaSourceStub"));
-    return new MediaSourceStub.fromEndpoint(endpoint);
-  }
+  _MediaSourceStubControl.unbound([this._impl]) : super.unbound();
 
 
   MediaSourceGetStreamsResponseParams _mediaSourceGetStreamsResponseParamsFactory(List<MediaSourceStreamDescriptor> streams) {
@@ -1667,9 +1661,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MediaSourceStub($superString)";
+    return "_MediaSourceStubControl($superString)";
   }
 
   int get version => 0;
@@ -1683,5 +1678,55 @@
   }
 }
 
+class MediaSourceStub
+    extends bindings.Stub<MediaSource>
+    implements MediaSource {
+  MediaSourceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MediaSource impl])
+      : super(new _MediaSourceStubControl.fromEndpoint(endpoint, impl));
+
+  MediaSourceStub.fromHandle(
+      core.MojoHandle handle, [MediaSource impl])
+      : super(new _MediaSourceStubControl.fromHandle(handle, impl));
+
+  MediaSourceStub.unbound([MediaSource impl])
+      : super(new _MediaSourceStubControl.unbound(impl));
+
+  static MediaSourceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaSourceStub"));
+    return new MediaSourceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MediaSourceStubControl.serviceDescription;
+
+
+  dynamic getStreams([Function responseFactory = null]) {
+    return impl.getStreams(responseFactory);
+  }
+  void getProducer(int streamIndex, Object producer) {
+    return impl.getProducer(streamIndex, producer);
+  }
+  void getPullModeProducer(int streamIndex, Object producer) {
+    return impl.getPullModeProducer(streamIndex, producer);
+  }
+  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
+    return impl.getStatus(versionLastSeen,responseFactory);
+  }
+  dynamic prepare([Function responseFactory = null]) {
+    return impl.prepare(responseFactory);
+  }
+  dynamic prime([Function responseFactory = null]) {
+    return impl.prime(responseFactory);
+  }
+  dynamic flush([Function responseFactory = null]) {
+    return impl.flush(responseFactory);
+  }
+  dynamic seek(int position,[Function responseFactory = null]) {
+    return impl.seek(position,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_transport.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_transport.mojom.dart
index 40d90f9..85e61c0 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_transport.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_transport.mojom.dart
@@ -1294,9 +1294,9 @@
   void disconnect();
 }
 
-
-class _MediaProducerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MediaProducerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MediaProducerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1310,7 +1310,6 @@
 
   String get serviceName => MediaProducer.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaProducerMethodConnectName:
@@ -1347,9 +1346,9 @@
   }
 }
 
-
-class MediaProducerProxy extends bindings.Proxy
-                              implements MediaProducer {
+class MediaProducerProxy
+    extends bindings.Proxy
+    implements MediaProducer {
   MediaProducerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MediaProducerProxyControl.fromEndpoint(endpoint));
@@ -1394,29 +1393,24 @@
   }
 }
 
-
-class MediaProducerStub extends bindings.Stub {
+class _MediaProducerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MediaProducer> {
   MediaProducer _impl;
 
-  MediaProducerStub.fromEndpoint(
+  _MediaProducerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MediaProducer impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaProducerStub.fromHandle(
+  _MediaProducerStubControl.fromHandle(
       core.MojoHandle handle, [MediaProducer impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaProducerStub.unbound([this._impl]) : super.unbound();
-
-  static MediaProducerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaProducerStub"));
-    return new MediaProducerStub.fromEndpoint(endpoint);
-  }
+  _MediaProducerStubControl.unbound([this._impl]) : super.unbound();
 
 
   MediaProducerConnectResponseParams _mediaProducerConnectResponseParamsFactory() {
@@ -1485,9 +1479,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MediaProducerStub($superString)";
+    return "_MediaProducerStubControl($superString)";
   }
 
   int get version => 0;
@@ -1501,6 +1496,38 @@
   }
 }
 
+class MediaProducerStub
+    extends bindings.Stub<MediaProducer>
+    implements MediaProducer {
+  MediaProducerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MediaProducer impl])
+      : super(new _MediaProducerStubControl.fromEndpoint(endpoint, impl));
+
+  MediaProducerStub.fromHandle(
+      core.MojoHandle handle, [MediaProducer impl])
+      : super(new _MediaProducerStubControl.fromHandle(handle, impl));
+
+  MediaProducerStub.unbound([MediaProducer impl])
+      : super(new _MediaProducerStubControl.unbound(impl));
+
+  static MediaProducerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaProducerStub"));
+    return new MediaProducerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MediaProducerStubControl.serviceDescription;
+
+
+  dynamic connect(Object consumer,[Function responseFactory = null]) {
+    return impl.connect(consumer,responseFactory);
+  }
+  void disconnect() {
+    return impl.disconnect();
+  }
+}
+
 const int _mediaPullModeProducerMethodGetBufferName = 0;
 const int _mediaPullModeProducerMethodPullPacketName = 1;
 const int _mediaPullModeProducerMethodReleasePacketName = 2;
@@ -1523,9 +1550,9 @@
   void releasePacket(MediaPacket toRelease);
 }
 
-
-class _MediaPullModeProducerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MediaPullModeProducerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MediaPullModeProducerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1539,7 +1566,6 @@
 
   String get serviceName => MediaPullModeProducer.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaPullModeProducerMethodGetBufferName:
@@ -1596,9 +1622,9 @@
   }
 }
 
-
-class MediaPullModeProducerProxy extends bindings.Proxy
-                              implements MediaPullModeProducer {
+class MediaPullModeProducerProxy
+    extends bindings.Proxy
+    implements MediaPullModeProducer {
   MediaPullModeProducerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MediaPullModeProducerProxyControl.fromEndpoint(endpoint));
@@ -1652,29 +1678,24 @@
   }
 }
 
-
-class MediaPullModeProducerStub extends bindings.Stub {
+class _MediaPullModeProducerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MediaPullModeProducer> {
   MediaPullModeProducer _impl;
 
-  MediaPullModeProducerStub.fromEndpoint(
+  _MediaPullModeProducerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MediaPullModeProducer impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaPullModeProducerStub.fromHandle(
+  _MediaPullModeProducerStubControl.fromHandle(
       core.MojoHandle handle, [MediaPullModeProducer impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaPullModeProducerStub.unbound([this._impl]) : super.unbound();
-
-  static MediaPullModeProducerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaPullModeProducerStub"));
-    return new MediaPullModeProducerStub.fromEndpoint(endpoint);
-  }
+  _MediaPullModeProducerStubControl.unbound([this._impl]) : super.unbound();
 
 
   MediaPullModeProducerGetBufferResponseParams _mediaPullModeProducerGetBufferResponseParamsFactory(core.MojoSharedBuffer buffer) {
@@ -1771,9 +1792,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MediaPullModeProducerStub($superString)";
+    return "_MediaPullModeProducerStubControl($superString)";
   }
 
   int get version => 0;
@@ -1787,6 +1809,41 @@
   }
 }
 
+class MediaPullModeProducerStub
+    extends bindings.Stub<MediaPullModeProducer>
+    implements MediaPullModeProducer {
+  MediaPullModeProducerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MediaPullModeProducer impl])
+      : super(new _MediaPullModeProducerStubControl.fromEndpoint(endpoint, impl));
+
+  MediaPullModeProducerStub.fromHandle(
+      core.MojoHandle handle, [MediaPullModeProducer impl])
+      : super(new _MediaPullModeProducerStubControl.fromHandle(handle, impl));
+
+  MediaPullModeProducerStub.unbound([MediaPullModeProducer impl])
+      : super(new _MediaPullModeProducerStubControl.unbound(impl));
+
+  static MediaPullModeProducerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaPullModeProducerStub"));
+    return new MediaPullModeProducerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MediaPullModeProducerStubControl.serviceDescription;
+
+
+  dynamic getBuffer([Function responseFactory = null]) {
+    return impl.getBuffer(responseFactory);
+  }
+  dynamic pullPacket(MediaPacket toRelease,[Function responseFactory = null]) {
+    return impl.pullPacket(toRelease,responseFactory);
+  }
+  void releasePacket(MediaPacket toRelease) {
+    return impl.releasePacket(toRelease);
+  }
+}
+
 const int _mediaConsumerMethodSetBufferName = 0;
 const int _mediaConsumerMethodSendPacketName = 1;
 const int _mediaConsumerMethodPrimeName = 2;
@@ -1864,9 +1921,9 @@
   static const int kMaxBufferLen = 4611686018427387903;
 }
 
-
-class _MediaConsumerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MediaConsumerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MediaConsumerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1880,7 +1937,6 @@
 
   String get serviceName => MediaConsumer.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaConsumerMethodSetBufferName:
@@ -1977,9 +2033,9 @@
   }
 }
 
-
-class MediaConsumerProxy extends bindings.Proxy
-                              implements MediaConsumer {
+class MediaConsumerProxy
+    extends bindings.Proxy
+    implements MediaConsumer {
   MediaConsumerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MediaConsumerProxyControl.fromEndpoint(endpoint));
@@ -2040,29 +2096,24 @@
   }
 }
 
-
-class MediaConsumerStub extends bindings.Stub {
+class _MediaConsumerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MediaConsumer> {
   MediaConsumer _impl;
 
-  MediaConsumerStub.fromEndpoint(
+  _MediaConsumerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MediaConsumer impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaConsumerStub.fromHandle(
+  _MediaConsumerStubControl.fromHandle(
       core.MojoHandle handle, [MediaConsumer impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaConsumerStub.unbound([this._impl]) : super.unbound();
-
-  static MediaConsumerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaConsumerStub"));
-    return new MediaConsumerStub.fromEndpoint(endpoint);
-  }
+  _MediaConsumerStubControl.unbound([this._impl]) : super.unbound();
 
 
   MediaConsumerSetBufferResponseParams _mediaConsumerSetBufferResponseParamsFactory() {
@@ -2203,9 +2254,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MediaConsumerStub($superString)";
+    return "_MediaConsumerStubControl($superString)";
   }
 
   int get version => 0;
@@ -2219,5 +2271,43 @@
   }
 }
 
+class MediaConsumerStub
+    extends bindings.Stub<MediaConsumer>
+    implements MediaConsumer {
+  MediaConsumerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MediaConsumer impl])
+      : super(new _MediaConsumerStubControl.fromEndpoint(endpoint, impl));
+
+  MediaConsumerStub.fromHandle(
+      core.MojoHandle handle, [MediaConsumer impl])
+      : super(new _MediaConsumerStubControl.fromHandle(handle, impl));
+
+  MediaConsumerStub.unbound([MediaConsumer impl])
+      : super(new _MediaConsumerStubControl.unbound(impl));
+
+  static MediaConsumerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaConsumerStub"));
+    return new MediaConsumerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MediaConsumerStubControl.serviceDescription;
+
+
+  dynamic setBuffer(core.MojoSharedBuffer buffer,[Function responseFactory = null]) {
+    return impl.setBuffer(buffer,responseFactory);
+  }
+  dynamic sendPacket(MediaPacket packet,[Function responseFactory = null]) {
+    return impl.sendPacket(packet,responseFactory);
+  }
+  dynamic prime([Function responseFactory = null]) {
+    return impl.prime(responseFactory);
+  }
+  dynamic flush([Function responseFactory = null]) {
+    return impl.flush(responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_type_converter.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_type_converter.mojom.dart
index 45ff36f..57bc990 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_type_converter.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_type_converter.mojom.dart
@@ -306,9 +306,9 @@
   void getProducer(Object producer);
 }
 
-
-class _MediaTypeConverterProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MediaTypeConverterProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MediaTypeConverterProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -322,7 +322,6 @@
 
   String get serviceName => MediaTypeConverter.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaTypeConverterMethodGetOutputTypeName:
@@ -359,9 +358,9 @@
   }
 }
 
-
-class MediaTypeConverterProxy extends bindings.Proxy
-                              implements MediaTypeConverter {
+class MediaTypeConverterProxy
+    extends bindings.Proxy
+    implements MediaTypeConverter {
   MediaTypeConverterProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MediaTypeConverterProxyControl.fromEndpoint(endpoint));
@@ -416,29 +415,24 @@
   }
 }
 
-
-class MediaTypeConverterStub extends bindings.Stub {
+class _MediaTypeConverterStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MediaTypeConverter> {
   MediaTypeConverter _impl;
 
-  MediaTypeConverterStub.fromEndpoint(
+  _MediaTypeConverterStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MediaTypeConverter impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaTypeConverterStub.fromHandle(
+  _MediaTypeConverterStubControl.fromHandle(
       core.MojoHandle handle, [MediaTypeConverter impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaTypeConverterStub.unbound([this._impl]) : super.unbound();
-
-  static MediaTypeConverterStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaTypeConverterStub"));
-    return new MediaTypeConverterStub.fromEndpoint(endpoint);
-  }
+  _MediaTypeConverterStubControl.unbound([this._impl]) : super.unbound();
 
 
   MediaTypeConverterGetOutputTypeResponseParams _mediaTypeConverterGetOutputTypeResponseParamsFactory(media_types_mojom.MediaType outputType) {
@@ -513,9 +507,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MediaTypeConverterStub($superString)";
+    return "_MediaTypeConverterStubControl($superString)";
   }
 
   int get version => 0;
@@ -529,5 +524,40 @@
   }
 }
 
+class MediaTypeConverterStub
+    extends bindings.Stub<MediaTypeConverter>
+    implements MediaTypeConverter {
+  MediaTypeConverterStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MediaTypeConverter impl])
+      : super(new _MediaTypeConverterStubControl.fromEndpoint(endpoint, impl));
+
+  MediaTypeConverterStub.fromHandle(
+      core.MojoHandle handle, [MediaTypeConverter impl])
+      : super(new _MediaTypeConverterStubControl.fromHandle(handle, impl));
+
+  MediaTypeConverterStub.unbound([MediaTypeConverter impl])
+      : super(new _MediaTypeConverterStubControl.unbound(impl));
+
+  static MediaTypeConverterStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaTypeConverterStub"));
+    return new MediaTypeConverterStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MediaTypeConverterStubControl.serviceDescription;
+
+
+  dynamic getOutputType([Function responseFactory = null]) {
+    return impl.getOutputType(responseFactory);
+  }
+  void getConsumer(Object consumer) {
+    return impl.getConsumer(consumer);
+  }
+  void getProducer(Object producer) {
+    return impl.getProducer(producer);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/rate_control.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/rate_control.mojom.dart
index 283e0d6..311e0c6 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/rate_control.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/rate_control.mojom.dart
@@ -876,9 +876,9 @@
   void cancelPendingChanges();
 }
 
-
-class _RateControlProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _RateControlProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _RateControlProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -892,7 +892,6 @@
 
   String get serviceName => RateControl.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _rateControlMethodGetCurrentTransformName:
@@ -929,9 +928,9 @@
   }
 }
 
-
-class RateControlProxy extends bindings.Proxy
-                              implements RateControl {
+class RateControlProxy
+    extends bindings.Proxy
+    implements RateControl {
   RateControlProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _RateControlProxyControl.fromEndpoint(endpoint));
@@ -1030,29 +1029,24 @@
   }
 }
 
-
-class RateControlStub extends bindings.Stub {
+class _RateControlStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<RateControl> {
   RateControl _impl;
 
-  RateControlStub.fromEndpoint(
+  _RateControlStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [RateControl impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  RateControlStub.fromHandle(
+  _RateControlStubControl.fromHandle(
       core.MojoHandle handle, [RateControl impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  RateControlStub.unbound([this._impl]) : super.unbound();
-
-  static RateControlStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For RateControlStub"));
-    return new RateControlStub.fromEndpoint(endpoint);
-  }
+  _RateControlStubControl.unbound([this._impl]) : super.unbound();
 
 
   RateControlGetCurrentTransformResponseParams _rateControlGetCurrentTransformResponseParamsFactory(TimelineTransform trans) {
@@ -1145,9 +1139,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "RateControlStub($superString)";
+    return "_RateControlStubControl($superString)";
   }
 
   int get version => 0;
@@ -1161,5 +1156,52 @@
   }
 }
 
+class RateControlStub
+    extends bindings.Stub<RateControl>
+    implements RateControl {
+  RateControlStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [RateControl impl])
+      : super(new _RateControlStubControl.fromEndpoint(endpoint, impl));
+
+  RateControlStub.fromHandle(
+      core.MojoHandle handle, [RateControl impl])
+      : super(new _RateControlStubControl.fromHandle(handle, impl));
+
+  RateControlStub.unbound([RateControl impl])
+      : super(new _RateControlStubControl.unbound(impl));
+
+  static RateControlStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For RateControlStub"));
+    return new RateControlStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _RateControlStubControl.serviceDescription;
+
+
+  dynamic getCurrentTransform([Function responseFactory = null]) {
+    return impl.getCurrentTransform(responseFactory);
+  }
+  void setCurrentQuad(TimelineQuad quad) {
+    return impl.setCurrentQuad(quad);
+  }
+  void setTargetTimelineId(int id) {
+    return impl.setTargetTimelineId(id);
+  }
+  void setRate(int referenceDelta, int targetDelta) {
+    return impl.setRate(referenceDelta, targetDelta);
+  }
+  void setRateAtReferenceTime(int referenceDelta, int targetDelta, int referenceTime) {
+    return impl.setRateAtReferenceTime(referenceDelta, targetDelta, referenceTime);
+  }
+  void setRateAtTargetTime(int referenceDelta, int targetDelta, int targetTime) {
+    return impl.setRateAtTargetTime(referenceDelta, targetDelta, targetTime);
+  }
+  void cancelPendingChanges() {
+    return impl.cancelPendingChanges();
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/seeking_reader.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/seeking_reader.mojom.dart
index ab156dd..68a1a91 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/seeking_reader.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/seeking_reader.mojom.dart
@@ -353,9 +353,9 @@
   static const int kUnknownSize = 18446744073709551615;
 }
 
-
-class _SeekingReaderProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SeekingReaderProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SeekingReaderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -369,7 +369,6 @@
 
   String get serviceName => SeekingReader.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _seekingReaderMethodDescribeName:
@@ -426,9 +425,9 @@
   }
 }
 
-
-class SeekingReaderProxy extends bindings.Proxy
-                              implements SeekingReader {
+class SeekingReaderProxy
+    extends bindings.Proxy
+    implements SeekingReader {
   SeekingReaderProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SeekingReaderProxyControl.fromEndpoint(endpoint));
@@ -472,29 +471,24 @@
   }
 }
 
-
-class SeekingReaderStub extends bindings.Stub {
+class _SeekingReaderStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<SeekingReader> {
   SeekingReader _impl;
 
-  SeekingReaderStub.fromEndpoint(
+  _SeekingReaderStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [SeekingReader impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SeekingReaderStub.fromHandle(
+  _SeekingReaderStubControl.fromHandle(
       core.MojoHandle handle, [SeekingReader impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SeekingReaderStub.unbound([this._impl]) : super.unbound();
-
-  static SeekingReaderStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SeekingReaderStub"));
-    return new SeekingReaderStub.fromEndpoint(endpoint);
-  }
+  _SeekingReaderStubControl.unbound([this._impl]) : super.unbound();
 
 
   SeekingReaderDescribeResponseParams _seekingReaderDescribeResponseParamsFactory(media_common_mojom.MediaResult result, int size, bool canSeek) {
@@ -589,9 +583,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SeekingReaderStub($superString)";
+    return "_SeekingReaderStubControl($superString)";
   }
 
   int get version => 0;
@@ -605,5 +600,37 @@
   }
 }
 
+class SeekingReaderStub
+    extends bindings.Stub<SeekingReader>
+    implements SeekingReader {
+  SeekingReaderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [SeekingReader impl])
+      : super(new _SeekingReaderStubControl.fromEndpoint(endpoint, impl));
+
+  SeekingReaderStub.fromHandle(
+      core.MojoHandle handle, [SeekingReader impl])
+      : super(new _SeekingReaderStubControl.fromHandle(handle, impl));
+
+  SeekingReaderStub.unbound([SeekingReader impl])
+      : super(new _SeekingReaderStubControl.unbound(impl));
+
+  static SeekingReaderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SeekingReaderStub"));
+    return new SeekingReaderStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SeekingReaderStubControl.serviceDescription;
+
+
+  dynamic describe([Function responseFactory = null]) {
+    return impl.describe(responseFactory);
+  }
+  dynamic readAt(int position,[Function responseFactory = null]) {
+    return impl.readAt(position,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart
index efdf793..dca902d 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart
@@ -940,9 +940,9 @@
   static const int kInitialStatus = 0;
 }
 
-
-class _MediaTimelineControllerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MediaTimelineControllerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MediaTimelineControllerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -956,7 +956,6 @@
 
   String get serviceName => MediaTimelineController.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaTimelineControllerMethodGetStatusName:
@@ -1013,9 +1012,9 @@
   }
 }
 
-
-class MediaTimelineControllerProxy extends bindings.Proxy
-                              implements MediaTimelineController {
+class MediaTimelineControllerProxy
+    extends bindings.Proxy
+    implements MediaTimelineController {
   MediaTimelineControllerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MediaTimelineControllerProxyControl.fromEndpoint(endpoint));
@@ -1084,29 +1083,24 @@
   }
 }
 
-
-class MediaTimelineControllerStub extends bindings.Stub {
+class _MediaTimelineControllerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MediaTimelineController> {
   MediaTimelineController _impl;
 
-  MediaTimelineControllerStub.fromEndpoint(
+  _MediaTimelineControllerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MediaTimelineController impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaTimelineControllerStub.fromHandle(
+  _MediaTimelineControllerStubControl.fromHandle(
       core.MojoHandle handle, [MediaTimelineController impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaTimelineControllerStub.unbound([this._impl]) : super.unbound();
-
-  static MediaTimelineControllerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaTimelineControllerStub"));
-    return new MediaTimelineControllerStub.fromEndpoint(endpoint);
-  }
+  _MediaTimelineControllerStubControl.unbound([this._impl]) : super.unbound();
 
 
   MediaTimelineControllerGetStatusResponseParams _mediaTimelineControllerGetStatusResponseParamsFactory(int version, MediaTimelineControllerStatus status) {
@@ -1211,9 +1205,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MediaTimelineControllerStub($superString)";
+    return "_MediaTimelineControllerStubControl($superString)";
   }
 
   int get version => 0;
@@ -1227,6 +1222,44 @@
   }
 }
 
+class MediaTimelineControllerStub
+    extends bindings.Stub<MediaTimelineController>
+    implements MediaTimelineController {
+  MediaTimelineControllerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MediaTimelineController impl])
+      : super(new _MediaTimelineControllerStubControl.fromEndpoint(endpoint, impl));
+
+  MediaTimelineControllerStub.fromHandle(
+      core.MojoHandle handle, [MediaTimelineController impl])
+      : super(new _MediaTimelineControllerStubControl.fromHandle(handle, impl));
+
+  MediaTimelineControllerStub.unbound([MediaTimelineController impl])
+      : super(new _MediaTimelineControllerStubControl.unbound(impl));
+
+  static MediaTimelineControllerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaTimelineControllerStub"));
+    return new MediaTimelineControllerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MediaTimelineControllerStubControl.serviceDescription;
+
+
+  void addControlSite(Object controlSite) {
+    return impl.addControlSite(controlSite);
+  }
+  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
+    return impl.getStatus(versionLastSeen,responseFactory);
+  }
+  dynamic setTimelineTransform(int subjectTime,int subjectDelta,int referenceDelta,int effectiveSubjectTime,int effectiveReferenceTime,[Function responseFactory = null]) {
+    return impl.setTimelineTransform(subjectTime,subjectDelta,referenceDelta,effectiveSubjectTime,effectiveReferenceTime,responseFactory);
+  }
+  void getControlSite(Object controlSite) {
+    return impl.getControlSite(controlSite);
+  }
+}
+
 const int _mediaTimelineControlSiteMethodGetStatusName = 0;
 const int _mediaTimelineControlSiteMethodGetTimelineConsumerName = 1;
 
@@ -1248,9 +1281,9 @@
   static const int kInitialStatus = 0;
 }
 
-
-class _MediaTimelineControlSiteProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _MediaTimelineControlSiteProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _MediaTimelineControlSiteProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1264,7 +1297,6 @@
 
   String get serviceName => MediaTimelineControlSite.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _mediaTimelineControlSiteMethodGetStatusName:
@@ -1301,9 +1333,9 @@
   }
 }
 
-
-class MediaTimelineControlSiteProxy extends bindings.Proxy
-                              implements MediaTimelineControlSite {
+class MediaTimelineControlSiteProxy
+    extends bindings.Proxy
+    implements MediaTimelineControlSite {
   MediaTimelineControlSiteProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _MediaTimelineControlSiteProxyControl.fromEndpoint(endpoint));
@@ -1349,29 +1381,24 @@
   }
 }
 
-
-class MediaTimelineControlSiteStub extends bindings.Stub {
+class _MediaTimelineControlSiteStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<MediaTimelineControlSite> {
   MediaTimelineControlSite _impl;
 
-  MediaTimelineControlSiteStub.fromEndpoint(
+  _MediaTimelineControlSiteStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [MediaTimelineControlSite impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaTimelineControlSiteStub.fromHandle(
+  _MediaTimelineControlSiteStubControl.fromHandle(
       core.MojoHandle handle, [MediaTimelineControlSite impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  MediaTimelineControlSiteStub.unbound([this._impl]) : super.unbound();
-
-  static MediaTimelineControlSiteStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For MediaTimelineControlSiteStub"));
-    return new MediaTimelineControlSiteStub.fromEndpoint(endpoint);
-  }
+  _MediaTimelineControlSiteStubControl.unbound([this._impl]) : super.unbound();
 
 
   MediaTimelineControlSiteGetStatusResponseParams _mediaTimelineControlSiteGetStatusResponseParamsFactory(int version, MediaTimelineControlSiteStatus status) {
@@ -1444,9 +1471,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "MediaTimelineControlSiteStub($superString)";
+    return "_MediaTimelineControlSiteStubControl($superString)";
   }
 
   int get version => 0;
@@ -1460,5 +1488,37 @@
   }
 }
 
+class MediaTimelineControlSiteStub
+    extends bindings.Stub<MediaTimelineControlSite>
+    implements MediaTimelineControlSite {
+  MediaTimelineControlSiteStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [MediaTimelineControlSite impl])
+      : super(new _MediaTimelineControlSiteStubControl.fromEndpoint(endpoint, impl));
+
+  MediaTimelineControlSiteStub.fromHandle(
+      core.MojoHandle handle, [MediaTimelineControlSite impl])
+      : super(new _MediaTimelineControlSiteStubControl.fromHandle(handle, impl));
+
+  MediaTimelineControlSiteStub.unbound([MediaTimelineControlSite impl])
+      : super(new _MediaTimelineControlSiteStubControl.unbound(impl));
+
+  static MediaTimelineControlSiteStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For MediaTimelineControlSiteStub"));
+    return new MediaTimelineControlSiteStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _MediaTimelineControlSiteStubControl.serviceDescription;
+
+
+  dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
+    return impl.getStatus(versionLastSeen,responseFactory);
+  }
+  void getTimelineConsumer(Object timelineConsumer) {
+    return impl.getTimelineConsumer(timelineConsumer);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/native_viewport_event_dispatcher.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/native_viewport_event_dispatcher.mojom.dart
index e471e66..fd65f52 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/native_viewport_event_dispatcher.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/native_viewport_event_dispatcher.mojom.dart
@@ -159,9 +159,9 @@
   dynamic onEvent(input_events_mojom.Event event,[Function responseFactory = null]);
 }
 
-
-class _NativeViewportEventDispatcherProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _NativeViewportEventDispatcherProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _NativeViewportEventDispatcherProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -175,7 +175,6 @@
 
   String get serviceName => NativeViewportEventDispatcher.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _nativeViewportEventDispatcherMethodOnEventName:
@@ -212,9 +211,9 @@
   }
 }
 
-
-class NativeViewportEventDispatcherProxy extends bindings.Proxy
-                              implements NativeViewportEventDispatcher {
+class NativeViewportEventDispatcherProxy
+    extends bindings.Proxy
+    implements NativeViewportEventDispatcher {
   NativeViewportEventDispatcherProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _NativeViewportEventDispatcherProxyControl.fromEndpoint(endpoint));
@@ -250,29 +249,24 @@
   }
 }
 
-
-class NativeViewportEventDispatcherStub extends bindings.Stub {
+class _NativeViewportEventDispatcherStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<NativeViewportEventDispatcher> {
   NativeViewportEventDispatcher _impl;
 
-  NativeViewportEventDispatcherStub.fromEndpoint(
+  _NativeViewportEventDispatcherStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [NativeViewportEventDispatcher impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NativeViewportEventDispatcherStub.fromHandle(
+  _NativeViewportEventDispatcherStubControl.fromHandle(
       core.MojoHandle handle, [NativeViewportEventDispatcher impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NativeViewportEventDispatcherStub.unbound([this._impl]) : super.unbound();
-
-  static NativeViewportEventDispatcherStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NativeViewportEventDispatcherStub"));
-    return new NativeViewportEventDispatcherStub.fromEndpoint(endpoint);
-  }
+  _NativeViewportEventDispatcherStubControl.unbound([this._impl]) : super.unbound();
 
 
   NativeViewportEventDispatcherOnEventResponseParams _nativeViewportEventDispatcherOnEventResponseParamsFactory() {
@@ -338,9 +332,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "NativeViewportEventDispatcherStub($superString)";
+    return "_NativeViewportEventDispatcherStubControl($superString)";
   }
 
   int get version => 0;
@@ -354,5 +349,34 @@
   }
 }
 
+class NativeViewportEventDispatcherStub
+    extends bindings.Stub<NativeViewportEventDispatcher>
+    implements NativeViewportEventDispatcher {
+  NativeViewportEventDispatcherStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [NativeViewportEventDispatcher impl])
+      : super(new _NativeViewportEventDispatcherStubControl.fromEndpoint(endpoint, impl));
+
+  NativeViewportEventDispatcherStub.fromHandle(
+      core.MojoHandle handle, [NativeViewportEventDispatcher impl])
+      : super(new _NativeViewportEventDispatcherStubControl.fromHandle(handle, impl));
+
+  NativeViewportEventDispatcherStub.unbound([NativeViewportEventDispatcher impl])
+      : super(new _NativeViewportEventDispatcherStubControl.unbound(impl));
+
+  static NativeViewportEventDispatcherStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NativeViewportEventDispatcherStub"));
+    return new NativeViewportEventDispatcherStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _NativeViewportEventDispatcherStubControl.serviceDescription;
+
+
+  dynamic onEvent(input_events_mojom.Event event,[Function responseFactory = null]) {
+    return impl.onEvent(event,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/navigation.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/navigation.mojom.dart
index fca8f2f..f932ea2 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/navigation.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/navigation.mojom.dart
@@ -324,9 +324,9 @@
   void didNavigateLocally(String url);
 }
 
-
-class _NavigatorHostProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _NavigatorHostProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _NavigatorHostProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -340,7 +340,6 @@
 
   String get serviceName => NavigatorHost.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -357,9 +356,9 @@
   }
 }
 
-
-class NavigatorHostProxy extends bindings.Proxy
-                              implements NavigatorHost {
+class NavigatorHostProxy
+    extends bindings.Proxy
+    implements NavigatorHost {
   NavigatorHostProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _NavigatorHostProxyControl.fromEndpoint(endpoint));
@@ -417,29 +416,24 @@
   }
 }
 
-
-class NavigatorHostStub extends bindings.Stub {
+class _NavigatorHostStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<NavigatorHost> {
   NavigatorHost _impl;
 
-  NavigatorHostStub.fromEndpoint(
+  _NavigatorHostStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [NavigatorHost impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NavigatorHostStub.fromHandle(
+  _NavigatorHostStubControl.fromHandle(
       core.MojoHandle handle, [NavigatorHost impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NavigatorHostStub.unbound([this._impl]) : super.unbound();
-
-  static NavigatorHostStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NavigatorHostStub"));
-    return new NavigatorHostStub.fromEndpoint(endpoint);
-  }
+  _NavigatorHostStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -494,9 +488,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "NavigatorHostStub($superString)";
+    return "_NavigatorHostStubControl($superString)";
   }
 
   int get version => 0;
@@ -510,5 +505,40 @@
   }
 }
 
+class NavigatorHostStub
+    extends bindings.Stub<NavigatorHost>
+    implements NavigatorHost {
+  NavigatorHostStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [NavigatorHost impl])
+      : super(new _NavigatorHostStubControl.fromEndpoint(endpoint, impl));
+
+  NavigatorHostStub.fromHandle(
+      core.MojoHandle handle, [NavigatorHost impl])
+      : super(new _NavigatorHostStubControl.fromHandle(handle, impl));
+
+  NavigatorHostStub.unbound([NavigatorHost impl])
+      : super(new _NavigatorHostStubControl.unbound(impl));
+
+  static NavigatorHostStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NavigatorHostStub"));
+    return new NavigatorHostStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _NavigatorHostStubControl.serviceDescription;
+
+
+  void requestNavigate(Target target, url_request_mojom.UrlRequest request) {
+    return impl.requestNavigate(target, request);
+  }
+  void requestNavigateHistory(int delta) {
+    return impl.requestNavigateHistory(delta);
+  }
+  void didNavigateLocally(String url) {
+    return impl.didNavigateLocally(url);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/network_service.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/network_service.mojom.dart
index f0ba093..f31a5c7 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/network_service.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/network_service.mojom.dart
@@ -1025,9 +1025,9 @@
   void createHostResolver(Object hostResolver);
 }
 
-
-class _NetworkServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _NetworkServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _NetworkServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1041,7 +1041,6 @@
 
   String get serviceName => NetworkService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _networkServiceMethodCreateTcpBoundSocketName:
@@ -1118,9 +1117,9 @@
   }
 }
 
-
-class NetworkServiceProxy extends bindings.Proxy
-                              implements NetworkService {
+class NetworkServiceProxy
+    extends bindings.Proxy
+    implements NetworkService {
   NetworkServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _NetworkServiceProxyControl.fromEndpoint(endpoint));
@@ -1239,29 +1238,24 @@
   }
 }
 
-
-class NetworkServiceStub extends bindings.Stub {
+class _NetworkServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<NetworkService> {
   NetworkService _impl;
 
-  NetworkServiceStub.fromEndpoint(
+  _NetworkServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [NetworkService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NetworkServiceStub.fromHandle(
+  _NetworkServiceStubControl.fromHandle(
       core.MojoHandle handle, [NetworkService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NetworkServiceStub.unbound([this._impl]) : super.unbound();
-
-  static NetworkServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NetworkServiceStub"));
-    return new NetworkServiceStub.fromEndpoint(endpoint);
-  }
+  _NetworkServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
   NetworkServiceCreateTcpBoundSocketResponseParams _networkServiceCreateTcpBoundSocketResponseParamsFactory(network_error_mojom.NetworkError result, net_address_mojom.NetAddress boundTo) {
@@ -1415,9 +1409,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "NetworkServiceStub($superString)";
+    return "_NetworkServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -1431,5 +1426,58 @@
   }
 }
 
+class NetworkServiceStub
+    extends bindings.Stub<NetworkService>
+    implements NetworkService {
+  NetworkServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [NetworkService impl])
+      : super(new _NetworkServiceStubControl.fromEndpoint(endpoint, impl));
+
+  NetworkServiceStub.fromHandle(
+      core.MojoHandle handle, [NetworkService impl])
+      : super(new _NetworkServiceStubControl.fromHandle(handle, impl));
+
+  NetworkServiceStub.unbound([NetworkService impl])
+      : super(new _NetworkServiceStubControl.unbound(impl));
+
+  static NetworkServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NetworkServiceStub"));
+    return new NetworkServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _NetworkServiceStubControl.serviceDescription;
+
+
+  void createUrlLoader(Object loader) {
+    return impl.createUrlLoader(loader);
+  }
+  void getCookieStore(Object cookieStore) {
+    return impl.getCookieStore(cookieStore);
+  }
+  void createWebSocket(Object socket) {
+    return impl.createWebSocket(socket);
+  }
+  dynamic createTcpBoundSocket(net_address_mojom.NetAddress localAddress,Object boundSocket,[Function responseFactory = null]) {
+    return impl.createTcpBoundSocket(localAddress,boundSocket,responseFactory);
+  }
+  dynamic createTcpConnectedSocket(net_address_mojom.NetAddress remoteAddress,core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]) {
+    return impl.createTcpConnectedSocket(remoteAddress,sendStream,receiveStream,clientSocket,responseFactory);
+  }
+  void createUdpSocket(Object socket) {
+    return impl.createUdpSocket(socket);
+  }
+  dynamic createHttpServer(net_address_mojom.NetAddress localAddress,Object delegate,[Function responseFactory = null]) {
+    return impl.createHttpServer(localAddress,delegate,responseFactory);
+  }
+  void registerUrlLoaderInterceptor(Object factory) {
+    return impl.registerUrlLoaderInterceptor(factory);
+  }
+  void createHostResolver(Object hostResolver) {
+    return impl.createHostResolver(hostResolver);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/service_registry.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/service_registry.mojom.dart
index eb9cb91..09df952 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/service_registry.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/service_registry.mojom.dart
@@ -127,9 +127,9 @@
   void addServices(List<String> interfaceNames, Object serviceProvider);
 }
 
-
-class _ServiceRegistryProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ServiceRegistryProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ServiceRegistryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -143,7 +143,6 @@
 
   String get serviceName => ServiceRegistry.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -160,9 +159,9 @@
   }
 }
 
-
-class ServiceRegistryProxy extends bindings.Proxy
-                              implements ServiceRegistry {
+class ServiceRegistryProxy
+    extends bindings.Proxy
+    implements ServiceRegistry {
   ServiceRegistryProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ServiceRegistryProxyControl.fromEndpoint(endpoint));
@@ -200,29 +199,24 @@
   }
 }
 
-
-class ServiceRegistryStub extends bindings.Stub {
+class _ServiceRegistryStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ServiceRegistry> {
   ServiceRegistry _impl;
 
-  ServiceRegistryStub.fromEndpoint(
+  _ServiceRegistryStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ServiceRegistry impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceRegistryStub.fromHandle(
+  _ServiceRegistryStubControl.fromHandle(
       core.MojoHandle handle, [ServiceRegistry impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ServiceRegistryStub.unbound([this._impl]) : super.unbound();
-
-  static ServiceRegistryStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ServiceRegistryStub"));
-    return new ServiceRegistryStub.fromEndpoint(endpoint);
-  }
+  _ServiceRegistryStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -267,9 +261,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ServiceRegistryStub($superString)";
+    return "_ServiceRegistryStubControl($superString)";
   }
 
   int get version => 0;
@@ -283,5 +278,34 @@
   }
 }
 
+class ServiceRegistryStub
+    extends bindings.Stub<ServiceRegistry>
+    implements ServiceRegistry {
+  ServiceRegistryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ServiceRegistry impl])
+      : super(new _ServiceRegistryStubControl.fromEndpoint(endpoint, impl));
+
+  ServiceRegistryStub.fromHandle(
+      core.MojoHandle handle, [ServiceRegistry impl])
+      : super(new _ServiceRegistryStubControl.fromHandle(handle, impl));
+
+  ServiceRegistryStub.unbound([ServiceRegistry impl])
+      : super(new _ServiceRegistryStubControl.unbound(impl));
+
+  static ServiceRegistryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ServiceRegistryStub"));
+    return new ServiceRegistryStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ServiceRegistryStubControl.serviceDescription;
+
+
+  void addServices(List<String> interfaceNames, Object serviceProvider) {
+    return impl.addServices(interfaceNames, serviceProvider);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/sharing.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/sharing.mojom.dart
index 9ad5769..4210474 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/sharing.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/sharing.mojom.dart
@@ -99,9 +99,9 @@
   void shareText(String text);
 }
 
-
-class _SharingServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SharingServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SharingServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -115,7 +115,6 @@
 
   String get serviceName => SharingService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -132,9 +131,9 @@
   }
 }
 
-
-class SharingServiceProxy extends bindings.Proxy
-                              implements SharingService {
+class SharingServiceProxy
+    extends bindings.Proxy
+    implements SharingService {
   SharingServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SharingServiceProxyControl.fromEndpoint(endpoint));
@@ -171,29 +170,24 @@
   }
 }
 
-
-class SharingServiceStub extends bindings.Stub {
+class _SharingServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<SharingService> {
   SharingService _impl;
 
-  SharingServiceStub.fromEndpoint(
+  _SharingServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [SharingService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SharingServiceStub.fromHandle(
+  _SharingServiceStubControl.fromHandle(
       core.MojoHandle handle, [SharingService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SharingServiceStub.unbound([this._impl]) : super.unbound();
-
-  static SharingServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SharingServiceStub"));
-    return new SharingServiceStub.fromEndpoint(endpoint);
-  }
+  _SharingServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -238,9 +232,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SharingServiceStub($superString)";
+    return "_SharingServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -254,5 +249,34 @@
   }
 }
 
+class SharingServiceStub
+    extends bindings.Stub<SharingService>
+    implements SharingService {
+  SharingServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [SharingService impl])
+      : super(new _SharingServiceStubControl.fromEndpoint(endpoint, impl));
+
+  SharingServiceStub.fromHandle(
+      core.MojoHandle handle, [SharingService impl])
+      : super(new _SharingServiceStubControl.fromHandle(handle, impl));
+
+  SharingServiceStub.unbound([SharingService impl])
+      : super(new _SharingServiceStubControl.unbound(impl));
+
+  static SharingServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SharingServiceStub"));
+    return new SharingServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SharingServiceStubControl.serviceDescription;
+
+
+  void shareText(String text) {
+    return impl.shareText(text);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/surfaces.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/surfaces.mojom.dart
index 025a5ec..3a0012a 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/surfaces.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/surfaces.mojom.dart
@@ -1261,9 +1261,9 @@
   void returnResources(List<ReturnedResource> resources);
 }
 
-
-class _ResourceReturnerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ResourceReturnerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ResourceReturnerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1277,7 +1277,6 @@
 
   String get serviceName => ResourceReturner.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1294,9 +1293,9 @@
   }
 }
 
-
-class ResourceReturnerProxy extends bindings.Proxy
-                              implements ResourceReturner {
+class ResourceReturnerProxy
+    extends bindings.Proxy
+    implements ResourceReturner {
   ResourceReturnerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ResourceReturnerProxyControl.fromEndpoint(endpoint));
@@ -1333,29 +1332,24 @@
   }
 }
 
-
-class ResourceReturnerStub extends bindings.Stub {
+class _ResourceReturnerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ResourceReturner> {
   ResourceReturner _impl;
 
-  ResourceReturnerStub.fromEndpoint(
+  _ResourceReturnerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ResourceReturner impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ResourceReturnerStub.fromHandle(
+  _ResourceReturnerStubControl.fromHandle(
       core.MojoHandle handle, [ResourceReturner impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ResourceReturnerStub.unbound([this._impl]) : super.unbound();
-
-  static ResourceReturnerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ResourceReturnerStub"));
-    return new ResourceReturnerStub.fromEndpoint(endpoint);
-  }
+  _ResourceReturnerStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -1400,9 +1394,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ResourceReturnerStub($superString)";
+    return "_ResourceReturnerStubControl($superString)";
   }
 
   int get version => 0;
@@ -1416,6 +1411,35 @@
   }
 }
 
+class ResourceReturnerStub
+    extends bindings.Stub<ResourceReturner>
+    implements ResourceReturner {
+  ResourceReturnerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ResourceReturner impl])
+      : super(new _ResourceReturnerStubControl.fromEndpoint(endpoint, impl));
+
+  ResourceReturnerStub.fromHandle(
+      core.MojoHandle handle, [ResourceReturner impl])
+      : super(new _ResourceReturnerStubControl.fromHandle(handle, impl));
+
+  ResourceReturnerStub.unbound([ResourceReturner impl])
+      : super(new _ResourceReturnerStubControl.unbound(impl));
+
+  static ResourceReturnerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ResourceReturnerStub"));
+    return new ResourceReturnerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ResourceReturnerStubControl.serviceDescription;
+
+
+  void returnResources(List<ReturnedResource> resources) {
+    return impl.returnResources(resources);
+  }
+}
+
 const int _surfaceMethodGetIdNamespaceName = 0;
 const int _surfaceMethodSetResourceReturnerName = 1;
 const int _surfaceMethodCreateSurfaceName = 2;
@@ -1442,9 +1466,9 @@
   void destroySurface(int idLocal);
 }
 
-
-class _SurfaceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SurfaceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SurfaceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1458,7 +1482,6 @@
 
   String get serviceName => Surface.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _surfaceMethodGetIdNamespaceName:
@@ -1515,9 +1538,9 @@
   }
 }
 
-
-class SurfaceProxy extends bindings.Proxy
-                              implements Surface {
+class SurfaceProxy
+    extends bindings.Proxy
+    implements Surface {
   SurfaceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SurfaceProxyControl.fromEndpoint(endpoint));
@@ -1592,29 +1615,24 @@
   }
 }
 
-
-class SurfaceStub extends bindings.Stub {
+class _SurfaceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Surface> {
   Surface _impl;
 
-  SurfaceStub.fromEndpoint(
+  _SurfaceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Surface impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SurfaceStub.fromHandle(
+  _SurfaceStubControl.fromHandle(
       core.MojoHandle handle, [Surface impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SurfaceStub.unbound([this._impl]) : super.unbound();
-
-  static SurfaceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SurfaceStub"));
-    return new SurfaceStub.fromEndpoint(endpoint);
-  }
+  _SurfaceStubControl.unbound([this._impl]) : super.unbound();
 
 
   SurfaceGetIdNamespaceResponseParams _surfaceGetIdNamespaceResponseParamsFactory(int idNamespace) {
@@ -1720,9 +1738,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SurfaceStub($superString)";
+    return "_SurfaceStubControl($superString)";
   }
 
   int get version => 0;
@@ -1736,5 +1755,46 @@
   }
 }
 
+class SurfaceStub
+    extends bindings.Stub<Surface>
+    implements Surface {
+  SurfaceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Surface impl])
+      : super(new _SurfaceStubControl.fromEndpoint(endpoint, impl));
+
+  SurfaceStub.fromHandle(
+      core.MojoHandle handle, [Surface impl])
+      : super(new _SurfaceStubControl.fromHandle(handle, impl));
+
+  SurfaceStub.unbound([Surface impl])
+      : super(new _SurfaceStubControl.unbound(impl));
+
+  static SurfaceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SurfaceStub"));
+    return new SurfaceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SurfaceStubControl.serviceDescription;
+
+
+  dynamic getIdNamespace([Function responseFactory = null]) {
+    return impl.getIdNamespace(responseFactory);
+  }
+  void setResourceReturner(Object returner) {
+    return impl.setResourceReturner(returner);
+  }
+  void createSurface(int idLocal) {
+    return impl.createSurface(idLocal);
+  }
+  dynamic submitFrame(int idLocal,Frame frame,[Function responseFactory = null]) {
+    return impl.submitFrame(idLocal,frame,responseFactory);
+  }
+  void destroySurface(int idLocal) {
+    return impl.destroySurface(idLocal);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/tcp_bound_socket.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/tcp_bound_socket.mojom.dart
index 6892ba3..4876b6f 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/tcp_bound_socket.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/tcp_bound_socket.mojom.dart
@@ -361,9 +361,9 @@
   dynamic connect(net_address_mojom.NetAddress remoteAddress,core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]);
 }
 
-
-class _TcpBoundSocketProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _TcpBoundSocketProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _TcpBoundSocketProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -377,7 +377,6 @@
 
   String get serviceName => TcpBoundSocket.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _tcpBoundSocketMethodStartListeningName:
@@ -434,9 +433,9 @@
   }
 }
 
-
-class TcpBoundSocketProxy extends bindings.Proxy
-                              implements TcpBoundSocket {
+class TcpBoundSocketProxy
+    extends bindings.Proxy
+    implements TcpBoundSocket {
   TcpBoundSocketProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _TcpBoundSocketProxyControl.fromEndpoint(endpoint));
@@ -484,29 +483,24 @@
   }
 }
 
-
-class TcpBoundSocketStub extends bindings.Stub {
+class _TcpBoundSocketStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<TcpBoundSocket> {
   TcpBoundSocket _impl;
 
-  TcpBoundSocketStub.fromEndpoint(
+  _TcpBoundSocketStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [TcpBoundSocket impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TcpBoundSocketStub.fromHandle(
+  _TcpBoundSocketStubControl.fromHandle(
       core.MojoHandle handle, [TcpBoundSocket impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TcpBoundSocketStub.unbound([this._impl]) : super.unbound();
-
-  static TcpBoundSocketStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TcpBoundSocketStub"));
-    return new TcpBoundSocketStub.fromEndpoint(endpoint);
-  }
+  _TcpBoundSocketStubControl.unbound([this._impl]) : super.unbound();
 
 
   TcpBoundSocketStartListeningResponseParams _tcpBoundSocketStartListeningResponseParamsFactory(network_error_mojom.NetworkError result) {
@@ -600,9 +594,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "TcpBoundSocketStub($superString)";
+    return "_TcpBoundSocketStubControl($superString)";
   }
 
   int get version => 0;
@@ -616,5 +611,37 @@
   }
 }
 
+class TcpBoundSocketStub
+    extends bindings.Stub<TcpBoundSocket>
+    implements TcpBoundSocket {
+  TcpBoundSocketStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [TcpBoundSocket impl])
+      : super(new _TcpBoundSocketStubControl.fromEndpoint(endpoint, impl));
+
+  TcpBoundSocketStub.fromHandle(
+      core.MojoHandle handle, [TcpBoundSocket impl])
+      : super(new _TcpBoundSocketStubControl.fromHandle(handle, impl));
+
+  TcpBoundSocketStub.unbound([TcpBoundSocket impl])
+      : super(new _TcpBoundSocketStubControl.unbound(impl));
+
+  static TcpBoundSocketStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpBoundSocketStub"));
+    return new TcpBoundSocketStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _TcpBoundSocketStubControl.serviceDescription;
+
+
+  dynamic startListening(Object server,[Function responseFactory = null]) {
+    return impl.startListening(server,responseFactory);
+  }
+  dynamic connect(net_address_mojom.NetAddress remoteAddress,core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]) {
+    return impl.connect(remoteAddress,sendStream,receiveStream,clientSocket,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/tcp_connected_socket.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/tcp_connected_socket.mojom.dart
index 62d4854..b00d135 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/tcp_connected_socket.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/tcp_connected_socket.mojom.dart
@@ -25,9 +25,9 @@
   static const String serviceName = null;
 }
 
-
-class _TcpConnectedSocketProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _TcpConnectedSocketProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _TcpConnectedSocketProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -41,7 +41,6 @@
 
   String get serviceName => TcpConnectedSocket.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -58,9 +57,9 @@
   }
 }
 
-
-class TcpConnectedSocketProxy extends bindings.Proxy
-                              implements TcpConnectedSocket {
+class TcpConnectedSocketProxy
+    extends bindings.Proxy
+    implements TcpConnectedSocket {
   TcpConnectedSocketProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _TcpConnectedSocketProxyControl.fromEndpoint(endpoint));
@@ -87,29 +86,24 @@
 
 }
 
-
-class TcpConnectedSocketStub extends bindings.Stub {
+class _TcpConnectedSocketStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<TcpConnectedSocket> {
   TcpConnectedSocket _impl;
 
-  TcpConnectedSocketStub.fromEndpoint(
+  _TcpConnectedSocketStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [TcpConnectedSocket impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TcpConnectedSocketStub.fromHandle(
+  _TcpConnectedSocketStubControl.fromHandle(
       core.MojoHandle handle, [TcpConnectedSocket impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TcpConnectedSocketStub.unbound([this._impl]) : super.unbound();
-
-  static TcpConnectedSocketStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TcpConnectedSocketStub"));
-    return new TcpConnectedSocketStub.fromEndpoint(endpoint);
-  }
+  _TcpConnectedSocketStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -149,9 +143,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "TcpConnectedSocketStub($superString)";
+    return "_TcpConnectedSocketStubControl($superString)";
   }
 
   int get version => 0;
@@ -165,5 +160,31 @@
   }
 }
 
+class TcpConnectedSocketStub
+    extends bindings.Stub<TcpConnectedSocket>
+    implements TcpConnectedSocket {
+  TcpConnectedSocketStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [TcpConnectedSocket impl])
+      : super(new _TcpConnectedSocketStubControl.fromEndpoint(endpoint, impl));
+
+  TcpConnectedSocketStub.fromHandle(
+      core.MojoHandle handle, [TcpConnectedSocket impl])
+      : super(new _TcpConnectedSocketStubControl.fromHandle(handle, impl));
+
+  TcpConnectedSocketStub.unbound([TcpConnectedSocket impl])
+      : super(new _TcpConnectedSocketStubControl.unbound(impl));
+
+  static TcpConnectedSocketStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpConnectedSocketStub"));
+    return new TcpConnectedSocketStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _TcpConnectedSocketStubControl.serviceDescription;
+
+
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/tcp_server_socket.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/tcp_server_socket.mojom.dart
index 0081bb6..15d5c6a 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/tcp_server_socket.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/tcp_server_socket.mojom.dart
@@ -215,9 +215,9 @@
   dynamic accept(core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]);
 }
 
-
-class _TcpServerSocketProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _TcpServerSocketProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _TcpServerSocketProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -231,7 +231,6 @@
 
   String get serviceName => TcpServerSocket.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _tcpServerSocketMethodAcceptName:
@@ -268,9 +267,9 @@
   }
 }
 
-
-class TcpServerSocketProxy extends bindings.Proxy
-                              implements TcpServerSocket {
+class TcpServerSocketProxy
+    extends bindings.Proxy
+    implements TcpServerSocket {
   TcpServerSocketProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _TcpServerSocketProxyControl.fromEndpoint(endpoint));
@@ -308,29 +307,24 @@
   }
 }
 
-
-class TcpServerSocketStub extends bindings.Stub {
+class _TcpServerSocketStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<TcpServerSocket> {
   TcpServerSocket _impl;
 
-  TcpServerSocketStub.fromEndpoint(
+  _TcpServerSocketStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [TcpServerSocket impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TcpServerSocketStub.fromHandle(
+  _TcpServerSocketStubControl.fromHandle(
       core.MojoHandle handle, [TcpServerSocket impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TcpServerSocketStub.unbound([this._impl]) : super.unbound();
-
-  static TcpServerSocketStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TcpServerSocketStub"));
-    return new TcpServerSocketStub.fromEndpoint(endpoint);
-  }
+  _TcpServerSocketStubControl.unbound([this._impl]) : super.unbound();
 
 
   TcpServerSocketAcceptResponseParams _tcpServerSocketAcceptResponseParamsFactory(network_error_mojom.NetworkError result, net_address_mojom.NetAddress remoteAddress) {
@@ -398,9 +392,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "TcpServerSocketStub($superString)";
+    return "_TcpServerSocketStubControl($superString)";
   }
 
   int get version => 0;
@@ -414,5 +409,34 @@
   }
 }
 
+class TcpServerSocketStub
+    extends bindings.Stub<TcpServerSocket>
+    implements TcpServerSocket {
+  TcpServerSocketStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [TcpServerSocket impl])
+      : super(new _TcpServerSocketStubControl.fromEndpoint(endpoint, impl));
+
+  TcpServerSocketStub.fromHandle(
+      core.MojoHandle handle, [TcpServerSocket impl])
+      : super(new _TcpServerSocketStubControl.fromHandle(handle, impl));
+
+  TcpServerSocketStub.unbound([TcpServerSocket impl])
+      : super(new _TcpServerSocketStubControl.unbound(impl));
+
+  static TcpServerSocketStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TcpServerSocketStub"));
+    return new TcpServerSocketStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _TcpServerSocketStubControl.serviceDescription;
+
+
+  dynamic accept(core.MojoDataPipeConsumer sendStream,core.MojoDataPipeProducer receiveStream,Object clientSocket,[Function responseFactory = null]) {
+    return impl.accept(sendStream,receiveStream,clientSocket,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/terminal/terminal.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/terminal/terminal.mojom.dart
index 1c143d5..d98d5a8 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/terminal/terminal.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/terminal/terminal.mojom.dart
@@ -722,9 +722,9 @@
   dynamic setSize(int rows,int columns,bool reset,[Function responseFactory = null]);
 }
 
-
-class _TerminalProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _TerminalProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _TerminalProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -738,7 +738,6 @@
 
   String get serviceName => Terminal.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _terminalMethodConnectName:
@@ -835,9 +834,9 @@
   }
 }
 
-
-class TerminalProxy extends bindings.Proxy
-                              implements Terminal {
+class TerminalProxy
+    extends bindings.Proxy
+    implements Terminal {
   TerminalProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _TerminalProxyControl.fromEndpoint(endpoint));
@@ -903,29 +902,24 @@
   }
 }
 
-
-class TerminalStub extends bindings.Stub {
+class _TerminalStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Terminal> {
   Terminal _impl;
 
-  TerminalStub.fromEndpoint(
+  _TerminalStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Terminal impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TerminalStub.fromHandle(
+  _TerminalStubControl.fromHandle(
       core.MojoHandle handle, [Terminal impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TerminalStub.unbound([this._impl]) : super.unbound();
-
-  static TerminalStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TerminalStub"));
-    return new TerminalStub.fromEndpoint(endpoint);
-  }
+  _TerminalStubControl.unbound([this._impl]) : super.unbound();
 
 
   TerminalConnectResponseParams _terminalConnectResponseParamsFactory(types_mojom.Error error) {
@@ -1075,9 +1069,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "TerminalStub($superString)";
+    return "_TerminalStubControl($superString)";
   }
 
   int get version => 0;
@@ -1091,5 +1086,43 @@
   }
 }
 
+class TerminalStub
+    extends bindings.Stub<Terminal>
+    implements Terminal {
+  TerminalStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Terminal impl])
+      : super(new _TerminalStubControl.fromEndpoint(endpoint, impl));
+
+  TerminalStub.fromHandle(
+      core.MojoHandle handle, [Terminal impl])
+      : super(new _TerminalStubControl.fromHandle(handle, impl));
+
+  TerminalStub.unbound([Terminal impl])
+      : super(new _TerminalStubControl.unbound(impl));
+
+  static TerminalStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TerminalStub"));
+    return new TerminalStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _TerminalStubControl.serviceDescription;
+
+
+  dynamic connect(Object terminalFile,bool force,[Function responseFactory = null]) {
+    return impl.connect(terminalFile,force,responseFactory);
+  }
+  dynamic connectToClient(Object terminalClient,bool force,[Function responseFactory = null]) {
+    return impl.connectToClient(terminalClient,force,responseFactory);
+  }
+  dynamic getSize([Function responseFactory = null]) {
+    return impl.getSize(responseFactory);
+  }
+  dynamic setSize(int rows,int columns,bool reset,[Function responseFactory = null]) {
+    return impl.setSize(rows,columns,reset,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/terminal/terminal_client.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/terminal/terminal_client.mojom.dart
index 3864a74..fbaa28f 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/terminal/terminal_client.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/terminal/terminal_client.mojom.dart
@@ -99,9 +99,9 @@
   void connectToTerminal(Object terminal);
 }
 
-
-class _TerminalClientProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _TerminalClientProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _TerminalClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -115,7 +115,6 @@
 
   String get serviceName => TerminalClient.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -132,9 +131,9 @@
   }
 }
 
-
-class TerminalClientProxy extends bindings.Proxy
-                              implements TerminalClient {
+class TerminalClientProxy
+    extends bindings.Proxy
+    implements TerminalClient {
   TerminalClientProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _TerminalClientProxyControl.fromEndpoint(endpoint));
@@ -171,29 +170,24 @@
   }
 }
 
-
-class TerminalClientStub extends bindings.Stub {
+class _TerminalClientStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<TerminalClient> {
   TerminalClient _impl;
 
-  TerminalClientStub.fromEndpoint(
+  _TerminalClientStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [TerminalClient impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TerminalClientStub.fromHandle(
+  _TerminalClientStubControl.fromHandle(
       core.MojoHandle handle, [TerminalClient impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TerminalClientStub.unbound([this._impl]) : super.unbound();
-
-  static TerminalClientStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TerminalClientStub"));
-    return new TerminalClientStub.fromEndpoint(endpoint);
-  }
+  _TerminalClientStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -238,9 +232,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "TerminalClientStub($superString)";
+    return "_TerminalClientStubControl($superString)";
   }
 
   int get version => 0;
@@ -254,5 +249,34 @@
   }
 }
 
+class TerminalClientStub
+    extends bindings.Stub<TerminalClient>
+    implements TerminalClient {
+  TerminalClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [TerminalClient impl])
+      : super(new _TerminalClientStubControl.fromEndpoint(endpoint, impl));
+
+  TerminalClientStub.fromHandle(
+      core.MojoHandle handle, [TerminalClient impl])
+      : super(new _TerminalClientStubControl.fromHandle(handle, impl));
+
+  TerminalClientStub.unbound([TerminalClient impl])
+      : super(new _TerminalClientStubControl.unbound(impl));
+
+  static TerminalClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TerminalClientStub"));
+    return new TerminalClientStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _TerminalClientStubControl.serviceDescription;
+
+
+  void connectToTerminal(Object terminal) {
+    return impl.connectToTerminal(terminal);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/timelines.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/timelines.mojom.dart
index 077297d..d898a06 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/timelines.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/timelines.mojom.dart
@@ -342,9 +342,9 @@
   static const int kUnspecifiedTime = 9223372036854775807;
 }
 
-
-class _TimelineConsumerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _TimelineConsumerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _TimelineConsumerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -358,7 +358,6 @@
 
   String get serviceName => TimelineConsumer.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _timelineConsumerMethodSetTimelineTransformName:
@@ -395,9 +394,9 @@
   }
 }
 
-
-class TimelineConsumerProxy extends bindings.Proxy
-                              implements TimelineConsumer {
+class TimelineConsumerProxy
+    extends bindings.Proxy
+    implements TimelineConsumer {
   TimelineConsumerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _TimelineConsumerProxyControl.fromEndpoint(endpoint));
@@ -437,29 +436,24 @@
   }
 }
 
-
-class TimelineConsumerStub extends bindings.Stub {
+class _TimelineConsumerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<TimelineConsumer> {
   TimelineConsumer _impl;
 
-  TimelineConsumerStub.fromEndpoint(
+  _TimelineConsumerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [TimelineConsumer impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TimelineConsumerStub.fromHandle(
+  _TimelineConsumerStubControl.fromHandle(
       core.MojoHandle handle, [TimelineConsumer impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TimelineConsumerStub.unbound([this._impl]) : super.unbound();
-
-  static TimelineConsumerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TimelineConsumerStub"));
-    return new TimelineConsumerStub.fromEndpoint(endpoint);
-  }
+  _TimelineConsumerStubControl.unbound([this._impl]) : super.unbound();
 
 
   TimelineConsumerSetTimelineTransformResponseParams _timelineConsumerSetTimelineTransformResponseParamsFactory(bool completed) {
@@ -526,9 +520,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "TimelineConsumerStub($superString)";
+    return "_TimelineConsumerStubControl($superString)";
   }
 
   int get version => 0;
@@ -542,5 +537,34 @@
   }
 }
 
+class TimelineConsumerStub
+    extends bindings.Stub<TimelineConsumer>
+    implements TimelineConsumer {
+  TimelineConsumerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [TimelineConsumer impl])
+      : super(new _TimelineConsumerStubControl.fromEndpoint(endpoint, impl));
+
+  TimelineConsumerStub.fromHandle(
+      core.MojoHandle handle, [TimelineConsumer impl])
+      : super(new _TimelineConsumerStubControl.fromHandle(handle, impl));
+
+  TimelineConsumerStub.unbound([TimelineConsumer impl])
+      : super(new _TimelineConsumerStubControl.unbound(impl));
+
+  static TimelineConsumerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TimelineConsumerStub"));
+    return new TimelineConsumerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _TimelineConsumerStubControl.serviceDescription;
+
+
+  dynamic setTimelineTransform(int subjectTime,int referenceDelta,int subjectDelta,int effectiveReferenceTime,int effectiveSubjectTime,[Function responseFactory = null]) {
+    return impl.setTimelineTransform(subjectTime,referenceDelta,subjectDelta,effectiveReferenceTime,effectiveSubjectTime,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/udp_socket.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/udp_socket.mojom.dart
index 5a354ae..7e96c94 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/udp_socket.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/udp_socket.mojom.dart
@@ -1286,9 +1286,9 @@
   dynamic sendTo(net_address_mojom.NetAddress destAddr,List<int> data,[Function responseFactory = null]);
 }
 
-
-class _UdpSocketProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _UdpSocketProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _UdpSocketProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1302,7 +1302,6 @@
 
   String get serviceName => UdpSocket.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _udpSocketMethodAllowAddressReuseName:
@@ -1459,9 +1458,9 @@
   }
 }
 
-
-class UdpSocketProxy extends bindings.Proxy
-                              implements UdpSocket {
+class UdpSocketProxy
+    extends bindings.Proxy
+    implements UdpSocket {
   UdpSocketProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _UdpSocketProxyControl.fromEndpoint(endpoint));
@@ -1561,29 +1560,24 @@
   }
 }
 
-
-class UdpSocketStub extends bindings.Stub {
+class _UdpSocketStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<UdpSocket> {
   UdpSocket _impl;
 
-  UdpSocketStub.fromEndpoint(
+  _UdpSocketStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [UdpSocket impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UdpSocketStub.fromHandle(
+  _UdpSocketStubControl.fromHandle(
       core.MojoHandle handle, [UdpSocket impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UdpSocketStub.unbound([this._impl]) : super.unbound();
-
-  static UdpSocketStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UdpSocketStub"));
-    return new UdpSocketStub.fromEndpoint(endpoint);
-  }
+  _UdpSocketStubControl.unbound([this._impl]) : super.unbound();
 
 
   UdpSocketAllowAddressReuseResponseParams _udpSocketAllowAddressReuseResponseParamsFactory(network_error_mojom.NetworkError result) {
@@ -1819,9 +1813,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "UdpSocketStub($superString)";
+    return "_UdpSocketStubControl($superString)";
   }
 
   int get version => 0;
@@ -1835,6 +1830,56 @@
   }
 }
 
+class UdpSocketStub
+    extends bindings.Stub<UdpSocket>
+    implements UdpSocket {
+  UdpSocketStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [UdpSocket impl])
+      : super(new _UdpSocketStubControl.fromEndpoint(endpoint, impl));
+
+  UdpSocketStub.fromHandle(
+      core.MojoHandle handle, [UdpSocket impl])
+      : super(new _UdpSocketStubControl.fromHandle(handle, impl));
+
+  UdpSocketStub.unbound([UdpSocket impl])
+      : super(new _UdpSocketStubControl.unbound(impl));
+
+  static UdpSocketStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UdpSocketStub"));
+    return new UdpSocketStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _UdpSocketStubControl.serviceDescription;
+
+
+  dynamic allowAddressReuse([Function responseFactory = null]) {
+    return impl.allowAddressReuse(responseFactory);
+  }
+  dynamic bind(net_address_mojom.NetAddress addr,[Function responseFactory = null]) {
+    return impl.bind(addr,responseFactory);
+  }
+  dynamic connect(net_address_mojom.NetAddress remoteAddr,[Function responseFactory = null]) {
+    return impl.connect(remoteAddr,responseFactory);
+  }
+  dynamic setSendBufferSize(int size,[Function responseFactory = null]) {
+    return impl.setSendBufferSize(size,responseFactory);
+  }
+  dynamic setReceiveBufferSize(int size,[Function responseFactory = null]) {
+    return impl.setReceiveBufferSize(size,responseFactory);
+  }
+  dynamic negotiateMaxPendingSendRequests(int requestedSize,[Function responseFactory = null]) {
+    return impl.negotiateMaxPendingSendRequests(requestedSize,responseFactory);
+  }
+  void receiveMore(int datagramNumber) {
+    return impl.receiveMore(datagramNumber);
+  }
+  dynamic sendTo(net_address_mojom.NetAddress destAddr,List<int> data,[Function responseFactory = null]) {
+    return impl.sendTo(destAddr,data,responseFactory);
+  }
+}
+
 const int _udpSocketReceiverMethodOnReceivedName = 0;
 
 class _UdpSocketReceiverServiceDescription implements service_describer.ServiceDescription {
@@ -1853,9 +1898,9 @@
   void onReceived(network_error_mojom.NetworkError result, net_address_mojom.NetAddress srcAddr, List<int> data);
 }
 
-
-class _UdpSocketReceiverProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _UdpSocketReceiverProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _UdpSocketReceiverProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1869,7 +1914,6 @@
 
   String get serviceName => UdpSocketReceiver.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1886,9 +1930,9 @@
   }
 }
 
-
-class UdpSocketReceiverProxy extends bindings.Proxy
-                              implements UdpSocketReceiver {
+class UdpSocketReceiverProxy
+    extends bindings.Proxy
+    implements UdpSocketReceiver {
   UdpSocketReceiverProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _UdpSocketReceiverProxyControl.fromEndpoint(endpoint));
@@ -1927,29 +1971,24 @@
   }
 }
 
-
-class UdpSocketReceiverStub extends bindings.Stub {
+class _UdpSocketReceiverStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<UdpSocketReceiver> {
   UdpSocketReceiver _impl;
 
-  UdpSocketReceiverStub.fromEndpoint(
+  _UdpSocketReceiverStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [UdpSocketReceiver impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UdpSocketReceiverStub.fromHandle(
+  _UdpSocketReceiverStubControl.fromHandle(
       core.MojoHandle handle, [UdpSocketReceiver impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UdpSocketReceiverStub.unbound([this._impl]) : super.unbound();
-
-  static UdpSocketReceiverStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UdpSocketReceiverStub"));
-    return new UdpSocketReceiverStub.fromEndpoint(endpoint);
-  }
+  _UdpSocketReceiverStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -1994,9 +2033,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "UdpSocketReceiverStub($superString)";
+    return "_UdpSocketReceiverStubControl($superString)";
   }
 
   int get version => 0;
@@ -2010,5 +2050,34 @@
   }
 }
 
+class UdpSocketReceiverStub
+    extends bindings.Stub<UdpSocketReceiver>
+    implements UdpSocketReceiver {
+  UdpSocketReceiverStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [UdpSocketReceiver impl])
+      : super(new _UdpSocketReceiverStubControl.fromEndpoint(endpoint, impl));
+
+  UdpSocketReceiverStub.fromHandle(
+      core.MojoHandle handle, [UdpSocketReceiver impl])
+      : super(new _UdpSocketReceiverStubControl.fromHandle(handle, impl));
+
+  UdpSocketReceiverStub.unbound([UdpSocketReceiver impl])
+      : super(new _UdpSocketReceiverStubControl.unbound(impl));
+
+  static UdpSocketReceiverStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UdpSocketReceiverStub"));
+    return new UdpSocketReceiverStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _UdpSocketReceiverStubControl.serviceDescription;
+
+
+  void onReceived(network_error_mojom.NetworkError result, net_address_mojom.NetAddress srcAddr, List<int> data) {
+    return impl.onReceived(result, srcAddr, data);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/ui/input_connection.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/ui/input_connection.mojom.dart
index 4375a69..d5e0aa6 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/ui/input_connection.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/input_connection.mojom.dart
@@ -244,9 +244,9 @@
   void setListener(Object listener);
 }
 
-
-class _InputConnectionProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _InputConnectionProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _InputConnectionProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -260,7 +260,6 @@
 
   String get serviceName => InputConnection.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -277,9 +276,9 @@
   }
 }
 
-
-class InputConnectionProxy extends bindings.Proxy
-                              implements InputConnection {
+class InputConnectionProxy
+    extends bindings.Proxy
+    implements InputConnection {
   InputConnectionProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _InputConnectionProxyControl.fromEndpoint(endpoint));
@@ -316,29 +315,24 @@
   }
 }
 
-
-class InputConnectionStub extends bindings.Stub {
+class _InputConnectionStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<InputConnection> {
   InputConnection _impl;
 
-  InputConnectionStub.fromEndpoint(
+  _InputConnectionStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [InputConnection impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InputConnectionStub.fromHandle(
+  _InputConnectionStubControl.fromHandle(
       core.MojoHandle handle, [InputConnection impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InputConnectionStub.unbound([this._impl]) : super.unbound();
-
-  static InputConnectionStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InputConnectionStub"));
-    return new InputConnectionStub.fromEndpoint(endpoint);
-  }
+  _InputConnectionStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -383,9 +377,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "InputConnectionStub($superString)";
+    return "_InputConnectionStubControl($superString)";
   }
 
   int get version => 0;
@@ -399,6 +394,35 @@
   }
 }
 
+class InputConnectionStub
+    extends bindings.Stub<InputConnection>
+    implements InputConnection {
+  InputConnectionStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [InputConnection impl])
+      : super(new _InputConnectionStubControl.fromEndpoint(endpoint, impl));
+
+  InputConnectionStub.fromHandle(
+      core.MojoHandle handle, [InputConnection impl])
+      : super(new _InputConnectionStubControl.fromHandle(handle, impl));
+
+  InputConnectionStub.unbound([InputConnection impl])
+      : super(new _InputConnectionStubControl.unbound(impl));
+
+  static InputConnectionStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputConnectionStub"));
+    return new InputConnectionStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _InputConnectionStubControl.serviceDescription;
+
+
+  void setListener(Object listener) {
+    return impl.setListener(listener);
+  }
+}
+
 const int _inputListenerMethodOnEventName = 0;
 
 class _InputListenerServiceDescription implements service_describer.ServiceDescription {
@@ -417,9 +441,9 @@
   dynamic onEvent(input_events_mojom.Event event,[Function responseFactory = null]);
 }
 
-
-class _InputListenerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _InputListenerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _InputListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -433,7 +457,6 @@
 
   String get serviceName => InputListener.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _inputListenerMethodOnEventName:
@@ -470,9 +493,9 @@
   }
 }
 
-
-class InputListenerProxy extends bindings.Proxy
-                              implements InputListener {
+class InputListenerProxy
+    extends bindings.Proxy
+    implements InputListener {
   InputListenerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _InputListenerProxyControl.fromEndpoint(endpoint));
@@ -508,29 +531,24 @@
   }
 }
 
-
-class InputListenerStub extends bindings.Stub {
+class _InputListenerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<InputListener> {
   InputListener _impl;
 
-  InputListenerStub.fromEndpoint(
+  _InputListenerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [InputListener impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InputListenerStub.fromHandle(
+  _InputListenerStubControl.fromHandle(
       core.MojoHandle handle, [InputListener impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InputListenerStub.unbound([this._impl]) : super.unbound();
-
-  static InputListenerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InputListenerStub"));
-    return new InputListenerStub.fromEndpoint(endpoint);
-  }
+  _InputListenerStubControl.unbound([this._impl]) : super.unbound();
 
 
   InputListenerOnEventResponseParams _inputListenerOnEventResponseParamsFactory(bool consumed) {
@@ -597,9 +615,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "InputListenerStub($superString)";
+    return "_InputListenerStubControl($superString)";
   }
 
   int get version => 0;
@@ -613,5 +632,34 @@
   }
 }
 
+class InputListenerStub
+    extends bindings.Stub<InputListener>
+    implements InputListener {
+  InputListenerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [InputListener impl])
+      : super(new _InputListenerStubControl.fromEndpoint(endpoint, impl));
+
+  InputListenerStub.fromHandle(
+      core.MojoHandle handle, [InputListener impl])
+      : super(new _InputListenerStubControl.fromHandle(handle, impl));
+
+  InputListenerStub.unbound([InputListener impl])
+      : super(new _InputListenerStubControl.unbound(impl));
+
+  static InputListenerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputListenerStub"));
+    return new InputListenerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _InputListenerStubControl.serviceDescription;
+
+
+  dynamic onEvent(input_events_mojom.Event event,[Function responseFactory = null]) {
+    return impl.onEvent(event,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/ui/input_dispatcher.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/ui/input_dispatcher.mojom.dart
index b2dfd95..4be8b04 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/ui/input_dispatcher.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/input_dispatcher.mojom.dart
@@ -101,9 +101,9 @@
   void dispatchEvent(input_events_mojom.Event event);
 }
 
-
-class _InputDispatcherProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _InputDispatcherProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _InputDispatcherProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -117,7 +117,6 @@
 
   String get serviceName => InputDispatcher.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -134,9 +133,9 @@
   }
 }
 
-
-class InputDispatcherProxy extends bindings.Proxy
-                              implements InputDispatcher {
+class InputDispatcherProxy
+    extends bindings.Proxy
+    implements InputDispatcher {
   InputDispatcherProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _InputDispatcherProxyControl.fromEndpoint(endpoint));
@@ -173,29 +172,24 @@
   }
 }
 
-
-class InputDispatcherStub extends bindings.Stub {
+class _InputDispatcherStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<InputDispatcher> {
   InputDispatcher _impl;
 
-  InputDispatcherStub.fromEndpoint(
+  _InputDispatcherStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [InputDispatcher impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InputDispatcherStub.fromHandle(
+  _InputDispatcherStubControl.fromHandle(
       core.MojoHandle handle, [InputDispatcher impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  InputDispatcherStub.unbound([this._impl]) : super.unbound();
-
-  static InputDispatcherStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For InputDispatcherStub"));
-    return new InputDispatcherStub.fromEndpoint(endpoint);
-  }
+  _InputDispatcherStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -240,9 +234,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "InputDispatcherStub($superString)";
+    return "_InputDispatcherStubControl($superString)";
   }
 
   int get version => 0;
@@ -256,5 +251,34 @@
   }
 }
 
+class InputDispatcherStub
+    extends bindings.Stub<InputDispatcher>
+    implements InputDispatcher {
+  InputDispatcherStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [InputDispatcher impl])
+      : super(new _InputDispatcherStubControl.fromEndpoint(endpoint, impl));
+
+  InputDispatcherStub.fromHandle(
+      core.MojoHandle handle, [InputDispatcher impl])
+      : super(new _InputDispatcherStubControl.fromHandle(handle, impl));
+
+  InputDispatcherStub.unbound([InputDispatcher impl])
+      : super(new _InputDispatcherStubControl.unbound(impl));
+
+  static InputDispatcherStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For InputDispatcherStub"));
+    return new InputDispatcherStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _InputDispatcherStubControl.serviceDescription;
+
+
+  void dispatchEvent(input_events_mojom.Event event) {
+    return impl.dispatchEvent(event);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_associates.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_associates.mojom.dart
index 4baf574..eeed7cf 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_associates.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_associates.mojom.dart
@@ -828,9 +828,9 @@
   void connectToViewTreeService(view_tree_token_mojom.ViewTreeToken viewTreeToken, String serviceName_, core.MojoMessagePipeEndpoint pipe);
 }
 
-
-class _ViewAssociateProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ViewAssociateProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ViewAssociateProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -844,7 +844,6 @@
 
   String get serviceName => ViewAssociate.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewAssociateMethodConnectName:
@@ -881,9 +880,9 @@
   }
 }
 
-
-class ViewAssociateProxy extends bindings.Proxy
-                              implements ViewAssociate {
+class ViewAssociateProxy
+    extends bindings.Proxy
+    implements ViewAssociate {
   ViewAssociateProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ViewAssociateProxyControl.fromEndpoint(endpoint));
@@ -943,29 +942,24 @@
   }
 }
 
-
-class ViewAssociateStub extends bindings.Stub {
+class _ViewAssociateStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ViewAssociate> {
   ViewAssociate _impl;
 
-  ViewAssociateStub.fromEndpoint(
+  _ViewAssociateStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ViewAssociate impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewAssociateStub.fromHandle(
+  _ViewAssociateStubControl.fromHandle(
       core.MojoHandle handle, [ViewAssociate impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewAssociateStub.unbound([this._impl]) : super.unbound();
-
-  static ViewAssociateStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewAssociateStub"));
-    return new ViewAssociateStub.fromEndpoint(endpoint);
-  }
+  _ViewAssociateStubControl.unbound([this._impl]) : super.unbound();
 
 
   ViewAssociateConnectResponseParams _viewAssociateConnectResponseParamsFactory(ViewAssociateInfo info) {
@@ -1042,9 +1036,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ViewAssociateStub($superString)";
+    return "_ViewAssociateStubControl($superString)";
   }
 
   int get version => 0;
@@ -1058,6 +1053,41 @@
   }
 }
 
+class ViewAssociateStub
+    extends bindings.Stub<ViewAssociate>
+    implements ViewAssociate {
+  ViewAssociateStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ViewAssociate impl])
+      : super(new _ViewAssociateStubControl.fromEndpoint(endpoint, impl));
+
+  ViewAssociateStub.fromHandle(
+      core.MojoHandle handle, [ViewAssociate impl])
+      : super(new _ViewAssociateStubControl.fromHandle(handle, impl));
+
+  ViewAssociateStub.unbound([ViewAssociate impl])
+      : super(new _ViewAssociateStubControl.unbound(impl));
+
+  static ViewAssociateStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewAssociateStub"));
+    return new ViewAssociateStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ViewAssociateStubControl.serviceDescription;
+
+
+  dynamic connect(Object inspector,[Function responseFactory = null]) {
+    return impl.connect(inspector,responseFactory);
+  }
+  void connectToViewService(view_token_mojom.ViewToken viewToken, String serviceName_, core.MojoMessagePipeEndpoint pipe) {
+    return impl.connectToViewService(viewToken, serviceName_, pipe);
+  }
+  void connectToViewTreeService(view_tree_token_mojom.ViewTreeToken viewTreeToken, String serviceName_, core.MojoMessagePipeEndpoint pipe) {
+    return impl.connectToViewTreeService(viewTreeToken, serviceName_, pipe);
+  }
+}
+
 const int _viewInspectorMethodGetHitTesterName = 0;
 const int _viewInspectorMethodResolveScenesName = 1;
 
@@ -1078,9 +1108,9 @@
   dynamic resolveScenes(List<scene_token_mojom.SceneToken> sceneTokens,[Function responseFactory = null]);
 }
 
-
-class _ViewInspectorProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ViewInspectorProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ViewInspectorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1094,7 +1124,6 @@
 
   String get serviceName => ViewInspector.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewInspectorMethodGetHitTesterName:
@@ -1151,9 +1180,9 @@
   }
 }
 
-
-class ViewInspectorProxy extends bindings.Proxy
-                              implements ViewInspector {
+class ViewInspectorProxy
+    extends bindings.Proxy
+    implements ViewInspector {
   ViewInspectorProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ViewInspectorProxyControl.fromEndpoint(endpoint));
@@ -1199,29 +1228,24 @@
   }
 }
 
-
-class ViewInspectorStub extends bindings.Stub {
+class _ViewInspectorStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ViewInspector> {
   ViewInspector _impl;
 
-  ViewInspectorStub.fromEndpoint(
+  _ViewInspectorStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ViewInspector impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewInspectorStub.fromHandle(
+  _ViewInspectorStubControl.fromHandle(
       core.MojoHandle handle, [ViewInspector impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewInspectorStub.unbound([this._impl]) : super.unbound();
-
-  static ViewInspectorStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewInspectorStub"));
-    return new ViewInspectorStub.fromEndpoint(endpoint);
-  }
+  _ViewInspectorStubControl.unbound([this._impl]) : super.unbound();
 
 
   ViewInspectorGetHitTesterResponseParams _viewInspectorGetHitTesterResponseParamsFactory(bool rendererChanged) {
@@ -1315,9 +1339,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ViewInspectorStub($superString)";
+    return "_ViewInspectorStubControl($superString)";
   }
 
   int get version => 0;
@@ -1331,5 +1356,37 @@
   }
 }
 
+class ViewInspectorStub
+    extends bindings.Stub<ViewInspector>
+    implements ViewInspector {
+  ViewInspectorStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ViewInspector impl])
+      : super(new _ViewInspectorStubControl.fromEndpoint(endpoint, impl));
+
+  ViewInspectorStub.fromHandle(
+      core.MojoHandle handle, [ViewInspector impl])
+      : super(new _ViewInspectorStubControl.fromHandle(handle, impl));
+
+  ViewInspectorStub.unbound([ViewInspector impl])
+      : super(new _ViewInspectorStubControl.unbound(impl));
+
+  static ViewInspectorStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewInspectorStub"));
+    return new ViewInspectorStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ViewInspectorStubControl.serviceDescription;
+
+
+  dynamic getHitTester(view_tree_token_mojom.ViewTreeToken viewTreeToken,Object hitTester,[Function responseFactory = null]) {
+    return impl.getHitTester(viewTreeToken,hitTester,responseFactory);
+  }
+  dynamic resolveScenes(List<scene_token_mojom.SceneToken> sceneTokens,[Function responseFactory = null]) {
+    return impl.resolveScenes(sceneTokens,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_containers.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_containers.mojom.dart
index 30dd748..1915857 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_containers.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_containers.mojom.dart
@@ -724,9 +724,9 @@
   void setChildProperties(int childKey, int childSceneVersion, view_properties_mojom.ViewProperties childViewProperties);
 }
 
-
-class _ViewContainerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ViewContainerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ViewContainerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -740,7 +740,6 @@
 
   String get serviceName => ViewContainer.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -757,9 +756,9 @@
   }
 }
 
-
-class ViewContainerProxy extends bindings.Proxy
-                              implements ViewContainer {
+class ViewContainerProxy
+    extends bindings.Proxy
+    implements ViewContainer {
   ViewContainerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ViewContainerProxyControl.fromEndpoint(endpoint));
@@ -830,29 +829,24 @@
   }
 }
 
-
-class ViewContainerStub extends bindings.Stub {
+class _ViewContainerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ViewContainer> {
   ViewContainer _impl;
 
-  ViewContainerStub.fromEndpoint(
+  _ViewContainerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ViewContainer impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewContainerStub.fromHandle(
+  _ViewContainerStubControl.fromHandle(
       core.MojoHandle handle, [ViewContainer impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewContainerStub.unbound([this._impl]) : super.unbound();
-
-  static ViewContainerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewContainerStub"));
-    return new ViewContainerStub.fromEndpoint(endpoint);
-  }
+  _ViewContainerStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -912,9 +906,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ViewContainerStub($superString)";
+    return "_ViewContainerStubControl($superString)";
   }
 
   int get version => 0;
@@ -928,6 +923,44 @@
   }
 }
 
+class ViewContainerStub
+    extends bindings.Stub<ViewContainer>
+    implements ViewContainer {
+  ViewContainerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ViewContainer impl])
+      : super(new _ViewContainerStubControl.fromEndpoint(endpoint, impl));
+
+  ViewContainerStub.fromHandle(
+      core.MojoHandle handle, [ViewContainer impl])
+      : super(new _ViewContainerStubControl.fromHandle(handle, impl));
+
+  ViewContainerStub.unbound([ViewContainer impl])
+      : super(new _ViewContainerStubControl.unbound(impl));
+
+  static ViewContainerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewContainerStub"));
+    return new ViewContainerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ViewContainerStubControl.serviceDescription;
+
+
+  void setListener(Object listener) {
+    return impl.setListener(listener);
+  }
+  void addChild(int childKey, Object childViewOwner) {
+    return impl.addChild(childKey, childViewOwner);
+  }
+  void removeChild(int childKey, Object transferredViewOwner) {
+    return impl.removeChild(childKey, transferredViewOwner);
+  }
+  void setChildProperties(int childKey, int childSceneVersion, view_properties_mojom.ViewProperties childViewProperties) {
+    return impl.setChildProperties(childKey, childSceneVersion, childViewProperties);
+  }
+}
+
 const int _viewContainerListenerMethodOnChildAttachedName = 0;
 const int _viewContainerListenerMethodOnChildUnavailableName = 1;
 
@@ -948,9 +981,9 @@
   dynamic onChildUnavailable(int childKey,[Function responseFactory = null]);
 }
 
-
-class _ViewContainerListenerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ViewContainerListenerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ViewContainerListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -964,7 +997,6 @@
 
   String get serviceName => ViewContainerListener.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewContainerListenerMethodOnChildAttachedName:
@@ -1021,9 +1053,9 @@
   }
 }
 
-
-class ViewContainerListenerProxy extends bindings.Proxy
-                              implements ViewContainerListener {
+class ViewContainerListenerProxy
+    extends bindings.Proxy
+    implements ViewContainerListener {
   ViewContainerListenerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ViewContainerListenerProxyControl.fromEndpoint(endpoint));
@@ -1069,29 +1101,24 @@
   }
 }
 
-
-class ViewContainerListenerStub extends bindings.Stub {
+class _ViewContainerListenerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ViewContainerListener> {
   ViewContainerListener _impl;
 
-  ViewContainerListenerStub.fromEndpoint(
+  _ViewContainerListenerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ViewContainerListener impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewContainerListenerStub.fromHandle(
+  _ViewContainerListenerStubControl.fromHandle(
       core.MojoHandle handle, [ViewContainerListener impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewContainerListenerStub.unbound([this._impl]) : super.unbound();
-
-  static ViewContainerListenerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewContainerListenerStub"));
-    return new ViewContainerListenerStub.fromEndpoint(endpoint);
-  }
+  _ViewContainerListenerStubControl.unbound([this._impl]) : super.unbound();
 
 
   ViewContainerListenerOnChildAttachedResponseParams _viewContainerListenerOnChildAttachedResponseParamsFactory() {
@@ -1183,9 +1210,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ViewContainerListenerStub($superString)";
+    return "_ViewContainerListenerStubControl($superString)";
   }
 
   int get version => 0;
@@ -1199,5 +1227,37 @@
   }
 }
 
+class ViewContainerListenerStub
+    extends bindings.Stub<ViewContainerListener>
+    implements ViewContainerListener {
+  ViewContainerListenerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ViewContainerListener impl])
+      : super(new _ViewContainerListenerStubControl.fromEndpoint(endpoint, impl));
+
+  ViewContainerListenerStub.fromHandle(
+      core.MojoHandle handle, [ViewContainerListener impl])
+      : super(new _ViewContainerListenerStubControl.fromHandle(handle, impl));
+
+  ViewContainerListenerStub.unbound([ViewContainerListener impl])
+      : super(new _ViewContainerListenerStubControl.unbound(impl));
+
+  static ViewContainerListenerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewContainerListenerStub"));
+    return new ViewContainerListenerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ViewContainerListenerStubControl.serviceDescription;
+
+
+  dynamic onChildAttached(int childKey,ViewInfo childViewInfo,[Function responseFactory = null]) {
+    return impl.onChildAttached(childKey,childViewInfo,responseFactory);
+  }
+  dynamic onChildUnavailable(int childKey,[Function responseFactory = null]) {
+    return impl.onChildUnavailable(childKey,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_manager.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_manager.mojom.dart
index 92e814e..a8dc87f 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_manager.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_manager.mojom.dart
@@ -240,9 +240,9 @@
   void createViewTree(Object viewTree, Object viewTreeListener, String label);
 }
 
-
-class _ViewManagerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ViewManagerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ViewManagerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -256,7 +256,6 @@
 
   String get serviceName => ViewManager.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -273,9 +272,9 @@
   }
 }
 
-
-class ViewManagerProxy extends bindings.Proxy
-                              implements ViewManager {
+class ViewManagerProxy
+    extends bindings.Proxy
+    implements ViewManager {
   ViewManagerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ViewManagerProxyControl.fromEndpoint(endpoint));
@@ -327,29 +326,24 @@
   }
 }
 
-
-class ViewManagerStub extends bindings.Stub {
+class _ViewManagerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ViewManager> {
   ViewManager _impl;
 
-  ViewManagerStub.fromEndpoint(
+  _ViewManagerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ViewManager impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewManagerStub.fromHandle(
+  _ViewManagerStubControl.fromHandle(
       core.MojoHandle handle, [ViewManager impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewManagerStub.unbound([this._impl]) : super.unbound();
-
-  static ViewManagerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewManagerStub"));
-    return new ViewManagerStub.fromEndpoint(endpoint);
-  }
+  _ViewManagerStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -399,9 +393,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ViewManagerStub($superString)";
+    return "_ViewManagerStubControl($superString)";
   }
 
   int get version => 0;
@@ -415,5 +410,37 @@
   }
 }
 
+class ViewManagerStub
+    extends bindings.Stub<ViewManager>
+    implements ViewManager {
+  ViewManagerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ViewManager impl])
+      : super(new _ViewManagerStubControl.fromEndpoint(endpoint, impl));
+
+  ViewManagerStub.fromHandle(
+      core.MojoHandle handle, [ViewManager impl])
+      : super(new _ViewManagerStubControl.fromHandle(handle, impl));
+
+  ViewManagerStub.unbound([ViewManager impl])
+      : super(new _ViewManagerStubControl.unbound(impl));
+
+  static ViewManagerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewManagerStub"));
+    return new ViewManagerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ViewManagerStubControl.serviceDescription;
+
+
+  void createView(Object view, Object viewOwner, Object viewListener, String label) {
+    return impl.createView(view, viewOwner, viewListener, label);
+  }
+  void createViewTree(Object viewTree, Object viewTreeListener, String label) {
+    return impl.createViewTree(viewTree, viewTreeListener, label);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_provider.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_provider.mojom.dart
index 21619b8..1ad0810 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_provider.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_provider.mojom.dart
@@ -126,9 +126,9 @@
   void createView(Object viewOwner, Object services, Object exposedServices);
 }
 
-
-class _ViewProviderProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ViewProviderProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ViewProviderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -142,7 +142,6 @@
 
   String get serviceName => ViewProvider.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -159,9 +158,9 @@
   }
 }
 
-
-class ViewProviderProxy extends bindings.Proxy
-                              implements ViewProvider {
+class ViewProviderProxy
+    extends bindings.Proxy
+    implements ViewProvider {
   ViewProviderProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ViewProviderProxyControl.fromEndpoint(endpoint));
@@ -200,29 +199,24 @@
   }
 }
 
-
-class ViewProviderStub extends bindings.Stub {
+class _ViewProviderStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ViewProvider> {
   ViewProvider _impl;
 
-  ViewProviderStub.fromEndpoint(
+  _ViewProviderStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ViewProvider impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewProviderStub.fromHandle(
+  _ViewProviderStubControl.fromHandle(
       core.MojoHandle handle, [ViewProvider impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewProviderStub.unbound([this._impl]) : super.unbound();
-
-  static ViewProviderStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewProviderStub"));
-    return new ViewProviderStub.fromEndpoint(endpoint);
-  }
+  _ViewProviderStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -267,9 +261,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ViewProviderStub($superString)";
+    return "_ViewProviderStubControl($superString)";
   }
 
   int get version => 0;
@@ -283,5 +278,34 @@
   }
 }
 
+class ViewProviderStub
+    extends bindings.Stub<ViewProvider>
+    implements ViewProvider {
+  ViewProviderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ViewProvider impl])
+      : super(new _ViewProviderStubControl.fromEndpoint(endpoint, impl));
+
+  ViewProviderStub.fromHandle(
+      core.MojoHandle handle, [ViewProvider impl])
+      : super(new _ViewProviderStubControl.fromHandle(handle, impl));
+
+  ViewProviderStub.unbound([ViewProvider impl])
+      : super(new _ViewProviderStubControl.unbound(impl));
+
+  static ViewProviderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewProviderStub"));
+    return new ViewProviderStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ViewProviderStubControl.serviceDescription;
+
+
+  void createView(Object viewOwner, Object services, Object exposedServices) {
+    return impl.createView(viewOwner, services, exposedServices);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_token.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_token.mojom.dart
index 125ef8f..c327087 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_token.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_token.mojom.dart
@@ -230,9 +230,9 @@
   dynamic getToken([Function responseFactory = null]);
 }
 
-
-class _ViewOwnerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ViewOwnerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ViewOwnerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -246,7 +246,6 @@
 
   String get serviceName => ViewOwner.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewOwnerMethodGetTokenName:
@@ -283,9 +282,9 @@
   }
 }
 
-
-class ViewOwnerProxy extends bindings.Proxy
-                              implements ViewOwner {
+class ViewOwnerProxy
+    extends bindings.Proxy
+    implements ViewOwner {
   ViewOwnerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ViewOwnerProxyControl.fromEndpoint(endpoint));
@@ -320,29 +319,24 @@
   }
 }
 
-
-class ViewOwnerStub extends bindings.Stub {
+class _ViewOwnerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ViewOwner> {
   ViewOwner _impl;
 
-  ViewOwnerStub.fromEndpoint(
+  _ViewOwnerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ViewOwner impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewOwnerStub.fromHandle(
+  _ViewOwnerStubControl.fromHandle(
       core.MojoHandle handle, [ViewOwner impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewOwnerStub.unbound([this._impl]) : super.unbound();
-
-  static ViewOwnerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewOwnerStub"));
-    return new ViewOwnerStub.fromEndpoint(endpoint);
-  }
+  _ViewOwnerStubControl.unbound([this._impl]) : super.unbound();
 
 
   ViewOwnerGetTokenResponseParams _viewOwnerGetTokenResponseParamsFactory(ViewToken token) {
@@ -407,9 +401,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ViewOwnerStub($superString)";
+    return "_ViewOwnerStubControl($superString)";
   }
 
   int get version => 0;
@@ -423,5 +418,34 @@
   }
 }
 
+class ViewOwnerStub
+    extends bindings.Stub<ViewOwner>
+    implements ViewOwner {
+  ViewOwnerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ViewOwner impl])
+      : super(new _ViewOwnerStubControl.fromEndpoint(endpoint, impl));
+
+  ViewOwnerStub.fromHandle(
+      core.MojoHandle handle, [ViewOwner impl])
+      : super(new _ViewOwnerStubControl.fromHandle(handle, impl));
+
+  ViewOwnerStub.unbound([ViewOwner impl])
+      : super(new _ViewOwnerStubControl.unbound(impl));
+
+  static ViewOwnerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewOwnerStub"));
+    return new ViewOwnerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ViewOwnerStubControl.serviceDescription;
+
+
+  dynamic getToken([Function responseFactory = null]) {
+    return impl.getToken(responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_trees.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_trees.mojom.dart
index 78bef26..908d01e 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/ui/view_trees.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/view_trees.mojom.dart
@@ -497,9 +497,9 @@
   void getContainer(Object container);
 }
 
-
-class _ViewTreeProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ViewTreeProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ViewTreeProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -513,7 +513,6 @@
 
   String get serviceName => ViewTree.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewTreeMethodGetTokenName:
@@ -550,9 +549,9 @@
   }
 }
 
-
-class ViewTreeProxy extends bindings.Proxy
-                              implements ViewTree {
+class ViewTreeProxy
+    extends bindings.Proxy
+    implements ViewTree {
   ViewTreeProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ViewTreeProxyControl.fromEndpoint(endpoint));
@@ -617,29 +616,24 @@
   }
 }
 
-
-class ViewTreeStub extends bindings.Stub {
+class _ViewTreeStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ViewTree> {
   ViewTree _impl;
 
-  ViewTreeStub.fromEndpoint(
+  _ViewTreeStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ViewTree impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewTreeStub.fromHandle(
+  _ViewTreeStubControl.fromHandle(
       core.MojoHandle handle, [ViewTree impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewTreeStub.unbound([this._impl]) : super.unbound();
-
-  static ViewTreeStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewTreeStub"));
-    return new ViewTreeStub.fromEndpoint(endpoint);
-  }
+  _ViewTreeStubControl.unbound([this._impl]) : super.unbound();
 
 
   ViewTreeGetTokenResponseParams _viewTreeGetTokenResponseParamsFactory(view_tree_token_mojom.ViewTreeToken token) {
@@ -719,9 +713,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ViewTreeStub($superString)";
+    return "_ViewTreeStubControl($superString)";
   }
 
   int get version => 0;
@@ -735,6 +730,44 @@
   }
 }
 
+class ViewTreeStub
+    extends bindings.Stub<ViewTree>
+    implements ViewTree {
+  ViewTreeStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ViewTree impl])
+      : super(new _ViewTreeStubControl.fromEndpoint(endpoint, impl));
+
+  ViewTreeStub.fromHandle(
+      core.MojoHandle handle, [ViewTree impl])
+      : super(new _ViewTreeStubControl.fromHandle(handle, impl));
+
+  ViewTreeStub.unbound([ViewTree impl])
+      : super(new _ViewTreeStubControl.unbound(impl));
+
+  static ViewTreeStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewTreeStub"));
+    return new ViewTreeStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ViewTreeStubControl.serviceDescription;
+
+
+  dynamic getToken([Function responseFactory = null]) {
+    return impl.getToken(responseFactory);
+  }
+  void getServiceProvider(Object serviceProvider) {
+    return impl.getServiceProvider(serviceProvider);
+  }
+  void setRenderer(Object renderer) {
+    return impl.setRenderer(renderer);
+  }
+  void getContainer(Object container) {
+    return impl.getContainer(container);
+  }
+}
+
 const int _viewTreeListenerMethodOnRendererDiedName = 0;
 
 class _ViewTreeListenerServiceDescription implements service_describer.ServiceDescription {
@@ -753,9 +786,9 @@
   dynamic onRendererDied([Function responseFactory = null]);
 }
 
-
-class _ViewTreeListenerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ViewTreeListenerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ViewTreeListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -769,7 +802,6 @@
 
   String get serviceName => ViewTreeListener.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewTreeListenerMethodOnRendererDiedName:
@@ -806,9 +838,9 @@
   }
 }
 
-
-class ViewTreeListenerProxy extends bindings.Proxy
-                              implements ViewTreeListener {
+class ViewTreeListenerProxy
+    extends bindings.Proxy
+    implements ViewTreeListener {
   ViewTreeListenerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ViewTreeListenerProxyControl.fromEndpoint(endpoint));
@@ -843,29 +875,24 @@
   }
 }
 
-
-class ViewTreeListenerStub extends bindings.Stub {
+class _ViewTreeListenerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ViewTreeListener> {
   ViewTreeListener _impl;
 
-  ViewTreeListenerStub.fromEndpoint(
+  _ViewTreeListenerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ViewTreeListener impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewTreeListenerStub.fromHandle(
+  _ViewTreeListenerStubControl.fromHandle(
       core.MojoHandle handle, [ViewTreeListener impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewTreeListenerStub.unbound([this._impl]) : super.unbound();
-
-  static ViewTreeListenerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewTreeListenerStub"));
-    return new ViewTreeListenerStub.fromEndpoint(endpoint);
-  }
+  _ViewTreeListenerStubControl.unbound([this._impl]) : super.unbound();
 
 
   ViewTreeListenerOnRendererDiedResponseParams _viewTreeListenerOnRendererDiedResponseParamsFactory() {
@@ -929,9 +956,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ViewTreeListenerStub($superString)";
+    return "_ViewTreeListenerStubControl($superString)";
   }
 
   int get version => 0;
@@ -945,5 +973,34 @@
   }
 }
 
+class ViewTreeListenerStub
+    extends bindings.Stub<ViewTreeListener>
+    implements ViewTreeListener {
+  ViewTreeListenerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ViewTreeListener impl])
+      : super(new _ViewTreeListenerStubControl.fromEndpoint(endpoint, impl));
+
+  ViewTreeListenerStub.fromHandle(
+      core.MojoHandle handle, [ViewTreeListener impl])
+      : super(new _ViewTreeListenerStubControl.fromHandle(handle, impl));
+
+  ViewTreeListenerStub.unbound([ViewTreeListener impl])
+      : super(new _ViewTreeListenerStubControl.unbound(impl));
+
+  static ViewTreeListenerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewTreeListenerStub"));
+    return new ViewTreeListenerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ViewTreeListenerStubControl.serviceDescription;
+
+
+  dynamic onRendererDied([Function responseFactory = null]) {
+    return impl.onRendererDied(responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/ui/views.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/ui/views.mojom.dart
index 9b930a6..b2ade58 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/ui/views.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/ui/views.mojom.dart
@@ -527,9 +527,9 @@
   void getContainer(Object container);
 }
 
-
-class _ViewProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ViewProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ViewProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -543,7 +543,6 @@
 
   String get serviceName => View.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewMethodGetTokenName:
@@ -580,9 +579,9 @@
   }
 }
 
-
-class ViewProxy extends bindings.Proxy
-                              implements View {
+class ViewProxy
+    extends bindings.Proxy
+    implements View {
   ViewProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ViewProxyControl.fromEndpoint(endpoint));
@@ -647,29 +646,24 @@
   }
 }
 
-
-class ViewStub extends bindings.Stub {
+class _ViewStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<View> {
   View _impl;
 
-  ViewStub.fromEndpoint(
+  _ViewStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [View impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewStub.fromHandle(
+  _ViewStubControl.fromHandle(
       core.MojoHandle handle, [View impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewStub.unbound([this._impl]) : super.unbound();
-
-  static ViewStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewStub"));
-    return new ViewStub.fromEndpoint(endpoint);
-  }
+  _ViewStubControl.unbound([this._impl]) : super.unbound();
 
 
   ViewGetTokenResponseParams _viewGetTokenResponseParamsFactory(view_token_mojom.ViewToken token) {
@@ -749,9 +743,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ViewStub($superString)";
+    return "_ViewStubControl($superString)";
   }
 
   int get version => 0;
@@ -765,6 +760,44 @@
   }
 }
 
+class ViewStub
+    extends bindings.Stub<View>
+    implements View {
+  ViewStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [View impl])
+      : super(new _ViewStubControl.fromEndpoint(endpoint, impl));
+
+  ViewStub.fromHandle(
+      core.MojoHandle handle, [View impl])
+      : super(new _ViewStubControl.fromHandle(handle, impl));
+
+  ViewStub.unbound([View impl])
+      : super(new _ViewStubControl.unbound(impl));
+
+  static ViewStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewStub"));
+    return new ViewStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ViewStubControl.serviceDescription;
+
+
+  dynamic getToken([Function responseFactory = null]) {
+    return impl.getToken(responseFactory);
+  }
+  void getServiceProvider(Object serviceProvider) {
+    return impl.getServiceProvider(serviceProvider);
+  }
+  void createScene(Object scene) {
+    return impl.createScene(scene);
+  }
+  void getContainer(Object container) {
+    return impl.getContainer(container);
+  }
+}
+
 const int _viewListenerMethodOnPropertiesChangedName = 0;
 
 class _ViewListenerServiceDescription implements service_describer.ServiceDescription {
@@ -783,9 +816,9 @@
   dynamic onPropertiesChanged(int sceneVersion,view_properties_mojom.ViewProperties properties,[Function responseFactory = null]);
 }
 
-
-class _ViewListenerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ViewListenerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ViewListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -799,7 +832,6 @@
 
   String get serviceName => ViewListener.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _viewListenerMethodOnPropertiesChangedName:
@@ -836,9 +868,9 @@
   }
 }
 
-
-class ViewListenerProxy extends bindings.Proxy
-                              implements ViewListener {
+class ViewListenerProxy
+    extends bindings.Proxy
+    implements ViewListener {
   ViewListenerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ViewListenerProxyControl.fromEndpoint(endpoint));
@@ -875,29 +907,24 @@
   }
 }
 
-
-class ViewListenerStub extends bindings.Stub {
+class _ViewListenerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ViewListener> {
   ViewListener _impl;
 
-  ViewListenerStub.fromEndpoint(
+  _ViewListenerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ViewListener impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewListenerStub.fromHandle(
+  _ViewListenerStubControl.fromHandle(
       core.MojoHandle handle, [ViewListener impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ViewListenerStub.unbound([this._impl]) : super.unbound();
-
-  static ViewListenerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ViewListenerStub"));
-    return new ViewListenerStub.fromEndpoint(endpoint);
-  }
+  _ViewListenerStubControl.unbound([this._impl]) : super.unbound();
 
 
   ViewListenerOnPropertiesChangedResponseParams _viewListenerOnPropertiesChangedResponseParamsFactory() {
@@ -963,9 +990,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ViewListenerStub($superString)";
+    return "_ViewListenerStubControl($superString)";
   }
 
   int get version => 0;
@@ -979,5 +1007,34 @@
   }
 }
 
+class ViewListenerStub
+    extends bindings.Stub<ViewListener>
+    implements ViewListener {
+  ViewListenerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ViewListener impl])
+      : super(new _ViewListenerStubControl.fromEndpoint(endpoint, impl));
+
+  ViewListenerStub.fromHandle(
+      core.MojoHandle handle, [ViewListener impl])
+      : super(new _ViewListenerStubControl.fromHandle(handle, impl));
+
+  ViewListenerStub.unbound([ViewListener impl])
+      : super(new _ViewListenerStubControl.unbound(impl));
+
+  static ViewListenerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ViewListenerStub"));
+    return new ViewListenerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ViewListenerStubControl.serviceDescription;
+
+
+  dynamic onPropertiesChanged(int sceneVersion,view_properties_mojom.ViewProperties properties,[Function responseFactory = null]) {
+    return impl.onPropertiesChanged(sceneVersion,properties,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/url_loader.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/url_loader.mojom.dart
index 3aa88cd..b15c2f5 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/url_loader.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/url_loader.mojom.dart
@@ -526,9 +526,9 @@
   dynamic queryStatus([Function responseFactory = null]);
 }
 
-
-class _UrlLoaderProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _UrlLoaderProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _UrlLoaderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -542,7 +542,6 @@
 
   String get serviceName => UrlLoader.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _urlLoaderMethodStartName:
@@ -619,9 +618,9 @@
   }
 }
 
-
-class UrlLoaderProxy extends bindings.Proxy
-                              implements UrlLoader {
+class UrlLoaderProxy
+    extends bindings.Proxy
+    implements UrlLoader {
   UrlLoaderProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _UrlLoaderProxyControl.fromEndpoint(endpoint));
@@ -673,29 +672,24 @@
   }
 }
 
-
-class UrlLoaderStub extends bindings.Stub {
+class _UrlLoaderStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<UrlLoader> {
   UrlLoader _impl;
 
-  UrlLoaderStub.fromEndpoint(
+  _UrlLoaderStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [UrlLoader impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UrlLoaderStub.fromHandle(
+  _UrlLoaderStubControl.fromHandle(
       core.MojoHandle handle, [UrlLoader impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UrlLoaderStub.unbound([this._impl]) : super.unbound();
-
-  static UrlLoaderStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UrlLoaderStub"));
-    return new UrlLoaderStub.fromEndpoint(endpoint);
-  }
+  _UrlLoaderStubControl.unbound([this._impl]) : super.unbound();
 
 
   UrlLoaderStartResponseParams _urlLoaderStartResponseParamsFactory(url_response_mojom.UrlResponse response) {
@@ -812,9 +806,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "UrlLoaderStub($superString)";
+    return "_UrlLoaderStubControl($superString)";
   }
 
   int get version => 0;
@@ -828,5 +823,40 @@
   }
 }
 
+class UrlLoaderStub
+    extends bindings.Stub<UrlLoader>
+    implements UrlLoader {
+  UrlLoaderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [UrlLoader impl])
+      : super(new _UrlLoaderStubControl.fromEndpoint(endpoint, impl));
+
+  UrlLoaderStub.fromHandle(
+      core.MojoHandle handle, [UrlLoader impl])
+      : super(new _UrlLoaderStubControl.fromHandle(handle, impl));
+
+  UrlLoaderStub.unbound([UrlLoader impl])
+      : super(new _UrlLoaderStubControl.unbound(impl));
+
+  static UrlLoaderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderStub"));
+    return new UrlLoaderStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _UrlLoaderStubControl.serviceDescription;
+
+
+  dynamic start(url_request_mojom.UrlRequest request,[Function responseFactory = null]) {
+    return impl.start(request,responseFactory);
+  }
+  dynamic followRedirect([Function responseFactory = null]) {
+    return impl.followRedirect(responseFactory);
+  }
+  dynamic queryStatus([Function responseFactory = null]) {
+    return impl.queryStatus(responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/url_loader_interceptor.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/url_loader_interceptor.mojom.dart
index d78a30f..ea31293 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/url_loader_interceptor.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/url_loader_interceptor.mojom.dart
@@ -604,9 +604,9 @@
   void create(Object interceptor);
 }
 
-
-class _UrlLoaderInterceptorFactoryProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _UrlLoaderInterceptorFactoryProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _UrlLoaderInterceptorFactoryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -620,7 +620,6 @@
 
   String get serviceName => UrlLoaderInterceptorFactory.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -637,9 +636,9 @@
   }
 }
 
-
-class UrlLoaderInterceptorFactoryProxy extends bindings.Proxy
-                              implements UrlLoaderInterceptorFactory {
+class UrlLoaderInterceptorFactoryProxy
+    extends bindings.Proxy
+    implements UrlLoaderInterceptorFactory {
   UrlLoaderInterceptorFactoryProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _UrlLoaderInterceptorFactoryProxyControl.fromEndpoint(endpoint));
@@ -676,29 +675,24 @@
   }
 }
 
-
-class UrlLoaderInterceptorFactoryStub extends bindings.Stub {
+class _UrlLoaderInterceptorFactoryStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<UrlLoaderInterceptorFactory> {
   UrlLoaderInterceptorFactory _impl;
 
-  UrlLoaderInterceptorFactoryStub.fromEndpoint(
+  _UrlLoaderInterceptorFactoryStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [UrlLoaderInterceptorFactory impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UrlLoaderInterceptorFactoryStub.fromHandle(
+  _UrlLoaderInterceptorFactoryStubControl.fromHandle(
       core.MojoHandle handle, [UrlLoaderInterceptorFactory impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UrlLoaderInterceptorFactoryStub.unbound([this._impl]) : super.unbound();
-
-  static UrlLoaderInterceptorFactoryStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UrlLoaderInterceptorFactoryStub"));
-    return new UrlLoaderInterceptorFactoryStub.fromEndpoint(endpoint);
-  }
+  _UrlLoaderInterceptorFactoryStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -743,9 +737,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "UrlLoaderInterceptorFactoryStub($superString)";
+    return "_UrlLoaderInterceptorFactoryStubControl($superString)";
   }
 
   int get version => 0;
@@ -759,6 +754,35 @@
   }
 }
 
+class UrlLoaderInterceptorFactoryStub
+    extends bindings.Stub<UrlLoaderInterceptorFactory>
+    implements UrlLoaderInterceptorFactory {
+  UrlLoaderInterceptorFactoryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [UrlLoaderInterceptorFactory impl])
+      : super(new _UrlLoaderInterceptorFactoryStubControl.fromEndpoint(endpoint, impl));
+
+  UrlLoaderInterceptorFactoryStub.fromHandle(
+      core.MojoHandle handle, [UrlLoaderInterceptorFactory impl])
+      : super(new _UrlLoaderInterceptorFactoryStubControl.fromHandle(handle, impl));
+
+  UrlLoaderInterceptorFactoryStub.unbound([UrlLoaderInterceptorFactory impl])
+      : super(new _UrlLoaderInterceptorFactoryStubControl.unbound(impl));
+
+  static UrlLoaderInterceptorFactoryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderInterceptorFactoryStub"));
+    return new UrlLoaderInterceptorFactoryStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _UrlLoaderInterceptorFactoryStubControl.serviceDescription;
+
+
+  void create(Object interceptor) {
+    return impl.create(interceptor);
+  }
+}
+
 const int _urlLoaderInterceptorMethodInterceptRequestName = 0;
 const int _urlLoaderInterceptorMethodInterceptFollowRedirectName = 1;
 const int _urlLoaderInterceptorMethodInterceptResponseName = 2;
@@ -781,9 +805,9 @@
   dynamic interceptResponse(url_response_mojom.UrlResponse response,[Function responseFactory = null]);
 }
 
-
-class _UrlLoaderInterceptorProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _UrlLoaderInterceptorProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _UrlLoaderInterceptorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -797,7 +821,6 @@
 
   String get serviceName => UrlLoaderInterceptor.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _urlLoaderInterceptorMethodInterceptRequestName:
@@ -874,9 +897,9 @@
   }
 }
 
-
-class UrlLoaderInterceptorProxy extends bindings.Proxy
-                              implements UrlLoaderInterceptor {
+class UrlLoaderInterceptorProxy
+    extends bindings.Proxy
+    implements UrlLoaderInterceptor {
   UrlLoaderInterceptorProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _UrlLoaderInterceptorProxyControl.fromEndpoint(endpoint));
@@ -929,29 +952,24 @@
   }
 }
 
-
-class UrlLoaderInterceptorStub extends bindings.Stub {
+class _UrlLoaderInterceptorStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<UrlLoaderInterceptor> {
   UrlLoaderInterceptor _impl;
 
-  UrlLoaderInterceptorStub.fromEndpoint(
+  _UrlLoaderInterceptorStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [UrlLoaderInterceptor impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UrlLoaderInterceptorStub.fromHandle(
+  _UrlLoaderInterceptorStubControl.fromHandle(
       core.MojoHandle handle, [UrlLoaderInterceptor impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UrlLoaderInterceptorStub.unbound([this._impl]) : super.unbound();
-
-  static UrlLoaderInterceptorStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UrlLoaderInterceptorStub"));
-    return new UrlLoaderInterceptorStub.fromEndpoint(endpoint);
-  }
+  _UrlLoaderInterceptorStubControl.unbound([this._impl]) : super.unbound();
 
 
   UrlLoaderInterceptorInterceptRequestResponseParams _urlLoaderInterceptorInterceptRequestResponseParamsFactory(UrlLoaderInterceptorResponse response) {
@@ -1070,9 +1088,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "UrlLoaderInterceptorStub($superString)";
+    return "_UrlLoaderInterceptorStubControl($superString)";
   }
 
   int get version => 0;
@@ -1086,5 +1105,40 @@
   }
 }
 
+class UrlLoaderInterceptorStub
+    extends bindings.Stub<UrlLoaderInterceptor>
+    implements UrlLoaderInterceptor {
+  UrlLoaderInterceptorStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [UrlLoaderInterceptor impl])
+      : super(new _UrlLoaderInterceptorStubControl.fromEndpoint(endpoint, impl));
+
+  UrlLoaderInterceptorStub.fromHandle(
+      core.MojoHandle handle, [UrlLoaderInterceptor impl])
+      : super(new _UrlLoaderInterceptorStubControl.fromHandle(handle, impl));
+
+  UrlLoaderInterceptorStub.unbound([UrlLoaderInterceptor impl])
+      : super(new _UrlLoaderInterceptorStubControl.unbound(impl));
+
+  static UrlLoaderInterceptorStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlLoaderInterceptorStub"));
+    return new UrlLoaderInterceptorStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _UrlLoaderInterceptorStubControl.serviceDescription;
+
+
+  dynamic interceptRequest(url_request_mojom.UrlRequest request,[Function responseFactory = null]) {
+    return impl.interceptRequest(request,responseFactory);
+  }
+  dynamic interceptFollowRedirect([Function responseFactory = null]) {
+    return impl.interceptFollowRedirect(responseFactory);
+  }
+  dynamic interceptResponse(url_response_mojom.UrlResponse response,[Function responseFactory = null]) {
+    return impl.interceptResponse(response,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/url_response_disk_cache.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/url_response_disk_cache.mojom.dart
index a8dc0e7..3e4f580 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/url_response_disk_cache.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/url_response_disk_cache.mojom.dart
@@ -666,9 +666,9 @@
   dynamic updateAndGetExtracted(url_response_mojom.UrlResponse response,[Function responseFactory = null]);
 }
 
-
-class _UrlResponseDiskCacheProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _UrlResponseDiskCacheProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _UrlResponseDiskCacheProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -682,7 +682,6 @@
 
   String get serviceName => UrlResponseDiskCache.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _urlResponseDiskCacheMethodGetName:
@@ -759,9 +758,9 @@
   }
 }
 
-
-class UrlResponseDiskCacheProxy extends bindings.Proxy
-                              implements UrlResponseDiskCache {
+class UrlResponseDiskCacheProxy
+    extends bindings.Proxy
+    implements UrlResponseDiskCache {
   UrlResponseDiskCacheProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _UrlResponseDiskCacheProxyControl.fromEndpoint(endpoint));
@@ -835,29 +834,24 @@
   }
 }
 
-
-class UrlResponseDiskCacheStub extends bindings.Stub {
+class _UrlResponseDiskCacheStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<UrlResponseDiskCache> {
   UrlResponseDiskCache _impl;
 
-  UrlResponseDiskCacheStub.fromEndpoint(
+  _UrlResponseDiskCacheStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [UrlResponseDiskCache impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UrlResponseDiskCacheStub.fromHandle(
+  _UrlResponseDiskCacheStubControl.fromHandle(
       core.MojoHandle handle, [UrlResponseDiskCache impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  UrlResponseDiskCacheStub.unbound([this._impl]) : super.unbound();
-
-  static UrlResponseDiskCacheStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For UrlResponseDiskCacheStub"));
-    return new UrlResponseDiskCacheStub.fromEndpoint(endpoint);
-  }
+  _UrlResponseDiskCacheStubControl.unbound([this._impl]) : super.unbound();
 
 
   UrlResponseDiskCacheGetResponseParams _urlResponseDiskCacheGetResponseParamsFactory(url_response_mojom.UrlResponse response, List<int> filePath, List<int> cacheDirPath) {
@@ -992,9 +986,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "UrlResponseDiskCacheStub($superString)";
+    return "_UrlResponseDiskCacheStubControl($superString)";
   }
 
   int get version => 0;
@@ -1008,5 +1003,46 @@
   }
 }
 
+class UrlResponseDiskCacheStub
+    extends bindings.Stub<UrlResponseDiskCache>
+    implements UrlResponseDiskCache {
+  UrlResponseDiskCacheStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [UrlResponseDiskCache impl])
+      : super(new _UrlResponseDiskCacheStubControl.fromEndpoint(endpoint, impl));
+
+  UrlResponseDiskCacheStub.fromHandle(
+      core.MojoHandle handle, [UrlResponseDiskCache impl])
+      : super(new _UrlResponseDiskCacheStubControl.fromHandle(handle, impl));
+
+  UrlResponseDiskCacheStub.unbound([UrlResponseDiskCache impl])
+      : super(new _UrlResponseDiskCacheStubControl.unbound(impl));
+
+  static UrlResponseDiskCacheStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For UrlResponseDiskCacheStub"));
+    return new UrlResponseDiskCacheStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _UrlResponseDiskCacheStubControl.serviceDescription;
+
+
+  dynamic get(String url,[Function responseFactory = null]) {
+    return impl.get(url,responseFactory);
+  }
+  void validate(String url) {
+    return impl.validate(url);
+  }
+  void update(url_response_mojom.UrlResponse response) {
+    return impl.update(response);
+  }
+  dynamic updateAndGet(url_response_mojom.UrlResponse response,[Function responseFactory = null]) {
+    return impl.updateAndGet(response,responseFactory);
+  }
+  dynamic updateAndGetExtracted(url_response_mojom.UrlResponse response,[Function responseFactory = null]) {
+    return impl.updateAndGetExtracted(response,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/web_socket.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/web_socket.mojom.dart
index 61ca5da..581c7f0 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/web_socket.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/web_socket.mojom.dart
@@ -938,9 +938,9 @@
   static const int kAbnormalCloseCode = 1006;
 }
 
-
-class _WebSocketProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _WebSocketProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _WebSocketProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -954,7 +954,6 @@
 
   String get serviceName => WebSocket.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -971,9 +970,9 @@
   }
 }
 
-
-class WebSocketProxy extends bindings.Proxy
-                              implements WebSocket {
+class WebSocketProxy
+    extends bindings.Proxy
+    implements WebSocket {
   WebSocketProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _WebSocketProxyControl.fromEndpoint(endpoint));
@@ -1047,29 +1046,24 @@
   }
 }
 
-
-class WebSocketStub extends bindings.Stub {
+class _WebSocketStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<WebSocket> {
   WebSocket _impl;
 
-  WebSocketStub.fromEndpoint(
+  _WebSocketStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [WebSocket impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  WebSocketStub.fromHandle(
+  _WebSocketStubControl.fromHandle(
       core.MojoHandle handle, [WebSocket impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  WebSocketStub.unbound([this._impl]) : super.unbound();
-
-  static WebSocketStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For WebSocketStub"));
-    return new WebSocketStub.fromEndpoint(endpoint);
-  }
+  _WebSocketStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -1129,9 +1123,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "WebSocketStub($superString)";
+    return "_WebSocketStubControl($superString)";
   }
 
   int get version => 0;
@@ -1145,6 +1140,44 @@
   }
 }
 
+class WebSocketStub
+    extends bindings.Stub<WebSocket>
+    implements WebSocket {
+  WebSocketStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [WebSocket impl])
+      : super(new _WebSocketStubControl.fromEndpoint(endpoint, impl));
+
+  WebSocketStub.fromHandle(
+      core.MojoHandle handle, [WebSocket impl])
+      : super(new _WebSocketStubControl.fromHandle(handle, impl));
+
+  WebSocketStub.unbound([WebSocket impl])
+      : super(new _WebSocketStubControl.unbound(impl));
+
+  static WebSocketStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WebSocketStub"));
+    return new WebSocketStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _WebSocketStubControl.serviceDescription;
+
+
+  void connect(String url, List<String> protocols, String origin, core.MojoDataPipeConsumer sendStream, Object client) {
+    return impl.connect(url, protocols, origin, sendStream, client);
+  }
+  void send(bool fin, WebSocketMessageType type, int numBytes) {
+    return impl.send(fin, type, numBytes);
+  }
+  void flowControl(int quota) {
+    return impl.flowControl(quota);
+  }
+  void close_(int code, String reason) {
+    return impl.close_(code, reason);
+  }
+}
+
 const int _webSocketClientMethodDidConnectName = 0;
 const int _webSocketClientMethodDidReceiveDataName = 1;
 const int _webSocketClientMethodDidReceiveFlowControlName = 2;
@@ -1171,9 +1204,9 @@
   void didClose(bool wasClean, int code, String reason);
 }
 
-
-class _WebSocketClientProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _WebSocketClientProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _WebSocketClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1187,7 +1220,6 @@
 
   String get serviceName => WebSocketClient.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -1204,9 +1236,9 @@
   }
 }
 
-
-class WebSocketClientProxy extends bindings.Proxy
-                              implements WebSocketClient {
+class WebSocketClientProxy
+    extends bindings.Proxy
+    implements WebSocketClient {
   WebSocketClientProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _WebSocketClientProxyControl.fromEndpoint(endpoint));
@@ -1289,29 +1321,24 @@
   }
 }
 
-
-class WebSocketClientStub extends bindings.Stub {
+class _WebSocketClientStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<WebSocketClient> {
   WebSocketClient _impl;
 
-  WebSocketClientStub.fromEndpoint(
+  _WebSocketClientStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [WebSocketClient impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  WebSocketClientStub.fromHandle(
+  _WebSocketClientStubControl.fromHandle(
       core.MojoHandle handle, [WebSocketClient impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  WebSocketClientStub.unbound([this._impl]) : super.unbound();
-
-  static WebSocketClientStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For WebSocketClientStub"));
-    return new WebSocketClientStub.fromEndpoint(endpoint);
-  }
+  _WebSocketClientStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -1376,9 +1403,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "WebSocketClientStub($superString)";
+    return "_WebSocketClientStubControl($superString)";
   }
 
   int get version => 0;
@@ -1392,5 +1420,46 @@
   }
 }
 
+class WebSocketClientStub
+    extends bindings.Stub<WebSocketClient>
+    implements WebSocketClient {
+  WebSocketClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [WebSocketClient impl])
+      : super(new _WebSocketClientStubControl.fromEndpoint(endpoint, impl));
+
+  WebSocketClientStub.fromHandle(
+      core.MojoHandle handle, [WebSocketClient impl])
+      : super(new _WebSocketClientStubControl.fromHandle(handle, impl));
+
+  WebSocketClientStub.unbound([WebSocketClient impl])
+      : super(new _WebSocketClientStubControl.unbound(impl));
+
+  static WebSocketClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For WebSocketClientStub"));
+    return new WebSocketClientStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _WebSocketClientStubControl.serviceDescription;
+
+
+  void didConnect(String selectedSubprotocol, String extensions, core.MojoDataPipeConsumer receiveStream) {
+    return impl.didConnect(selectedSubprotocol, extensions, receiveStream);
+  }
+  void didReceiveData(bool fin, WebSocketMessageType type, int numBytes) {
+    return impl.didReceiveData(fin, type, numBytes);
+  }
+  void didReceiveFlowControl(int quota) {
+    return impl.didReceiveFlowControl(quota);
+  }
+  void didFail(String message) {
+    return impl.didFail(message);
+  }
+  void didClose(bool wasClean, int code, String reason) {
+    return impl.didClose(wasClean, code, reason);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/native_support/process.mojom.dart b/mojo/dart/packages/mojo_services/lib/native_support/process.mojom.dart
index be717ac..9d364ca 100644
--- a/mojo/dart/packages/mojo_services/lib/native_support/process.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/native_support/process.mojom.dart
@@ -819,9 +819,9 @@
   dynamic spawnWithTerminal(List<int> path,List<List<int>> argv,List<List<int>> envp,Object terminalFile,Object processController,[Function responseFactory = null]);
 }
 
-
-class _ProcessProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ProcessProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ProcessProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -835,7 +835,6 @@
 
   String get serviceName => Process.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _processMethodSpawnName:
@@ -892,9 +891,9 @@
   }
 }
 
-
-class ProcessProxy extends bindings.Proxy
-                              implements Process {
+class ProcessProxy
+    extends bindings.Proxy
+    implements Process {
   ProcessProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ProcessProxyControl.fromEndpoint(endpoint));
@@ -949,29 +948,24 @@
   }
 }
 
-
-class ProcessStub extends bindings.Stub {
+class _ProcessStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Process> {
   Process _impl;
 
-  ProcessStub.fromEndpoint(
+  _ProcessStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Process impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ProcessStub.fromHandle(
+  _ProcessStubControl.fromHandle(
       core.MojoHandle handle, [Process impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ProcessStub.unbound([this._impl]) : super.unbound();
-
-  static ProcessStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ProcessStub"));
-    return new ProcessStub.fromEndpoint(endpoint);
-  }
+  _ProcessStubControl.unbound([this._impl]) : super.unbound();
 
 
   ProcessSpawnResponseParams _processSpawnResponseParamsFactory(types_mojom.Error error) {
@@ -1065,9 +1059,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ProcessStub($superString)";
+    return "_ProcessStubControl($superString)";
   }
 
   int get version => 0;
@@ -1081,6 +1076,38 @@
   }
 }
 
+class ProcessStub
+    extends bindings.Stub<Process>
+    implements Process {
+  ProcessStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Process impl])
+      : super(new _ProcessStubControl.fromEndpoint(endpoint, impl));
+
+  ProcessStub.fromHandle(
+      core.MojoHandle handle, [Process impl])
+      : super(new _ProcessStubControl.fromHandle(handle, impl));
+
+  ProcessStub.unbound([Process impl])
+      : super(new _ProcessStubControl.unbound(impl));
+
+  static ProcessStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ProcessStub"));
+    return new ProcessStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ProcessStubControl.serviceDescription;
+
+
+  dynamic spawn(List<int> path,List<List<int>> argv,List<List<int>> envp,Object stdinFile,Object stdoutFile,Object stderrFile,Object processController,[Function responseFactory = null]) {
+    return impl.spawn(path,argv,envp,stdinFile,stdoutFile,stderrFile,processController,responseFactory);
+  }
+  dynamic spawnWithTerminal(List<int> path,List<List<int>> argv,List<List<int>> envp,Object terminalFile,Object processController,[Function responseFactory = null]) {
+    return impl.spawnWithTerminal(path,argv,envp,terminalFile,processController,responseFactory);
+  }
+}
+
 const int _processControllerMethodWaitName = 0;
 const int _processControllerMethodKillName = 1;
 
@@ -1101,9 +1128,9 @@
   dynamic kill(int signal,[Function responseFactory = null]);
 }
 
-
-class _ProcessControllerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _ProcessControllerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _ProcessControllerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -1117,7 +1144,6 @@
 
   String get serviceName => ProcessController.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _processControllerMethodWaitName:
@@ -1174,9 +1200,9 @@
   }
 }
 
-
-class ProcessControllerProxy extends bindings.Proxy
-                              implements ProcessController {
+class ProcessControllerProxy
+    extends bindings.Proxy
+    implements ProcessController {
   ProcessControllerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _ProcessControllerProxyControl.fromEndpoint(endpoint));
@@ -1220,29 +1246,24 @@
   }
 }
 
-
-class ProcessControllerStub extends bindings.Stub {
+class _ProcessControllerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<ProcessController> {
   ProcessController _impl;
 
-  ProcessControllerStub.fromEndpoint(
+  _ProcessControllerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [ProcessController impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ProcessControllerStub.fromHandle(
+  _ProcessControllerStubControl.fromHandle(
       core.MojoHandle handle, [ProcessController impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  ProcessControllerStub.unbound([this._impl]) : super.unbound();
-
-  static ProcessControllerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For ProcessControllerStub"));
-    return new ProcessControllerStub.fromEndpoint(endpoint);
-  }
+  _ProcessControllerStubControl.unbound([this._impl]) : super.unbound();
 
 
   ProcessControllerWaitResponseParams _processControllerWaitResponseParamsFactory(types_mojom.Error error, int exitStatus) {
@@ -1335,9 +1356,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "ProcessControllerStub($superString)";
+    return "_ProcessControllerStubControl($superString)";
   }
 
   int get version => 0;
@@ -1351,5 +1373,37 @@
   }
 }
 
+class ProcessControllerStub
+    extends bindings.Stub<ProcessController>
+    implements ProcessController {
+  ProcessControllerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [ProcessController impl])
+      : super(new _ProcessControllerStubControl.fromEndpoint(endpoint, impl));
+
+  ProcessControllerStub.fromHandle(
+      core.MojoHandle handle, [ProcessController impl])
+      : super(new _ProcessControllerStubControl.fromHandle(handle, impl));
+
+  ProcessControllerStub.unbound([ProcessController impl])
+      : super(new _ProcessControllerStubControl.unbound(impl));
+
+  static ProcessControllerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For ProcessControllerStub"));
+    return new ProcessControllerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _ProcessControllerStubControl.serviceDescription;
+
+
+  dynamic wait([Function responseFactory = null]) {
+    return impl.wait(responseFactory);
+  }
+  dynamic kill(int signal,[Function responseFactory = null]) {
+    return impl.kill(signal,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/nfc/nfc.mojom.dart b/mojo/dart/packages/mojo_services/lib/nfc/nfc.mojom.dart
index e83046d..12b04ab 100644
--- a/mojo/dart/packages/mojo_services/lib/nfc/nfc.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/nfc/nfc.mojom.dart
@@ -503,9 +503,9 @@
   void cancel();
 }
 
-
-class _NfcTransmissionProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _NfcTransmissionProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _NfcTransmissionProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -519,7 +519,6 @@
 
   String get serviceName => NfcTransmission.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -536,9 +535,9 @@
   }
 }
 
-
-class NfcTransmissionProxy extends bindings.Proxy
-                              implements NfcTransmission {
+class NfcTransmissionProxy
+    extends bindings.Proxy
+    implements NfcTransmission {
   NfcTransmissionProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _NfcTransmissionProxyControl.fromEndpoint(endpoint));
@@ -574,29 +573,24 @@
   }
 }
 
-
-class NfcTransmissionStub extends bindings.Stub {
+class _NfcTransmissionStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<NfcTransmission> {
   NfcTransmission _impl;
 
-  NfcTransmissionStub.fromEndpoint(
+  _NfcTransmissionStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [NfcTransmission impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NfcTransmissionStub.fromHandle(
+  _NfcTransmissionStubControl.fromHandle(
       core.MojoHandle handle, [NfcTransmission impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NfcTransmissionStub.unbound([this._impl]) : super.unbound();
-
-  static NfcTransmissionStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NfcTransmissionStub"));
-    return new NfcTransmissionStub.fromEndpoint(endpoint);
-  }
+  _NfcTransmissionStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -639,9 +633,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "NfcTransmissionStub($superString)";
+    return "_NfcTransmissionStubControl($superString)";
   }
 
   int get version => 0;
@@ -655,6 +650,35 @@
   }
 }
 
+class NfcTransmissionStub
+    extends bindings.Stub<NfcTransmission>
+    implements NfcTransmission {
+  NfcTransmissionStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [NfcTransmission impl])
+      : super(new _NfcTransmissionStubControl.fromEndpoint(endpoint, impl));
+
+  NfcTransmissionStub.fromHandle(
+      core.MojoHandle handle, [NfcTransmission impl])
+      : super(new _NfcTransmissionStubControl.fromHandle(handle, impl));
+
+  NfcTransmissionStub.unbound([NfcTransmission impl])
+      : super(new _NfcTransmissionStubControl.unbound(impl));
+
+  static NfcTransmissionStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcTransmissionStub"));
+    return new NfcTransmissionStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _NfcTransmissionStubControl.serviceDescription;
+
+
+  void cancel() {
+    return impl.cancel();
+  }
+}
+
 const int _nfcReceiverMethodOnReceivedNfcDataName = 0;
 
 class _NfcReceiverServiceDescription implements service_describer.ServiceDescription {
@@ -673,9 +697,9 @@
   void onReceivedNfcData(NfcData nfcData);
 }
 
-
-class _NfcReceiverProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _NfcReceiverProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _NfcReceiverProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -689,7 +713,6 @@
 
   String get serviceName => NfcReceiver.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -706,9 +729,9 @@
   }
 }
 
-
-class NfcReceiverProxy extends bindings.Proxy
-                              implements NfcReceiver {
+class NfcReceiverProxy
+    extends bindings.Proxy
+    implements NfcReceiver {
   NfcReceiverProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _NfcReceiverProxyControl.fromEndpoint(endpoint));
@@ -745,29 +768,24 @@
   }
 }
 
-
-class NfcReceiverStub extends bindings.Stub {
+class _NfcReceiverStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<NfcReceiver> {
   NfcReceiver _impl;
 
-  NfcReceiverStub.fromEndpoint(
+  _NfcReceiverStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [NfcReceiver impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NfcReceiverStub.fromHandle(
+  _NfcReceiverStubControl.fromHandle(
       core.MojoHandle handle, [NfcReceiver impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NfcReceiverStub.unbound([this._impl]) : super.unbound();
-
-  static NfcReceiverStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NfcReceiverStub"));
-    return new NfcReceiverStub.fromEndpoint(endpoint);
-  }
+  _NfcReceiverStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -812,9 +830,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "NfcReceiverStub($superString)";
+    return "_NfcReceiverStubControl($superString)";
   }
 
   int get version => 0;
@@ -828,6 +847,35 @@
   }
 }
 
+class NfcReceiverStub
+    extends bindings.Stub<NfcReceiver>
+    implements NfcReceiver {
+  NfcReceiverStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [NfcReceiver impl])
+      : super(new _NfcReceiverStubControl.fromEndpoint(endpoint, impl));
+
+  NfcReceiverStub.fromHandle(
+      core.MojoHandle handle, [NfcReceiver impl])
+      : super(new _NfcReceiverStubControl.fromHandle(handle, impl));
+
+  NfcReceiverStub.unbound([NfcReceiver impl])
+      : super(new _NfcReceiverStubControl.unbound(impl));
+
+  static NfcReceiverStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcReceiverStub"));
+    return new NfcReceiverStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _NfcReceiverStubControl.serviceDescription;
+
+
+  void onReceivedNfcData(NfcData nfcData) {
+    return impl.onReceivedNfcData(nfcData);
+  }
+}
+
 const int _nfcMethodTransmitOnNextConnectionName = 0;
 const int _nfcMethodRegisterName = 1;
 const int _nfcMethodUnregisterName = 2;
@@ -850,9 +898,9 @@
   void unregister();
 }
 
-
-class _NfcProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _NfcProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _NfcProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -866,7 +914,6 @@
 
   String get serviceName => Nfc.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _nfcMethodTransmitOnNextConnectionName:
@@ -903,9 +950,9 @@
   }
 }
 
-
-class NfcProxy extends bindings.Proxy
-                              implements Nfc {
+class NfcProxy
+    extends bindings.Proxy
+    implements Nfc {
   NfcProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _NfcProxyControl.fromEndpoint(endpoint));
@@ -960,29 +1007,24 @@
   }
 }
 
-
-class NfcStub extends bindings.Stub {
+class _NfcStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Nfc> {
   Nfc _impl;
 
-  NfcStub.fromEndpoint(
+  _NfcStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Nfc impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NfcStub.fromHandle(
+  _NfcStubControl.fromHandle(
       core.MojoHandle handle, [Nfc impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NfcStub.unbound([this._impl]) : super.unbound();
-
-  static NfcStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NfcStub"));
-    return new NfcStub.fromEndpoint(endpoint);
-  }
+  _NfcStubControl.unbound([this._impl]) : super.unbound();
 
 
   NfcTransmitOnNextConnectionResponseParams _nfcTransmitOnNextConnectionResponseParamsFactory(bool success) {
@@ -1055,9 +1097,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "NfcStub($superString)";
+    return "_NfcStubControl($superString)";
   }
 
   int get version => 0;
@@ -1071,5 +1114,40 @@
   }
 }
 
+class NfcStub
+    extends bindings.Stub<Nfc>
+    implements Nfc {
+  NfcStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Nfc impl])
+      : super(new _NfcStubControl.fromEndpoint(endpoint, impl));
+
+  NfcStub.fromHandle(
+      core.MojoHandle handle, [Nfc impl])
+      : super(new _NfcStubControl.fromHandle(handle, impl));
+
+  NfcStub.unbound([Nfc impl])
+      : super(new _NfcStubControl.unbound(impl));
+
+  static NfcStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NfcStub"));
+    return new NfcStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _NfcStubControl.serviceDescription;
+
+
+  dynamic transmitOnNextConnection(NfcData nfcData,Object transmission,[Function responseFactory = null]) {
+    return impl.transmitOnNextConnection(nfcData,transmission,responseFactory);
+  }
+  void register() {
+    return impl.register();
+  }
+  void unregister() {
+    return impl.unregister();
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/notifications/notifications.mojom.dart b/mojo/dart/packages/mojo_services/lib/notifications/notifications.mojom.dart
index c2c8c41..f356c90 100644
--- a/mojo/dart/packages/mojo_services/lib/notifications/notifications.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/notifications/notifications.mojom.dart
@@ -502,9 +502,9 @@
   void onDismissed();
 }
 
-
-class _NotificationClientProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _NotificationClientProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _NotificationClientProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -518,7 +518,6 @@
 
   String get serviceName => NotificationClient.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -535,9 +534,9 @@
   }
 }
 
-
-class NotificationClientProxy extends bindings.Proxy
-                              implements NotificationClient {
+class NotificationClientProxy
+    extends bindings.Proxy
+    implements NotificationClient {
   NotificationClientProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _NotificationClientProxyControl.fromEndpoint(endpoint));
@@ -582,29 +581,24 @@
   }
 }
 
-
-class NotificationClientStub extends bindings.Stub {
+class _NotificationClientStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<NotificationClient> {
   NotificationClient _impl;
 
-  NotificationClientStub.fromEndpoint(
+  _NotificationClientStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [NotificationClient impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NotificationClientStub.fromHandle(
+  _NotificationClientStubControl.fromHandle(
       core.MojoHandle handle, [NotificationClient impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NotificationClientStub.unbound([this._impl]) : super.unbound();
-
-  static NotificationClientStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NotificationClientStub"));
-    return new NotificationClientStub.fromEndpoint(endpoint);
-  }
+  _NotificationClientStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -650,9 +644,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "NotificationClientStub($superString)";
+    return "_NotificationClientStubControl($superString)";
   }
 
   int get version => 0;
@@ -666,6 +661,38 @@
   }
 }
 
+class NotificationClientStub
+    extends bindings.Stub<NotificationClient>
+    implements NotificationClient {
+  NotificationClientStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [NotificationClient impl])
+      : super(new _NotificationClientStubControl.fromEndpoint(endpoint, impl));
+
+  NotificationClientStub.fromHandle(
+      core.MojoHandle handle, [NotificationClient impl])
+      : super(new _NotificationClientStubControl.fromHandle(handle, impl));
+
+  NotificationClientStub.unbound([NotificationClient impl])
+      : super(new _NotificationClientStubControl.unbound(impl));
+
+  static NotificationClientStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationClientStub"));
+    return new NotificationClientStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _NotificationClientStubControl.serviceDescription;
+
+
+  void onSelected() {
+    return impl.onSelected();
+  }
+  void onDismissed() {
+    return impl.onDismissed();
+  }
+}
+
 const int _notificationMethodUpdateName = 0;
 const int _notificationMethodCancelName = 1;
 
@@ -686,9 +713,9 @@
   void cancel();
 }
 
-
-class _NotificationProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _NotificationProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _NotificationProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -702,7 +729,6 @@
 
   String get serviceName => Notification.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -719,9 +745,9 @@
   }
 }
 
-
-class NotificationProxy extends bindings.Proxy
-                              implements Notification {
+class NotificationProxy
+    extends bindings.Proxy
+    implements Notification {
   NotificationProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _NotificationProxyControl.fromEndpoint(endpoint));
@@ -767,29 +793,24 @@
   }
 }
 
-
-class NotificationStub extends bindings.Stub {
+class _NotificationStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<Notification> {
   Notification _impl;
 
-  NotificationStub.fromEndpoint(
+  _NotificationStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [Notification impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NotificationStub.fromHandle(
+  _NotificationStubControl.fromHandle(
       core.MojoHandle handle, [Notification impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NotificationStub.unbound([this._impl]) : super.unbound();
-
-  static NotificationStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NotificationStub"));
-    return new NotificationStub.fromEndpoint(endpoint);
-  }
+  _NotificationStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -837,9 +858,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "NotificationStub($superString)";
+    return "_NotificationStubControl($superString)";
   }
 
   int get version => 0;
@@ -853,6 +875,38 @@
   }
 }
 
+class NotificationStub
+    extends bindings.Stub<Notification>
+    implements Notification {
+  NotificationStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [Notification impl])
+      : super(new _NotificationStubControl.fromEndpoint(endpoint, impl));
+
+  NotificationStub.fromHandle(
+      core.MojoHandle handle, [Notification impl])
+      : super(new _NotificationStubControl.fromHandle(handle, impl));
+
+  NotificationStub.unbound([Notification impl])
+      : super(new _NotificationStubControl.unbound(impl));
+
+  static NotificationStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationStub"));
+    return new NotificationStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _NotificationStubControl.serviceDescription;
+
+
+  void update(NotificationData notificationData) {
+    return impl.update(notificationData);
+  }
+  void cancel() {
+    return impl.cancel();
+  }
+}
+
 const int _notificationServiceMethodPostName = 0;
 
 class _NotificationServiceServiceDescription implements service_describer.ServiceDescription {
@@ -871,9 +925,9 @@
   void post(NotificationData notificationData, Object client, Object notification);
 }
 
-
-class _NotificationServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _NotificationServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _NotificationServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -887,7 +941,6 @@
 
   String get serviceName => NotificationService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -904,9 +957,9 @@
   }
 }
 
-
-class NotificationServiceProxy extends bindings.Proxy
-                              implements NotificationService {
+class NotificationServiceProxy
+    extends bindings.Proxy
+    implements NotificationService {
   NotificationServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _NotificationServiceProxyControl.fromEndpoint(endpoint));
@@ -945,29 +998,24 @@
   }
 }
 
-
-class NotificationServiceStub extends bindings.Stub {
+class _NotificationServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<NotificationService> {
   NotificationService _impl;
 
-  NotificationServiceStub.fromEndpoint(
+  _NotificationServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [NotificationService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NotificationServiceStub.fromHandle(
+  _NotificationServiceStubControl.fromHandle(
       core.MojoHandle handle, [NotificationService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  NotificationServiceStub.unbound([this._impl]) : super.unbound();
-
-  static NotificationServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For NotificationServiceStub"));
-    return new NotificationServiceStub.fromEndpoint(endpoint);
-  }
+  _NotificationServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -1012,9 +1060,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "NotificationServiceStub($superString)";
+    return "_NotificationServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -1028,5 +1077,34 @@
   }
 }
 
+class NotificationServiceStub
+    extends bindings.Stub<NotificationService>
+    implements NotificationService {
+  NotificationServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [NotificationService impl])
+      : super(new _NotificationServiceStubControl.fromEndpoint(endpoint, impl));
+
+  NotificationServiceStub.fromHandle(
+      core.MojoHandle handle, [NotificationService impl])
+      : super(new _NotificationServiceStubControl.fromHandle(handle, impl));
+
+  NotificationServiceStub.unbound([NotificationService impl])
+      : super(new _NotificationServiceStubControl.unbound(impl));
+
+  static NotificationServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For NotificationServiceStub"));
+    return new NotificationServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _NotificationServiceStubControl.serviceDescription;
+
+
+  void post(NotificationData notificationData, Object client, Object notification) {
+    return impl.post(notificationData, client, notification);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/prediction/prediction.mojom.dart b/mojo/dart/packages/mojo_services/lib/prediction/prediction.mojom.dart
index 9023ec8..891ffd3 100644
--- a/mojo/dart/packages/mojo_services/lib/prediction/prediction.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/prediction/prediction.mojom.dart
@@ -377,9 +377,9 @@
   dynamic getPredictionList(PredictionInfo predictionInfo,[Function responseFactory = null]);
 }
 
-
-class _PredictionServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _PredictionServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _PredictionServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -393,7 +393,6 @@
 
   String get serviceName => PredictionService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _predictionServiceMethodGetPredictionListName:
@@ -430,9 +429,9 @@
   }
 }
 
-
-class PredictionServiceProxy extends bindings.Proxy
-                              implements PredictionService {
+class PredictionServiceProxy
+    extends bindings.Proxy
+    implements PredictionService {
   PredictionServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _PredictionServiceProxyControl.fromEndpoint(endpoint));
@@ -468,29 +467,24 @@
   }
 }
 
-
-class PredictionServiceStub extends bindings.Stub {
+class _PredictionServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<PredictionService> {
   PredictionService _impl;
 
-  PredictionServiceStub.fromEndpoint(
+  _PredictionServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [PredictionService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  PredictionServiceStub.fromHandle(
+  _PredictionServiceStubControl.fromHandle(
       core.MojoHandle handle, [PredictionService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  PredictionServiceStub.unbound([this._impl]) : super.unbound();
-
-  static PredictionServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For PredictionServiceStub"));
-    return new PredictionServiceStub.fromEndpoint(endpoint);
-  }
+  _PredictionServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
   PredictionServiceGetPredictionListResponseParams _predictionServiceGetPredictionListResponseParamsFactory(List<String> predictionList) {
@@ -557,9 +551,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "PredictionServiceStub($superString)";
+    return "_PredictionServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -573,5 +568,34 @@
   }
 }
 
+class PredictionServiceStub
+    extends bindings.Stub<PredictionService>
+    implements PredictionService {
+  PredictionServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [PredictionService impl])
+      : super(new _PredictionServiceStubControl.fromEndpoint(endpoint, impl));
+
+  PredictionServiceStub.fromHandle(
+      core.MojoHandle handle, [PredictionService impl])
+      : super(new _PredictionServiceStubControl.fromHandle(handle, impl));
+
+  PredictionServiceStub.unbound([PredictionService impl])
+      : super(new _PredictionServiceStubControl.unbound(impl));
+
+  static PredictionServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For PredictionServiceStub"));
+    return new PredictionServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _PredictionServiceStubControl.serviceDescription;
+
+
+  dynamic getPredictionList(PredictionInfo predictionInfo,[Function responseFactory = null]) {
+    return impl.getPredictionList(predictionInfo,responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/sensors/sensors.mojom.dart b/mojo/dart/packages/mojo_services/lib/sensors/sensors.mojom.dart
index 533035a..228c920 100644
--- a/mojo/dart/packages/mojo_services/lib/sensors/sensors.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/sensors/sensors.mojom.dart
@@ -533,9 +533,9 @@
   void onSensorChanged(SensorData data);
 }
 
-
-class _SensorListenerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SensorListenerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SensorListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -549,7 +549,6 @@
 
   String get serviceName => SensorListener.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -566,9 +565,9 @@
   }
 }
 
-
-class SensorListenerProxy extends bindings.Proxy
-                              implements SensorListener {
+class SensorListenerProxy
+    extends bindings.Proxy
+    implements SensorListener {
   SensorListenerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SensorListenerProxyControl.fromEndpoint(endpoint));
@@ -615,29 +614,24 @@
   }
 }
 
-
-class SensorListenerStub extends bindings.Stub {
+class _SensorListenerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<SensorListener> {
   SensorListener _impl;
 
-  SensorListenerStub.fromEndpoint(
+  _SensorListenerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [SensorListener impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SensorListenerStub.fromHandle(
+  _SensorListenerStubControl.fromHandle(
       core.MojoHandle handle, [SensorListener impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SensorListenerStub.unbound([this._impl]) : super.unbound();
-
-  static SensorListenerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SensorListenerStub"));
-    return new SensorListenerStub.fromEndpoint(endpoint);
-  }
+  _SensorListenerStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -687,9 +681,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SensorListenerStub($superString)";
+    return "_SensorListenerStubControl($superString)";
   }
 
   int get version => 0;
@@ -703,6 +698,38 @@
   }
 }
 
+class SensorListenerStub
+    extends bindings.Stub<SensorListener>
+    implements SensorListener {
+  SensorListenerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [SensorListener impl])
+      : super(new _SensorListenerStubControl.fromEndpoint(endpoint, impl));
+
+  SensorListenerStub.fromHandle(
+      core.MojoHandle handle, [SensorListener impl])
+      : super(new _SensorListenerStubControl.fromHandle(handle, impl));
+
+  SensorListenerStub.unbound([SensorListener impl])
+      : super(new _SensorListenerStubControl.unbound(impl));
+
+  static SensorListenerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SensorListenerStub"));
+    return new SensorListenerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SensorListenerStubControl.serviceDescription;
+
+
+  void onAccuracyChanged(int accuracy) {
+    return impl.onAccuracyChanged(accuracy);
+  }
+  void onSensorChanged(SensorData data) {
+    return impl.onSensorChanged(data);
+  }
+}
+
 const int _sensorServiceMethodAddListenerName = 0;
 
 class _SensorServiceServiceDescription implements service_describer.ServiceDescription {
@@ -721,9 +748,9 @@
   void addListener(SensorType type, Object listener);
 }
 
-
-class _SensorServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SensorServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SensorServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -737,7 +764,6 @@
 
   String get serviceName => SensorService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -754,9 +780,9 @@
   }
 }
 
-
-class SensorServiceProxy extends bindings.Proxy
-                              implements SensorService {
+class SensorServiceProxy
+    extends bindings.Proxy
+    implements SensorService {
   SensorServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SensorServiceProxyControl.fromEndpoint(endpoint));
@@ -794,29 +820,24 @@
   }
 }
 
-
-class SensorServiceStub extends bindings.Stub {
+class _SensorServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<SensorService> {
   SensorService _impl;
 
-  SensorServiceStub.fromEndpoint(
+  _SensorServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [SensorService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SensorServiceStub.fromHandle(
+  _SensorServiceStubControl.fromHandle(
       core.MojoHandle handle, [SensorService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SensorServiceStub.unbound([this._impl]) : super.unbound();
-
-  static SensorServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SensorServiceStub"));
-    return new SensorServiceStub.fromEndpoint(endpoint);
-  }
+  _SensorServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -861,9 +882,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SensorServiceStub($superString)";
+    return "_SensorServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -877,5 +899,34 @@
   }
 }
 
+class SensorServiceStub
+    extends bindings.Stub<SensorService>
+    implements SensorService {
+  SensorServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [SensorService impl])
+      : super(new _SensorServiceStubControl.fromEndpoint(endpoint, impl));
+
+  SensorServiceStub.fromHandle(
+      core.MojoHandle handle, [SensorService impl])
+      : super(new _SensorServiceStubControl.fromHandle(handle, impl));
+
+  SensorServiceStub.unbound([SensorService impl])
+      : super(new _SensorServiceStubControl.unbound(impl));
+
+  static SensorServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SensorServiceStub"));
+    return new SensorServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SensorServiceStubControl.serviceDescription;
+
+
+  void addListener(SensorType type, Object listener) {
+    return impl.addListener(type, listener);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/speech_recognizer/speech_recognizer.mojom.dart b/mojo/dart/packages/mojo_services/lib/speech_recognizer/speech_recognizer.mojom.dart
index 58e8293..11b167d 100644
--- a/mojo/dart/packages/mojo_services/lib/speech_recognizer/speech_recognizer.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/speech_recognizer/speech_recognizer.mojom.dart
@@ -597,9 +597,9 @@
   void onSoundLevelChanged(double rmsDb);
 }
 
-
-class _SpeechRecognizerListenerProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SpeechRecognizerListenerProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SpeechRecognizerListenerProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -613,7 +613,6 @@
 
   String get serviceName => SpeechRecognizerListener.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -630,9 +629,9 @@
   }
 }
 
-
-class SpeechRecognizerListenerProxy extends bindings.Proxy
-                              implements SpeechRecognizerListener {
+class SpeechRecognizerListenerProxy
+    extends bindings.Proxy
+    implements SpeechRecognizerListener {
   SpeechRecognizerListenerProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SpeechRecognizerListenerProxyControl.fromEndpoint(endpoint));
@@ -690,29 +689,24 @@
   }
 }
 
-
-class SpeechRecognizerListenerStub extends bindings.Stub {
+class _SpeechRecognizerListenerStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<SpeechRecognizerListener> {
   SpeechRecognizerListener _impl;
 
-  SpeechRecognizerListenerStub.fromEndpoint(
+  _SpeechRecognizerListenerStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [SpeechRecognizerListener impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SpeechRecognizerListenerStub.fromHandle(
+  _SpeechRecognizerListenerStubControl.fromHandle(
       core.MojoHandle handle, [SpeechRecognizerListener impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SpeechRecognizerListenerStub.unbound([this._impl]) : super.unbound();
-
-  static SpeechRecognizerListenerStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SpeechRecognizerListenerStub"));
-    return new SpeechRecognizerListenerStub.fromEndpoint(endpoint);
-  }
+  _SpeechRecognizerListenerStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -767,9 +761,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SpeechRecognizerListenerStub($superString)";
+    return "_SpeechRecognizerListenerStubControl($superString)";
   }
 
   int get version => 0;
@@ -783,6 +778,41 @@
   }
 }
 
+class SpeechRecognizerListenerStub
+    extends bindings.Stub<SpeechRecognizerListener>
+    implements SpeechRecognizerListener {
+  SpeechRecognizerListenerStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [SpeechRecognizerListener impl])
+      : super(new _SpeechRecognizerListenerStubControl.fromEndpoint(endpoint, impl));
+
+  SpeechRecognizerListenerStub.fromHandle(
+      core.MojoHandle handle, [SpeechRecognizerListener impl])
+      : super(new _SpeechRecognizerListenerStubControl.fromHandle(handle, impl));
+
+  SpeechRecognizerListenerStub.unbound([SpeechRecognizerListener impl])
+      : super(new _SpeechRecognizerListenerStubControl.unbound(impl));
+
+  static SpeechRecognizerListenerStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SpeechRecognizerListenerStub"));
+    return new SpeechRecognizerListenerStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SpeechRecognizerListenerStubControl.serviceDescription;
+
+
+  void onRecognizerError(Error errorCode) {
+    return impl.onRecognizerError(errorCode);
+  }
+  void onResults(List<UtteranceCandidate> results, bool complete) {
+    return impl.onResults(results, complete);
+  }
+  void onSoundLevelChanged(double rmsDb) {
+    return impl.onSoundLevelChanged(rmsDb);
+  }
+}
+
 const int _speechRecognizerServiceMethodListenName = 0;
 const int _speechRecognizerServiceMethodStopListeningName = 1;
 
@@ -803,9 +833,9 @@
   void stopListening();
 }
 
-
-class _SpeechRecognizerServiceProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _SpeechRecognizerServiceProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _SpeechRecognizerServiceProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -819,7 +849,6 @@
 
   String get serviceName => SpeechRecognizerService.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -836,9 +865,9 @@
   }
 }
 
-
-class SpeechRecognizerServiceProxy extends bindings.Proxy
-                              implements SpeechRecognizerService {
+class SpeechRecognizerServiceProxy
+    extends bindings.Proxy
+    implements SpeechRecognizerService {
   SpeechRecognizerServiceProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _SpeechRecognizerServiceProxyControl.fromEndpoint(endpoint));
@@ -884,29 +913,24 @@
   }
 }
 
-
-class SpeechRecognizerServiceStub extends bindings.Stub {
+class _SpeechRecognizerServiceStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<SpeechRecognizerService> {
   SpeechRecognizerService _impl;
 
-  SpeechRecognizerServiceStub.fromEndpoint(
+  _SpeechRecognizerServiceStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [SpeechRecognizerService impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SpeechRecognizerServiceStub.fromHandle(
+  _SpeechRecognizerServiceStubControl.fromHandle(
       core.MojoHandle handle, [SpeechRecognizerService impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  SpeechRecognizerServiceStub.unbound([this._impl]) : super.unbound();
-
-  static SpeechRecognizerServiceStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For SpeechRecognizerServiceStub"));
-    return new SpeechRecognizerServiceStub.fromEndpoint(endpoint);
-  }
+  _SpeechRecognizerServiceStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -954,9 +978,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "SpeechRecognizerServiceStub($superString)";
+    return "_SpeechRecognizerServiceStubControl($superString)";
   }
 
   int get version => 0;
@@ -970,5 +995,37 @@
   }
 }
 
+class SpeechRecognizerServiceStub
+    extends bindings.Stub<SpeechRecognizerService>
+    implements SpeechRecognizerService {
+  SpeechRecognizerServiceStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [SpeechRecognizerService impl])
+      : super(new _SpeechRecognizerServiceStubControl.fromEndpoint(endpoint, impl));
+
+  SpeechRecognizerServiceStub.fromHandle(
+      core.MojoHandle handle, [SpeechRecognizerService impl])
+      : super(new _SpeechRecognizerServiceStubControl.fromHandle(handle, impl));
+
+  SpeechRecognizerServiceStub.unbound([SpeechRecognizerService impl])
+      : super(new _SpeechRecognizerServiceStubControl.unbound(impl));
+
+  static SpeechRecognizerServiceStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For SpeechRecognizerServiceStub"));
+    return new SpeechRecognizerServiceStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _SpeechRecognizerServiceStubControl.serviceDescription;
+
+
+  void listen(Object listener) {
+    return impl.listen(listener);
+  }
+  void stopListening() {
+    return impl.stopListening();
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/tracing/trace_provider_registry.mojom.dart b/mojo/dart/packages/mojo_services/lib/tracing/trace_provider_registry.mojom.dart
index 45901a7..13efe5a 100644
--- a/mojo/dart/packages/mojo_services/lib/tracing/trace_provider_registry.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/tracing/trace_provider_registry.mojom.dart
@@ -99,9 +99,9 @@
   void registerTraceProvider(Object traceProvider);
 }
 
-
-class _TraceProviderRegistryProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _TraceProviderRegistryProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _TraceProviderRegistryProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -115,7 +115,6 @@
 
   String get serviceName => TraceProviderRegistry.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -132,9 +131,9 @@
   }
 }
 
-
-class TraceProviderRegistryProxy extends bindings.Proxy
-                              implements TraceProviderRegistry {
+class TraceProviderRegistryProxy
+    extends bindings.Proxy
+    implements TraceProviderRegistry {
   TraceProviderRegistryProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _TraceProviderRegistryProxyControl.fromEndpoint(endpoint));
@@ -171,29 +170,24 @@
   }
 }
 
-
-class TraceProviderRegistryStub extends bindings.Stub {
+class _TraceProviderRegistryStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<TraceProviderRegistry> {
   TraceProviderRegistry _impl;
 
-  TraceProviderRegistryStub.fromEndpoint(
+  _TraceProviderRegistryStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [TraceProviderRegistry impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TraceProviderRegistryStub.fromHandle(
+  _TraceProviderRegistryStubControl.fromHandle(
       core.MojoHandle handle, [TraceProviderRegistry impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TraceProviderRegistryStub.unbound([this._impl]) : super.unbound();
-
-  static TraceProviderRegistryStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TraceProviderRegistryStub"));
-    return new TraceProviderRegistryStub.fromEndpoint(endpoint);
-  }
+  _TraceProviderRegistryStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -238,9 +232,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "TraceProviderRegistryStub($superString)";
+    return "_TraceProviderRegistryStubControl($superString)";
   }
 
   int get version => 0;
@@ -254,5 +249,34 @@
   }
 }
 
+class TraceProviderRegistryStub
+    extends bindings.Stub<TraceProviderRegistry>
+    implements TraceProviderRegistry {
+  TraceProviderRegistryStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [TraceProviderRegistry impl])
+      : super(new _TraceProviderRegistryStubControl.fromEndpoint(endpoint, impl));
+
+  TraceProviderRegistryStub.fromHandle(
+      core.MojoHandle handle, [TraceProviderRegistry impl])
+      : super(new _TraceProviderRegistryStubControl.fromHandle(handle, impl));
+
+  TraceProviderRegistryStub.unbound([TraceProviderRegistry impl])
+      : super(new _TraceProviderRegistryStubControl.unbound(impl));
+
+  static TraceProviderRegistryStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceProviderRegistryStub"));
+    return new TraceProviderRegistryStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _TraceProviderRegistryStubControl.serviceDescription;
+
+
+  void registerTraceProvider(Object traceProvider) {
+    return impl.registerTraceProvider(traceProvider);
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/tracing/tracing.mojom.dart b/mojo/dart/packages/mojo_services/lib/tracing/tracing.mojom.dart
index e688055..3dd1142 100644
--- a/mojo/dart/packages/mojo_services/lib/tracing/tracing.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/tracing/tracing.mojom.dart
@@ -385,9 +385,9 @@
   void stopTracing();
 }
 
-
-class _TraceProviderProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _TraceProviderProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _TraceProviderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -401,7 +401,6 @@
 
   String get serviceName => TraceProvider.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -418,9 +417,9 @@
   }
 }
 
-
-class TraceProviderProxy extends bindings.Proxy
-                              implements TraceProvider {
+class TraceProviderProxy
+    extends bindings.Proxy
+    implements TraceProvider {
   TraceProviderProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _TraceProviderProxyControl.fromEndpoint(endpoint));
@@ -467,29 +466,24 @@
   }
 }
 
-
-class TraceProviderStub extends bindings.Stub {
+class _TraceProviderStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<TraceProvider> {
   TraceProvider _impl;
 
-  TraceProviderStub.fromEndpoint(
+  _TraceProviderStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [TraceProvider impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TraceProviderStub.fromHandle(
+  _TraceProviderStubControl.fromHandle(
       core.MojoHandle handle, [TraceProvider impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TraceProviderStub.unbound([this._impl]) : super.unbound();
-
-  static TraceProviderStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TraceProviderStub"));
-    return new TraceProviderStub.fromEndpoint(endpoint);
-  }
+  _TraceProviderStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -537,9 +531,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "TraceProviderStub($superString)";
+    return "_TraceProviderStubControl($superString)";
   }
 
   int get version => 0;
@@ -553,6 +548,38 @@
   }
 }
 
+class TraceProviderStub
+    extends bindings.Stub<TraceProvider>
+    implements TraceProvider {
+  TraceProviderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [TraceProvider impl])
+      : super(new _TraceProviderStubControl.fromEndpoint(endpoint, impl));
+
+  TraceProviderStub.fromHandle(
+      core.MojoHandle handle, [TraceProvider impl])
+      : super(new _TraceProviderStubControl.fromHandle(handle, impl));
+
+  TraceProviderStub.unbound([TraceProvider impl])
+      : super(new _TraceProviderStubControl.unbound(impl));
+
+  static TraceProviderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceProviderStub"));
+    return new TraceProviderStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _TraceProviderStubControl.serviceDescription;
+
+
+  void startTracing(String categories, Object recorder) {
+    return impl.startTracing(categories, recorder);
+  }
+  void stopTracing() {
+    return impl.stopTracing();
+  }
+}
+
 const int _traceRecorderMethodRecordName = 0;
 
 class _TraceRecorderServiceDescription implements service_describer.ServiceDescription {
@@ -571,9 +598,9 @@
   void record(String json);
 }
 
-
-class _TraceRecorderProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _TraceRecorderProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _TraceRecorderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -587,7 +614,6 @@
 
   String get serviceName => TraceRecorder.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -604,9 +630,9 @@
   }
 }
 
-
-class TraceRecorderProxy extends bindings.Proxy
-                              implements TraceRecorder {
+class TraceRecorderProxy
+    extends bindings.Proxy
+    implements TraceRecorder {
   TraceRecorderProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _TraceRecorderProxyControl.fromEndpoint(endpoint));
@@ -643,29 +669,24 @@
   }
 }
 
-
-class TraceRecorderStub extends bindings.Stub {
+class _TraceRecorderStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<TraceRecorder> {
   TraceRecorder _impl;
 
-  TraceRecorderStub.fromEndpoint(
+  _TraceRecorderStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [TraceRecorder impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TraceRecorderStub.fromHandle(
+  _TraceRecorderStubControl.fromHandle(
       core.MojoHandle handle, [TraceRecorder impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TraceRecorderStub.unbound([this._impl]) : super.unbound();
-
-  static TraceRecorderStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TraceRecorderStub"));
-    return new TraceRecorderStub.fromEndpoint(endpoint);
-  }
+  _TraceRecorderStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -710,9 +731,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "TraceRecorderStub($superString)";
+    return "_TraceRecorderStubControl($superString)";
   }
 
   int get version => 0;
@@ -726,6 +748,35 @@
   }
 }
 
+class TraceRecorderStub
+    extends bindings.Stub<TraceRecorder>
+    implements TraceRecorder {
+  TraceRecorderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [TraceRecorder impl])
+      : super(new _TraceRecorderStubControl.fromEndpoint(endpoint, impl));
+
+  TraceRecorderStub.fromHandle(
+      core.MojoHandle handle, [TraceRecorder impl])
+      : super(new _TraceRecorderStubControl.fromHandle(handle, impl));
+
+  TraceRecorderStub.unbound([TraceRecorder impl])
+      : super(new _TraceRecorderStubControl.unbound(impl));
+
+  static TraceRecorderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceRecorderStub"));
+    return new TraceRecorderStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _TraceRecorderStubControl.serviceDescription;
+
+
+  void record(String json) {
+    return impl.record(json);
+  }
+}
+
 const int _traceCollectorMethodStartName = 0;
 const int _traceCollectorMethodStopAndFlushName = 1;
 
@@ -746,9 +797,9 @@
   void stopAndFlush();
 }
 
-
-class _TraceCollectorProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _TraceCollectorProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _TraceCollectorProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -762,7 +813,6 @@
 
   String get serviceName => TraceCollector.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       default:
@@ -779,9 +829,9 @@
   }
 }
 
-
-class TraceCollectorProxy extends bindings.Proxy
-                              implements TraceCollector {
+class TraceCollectorProxy
+    extends bindings.Proxy
+    implements TraceCollector {
   TraceCollectorProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _TraceCollectorProxyControl.fromEndpoint(endpoint));
@@ -828,29 +878,24 @@
   }
 }
 
-
-class TraceCollectorStub extends bindings.Stub {
+class _TraceCollectorStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<TraceCollector> {
   TraceCollector _impl;
 
-  TraceCollectorStub.fromEndpoint(
+  _TraceCollectorStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [TraceCollector impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TraceCollectorStub.fromHandle(
+  _TraceCollectorStubControl.fromHandle(
       core.MojoHandle handle, [TraceCollector impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  TraceCollectorStub.unbound([this._impl]) : super.unbound();
-
-  static TraceCollectorStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For TraceCollectorStub"));
-    return new TraceCollectorStub.fromEndpoint(endpoint);
-  }
+  _TraceCollectorStubControl.unbound([this._impl]) : super.unbound();
 
 
 
@@ -898,9 +943,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "TraceCollectorStub($superString)";
+    return "_TraceCollectorStubControl($superString)";
   }
 
   int get version => 0;
@@ -914,5 +960,37 @@
   }
 }
 
+class TraceCollectorStub
+    extends bindings.Stub<TraceCollector>
+    implements TraceCollector {
+  TraceCollectorStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [TraceCollector impl])
+      : super(new _TraceCollectorStubControl.fromEndpoint(endpoint, impl));
+
+  TraceCollectorStub.fromHandle(
+      core.MojoHandle handle, [TraceCollector impl])
+      : super(new _TraceCollectorStubControl.fromHandle(handle, impl));
+
+  TraceCollectorStub.unbound([TraceCollector impl])
+      : super(new _TraceCollectorStubControl.unbound(impl));
+
+  static TraceCollectorStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For TraceCollectorStub"));
+    return new TraceCollectorStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _TraceCollectorStubControl.serviceDescription;
+
+
+  void start(core.MojoDataPipeProducer stream, String categories) {
+    return impl.start(stream, categories);
+  }
+  void stopAndFlush() {
+    return impl.stopAndFlush();
+  }
+}
+
 
 
diff --git a/mojo/dart/packages/mojo_services/lib/vsync/vsync.mojom.dart b/mojo/dart/packages/mojo_services/lib/vsync/vsync.mojom.dart
index 1afee66..57b3f7b 100644
--- a/mojo/dart/packages/mojo_services/lib/vsync/vsync.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/vsync/vsync.mojom.dart
@@ -157,9 +157,9 @@
   dynamic awaitVSync([Function responseFactory = null]);
 }
 
-
-class _VSyncProviderProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _VSyncProviderProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _VSyncProviderProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -173,7 +173,6 @@
 
   String get serviceName => VSyncProvider.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
       case _vSyncProviderMethodAwaitVSyncName:
@@ -210,9 +209,9 @@
   }
 }
 
-
-class VSyncProviderProxy extends bindings.Proxy
-                              implements VSyncProvider {
+class VSyncProviderProxy
+    extends bindings.Proxy
+    implements VSyncProvider {
   VSyncProviderProxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _VSyncProviderProxyControl.fromEndpoint(endpoint));
@@ -247,29 +246,24 @@
   }
 }
 
-
-class VSyncProviderStub extends bindings.Stub {
+class _VSyncProviderStubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<VSyncProvider> {
   VSyncProvider _impl;
 
-  VSyncProviderStub.fromEndpoint(
+  _VSyncProviderStubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [VSyncProvider impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  VSyncProviderStub.fromHandle(
+  _VSyncProviderStubControl.fromHandle(
       core.MojoHandle handle, [VSyncProvider impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  VSyncProviderStub.unbound([this._impl]) : super.unbound();
-
-  static VSyncProviderStub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For VSyncProviderStub"));
-    return new VSyncProviderStub.fromEndpoint(endpoint);
-  }
+  _VSyncProviderStubControl.unbound([this._impl]) : super.unbound();
 
 
   VSyncProviderAwaitVSyncResponseParams _vSyncProviderAwaitVSyncResponseParamsFactory(int timeStamp) {
@@ -334,9 +328,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "VSyncProviderStub($superString)";
+    return "_VSyncProviderStubControl($superString)";
   }
 
   int get version => 0;
@@ -350,5 +345,34 @@
   }
 }
 
+class VSyncProviderStub
+    extends bindings.Stub<VSyncProvider>
+    implements VSyncProvider {
+  VSyncProviderStub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [VSyncProvider impl])
+      : super(new _VSyncProviderStubControl.fromEndpoint(endpoint, impl));
+
+  VSyncProviderStub.fromHandle(
+      core.MojoHandle handle, [VSyncProvider impl])
+      : super(new _VSyncProviderStubControl.fromHandle(handle, impl));
+
+  VSyncProviderStub.unbound([VSyncProvider impl])
+      : super(new _VSyncProviderStubControl.unbound(impl));
+
+  static VSyncProviderStub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For VSyncProviderStub"));
+    return new VSyncProviderStub.fromEndpoint(endpoint);
+  }
+
+  static service_describer.ServiceDescription get serviceDescription =>
+      _VSyncProviderStubControl.serviceDescription;
+
+
+  dynamic awaitVSync([Function responseFactory = null]) {
+    return impl.awaitVSync(responseFactory);
+  }
+}
+
 
 
diff --git a/mojo/dart/unittests/embedder_tests/validation_test.dart b/mojo/dart/unittests/embedder_tests/validation_test.dart
index aabb079..20d22b3 100644
--- a/mojo/dart/unittests/embedder_tests/validation_test.dart
+++ b/mojo/dart/unittests/embedder_tests/validation_test.dart
@@ -23,7 +23,7 @@
   }
 
   set onError(Function f) {
-    _stub.onError = f;
+    _stub.ctrl.onError = f;
   }
 
   void _complete() => _completer.complete(null);
diff --git a/mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl
index d1713fd..a44dc8b 100644
--- a/mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl
@@ -62,9 +62,9 @@
 {%-   endfor %}
 }
 
-
-class _{{interface|name}}ProxyControl extends bindings.ProxyMessageHandler
-                                      implements bindings.ProxyControl {
+class _{{interface|name}}ProxyControl
+    extends bindings.ProxyMessageHandler
+    implements bindings.ProxyControl {
   _{{interface|name}}ProxyControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
 
@@ -78,7 +78,6 @@
 
   String get serviceName => {{interface|name}}.serviceName;
 
-  @override
   void handleResponse(bindings.ServiceMessage message) {
     switch (message.header.type) {
 {%- for method in interface.methods %}
@@ -120,9 +119,9 @@
   }
 }
 
-
-class {{interface|name}}Proxy extends bindings.Proxy
-                              implements {{interface|name}} {
+class {{interface|name}}Proxy
+    extends bindings.Proxy
+    implements {{interface|name}} {
   {{interface|name}}Proxy.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint)
       : super(new _{{interface|name}}ProxyControl.fromEndpoint(endpoint));
@@ -186,29 +185,24 @@
 {%- endfor %}
 }
 
-
-class {{interface|name}}Stub extends bindings.Stub {
+class _{{interface|name}}StubControl
+    extends bindings.StubMessageHandler
+    implements bindings.StubControl<{{interface|name}}> {
   {{interface|name}} _impl;
 
-  {{interface|name}}Stub.fromEndpoint(
+  _{{interface|name}}StubControl.fromEndpoint(
       core.MojoMessagePipeEndpoint endpoint, [{{interface|name}} impl])
       : super.fromEndpoint(endpoint, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  {{interface|name}}Stub.fromHandle(
+  _{{interface|name}}StubControl.fromHandle(
       core.MojoHandle handle, [{{interface|name}} impl])
       : super.fromHandle(handle, autoBegin: impl != null) {
     _impl = impl;
   }
 
-  {{interface|name}}Stub.unbound([this._impl]) : super.unbound();
-
-  static {{interface|name}}Stub newFromEndpoint(
-      core.MojoMessagePipeEndpoint endpoint) {
-    assert(endpoint.setDescription("For {{interface|name}}Stub"));
-    return new {{interface|name}}Stub.fromEndpoint(endpoint);
-  }
+  _{{interface|name}}StubControl.unbound([this._impl]) : super.unbound();
 
 {% for method in interface.methods %}
 {%- if method.response_parameters != None %}
@@ -303,9 +297,10 @@
     }
   }
 
+  @override
   String toString() {
     var superString = super.toString();
-    return "{{interface|name}}Stub($superString)";
+    return "_{{interface|name}}StubControl($superString)";
   }
 
   int get version => {{interface.version}};
@@ -318,3 +313,55 @@
     return _cachedServiceDescription;
   }
 }
+
+class {{interface|name}}Stub
+    extends bindings.Stub<{{interface|name}}>
+    implements {{interface|name}} {
+  {{interface|name}}Stub.fromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint, [{{interface|name}} impl])
+      : super(new _{{interface|name}}StubControl.fromEndpoint(endpoint, impl));
+
+  {{interface|name}}Stub.fromHandle(
+      core.MojoHandle handle, [{{interface|name}} impl])
+      : super(new _{{interface|name}}StubControl.fromHandle(handle, impl));
+
+  {{interface|name}}Stub.unbound([{{interface|name}} impl])
+      : super(new _{{interface|name}}StubControl.unbound(impl));
+
+  static {{interface|name}}Stub newFromEndpoint(
+      core.MojoMessagePipeEndpoint endpoint) {
+    assert(endpoint.setDescription("For {{interface|name}}Stub"));
+    return new {{interface|name}}Stub.fromEndpoint(endpoint);
+  }
+
+  static {{descpkg}}ServiceDescription get serviceDescription =>
+      _{{interface|name}}StubControl.serviceDescription;
+
+{% for method in interface.methods %}
+{%- if method.response_parameters == None %}
+  void {{method|name}}(
+{%- for parameter in method.parameters -%}
+    {{parameter.kind|dart_type}} {{parameter|name}}{% if not loop.last %}, {% endif %}
+{%- endfor -%}
+  ) {
+    return impl.{{method|name}}(
+{%- for parameter in method.parameters -%}
+    {{parameter|name}}{% if not loop.last %}, {% endif %}
+{%- endfor -%}
+    );
+  }
+{%- else %}
+  dynamic {{method|name}}(
+{%- for parameter in method.parameters -%}
+    {{parameter.kind|dart_type}} {{parameter|name}},
+{%- endfor -%}
+    [Function responseFactory = null]) {
+    return impl.{{method|name}}(
+{%- for parameter in method.parameters -%}
+    {{parameter|name}},
+{%- endfor -%}
+    responseFactory);
+  }
+{%- endif %}
+{%- endfor %}
+}
diff --git a/mojo/public/tools/bindings/generators/mojom_dart_generator.py b/mojo/public/tools/bindings/generators/mojom_dart_generator.py
index 7c2a15c..e27ad9c 100644
--- a/mojo/public/tools/bindings/generators/mojom_dart_generator.py
+++ b/mojo/public/tools/bindings/generators/mojom_dart_generator.py
@@ -77,8 +77,10 @@
   "ctrl",
   "fromEndpoint",
   "fromHandle",
+  "impl",
   "newFromEndpoint",
   "responseOrError",
+  "serviceDescription",
   "serviceName",
   "unbound",
 ]
